0235477 hai 3 días
pai
achega
c719e5a3b3
Modificáronse 100 ficheiros con 67794 adicións e 0 borrados
  1. 17 0
      .editorconfig
  2. 1 0
      .gitignore
  3. 4 0
      .vscode/extensions.json
  4. 20 0
      .vscode/launch.json
  5. 42 0
      .vscode/tasks.json
  6. 59 0
      README.md
  7. 0 0
      REDEME.md
  8. 0 0
      ai-interview/.tsbuildinfo
  9. BIN=BIN
      ai-interview/angular-compiler.db
  10. BIN=BIN
      ai-interview/angular-compiler.db-lock
  11. 6 0
      ai-interview/vite/com.chrome.devtools.json
  12. 202 0
      ai-interview/vite/deps/@angular_common.js
  13. 7 0
      ai-interview/vite/deps/@angular_common.js.map
  14. 86 0
      ai-interview/vite/deps/@angular_common_http.js
  15. 7 0
      ai-interview/vite/deps/@angular_common_http.js.map
  16. 959 0
      ai-interview/vite/deps/@angular_core.js
  17. 7 0
      ai-interview/vite/deps/@angular_core.js.map
  18. 6885 0
      ai-interview/vite/deps/@angular_forms.js
  19. 3 0
      ai-interview/vite/deps/@angular_forms.js.map
  20. 84 0
      ai-interview/vite/deps/@angular_platform-browser.js
  21. 7 0
      ai-interview/vite/deps/@angular_platform-browser.js.map
  22. 4630 0
      ai-interview/vite/deps/@angular_platform-browser_animations.js
  23. 3 0
      ai-interview/vite/deps/@angular_platform-browser_animations.js.map
  24. 6052 0
      ai-interview/vite/deps/@angular_router.js
  25. 3 0
      ai-interview/vite/deps/@angular_router.js.map
  26. 886 0
      ai-interview/vite/deps/@fortawesome_angular-fontawesome.js
  27. 3 0
      ai-interview/vite/deps/@fortawesome_angular-fontawesome.js.map
  28. 29 0
      ai-interview/vite/deps/@fortawesome_fontawesome-svg-core.js
  29. 7 0
      ai-interview/vite/deps/@fortawesome_fontawesome-svg-core.js.map
  30. 366 0
      ai-interview/vite/deps/@fortawesome_free-solid-svg-icons.js
  31. 3 0
      ai-interview/vite/deps/@fortawesome_free-solid-svg-icons.js.map
  32. 106 0
      ai-interview/vite/deps/_metadata.json
  33. 821 0
      ai-interview/vite/deps/chunk-IA3W2FS3.js
  34. 3 0
      ai-interview/vite/deps/chunk-IA3W2FS3.js.map
  35. 1232 0
      ai-interview/vite/deps/chunk-NFFN32GK.js
  36. 3 0
      ai-interview/vite/deps/chunk-NFFN32GK.js.map
  37. 29 0
      ai-interview/vite/deps/chunk-OPGNYZHR.js
  38. 7 0
      ai-interview/vite/deps/chunk-OPGNYZHR.js.map
  39. 688 0
      ai-interview/vite/deps/chunk-T7KLW67N.js
  40. 3 0
      ai-interview/vite/deps/chunk-T7KLW67N.js.map
  41. 3177 0
      ai-interview/vite/deps/chunk-VHSNDQRF.js
  42. 3 0
      ai-interview/vite/deps/chunk-VHSNDQRF.js.map
  43. 58 0
      ai-interview/vite/deps/chunk-WDMUDEB6.js
  44. 7 0
      ai-interview/vite/deps/chunk-WDMUDEB6.js.map
  45. 29822 0
      ai-interview/vite/deps/chunk-Y7NS2SYH.js
  46. 2 0
      ai-interview/vite/deps/chunk-Y7NS2SYH.js.map
  47. 2552 0
      ai-interview/vite/deps/chunk-YWBOMLBY.js
  48. 3 0
      ai-interview/vite/deps/chunk-YWBOMLBY.js.map
  49. 3 0
      ai-interview/vite/deps/package.json
  50. 4148 0
      ai-interview/vite/deps/swiper.js
  51. 3 0
      ai-interview/vite/deps/swiper.js.map
  52. 2394 0
      ai-interview/vite/deps/zone__js.js
  53. 3 0
      ai-interview/vite/deps/zone__js.js.map
  54. 8 0
      ai-interview/vite/deps_ssr/_metadata.json
  55. 3 0
      ai-interview/vite/deps_ssr/package.json
  56. 130 0
      angular.json
  57. 74 0
      package-lock.json
  58. 10 0
      package.json
  59. BIN=BIN
      public/favicon.ico
  60. 21 0
      src/app/app.config.ts
  61. 2 0
      src/app/app.html
  62. 14 0
      src/app/app.routes.ts
  63. 0 0
      src/app/app.scss
  64. 23 0
      src/app/app.spec.ts
  65. 20 0
      src/app/app.ts
  66. 62 0
      src/app/hr-auth/auth.html
  67. 222 0
      src/app/hr-auth/auth.scss
  68. 23 0
      src/app/hr-auth/auth.spec.ts
  69. 45 0
      src/app/hr-auth/auth.ts
  70. 14 0
      src/app/hr-auth/hr-auth.routes.ts
  71. 63 0
      src/app/hr/company-profile/company-profile.html
  72. 229 0
      src/app/hr/company-profile/company-profile.scss
  73. 23 0
      src/app/hr/company-profile/company-profile.spec.ts
  74. 43 0
      src/app/hr/company-profile/company-profile.ts
  75. 29 0
      src/app/hr/dashboard/dashboard.html
  76. 75 0
      src/app/hr/dashboard/dashboard.scss
  77. 23 0
      src/app/hr/dashboard/dashboard.spec.ts
  78. 24 0
      src/app/hr/dashboard/dashboard.ts
  79. 10 0
      src/app/hr/dashboard/hr.routes.ts
  80. 14 0
      src/app/hr/models/company.model.ts
  81. 10 0
      src/app/hr/models/resume.model.ts
  82. 79 0
      src/app/hr/resume-filter/resume-filter.html
  83. 212 0
      src/app/hr/resume-filter/resume-filter.scss
  84. 23 0
      src/app/hr/resume-filter/resume-filter.spec.ts
  85. 47 0
      src/app/hr/resume-filter/resume-filter.ts
  86. 40 0
      src/app/hr/services/company.service.ts
  87. 51 0
      src/app/hr/services/resume.service.ts
  88. 14 0
      src/app/hr/status-card/status-card.html
  89. 56 0
      src/app/hr/status-card/status-card.scss
  90. 23 0
      src/app/hr/status-card/status-card.spec.ts
  91. 19 0
      src/app/hr/status-card/status-card.ts
  92. 67 0
      src/app/interviewee-auth/auth.html
  93. 13 0
      src/app/interviewee-auth/auth.routes.ts
  94. 223 0
      src/app/interviewee-auth/auth.scss
  95. 24 0
      src/app/interviewee-auth/auth.spec.ts
  96. 81 0
      src/app/interviewee-auth/auth.ts
  97. 4 0
      src/app/interviewee-auth/environment.ts
  98. 104 0
      src/app/interviewee-auth/server.js
  99. BIN=BIN
      src/app/interviewer/home/asstes/user-avatar.png
  100. 55 0
      src/app/interviewer/home/company-filter/company-filter.html

+ 17 - 0
.editorconfig

@@ -0,0 +1,17 @@
+# Editor configuration, see https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.ts]
+quote_type = single
+ij_typescript_use_double_quotes = false
+
+[*.md]
+max_line_length = off
+trim_trailing_whitespace = false

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+node_modules/

+ 4 - 0
.vscode/extensions.json

@@ -0,0 +1,4 @@
+{
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=827846
+  "recommendations": ["angular.ng-template"]
+}

+ 20 - 0
.vscode/launch.json

@@ -0,0 +1,20 @@
+{
+  // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
+  "version": "0.2.0",
+  "configurations": [
+    {
+      "name": "ng serve",
+      "type": "chrome",
+      "request": "launch",
+      "preLaunchTask": "npm: start",
+      "url": "http://localhost:4200/"
+    },
+    {
+      "name": "ng test",
+      "type": "chrome",
+      "request": "launch",
+      "preLaunchTask": "npm: test",
+      "url": "http://localhost:9876/debug.html"
+    }
+  ]
+}

+ 42 - 0
.vscode/tasks.json

@@ -0,0 +1,42 @@
+{
+  // For more information, visit: https://go.microsoft.com/fwlink/?LinkId=733558
+  "version": "2.0.0",
+  "tasks": [
+    {
+      "type": "npm",
+      "script": "start",
+      "isBackground": true,
+      "problemMatcher": {
+        "owner": "typescript",
+        "pattern": "$tsc",
+        "background": {
+          "activeOnStart": true,
+          "beginsPattern": {
+            "regexp": "(.*?)"
+          },
+          "endsPattern": {
+            "regexp": "bundle generation complete"
+          }
+        }
+      }
+    },
+    {
+      "type": "npm",
+      "script": "test",
+      "isBackground": true,
+      "problemMatcher": {
+        "owner": "typescript",
+        "pattern": "$tsc",
+        "background": {
+          "activeOnStart": true,
+          "beginsPattern": {
+            "regexp": "(.*?)"
+          },
+          "endsPattern": {
+            "regexp": "bundle generation complete"
+          }
+        }
+      }
+    }
+  ]
+}

+ 59 - 0
README.md

@@ -0,0 +1,59 @@
+# AiInterview
+
+This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 20.0.4.
+
+## Development server
+
+To start a local development server, run:
+
+```bash
+ng serve
+```
+
+Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
+
+## Code scaffolding
+
+Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
+
+```bash
+ng generate component component-name
+```
+
+For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
+
+```bash
+ng generate --help
+```
+
+## Building
+
+To build the project run:
+
+```bash
+ng build
+```
+
+This will compile your project and store the build artifacts in the `dist/` directory. By default, the production build optimizes your application for performance and speed.
+
+## Running unit tests
+
+To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
+
+```bash
+ng test
+```
+
+## Running end-to-end tests
+
+For end-to-end (e2e) testing, run:
+
+```bash
+ng e2e
+```
+
+Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
+
+## Additional Resources
+
+For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.

+ 0 - 0
REDEME.md


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 0 - 0
ai-interview/.tsbuildinfo


BIN=BIN
ai-interview/angular-compiler.db


BIN=BIN
ai-interview/angular-compiler.db-lock


+ 6 - 0
ai-interview/vite/com.chrome.devtools.json

@@ -0,0 +1,6 @@
+{
+  "workspace": {
+    "root": "D:\\study\\ai-interview\\ai-interview",
+    "uuid": "821bc135-7472-47e5-bd05-4b6c9e98c662"
+  }
+}

+ 202 - 0
ai-interview/vite/deps/@angular_common.js

@@ -0,0 +1,202 @@
+import {
+  APP_BASE_HREF,
+  AsyncPipe,
+  BrowserPlatformLocation,
+  CommonModule,
+  CurrencyPipe,
+  DATE_PIPE_DEFAULT_OPTIONS,
+  DATE_PIPE_DEFAULT_TIMEZONE,
+  DatePipe,
+  DecimalPipe,
+  DomAdapter,
+  FormStyle,
+  FormatWidth,
+  HashLocationStrategy,
+  I18nPluralPipe,
+  I18nSelectPipe,
+  IMAGE_LOADER,
+  JsonPipe,
+  KeyValuePipe,
+  LOCATION_INITIALIZED,
+  Location,
+  LocationStrategy,
+  LowerCasePipe,
+  NgClass,
+  NgComponentOutlet,
+  NgForOf,
+  NgForOfContext,
+  NgIf,
+  NgIfContext,
+  NgLocaleLocalization,
+  NgLocalization,
+  NgOptimizedImage,
+  NgPlural,
+  NgPluralCase,
+  NgStyle,
+  NgSwitch,
+  NgSwitchCase,
+  NgSwitchDefault,
+  NgTemplateOutlet,
+  NullViewportScroller,
+  NumberFormatStyle,
+  NumberSymbol,
+  PLATFORM_BROWSER_ID,
+  PLATFORM_SERVER_ID,
+  PRECONNECT_CHECK_BLOCKLIST,
+  PathLocationStrategy,
+  PercentPipe,
+  PlatformLocation,
+  PlatformNavigation,
+  Plural,
+  SlicePipe,
+  TitleCasePipe,
+  TranslationWidth,
+  UpperCasePipe,
+  VERSION,
+  ViewportScroller,
+  WeekDay,
+  formatCurrency,
+  formatDate,
+  formatNumber,
+  formatPercent,
+  getCurrencySymbol,
+  getDOM,
+  getLocaleCurrencyCode,
+  getLocaleCurrencyName,
+  getLocaleCurrencySymbol,
+  getLocaleDateFormat,
+  getLocaleDateTimeFormat,
+  getLocaleDayNames,
+  getLocaleDayPeriods,
+  getLocaleDirection,
+  getLocaleEraNames,
+  getLocaleExtraDayPeriodRules,
+  getLocaleExtraDayPeriods,
+  getLocaleFirstDayOfWeek,
+  getLocaleId,
+  getLocaleMonthNames,
+  getLocaleNumberFormat,
+  getLocaleNumberSymbol,
+  getLocalePluralCase,
+  getLocaleTimeFormat,
+  getLocaleWeekEndRange,
+  getNumberOfCurrencyDigits,
+  isPlatformBrowser,
+  isPlatformServer,
+  normalizeQueryParams,
+  provideCloudflareLoader,
+  provideCloudinaryLoader,
+  provideImageKitLoader,
+  provideImgixLoader,
+  provideNetlifyLoader,
+  registerLocaleData,
+  setRootDomAdapter
+} from "./chunk-VHSNDQRF.js";
+import {
+  XhrFactory,
+  parseCookieValue
+} from "./chunk-OPGNYZHR.js";
+import {
+  DOCUMENT,
+  IMAGE_CONFIG
+} from "./chunk-Y7NS2SYH.js";
+import "./chunk-WDMUDEB6.js";
+export {
+  APP_BASE_HREF,
+  AsyncPipe,
+  BrowserPlatformLocation,
+  CommonModule,
+  CurrencyPipe,
+  DATE_PIPE_DEFAULT_OPTIONS,
+  DATE_PIPE_DEFAULT_TIMEZONE,
+  DOCUMENT,
+  DatePipe,
+  DecimalPipe,
+  FormStyle,
+  FormatWidth,
+  HashLocationStrategy,
+  I18nPluralPipe,
+  I18nSelectPipe,
+  IMAGE_CONFIG,
+  IMAGE_LOADER,
+  JsonPipe,
+  KeyValuePipe,
+  LOCATION_INITIALIZED,
+  Location,
+  LocationStrategy,
+  LowerCasePipe,
+  NgClass,
+  NgComponentOutlet,
+  NgForOf as NgFor,
+  NgForOf,
+  NgForOfContext,
+  NgIf,
+  NgIfContext,
+  NgLocaleLocalization,
+  NgLocalization,
+  NgOptimizedImage,
+  NgPlural,
+  NgPluralCase,
+  NgStyle,
+  NgSwitch,
+  NgSwitchCase,
+  NgSwitchDefault,
+  NgTemplateOutlet,
+  NumberFormatStyle,
+  NumberSymbol,
+  PRECONNECT_CHECK_BLOCKLIST,
+  PathLocationStrategy,
+  PercentPipe,
+  PlatformLocation,
+  Plural,
+  SlicePipe,
+  TitleCasePipe,
+  TranslationWidth,
+  UpperCasePipe,
+  VERSION,
+  ViewportScroller,
+  WeekDay,
+  XhrFactory,
+  formatCurrency,
+  formatDate,
+  formatNumber,
+  formatPercent,
+  getCurrencySymbol,
+  getLocaleCurrencyCode,
+  getLocaleCurrencyName,
+  getLocaleCurrencySymbol,
+  getLocaleDateFormat,
+  getLocaleDateTimeFormat,
+  getLocaleDayNames,
+  getLocaleDayPeriods,
+  getLocaleDirection,
+  getLocaleEraNames,
+  getLocaleExtraDayPeriodRules,
+  getLocaleExtraDayPeriods,
+  getLocaleFirstDayOfWeek,
+  getLocaleId,
+  getLocaleMonthNames,
+  getLocaleNumberFormat,
+  getLocaleNumberSymbol,
+  getLocalePluralCase,
+  getLocaleTimeFormat,
+  getLocaleWeekEndRange,
+  getNumberOfCurrencyDigits,
+  isPlatformBrowser,
+  isPlatformServer,
+  provideCloudflareLoader,
+  provideCloudinaryLoader,
+  provideImageKitLoader,
+  provideImgixLoader,
+  provideNetlifyLoader,
+  registerLocaleData,
+  DomAdapter as ɵDomAdapter,
+  NullViewportScroller as ɵNullViewportScroller,
+  PLATFORM_BROWSER_ID as ɵPLATFORM_BROWSER_ID,
+  PLATFORM_SERVER_ID as ɵPLATFORM_SERVER_ID,
+  PlatformNavigation as ɵPlatformNavigation,
+  getDOM as ɵgetDOM,
+  normalizeQueryParams as ɵnormalizeQueryParams,
+  parseCookieValue as ɵparseCookieValue,
+  setRootDomAdapter as ɵsetRootDomAdapter
+};

+ 7 - 0
ai-interview/vite/deps/@angular_common.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

+ 86 - 0
ai-interview/vite/deps/@angular_common_http.js

@@ -0,0 +1,86 @@
+import {
+  FetchBackend,
+  HTTP_INTERCEPTORS,
+  HTTP_ROOT_INTERCEPTOR_FNS,
+  HTTP_TRANSFER_CACHE_ORIGIN_MAP,
+  HttpBackend,
+  HttpClient,
+  HttpClientJsonpModule,
+  HttpClientModule,
+  HttpClientXsrfModule,
+  HttpContext,
+  HttpContextToken,
+  HttpErrorResponse,
+  HttpEventType,
+  HttpFeatureKind,
+  HttpHandler,
+  HttpHeaderResponse,
+  HttpHeaders,
+  HttpInterceptorHandler,
+  HttpParams,
+  HttpRequest,
+  HttpResponse,
+  HttpResponseBase,
+  HttpStatusCode,
+  HttpUrlEncodingCodec,
+  HttpXhrBackend,
+  HttpXsrfTokenExtractor,
+  JsonpClientBackend,
+  JsonpInterceptor,
+  REQUESTS_CONTRIBUTE_TO_STABILITY,
+  httpResource,
+  provideHttpClient,
+  withFetch,
+  withHttpTransferCache,
+  withInterceptors,
+  withInterceptorsFromDi,
+  withJsonpSupport,
+  withNoXsrfProtection,
+  withRequestsMadeViaParent,
+  withXsrfConfiguration
+} from "./chunk-YWBOMLBY.js";
+import "./chunk-OPGNYZHR.js";
+import "./chunk-Y7NS2SYH.js";
+import "./chunk-WDMUDEB6.js";
+export {
+  FetchBackend,
+  HTTP_INTERCEPTORS,
+  HTTP_TRANSFER_CACHE_ORIGIN_MAP,
+  HttpBackend,
+  HttpClient,
+  HttpClientJsonpModule,
+  HttpClientModule,
+  HttpClientXsrfModule,
+  HttpContext,
+  HttpContextToken,
+  HttpErrorResponse,
+  HttpEventType,
+  HttpFeatureKind,
+  HttpHandler,
+  HttpHeaderResponse,
+  HttpHeaders,
+  HttpParams,
+  HttpRequest,
+  HttpResponse,
+  HttpResponseBase,
+  HttpStatusCode,
+  HttpUrlEncodingCodec,
+  HttpXhrBackend,
+  HttpXsrfTokenExtractor,
+  JsonpClientBackend,
+  JsonpInterceptor,
+  httpResource,
+  provideHttpClient,
+  withFetch,
+  withInterceptors,
+  withInterceptorsFromDi,
+  withJsonpSupport,
+  withNoXsrfProtection,
+  withRequestsMadeViaParent,
+  withXsrfConfiguration,
+  HTTP_ROOT_INTERCEPTOR_FNS as ɵHTTP_ROOT_INTERCEPTOR_FNS,
+  HttpInterceptorHandler as ɵHttpInterceptingHandler,
+  HttpInterceptorHandler as ɵHttpInterceptorHandler,
+  REQUESTS_CONTRIBUTE_TO_STABILITY as ɵREQUESTS_CONTRIBUTE_TO_STABILITY,
+  withHttpTransferCache as ɵwithHttpTransferCache
+};

+ 7 - 0
ai-interview/vite/deps/@angular_common_http.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

+ 959 - 0
ai-interview/vite/deps/@angular_core.js

@@ -0,0 +1,959 @@
+import {
+  ALLOW_MULTIPLE_PLATFORMS,
+  ANIMATION_MODULE_TYPE,
+  APP_BOOTSTRAP_LISTENER,
+  APP_ID,
+  APP_INITIALIZER,
+  AcxChangeDetectionStrategy,
+  AcxViewEncapsulation,
+  AfterRenderManager,
+  ApplicationInitStatus,
+  ApplicationModule,
+  ApplicationRef,
+  Attribute,
+  CLIENT_RENDER_MODE_FLAG,
+  COMPILER_OPTIONS,
+  CONTAINER_HEADER_OFFSET,
+  CSP_NONCE,
+  CUSTOM_ELEMENTS_SCHEMA,
+  ChangeDetectionScheduler,
+  ChangeDetectionSchedulerImpl,
+  ChangeDetectionStrategy,
+  ChangeDetectorRef,
+  Compiler,
+  CompilerFactory,
+  Component,
+  ComponentFactory,
+  ComponentFactory$1,
+  ComponentFactoryResolver$1,
+  ComponentRef,
+  ComponentRef$1,
+  Console,
+  ContentChild,
+  ContentChildren,
+  DEFAULT_CURRENCY_CODE,
+  DEFAULT_LOCALE_ID,
+  DEFER_BLOCK_CONFIG,
+  DEFER_BLOCK_DEPENDENCY_INTERCEPTOR,
+  DEHYDRATED_BLOCK_REGISTRY,
+  DOCUMENT,
+  DebugElement,
+  DebugEventListener,
+  DebugNode,
+  DefaultIterableDiffer,
+  DeferBlockBehavior,
+  DeferBlockState,
+  DestroyRef,
+  Directive,
+  ENABLE_ROOT_COMPONENT_BOOTSTRAP,
+  ENVIRONMENT_INITIALIZER,
+  EffectScheduler,
+  ElementRef,
+  EmbeddedViewRef,
+  EnvironmentInjector,
+  ErrorHandler,
+  EventEmitter,
+  FactoryTarget,
+  Framework,
+  HOST_TAG_NAME,
+  Host,
+  HostAttributeToken,
+  HostBinding,
+  HostListener,
+  HydrationStatus,
+  IMAGE_CONFIG,
+  IMAGE_CONFIG_DEFAULTS,
+  INJECTOR$1,
+  INJECTOR_SCOPE,
+  INTERNAL_APPLICATION_ERROR_HANDLER,
+  IS_HYDRATION_DOM_REUSE_ENABLED,
+  IS_INCREMENTAL_HYDRATION_ENABLED,
+  Inject,
+  Injectable,
+  InjectionToken,
+  Injector,
+  Input,
+  IterableDiffers,
+  JSACTION_BLOCK_ELEMENT_MAP,
+  JSACTION_EVENT_CONTRACT,
+  KeyValueDiffers,
+  LContext,
+  LOCALE_ID,
+  LocaleDataIndex,
+  MissingTranslationStrategy,
+  ModuleWithComponentFactories,
+  NG_COMP_DEF,
+  NG_DIR_DEF,
+  NG_ELEMENT_ID,
+  NG_INJ_DEF,
+  NG_MOD_DEF,
+  NG_PIPE_DEF,
+  NG_PROV_DEF,
+  NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR,
+  NO_CHANGE,
+  NO_ERRORS_SCHEMA,
+  NgModule,
+  NgModuleFactory,
+  NgModuleFactory$1,
+  NgModuleRef,
+  NgModuleRef$1,
+  NgProbeToken,
+  NgZone,
+  NoopNgZone,
+  Optional,
+  Output,
+  OutputEmitterRef,
+  PACKAGE_ROOT_URL,
+  PERFORMANCE_MARK_PREFIX,
+  PLATFORM_ID,
+  PLATFORM_INITIALIZER,
+  PROVIDED_NG_ZONE,
+  PendingTasks,
+  PendingTasksInternal,
+  Pipe,
+  PlatformRef,
+  Query,
+  QueryList,
+  R3Injector,
+  REQUEST,
+  REQUEST_CONTEXT,
+  RESPONSE_INIT,
+  ReflectionCapabilities,
+  Renderer2,
+  RendererFactory2,
+  RendererStyleFlags2,
+  ResourceImpl,
+  RuntimeError,
+  SIGNAL,
+  SSR_CONTENT_INTEGRITY_MARKER,
+  Sanitizer,
+  SecurityContext,
+  Self,
+  SimpleChange,
+  SkipSelf,
+  TESTABILITY,
+  TESTABILITY_GETTER,
+  TRANSLATIONS,
+  TRANSLATIONS_FORMAT,
+  TemplateRef,
+  Testability,
+  TestabilityRegistry,
+  TimerScheduler,
+  TracingAction,
+  TracingService,
+  TransferState,
+  Type,
+  VERSION,
+  Version,
+  ViewChild,
+  ViewChildren,
+  ViewContainerRef,
+  ViewEncapsulation,
+  ViewRef,
+  ViewRef2,
+  XSS_SECURITY_URL,
+  ZONELESS_ENABLED,
+  _global,
+  _sanitizeHtml,
+  _sanitizeUrl,
+  afterEveryRender,
+  afterNextRender,
+  afterRenderEffect,
+  allowSanitizationBypassAndThrow,
+  annotateForHydration,
+  asNativeElements,
+  assertInInjectionContext,
+  assertNotInReactiveContext,
+  assertPlatform,
+  booleanAttribute,
+  bypassSanitizationTrustHtml,
+  bypassSanitizationTrustResourceUrl,
+  bypassSanitizationTrustScript,
+  bypassSanitizationTrustStyle,
+  bypassSanitizationTrustUrl,
+  clearResolutionOfComponentResourcesQueue,
+  compileComponent,
+  compileDirective,
+  compileNgModule,
+  compileNgModuleDefs,
+  compileNgModuleFactory,
+  compilePipe,
+  computed,
+  contentChild,
+  contentChildren,
+  convertToBitFlags,
+  createComponent,
+  createEnvironmentInjector,
+  createInjector,
+  createNgModule,
+  createNgModuleRef,
+  createOrReusePlatformInjector,
+  createPlatform,
+  createPlatformFactory,
+  defaultIterableDiffers,
+  defaultKeyValueDiffers,
+  defineInjectable,
+  depsTracker,
+  destroyPlatform,
+  devModeEqual,
+  disableProfiling,
+  effect,
+  enableProdMode,
+  enableProfiling,
+  enableProfiling2,
+  encapsulateResourceError,
+  findLocaleData,
+  flushModuleScopingQueueAsMuchAsPossible,
+  formatRuntimeError,
+  forwardRef,
+  generateStandaloneInDeclarationsError,
+  getAsyncClassMetadataFn,
+  getClosestComponentName,
+  getComponentDef,
+  getDebugNode,
+  getDeferBlocks$1,
+  getDirectives,
+  getDocument,
+  getHostElement,
+  getInjectableDef,
+  getLContext,
+  getLocaleCurrencyCode,
+  getLocalePluralCase,
+  getModuleFactory,
+  getNgModuleById,
+  getOutputDestroyRef,
+  getPlatform,
+  getSanitizationBypassType,
+  importProvidersFrom,
+  inject,
+  injectChangeDetectorRef,
+  input,
+  inputBinding,
+  internalCreateApplication,
+  internalProvideZoneChangeDetection,
+  isBoundToModule,
+  isComponentDefPendingResolution,
+  isDevMode,
+  isEnvironmentProviders,
+  isInjectable,
+  isNgModule,
+  isPromise,
+  isSignal,
+  isStandalone,
+  isSubscribable,
+  isViewDirty,
+  linkedSignal,
+  makeEnvironmentProviders,
+  makeStateKey,
+  markForRefresh,
+  mergeApplicationConfig,
+  model,
+  noSideEffects,
+  numberAttribute,
+  output,
+  outputBinding,
+  patchComponentDefWithScope,
+  performanceMarkFeature,
+  platformCore,
+  provideAppInitializer,
+  provideBrowserGlobalErrorListeners,
+  provideCheckNoChangesConfig,
+  provideEnvironmentInitializer,
+  provideNgReflectAttributes,
+  providePlatformInitializer,
+  provideZoneChangeDetection,
+  provideZonelessChangeDetection,
+  publishExternalGlobalUtil,
+  readHydrationInfo,
+  reflectComponentType,
+  registerLocaleData,
+  registerNgModuleType,
+  renderDeferBlockState,
+  resetCompiledComponents,
+  resetJitOptions,
+  resolveComponentResources,
+  resolveForwardRef,
+  resource,
+  restoreComponentResolutionQueue,
+  runInInjectionContext,
+  setAllowDuplicateNgModuleIdsForTest,
+  setAlternateWeakRefImpl,
+  setClassMetadata,
+  setClassMetadataAsync,
+  setCurrentInjector,
+  setDocument,
+  setInjectorProfilerContext,
+  setLocaleId,
+  setTestabilityGetter,
+  signal,
+  startMeasuring,
+  stopMeasuring,
+  store,
+  stringify,
+  transitiveScopesFor,
+  triggerResourceLoading,
+  truncateMiddle,
+  twoWayBinding,
+  unregisterAllLocaleData,
+  untracked,
+  unwrapSafeValue,
+  viewChild,
+  viewChildren,
+  withDomHydration,
+  withEventReplay,
+  withI18nSupport,
+  withIncrementalHydration,
+  ɵINPUT_SIGNAL_BRAND_WRITE_TYPE,
+  ɵgetUnknownElementStrictMode,
+  ɵgetUnknownPropertyStrictMode,
+  ɵsetClassDebugInfo,
+  ɵsetUnknownElementStrictMode,
+  ɵsetUnknownPropertyStrictMode,
+  ɵunwrapWritableSignal,
+  ɵɵCopyDefinitionFeature,
+  ɵɵExternalStylesFeature,
+  ɵɵHostDirectivesFeature,
+  ɵɵInheritDefinitionFeature,
+  ɵɵNgOnChangesFeature,
+  ɵɵProvidersFeature,
+  ɵɵadvance,
+  ɵɵattachSourceLocations,
+  ɵɵattribute,
+  ɵɵclassMap,
+  ɵɵclassProp,
+  ɵɵcomponentInstance,
+  ɵɵconditional,
+  ɵɵconditionalBranchCreate,
+  ɵɵconditionalCreate,
+  ɵɵcontentQuery,
+  ɵɵcontentQuerySignal,
+  ɵɵdeclareLet,
+  ɵɵdefer,
+  ɵɵdeferEnableTimerScheduling,
+  ɵɵdeferHydrateNever,
+  ɵɵdeferHydrateOnHover,
+  ɵɵdeferHydrateOnIdle,
+  ɵɵdeferHydrateOnImmediate,
+  ɵɵdeferHydrateOnInteraction,
+  ɵɵdeferHydrateOnTimer,
+  ɵɵdeferHydrateOnViewport,
+  ɵɵdeferHydrateWhen,
+  ɵɵdeferOnHover,
+  ɵɵdeferOnIdle,
+  ɵɵdeferOnImmediate,
+  ɵɵdeferOnInteraction,
+  ɵɵdeferOnTimer,
+  ɵɵdeferOnViewport,
+  ɵɵdeferPrefetchOnHover,
+  ɵɵdeferPrefetchOnIdle,
+  ɵɵdeferPrefetchOnImmediate,
+  ɵɵdeferPrefetchOnInteraction,
+  ɵɵdeferPrefetchOnTimer,
+  ɵɵdeferPrefetchOnViewport,
+  ɵɵdeferPrefetchWhen,
+  ɵɵdeferWhen,
+  ɵɵdefineComponent,
+  ɵɵdefineDirective,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵdefinePipe,
+  ɵɵdirectiveInject,
+  ɵɵdisableBindings,
+  ɵɵdomProperty,
+  ɵɵelement,
+  ɵɵelementContainer,
+  ɵɵelementContainerEnd,
+  ɵɵelementContainerStart,
+  ɵɵelementEnd,
+  ɵɵelementStart,
+  ɵɵenableBindings,
+  ɵɵgetComponentDepsFactory,
+  ɵɵgetCurrentView,
+  ɵɵgetInheritedFactory,
+  ɵɵgetReplaceMetadataURL,
+  ɵɵi18n,
+  ɵɵi18nApply,
+  ɵɵi18nAttributes,
+  ɵɵi18nEnd,
+  ɵɵi18nExp,
+  ɵɵi18nPostprocess,
+  ɵɵi18nStart,
+  ɵɵinject,
+  ɵɵinjectAttribute,
+  ɵɵinterpolate,
+  ɵɵinterpolate1,
+  ɵɵinterpolate2,
+  ɵɵinterpolate3,
+  ɵɵinterpolate4,
+  ɵɵinterpolate5,
+  ɵɵinterpolate6,
+  ɵɵinterpolate7,
+  ɵɵinterpolate8,
+  ɵɵinterpolateV,
+  ɵɵinvalidFactory,
+  ɵɵinvalidFactoryDep,
+  ɵɵlistener,
+  ɵɵloadQuery,
+  ɵɵnamespaceHTML,
+  ɵɵnamespaceMathML,
+  ɵɵnamespaceSVG,
+  ɵɵnextContext,
+  ɵɵngDeclareClassMetadata,
+  ɵɵngDeclareClassMetadataAsync,
+  ɵɵngDeclareComponent,
+  ɵɵngDeclareDirective,
+  ɵɵngDeclareFactory,
+  ɵɵngDeclareInjectable,
+  ɵɵngDeclareInjector,
+  ɵɵngDeclareNgModule,
+  ɵɵngDeclarePipe,
+  ɵɵpipe,
+  ɵɵpipeBind1,
+  ɵɵpipeBind2,
+  ɵɵpipeBind3,
+  ɵɵpipeBind4,
+  ɵɵpipeBindV,
+  ɵɵprojection,
+  ɵɵprojectionDef,
+  ɵɵproperty,
+  ɵɵpureFunction0,
+  ɵɵpureFunction1,
+  ɵɵpureFunction2,
+  ɵɵpureFunction3,
+  ɵɵpureFunction4,
+  ɵɵpureFunction5,
+  ɵɵpureFunction6,
+  ɵɵpureFunction7,
+  ɵɵpureFunction8,
+  ɵɵpureFunctionV,
+  ɵɵqueryAdvance,
+  ɵɵqueryRefresh,
+  ɵɵreadContextLet,
+  ɵɵreference,
+  ɵɵrepeater,
+  ɵɵrepeaterCreate,
+  ɵɵrepeaterTrackByIdentity,
+  ɵɵrepeaterTrackByIndex,
+  ɵɵreplaceMetadata,
+  ɵɵresetView,
+  ɵɵresolveBody,
+  ɵɵresolveDocument,
+  ɵɵresolveWindow,
+  ɵɵrestoreView,
+  ɵɵsanitizeHtml,
+  ɵɵsanitizeResourceUrl,
+  ɵɵsanitizeScript,
+  ɵɵsanitizeStyle,
+  ɵɵsanitizeUrl,
+  ɵɵsanitizeUrlOrResourceUrl,
+  ɵɵsetComponentScope,
+  ɵɵsetNgModuleScope,
+  ɵɵstoreLet,
+  ɵɵstyleMap,
+  ɵɵstyleProp,
+  ɵɵsyntheticHostListener,
+  ɵɵsyntheticHostProperty,
+  ɵɵtemplate,
+  ɵɵtemplateRefExtractor,
+  ɵɵtext,
+  ɵɵtextInterpolate,
+  ɵɵtextInterpolate1,
+  ɵɵtextInterpolate2,
+  ɵɵtextInterpolate3,
+  ɵɵtextInterpolate4,
+  ɵɵtextInterpolate5,
+  ɵɵtextInterpolate6,
+  ɵɵtextInterpolate7,
+  ɵɵtextInterpolate8,
+  ɵɵtextInterpolateV,
+  ɵɵtrustConstantHtml,
+  ɵɵtrustConstantResourceUrl,
+  ɵɵtwoWayBindingSet,
+  ɵɵtwoWayListener,
+  ɵɵtwoWayProperty,
+  ɵɵvalidateIframeAttribute,
+  ɵɵviewQuery,
+  ɵɵviewQuerySignal
+} from "./chunk-Y7NS2SYH.js";
+import "./chunk-WDMUDEB6.js";
+export {
+  ANIMATION_MODULE_TYPE,
+  APP_BOOTSTRAP_LISTENER,
+  APP_ID,
+  APP_INITIALIZER,
+  ApplicationInitStatus,
+  ApplicationModule,
+  ApplicationRef,
+  Attribute,
+  COMPILER_OPTIONS,
+  CSP_NONCE,
+  CUSTOM_ELEMENTS_SCHEMA,
+  ChangeDetectionStrategy,
+  ChangeDetectorRef,
+  Compiler,
+  CompilerFactory,
+  Component,
+  ComponentFactory$1 as ComponentFactory,
+  ComponentFactoryResolver$1 as ComponentFactoryResolver,
+  ComponentRef$1 as ComponentRef,
+  ContentChild,
+  ContentChildren,
+  DEFAULT_CURRENCY_CODE,
+  DOCUMENT,
+  DebugElement,
+  DebugEventListener,
+  DebugNode,
+  DefaultIterableDiffer,
+  DestroyRef,
+  Directive,
+  ENVIRONMENT_INITIALIZER,
+  ElementRef,
+  EmbeddedViewRef,
+  EnvironmentInjector,
+  ErrorHandler,
+  EventEmitter,
+  HOST_TAG_NAME,
+  Host,
+  HostAttributeToken,
+  HostBinding,
+  HostListener,
+  INJECTOR$1 as INJECTOR,
+  Inject,
+  Injectable,
+  InjectionToken,
+  Injector,
+  Input,
+  IterableDiffers,
+  KeyValueDiffers,
+  LOCALE_ID,
+  MissingTranslationStrategy,
+  ModuleWithComponentFactories,
+  NO_ERRORS_SCHEMA,
+  NgModule,
+  NgModuleFactory$1 as NgModuleFactory,
+  NgModuleRef$1 as NgModuleRef,
+  NgProbeToken,
+  NgZone,
+  Optional,
+  Output,
+  OutputEmitterRef,
+  PACKAGE_ROOT_URL,
+  PLATFORM_ID,
+  PLATFORM_INITIALIZER,
+  PendingTasks,
+  Pipe,
+  PlatformRef,
+  Query,
+  QueryList,
+  REQUEST,
+  REQUEST_CONTEXT,
+  RESPONSE_INIT,
+  Renderer2,
+  RendererFactory2,
+  RendererStyleFlags2,
+  Sanitizer,
+  SecurityContext,
+  Self,
+  SimpleChange,
+  SkipSelf,
+  TRANSLATIONS,
+  TRANSLATIONS_FORMAT,
+  TemplateRef,
+  Testability,
+  TestabilityRegistry,
+  TransferState,
+  Type,
+  VERSION,
+  Version,
+  ViewChild,
+  ViewChildren,
+  ViewContainerRef,
+  ViewEncapsulation,
+  ViewRef2 as ViewRef,
+  afterEveryRender,
+  afterNextRender,
+  afterRenderEffect,
+  asNativeElements,
+  assertInInjectionContext,
+  assertNotInReactiveContext,
+  assertPlatform,
+  booleanAttribute,
+  computed,
+  contentChild,
+  contentChildren,
+  createComponent,
+  createEnvironmentInjector,
+  createNgModule,
+  createNgModuleRef,
+  createPlatform,
+  createPlatformFactory,
+  defineInjectable,
+  destroyPlatform,
+  effect,
+  enableProdMode,
+  enableProfiling,
+  forwardRef,
+  getDebugNode,
+  getModuleFactory,
+  getNgModuleById,
+  getPlatform,
+  importProvidersFrom,
+  inject,
+  input,
+  inputBinding,
+  isDevMode,
+  isSignal,
+  isStandalone,
+  linkedSignal,
+  makeEnvironmentProviders,
+  makeStateKey,
+  mergeApplicationConfig,
+  model,
+  numberAttribute,
+  output,
+  outputBinding,
+  platformCore,
+  provideAppInitializer,
+  provideBrowserGlobalErrorListeners,
+  provideCheckNoChangesConfig,
+  provideEnvironmentInitializer,
+  provideNgReflectAttributes,
+  providePlatformInitializer,
+  provideZoneChangeDetection,
+  provideZonelessChangeDetection,
+  reflectComponentType,
+  resolveForwardRef,
+  resource,
+  runInInjectionContext,
+  setTestabilityGetter,
+  signal,
+  twoWayBinding,
+  untracked,
+  viewChild,
+  viewChildren,
+  ALLOW_MULTIPLE_PLATFORMS as ɵALLOW_MULTIPLE_PLATFORMS,
+  AcxChangeDetectionStrategy as ɵAcxChangeDetectionStrategy,
+  AcxViewEncapsulation as ɵAcxViewEncapsulation,
+  AfterRenderManager as ɵAfterRenderManager,
+  CLIENT_RENDER_MODE_FLAG as ɵCLIENT_RENDER_MODE_FLAG,
+  CONTAINER_HEADER_OFFSET as ɵCONTAINER_HEADER_OFFSET,
+  ChangeDetectionScheduler as ɵChangeDetectionScheduler,
+  ChangeDetectionSchedulerImpl as ɵChangeDetectionSchedulerImpl,
+  ComponentFactory$1 as ɵComponentFactory,
+  Console as ɵConsole,
+  DEFAULT_LOCALE_ID as ɵDEFAULT_LOCALE_ID,
+  DEFER_BLOCK_CONFIG as ɵDEFER_BLOCK_CONFIG,
+  DEFER_BLOCK_DEPENDENCY_INTERCEPTOR as ɵDEFER_BLOCK_DEPENDENCY_INTERCEPTOR,
+  DEHYDRATED_BLOCK_REGISTRY as ɵDEHYDRATED_BLOCK_REGISTRY,
+  DeferBlockBehavior as ɵDeferBlockBehavior,
+  DeferBlockState as ɵDeferBlockState,
+  ENABLE_ROOT_COMPONENT_BOOTSTRAP as ɵENABLE_ROOT_COMPONENT_BOOTSTRAP,
+  EffectScheduler as ɵEffectScheduler,
+  Framework as ɵFramework,
+  HydrationStatus as ɵHydrationStatus,
+  IMAGE_CONFIG as ɵIMAGE_CONFIG,
+  IMAGE_CONFIG_DEFAULTS as ɵIMAGE_CONFIG_DEFAULTS,
+  INJECTOR_SCOPE as ɵINJECTOR_SCOPE,
+  ɵINPUT_SIGNAL_BRAND_WRITE_TYPE,
+  INTERNAL_APPLICATION_ERROR_HANDLER as ɵINTERNAL_APPLICATION_ERROR_HANDLER,
+  IS_HYDRATION_DOM_REUSE_ENABLED as ɵIS_HYDRATION_DOM_REUSE_ENABLED,
+  IS_INCREMENTAL_HYDRATION_ENABLED as ɵIS_INCREMENTAL_HYDRATION_ENABLED,
+  JSACTION_BLOCK_ELEMENT_MAP as ɵJSACTION_BLOCK_ELEMENT_MAP,
+  JSACTION_EVENT_CONTRACT as ɵJSACTION_EVENT_CONTRACT,
+  LContext as ɵLContext,
+  LocaleDataIndex as ɵLocaleDataIndex,
+  NG_COMP_DEF as ɵNG_COMP_DEF,
+  NG_DIR_DEF as ɵNG_DIR_DEF,
+  NG_ELEMENT_ID as ɵNG_ELEMENT_ID,
+  NG_INJ_DEF as ɵNG_INJ_DEF,
+  NG_MOD_DEF as ɵNG_MOD_DEF,
+  NG_PIPE_DEF as ɵNG_PIPE_DEF,
+  NG_PROV_DEF as ɵNG_PROV_DEF,
+  NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR as ɵNOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR,
+  NO_CHANGE as ɵNO_CHANGE,
+  NgModuleFactory as ɵNgModuleFactory,
+  NoopNgZone as ɵNoopNgZone,
+  PERFORMANCE_MARK_PREFIX as ɵPERFORMANCE_MARK_PREFIX,
+  PROVIDED_NG_ZONE as ɵPROVIDED_NG_ZONE,
+  PendingTasksInternal as ɵPendingTasksInternal,
+  R3Injector as ɵR3Injector,
+  ReflectionCapabilities as ɵReflectionCapabilities,
+  ComponentFactory as ɵRender3ComponentFactory,
+  ComponentRef as ɵRender3ComponentRef,
+  NgModuleRef as ɵRender3NgModuleRef,
+  ResourceImpl as ɵResourceImpl,
+  RuntimeError as ɵRuntimeError,
+  SIGNAL as ɵSIGNAL,
+  SSR_CONTENT_INTEGRITY_MARKER as ɵSSR_CONTENT_INTEGRITY_MARKER,
+  TESTABILITY as ɵTESTABILITY,
+  TESTABILITY_GETTER as ɵTESTABILITY_GETTER,
+  TimerScheduler as ɵTimerScheduler,
+  TracingAction as ɵTracingAction,
+  TracingService as ɵTracingService,
+  ViewRef as ɵViewRef,
+  XSS_SECURITY_URL as ɵXSS_SECURITY_URL,
+  ZONELESS_ENABLED as ɵZONELESS_ENABLED,
+  _sanitizeHtml as ɵ_sanitizeHtml,
+  _sanitizeUrl as ɵ_sanitizeUrl,
+  allowSanitizationBypassAndThrow as ɵallowSanitizationBypassAndThrow,
+  annotateForHydration as ɵannotateForHydration,
+  bypassSanitizationTrustHtml as ɵbypassSanitizationTrustHtml,
+  bypassSanitizationTrustResourceUrl as ɵbypassSanitizationTrustResourceUrl,
+  bypassSanitizationTrustScript as ɵbypassSanitizationTrustScript,
+  bypassSanitizationTrustStyle as ɵbypassSanitizationTrustStyle,
+  bypassSanitizationTrustUrl as ɵbypassSanitizationTrustUrl,
+  clearResolutionOfComponentResourcesQueue as ɵclearResolutionOfComponentResourcesQueue,
+  compileComponent as ɵcompileComponent,
+  compileDirective as ɵcompileDirective,
+  compileNgModule as ɵcompileNgModule,
+  compileNgModuleDefs as ɵcompileNgModuleDefs,
+  compileNgModuleFactory as ɵcompileNgModuleFactory,
+  compilePipe as ɵcompilePipe,
+  convertToBitFlags as ɵconvertToBitFlags,
+  createInjector as ɵcreateInjector,
+  createOrReusePlatformInjector as ɵcreateOrReusePlatformInjector,
+  defaultIterableDiffers as ɵdefaultIterableDiffers,
+  defaultKeyValueDiffers as ɵdefaultKeyValueDiffers,
+  depsTracker as ɵdepsTracker,
+  devModeEqual as ɵdevModeEqual,
+  disableProfiling as ɵdisableProfiling,
+  enableProfiling2 as ɵenableProfiling,
+  encapsulateResourceError as ɵencapsulateResourceError,
+  findLocaleData as ɵfindLocaleData,
+  flushModuleScopingQueueAsMuchAsPossible as ɵflushModuleScopingQueueAsMuchAsPossible,
+  formatRuntimeError as ɵformatRuntimeError,
+  generateStandaloneInDeclarationsError as ɵgenerateStandaloneInDeclarationsError,
+  getAsyncClassMetadataFn as ɵgetAsyncClassMetadataFn,
+  getClosestComponentName as ɵgetClosestComponentName,
+  getComponentDef as ɵgetComponentDef,
+  getDebugNode as ɵgetDebugNode,
+  getDeferBlocks$1 as ɵgetDeferBlocks,
+  getDirectives as ɵgetDirectives,
+  getDocument as ɵgetDocument,
+  getHostElement as ɵgetHostElement,
+  getInjectableDef as ɵgetInjectableDef,
+  getLContext as ɵgetLContext,
+  getLocaleCurrencyCode as ɵgetLocaleCurrencyCode,
+  getLocalePluralCase as ɵgetLocalePluralCase,
+  getOutputDestroyRef as ɵgetOutputDestroyRef,
+  getSanitizationBypassType as ɵgetSanitizationBypassType,
+  ɵgetUnknownElementStrictMode,
+  ɵgetUnknownPropertyStrictMode,
+  _global as ɵglobal,
+  injectChangeDetectorRef as ɵinjectChangeDetectorRef,
+  internalCreateApplication as ɵinternalCreateApplication,
+  internalProvideZoneChangeDetection as ɵinternalProvideZoneChangeDetection,
+  isBoundToModule as ɵisBoundToModule,
+  isComponentDefPendingResolution as ɵisComponentDefPendingResolution,
+  isEnvironmentProviders as ɵisEnvironmentProviders,
+  isInjectable as ɵisInjectable,
+  isNgModule as ɵisNgModule,
+  isPromise as ɵisPromise,
+  isSubscribable as ɵisSubscribable,
+  isViewDirty as ɵisViewDirty,
+  markForRefresh as ɵmarkForRefresh,
+  noSideEffects as ɵnoSideEffects,
+  patchComponentDefWithScope as ɵpatchComponentDefWithScope,
+  performanceMarkFeature as ɵperformanceMarkFeature,
+  publishExternalGlobalUtil as ɵpublishExternalGlobalUtil,
+  readHydrationInfo as ɵreadHydrationInfo,
+  registerLocaleData as ɵregisterLocaleData,
+  renderDeferBlockState as ɵrenderDeferBlockState,
+  resetCompiledComponents as ɵresetCompiledComponents,
+  resetJitOptions as ɵresetJitOptions,
+  resolveComponentResources as ɵresolveComponentResources,
+  restoreComponentResolutionQueue as ɵrestoreComponentResolutionQueue,
+  setAllowDuplicateNgModuleIdsForTest as ɵsetAllowDuplicateNgModuleIdsForTest,
+  setAlternateWeakRefImpl as ɵsetAlternateWeakRefImpl,
+  ɵsetClassDebugInfo,
+  setClassMetadata as ɵsetClassMetadata,
+  setClassMetadataAsync as ɵsetClassMetadataAsync,
+  setCurrentInjector as ɵsetCurrentInjector,
+  setDocument as ɵsetDocument,
+  setInjectorProfilerContext as ɵsetInjectorProfilerContext,
+  setLocaleId as ɵsetLocaleId,
+  ɵsetUnknownElementStrictMode,
+  ɵsetUnknownPropertyStrictMode,
+  startMeasuring as ɵstartMeasuring,
+  stopMeasuring as ɵstopMeasuring,
+  store as ɵstore,
+  stringify as ɵstringify,
+  transitiveScopesFor as ɵtransitiveScopesFor,
+  triggerResourceLoading as ɵtriggerResourceLoading,
+  truncateMiddle as ɵtruncateMiddle,
+  unregisterAllLocaleData as ɵunregisterLocaleData,
+  unwrapSafeValue as ɵunwrapSafeValue,
+  ɵunwrapWritableSignal,
+  withDomHydration as ɵwithDomHydration,
+  withEventReplay as ɵwithEventReplay,
+  withI18nSupport as ɵwithI18nSupport,
+  withIncrementalHydration as ɵwithIncrementalHydration,
+  ɵɵCopyDefinitionFeature,
+  ɵɵExternalStylesFeature,
+  FactoryTarget as ɵɵFactoryTarget,
+  ɵɵHostDirectivesFeature,
+  ɵɵInheritDefinitionFeature,
+  ɵɵNgOnChangesFeature,
+  ɵɵProvidersFeature,
+  ɵɵadvance,
+  ɵɵattachSourceLocations,
+  ɵɵattribute,
+  ɵɵclassMap,
+  ɵɵclassProp,
+  ɵɵcomponentInstance,
+  ɵɵconditional,
+  ɵɵconditionalBranchCreate,
+  ɵɵconditionalCreate,
+  ɵɵcontentQuery,
+  ɵɵcontentQuerySignal,
+  ɵɵdeclareLet,
+  ɵɵdefer,
+  ɵɵdeferEnableTimerScheduling,
+  ɵɵdeferHydrateNever,
+  ɵɵdeferHydrateOnHover,
+  ɵɵdeferHydrateOnIdle,
+  ɵɵdeferHydrateOnImmediate,
+  ɵɵdeferHydrateOnInteraction,
+  ɵɵdeferHydrateOnTimer,
+  ɵɵdeferHydrateOnViewport,
+  ɵɵdeferHydrateWhen,
+  ɵɵdeferOnHover,
+  ɵɵdeferOnIdle,
+  ɵɵdeferOnImmediate,
+  ɵɵdeferOnInteraction,
+  ɵɵdeferOnTimer,
+  ɵɵdeferOnViewport,
+  ɵɵdeferPrefetchOnHover,
+  ɵɵdeferPrefetchOnIdle,
+  ɵɵdeferPrefetchOnImmediate,
+  ɵɵdeferPrefetchOnInteraction,
+  ɵɵdeferPrefetchOnTimer,
+  ɵɵdeferPrefetchOnViewport,
+  ɵɵdeferPrefetchWhen,
+  ɵɵdeferWhen,
+  ɵɵdefineComponent,
+  ɵɵdefineDirective,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵdefinePipe,
+  ɵɵdirectiveInject,
+  ɵɵdisableBindings,
+  ɵɵdomProperty,
+  ɵɵelement,
+  ɵɵelementContainer,
+  ɵɵelementContainerEnd,
+  ɵɵelementContainerStart,
+  ɵɵelementEnd,
+  ɵɵelementStart,
+  ɵɵenableBindings,
+  ɵɵgetComponentDepsFactory,
+  ɵɵgetCurrentView,
+  ɵɵgetInheritedFactory,
+  ɵɵgetReplaceMetadataURL,
+  ɵɵi18n,
+  ɵɵi18nApply,
+  ɵɵi18nAttributes,
+  ɵɵi18nEnd,
+  ɵɵi18nExp,
+  ɵɵi18nPostprocess,
+  ɵɵi18nStart,
+  ɵɵinject,
+  ɵɵinjectAttribute,
+  ɵɵinterpolate,
+  ɵɵinterpolate1,
+  ɵɵinterpolate2,
+  ɵɵinterpolate3,
+  ɵɵinterpolate4,
+  ɵɵinterpolate5,
+  ɵɵinterpolate6,
+  ɵɵinterpolate7,
+  ɵɵinterpolate8,
+  ɵɵinterpolateV,
+  ɵɵinvalidFactory,
+  ɵɵinvalidFactoryDep,
+  ɵɵlistener,
+  ɵɵloadQuery,
+  ɵɵnamespaceHTML,
+  ɵɵnamespaceMathML,
+  ɵɵnamespaceSVG,
+  ɵɵnextContext,
+  ɵɵngDeclareClassMetadata,
+  ɵɵngDeclareClassMetadataAsync,
+  ɵɵngDeclareComponent,
+  ɵɵngDeclareDirective,
+  ɵɵngDeclareFactory,
+  ɵɵngDeclareInjectable,
+  ɵɵngDeclareInjector,
+  ɵɵngDeclareNgModule,
+  ɵɵngDeclarePipe,
+  ɵɵpipe,
+  ɵɵpipeBind1,
+  ɵɵpipeBind2,
+  ɵɵpipeBind3,
+  ɵɵpipeBind4,
+  ɵɵpipeBindV,
+  ɵɵprojection,
+  ɵɵprojectionDef,
+  ɵɵproperty,
+  ɵɵpureFunction0,
+  ɵɵpureFunction1,
+  ɵɵpureFunction2,
+  ɵɵpureFunction3,
+  ɵɵpureFunction4,
+  ɵɵpureFunction5,
+  ɵɵpureFunction6,
+  ɵɵpureFunction7,
+  ɵɵpureFunction8,
+  ɵɵpureFunctionV,
+  ɵɵqueryAdvance,
+  ɵɵqueryRefresh,
+  ɵɵreadContextLet,
+  ɵɵreference,
+  registerNgModuleType as ɵɵregisterNgModuleType,
+  ɵɵrepeater,
+  ɵɵrepeaterCreate,
+  ɵɵrepeaterTrackByIdentity,
+  ɵɵrepeaterTrackByIndex,
+  ɵɵreplaceMetadata,
+  ɵɵresetView,
+  ɵɵresolveBody,
+  ɵɵresolveDocument,
+  ɵɵresolveWindow,
+  ɵɵrestoreView,
+  ɵɵsanitizeHtml,
+  ɵɵsanitizeResourceUrl,
+  ɵɵsanitizeScript,
+  ɵɵsanitizeStyle,
+  ɵɵsanitizeUrl,
+  ɵɵsanitizeUrlOrResourceUrl,
+  ɵɵsetComponentScope,
+  ɵɵsetNgModuleScope,
+  ɵɵstoreLet,
+  ɵɵstyleMap,
+  ɵɵstyleProp,
+  ɵɵsyntheticHostListener,
+  ɵɵsyntheticHostProperty,
+  ɵɵtemplate,
+  ɵɵtemplateRefExtractor,
+  ɵɵtext,
+  ɵɵtextInterpolate,
+  ɵɵtextInterpolate1,
+  ɵɵtextInterpolate2,
+  ɵɵtextInterpolate3,
+  ɵɵtextInterpolate4,
+  ɵɵtextInterpolate5,
+  ɵɵtextInterpolate6,
+  ɵɵtextInterpolate7,
+  ɵɵtextInterpolate8,
+  ɵɵtextInterpolateV,
+  ɵɵtrustConstantHtml,
+  ɵɵtrustConstantResourceUrl,
+  ɵɵtwoWayBindingSet,
+  ɵɵtwoWayListener,
+  ɵɵtwoWayProperty,
+  ɵɵvalidateIframeAttribute,
+  ɵɵviewQuery,
+  ɵɵviewQuerySignal
+};

+ 7 - 0
ai-interview/vite/deps/@angular_core.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

+ 6885 - 0
ai-interview/vite/deps/@angular_forms.js

@@ -0,0 +1,6885 @@
+import {
+  getDOM
+} from "./chunk-VHSNDQRF.js";
+import "./chunk-OPGNYZHR.js";
+import {
+  ChangeDetectorRef,
+  Directive,
+  ElementRef,
+  EventEmitter,
+  Host,
+  Inject,
+  Injectable,
+  InjectionToken,
+  Injector,
+  Input,
+  NgModule,
+  Optional,
+  Output,
+  Renderer2,
+  RuntimeError,
+  Self,
+  SkipSelf,
+  Subject,
+  Version,
+  booleanAttribute,
+  computed,
+  forkJoin,
+  forwardRef,
+  from,
+  inject,
+  isPromise,
+  isSubscribable,
+  map,
+  setClassMetadata,
+  signal,
+  untracked,
+  ɵɵInheritDefinitionFeature,
+  ɵɵNgOnChangesFeature,
+  ɵɵProvidersFeature,
+  ɵɵattribute,
+  ɵɵclassProp,
+  ɵɵdefineDirective,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵdirectiveInject,
+  ɵɵgetInheritedFactory,
+  ɵɵlistener
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/forms/fesm2022/forms.mjs
+var BaseControlValueAccessor = class _BaseControlValueAccessor {
+  _renderer;
+  _elementRef;
+  /**
+   * The registered callback function called when a change or input event occurs on the input
+   * element.
+   * @docs-private
+   */
+  onChange = (_) => {
+  };
+  /**
+   * The registered callback function called when a blur event occurs on the input element.
+   * @docs-private
+   */
+  onTouched = () => {
+  };
+  constructor(_renderer, _elementRef) {
+    this._renderer = _renderer;
+    this._elementRef = _elementRef;
+  }
+  /**
+   * Helper method that sets a property on a target element using the current Renderer
+   * implementation.
+   * @docs-private
+   */
+  setProperty(key, value) {
+    this._renderer.setProperty(this._elementRef.nativeElement, key, value);
+  }
+  /**
+   * Registers a function called when the control is touched.
+   * @docs-private
+   */
+  registerOnTouched(fn) {
+    this.onTouched = fn;
+  }
+  /**
+   * Registers a function called when the control value changes.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this.onChange = fn;
+  }
+  /**
+   * Sets the "disabled" property on the range input element.
+   * @docs-private
+   */
+  setDisabledState(isDisabled) {
+    this.setProperty("disabled", isDisabled);
+  }
+  static ɵfac = function BaseControlValueAccessor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _BaseControlValueAccessor)(ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(ElementRef));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _BaseControlValueAccessor
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BaseControlValueAccessor, [{
+    type: Directive
+  }], () => [{
+    type: Renderer2
+  }, {
+    type: ElementRef
+  }], null);
+})();
+var BuiltInControlValueAccessor = class _BuiltInControlValueAccessor extends BaseControlValueAccessor {
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵBuiltInControlValueAccessor_BaseFactory;
+    return function BuiltInControlValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵBuiltInControlValueAccessor_BaseFactory || (ɵBuiltInControlValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_BuiltInControlValueAccessor)))(__ngFactoryType__ || _BuiltInControlValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _BuiltInControlValueAccessor,
+    features: [ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BuiltInControlValueAccessor, [{
+    type: Directive
+  }], null, null);
+})();
+var NG_VALUE_ACCESSOR = new InjectionToken(ngDevMode ? "NgValueAccessor" : "");
+var CHECKBOX_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => CheckboxControlValueAccessor),
+  multi: true
+};
+var CheckboxControlValueAccessor = class _CheckboxControlValueAccessor extends BuiltInControlValueAccessor {
+  /**
+   * Sets the "checked" property on the input element.
+   * @docs-private
+   */
+  writeValue(value) {
+    this.setProperty("checked", value);
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵCheckboxControlValueAccessor_BaseFactory;
+    return function CheckboxControlValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵCheckboxControlValueAccessor_BaseFactory || (ɵCheckboxControlValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_CheckboxControlValueAccessor)))(__ngFactoryType__ || _CheckboxControlValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _CheckboxControlValueAccessor,
+    selectors: [["input", "type", "checkbox", "formControlName", ""], ["input", "type", "checkbox", "formControl", ""], ["input", "type", "checkbox", "ngModel", ""]],
+    hostBindings: function CheckboxControlValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("change", function CheckboxControlValueAccessor_change_HostBindingHandler($event) {
+          return ctx.onChange($event.target.checked);
+        })("blur", function CheckboxControlValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([CHECKBOX_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(CheckboxControlValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]",
+      host: {
+        "(change)": "onChange($any($event.target).checked)",
+        "(blur)": "onTouched()"
+      },
+      providers: [CHECKBOX_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], null, null);
+})();
+var DEFAULT_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => DefaultValueAccessor),
+  multi: true
+};
+function _isAndroid() {
+  const userAgent = getDOM() ? getDOM().getUserAgent() : "";
+  return /android (\d+)/.test(userAgent.toLowerCase());
+}
+var COMPOSITION_BUFFER_MODE = new InjectionToken(ngDevMode ? "CompositionEventMode" : "");
+var DefaultValueAccessor = class _DefaultValueAccessor extends BaseControlValueAccessor {
+  _compositionMode;
+  /** Whether the user is creating a composition string (IME events). */
+  _composing = false;
+  constructor(renderer, elementRef, _compositionMode) {
+    super(renderer, elementRef);
+    this._compositionMode = _compositionMode;
+    if (this._compositionMode == null) {
+      this._compositionMode = !_isAndroid();
+    }
+  }
+  /**
+   * Sets the "value" property on the input element.
+   * @docs-private
+   */
+  writeValue(value) {
+    const normalizedValue = value == null ? "" : value;
+    this.setProperty("value", normalizedValue);
+  }
+  /** @internal */
+  _handleInput(value) {
+    if (!this._compositionMode || this._compositionMode && !this._composing) {
+      this.onChange(value);
+    }
+  }
+  /** @internal */
+  _compositionStart() {
+    this._composing = true;
+  }
+  /** @internal */
+  _compositionEnd(value) {
+    this._composing = false;
+    this._compositionMode && this.onChange(value);
+  }
+  static ɵfac = function DefaultValueAccessor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DefaultValueAccessor)(ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(COMPOSITION_BUFFER_MODE, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _DefaultValueAccessor,
+    selectors: [["input", "formControlName", "", 3, "type", "checkbox"], ["textarea", "formControlName", ""], ["input", "formControl", "", 3, "type", "checkbox"], ["textarea", "formControl", ""], ["input", "ngModel", "", 3, "type", "checkbox"], ["textarea", "ngModel", ""], ["", "ngDefaultControl", ""]],
+    hostBindings: function DefaultValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("input", function DefaultValueAccessor_input_HostBindingHandler($event) {
+          return ctx._handleInput($event.target.value);
+        })("blur", function DefaultValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        })("compositionstart", function DefaultValueAccessor_compositionstart_HostBindingHandler() {
+          return ctx._compositionStart();
+        })("compositionend", function DefaultValueAccessor_compositionend_HostBindingHandler($event) {
+          return ctx._compositionEnd($event.target.value);
+        });
+      }
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([DEFAULT_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DefaultValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]",
+      // TODO: vsavkin replace the above selector with the one below it once
+      // https://github.com/angular/angular/issues/3011 is implemented
+      // selector: '[ngModel],[formControl],[formControlName]',
+      host: {
+        "(input)": "_handleInput($any($event.target).value)",
+        "(blur)": "onTouched()",
+        "(compositionstart)": "_compositionStart()",
+        "(compositionend)": "_compositionEnd($any($event.target).value)"
+      },
+      providers: [DEFAULT_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], () => [{
+    type: Renderer2
+  }, {
+    type: ElementRef
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [COMPOSITION_BUFFER_MODE]
+    }]
+  }], null);
+})();
+function isEmptyInputValue(value) {
+  return value == null || lengthOrSize(value) === 0;
+}
+function lengthOrSize(value) {
+  if (value == null) {
+    return null;
+  } else if (Array.isArray(value) || typeof value === "string") {
+    return value.length;
+  } else if (value instanceof Set) {
+    return value.size;
+  }
+  return null;
+}
+var NG_VALIDATORS = new InjectionToken(ngDevMode ? "NgValidators" : "");
+var NG_ASYNC_VALIDATORS = new InjectionToken(ngDevMode ? "NgAsyncValidators" : "");
+var EMAIL_REGEXP = /^(?=.{1,254}$)(?=.{1,64}@)[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-zA-Z0-9!#$%&'*+/=?^_`{|}~-]+)*@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
+var Validators = class {
+  /**
+   * @description
+   * Validator that requires the control's value to be greater than or equal to the provided number.
+   *
+   * @usageNotes
+   *
+   * ### Validate against a minimum of 3
+   *
+   * ```ts
+   * const control = new FormControl(2, Validators.min(3));
+   *
+   * console.log(control.errors); // {min: {min: 3, actual: 2}}
+   * ```
+   *
+   * @returns A validator function that returns an error map with the
+   * `min` property if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static min(min) {
+    return minValidator(min);
+  }
+  /**
+   * @description
+   * Validator that requires the control's value to be less than or equal to the provided number.
+   *
+   * @usageNotes
+   *
+   * ### Validate against a maximum of 15
+   *
+   * ```ts
+   * const control = new FormControl(16, Validators.max(15));
+   *
+   * console.log(control.errors); // {max: {max: 15, actual: 16}}
+   * ```
+   *
+   * @returns A validator function that returns an error map with the
+   * `max` property if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static max(max) {
+    return maxValidator(max);
+  }
+  /**
+   * @description
+   * Validator that requires the control have a non-empty value.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field is non-empty
+   *
+   * ```ts
+   * const control = new FormControl('', Validators.required);
+   *
+   * console.log(control.errors); // {required: true}
+   * ```
+   *
+   * @returns An error map with the `required` property
+   * if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static required(control) {
+    return requiredValidator(control);
+  }
+  /**
+   * @description
+   * Validator that requires the control's value be true. This validator is commonly
+   * used for required checkboxes.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field value is true
+   *
+   * ```ts
+   * const control = new FormControl('some value', Validators.requiredTrue);
+   *
+   * console.log(control.errors); // {required: true}
+   * ```
+   *
+   * @returns An error map that contains the `required` property
+   * set to `true` if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static requiredTrue(control) {
+    return requiredTrueValidator(control);
+  }
+  /**
+   * @description
+   * Validator that requires the control's value pass an email validation test.
+   *
+   * Tests the value using a [regular
+   * expression](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions)
+   * pattern suitable for common use cases. The pattern is based on the definition of a valid email
+   * address in the [WHATWG HTML
+   * specification](https://html.spec.whatwg.org/multipage/input.html#valid-e-mail-address) with
+   * some enhancements to incorporate more RFC rules (such as rules related to domain names and the
+   * lengths of different parts of the address).
+   *
+   * The differences from the WHATWG version include:
+   * - Disallow `local-part` (the part before the `@` symbol) to begin or end with a period (`.`).
+   * - Disallow `local-part` to be longer than 64 characters.
+   * - Disallow the whole address to be longer than 254 characters.
+   *
+   * If this pattern does not satisfy your business needs, you can use `Validators.pattern()` to
+   * validate the value against a different pattern.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field matches a valid email pattern
+   *
+   * ```ts
+   * const control = new FormControl('bad@', Validators.email);
+   *
+   * console.log(control.errors); // {email: true}
+   * ```
+   *
+   * @returns An error map with the `email` property
+   * if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static email(control) {
+    return emailValidator(control);
+  }
+  /**
+   * @description
+   * Validator that requires the number of items in the control's value to be greater than or equal
+   * to the provided minimum length. This validator is also provided by default if you use
+   * the HTML5 `minlength` attribute. Note that the `minLength` validator is intended to be used
+   * only for types that have a numeric `length` or `size` property, such as strings, arrays or
+   * sets. The `minLength` validator logic is also not invoked for values when their `length` or
+   * `size` property is 0 (for example in case of an empty string or an empty array), to support
+   * optional controls. You can use the standard `required` validator if empty values should not be
+   * considered valid.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field has a minimum of 3 characters
+   *
+   * ```ts
+   * const control = new FormControl('ng', Validators.minLength(3));
+   *
+   * console.log(control.errors); // {minlength: {requiredLength: 3, actualLength: 2}}
+   * ```
+   *
+   * ```html
+   * <input minlength="5">
+   * ```
+   *
+   * @returns A validator function that returns an error map with the
+   * `minlength` property if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static minLength(minLength) {
+    return minLengthValidator(minLength);
+  }
+  /**
+   * @description
+   * Validator that requires the number of items in the control's value to be less than or equal
+   * to the provided maximum length. This validator is also provided by default if you use
+   * the HTML5 `maxlength` attribute. Note that the `maxLength` validator is intended to be used
+   * only for types that have a numeric `length` or `size` property, such as strings, arrays or
+   * sets.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field has maximum of 5 characters
+   *
+   * ```ts
+   * const control = new FormControl('Angular', Validators.maxLength(5));
+   *
+   * console.log(control.errors); // {maxlength: {requiredLength: 5, actualLength: 7}}
+   * ```
+   *
+   * ```html
+   * <input maxlength="5">
+   * ```
+   *
+   * @returns A validator function that returns an error map with the
+   * `maxlength` property if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static maxLength(maxLength) {
+    return maxLengthValidator(maxLength);
+  }
+  /**
+   * @description
+   * Validator that requires the control's value to match a regex pattern. This validator is also
+   * provided by default if you use the HTML5 `pattern` attribute.
+   *
+   * @usageNotes
+   *
+   * ### Validate that the field only contains letters or spaces
+   *
+   * ```ts
+   * const control = new FormControl('1', Validators.pattern('[a-zA-Z ]*'));
+   *
+   * console.log(control.errors); // {pattern: {requiredPattern: '^[a-zA-Z ]*$', actualValue: '1'}}
+   * ```
+   *
+   * ```html
+   * <input pattern="[a-zA-Z ]*">
+   * ```
+   *
+   * ### Pattern matching with the global or sticky flag
+   *
+   * `RegExp` objects created with the `g` or `y` flags that are passed into `Validators.pattern`
+   * can produce different results on the same input when validations are run consecutively. This is
+   * due to how the behavior of `RegExp.prototype.test` is
+   * specified in [ECMA-262](https://tc39.es/ecma262/#sec-regexpbuiltinexec)
+   * (`RegExp` preserves the index of the last match when the global or sticky flag is used).
+   * Due to this behavior, it is recommended that when using
+   * `Validators.pattern` you **do not** pass in a `RegExp` object with either the global or sticky
+   * flag enabled.
+   *
+   * ```ts
+   * // Not recommended (since the `g` flag is used)
+   * const controlOne = new FormControl('1', Validators.pattern(/foo/g));
+   *
+   * // Good
+   * const controlTwo = new FormControl('1', Validators.pattern(/foo/));
+   * ```
+   *
+   * @param pattern A regular expression to be used as is to test the values, or a string.
+   * If a string is passed, the `^` character is prepended and the `$` character is
+   * appended to the provided string (if not already present), and the resulting regular
+   * expression is used to test the values.
+   *
+   * @returns A validator function that returns an error map with the
+   * `pattern` property if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static pattern(pattern) {
+    return patternValidator(pattern);
+  }
+  /**
+   * @description
+   * Validator that performs no operation.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static nullValidator(control) {
+    return nullValidator();
+  }
+  static compose(validators) {
+    return compose(validators);
+  }
+  /**
+   * @description
+   * Compose multiple async validators into a single function that returns the union
+   * of the individual error objects for the provided control.
+   *
+   * @returns A validator function that returns an error map with the
+   * merged error objects of the async validators if the validation check fails, otherwise `null`.
+   *
+   * @see {@link /api/forms/AbstractControl#updateValueAndValidity updateValueAndValidity}
+   *
+   */
+  static composeAsync(validators) {
+    return composeAsync(validators);
+  }
+};
+function minValidator(min) {
+  return (control) => {
+    if (control.value == null || min == null) {
+      return null;
+    }
+    const value = parseFloat(control.value);
+    return !isNaN(value) && value < min ? {
+      "min": {
+        "min": min,
+        "actual": control.value
+      }
+    } : null;
+  };
+}
+function maxValidator(max) {
+  return (control) => {
+    if (control.value == null || max == null) {
+      return null;
+    }
+    const value = parseFloat(control.value);
+    return !isNaN(value) && value > max ? {
+      "max": {
+        "max": max,
+        "actual": control.value
+      }
+    } : null;
+  };
+}
+function requiredValidator(control) {
+  return isEmptyInputValue(control.value) ? {
+    "required": true
+  } : null;
+}
+function requiredTrueValidator(control) {
+  return control.value === true ? null : {
+    "required": true
+  };
+}
+function emailValidator(control) {
+  if (isEmptyInputValue(control.value)) {
+    return null;
+  }
+  return EMAIL_REGEXP.test(control.value) ? null : {
+    "email": true
+  };
+}
+function minLengthValidator(minLength) {
+  return (control) => {
+    const length = control.value?.length ?? lengthOrSize(control.value);
+    if (length === null || length === 0) {
+      return null;
+    }
+    return length < minLength ? {
+      "minlength": {
+        "requiredLength": minLength,
+        "actualLength": length
+      }
+    } : null;
+  };
+}
+function maxLengthValidator(maxLength) {
+  return (control) => {
+    const length = control.value?.length ?? lengthOrSize(control.value);
+    if (length !== null && length > maxLength) {
+      return {
+        "maxlength": {
+          "requiredLength": maxLength,
+          "actualLength": length
+        }
+      };
+    }
+    return null;
+  };
+}
+function patternValidator(pattern) {
+  if (!pattern) return nullValidator;
+  let regex;
+  let regexStr;
+  if (typeof pattern === "string") {
+    regexStr = "";
+    if (pattern.charAt(0) !== "^") regexStr += "^";
+    regexStr += pattern;
+    if (pattern.charAt(pattern.length - 1) !== "$") regexStr += "$";
+    regex = new RegExp(regexStr);
+  } else {
+    regexStr = pattern.toString();
+    regex = pattern;
+  }
+  return (control) => {
+    if (isEmptyInputValue(control.value)) {
+      return null;
+    }
+    const value = control.value;
+    return regex.test(value) ? null : {
+      "pattern": {
+        "requiredPattern": regexStr,
+        "actualValue": value
+      }
+    };
+  };
+}
+function nullValidator(control) {
+  return null;
+}
+function isPresent(o) {
+  return o != null;
+}
+function toObservable(value) {
+  const obs = isPromise(value) ? from(value) : value;
+  if ((typeof ngDevMode === "undefined" || ngDevMode) && !isSubscribable(obs)) {
+    let errorMessage = `Expected async validator to return Promise or Observable.`;
+    if (typeof value === "object") {
+      errorMessage += " Are you using a synchronous validator where an async validator is expected?";
+    }
+    throw new RuntimeError(-1101, errorMessage);
+  }
+  return obs;
+}
+function mergeErrors(arrayOfErrors) {
+  let res = {};
+  arrayOfErrors.forEach((errors) => {
+    res = errors != null ? __spreadValues(__spreadValues({}, res), errors) : res;
+  });
+  return Object.keys(res).length === 0 ? null : res;
+}
+function executeValidators(control, validators) {
+  return validators.map((validator) => validator(control));
+}
+function isValidatorFn(validator) {
+  return !validator.validate;
+}
+function normalizeValidators(validators) {
+  return validators.map((validator) => {
+    return isValidatorFn(validator) ? validator : (c) => validator.validate(c);
+  });
+}
+function compose(validators) {
+  if (!validators) return null;
+  const presentValidators = validators.filter(isPresent);
+  if (presentValidators.length == 0) return null;
+  return function(control) {
+    return mergeErrors(executeValidators(control, presentValidators));
+  };
+}
+function composeValidators(validators) {
+  return validators != null ? compose(normalizeValidators(validators)) : null;
+}
+function composeAsync(validators) {
+  if (!validators) return null;
+  const presentValidators = validators.filter(isPresent);
+  if (presentValidators.length == 0) return null;
+  return function(control) {
+    const observables = executeValidators(control, presentValidators).map(toObservable);
+    return forkJoin(observables).pipe(map(mergeErrors));
+  };
+}
+function composeAsyncValidators(validators) {
+  return validators != null ? composeAsync(normalizeValidators(validators)) : null;
+}
+function mergeValidators(controlValidators, dirValidator) {
+  if (controlValidators === null) return [dirValidator];
+  return Array.isArray(controlValidators) ? [...controlValidators, dirValidator] : [controlValidators, dirValidator];
+}
+function getControlValidators(control) {
+  return control._rawValidators;
+}
+function getControlAsyncValidators(control) {
+  return control._rawAsyncValidators;
+}
+function makeValidatorsArray(validators) {
+  if (!validators) return [];
+  return Array.isArray(validators) ? validators : [validators];
+}
+function hasValidator(validators, validator) {
+  return Array.isArray(validators) ? validators.includes(validator) : validators === validator;
+}
+function addValidators(validators, currentValidators) {
+  const current = makeValidatorsArray(currentValidators);
+  const validatorsToAdd = makeValidatorsArray(validators);
+  validatorsToAdd.forEach((v) => {
+    if (!hasValidator(current, v)) {
+      current.push(v);
+    }
+  });
+  return current;
+}
+function removeValidators(validators, currentValidators) {
+  return makeValidatorsArray(currentValidators).filter((v) => !hasValidator(validators, v));
+}
+var AbstractControlDirective = class {
+  /**
+   * @description
+   * Reports the value of the control if it is present, otherwise null.
+   */
+  get value() {
+    return this.control ? this.control.value : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is valid. A control is considered valid if no
+   * validation errors exist with the current value.
+   * If the control is not present, null is returned.
+   */
+  get valid() {
+    return this.control ? this.control.valid : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is invalid, meaning that an error exists in the input value.
+   * If the control is not present, null is returned.
+   */
+  get invalid() {
+    return this.control ? this.control.invalid : null;
+  }
+  /**
+   * @description
+   * Reports whether a control is pending, meaning that async validation is occurring and
+   * errors are not yet available for the input value. If the control is not present, null is
+   * returned.
+   */
+  get pending() {
+    return this.control ? this.control.pending : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is disabled, meaning that the control is disabled
+   * in the UI and is exempt from validation checks and excluded from aggregate
+   * values of ancestor controls. If the control is not present, null is returned.
+   */
+  get disabled() {
+    return this.control ? this.control.disabled : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is enabled, meaning that the control is included in ancestor
+   * calculations of validity or value. If the control is not present, null is returned.
+   */
+  get enabled() {
+    return this.control ? this.control.enabled : null;
+  }
+  /**
+   * @description
+   * Reports the control's validation errors. If the control is not present, null is returned.
+   */
+  get errors() {
+    return this.control ? this.control.errors : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is pristine, meaning that the user has not yet changed
+   * the value in the UI. If the control is not present, null is returned.
+   */
+  get pristine() {
+    return this.control ? this.control.pristine : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is dirty, meaning that the user has changed
+   * the value in the UI. If the control is not present, null is returned.
+   */
+  get dirty() {
+    return this.control ? this.control.dirty : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is touched, meaning that the user has triggered
+   * a `blur` event on it. If the control is not present, null is returned.
+   */
+  get touched() {
+    return this.control ? this.control.touched : null;
+  }
+  /**
+   * @description
+   * Reports the validation status of the control. Possible values include:
+   * 'VALID', 'INVALID', 'DISABLED', and 'PENDING'.
+   * If the control is not present, null is returned.
+   */
+  get status() {
+    return this.control ? this.control.status : null;
+  }
+  /**
+   * @description
+   * Reports whether the control is untouched, meaning that the user has not yet triggered
+   * a `blur` event on it. If the control is not present, null is returned.
+   */
+  get untouched() {
+    return this.control ? this.control.untouched : null;
+  }
+  /**
+   * @description
+   * Returns a multicasting observable that emits a validation status whenever it is
+   * calculated for the control. If the control is not present, null is returned.
+   */
+  get statusChanges() {
+    return this.control ? this.control.statusChanges : null;
+  }
+  /**
+   * @description
+   * Returns a multicasting observable of value changes for the control that emits every time the
+   * value of the control changes in the UI or programmatically.
+   * If the control is not present, null is returned.
+   */
+  get valueChanges() {
+    return this.control ? this.control.valueChanges : null;
+  }
+  /**
+   * @description
+   * Returns an array that represents the path from the top-level form to this control.
+   * Each index is the string name of the control on that level.
+   */
+  get path() {
+    return null;
+  }
+  /**
+   * Contains the result of merging synchronous validators into a single validator function
+   * (combined using `Validators.compose`).
+   */
+  _composedValidatorFn;
+  /**
+   * Contains the result of merging asynchronous validators into a single validator function
+   * (combined using `Validators.composeAsync`).
+   */
+  _composedAsyncValidatorFn;
+  /**
+   * Set of synchronous validators as they were provided while calling `setValidators` function.
+   * @internal
+   */
+  _rawValidators = [];
+  /**
+   * Set of asynchronous validators as they were provided while calling `setAsyncValidators`
+   * function.
+   * @internal
+   */
+  _rawAsyncValidators = [];
+  /**
+   * Sets synchronous validators for this directive.
+   * @internal
+   */
+  _setValidators(validators) {
+    this._rawValidators = validators || [];
+    this._composedValidatorFn = composeValidators(this._rawValidators);
+  }
+  /**
+   * Sets asynchronous validators for this directive.
+   * @internal
+   */
+  _setAsyncValidators(validators) {
+    this._rawAsyncValidators = validators || [];
+    this._composedAsyncValidatorFn = composeAsyncValidators(this._rawAsyncValidators);
+  }
+  /**
+   * @description
+   * Synchronous validator function composed of all the synchronous validators registered with this
+   * directive.
+   */
+  get validator() {
+    return this._composedValidatorFn || null;
+  }
+  /**
+   * @description
+   * Asynchronous validator function composed of all the asynchronous validators registered with
+   * this directive.
+   */
+  get asyncValidator() {
+    return this._composedAsyncValidatorFn || null;
+  }
+  /*
+   * The set of callbacks to be invoked when directive instance is being destroyed.
+   */
+  _onDestroyCallbacks = [];
+  /**
+   * Internal function to register callbacks that should be invoked
+   * when directive instance is being destroyed.
+   * @internal
+   */
+  _registerOnDestroy(fn) {
+    this._onDestroyCallbacks.push(fn);
+  }
+  /**
+   * Internal function to invoke all registered "on destroy" callbacks.
+   * Note: calling this function also clears the list of callbacks.
+   * @internal
+   */
+  _invokeOnDestroyCallbacks() {
+    this._onDestroyCallbacks.forEach((fn) => fn());
+    this._onDestroyCallbacks = [];
+  }
+  /**
+   * @description
+   * Resets the control with the provided value if the control is present.
+   */
+  reset(value = void 0) {
+    if (this.control) this.control.reset(value);
+  }
+  /**
+   * @description
+   * Reports whether the control with the given path has the error specified.
+   *
+   * @param errorCode The code of the error to check
+   * @param path A list of control names that designates how to move from the current control
+   * to the control that should be queried for errors.
+   *
+   * @usageNotes
+   * For example, for the following `FormGroup`:
+   *
+   * ```ts
+   * form = new FormGroup({
+   *   address: new FormGroup({ street: new FormControl() })
+   * });
+   * ```
+   *
+   * The path to the 'street' control from the root form would be 'address' -> 'street'.
+   *
+   * It can be provided to this method in one of two formats:
+   *
+   * 1. An array of string control names, e.g. `['address', 'street']`
+   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`
+   *
+   * If no path is given, this method checks for the error on the current control.
+   *
+   * @returns whether the given error is present in the control at the given path.
+   *
+   * If the control is not present, false is returned.
+   */
+  hasError(errorCode, path) {
+    return this.control ? this.control.hasError(errorCode, path) : false;
+  }
+  /**
+   * @description
+   * Reports error data for the control with the given path.
+   *
+   * @param errorCode The code of the error to check
+   * @param path A list of control names that designates how to move from the current control
+   * to the control that should be queried for errors.
+   *
+   * @usageNotes
+   * For example, for the following `FormGroup`:
+   *
+   * ```ts
+   * form = new FormGroup({
+   *   address: new FormGroup({ street: new FormControl() })
+   * });
+   * ```
+   *
+   * The path to the 'street' control from the root form would be 'address' -> 'street'.
+   *
+   * It can be provided to this method in one of two formats:
+   *
+   * 1. An array of string control names, e.g. `['address', 'street']`
+   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`
+   *
+   * @returns error data for that particular error. If the control or error is not present,
+   * null is returned.
+   */
+  getError(errorCode, path) {
+    return this.control ? this.control.getError(errorCode, path) : null;
+  }
+};
+var ControlContainer = class extends AbstractControlDirective {
+  /**
+   * @description
+   * The name for the control
+   */
+  name;
+  /**
+   * @description
+   * The top-level form directive for the control.
+   */
+  get formDirective() {
+    return null;
+  }
+  /**
+   * @description
+   * The path to this group.
+   */
+  get path() {
+    return null;
+  }
+};
+var NgControl = class extends AbstractControlDirective {
+  /**
+   * @description
+   * The parent form for the control.
+   *
+   * @internal
+   */
+  _parent = null;
+  /**
+   * @description
+   * The name for the control
+   */
+  name = null;
+  /**
+   * @description
+   * The value accessor for the control
+   */
+  valueAccessor = null;
+};
+var AbstractControlStatus = class {
+  _cd;
+  constructor(cd) {
+    this._cd = cd;
+  }
+  get isTouched() {
+    this._cd?.control?._touched?.();
+    return !!this._cd?.control?.touched;
+  }
+  get isUntouched() {
+    return !!this._cd?.control?.untouched;
+  }
+  get isPristine() {
+    this._cd?.control?._pristine?.();
+    return !!this._cd?.control?.pristine;
+  }
+  get isDirty() {
+    return !!this._cd?.control?.dirty;
+  }
+  get isValid() {
+    this._cd?.control?._status?.();
+    return !!this._cd?.control?.valid;
+  }
+  get isInvalid() {
+    return !!this._cd?.control?.invalid;
+  }
+  get isPending() {
+    return !!this._cd?.control?.pending;
+  }
+  get isSubmitted() {
+    this._cd?._submitted?.();
+    return !!this._cd?.submitted;
+  }
+};
+var ngControlStatusHost = {
+  "[class.ng-untouched]": "isUntouched",
+  "[class.ng-touched]": "isTouched",
+  "[class.ng-pristine]": "isPristine",
+  "[class.ng-dirty]": "isDirty",
+  "[class.ng-valid]": "isValid",
+  "[class.ng-invalid]": "isInvalid",
+  "[class.ng-pending]": "isPending"
+};
+var ngGroupStatusHost = __spreadProps(__spreadValues({}, ngControlStatusHost), {
+  "[class.ng-submitted]": "isSubmitted"
+});
+var NgControlStatus = class _NgControlStatus extends AbstractControlStatus {
+  constructor(cd) {
+    super(cd);
+  }
+  static ɵfac = function NgControlStatus_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgControlStatus)(ɵɵdirectiveInject(NgControl, 2));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgControlStatus,
+    selectors: [["", "formControlName", ""], ["", "ngModel", ""], ["", "formControl", ""]],
+    hostVars: 14,
+    hostBindings: function NgControlStatus_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵclassProp("ng-untouched", ctx.isUntouched)("ng-touched", ctx.isTouched)("ng-pristine", ctx.isPristine)("ng-dirty", ctx.isDirty)("ng-valid", ctx.isValid)("ng-invalid", ctx.isInvalid)("ng-pending", ctx.isPending);
+      }
+    },
+    standalone: false,
+    features: [ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgControlStatus, [{
+    type: Directive,
+    args: [{
+      selector: "[formControlName],[ngModel],[formControl]",
+      host: ngControlStatusHost,
+      standalone: false
+    }]
+  }], () => [{
+    type: NgControl,
+    decorators: [{
+      type: Self
+    }]
+  }], null);
+})();
+var NgControlStatusGroup = class _NgControlStatusGroup extends AbstractControlStatus {
+  constructor(cd) {
+    super(cd);
+  }
+  static ɵfac = function NgControlStatusGroup_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgControlStatusGroup)(ɵɵdirectiveInject(ControlContainer, 10));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgControlStatusGroup,
+    selectors: [["", "formGroupName", ""], ["", "formArrayName", ""], ["", "ngModelGroup", ""], ["", "formGroup", ""], ["form", 3, "ngNoForm", ""], ["", "ngForm", ""]],
+    hostVars: 16,
+    hostBindings: function NgControlStatusGroup_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵclassProp("ng-untouched", ctx.isUntouched)("ng-touched", ctx.isTouched)("ng-pristine", ctx.isPristine)("ng-dirty", ctx.isDirty)("ng-valid", ctx.isValid)("ng-invalid", ctx.isInvalid)("ng-pending", ctx.isPending)("ng-submitted", ctx.isSubmitted);
+      }
+    },
+    standalone: false,
+    features: [ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgControlStatusGroup, [{
+    type: Directive,
+    args: [{
+      selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]",
+      host: ngGroupStatusHost,
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }]
+  }], null);
+})();
+var formControlNameExample = `
+  <div [formGroup]="myGroup">
+    <input formControlName="firstName">
+  </div>
+
+  In your class:
+
+  this.myGroup = new FormGroup({
+      firstName: new FormControl()
+  });`;
+var formGroupNameExample = `
+  <div [formGroup]="myGroup">
+      <div formGroupName="person">
+        <input formControlName="firstName">
+      </div>
+  </div>
+
+  In your class:
+
+  this.myGroup = new FormGroup({
+      person: new FormGroup({ firstName: new FormControl() })
+  });`;
+var formArrayNameExample = `
+  <div [formGroup]="myGroup">
+    <div formArrayName="cities">
+      <div *ngFor="let city of cityArray.controls; index as i">
+        <input [formControlName]="i">
+      </div>
+    </div>
+  </div>
+
+  In your class:
+
+  this.cityArray = new FormArray([new FormControl('SF')]);
+  this.myGroup = new FormGroup({
+    cities: this.cityArray
+  });`;
+var ngModelGroupExample = `
+  <form>
+      <div ngModelGroup="person">
+        <input [(ngModel)]="person.name" name="firstName">
+      </div>
+  </form>`;
+var ngModelWithFormGroupExample = `
+  <div [formGroup]="myGroup">
+      <input formControlName="firstName">
+      <input [(ngModel)]="showMoreControls" [ngModelOptions]="{standalone: true}">
+  </div>
+`;
+function controlParentException(nameOrIndex) {
+  return new RuntimeError(1050, `formControlName must be used with a parent formGroup directive. You'll want to add a formGroup
+      directive and pass it an existing FormGroup instance (you can create one in your class).
+
+      ${describeFormControl(nameOrIndex)}
+
+    Example:
+
+    ${formControlNameExample}`);
+}
+function describeFormControl(nameOrIndex) {
+  if (nameOrIndex == null || nameOrIndex === "") {
+    return "";
+  }
+  const valueType = typeof nameOrIndex === "string" ? "name" : "index";
+  return `Affected Form Control ${valueType}: "${nameOrIndex}"`;
+}
+function ngModelGroupException() {
+  return new RuntimeError(1051, `formControlName cannot be used with an ngModelGroup parent. It is only compatible with parents
+      that also have a "form" prefix: formGroupName, formArrayName, or formGroup.
+
+      Option 1:  Update the parent to be formGroupName (reactive form strategy)
+
+      ${formGroupNameExample}
+
+      Option 2: Use ngModel instead of formControlName (template-driven strategy)
+
+      ${ngModelGroupExample}`);
+}
+function missingFormException() {
+  return new RuntimeError(1052, `formGroup expects a FormGroup instance. Please pass one in.
+
+      Example:
+
+      ${formControlNameExample}`);
+}
+function groupParentException() {
+  return new RuntimeError(1053, `formGroupName must be used with a parent formGroup directive.  You'll want to add a formGroup
+    directive and pass it an existing FormGroup instance (you can create one in your class).
+
+    Example:
+
+    ${formGroupNameExample}`);
+}
+function arrayParentException() {
+  return new RuntimeError(1054, `formArrayName must be used with a parent formGroup directive.  You'll want to add a formGroup
+      directive and pass it an existing FormGroup instance (you can create one in your class).
+
+      Example:
+
+      ${formArrayNameExample}`);
+}
+var disabledAttrWarning = `
+  It looks like you're using the disabled attribute with a reactive form directive. If you set disabled to true
+  when you set up this control in your component class, the disabled attribute will actually be set in the DOM for
+  you. We recommend using this approach to avoid 'changed after checked' errors.
+
+  Example:
+  // Specify the \`disabled\` property at control creation time:
+  form = new FormGroup({
+    first: new FormControl({value: 'Nancy', disabled: true}, Validators.required),
+    last: new FormControl('Drew', Validators.required)
+  });
+
+  // Controls can also be enabled/disabled after creation:
+  form.get('first')?.enable();
+  form.get('last')?.disable();
+`;
+var asyncValidatorsDroppedWithOptsWarning = `
+  It looks like you're constructing using a FormControl with both an options argument and an
+  async validators argument. Mixing these arguments will cause your async validators to be dropped.
+  You should either put all your validators in the options object, or in separate validators
+  arguments. For example:
+
+  // Using validators arguments
+  fc = new FormControl(42, Validators.required, myAsyncValidator);
+
+  // Using AbstractControlOptions
+  fc = new FormControl(42, {validators: Validators.required, asyncValidators: myAV});
+
+  // Do NOT mix them: async validators will be dropped!
+  fc = new FormControl(42, {validators: Validators.required}, /* Oops! */ myAsyncValidator);
+`;
+function ngModelWarning(directiveName) {
+  return `
+  It looks like you're using ngModel on the same form field as ${directiveName}.
+  Support for using the ngModel input property and ngModelChange event with
+  reactive form directives has been deprecated in Angular v6 and will be removed
+  in a future version of Angular.
+
+  For more information on this, see our API docs here:
+  https://angular.io/api/forms/${directiveName === "formControl" ? "FormControlDirective" : "FormControlName"}#use-with-ngmodel
+  `;
+}
+function describeKey(isFormGroup2, key) {
+  return isFormGroup2 ? `with name: '${key}'` : `at index: ${key}`;
+}
+function noControlsError(isFormGroup2) {
+  return `
+    There are no form controls registered with this ${isFormGroup2 ? "group" : "array"} yet. If you're using ngModel,
+    you may want to check next tick (e.g. use setTimeout).
+  `;
+}
+function missingControlError(isFormGroup2, key) {
+  return `Cannot find form control ${describeKey(isFormGroup2, key)}`;
+}
+function missingControlValueError(isFormGroup2, key) {
+  return `Must supply a value for form control ${describeKey(isFormGroup2, key)}`;
+}
+var VALID = "VALID";
+var INVALID = "INVALID";
+var PENDING = "PENDING";
+var DISABLED = "DISABLED";
+var ControlEvent = class {
+};
+var ValueChangeEvent = class extends ControlEvent {
+  value;
+  source;
+  constructor(value, source) {
+    super();
+    this.value = value;
+    this.source = source;
+  }
+};
+var PristineChangeEvent = class extends ControlEvent {
+  pristine;
+  source;
+  constructor(pristine, source) {
+    super();
+    this.pristine = pristine;
+    this.source = source;
+  }
+};
+var TouchedChangeEvent = class extends ControlEvent {
+  touched;
+  source;
+  constructor(touched, source) {
+    super();
+    this.touched = touched;
+    this.source = source;
+  }
+};
+var StatusChangeEvent = class extends ControlEvent {
+  status;
+  source;
+  constructor(status, source) {
+    super();
+    this.status = status;
+    this.source = source;
+  }
+};
+var FormSubmittedEvent = class extends ControlEvent {
+  source;
+  constructor(source) {
+    super();
+    this.source = source;
+  }
+};
+var FormResetEvent = class extends ControlEvent {
+  source;
+  constructor(source) {
+    super();
+    this.source = source;
+  }
+};
+function pickValidators(validatorOrOpts) {
+  return (isOptionsObj(validatorOrOpts) ? validatorOrOpts.validators : validatorOrOpts) || null;
+}
+function coerceToValidator(validator) {
+  return Array.isArray(validator) ? composeValidators(validator) : validator || null;
+}
+function pickAsyncValidators(asyncValidator, validatorOrOpts) {
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    if (isOptionsObj(validatorOrOpts) && asyncValidator) {
+      console.warn(asyncValidatorsDroppedWithOptsWarning);
+    }
+  }
+  return (isOptionsObj(validatorOrOpts) ? validatorOrOpts.asyncValidators : asyncValidator) || null;
+}
+function coerceToAsyncValidator(asyncValidator) {
+  return Array.isArray(asyncValidator) ? composeAsyncValidators(asyncValidator) : asyncValidator || null;
+}
+function isOptionsObj(validatorOrOpts) {
+  return validatorOrOpts != null && !Array.isArray(validatorOrOpts) && typeof validatorOrOpts === "object";
+}
+function assertControlPresent(parent, isGroup, key) {
+  const controls = parent.controls;
+  const collection = isGroup ? Object.keys(controls) : controls;
+  if (!collection.length) {
+    throw new RuntimeError(1e3, typeof ngDevMode === "undefined" || ngDevMode ? noControlsError(isGroup) : "");
+  }
+  if (!controls[key]) {
+    throw new RuntimeError(1001, typeof ngDevMode === "undefined" || ngDevMode ? missingControlError(isGroup, key) : "");
+  }
+}
+function assertAllValuesPresent(control, isGroup, value) {
+  control._forEachChild((_, key) => {
+    if (value[key] === void 0) {
+      throw new RuntimeError(1002, typeof ngDevMode === "undefined" || ngDevMode ? missingControlValueError(isGroup, key) : "");
+    }
+  });
+}
+var AbstractControl = class {
+  /** @internal */
+  _pendingDirty = false;
+  /**
+   * Indicates that a control has its own pending asynchronous validation in progress.
+   * It also stores if the control should emit events when the validation status changes.
+   *
+   * @internal
+   */
+  _hasOwnPendingAsyncValidator = null;
+  /** @internal */
+  _pendingTouched = false;
+  /** @internal */
+  _onCollectionChange = () => {
+  };
+  /** @internal */
+  _updateOn;
+  _parent = null;
+  _asyncValidationSubscription;
+  /**
+   * Contains the result of merging synchronous validators into a single validator function
+   * (combined using `Validators.compose`).
+   *
+   * @internal
+   */
+  _composedValidatorFn;
+  /**
+   * Contains the result of merging asynchronous validators into a single validator function
+   * (combined using `Validators.composeAsync`).
+   *
+   * @internal
+   */
+  _composedAsyncValidatorFn;
+  /**
+   * Synchronous validators as they were provided:
+   *  - in `AbstractControl` constructor
+   *  - as an argument while calling `setValidators` function
+   *  - while calling the setter on the `validator` field (e.g. `control.validator = validatorFn`)
+   *
+   * @internal
+   */
+  _rawValidators;
+  /**
+   * Asynchronous validators as they were provided:
+   *  - in `AbstractControl` constructor
+   *  - as an argument while calling `setAsyncValidators` function
+   *  - while calling the setter on the `asyncValidator` field (e.g. `control.asyncValidator =
+   * asyncValidatorFn`)
+   *
+   * @internal
+   */
+  _rawAsyncValidators;
+  /**
+   * The current value of the control.
+   *
+   * * For a `FormControl`, the current value.
+   * * For an enabled `FormGroup`, the values of enabled controls as an object
+   * with a key-value pair for each member of the group.
+   * * For a disabled `FormGroup`, the values of all controls as an object
+   * with a key-value pair for each member of the group.
+   * * For a `FormArray`, the values of enabled controls as an array.
+   *
+   */
+  value;
+  /**
+   * Initialize the AbstractControl instance.
+   *
+   * @param validators The function or array of functions that is used to determine the validity of
+   *     this control synchronously.
+   * @param asyncValidators The function or array of functions that is used to determine validity of
+   *     this control asynchronously.
+   */
+  constructor(validators, asyncValidators) {
+    this._assignValidators(validators);
+    this._assignAsyncValidators(asyncValidators);
+  }
+  /**
+   * Returns the function that is used to determine the validity of this control synchronously.
+   * If multiple validators have been added, this will be a single composed function.
+   * See `Validators.compose()` for additional information.
+   */
+  get validator() {
+    return this._composedValidatorFn;
+  }
+  set validator(validatorFn) {
+    this._rawValidators = this._composedValidatorFn = validatorFn;
+  }
+  /**
+   * Returns the function that is used to determine the validity of this control asynchronously.
+   * If multiple validators have been added, this will be a single composed function.
+   * See `Validators.compose()` for additional information.
+   */
+  get asyncValidator() {
+    return this._composedAsyncValidatorFn;
+  }
+  set asyncValidator(asyncValidatorFn) {
+    this._rawAsyncValidators = this._composedAsyncValidatorFn = asyncValidatorFn;
+  }
+  /**
+   * The parent control.
+   */
+  get parent() {
+    return this._parent;
+  }
+  /**
+   * The validation status of the control.
+   *
+   * @see {@link FormControlStatus}
+   *
+   * These status values are mutually exclusive, so a control cannot be
+   * both valid AND invalid or invalid AND disabled.
+   */
+  get status() {
+    return untracked(this.statusReactive);
+  }
+  set status(v) {
+    untracked(() => this.statusReactive.set(v));
+  }
+  /** @internal */
+  _status = computed(() => this.statusReactive());
+  statusReactive = signal(void 0);
+  /**
+   * A control is `valid` when its `status` is `VALID`.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   * @returns True if the control has passed all of its validation tests,
+   * false otherwise.
+   */
+  get valid() {
+    return this.status === VALID;
+  }
+  /**
+   * A control is `invalid` when its `status` is `INVALID`.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   * @returns True if this control has failed one or more of its validation checks,
+   * false otherwise.
+   */
+  get invalid() {
+    return this.status === INVALID;
+  }
+  /**
+   * A control is `pending` when its `status` is `PENDING`.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   * @returns True if this control is in the process of conducting a validation check,
+   * false otherwise.
+   */
+  get pending() {
+    return this.status == PENDING;
+  }
+  /**
+   * A control is `disabled` when its `status` is `DISABLED`.
+   *
+   * Disabled controls are exempt from validation checks and
+   * are not included in the aggregate value of their ancestor
+   * controls.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   * @returns True if the control is disabled, false otherwise.
+   */
+  get disabled() {
+    return this.status === DISABLED;
+  }
+  /**
+   * A control is `enabled` as long as its `status` is not `DISABLED`.
+   *
+   * @returns True if the control has any status other than 'DISABLED',
+   * false if the status is 'DISABLED'.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   */
+  get enabled() {
+    return this.status !== DISABLED;
+  }
+  /**
+   * An object containing any errors generated by failing validation,
+   * or null if there are no errors.
+   */
+  errors;
+  /**
+   * A control is `pristine` if the user has not yet changed
+   * the value in the UI.
+   *
+   * @returns True if the user has not yet changed the value in the UI; compare `dirty`.
+   * Programmatic changes to a control's value do not mark it dirty.
+   */
+  get pristine() {
+    return untracked(this.pristineReactive);
+  }
+  set pristine(v) {
+    untracked(() => this.pristineReactive.set(v));
+  }
+  /** @internal */
+  _pristine = computed(() => this.pristineReactive());
+  pristineReactive = signal(true);
+  /**
+   * A control is `dirty` if the user has changed the value
+   * in the UI.
+   *
+   * @returns True if the user has changed the value of this control in the UI; compare `pristine`.
+   * Programmatic changes to a control's value do not mark it dirty.
+   */
+  get dirty() {
+    return !this.pristine;
+  }
+  /**
+   * True if the control is marked as `touched`.
+   *
+   * A control is marked `touched` once the user has triggered
+   * a `blur` event on it.
+   */
+  get touched() {
+    return untracked(this.touchedReactive);
+  }
+  set touched(v) {
+    untracked(() => this.touchedReactive.set(v));
+  }
+  /** @internal */
+  _touched = computed(() => this.touchedReactive());
+  touchedReactive = signal(false);
+  /**
+   * True if the control has not been marked as touched
+   *
+   * A control is `untouched` if the user has not yet triggered
+   * a `blur` event on it.
+   */
+  get untouched() {
+    return !this.touched;
+  }
+  /**
+   * Exposed as observable, see below.
+   *
+   * @internal
+   */
+  _events = new Subject();
+  /**
+   * A multicasting observable that emits an event every time the state of the control changes.
+   * It emits for value, status, pristine or touched changes.
+   *
+   * **Note**: On value change, the emit happens right after a value of this control is updated. The
+   * value of a parent control (for example if this FormControl is a part of a FormGroup) is updated
+   * later, so accessing a value of a parent control (using the `value` property) from the callback
+   * of this event might result in getting a value that has not been updated yet. Subscribe to the
+   * `events` of the parent control instead.
+   * For other event types, the events are emitted after the parent control has been updated.
+   *
+   */
+  events = this._events.asObservable();
+  /**
+   * A multicasting observable that emits an event every time the value of the control changes, in
+   * the UI or programmatically. It also emits an event each time you call enable() or disable()
+   * without passing along {emitEvent: false} as a function argument.
+   *
+   * **Note**: the emit happens right after a value of this control is updated. The value of a
+   * parent control (for example if this FormControl is a part of a FormGroup) is updated later, so
+   * accessing a value of a parent control (using the `value` property) from the callback of this
+   * event might result in getting a value that has not been updated yet. Subscribe to the
+   * `valueChanges` event of the parent control instead.
+   */
+  valueChanges;
+  /**
+   * A multicasting observable that emits an event every time the validation `status` of the control
+   * recalculates.
+   *
+   * @see {@link FormControlStatus}
+   * @see {@link AbstractControl.status}
+   */
+  statusChanges;
+  /**
+   * Reports the update strategy of the `AbstractControl` (meaning
+   * the event on which the control updates itself).
+   * Possible values: `'change'` | `'blur'` | `'submit'`
+   * Default value: `'change'`
+   */
+  get updateOn() {
+    return this._updateOn ? this._updateOn : this.parent ? this.parent.updateOn : "change";
+  }
+  /**
+   * Sets the synchronous validators that are active on this control.  Calling
+   * this overwrites any existing synchronous validators.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * If you want to add a new validator without affecting existing ones, consider
+   * using `addValidators()` method instead.
+   */
+  setValidators(validators) {
+    this._assignValidators(validators);
+  }
+  /**
+   * Sets the asynchronous validators that are active on this control. Calling this
+   * overwrites any existing asynchronous validators.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * If you want to add a new validator without affecting existing ones, consider
+   * using `addAsyncValidators()` method instead.
+   */
+  setAsyncValidators(validators) {
+    this._assignAsyncValidators(validators);
+  }
+  /**
+   * Add a synchronous validator or validators to this control, without affecting other validators.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * Adding a validator that already exists will have no effect. If duplicate validator functions
+   * are present in the `validators` array, only the first instance would be added to a form
+   * control.
+   *
+   * @param validators The new validator function or functions to add to this control.
+   */
+  addValidators(validators) {
+    this.setValidators(addValidators(validators, this._rawValidators));
+  }
+  /**
+   * Add an asynchronous validator or validators to this control, without affecting other
+   * validators.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * Adding a validator that already exists will have no effect.
+   *
+   * @param validators The new asynchronous validator function or functions to add to this control.
+   */
+  addAsyncValidators(validators) {
+    this.setAsyncValidators(addValidators(validators, this._rawAsyncValidators));
+  }
+  /**
+   * Remove a synchronous validator from this control, without affecting other validators.
+   * Validators are compared by function reference; you must pass a reference to the exact same
+   * validator function as the one that was originally set. If a provided validator is not found,
+   * it is ignored.
+   *
+   * @usageNotes
+   *
+   * ### Reference to a ValidatorFn
+   *
+   * ```
+   * // Reference to the RequiredValidator
+   * const ctrl = new FormControl<string | null>('', Validators.required);
+   * ctrl.removeValidators(Validators.required);
+   *
+   * // Reference to anonymous function inside MinValidator
+   * const minValidator = Validators.min(3);
+   * const ctrl = new FormControl<string | null>('', minValidator);
+   * expect(ctrl.hasValidator(minValidator)).toEqual(true)
+   * expect(ctrl.hasValidator(Validators.min(3))).toEqual(false)
+   *
+   * ctrl.removeValidators(minValidator);
+   * ```
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * @param validators The validator or validators to remove.
+   */
+  removeValidators(validators) {
+    this.setValidators(removeValidators(validators, this._rawValidators));
+  }
+  /**
+   * Remove an asynchronous validator from this control, without affecting other validators.
+   * Validators are compared by function reference; you must pass a reference to the exact same
+   * validator function as the one that was originally set. If a provided validator is not found, it
+   * is ignored.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   * @param validators The asynchronous validator or validators to remove.
+   */
+  removeAsyncValidators(validators) {
+    this.setAsyncValidators(removeValidators(validators, this._rawAsyncValidators));
+  }
+  /**
+   * Check whether a synchronous validator function is present on this control. The provided
+   * validator must be a reference to the exact same function that was provided.
+   *
+   * @usageNotes
+   *
+   * ### Reference to a ValidatorFn
+   *
+   * ```
+   * // Reference to the RequiredValidator
+   * const ctrl = new FormControl<number | null>(0, Validators.required);
+   * expect(ctrl.hasValidator(Validators.required)).toEqual(true)
+   *
+   * // Reference to anonymous function inside MinValidator
+   * const minValidator = Validators.min(3);
+   * const ctrl = new FormControl<number | null>(0, minValidator);
+   * expect(ctrl.hasValidator(minValidator)).toEqual(true)
+   * expect(ctrl.hasValidator(Validators.min(3))).toEqual(false)
+   * ```
+   *
+   * @param validator The validator to check for presence. Compared by function reference.
+   * @returns Whether the provided validator was found on this control.
+   */
+  hasValidator(validator) {
+    return hasValidator(this._rawValidators, validator);
+  }
+  /**
+   * Check whether an asynchronous validator function is present on this control. The provided
+   * validator must be a reference to the exact same function that was provided.
+   *
+   * @param validator The asynchronous validator to check for presence. Compared by function
+   *     reference.
+   * @returns Whether the provided asynchronous validator was found on this control.
+   */
+  hasAsyncValidator(validator) {
+    return hasValidator(this._rawAsyncValidators, validator);
+  }
+  /**
+   * Empties out the synchronous validator list.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   */
+  clearValidators() {
+    this.validator = null;
+  }
+  /**
+   * Empties out the async validator list.
+   *
+   * When you add or remove a validator at run time, you must call
+   * `updateValueAndValidity()` for the new validation to take effect.
+   *
+   */
+  clearAsyncValidators() {
+    this.asyncValidator = null;
+  }
+  markAsTouched(opts = {}) {
+    const changed = this.touched === false;
+    this.touched = true;
+    const sourceControl = opts.sourceControl ?? this;
+    if (this._parent && !opts.onlySelf) {
+      this._parent.markAsTouched(__spreadProps(__spreadValues({}, opts), {
+        sourceControl
+      }));
+    }
+    if (changed && opts.emitEvent !== false) {
+      this._events.next(new TouchedChangeEvent(true, sourceControl));
+    }
+  }
+  /**
+   * Marks the control and all its descendant controls as `dirty`.
+   * @see {@link markAsDirty()}
+   *
+   * @param opts Configuration options that determine how the control propagates changes
+   * and emits events after marking is applied.
+   * * `emitEvent`: When true or not supplied (the default), the `events`
+   * observable emits a `PristineChangeEvent` with the `pristine` property being `false`.
+   * When false, no events are emitted.
+   */
+  markAllAsDirty(opts = {}) {
+    this.markAsDirty({
+      onlySelf: true,
+      emitEvent: opts.emitEvent,
+      sourceControl: this
+    });
+    this._forEachChild((control) => control.markAllAsDirty(opts));
+  }
+  /**
+   * Marks the control and all its descendant controls as `touched`.
+   * @see {@link markAsTouched()}
+   *
+   * @param opts Configuration options that determine how the control propagates changes
+   * and emits events after marking is applied.
+   * * `emitEvent`: When true or not supplied (the default), the `events`
+   * observable emits a `TouchedChangeEvent` with the `touched` property being `true`.
+   * When false, no events are emitted.
+   */
+  markAllAsTouched(opts = {}) {
+    this.markAsTouched({
+      onlySelf: true,
+      emitEvent: opts.emitEvent,
+      sourceControl: this
+    });
+    this._forEachChild((control) => control.markAllAsTouched(opts));
+  }
+  markAsUntouched(opts = {}) {
+    const changed = this.touched === true;
+    this.touched = false;
+    this._pendingTouched = false;
+    const sourceControl = opts.sourceControl ?? this;
+    this._forEachChild((control) => {
+      control.markAsUntouched({
+        onlySelf: true,
+        emitEvent: opts.emitEvent,
+        sourceControl
+      });
+    });
+    if (this._parent && !opts.onlySelf) {
+      this._parent._updateTouched(opts, sourceControl);
+    }
+    if (changed && opts.emitEvent !== false) {
+      this._events.next(new TouchedChangeEvent(false, sourceControl));
+    }
+  }
+  markAsDirty(opts = {}) {
+    const changed = this.pristine === true;
+    this.pristine = false;
+    const sourceControl = opts.sourceControl ?? this;
+    if (this._parent && !opts.onlySelf) {
+      this._parent.markAsDirty(__spreadProps(__spreadValues({}, opts), {
+        sourceControl
+      }));
+    }
+    if (changed && opts.emitEvent !== false) {
+      this._events.next(new PristineChangeEvent(false, sourceControl));
+    }
+  }
+  markAsPristine(opts = {}) {
+    const changed = this.pristine === false;
+    this.pristine = true;
+    this._pendingDirty = false;
+    const sourceControl = opts.sourceControl ?? this;
+    this._forEachChild((control) => {
+      control.markAsPristine({
+        onlySelf: true,
+        emitEvent: opts.emitEvent
+      });
+    });
+    if (this._parent && !opts.onlySelf) {
+      this._parent._updatePristine(opts, sourceControl);
+    }
+    if (changed && opts.emitEvent !== false) {
+      this._events.next(new PristineChangeEvent(true, sourceControl));
+    }
+  }
+  markAsPending(opts = {}) {
+    this.status = PENDING;
+    const sourceControl = opts.sourceControl ?? this;
+    if (opts.emitEvent !== false) {
+      this._events.next(new StatusChangeEvent(this.status, sourceControl));
+      this.statusChanges.emit(this.status);
+    }
+    if (this._parent && !opts.onlySelf) {
+      this._parent.markAsPending(__spreadProps(__spreadValues({}, opts), {
+        sourceControl
+      }));
+    }
+  }
+  disable(opts = {}) {
+    const skipPristineCheck = this._parentMarkedDirty(opts.onlySelf);
+    this.status = DISABLED;
+    this.errors = null;
+    this._forEachChild((control) => {
+      control.disable(__spreadProps(__spreadValues({}, opts), {
+        onlySelf: true
+      }));
+    });
+    this._updateValue();
+    const sourceControl = opts.sourceControl ?? this;
+    if (opts.emitEvent !== false) {
+      this._events.next(new ValueChangeEvent(this.value, sourceControl));
+      this._events.next(new StatusChangeEvent(this.status, sourceControl));
+      this.valueChanges.emit(this.value);
+      this.statusChanges.emit(this.status);
+    }
+    this._updateAncestors(__spreadProps(__spreadValues({}, opts), {
+      skipPristineCheck
+    }), this);
+    this._onDisabledChange.forEach((changeFn) => changeFn(true));
+  }
+  /**
+   * Enables the control. This means the control is included in validation checks and
+   * the aggregate value of its parent. Its status recalculates based on its value and
+   * its validators.
+   *
+   * By default, if the control has children, all children are enabled.
+   *
+   * @see {@link AbstractControl.status}
+   *
+   * @param opts Configure options that control how the control propagates changes and
+   * emits events when marked as untouched
+   * * `onlySelf`: When true, mark only this control. When false or not supplied,
+   * marks all direct ancestors. Default is false.
+   * * `emitEvent`: When true or not supplied (the default), the `statusChanges`,
+   * `valueChanges` and `events`
+   * observables emit events with the latest status and value when the control is enabled.
+   * When false, no events are emitted.
+   */
+  enable(opts = {}) {
+    const skipPristineCheck = this._parentMarkedDirty(opts.onlySelf);
+    this.status = VALID;
+    this._forEachChild((control) => {
+      control.enable(__spreadProps(__spreadValues({}, opts), {
+        onlySelf: true
+      }));
+    });
+    this.updateValueAndValidity({
+      onlySelf: true,
+      emitEvent: opts.emitEvent
+    });
+    this._updateAncestors(__spreadProps(__spreadValues({}, opts), {
+      skipPristineCheck
+    }), this);
+    this._onDisabledChange.forEach((changeFn) => changeFn(false));
+  }
+  _updateAncestors(opts, sourceControl) {
+    if (this._parent && !opts.onlySelf) {
+      this._parent.updateValueAndValidity(opts);
+      if (!opts.skipPristineCheck) {
+        this._parent._updatePristine({}, sourceControl);
+      }
+      this._parent._updateTouched({}, sourceControl);
+    }
+  }
+  /**
+   * Sets the parent of the control
+   *
+   * @param parent The new parent.
+   */
+  setParent(parent) {
+    this._parent = parent;
+  }
+  /**
+   * The raw value of this control. For most control implementations, the raw value will include
+   * disabled children.
+   */
+  getRawValue() {
+    return this.value;
+  }
+  updateValueAndValidity(opts = {}) {
+    this._setInitialStatus();
+    this._updateValue();
+    if (this.enabled) {
+      const shouldHaveEmitted = this._cancelExistingSubscription();
+      this.errors = this._runValidator();
+      this.status = this._calculateStatus();
+      if (this.status === VALID || this.status === PENDING) {
+        this._runAsyncValidator(shouldHaveEmitted, opts.emitEvent);
+      }
+    }
+    const sourceControl = opts.sourceControl ?? this;
+    if (opts.emitEvent !== false) {
+      this._events.next(new ValueChangeEvent(this.value, sourceControl));
+      this._events.next(new StatusChangeEvent(this.status, sourceControl));
+      this.valueChanges.emit(this.value);
+      this.statusChanges.emit(this.status);
+    }
+    if (this._parent && !opts.onlySelf) {
+      this._parent.updateValueAndValidity(__spreadProps(__spreadValues({}, opts), {
+        sourceControl
+      }));
+    }
+  }
+  /** @internal */
+  _updateTreeValidity(opts = {
+    emitEvent: true
+  }) {
+    this._forEachChild((ctrl) => ctrl._updateTreeValidity(opts));
+    this.updateValueAndValidity({
+      onlySelf: true,
+      emitEvent: opts.emitEvent
+    });
+  }
+  _setInitialStatus() {
+    this.status = this._allControlsDisabled() ? DISABLED : VALID;
+  }
+  _runValidator() {
+    return this.validator ? this.validator(this) : null;
+  }
+  _runAsyncValidator(shouldHaveEmitted, emitEvent) {
+    if (this.asyncValidator) {
+      this.status = PENDING;
+      this._hasOwnPendingAsyncValidator = {
+        emitEvent: emitEvent !== false,
+        shouldHaveEmitted: shouldHaveEmitted !== false
+      };
+      const obs = toObservable(this.asyncValidator(this));
+      this._asyncValidationSubscription = obs.subscribe((errors) => {
+        this._hasOwnPendingAsyncValidator = null;
+        this.setErrors(errors, {
+          emitEvent,
+          shouldHaveEmitted
+        });
+      });
+    }
+  }
+  _cancelExistingSubscription() {
+    if (this._asyncValidationSubscription) {
+      this._asyncValidationSubscription.unsubscribe();
+      const shouldHaveEmitted = (this._hasOwnPendingAsyncValidator?.emitEvent || this._hasOwnPendingAsyncValidator?.shouldHaveEmitted) ?? false;
+      this._hasOwnPendingAsyncValidator = null;
+      return shouldHaveEmitted;
+    }
+    return false;
+  }
+  setErrors(errors, opts = {}) {
+    this.errors = errors;
+    this._updateControlsErrors(opts.emitEvent !== false, this, opts.shouldHaveEmitted);
+  }
+  /**
+   * Retrieves a child control given the control's name or path.
+   *
+   * @param path A dot-delimited string or array of string/number values that define the path to the
+   * control. If a string is provided, passing it as a string literal will result in improved type
+   * information. Likewise, if an array is provided, passing it `as const` will cause improved type
+   * information to be available.
+   *
+   * @usageNotes
+   * ### Retrieve a nested control
+   *
+   * For example, to get a `name` control nested within a `person` sub-group:
+   *
+   * * `this.form.get('person.name');`
+   *
+   * -OR-
+   *
+   * * `this.form.get(['person', 'name'] as const);` // `as const` gives improved typings
+   *
+   * ### Retrieve a control in a FormArray
+   *
+   * When accessing an element inside a FormArray, you can use an element index.
+   * For example, to get a `price` control from the first element in an `items` array you can use:
+   *
+   * * `this.form.get('items.0.price');`
+   *
+   * -OR-
+   *
+   * * `this.form.get(['items', 0, 'price']);`
+   */
+  get(path) {
+    let currPath = path;
+    if (currPath == null) return null;
+    if (!Array.isArray(currPath)) currPath = currPath.split(".");
+    if (currPath.length === 0) return null;
+    return currPath.reduce((control, name) => control && control._find(name), this);
+  }
+  /**
+   * @description
+   * Reports error data for the control with the given path.
+   *
+   * @param errorCode The code of the error to check
+   * @param path A list of control names that designates how to move from the current control
+   * to the control that should be queried for errors.
+   *
+   * @usageNotes
+   * For example, for the following `FormGroup`:
+   *
+   * ```ts
+   * form = new FormGroup({
+   *   address: new FormGroup({ street: new FormControl() })
+   * });
+   * ```
+   *
+   * The path to the 'street' control from the root form would be 'address' -> 'street'.
+   *
+   * It can be provided to this method in one of two formats:
+   *
+   * 1. An array of string control names, e.g. `['address', 'street']`
+   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`
+   *
+   * @returns error data for that particular error. If the control or error is not present,
+   * null is returned.
+   */
+  getError(errorCode, path) {
+    const control = path ? this.get(path) : this;
+    return control && control.errors ? control.errors[errorCode] : null;
+  }
+  /**
+   * @description
+   * Reports whether the control with the given path has the error specified.
+   *
+   * @param errorCode The code of the error to check
+   * @param path A list of control names that designates how to move from the current control
+   * to the control that should be queried for errors.
+   *
+   * @usageNotes
+   * For example, for the following `FormGroup`:
+   *
+   * ```ts
+   * form = new FormGroup({
+   *   address: new FormGroup({ street: new FormControl() })
+   * });
+   * ```
+   *
+   * The path to the 'street' control from the root form would be 'address' -> 'street'.
+   *
+   * It can be provided to this method in one of two formats:
+   *
+   * 1. An array of string control names, e.g. `['address', 'street']`
+   * 1. A period-delimited list of control names in one string, e.g. `'address.street'`
+   *
+   * If no path is given, this method checks for the error on the current control.
+   *
+   * @returns whether the given error is present in the control at the given path.
+   *
+   * If the control is not present, false is returned.
+   */
+  hasError(errorCode, path) {
+    return !!this.getError(errorCode, path);
+  }
+  /**
+   * Retrieves the top-level ancestor of this control.
+   */
+  get root() {
+    let x = this;
+    while (x._parent) {
+      x = x._parent;
+    }
+    return x;
+  }
+  /** @internal */
+  _updateControlsErrors(emitEvent, changedControl, shouldHaveEmitted) {
+    this.status = this._calculateStatus();
+    if (emitEvent) {
+      this.statusChanges.emit(this.status);
+    }
+    if (emitEvent || shouldHaveEmitted) {
+      this._events.next(new StatusChangeEvent(this.status, changedControl));
+    }
+    if (this._parent) {
+      this._parent._updateControlsErrors(emitEvent, changedControl, shouldHaveEmitted);
+    }
+  }
+  /** @internal */
+  _initObservables() {
+    this.valueChanges = new EventEmitter();
+    this.statusChanges = new EventEmitter();
+  }
+  _calculateStatus() {
+    if (this._allControlsDisabled()) return DISABLED;
+    if (this.errors) return INVALID;
+    if (this._hasOwnPendingAsyncValidator || this._anyControlsHaveStatus(PENDING)) return PENDING;
+    if (this._anyControlsHaveStatus(INVALID)) return INVALID;
+    return VALID;
+  }
+  /** @internal */
+  _anyControlsHaveStatus(status) {
+    return this._anyControls((control) => control.status === status);
+  }
+  /** @internal */
+  _anyControlsDirty() {
+    return this._anyControls((control) => control.dirty);
+  }
+  /** @internal */
+  _anyControlsTouched() {
+    return this._anyControls((control) => control.touched);
+  }
+  /** @internal */
+  _updatePristine(opts, changedControl) {
+    const newPristine = !this._anyControlsDirty();
+    const changed = this.pristine !== newPristine;
+    this.pristine = newPristine;
+    if (this._parent && !opts.onlySelf) {
+      this._parent._updatePristine(opts, changedControl);
+    }
+    if (changed) {
+      this._events.next(new PristineChangeEvent(this.pristine, changedControl));
+    }
+  }
+  /** @internal */
+  _updateTouched(opts = {}, changedControl) {
+    this.touched = this._anyControlsTouched();
+    this._events.next(new TouchedChangeEvent(this.touched, changedControl));
+    if (this._parent && !opts.onlySelf) {
+      this._parent._updateTouched(opts, changedControl);
+    }
+  }
+  /** @internal */
+  _onDisabledChange = [];
+  /** @internal */
+  _registerOnCollectionChange(fn) {
+    this._onCollectionChange = fn;
+  }
+  /** @internal */
+  _setUpdateStrategy(opts) {
+    if (isOptionsObj(opts) && opts.updateOn != null) {
+      this._updateOn = opts.updateOn;
+    }
+  }
+  /**
+   * Check to see if parent has been marked artificially dirty.
+   *
+   * @internal
+   */
+  _parentMarkedDirty(onlySelf) {
+    const parentDirty = this._parent && this._parent.dirty;
+    return !onlySelf && !!parentDirty && !this._parent._anyControlsDirty();
+  }
+  /** @internal */
+  _find(name) {
+    return null;
+  }
+  /**
+   * Internal implementation of the `setValidators` method. Needs to be separated out into a
+   * different method, because it is called in the constructor and it can break cases where
+   * a control is extended.
+   */
+  _assignValidators(validators) {
+    this._rawValidators = Array.isArray(validators) ? validators.slice() : validators;
+    this._composedValidatorFn = coerceToValidator(this._rawValidators);
+  }
+  /**
+   * Internal implementation of the `setAsyncValidators` method. Needs to be separated out into a
+   * different method, because it is called in the constructor and it can break cases where
+   * a control is extended.
+   */
+  _assignAsyncValidators(validators) {
+    this._rawAsyncValidators = Array.isArray(validators) ? validators.slice() : validators;
+    this._composedAsyncValidatorFn = coerceToAsyncValidator(this._rawAsyncValidators);
+  }
+};
+var FormGroup = class extends AbstractControl {
+  /**
+   * Creates a new `FormGroup` instance.
+   *
+   * @param controls A collection of child controls. The key for each child is the name
+   * under which it is registered.
+   *
+   * @param validatorOrOpts A synchronous validator function, or an array of
+   * such functions, or an `AbstractControlOptions` object that contains validation functions
+   * and a validation trigger.
+   *
+   * @param asyncValidator A single async validator or array of async validator functions
+   *
+   */
+  constructor(controls, validatorOrOpts, asyncValidator) {
+    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));
+    (typeof ngDevMode === "undefined" || ngDevMode) && validateFormGroupControls(controls);
+    this.controls = controls;
+    this._initObservables();
+    this._setUpdateStrategy(validatorOrOpts);
+    this._setUpControls();
+    this.updateValueAndValidity({
+      onlySelf: true,
+      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to
+      // `VALID` or `INVALID`. The status should be broadcasted via the `statusChanges` observable,
+      // so we set `emitEvent` to `true` to allow that during the control creation process.
+      emitEvent: !!this.asyncValidator
+    });
+  }
+  controls;
+  registerControl(name, control) {
+    if (this.controls[name]) return this.controls[name];
+    this.controls[name] = control;
+    control.setParent(this);
+    control._registerOnCollectionChange(this._onCollectionChange);
+    return control;
+  }
+  addControl(name, control, options = {}) {
+    this.registerControl(name, control);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+    this._onCollectionChange();
+  }
+  /**
+   * Remove a control from this group. In a strongly-typed group, required controls cannot be
+   * removed.
+   *
+   * This method also updates the value and validity of the control.
+   *
+   * @param name The control name to remove from the collection
+   * @param options Specifies whether this FormGroup instance should emit events after a
+   *     control is removed.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control is
+   * removed. When false, no events are emitted.
+   */
+  removeControl(name, options = {}) {
+    if (this.controls[name]) this.controls[name]._registerOnCollectionChange(() => {
+    });
+    delete this.controls[name];
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+    this._onCollectionChange();
+  }
+  setControl(name, control, options = {}) {
+    if (this.controls[name]) this.controls[name]._registerOnCollectionChange(() => {
+    });
+    delete this.controls[name];
+    if (control) this.registerControl(name, control);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+    this._onCollectionChange();
+  }
+  contains(controlName) {
+    return this.controls.hasOwnProperty(controlName) && this.controls[controlName].enabled;
+  }
+  /**
+   * Sets the value of the `FormGroup`. It accepts an object that matches
+   * the structure of the group, with control names as keys.
+   *
+   * @usageNotes
+   * ### Set the complete value for the form group
+   *
+   * ```ts
+   * const form = new FormGroup({
+   *   first: new FormControl(),
+   *   last: new FormControl()
+   * });
+   *
+   * console.log(form.value);   // {first: null, last: null}
+   *
+   * form.setValue({first: 'Nancy', last: 'Drew'});
+   * console.log(form.value);   // {first: 'Nancy', last: 'Drew'}
+   * ```
+   *
+   * @throws When strict checks fail, such as setting the value of a control
+   * that doesn't exist or if you exclude a value of a control that does exist.
+   *
+   * @param value The new value for the control that matches the structure of the group.
+   * @param options Configuration options that determine how the control propagates changes
+   * and emits events after the value changes.
+   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity
+   * updateValueAndValidity} method.
+   *
+   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default is
+   * false.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges`
+   * observables emit events with the latest status and value when the control value is updated.
+   * When false, no events are emitted.
+   */
+  setValue(value, options = {}) {
+    assertAllValuesPresent(this, true, value);
+    Object.keys(value).forEach((name) => {
+      assertControlPresent(this, true, name);
+      this.controls[name].setValue(value[name], {
+        onlySelf: true,
+        emitEvent: options.emitEvent
+      });
+    });
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * Patches the value of the `FormGroup`. It accepts an object with control
+   * names as keys, and does its best to match the values to the correct controls
+   * in the group.
+   *
+   * It accepts both super-sets and sub-sets of the group without throwing an error.
+   *
+   * @usageNotes
+   * ### Patch the value for a form group
+   *
+   * ```ts
+   * const form = new FormGroup({
+   *    first: new FormControl(),
+   *    last: new FormControl()
+   * });
+   * console.log(form.value);   // {first: null, last: null}
+   *
+   * form.patchValue({first: 'Nancy'});
+   * console.log(form.value);   // {first: 'Nancy', last: null}
+   * ```
+   *
+   * @param value The object that matches the structure of the group.
+   * @param options Configuration options that determine how the control propagates changes and
+   * emits events after the value is patched.
+   * * `onlySelf`: When true, each change only affects this control and not its parent. Default is
+   * true.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control value
+   * is updated. When false, no events are emitted. The configuration options are passed to
+   * the {@link AbstractControl#updateValueAndValidity updateValueAndValidity} method.
+   */
+  patchValue(value, options = {}) {
+    if (value == null) return;
+    Object.keys(value).forEach((name) => {
+      const control = this.controls[name];
+      if (control) {
+        control.patchValue(
+          /* Guaranteed to be present, due to the outer forEach. */
+          value[name],
+          {
+            onlySelf: true,
+            emitEvent: options.emitEvent
+          }
+        );
+      }
+    });
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * Resets the `FormGroup`, marks all descendants `pristine` and `untouched` and sets
+   * the value of all descendants to their default values, or null if no defaults were provided.
+   *
+   * You reset to a specific form state by passing in a map of states
+   * that matches the structure of your form, with control names as keys. The state
+   * is a standalone value or a form state object with both a value and a disabled
+   * status.
+   *
+   * @param value Resets the control with an initial value,
+   * or an object that defines the initial value and disabled state.
+   *
+   * @param options Configuration options that determine how the control propagates changes
+   * and emits events when the group is reset.
+   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default is
+   * false.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges`
+   * observables emit events with the latest status and value when the control is reset.
+   * When false, no events are emitted.
+   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity
+   * updateValueAndValidity} method.
+   *
+   * @usageNotes
+   *
+   * ### Reset the form group values
+   *
+   * ```ts
+   * const form = new FormGroup({
+   *   first: new FormControl('first name'),
+   *   last: new FormControl('last name')
+   * });
+   *
+   * console.log(form.value);  // {first: 'first name', last: 'last name'}
+   *
+   * form.reset({ first: 'name', last: 'last name' });
+   *
+   * console.log(form.value);  // {first: 'name', last: 'last name'}
+   * ```
+   *
+   * ### Reset the form group values and disabled status
+   *
+   * ```ts
+   * const form = new FormGroup({
+   *   first: new FormControl('first name'),
+   *   last: new FormControl('last name')
+   * });
+   *
+   * form.reset({
+   *   first: {value: 'name', disabled: true},
+   *   last: 'last'
+   * });
+   *
+   * console.log(form.value);  // {last: 'last'}
+   * console.log(form.get('first').status);  // 'DISABLED'
+   * ```
+   */
+  reset(value = {}, options = {}) {
+    this._forEachChild((control, name) => {
+      control.reset(value ? value[name] : null, {
+        onlySelf: true,
+        emitEvent: options.emitEvent
+      });
+    });
+    this._updatePristine(options, this);
+    this._updateTouched(options, this);
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * The aggregate value of the `FormGroup`, including any disabled controls.
+   *
+   * Retrieves all values regardless of disabled status.
+   */
+  getRawValue() {
+    return this._reduceChildren({}, (acc, control, name) => {
+      acc[name] = control.getRawValue();
+      return acc;
+    });
+  }
+  /** @internal */
+  _syncPendingControls() {
+    let subtreeUpdated = this._reduceChildren(false, (updated, child) => {
+      return child._syncPendingControls() ? true : updated;
+    });
+    if (subtreeUpdated) this.updateValueAndValidity({
+      onlySelf: true
+    });
+    return subtreeUpdated;
+  }
+  /** @internal */
+  _forEachChild(cb) {
+    Object.keys(this.controls).forEach((key) => {
+      const control = this.controls[key];
+      control && cb(control, key);
+    });
+  }
+  /** @internal */
+  _setUpControls() {
+    this._forEachChild((control) => {
+      control.setParent(this);
+      control._registerOnCollectionChange(this._onCollectionChange);
+    });
+  }
+  /** @internal */
+  _updateValue() {
+    this.value = this._reduceValue();
+  }
+  /** @internal */
+  _anyControls(condition) {
+    for (const [controlName, control] of Object.entries(this.controls)) {
+      if (this.contains(controlName) && condition(control)) {
+        return true;
+      }
+    }
+    return false;
+  }
+  /** @internal */
+  _reduceValue() {
+    let acc = {};
+    return this._reduceChildren(acc, (acc2, control, name) => {
+      if (control.enabled || this.disabled) {
+        acc2[name] = control.value;
+      }
+      return acc2;
+    });
+  }
+  /** @internal */
+  _reduceChildren(initValue, fn) {
+    let res = initValue;
+    this._forEachChild((control, name) => {
+      res = fn(res, control, name);
+    });
+    return res;
+  }
+  /** @internal */
+  _allControlsDisabled() {
+    for (const controlName of Object.keys(this.controls)) {
+      if (this.controls[controlName].enabled) {
+        return false;
+      }
+    }
+    return Object.keys(this.controls).length > 0 || this.disabled;
+  }
+  /** @internal */
+  _find(name) {
+    return this.controls.hasOwnProperty(name) ? this.controls[name] : null;
+  }
+};
+function validateFormGroupControls(controls) {
+  const invalidKeys = Object.keys(controls).filter((key) => key.includes("."));
+  if (invalidKeys.length > 0) {
+    console.warn(`FormGroup keys cannot include \`.\`, please replace the keys for: ${invalidKeys.join(",")}.`);
+  }
+}
+var UntypedFormGroup = FormGroup;
+var isFormGroup = (control) => control instanceof FormGroup;
+var FormRecord = class extends FormGroup {
+};
+var isFormRecord = (control) => control instanceof FormRecord;
+var CALL_SET_DISABLED_STATE = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "CallSetDisabledState" : "", {
+  providedIn: "root",
+  factory: () => setDisabledStateDefault
+});
+var setDisabledStateDefault = "always";
+function controlPath(name, parent) {
+  return [...parent.path, name];
+}
+function setUpControl(control, dir, callSetDisabledState = setDisabledStateDefault) {
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    if (!control) _throwError(dir, "Cannot find control with");
+    if (!dir.valueAccessor) _throwMissingValueAccessorError(dir);
+  }
+  setUpValidators(control, dir);
+  dir.valueAccessor.writeValue(control.value);
+  if (control.disabled || callSetDisabledState === "always") {
+    dir.valueAccessor.setDisabledState?.(control.disabled);
+  }
+  setUpViewChangePipeline(control, dir);
+  setUpModelChangePipeline(control, dir);
+  setUpBlurPipeline(control, dir);
+  setUpDisabledChangeHandler(control, dir);
+}
+function cleanUpControl(control, dir, validateControlPresenceOnChange = true) {
+  const noop = () => {
+    if (validateControlPresenceOnChange && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      _noControlError(dir);
+    }
+  };
+  if (dir.valueAccessor) {
+    dir.valueAccessor.registerOnChange(noop);
+    dir.valueAccessor.registerOnTouched(noop);
+  }
+  cleanUpValidators(control, dir);
+  if (control) {
+    dir._invokeOnDestroyCallbacks();
+    control._registerOnCollectionChange(() => {
+    });
+  }
+}
+function registerOnValidatorChange(validators, onChange) {
+  validators.forEach((validator) => {
+    if (validator.registerOnValidatorChange) validator.registerOnValidatorChange(onChange);
+  });
+}
+function setUpDisabledChangeHandler(control, dir) {
+  if (dir.valueAccessor.setDisabledState) {
+    const onDisabledChange = (isDisabled) => {
+      dir.valueAccessor.setDisabledState(isDisabled);
+    };
+    control.registerOnDisabledChange(onDisabledChange);
+    dir._registerOnDestroy(() => {
+      control._unregisterOnDisabledChange(onDisabledChange);
+    });
+  }
+}
+function setUpValidators(control, dir) {
+  const validators = getControlValidators(control);
+  if (dir.validator !== null) {
+    control.setValidators(mergeValidators(validators, dir.validator));
+  } else if (typeof validators === "function") {
+    control.setValidators([validators]);
+  }
+  const asyncValidators = getControlAsyncValidators(control);
+  if (dir.asyncValidator !== null) {
+    control.setAsyncValidators(mergeValidators(asyncValidators, dir.asyncValidator));
+  } else if (typeof asyncValidators === "function") {
+    control.setAsyncValidators([asyncValidators]);
+  }
+  const onValidatorChange = () => control.updateValueAndValidity();
+  registerOnValidatorChange(dir._rawValidators, onValidatorChange);
+  registerOnValidatorChange(dir._rawAsyncValidators, onValidatorChange);
+}
+function cleanUpValidators(control, dir) {
+  let isControlUpdated = false;
+  if (control !== null) {
+    if (dir.validator !== null) {
+      const validators = getControlValidators(control);
+      if (Array.isArray(validators) && validators.length > 0) {
+        const updatedValidators = validators.filter((validator) => validator !== dir.validator);
+        if (updatedValidators.length !== validators.length) {
+          isControlUpdated = true;
+          control.setValidators(updatedValidators);
+        }
+      }
+    }
+    if (dir.asyncValidator !== null) {
+      const asyncValidators = getControlAsyncValidators(control);
+      if (Array.isArray(asyncValidators) && asyncValidators.length > 0) {
+        const updatedAsyncValidators = asyncValidators.filter((asyncValidator) => asyncValidator !== dir.asyncValidator);
+        if (updatedAsyncValidators.length !== asyncValidators.length) {
+          isControlUpdated = true;
+          control.setAsyncValidators(updatedAsyncValidators);
+        }
+      }
+    }
+  }
+  const noop = () => {
+  };
+  registerOnValidatorChange(dir._rawValidators, noop);
+  registerOnValidatorChange(dir._rawAsyncValidators, noop);
+  return isControlUpdated;
+}
+function setUpViewChangePipeline(control, dir) {
+  dir.valueAccessor.registerOnChange((newValue) => {
+    control._pendingValue = newValue;
+    control._pendingChange = true;
+    control._pendingDirty = true;
+    if (control.updateOn === "change") updateControl(control, dir);
+  });
+}
+function setUpBlurPipeline(control, dir) {
+  dir.valueAccessor.registerOnTouched(() => {
+    control._pendingTouched = true;
+    if (control.updateOn === "blur" && control._pendingChange) updateControl(control, dir);
+    if (control.updateOn !== "submit") control.markAsTouched();
+  });
+}
+function updateControl(control, dir) {
+  if (control._pendingDirty) control.markAsDirty();
+  control.setValue(control._pendingValue, {
+    emitModelToViewChange: false
+  });
+  dir.viewToModelUpdate(control._pendingValue);
+  control._pendingChange = false;
+}
+function setUpModelChangePipeline(control, dir) {
+  const onChange = (newValue, emitModelEvent) => {
+    dir.valueAccessor.writeValue(newValue);
+    if (emitModelEvent) dir.viewToModelUpdate(newValue);
+  };
+  control.registerOnChange(onChange);
+  dir._registerOnDestroy(() => {
+    control._unregisterOnChange(onChange);
+  });
+}
+function setUpFormContainer(control, dir) {
+  if (control == null && (typeof ngDevMode === "undefined" || ngDevMode)) _throwError(dir, "Cannot find control with");
+  setUpValidators(control, dir);
+}
+function cleanUpFormContainer(control, dir) {
+  return cleanUpValidators(control, dir);
+}
+function _noControlError(dir) {
+  return _throwError(dir, "There is no FormControl instance attached to form control element with");
+}
+function _throwError(dir, message) {
+  const messageEnd = _describeControlLocation(dir);
+  throw new Error(`${message} ${messageEnd}`);
+}
+function _describeControlLocation(dir) {
+  const path = dir.path;
+  if (path && path.length > 1) return `path: '${path.join(" -> ")}'`;
+  if (path?.[0]) return `name: '${path}'`;
+  return "unspecified name attribute";
+}
+function _throwMissingValueAccessorError(dir) {
+  const loc = _describeControlLocation(dir);
+  throw new RuntimeError(-1203, `No value accessor for form control ${loc}.`);
+}
+function _throwInvalidValueAccessorError(dir) {
+  const loc = _describeControlLocation(dir);
+  throw new RuntimeError(1200, `Value accessor was not provided as an array for form control with ${loc}. Check that the \`NG_VALUE_ACCESSOR\` token is configured as a \`multi: true\` provider.`);
+}
+function isPropertyUpdated(changes, viewModel) {
+  if (!changes.hasOwnProperty("model")) return false;
+  const change = changes["model"];
+  if (change.isFirstChange()) return true;
+  return !Object.is(viewModel, change.currentValue);
+}
+function isBuiltInAccessor(valueAccessor) {
+  return Object.getPrototypeOf(valueAccessor.constructor) === BuiltInControlValueAccessor;
+}
+function syncPendingControls(form, directives) {
+  form._syncPendingControls();
+  directives.forEach((dir) => {
+    const control = dir.control;
+    if (control.updateOn === "submit" && control._pendingChange) {
+      dir.viewToModelUpdate(control._pendingValue);
+      control._pendingChange = false;
+    }
+  });
+}
+function selectValueAccessor(dir, valueAccessors) {
+  if (!valueAccessors) return null;
+  if (!Array.isArray(valueAccessors) && (typeof ngDevMode === "undefined" || ngDevMode)) _throwInvalidValueAccessorError(dir);
+  let defaultAccessor = void 0;
+  let builtinAccessor = void 0;
+  let customAccessor = void 0;
+  valueAccessors.forEach((v) => {
+    if (v.constructor === DefaultValueAccessor) {
+      defaultAccessor = v;
+    } else if (isBuiltInAccessor(v)) {
+      if (builtinAccessor && (typeof ngDevMode === "undefined" || ngDevMode)) _throwError(dir, "More than one built-in value accessor matches form control with");
+      builtinAccessor = v;
+    } else {
+      if (customAccessor && (typeof ngDevMode === "undefined" || ngDevMode)) _throwError(dir, "More than one custom value accessor matches form control with");
+      customAccessor = v;
+    }
+  });
+  if (customAccessor) return customAccessor;
+  if (builtinAccessor) return builtinAccessor;
+  if (defaultAccessor) return defaultAccessor;
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    _throwError(dir, "No valid value accessor for form control with");
+  }
+  return null;
+}
+function removeListItem$1(list, el) {
+  const index = list.indexOf(el);
+  if (index > -1) list.splice(index, 1);
+}
+function _ngModelWarning(name, type, instance, warningConfig) {
+  if (warningConfig === "never") return;
+  if ((warningConfig === null || warningConfig === "once") && !type._ngModelWarningSentOnce || warningConfig === "always" && !instance._ngModelWarningSent) {
+    console.warn(ngModelWarning(name));
+    type._ngModelWarningSentOnce = true;
+    instance._ngModelWarningSent = true;
+  }
+}
+var formDirectiveProvider$1 = {
+  provide: ControlContainer,
+  useExisting: forwardRef(() => NgForm)
+};
+var resolvedPromise$1 = (() => Promise.resolve())();
+var NgForm = class _NgForm extends ControlContainer {
+  callSetDisabledState;
+  /**
+   * @description
+   * Returns whether the form submission has been triggered.
+   */
+  get submitted() {
+    return untracked(this.submittedReactive);
+  }
+  /** @internal */
+  _submitted = computed(() => this.submittedReactive());
+  submittedReactive = signal(false);
+  _directives = /* @__PURE__ */ new Set();
+  /**
+   * @description
+   * The `FormGroup` instance created for this form.
+   */
+  form;
+  /**
+   * @description
+   * Event emitter for the "ngSubmit" event
+   */
+  ngSubmit = new EventEmitter();
+  /**
+   * @description
+   * Tracks options for the `NgForm` instance.
+   *
+   * **updateOn**: Sets the default `updateOn` value for all child `NgModels` below it
+   * unless explicitly set by a child `NgModel` using `ngModelOptions`). Defaults to 'change'.
+   * Possible values: `'change'` | `'blur'` | `'submit'`.
+   *
+   */
+  options;
+  constructor(validators, asyncValidators, callSetDisabledState) {
+    super();
+    this.callSetDisabledState = callSetDisabledState;
+    this.form = new FormGroup({}, composeValidators(validators), composeAsyncValidators(asyncValidators));
+  }
+  /** @docs-private */
+  ngAfterViewInit() {
+    this._setUpdateStrategy();
+  }
+  /**
+   * @description
+   * The directive instance.
+   */
+  get formDirective() {
+    return this;
+  }
+  /**
+   * @description
+   * The internal `FormGroup` instance.
+   */
+  get control() {
+    return this.form;
+  }
+  /**
+   * @description
+   * Returns an array representing the path to this group. Because this directive
+   * always lives at the top level of a form, it is always an empty array.
+   */
+  get path() {
+    return [];
+  }
+  /**
+   * @description
+   * Returns a map of the controls in this group.
+   */
+  get controls() {
+    return this.form.controls;
+  }
+  /**
+   * @description
+   * Method that sets up the control directive in this group, re-calculates its value
+   * and validity, and adds the instance to the internal list of directives.
+   *
+   * @param dir The `NgModel` directive instance.
+   */
+  addControl(dir) {
+    resolvedPromise$1.then(() => {
+      const container = this._findContainer(dir.path);
+      dir.control = container.registerControl(dir.name, dir.control);
+      setUpControl(dir.control, dir, this.callSetDisabledState);
+      dir.control.updateValueAndValidity({
+        emitEvent: false
+      });
+      this._directives.add(dir);
+    });
+  }
+  /**
+   * @description
+   * Retrieves the `FormControl` instance from the provided `NgModel` directive.
+   *
+   * @param dir The `NgModel` directive instance.
+   */
+  getControl(dir) {
+    return this.form.get(dir.path);
+  }
+  /**
+   * @description
+   * Removes the `NgModel` instance from the internal list of directives
+   *
+   * @param dir The `NgModel` directive instance.
+   */
+  removeControl(dir) {
+    resolvedPromise$1.then(() => {
+      const container = this._findContainer(dir.path);
+      if (container) {
+        container.removeControl(dir.name);
+      }
+      this._directives.delete(dir);
+    });
+  }
+  /**
+   * @description
+   * Adds a new `NgModelGroup` directive instance to the form.
+   *
+   * @param dir The `NgModelGroup` directive instance.
+   */
+  addFormGroup(dir) {
+    resolvedPromise$1.then(() => {
+      const container = this._findContainer(dir.path);
+      const group = new FormGroup({});
+      setUpFormContainer(group, dir);
+      container.registerControl(dir.name, group);
+      group.updateValueAndValidity({
+        emitEvent: false
+      });
+    });
+  }
+  /**
+   * @description
+   * Removes the `NgModelGroup` directive instance from the form.
+   *
+   * @param dir The `NgModelGroup` directive instance.
+   */
+  removeFormGroup(dir) {
+    resolvedPromise$1.then(() => {
+      const container = this._findContainer(dir.path);
+      if (container) {
+        container.removeControl(dir.name);
+      }
+    });
+  }
+  /**
+   * @description
+   * Retrieves the `FormGroup` for a provided `NgModelGroup` directive instance
+   *
+   * @param dir The `NgModelGroup` directive instance.
+   */
+  getFormGroup(dir) {
+    return this.form.get(dir.path);
+  }
+  /**
+   * Sets the new value for the provided `NgControl` directive.
+   *
+   * @param dir The `NgControl` directive instance.
+   * @param value The new value for the directive's control.
+   */
+  updateModel(dir, value) {
+    resolvedPromise$1.then(() => {
+      const ctrl = this.form.get(dir.path);
+      ctrl.setValue(value);
+    });
+  }
+  /**
+   * @description
+   * Sets the value for this `FormGroup`.
+   *
+   * @param value The new value
+   */
+  setValue(value) {
+    this.control.setValue(value);
+  }
+  /**
+   * @description
+   * Method called when the "submit" event is triggered on the form.
+   * Triggers the `ngSubmit` emitter to emit the "submit" event as its payload.
+   *
+   * @param $event The "submit" event object
+   */
+  onSubmit($event) {
+    this.submittedReactive.set(true);
+    syncPendingControls(this.form, this._directives);
+    this.ngSubmit.emit($event);
+    this.form._events.next(new FormSubmittedEvent(this.control));
+    return $event?.target?.method === "dialog";
+  }
+  /**
+   * @description
+   * Method called when the "reset" event is triggered on the form.
+   */
+  onReset() {
+    this.resetForm();
+  }
+  /**
+   * @description
+   * Resets the form to an initial value and resets its submitted status.
+   *
+   * @param value The new value for the form.
+   */
+  resetForm(value = void 0) {
+    this.form.reset(value);
+    this.submittedReactive.set(false);
+    this.form._events.next(new FormResetEvent(this.form));
+  }
+  _setUpdateStrategy() {
+    if (this.options && this.options.updateOn != null) {
+      this.form._updateOn = this.options.updateOn;
+    }
+  }
+  _findContainer(path) {
+    path.pop();
+    return path.length ? this.form.get(path) : this.form;
+  }
+  static ɵfac = function NgForm_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgForm)(ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgForm,
+    selectors: [["form", 3, "ngNoForm", "", 3, "formGroup", ""], ["ng-form"], ["", "ngForm", ""]],
+    hostBindings: function NgForm_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("submit", function NgForm_submit_HostBindingHandler($event) {
+          return ctx.onSubmit($event);
+        })("reset", function NgForm_reset_HostBindingHandler() {
+          return ctx.onReset();
+        });
+      }
+    },
+    inputs: {
+      options: [0, "ngFormOptions", "options"]
+    },
+    outputs: {
+      ngSubmit: "ngSubmit"
+    },
+    exportAs: ["ngForm"],
+    standalone: false,
+    features: [ɵɵProvidersFeature([formDirectiveProvider$1]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgForm, [{
+    type: Directive,
+    args: [{
+      selector: "form:not([ngNoForm]):not([formGroup]),ng-form,[ngForm]",
+      providers: [formDirectiveProvider$1],
+      host: {
+        "(submit)": "onSubmit($event)",
+        "(reset)": "onReset()"
+      },
+      outputs: ["ngSubmit"],
+      exportAs: "ngForm",
+      standalone: false
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [CALL_SET_DISABLED_STATE]
+    }]
+  }], {
+    options: [{
+      type: Input,
+      args: ["ngFormOptions"]
+    }]
+  });
+})();
+function removeListItem(list, el) {
+  const index = list.indexOf(el);
+  if (index > -1) list.splice(index, 1);
+}
+function isFormControlState(formState) {
+  return typeof formState === "object" && formState !== null && Object.keys(formState).length === 2 && "value" in formState && "disabled" in formState;
+}
+var FormControl = class FormControl2 extends AbstractControl {
+  /** @publicApi */
+  defaultValue = null;
+  /** @internal */
+  _onChange = [];
+  /** @internal */
+  _pendingValue;
+  /** @internal */
+  _pendingChange = false;
+  constructor(formState = null, validatorOrOpts, asyncValidator) {
+    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));
+    this._applyFormState(formState);
+    this._setUpdateStrategy(validatorOrOpts);
+    this._initObservables();
+    this.updateValueAndValidity({
+      onlySelf: true,
+      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to
+      // `VALID` or `INVALID`.
+      // The status should be broadcasted via the `statusChanges` observable, so we set
+      // `emitEvent` to `true` to allow that during the control creation process.
+      emitEvent: !!this.asyncValidator
+    });
+    if (isOptionsObj(validatorOrOpts) && (validatorOrOpts.nonNullable || validatorOrOpts.initialValueIsDefault)) {
+      if (isFormControlState(formState)) {
+        this.defaultValue = formState.value;
+      } else {
+        this.defaultValue = formState;
+      }
+    }
+  }
+  setValue(value, options = {}) {
+    this.value = this._pendingValue = value;
+    if (this._onChange.length && options.emitModelToViewChange !== false) {
+      this._onChange.forEach((changeFn) => changeFn(this.value, options.emitViewToModelChange !== false));
+    }
+    this.updateValueAndValidity(options);
+  }
+  patchValue(value, options = {}) {
+    this.setValue(value, options);
+  }
+  reset(formState = this.defaultValue, options = {}) {
+    this._applyFormState(formState);
+    this.markAsPristine(options);
+    this.markAsUntouched(options);
+    this.setValue(this.value, options);
+    this._pendingChange = false;
+  }
+  /**  @internal */
+  _updateValue() {
+  }
+  /**  @internal */
+  _anyControls(condition) {
+    return false;
+  }
+  /**  @internal */
+  _allControlsDisabled() {
+    return this.disabled;
+  }
+  registerOnChange(fn) {
+    this._onChange.push(fn);
+  }
+  /** @internal */
+  _unregisterOnChange(fn) {
+    removeListItem(this._onChange, fn);
+  }
+  registerOnDisabledChange(fn) {
+    this._onDisabledChange.push(fn);
+  }
+  /** @internal */
+  _unregisterOnDisabledChange(fn) {
+    removeListItem(this._onDisabledChange, fn);
+  }
+  /** @internal */
+  _forEachChild(cb) {
+  }
+  /** @internal */
+  _syncPendingControls() {
+    if (this.updateOn === "submit") {
+      if (this._pendingDirty) this.markAsDirty();
+      if (this._pendingTouched) this.markAsTouched();
+      if (this._pendingChange) {
+        this.setValue(this._pendingValue, {
+          onlySelf: true,
+          emitModelToViewChange: false
+        });
+        return true;
+      }
+    }
+    return false;
+  }
+  _applyFormState(formState) {
+    if (isFormControlState(formState)) {
+      this.value = this._pendingValue = formState.value;
+      formState.disabled ? this.disable({
+        onlySelf: true,
+        emitEvent: false
+      }) : this.enable({
+        onlySelf: true,
+        emitEvent: false
+      });
+    } else {
+      this.value = this._pendingValue = formState;
+    }
+  }
+};
+var UntypedFormControl = FormControl;
+var isFormControl = (control) => control instanceof FormControl;
+var AbstractFormGroupDirective = class _AbstractFormGroupDirective extends ControlContainer {
+  /**
+   * @description
+   * The parent control for the group
+   *
+   * @internal
+   */
+  _parent;
+  /** @docs-private */
+  ngOnInit() {
+    this._checkParentType();
+    this.formDirective.addFormGroup(this);
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.formDirective) {
+      this.formDirective.removeFormGroup(this);
+    }
+  }
+  /**
+   * @description
+   * The `FormGroup` bound to this directive.
+   */
+  get control() {
+    return this.formDirective.getFormGroup(this);
+  }
+  /**
+   * @description
+   * The path to this group from the top-level directive.
+   */
+  get path() {
+    return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);
+  }
+  /**
+   * @description
+   * The top-level directive for this group if present, otherwise null.
+   */
+  get formDirective() {
+    return this._parent ? this._parent.formDirective : null;
+  }
+  /** @internal */
+  _checkParentType() {
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵAbstractFormGroupDirective_BaseFactory;
+    return function AbstractFormGroupDirective_Factory(__ngFactoryType__) {
+      return (ɵAbstractFormGroupDirective_BaseFactory || (ɵAbstractFormGroupDirective_BaseFactory = ɵɵgetInheritedFactory(_AbstractFormGroupDirective)))(__ngFactoryType__ || _AbstractFormGroupDirective);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _AbstractFormGroupDirective,
+    standalone: false,
+    features: [ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(AbstractFormGroupDirective, [{
+    type: Directive,
+    args: [{
+      standalone: false
+    }]
+  }], null, null);
+})();
+function modelParentException() {
+  return new RuntimeError(1350, `
+    ngModel cannot be used to register form controls with a parent formGroup directive.  Try using
+    formGroup's partner directive "formControlName" instead.  Example:
+
+    ${formControlNameExample}
+
+    Or, if you'd like to avoid registering this form control, indicate that it's standalone in ngModelOptions:
+
+    Example:
+
+    ${ngModelWithFormGroupExample}`);
+}
+function formGroupNameException() {
+  return new RuntimeError(1351, `
+    ngModel cannot be used to register form controls with a parent formGroupName or formArrayName directive.
+
+    Option 1: Use formControlName instead of ngModel (reactive strategy):
+
+    ${formGroupNameExample}
+
+    Option 2:  Update ngModel's parent be ngModelGroup (template-driven strategy):
+
+    ${ngModelGroupExample}`);
+}
+function missingNameException() {
+  return new RuntimeError(1352, `If ngModel is used within a form tag, either the name attribute must be set or the form
+    control must be defined as 'standalone' in ngModelOptions.
+
+    Example 1: <input [(ngModel)]="person.firstName" name="first">
+    Example 2: <input [(ngModel)]="person.firstName" [ngModelOptions]="{standalone: true}">`);
+}
+function modelGroupParentException() {
+  return new RuntimeError(1353, `
+    ngModelGroup cannot be used with a parent formGroup directive.
+
+    Option 1: Use formGroupName instead of ngModelGroup (reactive strategy):
+
+    ${formGroupNameExample}
+
+    Option 2:  Use a regular form tag instead of the formGroup directive (template-driven strategy):
+
+    ${ngModelGroupExample}`);
+}
+var modelGroupProvider = {
+  provide: ControlContainer,
+  useExisting: forwardRef(() => NgModelGroup)
+};
+var NgModelGroup = class _NgModelGroup extends AbstractFormGroupDirective {
+  /**
+   * @description
+   * Tracks the name of the `NgModelGroup` bound to the directive. The name corresponds
+   * to a key in the parent `NgForm`.
+   */
+  name = "";
+  constructor(parent, validators, asyncValidators) {
+    super();
+    this._parent = parent;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+  }
+  /** @internal */
+  _checkParentType() {
+    if (!(this._parent instanceof _NgModelGroup) && !(this._parent instanceof NgForm) && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw modelGroupParentException();
+    }
+  }
+  static ɵfac = function NgModelGroup_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgModelGroup)(ɵɵdirectiveInject(ControlContainer, 5), ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgModelGroup,
+    selectors: [["", "ngModelGroup", ""]],
+    inputs: {
+      name: [0, "ngModelGroup", "name"]
+    },
+    exportAs: ["ngModelGroup"],
+    standalone: false,
+    features: [ɵɵProvidersFeature([modelGroupProvider]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgModelGroup, [{
+    type: Directive,
+    args: [{
+      selector: "[ngModelGroup]",
+      providers: [modelGroupProvider],
+      exportAs: "ngModelGroup",
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Host
+    }, {
+      type: SkipSelf
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }], {
+    name: [{
+      type: Input,
+      args: ["ngModelGroup"]
+    }]
+  });
+})();
+var formControlBinding$1 = {
+  provide: NgControl,
+  useExisting: forwardRef(() => NgModel)
+};
+var resolvedPromise = (() => Promise.resolve())();
+var NgModel = class _NgModel extends NgControl {
+  _changeDetectorRef;
+  callSetDisabledState;
+  control = new FormControl();
+  // At runtime we coerce arbitrary values assigned to the "disabled" input to a "boolean".
+  // This is not reflected in the type of the property because outside of templates, consumers
+  // should only deal with booleans. In templates, a string is allowed for convenience and to
+  // match the native "disabled attribute" semantics which can be observed on input elements.
+  // This static member tells the compiler that values of type "string" can also be assigned
+  // to the input in a template.
+  /** @docs-private */
+  static ngAcceptInputType_isDisabled;
+  /** @internal */
+  _registered = false;
+  /**
+   * Internal reference to the view model value.
+   * @docs-private
+   */
+  viewModel;
+  /**
+   * @description
+   * Tracks the name bound to the directive. If a parent form exists, it
+   * uses this name as a key to retrieve this control's value.
+   */
+  name = "";
+  /**
+   * @description
+   * Tracks whether the control is disabled.
+   */
+  isDisabled;
+  /**
+   * @description
+   * Tracks the value bound to this directive.
+   */
+  model;
+  /**
+   * @description
+   * Tracks the configuration options for this `ngModel` instance.
+   *
+   * **name**: An alternative to setting the name attribute on the form control element. See
+   * the [example](api/forms/NgModel#using-ngmodel-on-a-standalone-control) for using `NgModel`
+   * as a standalone control.
+   *
+   * **standalone**: When set to true, the `ngModel` will not register itself with its parent form,
+   * and acts as if it's not in the form. Defaults to false. If no parent form exists, this option
+   * has no effect.
+   *
+   * **updateOn**: Defines the event upon which the form control value and validity update.
+   * Defaults to 'change'. Possible values: `'change'` | `'blur'` | `'submit'`.
+   *
+   */
+  options;
+  /**
+   * @description
+   * Event emitter for producing the `ngModelChange` event after
+   * the view model updates.
+   */
+  update = new EventEmitter();
+  constructor(parent, validators, asyncValidators, valueAccessors, _changeDetectorRef, callSetDisabledState) {
+    super();
+    this._changeDetectorRef = _changeDetectorRef;
+    this.callSetDisabledState = callSetDisabledState;
+    this._parent = parent;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+    this.valueAccessor = selectValueAccessor(this, valueAccessors);
+  }
+  /** @docs-private */
+  ngOnChanges(changes) {
+    this._checkForErrors();
+    if (!this._registered || "name" in changes) {
+      if (this._registered) {
+        this._checkName();
+        if (this.formDirective) {
+          const oldName = changes["name"].previousValue;
+          this.formDirective.removeControl({
+            name: oldName,
+            path: this._getPath(oldName)
+          });
+        }
+      }
+      this._setUpControl();
+    }
+    if ("isDisabled" in changes) {
+      this._updateDisabled(changes);
+    }
+    if (isPropertyUpdated(changes, this.viewModel)) {
+      this._updateValue(this.model);
+      this.viewModel = this.model;
+    }
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this.formDirective && this.formDirective.removeControl(this);
+  }
+  /**
+   * @description
+   * Returns an array that represents the path from the top-level form to this control.
+   * Each index is the string name of the control on that level.
+   */
+  get path() {
+    return this._getPath(this.name);
+  }
+  /**
+   * @description
+   * The top-level directive for this control if present, otherwise null.
+   */
+  get formDirective() {
+    return this._parent ? this._parent.formDirective : null;
+  }
+  /**
+   * @description
+   * Sets the new value for the view model and emits an `ngModelChange` event.
+   *
+   * @param newValue The new value emitted by `ngModelChange`.
+   */
+  viewToModelUpdate(newValue) {
+    this.viewModel = newValue;
+    this.update.emit(newValue);
+  }
+  _setUpControl() {
+    this._setUpdateStrategy();
+    this._isStandalone() ? this._setUpStandalone() : this.formDirective.addControl(this);
+    this._registered = true;
+  }
+  _setUpdateStrategy() {
+    if (this.options && this.options.updateOn != null) {
+      this.control._updateOn = this.options.updateOn;
+    }
+  }
+  _isStandalone() {
+    return !this._parent || !!(this.options && this.options.standalone);
+  }
+  _setUpStandalone() {
+    setUpControl(this.control, this, this.callSetDisabledState);
+    this.control.updateValueAndValidity({
+      emitEvent: false
+    });
+  }
+  _checkForErrors() {
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && !this._isStandalone()) {
+      checkParentType$1(this._parent);
+    }
+    this._checkName();
+  }
+  _checkName() {
+    if (this.options && this.options.name) this.name = this.options.name;
+    if (!this._isStandalone() && !this.name && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw missingNameException();
+    }
+  }
+  _updateValue(value) {
+    resolvedPromise.then(() => {
+      this.control.setValue(value, {
+        emitViewToModelChange: false
+      });
+      this._changeDetectorRef?.markForCheck();
+    });
+  }
+  _updateDisabled(changes) {
+    const disabledValue = changes["isDisabled"].currentValue;
+    const isDisabled = disabledValue !== 0 && booleanAttribute(disabledValue);
+    resolvedPromise.then(() => {
+      if (isDisabled && !this.control.disabled) {
+        this.control.disable();
+      } else if (!isDisabled && this.control.disabled) {
+        this.control.enable();
+      }
+      this._changeDetectorRef?.markForCheck();
+    });
+  }
+  _getPath(controlName) {
+    return this._parent ? controlPath(controlName, this._parent) : [controlName];
+  }
+  static ɵfac = function NgModel_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgModel)(ɵɵdirectiveInject(ControlContainer, 9), ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), ɵɵdirectiveInject(ChangeDetectorRef, 8), ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgModel,
+    selectors: [["", "ngModel", "", 3, "formControlName", "", 3, "formControl", ""]],
+    inputs: {
+      name: "name",
+      isDisabled: [0, "disabled", "isDisabled"],
+      model: [0, "ngModel", "model"],
+      options: [0, "ngModelOptions", "options"]
+    },
+    outputs: {
+      update: "ngModelChange"
+    },
+    exportAs: ["ngModel"],
+    standalone: false,
+    features: [ɵɵProvidersFeature([formControlBinding$1]), ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgModel, [{
+    type: Directive,
+    args: [{
+      selector: "[ngModel]:not([formControlName]):not([formControl])",
+      providers: [formControlBinding$1],
+      exportAs: "ngModel",
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALUE_ACCESSOR]
+    }]
+  }, {
+    type: ChangeDetectorRef,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [ChangeDetectorRef]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [CALL_SET_DISABLED_STATE]
+    }]
+  }], {
+    name: [{
+      type: Input
+    }],
+    isDisabled: [{
+      type: Input,
+      args: ["disabled"]
+    }],
+    model: [{
+      type: Input,
+      args: ["ngModel"]
+    }],
+    options: [{
+      type: Input,
+      args: ["ngModelOptions"]
+    }],
+    update: [{
+      type: Output,
+      args: ["ngModelChange"]
+    }]
+  });
+})();
+function checkParentType$1(parent) {
+  if (!(parent instanceof NgModelGroup) && parent instanceof AbstractFormGroupDirective) {
+    throw formGroupNameException();
+  } else if (!(parent instanceof NgModelGroup) && !(parent instanceof NgForm)) {
+    throw modelParentException();
+  }
+}
+var ɵNgNoValidate = class _ɵNgNoValidate {
+  static ɵfac = function ɵNgNoValidate_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ɵNgNoValidate)();
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _ɵNgNoValidate,
+    selectors: [["form", 3, "ngNoForm", "", 3, "ngNativeValidate", ""]],
+    hostAttrs: ["novalidate", ""],
+    standalone: false
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ɵNgNoValidate, [{
+    type: Directive,
+    args: [{
+      selector: "form:not([ngNoForm]):not([ngNativeValidate])",
+      host: {
+        "novalidate": ""
+      },
+      standalone: false
+    }]
+  }], null, null);
+})();
+var NUMBER_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => NumberValueAccessor),
+  multi: true
+};
+var NumberValueAccessor = class _NumberValueAccessor extends BuiltInControlValueAccessor {
+  /**
+   * Sets the "value" property on the input element.
+   * @docs-private
+   */
+  writeValue(value) {
+    const normalizedValue = value == null ? "" : value;
+    this.setProperty("value", normalizedValue);
+  }
+  /**
+   * Registers a function called when the control value changes.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this.onChange = (value) => {
+      fn(value == "" ? null : parseFloat(value));
+    };
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵNumberValueAccessor_BaseFactory;
+    return function NumberValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵNumberValueAccessor_BaseFactory || (ɵNumberValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_NumberValueAccessor)))(__ngFactoryType__ || _NumberValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _NumberValueAccessor,
+    selectors: [["input", "type", "number", "formControlName", ""], ["input", "type", "number", "formControl", ""], ["input", "type", "number", "ngModel", ""]],
+    hostBindings: function NumberValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("input", function NumberValueAccessor_input_HostBindingHandler($event) {
+          return ctx.onChange($event.target.value);
+        })("blur", function NumberValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([NUMBER_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NumberValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]",
+      host: {
+        "(input)": "onChange($any($event.target).value)",
+        "(blur)": "onTouched()"
+      },
+      providers: [NUMBER_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], null, null);
+})();
+var RADIO_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => RadioControlValueAccessor),
+  multi: true
+};
+function throwNameError() {
+  throw new RuntimeError(1202, `
+      If you define both a name and a formControlName attribute on your radio button, their values
+      must match. Ex: <input type="radio" formControlName="food" name="food">
+    `);
+}
+var RadioControlRegistry = class _RadioControlRegistry {
+  _accessors = [];
+  /**
+   * @description
+   * Adds a control to the internal registry. For internal use only.
+   */
+  add(control, accessor) {
+    this._accessors.push([control, accessor]);
+  }
+  /**
+   * @description
+   * Removes a control from the internal registry. For internal use only.
+   */
+  remove(accessor) {
+    for (let i = this._accessors.length - 1; i >= 0; --i) {
+      if (this._accessors[i][1] === accessor) {
+        this._accessors.splice(i, 1);
+        return;
+      }
+    }
+  }
+  /**
+   * @description
+   * Selects a radio button. For internal use only.
+   */
+  select(accessor) {
+    this._accessors.forEach((c) => {
+      if (this._isSameGroup(c, accessor) && c[1] !== accessor) {
+        c[1].fireUncheck(accessor.value);
+      }
+    });
+  }
+  _isSameGroup(controlPair, accessor) {
+    if (!controlPair[0].control) return false;
+    return controlPair[0]._parent === accessor._control._parent && controlPair[1].name === accessor.name;
+  }
+  static ɵfac = function RadioControlRegistry_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RadioControlRegistry)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RadioControlRegistry,
+    factory: _RadioControlRegistry.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RadioControlRegistry, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var RadioControlValueAccessor = class _RadioControlValueAccessor extends BuiltInControlValueAccessor {
+  _registry;
+  _injector;
+  /** @internal */
+  _state;
+  /** @internal */
+  _control;
+  /** @internal */
+  _fn;
+  setDisabledStateFired = false;
+  /**
+   * The registered callback function called when a change event occurs on the input element.
+   * Note: we declare `onChange` here (also used as host listener) as a function with no arguments
+   * to override the `onChange` function (which expects 1 argument) in the parent
+   * `BaseControlValueAccessor` class.
+   * @docs-private
+   */
+  onChange = () => {
+  };
+  /**
+   * @description
+   * Tracks the name of the radio input element.
+   */
+  name;
+  /**
+   * @description
+   * Tracks the name of the `FormControl` bound to the directive. The name corresponds
+   * to a key in the parent `FormGroup` or `FormArray`.
+   */
+  formControlName;
+  /**
+   * @description
+   * Tracks the value of the radio input element
+   */
+  value;
+  callSetDisabledState = inject(CALL_SET_DISABLED_STATE, {
+    optional: true
+  }) ?? setDisabledStateDefault;
+  constructor(renderer, elementRef, _registry, _injector) {
+    super(renderer, elementRef);
+    this._registry = _registry;
+    this._injector = _injector;
+  }
+  /** @docs-private */
+  ngOnInit() {
+    this._control = this._injector.get(NgControl);
+    this._checkName();
+    this._registry.add(this._control, this);
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this._registry.remove(this);
+  }
+  /**
+   * Sets the "checked" property value on the radio input element.
+   * @docs-private
+   */
+  writeValue(value) {
+    this._state = value === this.value;
+    this.setProperty("checked", this._state);
+  }
+  /**
+   * Registers a function called when the control value changes.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this._fn = fn;
+    this.onChange = () => {
+      fn(this.value);
+      this._registry.select(this);
+    };
+  }
+  /** @docs-private */
+  setDisabledState(isDisabled) {
+    if (this.setDisabledStateFired || isDisabled || this.callSetDisabledState === "whenDisabledForLegacyCode") {
+      this.setProperty("disabled", isDisabled);
+    }
+    this.setDisabledStateFired = true;
+  }
+  /**
+   * Sets the "value" on the radio input element and unchecks it.
+   *
+   * @param value
+   */
+  fireUncheck(value) {
+    this.writeValue(value);
+  }
+  _checkName() {
+    if (this.name && this.formControlName && this.name !== this.formControlName && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throwNameError();
+    }
+    if (!this.name && this.formControlName) this.name = this.formControlName;
+  }
+  static ɵfac = function RadioControlValueAccessor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RadioControlValueAccessor)(ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(RadioControlRegistry), ɵɵdirectiveInject(Injector));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _RadioControlValueAccessor,
+    selectors: [["input", "type", "radio", "formControlName", ""], ["input", "type", "radio", "formControl", ""], ["input", "type", "radio", "ngModel", ""]],
+    hostBindings: function RadioControlValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("change", function RadioControlValueAccessor_change_HostBindingHandler() {
+          return ctx.onChange();
+        })("blur", function RadioControlValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    inputs: {
+      name: "name",
+      formControlName: "formControlName",
+      value: "value"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([RADIO_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RadioControlValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=radio][formControlName],input[type=radio][formControl],input[type=radio][ngModel]",
+      host: {
+        "(change)": "onChange()",
+        "(blur)": "onTouched()"
+      },
+      providers: [RADIO_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], () => [{
+    type: Renderer2
+  }, {
+    type: ElementRef
+  }, {
+    type: RadioControlRegistry
+  }, {
+    type: Injector
+  }], {
+    name: [{
+      type: Input
+    }],
+    formControlName: [{
+      type: Input
+    }],
+    value: [{
+      type: Input
+    }]
+  });
+})();
+var RANGE_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => RangeValueAccessor),
+  multi: true
+};
+var RangeValueAccessor = class _RangeValueAccessor extends BuiltInControlValueAccessor {
+  /**
+   * Sets the "value" property on the input element.
+   * @docs-private
+   */
+  writeValue(value) {
+    this.setProperty("value", parseFloat(value));
+  }
+  /**
+   * Registers a function called when the control value changes.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this.onChange = (value) => {
+      fn(value == "" ? null : parseFloat(value));
+    };
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵRangeValueAccessor_BaseFactory;
+    return function RangeValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵRangeValueAccessor_BaseFactory || (ɵRangeValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_RangeValueAccessor)))(__ngFactoryType__ || _RangeValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _RangeValueAccessor,
+    selectors: [["input", "type", "range", "formControlName", ""], ["input", "type", "range", "formControl", ""], ["input", "type", "range", "ngModel", ""]],
+    hostBindings: function RangeValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("change", function RangeValueAccessor_change_HostBindingHandler($event) {
+          return ctx.onChange($event.target.value);
+        })("input", function RangeValueAccessor_input_HostBindingHandler($event) {
+          return ctx.onChange($event.target.value);
+        })("blur", function RangeValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([RANGE_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RangeValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=range][formControlName],input[type=range][formControl],input[type=range][ngModel]",
+      host: {
+        "(change)": "onChange($any($event.target).value)",
+        "(input)": "onChange($any($event.target).value)",
+        "(blur)": "onTouched()"
+      },
+      providers: [RANGE_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], null, null);
+})();
+var NG_MODEL_WITH_FORM_CONTROL_WARNING = new InjectionToken(ngDevMode ? "NgModelWithFormControlWarning" : "");
+var formControlBinding = {
+  provide: NgControl,
+  useExisting: forwardRef(() => FormControlDirective)
+};
+var FormControlDirective = class _FormControlDirective extends NgControl {
+  _ngModelWarningConfig;
+  callSetDisabledState;
+  /**
+   * Internal reference to the view model value.
+   * @docs-private
+   */
+  viewModel;
+  /**
+   * @description
+   * Tracks the `FormControl` instance bound to the directive.
+   */
+  form;
+  /**
+   * @description
+   * Triggers a warning in dev mode that this input should not be used with reactive forms.
+   */
+  set isDisabled(isDisabled) {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      console.warn(disabledAttrWarning);
+    }
+  }
+  // TODO(kara): remove next 4 properties once deprecation period is over
+  /** @deprecated as of v6 */
+  model;
+  /** @deprecated as of v6 */
+  update = new EventEmitter();
+  /**
+   * @description
+   * Static property used to track whether any ngModel warnings have been sent across
+   * all instances of FormControlDirective. Used to support warning config of "once".
+   *
+   * @internal
+   */
+  static _ngModelWarningSentOnce = false;
+  /**
+   * @description
+   * Instance property used to track whether an ngModel warning has been sent out for this
+   * particular `FormControlDirective` instance. Used to support warning config of "always".
+   *
+   * @internal
+   */
+  _ngModelWarningSent = false;
+  constructor(validators, asyncValidators, valueAccessors, _ngModelWarningConfig, callSetDisabledState) {
+    super();
+    this._ngModelWarningConfig = _ngModelWarningConfig;
+    this.callSetDisabledState = callSetDisabledState;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+    this.valueAccessor = selectValueAccessor(this, valueAccessors);
+  }
+  /** @docs-private */
+  ngOnChanges(changes) {
+    if (this._isControlChanged(changes)) {
+      const previousForm = changes["form"].previousValue;
+      if (previousForm) {
+        cleanUpControl(
+          previousForm,
+          this,
+          /* validateControlPresenceOnChange */
+          false
+        );
+      }
+      setUpControl(this.form, this, this.callSetDisabledState);
+      this.form.updateValueAndValidity({
+        emitEvent: false
+      });
+    }
+    if (isPropertyUpdated(changes, this.viewModel)) {
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        _ngModelWarning("formControl", _FormControlDirective, this, this._ngModelWarningConfig);
+      }
+      this.form.setValue(this.model);
+      this.viewModel = this.model;
+    }
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.form) {
+      cleanUpControl(
+        this.form,
+        this,
+        /* validateControlPresenceOnChange */
+        false
+      );
+    }
+  }
+  /**
+   * @description
+   * Returns an array that represents the path from the top-level form to this control.
+   * Each index is the string name of the control on that level.
+   */
+  get path() {
+    return [];
+  }
+  /**
+   * @description
+   * The `FormControl` bound to this directive.
+   */
+  get control() {
+    return this.form;
+  }
+  /**
+   * @description
+   * Sets the new value for the view model and emits an `ngModelChange` event.
+   *
+   * @param newValue The new value for the view model.
+   */
+  viewToModelUpdate(newValue) {
+    this.viewModel = newValue;
+    this.update.emit(newValue);
+  }
+  _isControlChanged(changes) {
+    return changes.hasOwnProperty("form");
+  }
+  static ɵfac = function FormControlDirective_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormControlDirective)(ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), ɵɵdirectiveInject(NG_MODEL_WITH_FORM_CONTROL_WARNING, 8), ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FormControlDirective,
+    selectors: [["", "formControl", ""]],
+    inputs: {
+      form: [0, "formControl", "form"],
+      isDisabled: [0, "disabled", "isDisabled"],
+      model: [0, "ngModel", "model"]
+    },
+    outputs: {
+      update: "ngModelChange"
+    },
+    exportAs: ["ngForm"],
+    standalone: false,
+    features: [ɵɵProvidersFeature([formControlBinding]), ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormControlDirective, [{
+    type: Directive,
+    args: [{
+      selector: "[formControl]",
+      providers: [formControlBinding],
+      exportAs: "ngForm",
+      standalone: false
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALUE_ACCESSOR]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [NG_MODEL_WITH_FORM_CONTROL_WARNING]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [CALL_SET_DISABLED_STATE]
+    }]
+  }], {
+    form: [{
+      type: Input,
+      args: ["formControl"]
+    }],
+    isDisabled: [{
+      type: Input,
+      args: ["disabled"]
+    }],
+    model: [{
+      type: Input,
+      args: ["ngModel"]
+    }],
+    update: [{
+      type: Output,
+      args: ["ngModelChange"]
+    }]
+  });
+})();
+var formDirectiveProvider = {
+  provide: ControlContainer,
+  useExisting: forwardRef(() => FormGroupDirective)
+};
+var FormGroupDirective = class _FormGroupDirective extends ControlContainer {
+  callSetDisabledState;
+  /**
+   * @description
+   * Reports whether the form submission has been triggered.
+   */
+  get submitted() {
+    return untracked(this._submittedReactive);
+  }
+  // TODO(atscott): Remove once invalid API usage is cleaned up internally
+  set submitted(value) {
+    this._submittedReactive.set(value);
+  }
+  /** @internal */
+  _submitted = computed(() => this._submittedReactive());
+  _submittedReactive = signal(false);
+  /**
+   * Reference to an old form group input value, which is needed to cleanup
+   * old instance in case it was replaced with a new one.
+   */
+  _oldForm;
+  /**
+   * Callback that should be invoked when controls in FormGroup or FormArray collection change
+   * (added or removed). This callback triggers corresponding DOM updates.
+   */
+  _onCollectionChange = () => this._updateDomValue();
+  /**
+   * @description
+   * Tracks the list of added `FormControlName` instances
+   */
+  directives = [];
+  /**
+   * @description
+   * Tracks the `FormGroup` bound to this directive.
+   */
+  form = null;
+  /**
+   * @description
+   * Emits an event when the form submission has been triggered.
+   */
+  ngSubmit = new EventEmitter();
+  constructor(validators, asyncValidators, callSetDisabledState) {
+    super();
+    this.callSetDisabledState = callSetDisabledState;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+  }
+  /** @docs-private */
+  ngOnChanges(changes) {
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && !this.form) {
+      throw missingFormException();
+    }
+    if (changes.hasOwnProperty("form")) {
+      this._updateValidators();
+      this._updateDomValue();
+      this._updateRegistrations();
+      this._oldForm = this.form;
+    }
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.form) {
+      cleanUpValidators(this.form, this);
+      if (this.form._onCollectionChange === this._onCollectionChange) {
+        this.form._registerOnCollectionChange(() => {
+        });
+      }
+    }
+  }
+  /**
+   * @description
+   * Returns this directive's instance.
+   */
+  get formDirective() {
+    return this;
+  }
+  /**
+   * @description
+   * Returns the `FormGroup` bound to this directive.
+   */
+  get control() {
+    return this.form;
+  }
+  /**
+   * @description
+   * Returns an array representing the path to this group. Because this directive
+   * always lives at the top level of a form, it always an empty array.
+   */
+  get path() {
+    return [];
+  }
+  /**
+   * @description
+   * Method that sets up the control directive in this group, re-calculates its value
+   * and validity, and adds the instance to the internal list of directives.
+   *
+   * @param dir The `FormControlName` directive instance.
+   */
+  addControl(dir) {
+    const ctrl = this.form.get(dir.path);
+    setUpControl(ctrl, dir, this.callSetDisabledState);
+    ctrl.updateValueAndValidity({
+      emitEvent: false
+    });
+    this.directives.push(dir);
+    return ctrl;
+  }
+  /**
+   * @description
+   * Retrieves the `FormControl` instance from the provided `FormControlName` directive
+   *
+   * @param dir The `FormControlName` directive instance.
+   */
+  getControl(dir) {
+    return this.form.get(dir.path);
+  }
+  /**
+   * @description
+   * Removes the `FormControlName` instance from the internal list of directives
+   *
+   * @param dir The `FormControlName` directive instance.
+   */
+  removeControl(dir) {
+    cleanUpControl(
+      dir.control || null,
+      dir,
+      /* validateControlPresenceOnChange */
+      false
+    );
+    removeListItem$1(this.directives, dir);
+  }
+  /**
+   * Adds a new `FormGroupName` directive instance to the form.
+   *
+   * @param dir The `FormGroupName` directive instance.
+   */
+  addFormGroup(dir) {
+    this._setUpFormContainer(dir);
+  }
+  /**
+   * Performs the necessary cleanup when a `FormGroupName` directive instance is removed from the
+   * view.
+   *
+   * @param dir The `FormGroupName` directive instance.
+   */
+  removeFormGroup(dir) {
+    this._cleanUpFormContainer(dir);
+  }
+  /**
+   * @description
+   * Retrieves the `FormGroup` for a provided `FormGroupName` directive instance
+   *
+   * @param dir The `FormGroupName` directive instance.
+   */
+  getFormGroup(dir) {
+    return this.form.get(dir.path);
+  }
+  /**
+   * Performs the necessary setup when a `FormArrayName` directive instance is added to the view.
+   *
+   * @param dir The `FormArrayName` directive instance.
+   */
+  addFormArray(dir) {
+    this._setUpFormContainer(dir);
+  }
+  /**
+   * Performs the necessary cleanup when a `FormArrayName` directive instance is removed from the
+   * view.
+   *
+   * @param dir The `FormArrayName` directive instance.
+   */
+  removeFormArray(dir) {
+    this._cleanUpFormContainer(dir);
+  }
+  /**
+   * @description
+   * Retrieves the `FormArray` for a provided `FormArrayName` directive instance.
+   *
+   * @param dir The `FormArrayName` directive instance.
+   */
+  getFormArray(dir) {
+    return this.form.get(dir.path);
+  }
+  /**
+   * Sets the new value for the provided `FormControlName` directive.
+   *
+   * @param dir The `FormControlName` directive instance.
+   * @param value The new value for the directive's control.
+   */
+  updateModel(dir, value) {
+    const ctrl = this.form.get(dir.path);
+    ctrl.setValue(value);
+  }
+  /**
+   * @description
+   * Method called with the "submit" event is triggered on the form.
+   * Triggers the `ngSubmit` emitter to emit the "submit" event as its payload.
+   *
+   * @param $event The "submit" event object
+   */
+  onSubmit($event) {
+    this._submittedReactive.set(true);
+    syncPendingControls(this.form, this.directives);
+    this.ngSubmit.emit($event);
+    this.form._events.next(new FormSubmittedEvent(this.control));
+    return $event?.target?.method === "dialog";
+  }
+  /**
+   * @description
+   * Method called when the "reset" event is triggered on the form.
+   */
+  onReset() {
+    this.resetForm();
+  }
+  /**
+   * @description
+   * Resets the form to an initial value and resets its submitted status.
+   *
+   * @param value The new value for the form, `undefined` by default
+   */
+  resetForm(value = void 0, options = {}) {
+    this.form.reset(value, options);
+    this._submittedReactive.set(false);
+    if (options?.emitEvent !== false) {
+      this.form._events.next(new FormResetEvent(this.form));
+    }
+  }
+  /** @internal */
+  _updateDomValue() {
+    this.directives.forEach((dir) => {
+      const oldCtrl = dir.control;
+      const newCtrl = this.form.get(dir.path);
+      if (oldCtrl !== newCtrl) {
+        cleanUpControl(oldCtrl || null, dir);
+        if (isFormControl(newCtrl)) {
+          setUpControl(newCtrl, dir, this.callSetDisabledState);
+          dir.control = newCtrl;
+        }
+      }
+    });
+    this.form._updateTreeValidity({
+      emitEvent: false
+    });
+  }
+  _setUpFormContainer(dir) {
+    const ctrl = this.form.get(dir.path);
+    setUpFormContainer(ctrl, dir);
+    ctrl.updateValueAndValidity({
+      emitEvent: false
+    });
+  }
+  _cleanUpFormContainer(dir) {
+    if (this.form) {
+      const ctrl = this.form.get(dir.path);
+      if (ctrl) {
+        const isControlUpdated = cleanUpFormContainer(ctrl, dir);
+        if (isControlUpdated) {
+          ctrl.updateValueAndValidity({
+            emitEvent: false
+          });
+        }
+      }
+    }
+  }
+  _updateRegistrations() {
+    this.form._registerOnCollectionChange(this._onCollectionChange);
+    if (this._oldForm) {
+      this._oldForm._registerOnCollectionChange(() => {
+      });
+    }
+  }
+  _updateValidators() {
+    setUpValidators(this.form, this);
+    if (this._oldForm) {
+      cleanUpValidators(this._oldForm, this);
+    }
+  }
+  static ɵfac = function FormGroupDirective_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormGroupDirective)(ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), ɵɵdirectiveInject(CALL_SET_DISABLED_STATE, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FormGroupDirective,
+    selectors: [["", "formGroup", ""]],
+    hostBindings: function FormGroupDirective_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("submit", function FormGroupDirective_submit_HostBindingHandler($event) {
+          return ctx.onSubmit($event);
+        })("reset", function FormGroupDirective_reset_HostBindingHandler() {
+          return ctx.onReset();
+        });
+      }
+    },
+    inputs: {
+      form: [0, "formGroup", "form"]
+    },
+    outputs: {
+      ngSubmit: "ngSubmit"
+    },
+    exportAs: ["ngForm"],
+    standalone: false,
+    features: [ɵɵProvidersFeature([formDirectiveProvider]), ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormGroupDirective, [{
+    type: Directive,
+    args: [{
+      selector: "[formGroup]",
+      providers: [formDirectiveProvider],
+      host: {
+        "(submit)": "onSubmit($event)",
+        "(reset)": "onReset()"
+      },
+      exportAs: "ngForm",
+      standalone: false
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [CALL_SET_DISABLED_STATE]
+    }]
+  }], {
+    form: [{
+      type: Input,
+      args: ["formGroup"]
+    }],
+    ngSubmit: [{
+      type: Output
+    }]
+  });
+})();
+var formGroupNameProvider = {
+  provide: ControlContainer,
+  useExisting: forwardRef(() => FormGroupName)
+};
+var FormGroupName = class _FormGroupName extends AbstractFormGroupDirective {
+  /**
+   * @description
+   * Tracks the name of the `FormGroup` bound to the directive. The name corresponds
+   * to a key in the parent `FormGroup` or `FormArray`.
+   * Accepts a name as a string or a number.
+   * The name in the form of a string is useful for individual forms,
+   * while the numerical form allows for form groups to be bound
+   * to indices when iterating over groups in a `FormArray`.
+   */
+  name = null;
+  constructor(parent, validators, asyncValidators) {
+    super();
+    this._parent = parent;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+  }
+  /** @internal */
+  _checkParentType() {
+    if (hasInvalidParent(this._parent) && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw groupParentException();
+    }
+  }
+  static ɵfac = function FormGroupName_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormGroupName)(ɵɵdirectiveInject(ControlContainer, 13), ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FormGroupName,
+    selectors: [["", "formGroupName", ""]],
+    inputs: {
+      name: [0, "formGroupName", "name"]
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([formGroupNameProvider]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormGroupName, [{
+    type: Directive,
+    args: [{
+      selector: "[formGroupName]",
+      providers: [formGroupNameProvider],
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }, {
+      type: SkipSelf
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }], {
+    name: [{
+      type: Input,
+      args: ["formGroupName"]
+    }]
+  });
+})();
+var formArrayNameProvider = {
+  provide: ControlContainer,
+  useExisting: forwardRef(() => FormArrayName)
+};
+var FormArrayName = class _FormArrayName extends ControlContainer {
+  /** @internal */
+  _parent;
+  /**
+   * @description
+   * Tracks the name of the `FormArray` bound to the directive. The name corresponds
+   * to a key in the parent `FormGroup` or `FormArray`.
+   * Accepts a name as a string or a number.
+   * The name in the form of a string is useful for individual forms,
+   * while the numerical form allows for form arrays to be bound
+   * to indices when iterating over arrays in a `FormArray`.
+   */
+  name = null;
+  constructor(parent, validators, asyncValidators) {
+    super();
+    this._parent = parent;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+  }
+  /**
+   * A lifecycle method called when the directive's inputs are initialized. For internal use only.
+   * @throws If the directive does not have a valid parent.
+   * @docs-private
+   */
+  ngOnInit() {
+    if (hasInvalidParent(this._parent) && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw arrayParentException();
+    }
+    this.formDirective.addFormArray(this);
+  }
+  /**
+   * A lifecycle method called before the directive's instance is destroyed. For internal use only.
+   * @docs-private
+   */
+  ngOnDestroy() {
+    this.formDirective?.removeFormArray(this);
+  }
+  /**
+   * @description
+   * The `FormArray` bound to this directive.
+   */
+  get control() {
+    return this.formDirective.getFormArray(this);
+  }
+  /**
+   * @description
+   * The top-level directive for this group if present, otherwise null.
+   */
+  get formDirective() {
+    return this._parent ? this._parent.formDirective : null;
+  }
+  /**
+   * @description
+   * Returns an array that represents the path from the top-level form to this control.
+   * Each index is the string name of the control on that level.
+   */
+  get path() {
+    return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);
+  }
+  static ɵfac = function FormArrayName_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormArrayName)(ɵɵdirectiveInject(ControlContainer, 13), ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FormArrayName,
+    selectors: [["", "formArrayName", ""]],
+    inputs: {
+      name: [0, "formArrayName", "name"]
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([formArrayNameProvider]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormArrayName, [{
+    type: Directive,
+    args: [{
+      selector: "[formArrayName]",
+      providers: [formArrayNameProvider],
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }, {
+      type: SkipSelf
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }], {
+    name: [{
+      type: Input,
+      args: ["formArrayName"]
+    }]
+  });
+})();
+function hasInvalidParent(parent) {
+  return !(parent instanceof FormGroupName) && !(parent instanceof FormGroupDirective) && !(parent instanceof FormArrayName);
+}
+var controlNameBinding = {
+  provide: NgControl,
+  useExisting: forwardRef(() => FormControlName)
+};
+var FormControlName = class _FormControlName extends NgControl {
+  _ngModelWarningConfig;
+  _added = false;
+  /**
+   * Internal reference to the view model value.
+   * @internal
+   */
+  viewModel;
+  /**
+   * @description
+   * Tracks the `FormControl` instance bound to the directive.
+   */
+  control;
+  /**
+   * @description
+   * Tracks the name of the `FormControl` bound to the directive. The name corresponds
+   * to a key in the parent `FormGroup` or `FormArray`.
+   * Accepts a name as a string or a number.
+   * The name in the form of a string is useful for individual forms,
+   * while the numerical form allows for form controls to be bound
+   * to indices when iterating over controls in a `FormArray`.
+   */
+  name = null;
+  /**
+   * @description
+   * Triggers a warning in dev mode that this input should not be used with reactive forms.
+   */
+  set isDisabled(isDisabled) {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      console.warn(disabledAttrWarning);
+    }
+  }
+  // TODO(kara): remove next 4 properties once deprecation period is over
+  /** @deprecated as of v6 */
+  model;
+  /** @deprecated as of v6 */
+  update = new EventEmitter();
+  /**
+   * @description
+   * Static property used to track whether any ngModel warnings have been sent across
+   * all instances of FormControlName. Used to support warning config of "once".
+   *
+   * @internal
+   */
+  static _ngModelWarningSentOnce = false;
+  /**
+   * @description
+   * Instance property used to track whether an ngModel warning has been sent out for this
+   * particular FormControlName instance. Used to support warning config of "always".
+   *
+   * @internal
+   */
+  _ngModelWarningSent = false;
+  constructor(parent, validators, asyncValidators, valueAccessors, _ngModelWarningConfig) {
+    super();
+    this._ngModelWarningConfig = _ngModelWarningConfig;
+    this._parent = parent;
+    this._setValidators(validators);
+    this._setAsyncValidators(asyncValidators);
+    this.valueAccessor = selectValueAccessor(this, valueAccessors);
+  }
+  /** @docs-private */
+  ngOnChanges(changes) {
+    if (!this._added) this._setUpControl();
+    if (isPropertyUpdated(changes, this.viewModel)) {
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        _ngModelWarning("formControlName", _FormControlName, this, this._ngModelWarningConfig);
+      }
+      this.viewModel = this.model;
+      this.formDirective.updateModel(this, this.model);
+    }
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.formDirective) {
+      this.formDirective.removeControl(this);
+    }
+  }
+  /**
+   * @description
+   * Sets the new value for the view model and emits an `ngModelChange` event.
+   *
+   * @param newValue The new value for the view model.
+   */
+  viewToModelUpdate(newValue) {
+    this.viewModel = newValue;
+    this.update.emit(newValue);
+  }
+  /**
+   * @description
+   * Returns an array that represents the path from the top-level form to this control.
+   * Each index is the string name of the control on that level.
+   */
+  get path() {
+    return controlPath(this.name == null ? this.name : this.name.toString(), this._parent);
+  }
+  /**
+   * @description
+   * The top-level directive for this group if present, otherwise null.
+   */
+  get formDirective() {
+    return this._parent ? this._parent.formDirective : null;
+  }
+  _setUpControl() {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      checkParentType(this._parent, this.name);
+    }
+    this.control = this.formDirective.addControl(this);
+    this._added = true;
+  }
+  static ɵfac = function FormControlName_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormControlName)(ɵɵdirectiveInject(ControlContainer, 13), ɵɵdirectiveInject(NG_VALIDATORS, 10), ɵɵdirectiveInject(NG_ASYNC_VALIDATORS, 10), ɵɵdirectiveInject(NG_VALUE_ACCESSOR, 10), ɵɵdirectiveInject(NG_MODEL_WITH_FORM_CONTROL_WARNING, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FormControlName,
+    selectors: [["", "formControlName", ""]],
+    inputs: {
+      name: [0, "formControlName", "name"],
+      isDisabled: [0, "disabled", "isDisabled"],
+      model: [0, "ngModel", "model"]
+    },
+    outputs: {
+      update: "ngModelChange"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([controlNameBinding]), ɵɵInheritDefinitionFeature, ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormControlName, [{
+    type: Directive,
+    args: [{
+      selector: "[formControlName]",
+      providers: [controlNameBinding],
+      standalone: false
+    }]
+  }], () => [{
+    type: ControlContainer,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }, {
+      type: SkipSelf
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_ASYNC_VALIDATORS]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Self
+    }, {
+      type: Inject,
+      args: [NG_VALUE_ACCESSOR]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [NG_MODEL_WITH_FORM_CONTROL_WARNING]
+    }]
+  }], {
+    name: [{
+      type: Input,
+      args: ["formControlName"]
+    }],
+    isDisabled: [{
+      type: Input,
+      args: ["disabled"]
+    }],
+    model: [{
+      type: Input,
+      args: ["ngModel"]
+    }],
+    update: [{
+      type: Output,
+      args: ["ngModelChange"]
+    }]
+  });
+})();
+function checkParentType(parent, name) {
+  if (!(parent instanceof FormGroupName) && parent instanceof AbstractFormGroupDirective) {
+    throw ngModelGroupException();
+  } else if (!(parent instanceof FormGroupName) && !(parent instanceof FormGroupDirective) && !(parent instanceof FormArrayName)) {
+    throw controlParentException(name);
+  }
+}
+var SELECT_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => SelectControlValueAccessor),
+  multi: true
+};
+function _buildValueString$1(id, value) {
+  if (id == null) return `${value}`;
+  if (value && typeof value === "object") value = "Object";
+  return `${id}: ${value}`.slice(0, 50);
+}
+function _extractId$1(valueString) {
+  return valueString.split(":")[0];
+}
+var SelectControlValueAccessor = class _SelectControlValueAccessor extends BuiltInControlValueAccessor {
+  /** @docs-private */
+  value;
+  /** @internal */
+  _optionMap = /* @__PURE__ */ new Map();
+  /** @internal */
+  _idCounter = 0;
+  /**
+   * @description
+   * Tracks the option comparison algorithm for tracking identities when
+   * checking for changes.
+   */
+  set compareWith(fn) {
+    if (typeof fn !== "function" && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw new RuntimeError(1201, `compareWith must be a function, but received ${JSON.stringify(fn)}`);
+    }
+    this._compareWith = fn;
+  }
+  _compareWith = Object.is;
+  /**
+   * Sets the "value" property on the select element.
+   * @docs-private
+   */
+  writeValue(value) {
+    this.value = value;
+    const id = this._getOptionId(value);
+    const valueString = _buildValueString$1(id, value);
+    this.setProperty("value", valueString);
+  }
+  /**
+   * Registers a function called when the control value changes.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this.onChange = (valueString) => {
+      this.value = this._getOptionValue(valueString);
+      fn(this.value);
+    };
+  }
+  /** @internal */
+  _registerOption() {
+    return (this._idCounter++).toString();
+  }
+  /** @internal */
+  _getOptionId(value) {
+    for (const id of this._optionMap.keys()) {
+      if (this._compareWith(this._optionMap.get(id), value)) return id;
+    }
+    return null;
+  }
+  /** @internal */
+  _getOptionValue(valueString) {
+    const id = _extractId$1(valueString);
+    return this._optionMap.has(id) ? this._optionMap.get(id) : valueString;
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵSelectControlValueAccessor_BaseFactory;
+    return function SelectControlValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵSelectControlValueAccessor_BaseFactory || (ɵSelectControlValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_SelectControlValueAccessor)))(__ngFactoryType__ || _SelectControlValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _SelectControlValueAccessor,
+    selectors: [["select", "formControlName", "", 3, "multiple", ""], ["select", "formControl", "", 3, "multiple", ""], ["select", "ngModel", "", 3, "multiple", ""]],
+    hostBindings: function SelectControlValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("change", function SelectControlValueAccessor_change_HostBindingHandler($event) {
+          return ctx.onChange($event.target.value);
+        })("blur", function SelectControlValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    inputs: {
+      compareWith: "compareWith"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([SELECT_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SelectControlValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]",
+      host: {
+        "(change)": "onChange($any($event.target).value)",
+        "(blur)": "onTouched()"
+      },
+      providers: [SELECT_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], null, {
+    compareWith: [{
+      type: Input
+    }]
+  });
+})();
+var NgSelectOption = class _NgSelectOption {
+  _element;
+  _renderer;
+  _select;
+  /**
+   * @description
+   * ID of the option element
+   */
+  id;
+  constructor(_element, _renderer, _select) {
+    this._element = _element;
+    this._renderer = _renderer;
+    this._select = _select;
+    if (this._select) this.id = this._select._registerOption();
+  }
+  /**
+   * @description
+   * Tracks the value bound to the option element. Unlike the value binding,
+   * ngValue supports binding to objects.
+   */
+  set ngValue(value) {
+    if (this._select == null) return;
+    this._select._optionMap.set(this.id, value);
+    this._setElementValue(_buildValueString$1(this.id, value));
+    this._select.writeValue(this._select.value);
+  }
+  /**
+   * @description
+   * Tracks simple string values bound to the option element.
+   * For objects, use the `ngValue` input binding.
+   */
+  set value(value) {
+    this._setElementValue(value);
+    if (this._select) this._select.writeValue(this._select.value);
+  }
+  /** @internal */
+  _setElementValue(value) {
+    this._renderer.setProperty(this._element.nativeElement, "value", value);
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this._select) {
+      this._select._optionMap.delete(this.id);
+      this._select.writeValue(this._select.value);
+    }
+  }
+  static ɵfac = function NgSelectOption_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgSelectOption)(ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(SelectControlValueAccessor, 9));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _NgSelectOption,
+    selectors: [["option"]],
+    inputs: {
+      ngValue: "ngValue",
+      value: "value"
+    },
+    standalone: false
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgSelectOption, [{
+    type: Directive,
+    args: [{
+      selector: "option",
+      standalone: false
+    }]
+  }], () => [{
+    type: ElementRef
+  }, {
+    type: Renderer2
+  }, {
+    type: SelectControlValueAccessor,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }]
+  }], {
+    ngValue: [{
+      type: Input,
+      args: ["ngValue"]
+    }],
+    value: [{
+      type: Input,
+      args: ["value"]
+    }]
+  });
+})();
+var SELECT_MULTIPLE_VALUE_ACCESSOR = {
+  provide: NG_VALUE_ACCESSOR,
+  useExisting: forwardRef(() => SelectMultipleControlValueAccessor),
+  multi: true
+};
+function _buildValueString(id, value) {
+  if (id == null) return `${value}`;
+  if (typeof value === "string") value = `'${value}'`;
+  if (value && typeof value === "object") value = "Object";
+  return `${id}: ${value}`.slice(0, 50);
+}
+function _extractId(valueString) {
+  return valueString.split(":")[0];
+}
+var SelectMultipleControlValueAccessor = class _SelectMultipleControlValueAccessor extends BuiltInControlValueAccessor {
+  /**
+   * The current value.
+   * @docs-private
+   */
+  value;
+  /** @internal */
+  _optionMap = /* @__PURE__ */ new Map();
+  /** @internal */
+  _idCounter = 0;
+  /**
+   * @description
+   * Tracks the option comparison algorithm for tracking identities when
+   * checking for changes.
+   */
+  set compareWith(fn) {
+    if (typeof fn !== "function" && (typeof ngDevMode === "undefined" || ngDevMode)) {
+      throw new RuntimeError(1201, `compareWith must be a function, but received ${JSON.stringify(fn)}`);
+    }
+    this._compareWith = fn;
+  }
+  _compareWith = Object.is;
+  /**
+   * Sets the "value" property on one or of more of the select's options.
+   * @docs-private
+   */
+  writeValue(value) {
+    this.value = value;
+    let optionSelectedStateSetter;
+    if (Array.isArray(value)) {
+      const ids = value.map((v) => this._getOptionId(v));
+      optionSelectedStateSetter = (opt, o) => {
+        opt._setSelected(ids.indexOf(o.toString()) > -1);
+      };
+    } else {
+      optionSelectedStateSetter = (opt, o) => {
+        opt._setSelected(false);
+      };
+    }
+    this._optionMap.forEach(optionSelectedStateSetter);
+  }
+  /**
+   * Registers a function called when the control value changes
+   * and writes an array of the selected options.
+   * @docs-private
+   */
+  registerOnChange(fn) {
+    this.onChange = (element) => {
+      const selected = [];
+      const selectedOptions = element.selectedOptions;
+      if (selectedOptions !== void 0) {
+        const options = selectedOptions;
+        for (let i = 0; i < options.length; i++) {
+          const opt = options[i];
+          const val = this._getOptionValue(opt.value);
+          selected.push(val);
+        }
+      } else {
+        const options = element.options;
+        for (let i = 0; i < options.length; i++) {
+          const opt = options[i];
+          if (opt.selected) {
+            const val = this._getOptionValue(opt.value);
+            selected.push(val);
+          }
+        }
+      }
+      this.value = selected;
+      fn(selected);
+    };
+  }
+  /** @internal */
+  _registerOption(value) {
+    const id = (this._idCounter++).toString();
+    this._optionMap.set(id, value);
+    return id;
+  }
+  /** @internal */
+  _getOptionId(value) {
+    for (const id of this._optionMap.keys()) {
+      if (this._compareWith(this._optionMap.get(id)._value, value)) return id;
+    }
+    return null;
+  }
+  /** @internal */
+  _getOptionValue(valueString) {
+    const id = _extractId(valueString);
+    return this._optionMap.has(id) ? this._optionMap.get(id)._value : valueString;
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵSelectMultipleControlValueAccessor_BaseFactory;
+    return function SelectMultipleControlValueAccessor_Factory(__ngFactoryType__) {
+      return (ɵSelectMultipleControlValueAccessor_BaseFactory || (ɵSelectMultipleControlValueAccessor_BaseFactory = ɵɵgetInheritedFactory(_SelectMultipleControlValueAccessor)))(__ngFactoryType__ || _SelectMultipleControlValueAccessor);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _SelectMultipleControlValueAccessor,
+    selectors: [["select", "multiple", "", "formControlName", ""], ["select", "multiple", "", "formControl", ""], ["select", "multiple", "", "ngModel", ""]],
+    hostBindings: function SelectMultipleControlValueAccessor_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("change", function SelectMultipleControlValueAccessor_change_HostBindingHandler($event) {
+          return ctx.onChange($event.target);
+        })("blur", function SelectMultipleControlValueAccessor_blur_HostBindingHandler() {
+          return ctx.onTouched();
+        });
+      }
+    },
+    inputs: {
+      compareWith: "compareWith"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([SELECT_MULTIPLE_VALUE_ACCESSOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SelectMultipleControlValueAccessor, [{
+    type: Directive,
+    args: [{
+      selector: "select[multiple][formControlName],select[multiple][formControl],select[multiple][ngModel]",
+      host: {
+        "(change)": "onChange($event.target)",
+        "(blur)": "onTouched()"
+      },
+      providers: [SELECT_MULTIPLE_VALUE_ACCESSOR],
+      standalone: false
+    }]
+  }], null, {
+    compareWith: [{
+      type: Input
+    }]
+  });
+})();
+var ɵNgSelectMultipleOption = class _ɵNgSelectMultipleOption {
+  _element;
+  _renderer;
+  _select;
+  id;
+  /** @internal */
+  _value;
+  constructor(_element, _renderer, _select) {
+    this._element = _element;
+    this._renderer = _renderer;
+    this._select = _select;
+    if (this._select) {
+      this.id = this._select._registerOption(this);
+    }
+  }
+  /**
+   * @description
+   * Tracks the value bound to the option element. Unlike the value binding,
+   * ngValue supports binding to objects.
+   */
+  set ngValue(value) {
+    if (this._select == null) return;
+    this._value = value;
+    this._setElementValue(_buildValueString(this.id, value));
+    this._select.writeValue(this._select.value);
+  }
+  /**
+   * @description
+   * Tracks simple string values bound to the option element.
+   * For objects, use the `ngValue` input binding.
+   */
+  set value(value) {
+    if (this._select) {
+      this._value = value;
+      this._setElementValue(_buildValueString(this.id, value));
+      this._select.writeValue(this._select.value);
+    } else {
+      this._setElementValue(value);
+    }
+  }
+  /** @internal */
+  _setElementValue(value) {
+    this._renderer.setProperty(this._element.nativeElement, "value", value);
+  }
+  /** @internal */
+  _setSelected(selected) {
+    this._renderer.setProperty(this._element.nativeElement, "selected", selected);
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this._select) {
+      this._select._optionMap.delete(this.id);
+      this._select.writeValue(this._select.value);
+    }
+  }
+  static ɵfac = function ɵNgSelectMultipleOption_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ɵNgSelectMultipleOption)(ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(SelectMultipleControlValueAccessor, 9));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _ɵNgSelectMultipleOption,
+    selectors: [["option"]],
+    inputs: {
+      ngValue: "ngValue",
+      value: "value"
+    },
+    standalone: false
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ɵNgSelectMultipleOption, [{
+    type: Directive,
+    args: [{
+      selector: "option",
+      standalone: false
+    }]
+  }], () => [{
+    type: ElementRef
+  }, {
+    type: Renderer2
+  }, {
+    type: SelectMultipleControlValueAccessor,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Host
+    }]
+  }], {
+    ngValue: [{
+      type: Input,
+      args: ["ngValue"]
+    }],
+    value: [{
+      type: Input,
+      args: ["value"]
+    }]
+  });
+})();
+function toInteger(value) {
+  return typeof value === "number" ? value : parseInt(value, 10);
+}
+function toFloat(value) {
+  return typeof value === "number" ? value : parseFloat(value);
+}
+var AbstractValidatorDirective = class _AbstractValidatorDirective {
+  _validator = nullValidator;
+  _onChange;
+  /**
+   * A flag that tracks whether this validator is enabled.
+   *
+   * Marking it `internal` (vs `protected`), so that this flag can be used in host bindings of
+   * directive classes that extend this base class.
+   * @internal
+   */
+  _enabled;
+  /** @docs-private */
+  ngOnChanges(changes) {
+    if (this.inputName in changes) {
+      const input = this.normalizeInput(changes[this.inputName].currentValue);
+      this._enabled = this.enabled(input);
+      this._validator = this._enabled ? this.createValidator(input) : nullValidator;
+      if (this._onChange) {
+        this._onChange();
+      }
+    }
+  }
+  /** @docs-private */
+  validate(control) {
+    return this._validator(control);
+  }
+  /** @docs-private */
+  registerOnValidatorChange(fn) {
+    this._onChange = fn;
+  }
+  /**
+   * @description
+   * Determines whether this validator should be active or not based on an input.
+   * Base class implementation checks whether an input is defined (if the value is different from
+   * `null` and `undefined`). Validator classes that extend this base class can override this
+   * function with the logic specific to a particular validator directive.
+   */
+  enabled(input) {
+    return input != null;
+  }
+  static ɵfac = function AbstractValidatorDirective_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _AbstractValidatorDirective)();
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _AbstractValidatorDirective,
+    features: [ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(AbstractValidatorDirective, [{
+    type: Directive
+  }], null, null);
+})();
+var MAX_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => MaxValidator),
+  multi: true
+};
+var MaxValidator = class _MaxValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the max bound to this directive.
+   */
+  max;
+  /** @internal */
+  inputName = "max";
+  /** @internal */
+  normalizeInput = (input) => toFloat(input);
+  /** @internal */
+  createValidator = (max) => maxValidator(max);
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵMaxValidator_BaseFactory;
+    return function MaxValidator_Factory(__ngFactoryType__) {
+      return (ɵMaxValidator_BaseFactory || (ɵMaxValidator_BaseFactory = ɵɵgetInheritedFactory(_MaxValidator)))(__ngFactoryType__ || _MaxValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _MaxValidator,
+    selectors: [["input", "type", "number", "max", "", "formControlName", ""], ["input", "type", "number", "max", "", "formControl", ""], ["input", "type", "number", "max", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function MaxValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("max", ctx._enabled ? ctx.max : null);
+      }
+    },
+    inputs: {
+      max: "max"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([MAX_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MaxValidator, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]",
+      providers: [MAX_VALIDATOR],
+      host: {
+        "[attr.max]": "_enabled ? max : null"
+      },
+      standalone: false
+    }]
+  }], null, {
+    max: [{
+      type: Input
+    }]
+  });
+})();
+var MIN_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => MinValidator),
+  multi: true
+};
+var MinValidator = class _MinValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the min bound to this directive.
+   */
+  min;
+  /** @internal */
+  inputName = "min";
+  /** @internal */
+  normalizeInput = (input) => toFloat(input);
+  /** @internal */
+  createValidator = (min) => minValidator(min);
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵMinValidator_BaseFactory;
+    return function MinValidator_Factory(__ngFactoryType__) {
+      return (ɵMinValidator_BaseFactory || (ɵMinValidator_BaseFactory = ɵɵgetInheritedFactory(_MinValidator)))(__ngFactoryType__ || _MinValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _MinValidator,
+    selectors: [["input", "type", "number", "min", "", "formControlName", ""], ["input", "type", "number", "min", "", "formControl", ""], ["input", "type", "number", "min", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function MinValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("min", ctx._enabled ? ctx.min : null);
+      }
+    },
+    inputs: {
+      min: "min"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([MIN_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MinValidator, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]",
+      providers: [MIN_VALIDATOR],
+      host: {
+        "[attr.min]": "_enabled ? min : null"
+      },
+      standalone: false
+    }]
+  }], null, {
+    min: [{
+      type: Input
+    }]
+  });
+})();
+var REQUIRED_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => RequiredValidator),
+  multi: true
+};
+var CHECKBOX_REQUIRED_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => CheckboxRequiredValidator),
+  multi: true
+};
+var RequiredValidator = class _RequiredValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the required attribute bound to this directive.
+   */
+  required;
+  /** @internal */
+  inputName = "required";
+  /** @internal */
+  normalizeInput = booleanAttribute;
+  /** @internal */
+  createValidator = (input) => requiredValidator;
+  /** @docs-private */
+  enabled(input) {
+    return input;
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵRequiredValidator_BaseFactory;
+    return function RequiredValidator_Factory(__ngFactoryType__) {
+      return (ɵRequiredValidator_BaseFactory || (ɵRequiredValidator_BaseFactory = ɵɵgetInheritedFactory(_RequiredValidator)))(__ngFactoryType__ || _RequiredValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _RequiredValidator,
+    selectors: [["", "required", "", "formControlName", "", 3, "type", "checkbox"], ["", "required", "", "formControl", "", 3, "type", "checkbox"], ["", "required", "", "ngModel", "", 3, "type", "checkbox"]],
+    hostVars: 1,
+    hostBindings: function RequiredValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("required", ctx._enabled ? "" : null);
+      }
+    },
+    inputs: {
+      required: "required"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([REQUIRED_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RequiredValidator, [{
+    type: Directive,
+    args: [{
+      selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]",
+      providers: [REQUIRED_VALIDATOR],
+      host: {
+        "[attr.required]": '_enabled ? "" : null'
+      },
+      standalone: false
+    }]
+  }], null, {
+    required: [{
+      type: Input
+    }]
+  });
+})();
+var CheckboxRequiredValidator = class _CheckboxRequiredValidator extends RequiredValidator {
+  /** @internal */
+  createValidator = (input) => requiredTrueValidator;
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵCheckboxRequiredValidator_BaseFactory;
+    return function CheckboxRequiredValidator_Factory(__ngFactoryType__) {
+      return (ɵCheckboxRequiredValidator_BaseFactory || (ɵCheckboxRequiredValidator_BaseFactory = ɵɵgetInheritedFactory(_CheckboxRequiredValidator)))(__ngFactoryType__ || _CheckboxRequiredValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _CheckboxRequiredValidator,
+    selectors: [["input", "type", "checkbox", "required", "", "formControlName", ""], ["input", "type", "checkbox", "required", "", "formControl", ""], ["input", "type", "checkbox", "required", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function CheckboxRequiredValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("required", ctx._enabled ? "" : null);
+      }
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([CHECKBOX_REQUIRED_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(CheckboxRequiredValidator, [{
+    type: Directive,
+    args: [{
+      selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]",
+      providers: [CHECKBOX_REQUIRED_VALIDATOR],
+      host: {
+        "[attr.required]": '_enabled ? "" : null'
+      },
+      standalone: false
+    }]
+  }], null, null);
+})();
+var EMAIL_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => EmailValidator),
+  multi: true
+};
+var EmailValidator = class _EmailValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the email attribute bound to this directive.
+   */
+  email;
+  /** @internal */
+  inputName = "email";
+  /** @internal */
+  normalizeInput = booleanAttribute;
+  /** @internal */
+  createValidator = (input) => emailValidator;
+  /** @docs-private */
+  enabled(input) {
+    return input;
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵEmailValidator_BaseFactory;
+    return function EmailValidator_Factory(__ngFactoryType__) {
+      return (ɵEmailValidator_BaseFactory || (ɵEmailValidator_BaseFactory = ɵɵgetInheritedFactory(_EmailValidator)))(__ngFactoryType__ || _EmailValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _EmailValidator,
+    selectors: [["", "email", "", "formControlName", ""], ["", "email", "", "formControl", ""], ["", "email", "", "ngModel", ""]],
+    inputs: {
+      email: "email"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([EMAIL_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(EmailValidator, [{
+    type: Directive,
+    args: [{
+      selector: "[email][formControlName],[email][formControl],[email][ngModel]",
+      providers: [EMAIL_VALIDATOR],
+      standalone: false
+    }]
+  }], null, {
+    email: [{
+      type: Input
+    }]
+  });
+})();
+var MIN_LENGTH_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => MinLengthValidator),
+  multi: true
+};
+var MinLengthValidator = class _MinLengthValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the minimum length bound to this directive.
+   */
+  minlength;
+  /** @internal */
+  inputName = "minlength";
+  /** @internal */
+  normalizeInput = (input) => toInteger(input);
+  /** @internal */
+  createValidator = (minlength) => minLengthValidator(minlength);
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵMinLengthValidator_BaseFactory;
+    return function MinLengthValidator_Factory(__ngFactoryType__) {
+      return (ɵMinLengthValidator_BaseFactory || (ɵMinLengthValidator_BaseFactory = ɵɵgetInheritedFactory(_MinLengthValidator)))(__ngFactoryType__ || _MinLengthValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _MinLengthValidator,
+    selectors: [["", "minlength", "", "formControlName", ""], ["", "minlength", "", "formControl", ""], ["", "minlength", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function MinLengthValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("minlength", ctx._enabled ? ctx.minlength : null);
+      }
+    },
+    inputs: {
+      minlength: "minlength"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([MIN_LENGTH_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MinLengthValidator, [{
+    type: Directive,
+    args: [{
+      selector: "[minlength][formControlName],[minlength][formControl],[minlength][ngModel]",
+      providers: [MIN_LENGTH_VALIDATOR],
+      host: {
+        "[attr.minlength]": "_enabled ? minlength : null"
+      },
+      standalone: false
+    }]
+  }], null, {
+    minlength: [{
+      type: Input
+    }]
+  });
+})();
+var MAX_LENGTH_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => MaxLengthValidator),
+  multi: true
+};
+var MaxLengthValidator = class _MaxLengthValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the maximum length bound to this directive.
+   */
+  maxlength;
+  /** @internal */
+  inputName = "maxlength";
+  /** @internal */
+  normalizeInput = (input) => toInteger(input);
+  /** @internal */
+  createValidator = (maxlength) => maxLengthValidator(maxlength);
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵMaxLengthValidator_BaseFactory;
+    return function MaxLengthValidator_Factory(__ngFactoryType__) {
+      return (ɵMaxLengthValidator_BaseFactory || (ɵMaxLengthValidator_BaseFactory = ɵɵgetInheritedFactory(_MaxLengthValidator)))(__ngFactoryType__ || _MaxLengthValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _MaxLengthValidator,
+    selectors: [["", "maxlength", "", "formControlName", ""], ["", "maxlength", "", "formControl", ""], ["", "maxlength", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function MaxLengthValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("maxlength", ctx._enabled ? ctx.maxlength : null);
+      }
+    },
+    inputs: {
+      maxlength: "maxlength"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([MAX_LENGTH_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(MaxLengthValidator, [{
+    type: Directive,
+    args: [{
+      selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]",
+      providers: [MAX_LENGTH_VALIDATOR],
+      host: {
+        "[attr.maxlength]": "_enabled ? maxlength : null"
+      },
+      standalone: false
+    }]
+  }], null, {
+    maxlength: [{
+      type: Input
+    }]
+  });
+})();
+var PATTERN_VALIDATOR = {
+  provide: NG_VALIDATORS,
+  useExisting: forwardRef(() => PatternValidator),
+  multi: true
+};
+var PatternValidator = class _PatternValidator extends AbstractValidatorDirective {
+  /**
+   * @description
+   * Tracks changes to the pattern bound to this directive.
+   */
+  pattern;
+  // This input is always defined, since the name matches selector.
+  /** @internal */
+  inputName = "pattern";
+  /** @internal */
+  normalizeInput = (input) => input;
+  /** @internal */
+  createValidator = (input) => patternValidator(input);
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵPatternValidator_BaseFactory;
+    return function PatternValidator_Factory(__ngFactoryType__) {
+      return (ɵPatternValidator_BaseFactory || (ɵPatternValidator_BaseFactory = ɵɵgetInheritedFactory(_PatternValidator)))(__ngFactoryType__ || _PatternValidator);
+    };
+  })();
+  static ɵdir = ɵɵdefineDirective({
+    type: _PatternValidator,
+    selectors: [["", "pattern", "", "formControlName", ""], ["", "pattern", "", "formControl", ""], ["", "pattern", "", "ngModel", ""]],
+    hostVars: 1,
+    hostBindings: function PatternValidator_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵattribute("pattern", ctx._enabled ? ctx.pattern : null);
+      }
+    },
+    inputs: {
+      pattern: "pattern"
+    },
+    standalone: false,
+    features: [ɵɵProvidersFeature([PATTERN_VALIDATOR]), ɵɵInheritDefinitionFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(PatternValidator, [{
+    type: Directive,
+    args: [{
+      selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]",
+      providers: [PATTERN_VALIDATOR],
+      host: {
+        "[attr.pattern]": "_enabled ? pattern : null"
+      },
+      standalone: false
+    }]
+  }], null, {
+    pattern: [{
+      type: Input
+    }]
+  });
+})();
+var SHARED_FORM_DIRECTIVES = [ɵNgNoValidate, NgSelectOption, ɵNgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator, CheckboxRequiredValidator, EmailValidator, MinValidator, MaxValidator];
+var TEMPLATE_DRIVEN_DIRECTIVES = [NgModel, NgModelGroup, NgForm];
+var REACTIVE_DRIVEN_DIRECTIVES = [FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName];
+var ɵInternalFormsSharedModule = class _ɵInternalFormsSharedModule {
+  static ɵfac = function ɵInternalFormsSharedModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ɵInternalFormsSharedModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _ɵInternalFormsSharedModule,
+    declarations: [ɵNgNoValidate, NgSelectOption, ɵNgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator, CheckboxRequiredValidator, EmailValidator, MinValidator, MaxValidator],
+    exports: [ɵNgNoValidate, NgSelectOption, ɵNgSelectMultipleOption, DefaultValueAccessor, NumberValueAccessor, RangeValueAccessor, CheckboxControlValueAccessor, SelectControlValueAccessor, SelectMultipleControlValueAccessor, RadioControlValueAccessor, NgControlStatus, NgControlStatusGroup, RequiredValidator, MinLengthValidator, MaxLengthValidator, PatternValidator, CheckboxRequiredValidator, EmailValidator, MinValidator, MaxValidator]
+  });
+  static ɵinj = ɵɵdefineInjector({});
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ɵInternalFormsSharedModule, [{
+    type: NgModule,
+    args: [{
+      declarations: SHARED_FORM_DIRECTIVES,
+      exports: SHARED_FORM_DIRECTIVES
+    }]
+  }], null, null);
+})();
+var FormArray = class extends AbstractControl {
+  /**
+   * Creates a new `FormArray` instance.
+   *
+   * @param controls An array of child controls. Each child control is given an index
+   * where it is registered.
+   *
+   * @param validatorOrOpts A synchronous validator function, or an array of
+   * such functions, or an `AbstractControlOptions` object that contains validation functions
+   * and a validation trigger.
+   *
+   * @param asyncValidator A single async validator or array of async validator functions
+   *
+   */
+  constructor(controls, validatorOrOpts, asyncValidator) {
+    super(pickValidators(validatorOrOpts), pickAsyncValidators(asyncValidator, validatorOrOpts));
+    this.controls = controls;
+    this._initObservables();
+    this._setUpdateStrategy(validatorOrOpts);
+    this._setUpControls();
+    this.updateValueAndValidity({
+      onlySelf: true,
+      // If `asyncValidator` is present, it will trigger control status change from `PENDING` to
+      // `VALID` or `INVALID`.
+      // The status should be broadcasted via the `statusChanges` observable, so we set `emitEvent`
+      // to `true` to allow that during the control creation process.
+      emitEvent: !!this.asyncValidator
+    });
+  }
+  controls;
+  /**
+   * Get the `AbstractControl` at the given `index` in the array.
+   *
+   * @param index Index in the array to retrieve the control. If `index` is negative, it will wrap
+   *     around from the back, and if index is greatly negative (less than `-length`), the result is
+   * undefined. This behavior is the same as `Array.at(index)`.
+   */
+  at(index) {
+    return this.controls[this._adjustIndex(index)];
+  }
+  /**
+   * Insert a new `AbstractControl` at the end of the array.
+   *
+   * @param control Form control to be inserted
+   * @param options Specifies whether this FormArray instance should emit events after a new
+   *     control is added.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control is
+   * inserted. When false, no events are emitted.
+   */
+  push(control, options = {}) {
+    this.controls.push(control);
+    this._registerControl(control);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+    this._onCollectionChange();
+  }
+  /**
+   * Insert a new `AbstractControl` at the given `index` in the array.
+   *
+   * @param index Index in the array to insert the control. If `index` is negative, wraps around
+   *     from the back. If `index` is greatly negative (less than `-length`), prepends to the array.
+   * This behavior is the same as `Array.splice(index, 0, control)`.
+   * @param control Form control to be inserted
+   * @param options Specifies whether this FormArray instance should emit events after a new
+   *     control is inserted.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control is
+   * inserted. When false, no events are emitted.
+   */
+  insert(index, control, options = {}) {
+    this.controls.splice(index, 0, control);
+    this._registerControl(control);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+  }
+  /**
+   * Remove the control at the given `index` in the array.
+   *
+   * @param index Index in the array to remove the control.  If `index` is negative, wraps around
+   *     from the back. If `index` is greatly negative (less than `-length`), removes the first
+   *     element. This behavior is the same as `Array.splice(index, 1)`.
+   * @param options Specifies whether this FormArray instance should emit events after a
+   *     control is removed.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control is
+   * removed. When false, no events are emitted.
+   */
+  removeAt(index, options = {}) {
+    let adjustedIndex = this._adjustIndex(index);
+    if (adjustedIndex < 0) adjustedIndex = 0;
+    if (this.controls[adjustedIndex]) this.controls[adjustedIndex]._registerOnCollectionChange(() => {
+    });
+    this.controls.splice(adjustedIndex, 1);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+  }
+  /**
+   * Replace an existing control.
+   *
+   * @param index Index in the array to replace the control. If `index` is negative, wraps around
+   *     from the back. If `index` is greatly negative (less than `-length`), replaces the first
+   *     element. This behavior is the same as `Array.splice(index, 1, control)`.
+   * @param control The `AbstractControl` control to replace the existing control
+   * @param options Specifies whether this FormArray instance should emit events after an
+   *     existing control is replaced with a new one.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control is
+   * replaced with a new one. When false, no events are emitted.
+   */
+  setControl(index, control, options = {}) {
+    let adjustedIndex = this._adjustIndex(index);
+    if (adjustedIndex < 0) adjustedIndex = 0;
+    if (this.controls[adjustedIndex]) this.controls[adjustedIndex]._registerOnCollectionChange(() => {
+    });
+    this.controls.splice(adjustedIndex, 1);
+    if (control) {
+      this.controls.splice(adjustedIndex, 0, control);
+      this._registerControl(control);
+    }
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+    this._onCollectionChange();
+  }
+  /**
+   * Length of the control array.
+   */
+  get length() {
+    return this.controls.length;
+  }
+  /**
+   * Sets the value of the `FormArray`. It accepts an array that matches
+   * the structure of the control.
+   *
+   * This method performs strict checks, and throws an error if you try
+   * to set the value of a control that doesn't exist or if you exclude the
+   * value of a control.
+   *
+   * @usageNotes
+   * ### Set the values for the controls in the form array
+   *
+   * ```ts
+   * const arr = new FormArray([
+   *   new FormControl(),
+   *   new FormControl()
+   * ]);
+   * console.log(arr.value);   // [null, null]
+   *
+   * arr.setValue(['Nancy', 'Drew']);
+   * console.log(arr.value);   // ['Nancy', 'Drew']
+   * ```
+   *
+   * @param value Array of values for the controls
+   * @param options Configure options that determine how the control propagates changes and
+   * emits events after the value changes
+   *
+   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default
+   * is false.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges`
+   * observables emit events with the latest status and value when the control value is updated.
+   * When false, no events are emitted.
+   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity
+   * updateValueAndValidity} method.
+   */
+  setValue(value, options = {}) {
+    assertAllValuesPresent(this, false, value);
+    value.forEach((newValue, index) => {
+      assertControlPresent(this, false, index);
+      this.at(index).setValue(newValue, {
+        onlySelf: true,
+        emitEvent: options.emitEvent
+      });
+    });
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * Patches the value of the `FormArray`. It accepts an array that matches the
+   * structure of the control, and does its best to match the values to the correct
+   * controls in the group.
+   *
+   * It accepts both super-sets and sub-sets of the array without throwing an error.
+   *
+   * @usageNotes
+   * ### Patch the values for controls in a form array
+   *
+   * ```ts
+   * const arr = new FormArray([
+   *    new FormControl(),
+   *    new FormControl()
+   * ]);
+   * console.log(arr.value);   // [null, null]
+   *
+   * arr.patchValue(['Nancy']);
+   * console.log(arr.value);   // ['Nancy', null]
+   * ```
+   *
+   * @param value Array of latest values for the controls
+   * @param options Configure options that determine how the control propagates changes and
+   * emits events after the value changes
+   *
+   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default
+   * is false.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when the control
+   * value is updated. When false, no events are emitted. The configuration options are passed to
+   * the {@link AbstractControl#updateValueAndValidity updateValueAndValidity} method.
+   */
+  patchValue(value, options = {}) {
+    if (value == null) return;
+    value.forEach((newValue, index) => {
+      if (this.at(index)) {
+        this.at(index).patchValue(newValue, {
+          onlySelf: true,
+          emitEvent: options.emitEvent
+        });
+      }
+    });
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * Resets the `FormArray` and all descendants are marked `pristine` and `untouched`, and the
+   * value of all descendants to null or null maps.
+   *
+   * You reset to a specific form state by passing in an array of states
+   * that matches the structure of the control. The state is a standalone value
+   * or a form state object with both a value and a disabled status.
+   *
+   * @usageNotes
+   * ### Reset the values in a form array
+   *
+   * ```ts
+   * const arr = new FormArray([
+   *    new FormControl(),
+   *    new FormControl()
+   * ]);
+   * arr.reset(['name', 'last name']);
+   *
+   * console.log(arr.value);  // ['name', 'last name']
+   * ```
+   *
+   * ### Reset the values in a form array and the disabled status for the first control
+   *
+   * ```ts
+   * arr.reset([
+   *   {value: 'name', disabled: true},
+   *   'last'
+   * ]);
+   *
+   * console.log(arr.value);  // ['last']
+   * console.log(arr.at(0).status);  // 'DISABLED'
+   * ```
+   *
+   * @param value Array of values for the controls
+   * @param options Configure options that determine how the control propagates changes and
+   * emits events after the value changes
+   *
+   * * `onlySelf`: When true, each change only affects this control, and not its parent. Default
+   * is false.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges`
+   * observables emit events with the latest status and value when the control is reset.
+   * When false, no events are emitted.
+   * The configuration options are passed to the {@link AbstractControl#updateValueAndValidity
+   * updateValueAndValidity} method.
+   */
+  reset(value = [], options = {}) {
+    this._forEachChild((control, index) => {
+      control.reset(value[index], {
+        onlySelf: true,
+        emitEvent: options.emitEvent
+      });
+    });
+    this._updatePristine(options, this);
+    this._updateTouched(options, this);
+    this.updateValueAndValidity(options);
+  }
+  /**
+   * The aggregate value of the array, including any disabled controls.
+   *
+   * Reports all values regardless of disabled status.
+   */
+  getRawValue() {
+    return this.controls.map((control) => control.getRawValue());
+  }
+  /**
+   * Remove all controls in the `FormArray`.
+   *
+   * @param options Specifies whether this FormArray instance should emit events after all
+   *     controls are removed.
+   * * `emitEvent`: When true or not supplied (the default), both the `statusChanges` and
+   * `valueChanges` observables emit events with the latest status and value when all controls
+   * in this FormArray instance are removed. When false, no events are emitted.
+   *
+   * @usageNotes
+   * ### Remove all elements from a FormArray
+   *
+   * ```ts
+   * const arr = new FormArray([
+   *    new FormControl(),
+   *    new FormControl()
+   * ]);
+   * console.log(arr.length);  // 2
+   *
+   * arr.clear();
+   * console.log(arr.length);  // 0
+   * ```
+   *
+   * It's a simpler and more efficient alternative to removing all elements one by one:
+   *
+   * ```ts
+   * const arr = new FormArray([
+   *    new FormControl(),
+   *    new FormControl()
+   * ]);
+   *
+   * while (arr.length) {
+   *    arr.removeAt(0);
+   * }
+   * ```
+   */
+  clear(options = {}) {
+    if (this.controls.length < 1) return;
+    this._forEachChild((control) => control._registerOnCollectionChange(() => {
+    }));
+    this.controls.splice(0);
+    this.updateValueAndValidity({
+      emitEvent: options.emitEvent
+    });
+  }
+  /**
+   * Adjusts a negative index by summing it with the length of the array. For very negative
+   * indices, the result may remain negative.
+   * @internal
+   */
+  _adjustIndex(index) {
+    return index < 0 ? index + this.length : index;
+  }
+  /** @internal */
+  _syncPendingControls() {
+    let subtreeUpdated = this.controls.reduce((updated, child) => {
+      return child._syncPendingControls() ? true : updated;
+    }, false);
+    if (subtreeUpdated) this.updateValueAndValidity({
+      onlySelf: true
+    });
+    return subtreeUpdated;
+  }
+  /** @internal */
+  _forEachChild(cb) {
+    this.controls.forEach((control, index) => {
+      cb(control, index);
+    });
+  }
+  /** @internal */
+  _updateValue() {
+    this.value = this.controls.filter((control) => control.enabled || this.disabled).map((control) => control.value);
+  }
+  /** @internal */
+  _anyControls(condition) {
+    return this.controls.some((control) => control.enabled && condition(control));
+  }
+  /** @internal */
+  _setUpControls() {
+    this._forEachChild((control) => this._registerControl(control));
+  }
+  /** @internal */
+  _allControlsDisabled() {
+    for (const control of this.controls) {
+      if (control.enabled) return false;
+    }
+    return this.controls.length > 0 || this.disabled;
+  }
+  _registerControl(control) {
+    control.setParent(this);
+    control._registerOnCollectionChange(this._onCollectionChange);
+  }
+  /** @internal */
+  _find(name) {
+    return this.at(name) ?? null;
+  }
+};
+var UntypedFormArray = FormArray;
+var isFormArray = (control) => control instanceof FormArray;
+function isAbstractControlOptions(options) {
+  return !!options && (options.asyncValidators !== void 0 || options.validators !== void 0 || options.updateOn !== void 0);
+}
+var FormBuilder = class _FormBuilder {
+  useNonNullable = false;
+  /**
+   * @description
+   * Returns a FormBuilder in which automatically constructed `FormControl` elements
+   * have `{nonNullable: true}` and are non-nullable.
+   *
+   * **Constructing non-nullable controls**
+   *
+   * When constructing a control, it will be non-nullable, and will reset to its initial value.
+   *
+   * ```ts
+   * let nnfb = new FormBuilder().nonNullable;
+   * let name = nnfb.control('Alex'); // FormControl<string>
+   * name.reset();
+   * console.log(name); // 'Alex'
+   * ```
+   *
+   * **Constructing non-nullable groups or arrays**
+   *
+   * When constructing a group or array, all automatically created inner controls will be
+   * non-nullable, and will reset to their initial values.
+   *
+   * ```ts
+   * let nnfb = new FormBuilder().nonNullable;
+   * let name = nnfb.group({who: 'Alex'}); // FormGroup<{who: FormControl<string>}>
+   * name.reset();
+   * console.log(name); // {who: 'Alex'}
+   * ```
+   * **Constructing *nullable* fields on groups or arrays**
+   *
+   * It is still possible to have a nullable field. In particular, any `FormControl` which is
+   * *already* constructed will not be altered. For example:
+   *
+   * ```ts
+   * let nnfb = new FormBuilder().nonNullable;
+   * // FormGroup<{who: FormControl<string|null>}>
+   * let name = nnfb.group({who: new FormControl('Alex')});
+   * name.reset(); console.log(name); // {who: null}
+   * ```
+   *
+   * Because the inner control is constructed explicitly by the caller, the builder has
+   * no control over how it is created, and cannot exclude the `null`.
+   */
+  get nonNullable() {
+    const nnfb = new _FormBuilder();
+    nnfb.useNonNullable = true;
+    return nnfb;
+  }
+  group(controls, options = null) {
+    const reducedControls = this._reduceControls(controls);
+    let newOptions = {};
+    if (isAbstractControlOptions(options)) {
+      newOptions = options;
+    } else if (options !== null) {
+      newOptions.validators = options.validator;
+      newOptions.asyncValidators = options.asyncValidator;
+    }
+    return new FormGroup(reducedControls, newOptions);
+  }
+  /**
+   * @description
+   * Constructs a new `FormRecord` instance. Accepts a single generic argument, which is an object
+   * containing all the keys and corresponding inner control types.
+   *
+   * @param controls A collection of child controls. The key for each child is the name
+   * under which it is registered.
+   *
+   * @param options Configuration options object for the `FormRecord`. The object should have the
+   * `AbstractControlOptions` type and might contain the following fields:
+   * * `validators`: A synchronous validator function, or an array of validator functions.
+   * * `asyncValidators`: A single async validator or array of async validator functions.
+   * * `updateOn`: The event upon which the control should be updated (options: 'change' | 'blur'
+   * | submit').
+   */
+  record(controls, options = null) {
+    const reducedControls = this._reduceControls(controls);
+    return new FormRecord(reducedControls, options);
+  }
+  /**
+   * @description
+   * Constructs a new `FormControl` with the given state, validators and options. Sets
+   * `{nonNullable: true}` in the options to get a non-nullable control. Otherwise, the
+   * control will be nullable. Accepts a single generic argument, which is the type  of the
+   * control's value.
+   *
+   * @param formState Initializes the control with an initial state value, or
+   * with an object that contains both a value and a disabled status.
+   *
+   * @param validatorOrOpts A synchronous validator function, or an array of
+   * such functions, or a `FormControlOptions` object that contains
+   * validation functions and a validation trigger.
+   *
+   * @param asyncValidator A single async validator or array of async validator
+   * functions.
+   *
+   * @usageNotes
+   *
+   * ### Initialize a control as disabled
+   *
+   * The following example returns a control with an initial value in a disabled state.
+   *
+   * {@example forms/ts/formBuilder/form_builder_example.ts region='disabled-control'}
+   */
+  control(formState, validatorOrOpts, asyncValidator) {
+    let newOptions = {};
+    if (!this.useNonNullable) {
+      return new FormControl(formState, validatorOrOpts, asyncValidator);
+    }
+    if (isAbstractControlOptions(validatorOrOpts)) {
+      newOptions = validatorOrOpts;
+    } else {
+      newOptions.validators = validatorOrOpts;
+      newOptions.asyncValidators = asyncValidator;
+    }
+    return new FormControl(formState, __spreadProps(__spreadValues({}, newOptions), {
+      nonNullable: true
+    }));
+  }
+  /**
+   * Constructs a new `FormArray` from the given array of configurations,
+   * validators and options. Accepts a single generic argument, which is the type of each control
+   * inside the array.
+   *
+   * @param controls An array of child controls or control configs. Each child control is given an
+   *     index when it is registered.
+   *
+   * @param validatorOrOpts A synchronous validator function, or an array of such functions, or an
+   *     `AbstractControlOptions` object that contains
+   * validation functions and a validation trigger.
+   *
+   * @param asyncValidator A single async validator or array of async validator functions.
+   */
+  array(controls, validatorOrOpts, asyncValidator) {
+    const createdControls = controls.map((c) => this._createControl(c));
+    return new FormArray(createdControls, validatorOrOpts, asyncValidator);
+  }
+  /** @internal */
+  _reduceControls(controls) {
+    const createdControls = {};
+    Object.keys(controls).forEach((controlName) => {
+      createdControls[controlName] = this._createControl(controls[controlName]);
+    });
+    return createdControls;
+  }
+  /** @internal */
+  _createControl(controls) {
+    if (controls instanceof FormControl) {
+      return controls;
+    } else if (controls instanceof AbstractControl) {
+      return controls;
+    } else if (Array.isArray(controls)) {
+      const value = controls[0];
+      const validator = controls.length > 1 ? controls[1] : null;
+      const asyncValidator = controls.length > 2 ? controls[2] : null;
+      return this.control(value, validator, asyncValidator);
+    } else {
+      return this.control(controls);
+    }
+  }
+  static ɵfac = function FormBuilder_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormBuilder)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _FormBuilder,
+    factory: _FormBuilder.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormBuilder, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var NonNullableFormBuilder = class _NonNullableFormBuilder {
+  static ɵfac = function NonNullableFormBuilder_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NonNullableFormBuilder)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _NonNullableFormBuilder,
+    factory: () => (() => inject(FormBuilder).nonNullable)(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NonNullableFormBuilder, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => inject(FormBuilder).nonNullable
+    }]
+  }], null, null);
+})();
+var UntypedFormBuilder = class _UntypedFormBuilder extends FormBuilder {
+  group(controlsConfig, options = null) {
+    return super.group(controlsConfig, options);
+  }
+  /**
+   * Like `FormBuilder#control`, except the resulting control is untyped.
+   */
+  control(formState, validatorOrOpts, asyncValidator) {
+    return super.control(formState, validatorOrOpts, asyncValidator);
+  }
+  /**
+   * Like `FormBuilder#array`, except the resulting array is untyped.
+   */
+  array(controlsConfig, validatorOrOpts, asyncValidator) {
+    return super.array(controlsConfig, validatorOrOpts, asyncValidator);
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵUntypedFormBuilder_BaseFactory;
+    return function UntypedFormBuilder_Factory(__ngFactoryType__) {
+      return (ɵUntypedFormBuilder_BaseFactory || (ɵUntypedFormBuilder_BaseFactory = ɵɵgetInheritedFactory(_UntypedFormBuilder)))(__ngFactoryType__ || _UntypedFormBuilder);
+    };
+  })();
+  static ɵprov = ɵɵdefineInjectable({
+    token: _UntypedFormBuilder,
+    factory: _UntypedFormBuilder.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(UntypedFormBuilder, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var VERSION = new Version("20.0.5");
+var FormsModule = class _FormsModule {
+  /**
+   * @description
+   * Provides options for configuring the forms module.
+   *
+   * @param opts An object of configuration options
+   * * `callSetDisabledState` Configures whether to `always` call `setDisabledState`, which is more
+   * correct, or to only call it `whenDisabled`, which is the legacy behavior.
+   */
+  static withConfig(opts) {
+    return {
+      ngModule: _FormsModule,
+      providers: [{
+        provide: CALL_SET_DISABLED_STATE,
+        useValue: opts.callSetDisabledState ?? setDisabledStateDefault
+      }]
+    };
+  }
+  static ɵfac = function FormsModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FormsModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _FormsModule,
+    declarations: [NgModel, NgModelGroup, NgForm],
+    exports: [ɵInternalFormsSharedModule, NgModel, NgModelGroup, NgForm]
+  });
+  static ɵinj = ɵɵdefineInjector({
+    imports: [ɵInternalFormsSharedModule]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FormsModule, [{
+    type: NgModule,
+    args: [{
+      declarations: TEMPLATE_DRIVEN_DIRECTIVES,
+      exports: [ɵInternalFormsSharedModule, TEMPLATE_DRIVEN_DIRECTIVES]
+    }]
+  }], null, null);
+})();
+var ReactiveFormsModule = class _ReactiveFormsModule {
+  /**
+   * @description
+   * Provides options for configuring the reactive forms module.
+   *
+   * @param opts An object of configuration options
+   * * `warnOnNgModelWithFormControl` Configures when to emit a warning when an `ngModel`
+   * binding is used with reactive form directives.
+   * * `callSetDisabledState` Configures whether to `always` call `setDisabledState`, which is more
+   * correct, or to only call it `whenDisabled`, which is the legacy behavior.
+   */
+  static withConfig(opts) {
+    return {
+      ngModule: _ReactiveFormsModule,
+      providers: [{
+        provide: NG_MODEL_WITH_FORM_CONTROL_WARNING,
+        useValue: opts.warnOnNgModelWithFormControl ?? "always"
+      }, {
+        provide: CALL_SET_DISABLED_STATE,
+        useValue: opts.callSetDisabledState ?? setDisabledStateDefault
+      }]
+    };
+  }
+  static ɵfac = function ReactiveFormsModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ReactiveFormsModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _ReactiveFormsModule,
+    declarations: [FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName],
+    exports: [ɵInternalFormsSharedModule, FormControlDirective, FormGroupDirective, FormControlName, FormGroupName, FormArrayName]
+  });
+  static ɵinj = ɵɵdefineInjector({
+    imports: [ɵInternalFormsSharedModule]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ReactiveFormsModule, [{
+    type: NgModule,
+    args: [{
+      declarations: [REACTIVE_DRIVEN_DIRECTIVES],
+      exports: [ɵInternalFormsSharedModule, REACTIVE_DRIVEN_DIRECTIVES]
+    }]
+  }], null, null);
+})();
+export {
+  AbstractControl,
+  AbstractControlDirective,
+  AbstractFormGroupDirective,
+  COMPOSITION_BUFFER_MODE,
+  CheckboxControlValueAccessor,
+  CheckboxRequiredValidator,
+  ControlContainer,
+  ControlEvent,
+  DefaultValueAccessor,
+  EmailValidator,
+  FormArray,
+  FormArrayName,
+  FormBuilder,
+  FormControl,
+  FormControlDirective,
+  FormControlName,
+  FormGroup,
+  FormGroupDirective,
+  FormGroupName,
+  FormRecord,
+  FormResetEvent,
+  FormSubmittedEvent,
+  FormsModule,
+  MaxLengthValidator,
+  MaxValidator,
+  MinLengthValidator,
+  MinValidator,
+  NG_ASYNC_VALIDATORS,
+  NG_VALIDATORS,
+  NG_VALUE_ACCESSOR,
+  NgControl,
+  NgControlStatus,
+  NgControlStatusGroup,
+  NgForm,
+  NgModel,
+  NgModelGroup,
+  NgSelectOption,
+  NonNullableFormBuilder,
+  NumberValueAccessor,
+  PatternValidator,
+  PristineChangeEvent,
+  RadioControlValueAccessor,
+  RangeValueAccessor,
+  ReactiveFormsModule,
+  RequiredValidator,
+  SelectControlValueAccessor,
+  SelectMultipleControlValueAccessor,
+  StatusChangeEvent,
+  TouchedChangeEvent,
+  UntypedFormArray,
+  UntypedFormBuilder,
+  UntypedFormControl,
+  UntypedFormGroup,
+  VERSION,
+  Validators,
+  ValueChangeEvent,
+  isFormArray,
+  isFormControl,
+  isFormGroup,
+  isFormRecord,
+  ɵInternalFormsSharedModule,
+  ɵNgNoValidate,
+  ɵNgSelectMultipleOption
+};
+/*! Bundled license information:
+
+@angular/forms/fesm2022/forms.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=@angular_forms.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/@angular_forms.js.map


+ 84 - 0
ai-interview/vite/deps/@angular_platform-browser.js

@@ -0,0 +1,84 @@
+import {
+  By,
+  DomSanitizer,
+  DomSanitizerImpl,
+  HAMMER_GESTURE_CONFIG,
+  HAMMER_LOADER,
+  HammerGestureConfig,
+  HammerGesturesPlugin,
+  HammerModule,
+  HydrationFeatureKind,
+  Meta,
+  Title,
+  VERSION,
+  disableDebugTools,
+  enableDebugTools,
+  provideClientHydration,
+  withEventReplay,
+  withHttpTransferCacheOptions,
+  withI18nSupport,
+  withIncrementalHydration,
+  withNoHttpTransferCache
+} from "./chunk-IA3W2FS3.js";
+import "./chunk-YWBOMLBY.js";
+import {
+  BrowserDomAdapter,
+  BrowserGetTestability,
+  BrowserModule,
+  DomEventsPlugin,
+  DomRendererFactory2,
+  EVENT_MANAGER_PLUGINS,
+  EventManager,
+  EventManagerPlugin,
+  KeyEventsPlugin,
+  REMOVE_STYLES_ON_COMPONENT_DESTROY,
+  SharedStylesHost,
+  bootstrapApplication,
+  createApplication,
+  platformBrowser,
+  provideProtractorTestingSupport
+} from "./chunk-NFFN32GK.js";
+import {
+  getDOM
+} from "./chunk-VHSNDQRF.js";
+import "./chunk-OPGNYZHR.js";
+import "./chunk-Y7NS2SYH.js";
+import "./chunk-WDMUDEB6.js";
+export {
+  BrowserModule,
+  By,
+  DomSanitizer,
+  EVENT_MANAGER_PLUGINS,
+  EventManager,
+  EventManagerPlugin,
+  HAMMER_GESTURE_CONFIG,
+  HAMMER_LOADER,
+  HammerGestureConfig,
+  HammerModule,
+  HydrationFeatureKind,
+  Meta,
+  REMOVE_STYLES_ON_COMPONENT_DESTROY,
+  Title,
+  VERSION,
+  bootstrapApplication,
+  createApplication,
+  disableDebugTools,
+  enableDebugTools,
+  platformBrowser,
+  provideClientHydration,
+  provideProtractorTestingSupport,
+  withEventReplay,
+  withHttpTransferCacheOptions,
+  withI18nSupport,
+  withIncrementalHydration,
+  withNoHttpTransferCache,
+  BrowserDomAdapter as ɵBrowserDomAdapter,
+  BrowserGetTestability as ɵBrowserGetTestability,
+  DomEventsPlugin as ɵDomEventsPlugin,
+  DomRendererFactory2 as ɵDomRendererFactory2,
+  DomSanitizerImpl as ɵDomSanitizerImpl,
+  HammerGesturesPlugin as ɵHammerGesturesPlugin,
+  KeyEventsPlugin as ɵKeyEventsPlugin,
+  SharedStylesHost as ɵSharedStylesHost,
+  getDOM as ɵgetDOM
+};

+ 7 - 0
ai-interview/vite/deps/@angular_platform-browser.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

+ 4630 - 0
ai-interview/vite/deps/@angular_platform-browser_animations.js

@@ -0,0 +1,4630 @@
+import {
+  BrowserModule,
+  DomRendererFactory2
+} from "./chunk-NFFN32GK.js";
+import "./chunk-VHSNDQRF.js";
+import "./chunk-OPGNYZHR.js";
+import {
+  ANIMATION_MODULE_TYPE,
+  DOCUMENT,
+  Inject,
+  Injectable,
+  NgModule,
+  NgZone,
+  RendererFactory2,
+  RuntimeError,
+  performanceMarkFeature,
+  setClassMetadata,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵinject
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __objRest,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/animations/fesm2022/private_export.mjs
+var AnimationMetadataType;
+(function(AnimationMetadataType2) {
+  AnimationMetadataType2[AnimationMetadataType2["State"] = 0] = "State";
+  AnimationMetadataType2[AnimationMetadataType2["Transition"] = 1] = "Transition";
+  AnimationMetadataType2[AnimationMetadataType2["Sequence"] = 2] = "Sequence";
+  AnimationMetadataType2[AnimationMetadataType2["Group"] = 3] = "Group";
+  AnimationMetadataType2[AnimationMetadataType2["Animate"] = 4] = "Animate";
+  AnimationMetadataType2[AnimationMetadataType2["Keyframes"] = 5] = "Keyframes";
+  AnimationMetadataType2[AnimationMetadataType2["Style"] = 6] = "Style";
+  AnimationMetadataType2[AnimationMetadataType2["Trigger"] = 7] = "Trigger";
+  AnimationMetadataType2[AnimationMetadataType2["Reference"] = 8] = "Reference";
+  AnimationMetadataType2[AnimationMetadataType2["AnimateChild"] = 9] = "AnimateChild";
+  AnimationMetadataType2[AnimationMetadataType2["AnimateRef"] = 10] = "AnimateRef";
+  AnimationMetadataType2[AnimationMetadataType2["Query"] = 11] = "Query";
+  AnimationMetadataType2[AnimationMetadataType2["Stagger"] = 12] = "Stagger";
+})(AnimationMetadataType || (AnimationMetadataType = {}));
+var AUTO_STYLE = "*";
+function sequence(steps, options = null) {
+  return { type: AnimationMetadataType.Sequence, steps, options };
+}
+function style(tokens) {
+  return { type: AnimationMetadataType.Style, styles: tokens, offset: null };
+}
+var NoopAnimationPlayer = class {
+  _onDoneFns = [];
+  _onStartFns = [];
+  _onDestroyFns = [];
+  _originalOnDoneFns = [];
+  _originalOnStartFns = [];
+  _started = false;
+  _destroyed = false;
+  _finished = false;
+  _position = 0;
+  parentPlayer = null;
+  totalTime;
+  constructor(duration = 0, delay = 0) {
+    this.totalTime = duration + delay;
+  }
+  _onFinish() {
+    if (!this._finished) {
+      this._finished = true;
+      this._onDoneFns.forEach((fn) => fn());
+      this._onDoneFns = [];
+    }
+  }
+  onStart(fn) {
+    this._originalOnStartFns.push(fn);
+    this._onStartFns.push(fn);
+  }
+  onDone(fn) {
+    this._originalOnDoneFns.push(fn);
+    this._onDoneFns.push(fn);
+  }
+  onDestroy(fn) {
+    this._onDestroyFns.push(fn);
+  }
+  hasStarted() {
+    return this._started;
+  }
+  init() {
+  }
+  play() {
+    if (!this.hasStarted()) {
+      this._onStart();
+      this.triggerMicrotask();
+    }
+    this._started = true;
+  }
+  /** @internal */
+  triggerMicrotask() {
+    queueMicrotask(() => this._onFinish());
+  }
+  _onStart() {
+    this._onStartFns.forEach((fn) => fn());
+    this._onStartFns = [];
+  }
+  pause() {
+  }
+  restart() {
+  }
+  finish() {
+    this._onFinish();
+  }
+  destroy() {
+    if (!this._destroyed) {
+      this._destroyed = true;
+      if (!this.hasStarted()) {
+        this._onStart();
+      }
+      this.finish();
+      this._onDestroyFns.forEach((fn) => fn());
+      this._onDestroyFns = [];
+    }
+  }
+  reset() {
+    this._started = false;
+    this._finished = false;
+    this._onStartFns = this._originalOnStartFns;
+    this._onDoneFns = this._originalOnDoneFns;
+  }
+  setPosition(position) {
+    this._position = this.totalTime ? position * this.totalTime : 1;
+  }
+  getPosition() {
+    return this.totalTime ? this._position / this.totalTime : 1;
+  }
+  /** @internal */
+  triggerCallback(phaseName) {
+    const methods = phaseName == "start" ? this._onStartFns : this._onDoneFns;
+    methods.forEach((fn) => fn());
+    methods.length = 0;
+  }
+};
+var AnimationGroupPlayer = class {
+  _onDoneFns = [];
+  _onStartFns = [];
+  _finished = false;
+  _started = false;
+  _destroyed = false;
+  _onDestroyFns = [];
+  parentPlayer = null;
+  totalTime = 0;
+  players;
+  constructor(_players) {
+    this.players = _players;
+    let doneCount = 0;
+    let destroyCount = 0;
+    let startCount = 0;
+    const total = this.players.length;
+    if (total == 0) {
+      queueMicrotask(() => this._onFinish());
+    } else {
+      this.players.forEach((player) => {
+        player.onDone(() => {
+          if (++doneCount == total) {
+            this._onFinish();
+          }
+        });
+        player.onDestroy(() => {
+          if (++destroyCount == total) {
+            this._onDestroy();
+          }
+        });
+        player.onStart(() => {
+          if (++startCount == total) {
+            this._onStart();
+          }
+        });
+      });
+    }
+    this.totalTime = this.players.reduce((time, player) => Math.max(time, player.totalTime), 0);
+  }
+  _onFinish() {
+    if (!this._finished) {
+      this._finished = true;
+      this._onDoneFns.forEach((fn) => fn());
+      this._onDoneFns = [];
+    }
+  }
+  init() {
+    this.players.forEach((player) => player.init());
+  }
+  onStart(fn) {
+    this._onStartFns.push(fn);
+  }
+  _onStart() {
+    if (!this.hasStarted()) {
+      this._started = true;
+      this._onStartFns.forEach((fn) => fn());
+      this._onStartFns = [];
+    }
+  }
+  onDone(fn) {
+    this._onDoneFns.push(fn);
+  }
+  onDestroy(fn) {
+    this._onDestroyFns.push(fn);
+  }
+  hasStarted() {
+    return this._started;
+  }
+  play() {
+    if (!this.parentPlayer) {
+      this.init();
+    }
+    this._onStart();
+    this.players.forEach((player) => player.play());
+  }
+  pause() {
+    this.players.forEach((player) => player.pause());
+  }
+  restart() {
+    this.players.forEach((player) => player.restart());
+  }
+  finish() {
+    this._onFinish();
+    this.players.forEach((player) => player.finish());
+  }
+  destroy() {
+    this._onDestroy();
+  }
+  _onDestroy() {
+    if (!this._destroyed) {
+      this._destroyed = true;
+      this._onFinish();
+      this.players.forEach((player) => player.destroy());
+      this._onDestroyFns.forEach((fn) => fn());
+      this._onDestroyFns = [];
+    }
+  }
+  reset() {
+    this.players.forEach((player) => player.reset());
+    this._destroyed = false;
+    this._finished = false;
+    this._started = false;
+  }
+  setPosition(p) {
+    const timeAtPosition = p * this.totalTime;
+    this.players.forEach((player) => {
+      const position = player.totalTime ? Math.min(1, timeAtPosition / player.totalTime) : 1;
+      player.setPosition(position);
+    });
+  }
+  getPosition() {
+    const longestPlayer = this.players.reduce((longestSoFar, player) => {
+      const newPlayerIsLongest = longestSoFar === null || player.totalTime > longestSoFar.totalTime;
+      return newPlayerIsLongest ? player : longestSoFar;
+    }, null);
+    return longestPlayer != null ? longestPlayer.getPosition() : 0;
+  }
+  beforeDestroy() {
+    this.players.forEach((player) => {
+      if (player.beforeDestroy) {
+        player.beforeDestroy();
+      }
+    });
+  }
+  /** @internal */
+  triggerCallback(phaseName) {
+    const methods = phaseName == "start" ? this._onStartFns : this._onDoneFns;
+    methods.forEach((fn) => fn());
+    methods.length = 0;
+  }
+};
+var ɵPRE_STYLE = "!";
+
+// node_modules/@angular/animations/fesm2022/util.mjs
+var LINE_START = "\n - ";
+function invalidTimingValue(exp) {
+  return new RuntimeError(3e3, ngDevMode && `The provided timing value "${exp}" is invalid.`);
+}
+function negativeStepValue() {
+  return new RuntimeError(3100, ngDevMode && "Duration values below 0 are not allowed for this animation step.");
+}
+function negativeDelayValue() {
+  return new RuntimeError(3101, ngDevMode && "Delay values below 0 are not allowed for this animation step.");
+}
+function invalidStyleParams(varName) {
+  return new RuntimeError(3001, ngDevMode && `Unable to resolve the local animation param ${varName} in the given list of values`);
+}
+function invalidParamValue(varName) {
+  return new RuntimeError(3003, ngDevMode && `Please provide a value for the animation param ${varName}`);
+}
+function invalidNodeType(nodeType) {
+  return new RuntimeError(3004, ngDevMode && `Unable to resolve animation metadata node #${nodeType}`);
+}
+function invalidCssUnitValue(userProvidedProperty, value) {
+  return new RuntimeError(3005, ngDevMode && `Please provide a CSS unit value for ${userProvidedProperty}:${value}`);
+}
+function invalidTrigger() {
+  return new RuntimeError(3006, ngDevMode && "animation triggers cannot be prefixed with an `@` sign (e.g. trigger('@foo', [...]))");
+}
+function invalidDefinition() {
+  return new RuntimeError(3007, ngDevMode && "only state() and transition() definitions can sit inside of a trigger()");
+}
+function invalidState(metadataName, missingSubs) {
+  return new RuntimeError(3008, ngDevMode && `state("${metadataName}", ...) must define default values for all the following style substitutions: ${missingSubs.join(", ")}`);
+}
+function invalidStyleValue(value) {
+  return new RuntimeError(3002, ngDevMode && `The provided style string value ${value} is not allowed.`);
+}
+function invalidParallelAnimation(prop, firstStart, firstEnd, secondStart, secondEnd) {
+  return new RuntimeError(3010, ngDevMode && `The CSS property "${prop}" that exists between the times of "${firstStart}ms" and "${firstEnd}ms" is also being animated in a parallel animation between the times of "${secondStart}ms" and "${secondEnd}ms"`);
+}
+function invalidKeyframes() {
+  return new RuntimeError(3011, ngDevMode && `keyframes() must be placed inside of a call to animate()`);
+}
+function invalidOffset() {
+  return new RuntimeError(3012, ngDevMode && `Please ensure that all keyframe offsets are between 0 and 1`);
+}
+function keyframeOffsetsOutOfOrder() {
+  return new RuntimeError(3200, ngDevMode && `Please ensure that all keyframe offsets are in order`);
+}
+function keyframesMissingOffsets() {
+  return new RuntimeError(3202, ngDevMode && `Not all style() steps within the declared keyframes() contain offsets`);
+}
+function invalidStagger() {
+  return new RuntimeError(3013, ngDevMode && `stagger() can only be used inside of query()`);
+}
+function invalidQuery(selector) {
+  return new RuntimeError(3014, ngDevMode && `\`query("${selector}")\` returned zero elements. (Use \`query("${selector}", { optional: true })\` if you wish to allow this.)`);
+}
+function invalidExpression(expr) {
+  return new RuntimeError(3015, ngDevMode && `The provided transition expression "${expr}" is not supported`);
+}
+function invalidTransitionAlias(alias) {
+  return new RuntimeError(3016, ngDevMode && `The transition alias value "${alias}" is not supported`);
+}
+function triggerBuildFailed(name, errors) {
+  return new RuntimeError(3404, ngDevMode && `The animation trigger "${name}" has failed to build due to the following errors:
+ - ${errors.map((err) => err.message).join("\n - ")}`);
+}
+function animationFailed(errors) {
+  return new RuntimeError(3502, ngDevMode && `Unable to animate due to the following errors:${LINE_START}${errors.map((err) => err.message).join(LINE_START)}`);
+}
+function registerFailed(errors) {
+  return new RuntimeError(3503, ngDevMode && `Unable to build the animation due to the following errors: ${errors.map((err) => err.message).join("\n")}`);
+}
+function missingOrDestroyedAnimation() {
+  return new RuntimeError(3300, ngDevMode && "The requested animation doesn't exist or has already been destroyed");
+}
+function createAnimationFailed(errors) {
+  return new RuntimeError(3504, ngDevMode && `Unable to create the animation due to the following errors:${errors.map((err) => err.message).join("\n")}`);
+}
+function missingPlayer(id) {
+  return new RuntimeError(3301, ngDevMode && `Unable to find the timeline player referenced by ${id}`);
+}
+function missingTrigger(phase, name) {
+  return new RuntimeError(3302, ngDevMode && `Unable to listen on the animation trigger event "${phase}" because the animation trigger "${name}" doesn't exist!`);
+}
+function missingEvent(name) {
+  return new RuntimeError(3303, ngDevMode && `Unable to listen on the animation trigger "${name}" because the provided event is undefined!`);
+}
+function unsupportedTriggerEvent(phase, name) {
+  return new RuntimeError(3400, ngDevMode && `The provided animation trigger event "${phase}" for the animation trigger "${name}" is not supported!`);
+}
+function unregisteredTrigger(name) {
+  return new RuntimeError(3401, ngDevMode && `The provided animation trigger "${name}" has not been registered!`);
+}
+function triggerTransitionsFailed(errors) {
+  return new RuntimeError(3402, ngDevMode && `Unable to process animations due to the following failed trigger transitions
+ ${errors.map((err) => err.message).join("\n")}`);
+}
+function transitionFailed(name, errors) {
+  return new RuntimeError(3505, ngDevMode && `@${name} has failed due to:
+ ${errors.map((err) => err.message).join("\n- ")}`);
+}
+var ANIMATABLE_PROP_SET = /* @__PURE__ */ new Set([
+  "-moz-outline-radius",
+  "-moz-outline-radius-bottomleft",
+  "-moz-outline-radius-bottomright",
+  "-moz-outline-radius-topleft",
+  "-moz-outline-radius-topright",
+  "-ms-grid-columns",
+  "-ms-grid-rows",
+  "-webkit-line-clamp",
+  "-webkit-text-fill-color",
+  "-webkit-text-stroke",
+  "-webkit-text-stroke-color",
+  "accent-color",
+  "all",
+  "backdrop-filter",
+  "background",
+  "background-color",
+  "background-position",
+  "background-size",
+  "block-size",
+  "border",
+  "border-block-end",
+  "border-block-end-color",
+  "border-block-end-width",
+  "border-block-start",
+  "border-block-start-color",
+  "border-block-start-width",
+  "border-bottom",
+  "border-bottom-color",
+  "border-bottom-left-radius",
+  "border-bottom-right-radius",
+  "border-bottom-width",
+  "border-color",
+  "border-end-end-radius",
+  "border-end-start-radius",
+  "border-image-outset",
+  "border-image-slice",
+  "border-image-width",
+  "border-inline-end",
+  "border-inline-end-color",
+  "border-inline-end-width",
+  "border-inline-start",
+  "border-inline-start-color",
+  "border-inline-start-width",
+  "border-left",
+  "border-left-color",
+  "border-left-width",
+  "border-radius",
+  "border-right",
+  "border-right-color",
+  "border-right-width",
+  "border-start-end-radius",
+  "border-start-start-radius",
+  "border-top",
+  "border-top-color",
+  "border-top-left-radius",
+  "border-top-right-radius",
+  "border-top-width",
+  "border-width",
+  "bottom",
+  "box-shadow",
+  "caret-color",
+  "clip",
+  "clip-path",
+  "color",
+  "column-count",
+  "column-gap",
+  "column-rule",
+  "column-rule-color",
+  "column-rule-width",
+  "column-width",
+  "columns",
+  "filter",
+  "flex",
+  "flex-basis",
+  "flex-grow",
+  "flex-shrink",
+  "font",
+  "font-size",
+  "font-size-adjust",
+  "font-stretch",
+  "font-variation-settings",
+  "font-weight",
+  "gap",
+  "grid-column-gap",
+  "grid-gap",
+  "grid-row-gap",
+  "grid-template-columns",
+  "grid-template-rows",
+  "height",
+  "inline-size",
+  "input-security",
+  "inset",
+  "inset-block",
+  "inset-block-end",
+  "inset-block-start",
+  "inset-inline",
+  "inset-inline-end",
+  "inset-inline-start",
+  "left",
+  "letter-spacing",
+  "line-clamp",
+  "line-height",
+  "margin",
+  "margin-block-end",
+  "margin-block-start",
+  "margin-bottom",
+  "margin-inline-end",
+  "margin-inline-start",
+  "margin-left",
+  "margin-right",
+  "margin-top",
+  "mask",
+  "mask-border",
+  "mask-position",
+  "mask-size",
+  "max-block-size",
+  "max-height",
+  "max-inline-size",
+  "max-lines",
+  "max-width",
+  "min-block-size",
+  "min-height",
+  "min-inline-size",
+  "min-width",
+  "object-position",
+  "offset",
+  "offset-anchor",
+  "offset-distance",
+  "offset-path",
+  "offset-position",
+  "offset-rotate",
+  "opacity",
+  "order",
+  "outline",
+  "outline-color",
+  "outline-offset",
+  "outline-width",
+  "padding",
+  "padding-block-end",
+  "padding-block-start",
+  "padding-bottom",
+  "padding-inline-end",
+  "padding-inline-start",
+  "padding-left",
+  "padding-right",
+  "padding-top",
+  "perspective",
+  "perspective-origin",
+  "right",
+  "rotate",
+  "row-gap",
+  "scale",
+  "scroll-margin",
+  "scroll-margin-block",
+  "scroll-margin-block-end",
+  "scroll-margin-block-start",
+  "scroll-margin-bottom",
+  "scroll-margin-inline",
+  "scroll-margin-inline-end",
+  "scroll-margin-inline-start",
+  "scroll-margin-left",
+  "scroll-margin-right",
+  "scroll-margin-top",
+  "scroll-padding",
+  "scroll-padding-block",
+  "scroll-padding-block-end",
+  "scroll-padding-block-start",
+  "scroll-padding-bottom",
+  "scroll-padding-inline",
+  "scroll-padding-inline-end",
+  "scroll-padding-inline-start",
+  "scroll-padding-left",
+  "scroll-padding-right",
+  "scroll-padding-top",
+  "scroll-snap-coordinate",
+  "scroll-snap-destination",
+  "scrollbar-color",
+  "shape-image-threshold",
+  "shape-margin",
+  "shape-outside",
+  "tab-size",
+  "text-decoration",
+  "text-decoration-color",
+  "text-decoration-thickness",
+  "text-emphasis",
+  "text-emphasis-color",
+  "text-indent",
+  "text-shadow",
+  "text-underline-offset",
+  "top",
+  "transform",
+  "transform-origin",
+  "translate",
+  "vertical-align",
+  "visibility",
+  "width",
+  "word-spacing",
+  "z-index",
+  "zoom"
+]);
+function optimizeGroupPlayer(players) {
+  switch (players.length) {
+    case 0:
+      return new NoopAnimationPlayer();
+    case 1:
+      return players[0];
+    default:
+      return new AnimationGroupPlayer(players);
+  }
+}
+function normalizeKeyframes$1(normalizer, keyframes, preStyles = /* @__PURE__ */ new Map(), postStyles = /* @__PURE__ */ new Map()) {
+  const errors = [];
+  const normalizedKeyframes = [];
+  let previousOffset = -1;
+  let previousKeyframe = null;
+  keyframes.forEach((kf) => {
+    const offset = kf.get("offset");
+    const isSameOffset = offset == previousOffset;
+    const normalizedKeyframe = isSameOffset && previousKeyframe || /* @__PURE__ */ new Map();
+    kf.forEach((val, prop) => {
+      let normalizedProp = prop;
+      let normalizedValue = val;
+      if (prop !== "offset") {
+        normalizedProp = normalizer.normalizePropertyName(normalizedProp, errors);
+        switch (normalizedValue) {
+          case ɵPRE_STYLE:
+            normalizedValue = preStyles.get(prop);
+            break;
+          case AUTO_STYLE:
+            normalizedValue = postStyles.get(prop);
+            break;
+          default:
+            normalizedValue = normalizer.normalizeStyleValue(prop, normalizedProp, normalizedValue, errors);
+            break;
+        }
+      }
+      normalizedKeyframe.set(normalizedProp, normalizedValue);
+    });
+    if (!isSameOffset) {
+      normalizedKeyframes.push(normalizedKeyframe);
+    }
+    previousKeyframe = normalizedKeyframe;
+    previousOffset = offset;
+  });
+  if (errors.length) {
+    throw animationFailed(errors);
+  }
+  return normalizedKeyframes;
+}
+function listenOnPlayer(player, eventName, event, callback) {
+  switch (eventName) {
+    case "start":
+      player.onStart(() => callback(event && copyAnimationEvent(event, "start", player)));
+      break;
+    case "done":
+      player.onDone(() => callback(event && copyAnimationEvent(event, "done", player)));
+      break;
+    case "destroy":
+      player.onDestroy(() => callback(event && copyAnimationEvent(event, "destroy", player)));
+      break;
+  }
+}
+function copyAnimationEvent(e, phaseName, player) {
+  const totalTime = player.totalTime;
+  const disabled = player.disabled ? true : false;
+  const event = makeAnimationEvent(e.element, e.triggerName, e.fromState, e.toState, phaseName || e.phaseName, totalTime == void 0 ? e.totalTime : totalTime, disabled);
+  const data = e["_data"];
+  if (data != null) {
+    event["_data"] = data;
+  }
+  return event;
+}
+function makeAnimationEvent(element, triggerName, fromState, toState, phaseName = "", totalTime = 0, disabled) {
+  return { element, triggerName, fromState, toState, phaseName, totalTime, disabled: !!disabled };
+}
+function getOrSetDefaultValue(map, key, defaultValue) {
+  let value = map.get(key);
+  if (!value) {
+    map.set(key, value = defaultValue);
+  }
+  return value;
+}
+function parseTimelineCommand(command) {
+  const separatorPos = command.indexOf(":");
+  const id = command.substring(1, separatorPos);
+  const action = command.slice(separatorPos + 1);
+  return [id, action];
+}
+var documentElement = (() => typeof document === "undefined" ? null : document.documentElement)();
+function getParentElement(element) {
+  const parent = element.parentNode || element.host || null;
+  if (parent === documentElement) {
+    return null;
+  }
+  return parent;
+}
+function containsVendorPrefix(prop) {
+  return prop.substring(1, 6) == "ebkit";
+}
+var _CACHED_BODY = null;
+var _IS_WEBKIT = false;
+function validateStyleProperty(prop) {
+  if (!_CACHED_BODY) {
+    _CACHED_BODY = getBodyNode() || {};
+    _IS_WEBKIT = _CACHED_BODY.style ? "WebkitAppearance" in _CACHED_BODY.style : false;
+  }
+  let result = true;
+  if (_CACHED_BODY.style && !containsVendorPrefix(prop)) {
+    result = prop in _CACHED_BODY.style;
+    if (!result && _IS_WEBKIT) {
+      const camelProp = "Webkit" + prop.charAt(0).toUpperCase() + prop.slice(1);
+      result = camelProp in _CACHED_BODY.style;
+    }
+  }
+  return result;
+}
+function validateWebAnimatableStyleProperty(prop) {
+  return ANIMATABLE_PROP_SET.has(prop);
+}
+function getBodyNode() {
+  if (typeof document != "undefined") {
+    return document.body;
+  }
+  return null;
+}
+function containsElement(elm1, elm2) {
+  while (elm2) {
+    if (elm2 === elm1) {
+      return true;
+    }
+    elm2 = getParentElement(elm2);
+  }
+  return false;
+}
+function invokeQuery(element, selector, multi) {
+  if (multi) {
+    return Array.from(element.querySelectorAll(selector));
+  }
+  const elem = element.querySelector(selector);
+  return elem ? [elem] : [];
+}
+var ONE_SECOND = 1e3;
+var SUBSTITUTION_EXPR_START = "{{";
+var SUBSTITUTION_EXPR_END = "}}";
+var ENTER_CLASSNAME = "ng-enter";
+var LEAVE_CLASSNAME = "ng-leave";
+var NG_TRIGGER_CLASSNAME = "ng-trigger";
+var NG_TRIGGER_SELECTOR = ".ng-trigger";
+var NG_ANIMATING_CLASSNAME = "ng-animating";
+var NG_ANIMATING_SELECTOR = ".ng-animating";
+function resolveTimingValue(value) {
+  if (typeof value == "number")
+    return value;
+  const matches = value.match(/^(-?[\.\d]+)(m?s)/);
+  if (!matches || matches.length < 2)
+    return 0;
+  return _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
+}
+function _convertTimeValueToMS(value, unit) {
+  switch (unit) {
+    case "s":
+      return value * ONE_SECOND;
+    default:
+      return value;
+  }
+}
+function resolveTiming(timings, errors, allowNegativeValues) {
+  return timings.hasOwnProperty("duration") ? timings : parseTimeExpression(timings, errors, allowNegativeValues);
+}
+function parseTimeExpression(exp, errors, allowNegativeValues) {
+  const regex = /^(-?[\.\d]+)(m?s)(?:\s+(-?[\.\d]+)(m?s))?(?:\s+([-a-z]+(?:\(.+?\))?))?$/i;
+  let duration;
+  let delay = 0;
+  let easing = "";
+  if (typeof exp === "string") {
+    const matches = exp.match(regex);
+    if (matches === null) {
+      errors.push(invalidTimingValue(exp));
+      return { duration: 0, delay: 0, easing: "" };
+    }
+    duration = _convertTimeValueToMS(parseFloat(matches[1]), matches[2]);
+    const delayMatch = matches[3];
+    if (delayMatch != null) {
+      delay = _convertTimeValueToMS(parseFloat(delayMatch), matches[4]);
+    }
+    const easingVal = matches[5];
+    if (easingVal) {
+      easing = easingVal;
+    }
+  } else {
+    duration = exp;
+  }
+  if (!allowNegativeValues) {
+    let containsErrors = false;
+    let startIndex = errors.length;
+    if (duration < 0) {
+      errors.push(negativeStepValue());
+      containsErrors = true;
+    }
+    if (delay < 0) {
+      errors.push(negativeDelayValue());
+      containsErrors = true;
+    }
+    if (containsErrors) {
+      errors.splice(startIndex, 0, invalidTimingValue(exp));
+    }
+  }
+  return { duration, delay, easing };
+}
+function normalizeKeyframes(keyframes) {
+  if (!keyframes.length) {
+    return [];
+  }
+  if (keyframes[0] instanceof Map) {
+    return keyframes;
+  }
+  return keyframes.map((kf) => new Map(Object.entries(kf)));
+}
+function setStyles(element, styles, formerStyles) {
+  styles.forEach((val, prop) => {
+    const camelProp = dashCaseToCamelCase(prop);
+    if (formerStyles && !formerStyles.has(prop)) {
+      formerStyles.set(prop, element.style[camelProp]);
+    }
+    element.style[camelProp] = val;
+  });
+}
+function eraseStyles(element, styles) {
+  styles.forEach((_, prop) => {
+    const camelProp = dashCaseToCamelCase(prop);
+    element.style[camelProp] = "";
+  });
+}
+function normalizeAnimationEntry(steps) {
+  if (Array.isArray(steps)) {
+    if (steps.length == 1)
+      return steps[0];
+    return sequence(steps);
+  }
+  return steps;
+}
+function validateStyleParams(value, options, errors) {
+  const params = options.params || {};
+  const matches = extractStyleParams(value);
+  if (matches.length) {
+    matches.forEach((varName) => {
+      if (!params.hasOwnProperty(varName)) {
+        errors.push(invalidStyleParams(varName));
+      }
+    });
+  }
+}
+var PARAM_REGEX = new RegExp(`${SUBSTITUTION_EXPR_START}\\s*(.+?)\\s*${SUBSTITUTION_EXPR_END}`, "g");
+function extractStyleParams(value) {
+  let params = [];
+  if (typeof value === "string") {
+    let match;
+    while (match = PARAM_REGEX.exec(value)) {
+      params.push(match[1]);
+    }
+    PARAM_REGEX.lastIndex = 0;
+  }
+  return params;
+}
+function interpolateParams(value, params, errors) {
+  const original = `${value}`;
+  const str = original.replace(PARAM_REGEX, (_, varName) => {
+    let localVal = params[varName];
+    if (localVal == null) {
+      errors.push(invalidParamValue(varName));
+      localVal = "";
+    }
+    return localVal.toString();
+  });
+  return str == original ? value : str;
+}
+var DASH_CASE_REGEXP = /-+([a-z0-9])/g;
+function dashCaseToCamelCase(input) {
+  return input.replace(DASH_CASE_REGEXP, (...m) => m[1].toUpperCase());
+}
+function camelCaseToDashCase(input) {
+  return input.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase();
+}
+function allowPreviousPlayerStylesMerge(duration, delay) {
+  return duration === 0 || delay === 0;
+}
+function balancePreviousStylesIntoKeyframes(element, keyframes, previousStyles) {
+  if (previousStyles.size && keyframes.length) {
+    let startingKeyframe = keyframes[0];
+    let missingStyleProps = [];
+    previousStyles.forEach((val, prop) => {
+      if (!startingKeyframe.has(prop)) {
+        missingStyleProps.push(prop);
+      }
+      startingKeyframe.set(prop, val);
+    });
+    if (missingStyleProps.length) {
+      for (let i = 1; i < keyframes.length; i++) {
+        let kf = keyframes[i];
+        missingStyleProps.forEach((prop) => kf.set(prop, computeStyle(element, prop)));
+      }
+    }
+  }
+  return keyframes;
+}
+function visitDslNode(visitor, node, context) {
+  switch (node.type) {
+    case AnimationMetadataType.Trigger:
+      return visitor.visitTrigger(node, context);
+    case AnimationMetadataType.State:
+      return visitor.visitState(node, context);
+    case AnimationMetadataType.Transition:
+      return visitor.visitTransition(node, context);
+    case AnimationMetadataType.Sequence:
+      return visitor.visitSequence(node, context);
+    case AnimationMetadataType.Group:
+      return visitor.visitGroup(node, context);
+    case AnimationMetadataType.Animate:
+      return visitor.visitAnimate(node, context);
+    case AnimationMetadataType.Keyframes:
+      return visitor.visitKeyframes(node, context);
+    case AnimationMetadataType.Style:
+      return visitor.visitStyle(node, context);
+    case AnimationMetadataType.Reference:
+      return visitor.visitReference(node, context);
+    case AnimationMetadataType.AnimateChild:
+      return visitor.visitAnimateChild(node, context);
+    case AnimationMetadataType.AnimateRef:
+      return visitor.visitAnimateRef(node, context);
+    case AnimationMetadataType.Query:
+      return visitor.visitQuery(node, context);
+    case AnimationMetadataType.Stagger:
+      return visitor.visitStagger(node, context);
+    default:
+      throw invalidNodeType(node.type);
+  }
+}
+function computeStyle(element, prop) {
+  return window.getComputedStyle(element)[prop];
+}
+
+// node_modules/@angular/animations/fesm2022/browser.mjs
+var NoopAnimationDriver = class _NoopAnimationDriver {
+  /**
+   * @returns Whether `prop` is a valid CSS property
+   */
+  validateStyleProperty(prop) {
+    return validateStyleProperty(prop);
+  }
+  /**
+   *
+   * @returns Whether elm1 contains elm2.
+   */
+  containsElement(elm1, elm2) {
+    return containsElement(elm1, elm2);
+  }
+  /**
+   * @returns Rhe parent of the given element or `null` if the element is the `document`
+   */
+  getParentElement(element) {
+    return getParentElement(element);
+  }
+  /**
+   * @returns The result of the query selector on the element. The array will contain up to 1 item
+   *     if `multi` is  `false`.
+   */
+  query(element, selector, multi) {
+    return invokeQuery(element, selector, multi);
+  }
+  /**
+   * @returns The `defaultValue` or empty string
+   */
+  computeStyle(element, prop, defaultValue) {
+    return defaultValue || "";
+  }
+  /**
+   * @returns An `NoopAnimationPlayer`
+   */
+  animate(element, keyframes, duration, delay, easing, previousPlayers = [], scrubberAccessRequested) {
+    return new NoopAnimationPlayer(duration, delay);
+  }
+  static ɵfac = function NoopAnimationDriver_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NoopAnimationDriver)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _NoopAnimationDriver,
+    factory: _NoopAnimationDriver.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NoopAnimationDriver, [{
+    type: Injectable
+  }], null, null);
+})();
+var AnimationDriver = class {
+  /**
+   * @deprecated Use the NoopAnimationDriver class.
+   */
+  static NOOP = new NoopAnimationDriver();
+};
+var AnimationStyleNormalizer = class {
+};
+var DIMENSIONAL_PROP_SET = /* @__PURE__ */ new Set(["width", "height", "minWidth", "minHeight", "maxWidth", "maxHeight", "left", "top", "bottom", "right", "fontSize", "outlineWidth", "outlineOffset", "paddingTop", "paddingLeft", "paddingBottom", "paddingRight", "marginTop", "marginLeft", "marginBottom", "marginRight", "borderRadius", "borderWidth", "borderTopWidth", "borderLeftWidth", "borderRightWidth", "borderBottomWidth", "textIndent", "perspective"]);
+var WebAnimationsStyleNormalizer = class extends AnimationStyleNormalizer {
+  normalizePropertyName(propertyName, errors) {
+    return dashCaseToCamelCase(propertyName);
+  }
+  normalizeStyleValue(userProvidedProperty, normalizedProperty, value, errors) {
+    let unit = "";
+    const strVal = value.toString().trim();
+    if (DIMENSIONAL_PROP_SET.has(normalizedProperty) && value !== 0 && value !== "0") {
+      if (typeof value === "number") {
+        unit = "px";
+      } else {
+        const valAndSuffixMatch = value.match(/^[+-]?[\d\.]+([a-z]*)$/);
+        if (valAndSuffixMatch && valAndSuffixMatch[1].length == 0) {
+          errors.push(invalidCssUnitValue(userProvidedProperty, value));
+        }
+      }
+    }
+    return strVal + unit;
+  }
+};
+function createListOfWarnings(warnings) {
+  const LINE_START2 = "\n - ";
+  return `${LINE_START2}${warnings.filter(Boolean).map((warning) => warning).join(LINE_START2)}`;
+}
+function warnTriggerBuild(name, warnings) {
+  console.warn(`The animation trigger "${name}" has built with the following warnings:${createListOfWarnings(warnings)}`);
+}
+function warnRegister(warnings) {
+  console.warn(`Animation built with the following warnings:${createListOfWarnings(warnings)}`);
+}
+function pushUnrecognizedPropertiesWarning(warnings, props) {
+  if (props.length) {
+    warnings.push(`The following provided properties are not recognized: ${props.join(", ")}`);
+  }
+}
+var ANY_STATE = "*";
+function parseTransitionExpr(transitionValue, errors) {
+  const expressions = [];
+  if (typeof transitionValue == "string") {
+    transitionValue.split(/\s*,\s*/).forEach((str) => parseInnerTransitionStr(str, expressions, errors));
+  } else {
+    expressions.push(transitionValue);
+  }
+  return expressions;
+}
+function parseInnerTransitionStr(eventStr, expressions, errors) {
+  if (eventStr[0] == ":") {
+    const result = parseAnimationAlias(eventStr, errors);
+    if (typeof result == "function") {
+      expressions.push(result);
+      return;
+    }
+    eventStr = result;
+  }
+  const match = eventStr.match(/^(\*|[-\w]+)\s*(<?[=-]>)\s*(\*|[-\w]+)$/);
+  if (match == null || match.length < 4) {
+    errors.push(invalidExpression(eventStr));
+    return expressions;
+  }
+  const fromState = match[1];
+  const separator = match[2];
+  const toState = match[3];
+  expressions.push(makeLambdaFromStates(fromState, toState));
+  const isFullAnyStateExpr = fromState == ANY_STATE && toState == ANY_STATE;
+  if (separator[0] == "<" && !isFullAnyStateExpr) {
+    expressions.push(makeLambdaFromStates(toState, fromState));
+  }
+  return;
+}
+function parseAnimationAlias(alias, errors) {
+  switch (alias) {
+    case ":enter":
+      return "void => *";
+    case ":leave":
+      return "* => void";
+    case ":increment":
+      return (fromState, toState) => parseFloat(toState) > parseFloat(fromState);
+    case ":decrement":
+      return (fromState, toState) => parseFloat(toState) < parseFloat(fromState);
+    default:
+      errors.push(invalidTransitionAlias(alias));
+      return "* => *";
+  }
+}
+var TRUE_BOOLEAN_VALUES = /* @__PURE__ */ new Set(["true", "1"]);
+var FALSE_BOOLEAN_VALUES = /* @__PURE__ */ new Set(["false", "0"]);
+function makeLambdaFromStates(lhs, rhs) {
+  const LHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(lhs) || FALSE_BOOLEAN_VALUES.has(lhs);
+  const RHS_MATCH_BOOLEAN = TRUE_BOOLEAN_VALUES.has(rhs) || FALSE_BOOLEAN_VALUES.has(rhs);
+  return (fromState, toState) => {
+    let lhsMatch = lhs == ANY_STATE || lhs == fromState;
+    let rhsMatch = rhs == ANY_STATE || rhs == toState;
+    if (!lhsMatch && LHS_MATCH_BOOLEAN && typeof fromState === "boolean") {
+      lhsMatch = fromState ? TRUE_BOOLEAN_VALUES.has(lhs) : FALSE_BOOLEAN_VALUES.has(lhs);
+    }
+    if (!rhsMatch && RHS_MATCH_BOOLEAN && typeof toState === "boolean") {
+      rhsMatch = toState ? TRUE_BOOLEAN_VALUES.has(rhs) : FALSE_BOOLEAN_VALUES.has(rhs);
+    }
+    return lhsMatch && rhsMatch;
+  };
+}
+var SELF_TOKEN = ":self";
+var SELF_TOKEN_REGEX = new RegExp(`s*${SELF_TOKEN}s*,?`, "g");
+function buildAnimationAst(driver, metadata, errors, warnings) {
+  return new AnimationAstBuilderVisitor(driver).build(metadata, errors, warnings);
+}
+var ROOT_SELECTOR = "";
+var AnimationAstBuilderVisitor = class {
+  _driver;
+  constructor(_driver) {
+    this._driver = _driver;
+  }
+  build(metadata, errors, warnings) {
+    const context = new AnimationAstBuilderContext(errors);
+    this._resetContextStyleTimingState(context);
+    const ast = visitDslNode(this, normalizeAnimationEntry(metadata), context);
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      if (context.unsupportedCSSPropertiesFound.size) {
+        pushUnrecognizedPropertiesWarning(warnings, [...context.unsupportedCSSPropertiesFound.keys()]);
+      }
+    }
+    return ast;
+  }
+  _resetContextStyleTimingState(context) {
+    context.currentQuerySelector = ROOT_SELECTOR;
+    context.collectedStyles = /* @__PURE__ */ new Map();
+    context.collectedStyles.set(ROOT_SELECTOR, /* @__PURE__ */ new Map());
+    context.currentTime = 0;
+  }
+  visitTrigger(metadata, context) {
+    let queryCount = context.queryCount = 0;
+    let depCount = context.depCount = 0;
+    const states = [];
+    const transitions = [];
+    if (metadata.name.charAt(0) == "@") {
+      context.errors.push(invalidTrigger());
+    }
+    metadata.definitions.forEach((def) => {
+      this._resetContextStyleTimingState(context);
+      if (def.type == AnimationMetadataType.State) {
+        const stateDef = def;
+        const name = stateDef.name;
+        name.toString().split(/\s*,\s*/).forEach((n) => {
+          stateDef.name = n;
+          states.push(this.visitState(stateDef, context));
+        });
+        stateDef.name = name;
+      } else if (def.type == AnimationMetadataType.Transition) {
+        const transition = this.visitTransition(def, context);
+        queryCount += transition.queryCount;
+        depCount += transition.depCount;
+        transitions.push(transition);
+      } else {
+        context.errors.push(invalidDefinition());
+      }
+    });
+    return {
+      type: AnimationMetadataType.Trigger,
+      name: metadata.name,
+      states,
+      transitions,
+      queryCount,
+      depCount,
+      options: null
+    };
+  }
+  visitState(metadata, context) {
+    const styleAst = this.visitStyle(metadata.styles, context);
+    const astParams = metadata.options && metadata.options.params || null;
+    if (styleAst.containsDynamicStyles) {
+      const missingSubs = /* @__PURE__ */ new Set();
+      const params = astParams || {};
+      styleAst.styles.forEach((style2) => {
+        if (style2 instanceof Map) {
+          style2.forEach((value) => {
+            extractStyleParams(value).forEach((sub) => {
+              if (!params.hasOwnProperty(sub)) {
+                missingSubs.add(sub);
+              }
+            });
+          });
+        }
+      });
+      if (missingSubs.size) {
+        context.errors.push(invalidState(metadata.name, [...missingSubs.values()]));
+      }
+    }
+    return {
+      type: AnimationMetadataType.State,
+      name: metadata.name,
+      style: styleAst,
+      options: astParams ? {
+        params: astParams
+      } : null
+    };
+  }
+  visitTransition(metadata, context) {
+    context.queryCount = 0;
+    context.depCount = 0;
+    const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);
+    const matchers = parseTransitionExpr(metadata.expr, context.errors);
+    return {
+      type: AnimationMetadataType.Transition,
+      matchers,
+      animation,
+      queryCount: context.queryCount,
+      depCount: context.depCount,
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitSequence(metadata, context) {
+    return {
+      type: AnimationMetadataType.Sequence,
+      steps: metadata.steps.map((s) => visitDslNode(this, s, context)),
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitGroup(metadata, context) {
+    const currentTime = context.currentTime;
+    let furthestTime = 0;
+    const steps = metadata.steps.map((step) => {
+      context.currentTime = currentTime;
+      const innerAst = visitDslNode(this, step, context);
+      furthestTime = Math.max(furthestTime, context.currentTime);
+      return innerAst;
+    });
+    context.currentTime = furthestTime;
+    return {
+      type: AnimationMetadataType.Group,
+      steps,
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitAnimate(metadata, context) {
+    const timingAst = constructTimingAst(metadata.timings, context.errors);
+    context.currentAnimateTimings = timingAst;
+    let styleAst;
+    let styleMetadata = metadata.styles ? metadata.styles : style({});
+    if (styleMetadata.type == AnimationMetadataType.Keyframes) {
+      styleAst = this.visitKeyframes(styleMetadata, context);
+    } else {
+      let styleMetadata2 = metadata.styles;
+      let isEmpty = false;
+      if (!styleMetadata2) {
+        isEmpty = true;
+        const newStyleData = {};
+        if (timingAst.easing) {
+          newStyleData["easing"] = timingAst.easing;
+        }
+        styleMetadata2 = style(newStyleData);
+      }
+      context.currentTime += timingAst.duration + timingAst.delay;
+      const _styleAst = this.visitStyle(styleMetadata2, context);
+      _styleAst.isEmptyStep = isEmpty;
+      styleAst = _styleAst;
+    }
+    context.currentAnimateTimings = null;
+    return {
+      type: AnimationMetadataType.Animate,
+      timings: timingAst,
+      style: styleAst,
+      options: null
+    };
+  }
+  visitStyle(metadata, context) {
+    const ast = this._makeStyleAst(metadata, context);
+    this._validateStyleAst(ast, context);
+    return ast;
+  }
+  _makeStyleAst(metadata, context) {
+    const styles = [];
+    const metadataStyles = Array.isArray(metadata.styles) ? metadata.styles : [metadata.styles];
+    for (let styleTuple of metadataStyles) {
+      if (typeof styleTuple === "string") {
+        if (styleTuple === AUTO_STYLE) {
+          styles.push(styleTuple);
+        } else {
+          context.errors.push(invalidStyleValue(styleTuple));
+        }
+      } else {
+        styles.push(new Map(Object.entries(styleTuple)));
+      }
+    }
+    let containsDynamicStyles = false;
+    let collectedEasing = null;
+    styles.forEach((styleData) => {
+      if (styleData instanceof Map) {
+        if (styleData.has("easing")) {
+          collectedEasing = styleData.get("easing");
+          styleData.delete("easing");
+        }
+        if (!containsDynamicStyles) {
+          for (let value of styleData.values()) {
+            if (value.toString().indexOf(SUBSTITUTION_EXPR_START) >= 0) {
+              containsDynamicStyles = true;
+              break;
+            }
+          }
+        }
+      }
+    });
+    return {
+      type: AnimationMetadataType.Style,
+      styles,
+      easing: collectedEasing,
+      offset: metadata.offset,
+      containsDynamicStyles,
+      options: null
+    };
+  }
+  _validateStyleAst(ast, context) {
+    const timings = context.currentAnimateTimings;
+    let endTime = context.currentTime;
+    let startTime = context.currentTime;
+    if (timings && startTime > 0) {
+      startTime -= timings.duration + timings.delay;
+    }
+    ast.styles.forEach((tuple) => {
+      if (typeof tuple === "string") return;
+      tuple.forEach((value, prop) => {
+        if (typeof ngDevMode === "undefined" || ngDevMode) {
+          if (!this._driver.validateStyleProperty(prop)) {
+            tuple.delete(prop);
+            context.unsupportedCSSPropertiesFound.add(prop);
+            return;
+          }
+        }
+        const collectedStyles = context.collectedStyles.get(context.currentQuerySelector);
+        const collectedEntry = collectedStyles.get(prop);
+        let updateCollectedStyle = true;
+        if (collectedEntry) {
+          if (startTime != endTime && startTime >= collectedEntry.startTime && endTime <= collectedEntry.endTime) {
+            context.errors.push(invalidParallelAnimation(prop, collectedEntry.startTime, collectedEntry.endTime, startTime, endTime));
+            updateCollectedStyle = false;
+          }
+          startTime = collectedEntry.startTime;
+        }
+        if (updateCollectedStyle) {
+          collectedStyles.set(prop, {
+            startTime,
+            endTime
+          });
+        }
+        if (context.options) {
+          validateStyleParams(value, context.options, context.errors);
+        }
+      });
+    });
+  }
+  visitKeyframes(metadata, context) {
+    const ast = {
+      type: AnimationMetadataType.Keyframes,
+      styles: [],
+      options: null
+    };
+    if (!context.currentAnimateTimings) {
+      context.errors.push(invalidKeyframes());
+      return ast;
+    }
+    const MAX_KEYFRAME_OFFSET = 1;
+    let totalKeyframesWithOffsets = 0;
+    const offsets = [];
+    let offsetsOutOfOrder = false;
+    let keyframesOutOfRange = false;
+    let previousOffset = 0;
+    const keyframes = metadata.steps.map((styles) => {
+      const style2 = this._makeStyleAst(styles, context);
+      let offsetVal = style2.offset != null ? style2.offset : consumeOffset(style2.styles);
+      let offset = 0;
+      if (offsetVal != null) {
+        totalKeyframesWithOffsets++;
+        offset = style2.offset = offsetVal;
+      }
+      keyframesOutOfRange = keyframesOutOfRange || offset < 0 || offset > 1;
+      offsetsOutOfOrder = offsetsOutOfOrder || offset < previousOffset;
+      previousOffset = offset;
+      offsets.push(offset);
+      return style2;
+    });
+    if (keyframesOutOfRange) {
+      context.errors.push(invalidOffset());
+    }
+    if (offsetsOutOfOrder) {
+      context.errors.push(keyframeOffsetsOutOfOrder());
+    }
+    const length = metadata.steps.length;
+    let generatedOffset = 0;
+    if (totalKeyframesWithOffsets > 0 && totalKeyframesWithOffsets < length) {
+      context.errors.push(keyframesMissingOffsets());
+    } else if (totalKeyframesWithOffsets == 0) {
+      generatedOffset = MAX_KEYFRAME_OFFSET / (length - 1);
+    }
+    const limit = length - 1;
+    const currentTime = context.currentTime;
+    const currentAnimateTimings = context.currentAnimateTimings;
+    const animateDuration = currentAnimateTimings.duration;
+    keyframes.forEach((kf, i) => {
+      const offset = generatedOffset > 0 ? i == limit ? 1 : generatedOffset * i : offsets[i];
+      const durationUpToThisFrame = offset * animateDuration;
+      context.currentTime = currentTime + currentAnimateTimings.delay + durationUpToThisFrame;
+      currentAnimateTimings.duration = durationUpToThisFrame;
+      this._validateStyleAst(kf, context);
+      kf.offset = offset;
+      ast.styles.push(kf);
+    });
+    return ast;
+  }
+  visitReference(metadata, context) {
+    return {
+      type: AnimationMetadataType.Reference,
+      animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context),
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitAnimateChild(metadata, context) {
+    context.depCount++;
+    return {
+      type: AnimationMetadataType.AnimateChild,
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitAnimateRef(metadata, context) {
+    return {
+      type: AnimationMetadataType.AnimateRef,
+      animation: this.visitReference(metadata.animation, context),
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitQuery(metadata, context) {
+    const parentSelector = context.currentQuerySelector;
+    const options = metadata.options || {};
+    context.queryCount++;
+    context.currentQuery = metadata;
+    const [selector, includeSelf] = normalizeSelector(metadata.selector);
+    context.currentQuerySelector = parentSelector.length ? parentSelector + " " + selector : selector;
+    getOrSetDefaultValue(context.collectedStyles, context.currentQuerySelector, /* @__PURE__ */ new Map());
+    const animation = visitDslNode(this, normalizeAnimationEntry(metadata.animation), context);
+    context.currentQuery = null;
+    context.currentQuerySelector = parentSelector;
+    return {
+      type: AnimationMetadataType.Query,
+      selector,
+      limit: options.limit || 0,
+      optional: !!options.optional,
+      includeSelf,
+      animation,
+      originalSelector: metadata.selector,
+      options: normalizeAnimationOptions(metadata.options)
+    };
+  }
+  visitStagger(metadata, context) {
+    if (!context.currentQuery) {
+      context.errors.push(invalidStagger());
+    }
+    const timings = metadata.timings === "full" ? {
+      duration: 0,
+      delay: 0,
+      easing: "full"
+    } : resolveTiming(metadata.timings, context.errors, true);
+    return {
+      type: AnimationMetadataType.Stagger,
+      animation: visitDslNode(this, normalizeAnimationEntry(metadata.animation), context),
+      timings,
+      options: null
+    };
+  }
+};
+function normalizeSelector(selector) {
+  const hasAmpersand = selector.split(/\s*,\s*/).find((token) => token == SELF_TOKEN) ? true : false;
+  if (hasAmpersand) {
+    selector = selector.replace(SELF_TOKEN_REGEX, "");
+  }
+  selector = selector.replace(/@\*/g, NG_TRIGGER_SELECTOR).replace(/@\w+/g, (match) => NG_TRIGGER_SELECTOR + "-" + match.slice(1)).replace(/:animating/g, NG_ANIMATING_SELECTOR);
+  return [selector, hasAmpersand];
+}
+function normalizeParams(obj) {
+  return obj ? __spreadValues({}, obj) : null;
+}
+var AnimationAstBuilderContext = class {
+  errors;
+  queryCount = 0;
+  depCount = 0;
+  currentTransition = null;
+  currentQuery = null;
+  currentQuerySelector = null;
+  currentAnimateTimings = null;
+  currentTime = 0;
+  collectedStyles = /* @__PURE__ */ new Map();
+  options = null;
+  unsupportedCSSPropertiesFound = /* @__PURE__ */ new Set();
+  constructor(errors) {
+    this.errors = errors;
+  }
+};
+function consumeOffset(styles) {
+  if (typeof styles == "string") return null;
+  let offset = null;
+  if (Array.isArray(styles)) {
+    styles.forEach((styleTuple) => {
+      if (styleTuple instanceof Map && styleTuple.has("offset")) {
+        const obj = styleTuple;
+        offset = parseFloat(obj.get("offset"));
+        obj.delete("offset");
+      }
+    });
+  } else if (styles instanceof Map && styles.has("offset")) {
+    const obj = styles;
+    offset = parseFloat(obj.get("offset"));
+    obj.delete("offset");
+  }
+  return offset;
+}
+function constructTimingAst(value, errors) {
+  if (value.hasOwnProperty("duration")) {
+    return value;
+  }
+  if (typeof value == "number") {
+    const duration = resolveTiming(value, errors).duration;
+    return makeTimingAst(duration, 0, "");
+  }
+  const strValue = value;
+  const isDynamic = strValue.split(/\s+/).some((v) => v.charAt(0) == "{" && v.charAt(1) == "{");
+  if (isDynamic) {
+    const ast = makeTimingAst(0, 0, "");
+    ast.dynamic = true;
+    ast.strValue = strValue;
+    return ast;
+  }
+  const timings = resolveTiming(strValue, errors);
+  return makeTimingAst(timings.duration, timings.delay, timings.easing);
+}
+function normalizeAnimationOptions(options) {
+  if (options) {
+    options = __spreadValues({}, options);
+    if (options["params"]) {
+      options["params"] = normalizeParams(options["params"]);
+    }
+  } else {
+    options = {};
+  }
+  return options;
+}
+function makeTimingAst(duration, delay, easing) {
+  return {
+    duration,
+    delay,
+    easing
+  };
+}
+function createTimelineInstruction(element, keyframes, preStyleProps, postStyleProps, duration, delay, easing = null, subTimeline = false) {
+  return {
+    type: 1,
+    element,
+    keyframes,
+    preStyleProps,
+    postStyleProps,
+    duration,
+    delay,
+    totalTime: duration + delay,
+    easing,
+    subTimeline
+  };
+}
+var ElementInstructionMap = class {
+  _map = /* @__PURE__ */ new Map();
+  get(element) {
+    return this._map.get(element) || [];
+  }
+  append(element, instructions) {
+    let existingInstructions = this._map.get(element);
+    if (!existingInstructions) {
+      this._map.set(element, existingInstructions = []);
+    }
+    existingInstructions.push(...instructions);
+  }
+  has(element) {
+    return this._map.has(element);
+  }
+  clear() {
+    this._map.clear();
+  }
+};
+var ONE_FRAME_IN_MILLISECONDS = 1;
+var ENTER_TOKEN = ":enter";
+var ENTER_TOKEN_REGEX = new RegExp(ENTER_TOKEN, "g");
+var LEAVE_TOKEN = ":leave";
+var LEAVE_TOKEN_REGEX = new RegExp(LEAVE_TOKEN, "g");
+function buildAnimationTimelines(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles = /* @__PURE__ */ new Map(), finalStyles = /* @__PURE__ */ new Map(), options, subInstructions, errors = []) {
+  return new AnimationTimelineBuilderVisitor().buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors);
+}
+var AnimationTimelineBuilderVisitor = class {
+  buildKeyframes(driver, rootElement, ast, enterClassName, leaveClassName, startingStyles, finalStyles, options, subInstructions, errors = []) {
+    subInstructions = subInstructions || new ElementInstructionMap();
+    const context = new AnimationTimelineContext(driver, rootElement, subInstructions, enterClassName, leaveClassName, errors, []);
+    context.options = options;
+    const delay = options.delay ? resolveTimingValue(options.delay) : 0;
+    context.currentTimeline.delayNextStep(delay);
+    context.currentTimeline.setStyles([startingStyles], null, context.errors, options);
+    visitDslNode(this, ast, context);
+    const timelines = context.timelines.filter((timeline) => timeline.containsAnimation());
+    if (timelines.length && finalStyles.size) {
+      let lastRootTimeline;
+      for (let i = timelines.length - 1; i >= 0; i--) {
+        const timeline = timelines[i];
+        if (timeline.element === rootElement) {
+          lastRootTimeline = timeline;
+          break;
+        }
+      }
+      if (lastRootTimeline && !lastRootTimeline.allowOnlyTimelineStyles()) {
+        lastRootTimeline.setStyles([finalStyles], null, context.errors, options);
+      }
+    }
+    return timelines.length ? timelines.map((timeline) => timeline.buildKeyframes()) : [createTimelineInstruction(rootElement, [], [], [], 0, delay, "", false)];
+  }
+  visitTrigger(ast, context) {
+  }
+  visitState(ast, context) {
+  }
+  visitTransition(ast, context) {
+  }
+  visitAnimateChild(ast, context) {
+    const elementInstructions = context.subInstructions.get(context.element);
+    if (elementInstructions) {
+      const innerContext = context.createSubContext(ast.options);
+      const startTime = context.currentTimeline.currentTime;
+      const endTime = this._visitSubInstructions(elementInstructions, innerContext, innerContext.options);
+      if (startTime != endTime) {
+        context.transformIntoNewTimeline(endTime);
+      }
+    }
+    context.previousNode = ast;
+  }
+  visitAnimateRef(ast, context) {
+    const innerContext = context.createSubContext(ast.options);
+    innerContext.transformIntoNewTimeline();
+    this._applyAnimationRefDelays([ast.options, ast.animation.options], context, innerContext);
+    this.visitReference(ast.animation, innerContext);
+    context.transformIntoNewTimeline(innerContext.currentTimeline.currentTime);
+    context.previousNode = ast;
+  }
+  _applyAnimationRefDelays(animationsRefsOptions, context, innerContext) {
+    for (const animationRefOptions of animationsRefsOptions) {
+      const animationDelay = animationRefOptions?.delay;
+      if (animationDelay) {
+        const animationDelayValue = typeof animationDelay === "number" ? animationDelay : resolveTimingValue(interpolateParams(animationDelay, animationRefOptions?.params ?? {}, context.errors));
+        innerContext.delayNextStep(animationDelayValue);
+      }
+    }
+  }
+  _visitSubInstructions(instructions, context, options) {
+    const startTime = context.currentTimeline.currentTime;
+    let furthestTime = startTime;
+    const duration = options.duration != null ? resolveTimingValue(options.duration) : null;
+    const delay = options.delay != null ? resolveTimingValue(options.delay) : null;
+    if (duration !== 0) {
+      instructions.forEach((instruction) => {
+        const instructionTimings = context.appendInstructionToTimeline(instruction, duration, delay);
+        furthestTime = Math.max(furthestTime, instructionTimings.duration + instructionTimings.delay);
+      });
+    }
+    return furthestTime;
+  }
+  visitReference(ast, context) {
+    context.updateOptions(ast.options, true);
+    visitDslNode(this, ast.animation, context);
+    context.previousNode = ast;
+  }
+  visitSequence(ast, context) {
+    const subContextCount = context.subContextCount;
+    let ctx = context;
+    const options = ast.options;
+    if (options && (options.params || options.delay)) {
+      ctx = context.createSubContext(options);
+      ctx.transformIntoNewTimeline();
+      if (options.delay != null) {
+        if (ctx.previousNode.type == AnimationMetadataType.Style) {
+          ctx.currentTimeline.snapshotCurrentStyles();
+          ctx.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+        }
+        const delay = resolveTimingValue(options.delay);
+        ctx.delayNextStep(delay);
+      }
+    }
+    if (ast.steps.length) {
+      ast.steps.forEach((s) => visitDslNode(this, s, ctx));
+      ctx.currentTimeline.applyStylesToKeyframe();
+      if (ctx.subContextCount > subContextCount) {
+        ctx.transformIntoNewTimeline();
+      }
+    }
+    context.previousNode = ast;
+  }
+  visitGroup(ast, context) {
+    const innerTimelines = [];
+    let furthestTime = context.currentTimeline.currentTime;
+    const delay = ast.options && ast.options.delay ? resolveTimingValue(ast.options.delay) : 0;
+    ast.steps.forEach((s) => {
+      const innerContext = context.createSubContext(ast.options);
+      if (delay) {
+        innerContext.delayNextStep(delay);
+      }
+      visitDslNode(this, s, innerContext);
+      furthestTime = Math.max(furthestTime, innerContext.currentTimeline.currentTime);
+      innerTimelines.push(innerContext.currentTimeline);
+    });
+    innerTimelines.forEach((timeline) => context.currentTimeline.mergeTimelineCollectedStyles(timeline));
+    context.transformIntoNewTimeline(furthestTime);
+    context.previousNode = ast;
+  }
+  _visitTiming(ast, context) {
+    if (ast.dynamic) {
+      const strValue = ast.strValue;
+      const timingValue = context.params ? interpolateParams(strValue, context.params, context.errors) : strValue;
+      return resolveTiming(timingValue, context.errors);
+    } else {
+      return {
+        duration: ast.duration,
+        delay: ast.delay,
+        easing: ast.easing
+      };
+    }
+  }
+  visitAnimate(ast, context) {
+    const timings = context.currentAnimateTimings = this._visitTiming(ast.timings, context);
+    const timeline = context.currentTimeline;
+    if (timings.delay) {
+      context.incrementTime(timings.delay);
+      timeline.snapshotCurrentStyles();
+    }
+    const style2 = ast.style;
+    if (style2.type == AnimationMetadataType.Keyframes) {
+      this.visitKeyframes(style2, context);
+    } else {
+      context.incrementTime(timings.duration);
+      this.visitStyle(style2, context);
+      timeline.applyStylesToKeyframe();
+    }
+    context.currentAnimateTimings = null;
+    context.previousNode = ast;
+  }
+  visitStyle(ast, context) {
+    const timeline = context.currentTimeline;
+    const timings = context.currentAnimateTimings;
+    if (!timings && timeline.hasCurrentStyleProperties()) {
+      timeline.forwardFrame();
+    }
+    const easing = timings && timings.easing || ast.easing;
+    if (ast.isEmptyStep) {
+      timeline.applyEmptyStep(easing);
+    } else {
+      timeline.setStyles(ast.styles, easing, context.errors, context.options);
+    }
+    context.previousNode = ast;
+  }
+  visitKeyframes(ast, context) {
+    const currentAnimateTimings = context.currentAnimateTimings;
+    const startTime = context.currentTimeline.duration;
+    const duration = currentAnimateTimings.duration;
+    const innerContext = context.createSubContext();
+    const innerTimeline = innerContext.currentTimeline;
+    innerTimeline.easing = currentAnimateTimings.easing;
+    ast.styles.forEach((step) => {
+      const offset = step.offset || 0;
+      innerTimeline.forwardTime(offset * duration);
+      innerTimeline.setStyles(step.styles, step.easing, context.errors, context.options);
+      innerTimeline.applyStylesToKeyframe();
+    });
+    context.currentTimeline.mergeTimelineCollectedStyles(innerTimeline);
+    context.transformIntoNewTimeline(startTime + duration);
+    context.previousNode = ast;
+  }
+  visitQuery(ast, context) {
+    const startTime = context.currentTimeline.currentTime;
+    const options = ast.options || {};
+    const delay = options.delay ? resolveTimingValue(options.delay) : 0;
+    if (delay && (context.previousNode.type === AnimationMetadataType.Style || startTime == 0 && context.currentTimeline.hasCurrentStyleProperties())) {
+      context.currentTimeline.snapshotCurrentStyles();
+      context.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+    }
+    let furthestTime = startTime;
+    const elms = context.invokeQuery(ast.selector, ast.originalSelector, ast.limit, ast.includeSelf, options.optional ? true : false, context.errors);
+    context.currentQueryTotal = elms.length;
+    let sameElementTimeline = null;
+    elms.forEach((element, i) => {
+      context.currentQueryIndex = i;
+      const innerContext = context.createSubContext(ast.options, element);
+      if (delay) {
+        innerContext.delayNextStep(delay);
+      }
+      if (element === context.element) {
+        sameElementTimeline = innerContext.currentTimeline;
+      }
+      visitDslNode(this, ast.animation, innerContext);
+      innerContext.currentTimeline.applyStylesToKeyframe();
+      const endTime = innerContext.currentTimeline.currentTime;
+      furthestTime = Math.max(furthestTime, endTime);
+    });
+    context.currentQueryIndex = 0;
+    context.currentQueryTotal = 0;
+    context.transformIntoNewTimeline(furthestTime);
+    if (sameElementTimeline) {
+      context.currentTimeline.mergeTimelineCollectedStyles(sameElementTimeline);
+      context.currentTimeline.snapshotCurrentStyles();
+    }
+    context.previousNode = ast;
+  }
+  visitStagger(ast, context) {
+    const parentContext = context.parentContext;
+    const tl = context.currentTimeline;
+    const timings = ast.timings;
+    const duration = Math.abs(timings.duration);
+    const maxTime = duration * (context.currentQueryTotal - 1);
+    let delay = duration * context.currentQueryIndex;
+    let staggerTransformer = timings.duration < 0 ? "reverse" : timings.easing;
+    switch (staggerTransformer) {
+      case "reverse":
+        delay = maxTime - delay;
+        break;
+      case "full":
+        delay = parentContext.currentStaggerTime;
+        break;
+    }
+    const timeline = context.currentTimeline;
+    if (delay) {
+      timeline.delayNextStep(delay);
+    }
+    const startingTime = timeline.currentTime;
+    visitDslNode(this, ast.animation, context);
+    context.previousNode = ast;
+    parentContext.currentStaggerTime = tl.currentTime - startingTime + (tl.startTime - parentContext.currentTimeline.startTime);
+  }
+};
+var DEFAULT_NOOP_PREVIOUS_NODE = {};
+var AnimationTimelineContext = class _AnimationTimelineContext {
+  _driver;
+  element;
+  subInstructions;
+  _enterClassName;
+  _leaveClassName;
+  errors;
+  timelines;
+  parentContext = null;
+  currentTimeline;
+  currentAnimateTimings = null;
+  previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+  subContextCount = 0;
+  options = {};
+  currentQueryIndex = 0;
+  currentQueryTotal = 0;
+  currentStaggerTime = 0;
+  constructor(_driver, element, subInstructions, _enterClassName, _leaveClassName, errors, timelines, initialTimeline) {
+    this._driver = _driver;
+    this.element = element;
+    this.subInstructions = subInstructions;
+    this._enterClassName = _enterClassName;
+    this._leaveClassName = _leaveClassName;
+    this.errors = errors;
+    this.timelines = timelines;
+    this.currentTimeline = initialTimeline || new TimelineBuilder(this._driver, element, 0);
+    timelines.push(this.currentTimeline);
+  }
+  get params() {
+    return this.options.params;
+  }
+  updateOptions(options, skipIfExists) {
+    if (!options) return;
+    const newOptions = options;
+    let optionsToUpdate = this.options;
+    if (newOptions.duration != null) {
+      optionsToUpdate.duration = resolveTimingValue(newOptions.duration);
+    }
+    if (newOptions.delay != null) {
+      optionsToUpdate.delay = resolveTimingValue(newOptions.delay);
+    }
+    const newParams = newOptions.params;
+    if (newParams) {
+      let paramsToUpdate = optionsToUpdate.params;
+      if (!paramsToUpdate) {
+        paramsToUpdate = this.options.params = {};
+      }
+      Object.keys(newParams).forEach((name) => {
+        if (!skipIfExists || !paramsToUpdate.hasOwnProperty(name)) {
+          paramsToUpdate[name] = interpolateParams(newParams[name], paramsToUpdate, this.errors);
+        }
+      });
+    }
+  }
+  _copyOptions() {
+    const options = {};
+    if (this.options) {
+      const oldParams = this.options.params;
+      if (oldParams) {
+        const params = options["params"] = {};
+        Object.keys(oldParams).forEach((name) => {
+          params[name] = oldParams[name];
+        });
+      }
+    }
+    return options;
+  }
+  createSubContext(options = null, element, newTime) {
+    const target = element || this.element;
+    const context = new _AnimationTimelineContext(this._driver, target, this.subInstructions, this._enterClassName, this._leaveClassName, this.errors, this.timelines, this.currentTimeline.fork(target, newTime || 0));
+    context.previousNode = this.previousNode;
+    context.currentAnimateTimings = this.currentAnimateTimings;
+    context.options = this._copyOptions();
+    context.updateOptions(options);
+    context.currentQueryIndex = this.currentQueryIndex;
+    context.currentQueryTotal = this.currentQueryTotal;
+    context.parentContext = this;
+    this.subContextCount++;
+    return context;
+  }
+  transformIntoNewTimeline(newTime) {
+    this.previousNode = DEFAULT_NOOP_PREVIOUS_NODE;
+    this.currentTimeline = this.currentTimeline.fork(this.element, newTime);
+    this.timelines.push(this.currentTimeline);
+    return this.currentTimeline;
+  }
+  appendInstructionToTimeline(instruction, duration, delay) {
+    const updatedTimings = {
+      duration: duration != null ? duration : instruction.duration,
+      delay: this.currentTimeline.currentTime + (delay != null ? delay : 0) + instruction.delay,
+      easing: ""
+    };
+    const builder = new SubTimelineBuilder(this._driver, instruction.element, instruction.keyframes, instruction.preStyleProps, instruction.postStyleProps, updatedTimings, instruction.stretchStartingKeyframe);
+    this.timelines.push(builder);
+    return updatedTimings;
+  }
+  incrementTime(time) {
+    this.currentTimeline.forwardTime(this.currentTimeline.duration + time);
+  }
+  delayNextStep(delay) {
+    if (delay > 0) {
+      this.currentTimeline.delayNextStep(delay);
+    }
+  }
+  invokeQuery(selector, originalSelector, limit, includeSelf, optional, errors) {
+    let results = [];
+    if (includeSelf) {
+      results.push(this.element);
+    }
+    if (selector.length > 0) {
+      selector = selector.replace(ENTER_TOKEN_REGEX, "." + this._enterClassName);
+      selector = selector.replace(LEAVE_TOKEN_REGEX, "." + this._leaveClassName);
+      const multi = limit != 1;
+      let elements = this._driver.query(this.element, selector, multi);
+      if (limit !== 0) {
+        elements = limit < 0 ? elements.slice(elements.length + limit, elements.length) : elements.slice(0, limit);
+      }
+      results.push(...elements);
+    }
+    if (!optional && results.length == 0) {
+      errors.push(invalidQuery(originalSelector));
+    }
+    return results;
+  }
+};
+var TimelineBuilder = class _TimelineBuilder {
+  _driver;
+  element;
+  startTime;
+  _elementTimelineStylesLookup;
+  duration = 0;
+  easing = null;
+  _previousKeyframe = /* @__PURE__ */ new Map();
+  _currentKeyframe = /* @__PURE__ */ new Map();
+  _keyframes = /* @__PURE__ */ new Map();
+  _styleSummary = /* @__PURE__ */ new Map();
+  _localTimelineStyles = /* @__PURE__ */ new Map();
+  _globalTimelineStyles;
+  _pendingStyles = /* @__PURE__ */ new Map();
+  _backFill = /* @__PURE__ */ new Map();
+  _currentEmptyStepKeyframe = null;
+  constructor(_driver, element, startTime, _elementTimelineStylesLookup) {
+    this._driver = _driver;
+    this.element = element;
+    this.startTime = startTime;
+    this._elementTimelineStylesLookup = _elementTimelineStylesLookup;
+    if (!this._elementTimelineStylesLookup) {
+      this._elementTimelineStylesLookup = /* @__PURE__ */ new Map();
+    }
+    this._globalTimelineStyles = this._elementTimelineStylesLookup.get(element);
+    if (!this._globalTimelineStyles) {
+      this._globalTimelineStyles = this._localTimelineStyles;
+      this._elementTimelineStylesLookup.set(element, this._localTimelineStyles);
+    }
+    this._loadKeyframe();
+  }
+  containsAnimation() {
+    switch (this._keyframes.size) {
+      case 0:
+        return false;
+      case 1:
+        return this.hasCurrentStyleProperties();
+      default:
+        return true;
+    }
+  }
+  hasCurrentStyleProperties() {
+    return this._currentKeyframe.size > 0;
+  }
+  get currentTime() {
+    return this.startTime + this.duration;
+  }
+  delayNextStep(delay) {
+    const hasPreStyleStep = this._keyframes.size === 1 && this._pendingStyles.size;
+    if (this.duration || hasPreStyleStep) {
+      this.forwardTime(this.currentTime + delay);
+      if (hasPreStyleStep) {
+        this.snapshotCurrentStyles();
+      }
+    } else {
+      this.startTime += delay;
+    }
+  }
+  fork(element, currentTime) {
+    this.applyStylesToKeyframe();
+    return new _TimelineBuilder(this._driver, element, currentTime || this.currentTime, this._elementTimelineStylesLookup);
+  }
+  _loadKeyframe() {
+    if (this._currentKeyframe) {
+      this._previousKeyframe = this._currentKeyframe;
+    }
+    this._currentKeyframe = this._keyframes.get(this.duration);
+    if (!this._currentKeyframe) {
+      this._currentKeyframe = /* @__PURE__ */ new Map();
+      this._keyframes.set(this.duration, this._currentKeyframe);
+    }
+  }
+  forwardFrame() {
+    this.duration += ONE_FRAME_IN_MILLISECONDS;
+    this._loadKeyframe();
+  }
+  forwardTime(time) {
+    this.applyStylesToKeyframe();
+    this.duration = time;
+    this._loadKeyframe();
+  }
+  _updateStyle(prop, value) {
+    this._localTimelineStyles.set(prop, value);
+    this._globalTimelineStyles.set(prop, value);
+    this._styleSummary.set(prop, {
+      time: this.currentTime,
+      value
+    });
+  }
+  allowOnlyTimelineStyles() {
+    return this._currentEmptyStepKeyframe !== this._currentKeyframe;
+  }
+  applyEmptyStep(easing) {
+    if (easing) {
+      this._previousKeyframe.set("easing", easing);
+    }
+    for (let [prop, value] of this._globalTimelineStyles) {
+      this._backFill.set(prop, value || AUTO_STYLE);
+      this._currentKeyframe.set(prop, AUTO_STYLE);
+    }
+    this._currentEmptyStepKeyframe = this._currentKeyframe;
+  }
+  setStyles(input, easing, errors, options) {
+    if (easing) {
+      this._previousKeyframe.set("easing", easing);
+    }
+    const params = options && options.params || {};
+    const styles = flattenStyles(input, this._globalTimelineStyles);
+    for (let [prop, value] of styles) {
+      const val = interpolateParams(value, params, errors);
+      this._pendingStyles.set(prop, val);
+      if (!this._localTimelineStyles.has(prop)) {
+        this._backFill.set(prop, this._globalTimelineStyles.get(prop) ?? AUTO_STYLE);
+      }
+      this._updateStyle(prop, val);
+    }
+  }
+  applyStylesToKeyframe() {
+    if (this._pendingStyles.size == 0) return;
+    this._pendingStyles.forEach((val, prop) => {
+      this._currentKeyframe.set(prop, val);
+    });
+    this._pendingStyles.clear();
+    this._localTimelineStyles.forEach((val, prop) => {
+      if (!this._currentKeyframe.has(prop)) {
+        this._currentKeyframe.set(prop, val);
+      }
+    });
+  }
+  snapshotCurrentStyles() {
+    for (let [prop, val] of this._localTimelineStyles) {
+      this._pendingStyles.set(prop, val);
+      this._updateStyle(prop, val);
+    }
+  }
+  getFinalKeyframe() {
+    return this._keyframes.get(this.duration);
+  }
+  get properties() {
+    const properties = [];
+    for (let prop in this._currentKeyframe) {
+      properties.push(prop);
+    }
+    return properties;
+  }
+  mergeTimelineCollectedStyles(timeline) {
+    timeline._styleSummary.forEach((details1, prop) => {
+      const details0 = this._styleSummary.get(prop);
+      if (!details0 || details1.time > details0.time) {
+        this._updateStyle(prop, details1.value);
+      }
+    });
+  }
+  buildKeyframes() {
+    this.applyStylesToKeyframe();
+    const preStyleProps = /* @__PURE__ */ new Set();
+    const postStyleProps = /* @__PURE__ */ new Set();
+    const isEmpty = this._keyframes.size === 1 && this.duration === 0;
+    let finalKeyframes = [];
+    this._keyframes.forEach((keyframe, time) => {
+      const finalKeyframe = new Map([...this._backFill, ...keyframe]);
+      finalKeyframe.forEach((value, prop) => {
+        if (value === ɵPRE_STYLE) {
+          preStyleProps.add(prop);
+        } else if (value === AUTO_STYLE) {
+          postStyleProps.add(prop);
+        }
+      });
+      if (!isEmpty) {
+        finalKeyframe.set("offset", time / this.duration);
+      }
+      finalKeyframes.push(finalKeyframe);
+    });
+    const preProps = [...preStyleProps.values()];
+    const postProps = [...postStyleProps.values()];
+    if (isEmpty) {
+      const kf0 = finalKeyframes[0];
+      const kf1 = new Map(kf0);
+      kf0.set("offset", 0);
+      kf1.set("offset", 1);
+      finalKeyframes = [kf0, kf1];
+    }
+    return createTimelineInstruction(this.element, finalKeyframes, preProps, postProps, this.duration, this.startTime, this.easing, false);
+  }
+};
+var SubTimelineBuilder = class extends TimelineBuilder {
+  keyframes;
+  preStyleProps;
+  postStyleProps;
+  _stretchStartingKeyframe;
+  timings;
+  constructor(driver, element, keyframes, preStyleProps, postStyleProps, timings, _stretchStartingKeyframe = false) {
+    super(driver, element, timings.delay);
+    this.keyframes = keyframes;
+    this.preStyleProps = preStyleProps;
+    this.postStyleProps = postStyleProps;
+    this._stretchStartingKeyframe = _stretchStartingKeyframe;
+    this.timings = {
+      duration: timings.duration,
+      delay: timings.delay,
+      easing: timings.easing
+    };
+  }
+  containsAnimation() {
+    return this.keyframes.length > 1;
+  }
+  buildKeyframes() {
+    let keyframes = this.keyframes;
+    let {
+      delay,
+      duration,
+      easing
+    } = this.timings;
+    if (this._stretchStartingKeyframe && delay) {
+      const newKeyframes = [];
+      const totalTime = duration + delay;
+      const startingGap = delay / totalTime;
+      const newFirstKeyframe = new Map(keyframes[0]);
+      newFirstKeyframe.set("offset", 0);
+      newKeyframes.push(newFirstKeyframe);
+      const oldFirstKeyframe = new Map(keyframes[0]);
+      oldFirstKeyframe.set("offset", roundOffset(startingGap));
+      newKeyframes.push(oldFirstKeyframe);
+      const limit = keyframes.length - 1;
+      for (let i = 1; i <= limit; i++) {
+        let kf = new Map(keyframes[i]);
+        const oldOffset = kf.get("offset");
+        const timeAtKeyframe = delay + oldOffset * duration;
+        kf.set("offset", roundOffset(timeAtKeyframe / totalTime));
+        newKeyframes.push(kf);
+      }
+      duration = totalTime;
+      delay = 0;
+      easing = "";
+      keyframes = newKeyframes;
+    }
+    return createTimelineInstruction(this.element, keyframes, this.preStyleProps, this.postStyleProps, duration, delay, easing, true);
+  }
+};
+function roundOffset(offset, decimalPoints = 3) {
+  const mult = Math.pow(10, decimalPoints - 1);
+  return Math.round(offset * mult) / mult;
+}
+function flattenStyles(input, allStyles) {
+  const styles = /* @__PURE__ */ new Map();
+  let allProperties;
+  input.forEach((token) => {
+    if (token === "*") {
+      allProperties ??= allStyles.keys();
+      for (let prop of allProperties) {
+        styles.set(prop, AUTO_STYLE);
+      }
+    } else {
+      for (let [prop, val] of token) {
+        styles.set(prop, val);
+      }
+    }
+  });
+  return styles;
+}
+function createTransitionInstruction(element, triggerName, fromState, toState, isRemovalTransition, fromStyles, toStyles, timelines, queriedElements, preStyleProps, postStyleProps, totalTime, errors) {
+  return {
+    type: 0,
+    element,
+    triggerName,
+    isRemovalTransition,
+    fromState,
+    fromStyles,
+    toState,
+    toStyles,
+    timelines,
+    queriedElements,
+    preStyleProps,
+    postStyleProps,
+    totalTime,
+    errors
+  };
+}
+var EMPTY_OBJECT = {};
+var AnimationTransitionFactory = class {
+  _triggerName;
+  ast;
+  _stateStyles;
+  constructor(_triggerName, ast, _stateStyles) {
+    this._triggerName = _triggerName;
+    this.ast = ast;
+    this._stateStyles = _stateStyles;
+  }
+  match(currentState, nextState, element, params) {
+    return oneOrMoreTransitionsMatch(this.ast.matchers, currentState, nextState, element, params);
+  }
+  buildStyles(stateName, params, errors) {
+    let styler = this._stateStyles.get("*");
+    if (stateName !== void 0) {
+      styler = this._stateStyles.get(stateName?.toString()) || styler;
+    }
+    return styler ? styler.buildStyles(params, errors) : /* @__PURE__ */ new Map();
+  }
+  build(driver, element, currentState, nextState, enterClassName, leaveClassName, currentOptions, nextOptions, subInstructions, skipAstBuild) {
+    const errors = [];
+    const transitionAnimationParams = this.ast.options && this.ast.options.params || EMPTY_OBJECT;
+    const currentAnimationParams = currentOptions && currentOptions.params || EMPTY_OBJECT;
+    const currentStateStyles = this.buildStyles(currentState, currentAnimationParams, errors);
+    const nextAnimationParams = nextOptions && nextOptions.params || EMPTY_OBJECT;
+    const nextStateStyles = this.buildStyles(nextState, nextAnimationParams, errors);
+    const queriedElements = /* @__PURE__ */ new Set();
+    const preStyleMap = /* @__PURE__ */ new Map();
+    const postStyleMap = /* @__PURE__ */ new Map();
+    const isRemoval = nextState === "void";
+    const animationOptions = {
+      params: applyParamDefaults(nextAnimationParams, transitionAnimationParams),
+      delay: this.ast.options?.delay
+    };
+    const timelines = skipAstBuild ? [] : buildAnimationTimelines(driver, element, this.ast.animation, enterClassName, leaveClassName, currentStateStyles, nextStateStyles, animationOptions, subInstructions, errors);
+    let totalTime = 0;
+    timelines.forEach((tl) => {
+      totalTime = Math.max(tl.duration + tl.delay, totalTime);
+    });
+    if (errors.length) {
+      return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, [], [], preStyleMap, postStyleMap, totalTime, errors);
+    }
+    timelines.forEach((tl) => {
+      const elm = tl.element;
+      const preProps = getOrSetDefaultValue(preStyleMap, elm, /* @__PURE__ */ new Set());
+      tl.preStyleProps.forEach((prop) => preProps.add(prop));
+      const postProps = getOrSetDefaultValue(postStyleMap, elm, /* @__PURE__ */ new Set());
+      tl.postStyleProps.forEach((prop) => postProps.add(prop));
+      if (elm !== element) {
+        queriedElements.add(elm);
+      }
+    });
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      checkNonAnimatableInTimelines(timelines, this._triggerName, driver);
+    }
+    return createTransitionInstruction(element, this._triggerName, currentState, nextState, isRemoval, currentStateStyles, nextStateStyles, timelines, [...queriedElements.values()], preStyleMap, postStyleMap, totalTime);
+  }
+};
+function checkNonAnimatableInTimelines(timelines, triggerName, driver) {
+  if (!driver.validateAnimatableStyleProperty) {
+    return;
+  }
+  const allowedNonAnimatableProps = /* @__PURE__ */ new Set([
+    // 'easing' is a utility/synthetic prop we use to represent
+    // easing functions, it represents a property of the animation
+    // which is not animatable but different values can be used
+    // in different steps
+    "easing"
+  ]);
+  const invalidNonAnimatableProps = /* @__PURE__ */ new Set();
+  timelines.forEach(({
+    keyframes
+  }) => {
+    const nonAnimatablePropsInitialValues = /* @__PURE__ */ new Map();
+    keyframes.forEach((keyframe) => {
+      const entriesToCheck = Array.from(keyframe.entries()).filter(([prop]) => !allowedNonAnimatableProps.has(prop));
+      for (const [prop, value] of entriesToCheck) {
+        if (!driver.validateAnimatableStyleProperty(prop)) {
+          if (nonAnimatablePropsInitialValues.has(prop) && !invalidNonAnimatableProps.has(prop)) {
+            const propInitialValue = nonAnimatablePropsInitialValues.get(prop);
+            if (propInitialValue !== value) {
+              invalidNonAnimatableProps.add(prop);
+            }
+          } else {
+            nonAnimatablePropsInitialValues.set(prop, value);
+          }
+        }
+      }
+    });
+  });
+  if (invalidNonAnimatableProps.size > 0) {
+    console.warn(`Warning: The animation trigger "${triggerName}" is attempting to animate the following not animatable properties: ` + Array.from(invalidNonAnimatableProps).join(", ") + "\n(to check the list of all animatable properties visit https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_animated_properties)");
+  }
+}
+function oneOrMoreTransitionsMatch(matchFns, currentState, nextState, element, params) {
+  return matchFns.some((fn) => fn(currentState, nextState, element, params));
+}
+function applyParamDefaults(userParams, defaults) {
+  const result = __spreadValues({}, defaults);
+  Object.entries(userParams).forEach(([key, value]) => {
+    if (value != null) {
+      result[key] = value;
+    }
+  });
+  return result;
+}
+var AnimationStateStyles = class {
+  styles;
+  defaultParams;
+  normalizer;
+  constructor(styles, defaultParams, normalizer) {
+    this.styles = styles;
+    this.defaultParams = defaultParams;
+    this.normalizer = normalizer;
+  }
+  buildStyles(params, errors) {
+    const finalStyles = /* @__PURE__ */ new Map();
+    const combinedParams = applyParamDefaults(params, this.defaultParams);
+    this.styles.styles.forEach((value) => {
+      if (typeof value !== "string") {
+        value.forEach((val, prop) => {
+          if (val) {
+            val = interpolateParams(val, combinedParams, errors);
+          }
+          const normalizedProp = this.normalizer.normalizePropertyName(prop, errors);
+          val = this.normalizer.normalizeStyleValue(prop, normalizedProp, val, errors);
+          finalStyles.set(prop, val);
+        });
+      }
+    });
+    return finalStyles;
+  }
+};
+function buildTrigger(name, ast, normalizer) {
+  return new AnimationTrigger(name, ast, normalizer);
+}
+var AnimationTrigger = class {
+  name;
+  ast;
+  _normalizer;
+  transitionFactories = [];
+  fallbackTransition;
+  states = /* @__PURE__ */ new Map();
+  constructor(name, ast, _normalizer) {
+    this.name = name;
+    this.ast = ast;
+    this._normalizer = _normalizer;
+    ast.states.forEach((ast2) => {
+      const defaultParams = ast2.options && ast2.options.params || {};
+      this.states.set(ast2.name, new AnimationStateStyles(ast2.style, defaultParams, _normalizer));
+    });
+    balanceProperties(this.states, "true", "1");
+    balanceProperties(this.states, "false", "0");
+    ast.transitions.forEach((ast2) => {
+      this.transitionFactories.push(new AnimationTransitionFactory(name, ast2, this.states));
+    });
+    this.fallbackTransition = createFallbackTransition(name, this.states);
+  }
+  get containsQueries() {
+    return this.ast.queryCount > 0;
+  }
+  matchTransition(currentState, nextState, element, params) {
+    const entry = this.transitionFactories.find((f) => f.match(currentState, nextState, element, params));
+    return entry || null;
+  }
+  matchStyles(currentState, params, errors) {
+    return this.fallbackTransition.buildStyles(currentState, params, errors);
+  }
+};
+function createFallbackTransition(triggerName, states, normalizer) {
+  const matchers = [(fromState, toState) => true];
+  const animation = {
+    type: AnimationMetadataType.Sequence,
+    steps: [],
+    options: null
+  };
+  const transition = {
+    type: AnimationMetadataType.Transition,
+    animation,
+    matchers,
+    options: null,
+    queryCount: 0,
+    depCount: 0
+  };
+  return new AnimationTransitionFactory(triggerName, transition, states);
+}
+function balanceProperties(stateMap, key1, key2) {
+  if (stateMap.has(key1)) {
+    if (!stateMap.has(key2)) {
+      stateMap.set(key2, stateMap.get(key1));
+    }
+  } else if (stateMap.has(key2)) {
+    stateMap.set(key1, stateMap.get(key2));
+  }
+}
+var EMPTY_INSTRUCTION_MAP = new ElementInstructionMap();
+var TimelineAnimationEngine = class {
+  bodyNode;
+  _driver;
+  _normalizer;
+  _animations = /* @__PURE__ */ new Map();
+  _playersById = /* @__PURE__ */ new Map();
+  players = [];
+  constructor(bodyNode, _driver, _normalizer) {
+    this.bodyNode = bodyNode;
+    this._driver = _driver;
+    this._normalizer = _normalizer;
+  }
+  register(id, metadata) {
+    const errors = [];
+    const warnings = [];
+    const ast = buildAnimationAst(this._driver, metadata, errors, warnings);
+    if (errors.length) {
+      throw registerFailed(errors);
+    } else {
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        if (warnings.length) {
+          warnRegister(warnings);
+        }
+      }
+      this._animations.set(id, ast);
+    }
+  }
+  _buildPlayer(i, preStyles, postStyles) {
+    const element = i.element;
+    const keyframes = normalizeKeyframes$1(this._normalizer, i.keyframes, preStyles, postStyles);
+    return this._driver.animate(element, keyframes, i.duration, i.delay, i.easing, [], true);
+  }
+  create(id, element, options = {}) {
+    const errors = [];
+    const ast = this._animations.get(id);
+    let instructions;
+    const autoStylesMap = /* @__PURE__ */ new Map();
+    if (ast) {
+      instructions = buildAnimationTimelines(this._driver, element, ast, ENTER_CLASSNAME, LEAVE_CLASSNAME, /* @__PURE__ */ new Map(), /* @__PURE__ */ new Map(), options, EMPTY_INSTRUCTION_MAP, errors);
+      instructions.forEach((inst) => {
+        const styles = getOrSetDefaultValue(autoStylesMap, inst.element, /* @__PURE__ */ new Map());
+        inst.postStyleProps.forEach((prop) => styles.set(prop, null));
+      });
+    } else {
+      errors.push(missingOrDestroyedAnimation());
+      instructions = [];
+    }
+    if (errors.length) {
+      throw createAnimationFailed(errors);
+    }
+    autoStylesMap.forEach((styles, element2) => {
+      styles.forEach((_, prop) => {
+        styles.set(prop, this._driver.computeStyle(element2, prop, AUTO_STYLE));
+      });
+    });
+    const players = instructions.map((i) => {
+      const styles = autoStylesMap.get(i.element);
+      return this._buildPlayer(i, /* @__PURE__ */ new Map(), styles);
+    });
+    const player = optimizeGroupPlayer(players);
+    this._playersById.set(id, player);
+    player.onDestroy(() => this.destroy(id));
+    this.players.push(player);
+    return player;
+  }
+  destroy(id) {
+    const player = this._getPlayer(id);
+    player.destroy();
+    this._playersById.delete(id);
+    const index = this.players.indexOf(player);
+    if (index >= 0) {
+      this.players.splice(index, 1);
+    }
+  }
+  _getPlayer(id) {
+    const player = this._playersById.get(id);
+    if (!player) {
+      throw missingPlayer(id);
+    }
+    return player;
+  }
+  listen(id, element, eventName, callback) {
+    const baseEvent = makeAnimationEvent(element, "", "", "");
+    listenOnPlayer(this._getPlayer(id), eventName, baseEvent, callback);
+    return () => {
+    };
+  }
+  command(id, element, command, args) {
+    if (command == "register") {
+      this.register(id, args[0]);
+      return;
+    }
+    if (command == "create") {
+      const options = args[0] || {};
+      this.create(id, element, options);
+      return;
+    }
+    const player = this._getPlayer(id);
+    switch (command) {
+      case "play":
+        player.play();
+        break;
+      case "pause":
+        player.pause();
+        break;
+      case "reset":
+        player.reset();
+        break;
+      case "restart":
+        player.restart();
+        break;
+      case "finish":
+        player.finish();
+        break;
+      case "init":
+        player.init();
+        break;
+      case "setPosition":
+        player.setPosition(parseFloat(args[0]));
+        break;
+      case "destroy":
+        this.destroy(id);
+        break;
+    }
+  }
+};
+var QUEUED_CLASSNAME = "ng-animate-queued";
+var QUEUED_SELECTOR = ".ng-animate-queued";
+var DISABLED_CLASSNAME = "ng-animate-disabled";
+var DISABLED_SELECTOR = ".ng-animate-disabled";
+var STAR_CLASSNAME = "ng-star-inserted";
+var STAR_SELECTOR = ".ng-star-inserted";
+var EMPTY_PLAYER_ARRAY = [];
+var NULL_REMOVAL_STATE = {
+  namespaceId: "",
+  setForRemoval: false,
+  setForMove: false,
+  hasAnimation: false,
+  removedBeforeQueried: false
+};
+var NULL_REMOVED_QUERIED_STATE = {
+  namespaceId: "",
+  setForMove: false,
+  setForRemoval: false,
+  hasAnimation: false,
+  removedBeforeQueried: true
+};
+var REMOVAL_FLAG = "__ng_removed";
+var StateValue = class {
+  namespaceId;
+  value;
+  options;
+  get params() {
+    return this.options.params;
+  }
+  constructor(input, namespaceId = "") {
+    this.namespaceId = namespaceId;
+    const isObj = input && input.hasOwnProperty("value");
+    const value = isObj ? input["value"] : input;
+    this.value = normalizeTriggerValue(value);
+    if (isObj) {
+      const _a = input, {
+        value: value2
+      } = _a, options = __objRest(_a, [
+        "value"
+      ]);
+      this.options = options;
+    } else {
+      this.options = {};
+    }
+    if (!this.options.params) {
+      this.options.params = {};
+    }
+  }
+  absorbOptions(options) {
+    const newParams = options.params;
+    if (newParams) {
+      const oldParams = this.options.params;
+      Object.keys(newParams).forEach((prop) => {
+        if (oldParams[prop] == null) {
+          oldParams[prop] = newParams[prop];
+        }
+      });
+    }
+  }
+};
+var VOID_VALUE = "void";
+var DEFAULT_STATE_VALUE = new StateValue(VOID_VALUE);
+var AnimationTransitionNamespace = class {
+  id;
+  hostElement;
+  _engine;
+  players = [];
+  _triggers = /* @__PURE__ */ new Map();
+  _queue = [];
+  _elementListeners = /* @__PURE__ */ new Map();
+  _hostClassName;
+  constructor(id, hostElement, _engine) {
+    this.id = id;
+    this.hostElement = hostElement;
+    this._engine = _engine;
+    this._hostClassName = "ng-tns-" + id;
+    addClass(hostElement, this._hostClassName);
+  }
+  listen(element, name, phase, callback) {
+    if (!this._triggers.has(name)) {
+      throw missingTrigger(phase, name);
+    }
+    if (phase == null || phase.length == 0) {
+      throw missingEvent(name);
+    }
+    if (!isTriggerEventValid(phase)) {
+      throw unsupportedTriggerEvent(phase, name);
+    }
+    const listeners = getOrSetDefaultValue(this._elementListeners, element, []);
+    const data = {
+      name,
+      phase,
+      callback
+    };
+    listeners.push(data);
+    const triggersWithStates = getOrSetDefaultValue(this._engine.statesByElement, element, /* @__PURE__ */ new Map());
+    if (!triggersWithStates.has(name)) {
+      addClass(element, NG_TRIGGER_CLASSNAME);
+      addClass(element, NG_TRIGGER_CLASSNAME + "-" + name);
+      triggersWithStates.set(name, DEFAULT_STATE_VALUE);
+    }
+    return () => {
+      this._engine.afterFlush(() => {
+        const index = listeners.indexOf(data);
+        if (index >= 0) {
+          listeners.splice(index, 1);
+        }
+        if (!this._triggers.has(name)) {
+          triggersWithStates.delete(name);
+        }
+      });
+    };
+  }
+  register(name, ast) {
+    if (this._triggers.has(name)) {
+      return false;
+    } else {
+      this._triggers.set(name, ast);
+      return true;
+    }
+  }
+  _getTrigger(name) {
+    const trigger = this._triggers.get(name);
+    if (!trigger) {
+      throw unregisteredTrigger(name);
+    }
+    return trigger;
+  }
+  trigger(element, triggerName, value, defaultToFallback = true) {
+    const trigger = this._getTrigger(triggerName);
+    const player = new TransitionAnimationPlayer(this.id, triggerName, element);
+    let triggersWithStates = this._engine.statesByElement.get(element);
+    if (!triggersWithStates) {
+      addClass(element, NG_TRIGGER_CLASSNAME);
+      addClass(element, NG_TRIGGER_CLASSNAME + "-" + triggerName);
+      this._engine.statesByElement.set(element, triggersWithStates = /* @__PURE__ */ new Map());
+    }
+    let fromState = triggersWithStates.get(triggerName);
+    const toState = new StateValue(value, this.id);
+    const isObj = value && value.hasOwnProperty("value");
+    if (!isObj && fromState) {
+      toState.absorbOptions(fromState.options);
+    }
+    triggersWithStates.set(triggerName, toState);
+    if (!fromState) {
+      fromState = DEFAULT_STATE_VALUE;
+    }
+    const isRemoval = toState.value === VOID_VALUE;
+    if (!isRemoval && fromState.value === toState.value) {
+      if (!objEquals(fromState.params, toState.params)) {
+        const errors = [];
+        const fromStyles = trigger.matchStyles(fromState.value, fromState.params, errors);
+        const toStyles = trigger.matchStyles(toState.value, toState.params, errors);
+        if (errors.length) {
+          this._engine.reportError(errors);
+        } else {
+          this._engine.afterFlush(() => {
+            eraseStyles(element, fromStyles);
+            setStyles(element, toStyles);
+          });
+        }
+      }
+      return;
+    }
+    const playersOnElement = getOrSetDefaultValue(this._engine.playersByElement, element, []);
+    playersOnElement.forEach((player2) => {
+      if (player2.namespaceId == this.id && player2.triggerName == triggerName && player2.queued) {
+        player2.destroy();
+      }
+    });
+    let transition = trigger.matchTransition(fromState.value, toState.value, element, toState.params);
+    let isFallbackTransition = false;
+    if (!transition) {
+      if (!defaultToFallback) return;
+      transition = trigger.fallbackTransition;
+      isFallbackTransition = true;
+    }
+    this._engine.totalQueuedPlayers++;
+    this._queue.push({
+      element,
+      triggerName,
+      transition,
+      fromState,
+      toState,
+      player,
+      isFallbackTransition
+    });
+    if (!isFallbackTransition) {
+      addClass(element, QUEUED_CLASSNAME);
+      player.onStart(() => {
+        removeClass(element, QUEUED_CLASSNAME);
+      });
+    }
+    player.onDone(() => {
+      let index = this.players.indexOf(player);
+      if (index >= 0) {
+        this.players.splice(index, 1);
+      }
+      const players = this._engine.playersByElement.get(element);
+      if (players) {
+        let index2 = players.indexOf(player);
+        if (index2 >= 0) {
+          players.splice(index2, 1);
+        }
+      }
+    });
+    this.players.push(player);
+    playersOnElement.push(player);
+    return player;
+  }
+  deregister(name) {
+    this._triggers.delete(name);
+    this._engine.statesByElement.forEach((stateMap) => stateMap.delete(name));
+    this._elementListeners.forEach((listeners, element) => {
+      this._elementListeners.set(element, listeners.filter((entry) => {
+        return entry.name != name;
+      }));
+    });
+  }
+  clearElementCache(element) {
+    this._engine.statesByElement.delete(element);
+    this._elementListeners.delete(element);
+    const elementPlayers = this._engine.playersByElement.get(element);
+    if (elementPlayers) {
+      elementPlayers.forEach((player) => player.destroy());
+      this._engine.playersByElement.delete(element);
+    }
+  }
+  _signalRemovalForInnerTriggers(rootElement, context) {
+    const elements = this._engine.driver.query(rootElement, NG_TRIGGER_SELECTOR, true);
+    elements.forEach((elm) => {
+      if (elm[REMOVAL_FLAG]) return;
+      const namespaces = this._engine.fetchNamespacesByElement(elm);
+      if (namespaces.size) {
+        namespaces.forEach((ns) => ns.triggerLeaveAnimation(elm, context, false, true));
+      } else {
+        this.clearElementCache(elm);
+      }
+    });
+    this._engine.afterFlushAnimationsDone(() => elements.forEach((elm) => this.clearElementCache(elm)));
+  }
+  triggerLeaveAnimation(element, context, destroyAfterComplete, defaultToFallback) {
+    const triggerStates = this._engine.statesByElement.get(element);
+    const previousTriggersValues = /* @__PURE__ */ new Map();
+    if (triggerStates) {
+      const players = [];
+      triggerStates.forEach((state, triggerName) => {
+        previousTriggersValues.set(triggerName, state.value);
+        if (this._triggers.has(triggerName)) {
+          const player = this.trigger(element, triggerName, VOID_VALUE, defaultToFallback);
+          if (player) {
+            players.push(player);
+          }
+        }
+      });
+      if (players.length) {
+        this._engine.markElementAsRemoved(this.id, element, true, context, previousTriggersValues);
+        if (destroyAfterComplete) {
+          optimizeGroupPlayer(players).onDone(() => this._engine.processLeaveNode(element));
+        }
+        return true;
+      }
+    }
+    return false;
+  }
+  prepareLeaveAnimationListeners(element) {
+    const listeners = this._elementListeners.get(element);
+    const elementStates = this._engine.statesByElement.get(element);
+    if (listeners && elementStates) {
+      const visitedTriggers = /* @__PURE__ */ new Set();
+      listeners.forEach((listener) => {
+        const triggerName = listener.name;
+        if (visitedTriggers.has(triggerName)) return;
+        visitedTriggers.add(triggerName);
+        const trigger = this._triggers.get(triggerName);
+        const transition = trigger.fallbackTransition;
+        const fromState = elementStates.get(triggerName) || DEFAULT_STATE_VALUE;
+        const toState = new StateValue(VOID_VALUE);
+        const player = new TransitionAnimationPlayer(this.id, triggerName, element);
+        this._engine.totalQueuedPlayers++;
+        this._queue.push({
+          element,
+          triggerName,
+          transition,
+          fromState,
+          toState,
+          player,
+          isFallbackTransition: true
+        });
+      });
+    }
+  }
+  removeNode(element, context) {
+    const engine = this._engine;
+    if (element.childElementCount) {
+      this._signalRemovalForInnerTriggers(element, context);
+    }
+    if (this.triggerLeaveAnimation(element, context, true)) return;
+    let containsPotentialParentTransition = false;
+    if (engine.totalAnimations) {
+      const currentPlayers = engine.players.length ? engine.playersByQueriedElement.get(element) : [];
+      if (currentPlayers && currentPlayers.length) {
+        containsPotentialParentTransition = true;
+      } else {
+        let parent = element;
+        while (parent = parent.parentNode) {
+          const triggers = engine.statesByElement.get(parent);
+          if (triggers) {
+            containsPotentialParentTransition = true;
+            break;
+          }
+        }
+      }
+    }
+    this.prepareLeaveAnimationListeners(element);
+    if (containsPotentialParentTransition) {
+      engine.markElementAsRemoved(this.id, element, false, context);
+    } else {
+      const removalFlag = element[REMOVAL_FLAG];
+      if (!removalFlag || removalFlag === NULL_REMOVAL_STATE) {
+        engine.afterFlush(() => this.clearElementCache(element));
+        engine.destroyInnerAnimations(element);
+        engine._onRemovalComplete(element, context);
+      }
+    }
+  }
+  insertNode(element, parent) {
+    addClass(element, this._hostClassName);
+  }
+  drainQueuedTransitions(microtaskId) {
+    const instructions = [];
+    this._queue.forEach((entry) => {
+      const player = entry.player;
+      if (player.destroyed) return;
+      const element = entry.element;
+      const listeners = this._elementListeners.get(element);
+      if (listeners) {
+        listeners.forEach((listener) => {
+          if (listener.name == entry.triggerName) {
+            const baseEvent = makeAnimationEvent(element, entry.triggerName, entry.fromState.value, entry.toState.value);
+            baseEvent["_data"] = microtaskId;
+            listenOnPlayer(entry.player, listener.phase, baseEvent, listener.callback);
+          }
+        });
+      }
+      if (player.markedForDestroy) {
+        this._engine.afterFlush(() => {
+          player.destroy();
+        });
+      } else {
+        instructions.push(entry);
+      }
+    });
+    this._queue = [];
+    return instructions.sort((a, b) => {
+      const d0 = a.transition.ast.depCount;
+      const d1 = b.transition.ast.depCount;
+      if (d0 == 0 || d1 == 0) {
+        return d0 - d1;
+      }
+      return this._engine.driver.containsElement(a.element, b.element) ? 1 : -1;
+    });
+  }
+  destroy(context) {
+    this.players.forEach((p) => p.destroy());
+    this._signalRemovalForInnerTriggers(this.hostElement, context);
+  }
+};
+var TransitionAnimationEngine = class {
+  bodyNode;
+  driver;
+  _normalizer;
+  players = [];
+  newHostElements = /* @__PURE__ */ new Map();
+  playersByElement = /* @__PURE__ */ new Map();
+  playersByQueriedElement = /* @__PURE__ */ new Map();
+  statesByElement = /* @__PURE__ */ new Map();
+  disabledNodes = /* @__PURE__ */ new Set();
+  totalAnimations = 0;
+  totalQueuedPlayers = 0;
+  _namespaceLookup = {};
+  _namespaceList = [];
+  _flushFns = [];
+  _whenQuietFns = [];
+  namespacesByHostElement = /* @__PURE__ */ new Map();
+  collectedEnterElements = [];
+  collectedLeaveElements = [];
+  // this method is designed to be overridden by the code that uses this engine
+  onRemovalComplete = (element, context) => {
+  };
+  /** @internal */
+  _onRemovalComplete(element, context) {
+    this.onRemovalComplete(element, context);
+  }
+  constructor(bodyNode, driver, _normalizer) {
+    this.bodyNode = bodyNode;
+    this.driver = driver;
+    this._normalizer = _normalizer;
+  }
+  get queuedPlayers() {
+    const players = [];
+    this._namespaceList.forEach((ns) => {
+      ns.players.forEach((player) => {
+        if (player.queued) {
+          players.push(player);
+        }
+      });
+    });
+    return players;
+  }
+  createNamespace(namespaceId, hostElement) {
+    const ns = new AnimationTransitionNamespace(namespaceId, hostElement, this);
+    if (this.bodyNode && this.driver.containsElement(this.bodyNode, hostElement)) {
+      this._balanceNamespaceList(ns, hostElement);
+    } else {
+      this.newHostElements.set(hostElement, ns);
+      this.collectEnterElement(hostElement);
+    }
+    return this._namespaceLookup[namespaceId] = ns;
+  }
+  _balanceNamespaceList(ns, hostElement) {
+    const namespaceList = this._namespaceList;
+    const namespacesByHostElement = this.namespacesByHostElement;
+    const limit = namespaceList.length - 1;
+    if (limit >= 0) {
+      let found = false;
+      let ancestor = this.driver.getParentElement(hostElement);
+      while (ancestor) {
+        const ancestorNs = namespacesByHostElement.get(ancestor);
+        if (ancestorNs) {
+          const index = namespaceList.indexOf(ancestorNs);
+          namespaceList.splice(index + 1, 0, ns);
+          found = true;
+          break;
+        }
+        ancestor = this.driver.getParentElement(ancestor);
+      }
+      if (!found) {
+        namespaceList.unshift(ns);
+      }
+    } else {
+      namespaceList.push(ns);
+    }
+    namespacesByHostElement.set(hostElement, ns);
+    return ns;
+  }
+  register(namespaceId, hostElement) {
+    let ns = this._namespaceLookup[namespaceId];
+    if (!ns) {
+      ns = this.createNamespace(namespaceId, hostElement);
+    }
+    return ns;
+  }
+  registerTrigger(namespaceId, name, trigger) {
+    let ns = this._namespaceLookup[namespaceId];
+    if (ns && ns.register(name, trigger)) {
+      this.totalAnimations++;
+    }
+  }
+  destroy(namespaceId, context) {
+    if (!namespaceId) return;
+    this.afterFlush(() => {
+    });
+    this.afterFlushAnimationsDone(() => {
+      const ns = this._fetchNamespace(namespaceId);
+      this.namespacesByHostElement.delete(ns.hostElement);
+      const index = this._namespaceList.indexOf(ns);
+      if (index >= 0) {
+        this._namespaceList.splice(index, 1);
+      }
+      ns.destroy(context);
+      delete this._namespaceLookup[namespaceId];
+    });
+  }
+  _fetchNamespace(id) {
+    return this._namespaceLookup[id];
+  }
+  fetchNamespacesByElement(element) {
+    const namespaces = /* @__PURE__ */ new Set();
+    const elementStates = this.statesByElement.get(element);
+    if (elementStates) {
+      for (let stateValue of elementStates.values()) {
+        if (stateValue.namespaceId) {
+          const ns = this._fetchNamespace(stateValue.namespaceId);
+          if (ns) {
+            namespaces.add(ns);
+          }
+        }
+      }
+    }
+    return namespaces;
+  }
+  trigger(namespaceId, element, name, value) {
+    if (isElementNode(element)) {
+      const ns = this._fetchNamespace(namespaceId);
+      if (ns) {
+        ns.trigger(element, name, value);
+        return true;
+      }
+    }
+    return false;
+  }
+  insertNode(namespaceId, element, parent, insertBefore) {
+    if (!isElementNode(element)) return;
+    const details = element[REMOVAL_FLAG];
+    if (details && details.setForRemoval) {
+      details.setForRemoval = false;
+      details.setForMove = true;
+      const index = this.collectedLeaveElements.indexOf(element);
+      if (index >= 0) {
+        this.collectedLeaveElements.splice(index, 1);
+      }
+    }
+    if (namespaceId) {
+      const ns = this._fetchNamespace(namespaceId);
+      if (ns) {
+        ns.insertNode(element, parent);
+      }
+    }
+    if (insertBefore) {
+      this.collectEnterElement(element);
+    }
+  }
+  collectEnterElement(element) {
+    this.collectedEnterElements.push(element);
+  }
+  markElementAsDisabled(element, value) {
+    if (value) {
+      if (!this.disabledNodes.has(element)) {
+        this.disabledNodes.add(element);
+        addClass(element, DISABLED_CLASSNAME);
+      }
+    } else if (this.disabledNodes.has(element)) {
+      this.disabledNodes.delete(element);
+      removeClass(element, DISABLED_CLASSNAME);
+    }
+  }
+  removeNode(namespaceId, element, context) {
+    if (isElementNode(element)) {
+      const ns = namespaceId ? this._fetchNamespace(namespaceId) : null;
+      if (ns) {
+        ns.removeNode(element, context);
+      } else {
+        this.markElementAsRemoved(namespaceId, element, false, context);
+      }
+      const hostNS = this.namespacesByHostElement.get(element);
+      if (hostNS && hostNS.id !== namespaceId) {
+        hostNS.removeNode(element, context);
+      }
+    } else {
+      this._onRemovalComplete(element, context);
+    }
+  }
+  markElementAsRemoved(namespaceId, element, hasAnimation, context, previousTriggersValues) {
+    this.collectedLeaveElements.push(element);
+    element[REMOVAL_FLAG] = {
+      namespaceId,
+      setForRemoval: context,
+      hasAnimation,
+      removedBeforeQueried: false,
+      previousTriggersValues
+    };
+  }
+  listen(namespaceId, element, name, phase, callback) {
+    if (isElementNode(element)) {
+      return this._fetchNamespace(namespaceId).listen(element, name, phase, callback);
+    }
+    return () => {
+    };
+  }
+  _buildInstruction(entry, subTimelines, enterClassName, leaveClassName, skipBuildAst) {
+    return entry.transition.build(this.driver, entry.element, entry.fromState.value, entry.toState.value, enterClassName, leaveClassName, entry.fromState.options, entry.toState.options, subTimelines, skipBuildAst);
+  }
+  destroyInnerAnimations(containerElement) {
+    let elements = this.driver.query(containerElement, NG_TRIGGER_SELECTOR, true);
+    elements.forEach((element) => this.destroyActiveAnimationsForElement(element));
+    if (this.playersByQueriedElement.size == 0) return;
+    elements = this.driver.query(containerElement, NG_ANIMATING_SELECTOR, true);
+    elements.forEach((element) => this.finishActiveQueriedAnimationOnElement(element));
+  }
+  destroyActiveAnimationsForElement(element) {
+    const players = this.playersByElement.get(element);
+    if (players) {
+      players.forEach((player) => {
+        if (player.queued) {
+          player.markedForDestroy = true;
+        } else {
+          player.destroy();
+        }
+      });
+    }
+  }
+  finishActiveQueriedAnimationOnElement(element) {
+    const players = this.playersByQueriedElement.get(element);
+    if (players) {
+      players.forEach((player) => player.finish());
+    }
+  }
+  whenRenderingDone() {
+    return new Promise((resolve) => {
+      if (this.players.length) {
+        return optimizeGroupPlayer(this.players).onDone(() => resolve());
+      } else {
+        resolve();
+      }
+    });
+  }
+  processLeaveNode(element) {
+    const details = element[REMOVAL_FLAG];
+    if (details && details.setForRemoval) {
+      element[REMOVAL_FLAG] = NULL_REMOVAL_STATE;
+      if (details.namespaceId) {
+        this.destroyInnerAnimations(element);
+        const ns = this._fetchNamespace(details.namespaceId);
+        if (ns) {
+          ns.clearElementCache(element);
+        }
+      }
+      this._onRemovalComplete(element, details.setForRemoval);
+    }
+    if (element.classList?.contains(DISABLED_CLASSNAME)) {
+      this.markElementAsDisabled(element, false);
+    }
+    this.driver.query(element, DISABLED_SELECTOR, true).forEach((node) => {
+      this.markElementAsDisabled(node, false);
+    });
+  }
+  flush(microtaskId = -1) {
+    let players = [];
+    if (this.newHostElements.size) {
+      this.newHostElements.forEach((ns, element) => this._balanceNamespaceList(ns, element));
+      this.newHostElements.clear();
+    }
+    if (this.totalAnimations && this.collectedEnterElements.length) {
+      for (let i = 0; i < this.collectedEnterElements.length; i++) {
+        const elm = this.collectedEnterElements[i];
+        addClass(elm, STAR_CLASSNAME);
+      }
+    }
+    if (this._namespaceList.length && (this.totalQueuedPlayers || this.collectedLeaveElements.length)) {
+      const cleanupFns = [];
+      try {
+        players = this._flushAnimations(cleanupFns, microtaskId);
+      } finally {
+        for (let i = 0; i < cleanupFns.length; i++) {
+          cleanupFns[i]();
+        }
+      }
+    } else {
+      for (let i = 0; i < this.collectedLeaveElements.length; i++) {
+        const element = this.collectedLeaveElements[i];
+        this.processLeaveNode(element);
+      }
+    }
+    this.totalQueuedPlayers = 0;
+    this.collectedEnterElements.length = 0;
+    this.collectedLeaveElements.length = 0;
+    this._flushFns.forEach((fn) => fn());
+    this._flushFns = [];
+    if (this._whenQuietFns.length) {
+      const quietFns = this._whenQuietFns;
+      this._whenQuietFns = [];
+      if (players.length) {
+        optimizeGroupPlayer(players).onDone(() => {
+          quietFns.forEach((fn) => fn());
+        });
+      } else {
+        quietFns.forEach((fn) => fn());
+      }
+    }
+  }
+  reportError(errors) {
+    throw triggerTransitionsFailed(errors);
+  }
+  _flushAnimations(cleanupFns, microtaskId) {
+    const subTimelines = new ElementInstructionMap();
+    const skippedPlayers = [];
+    const skippedPlayersMap = /* @__PURE__ */ new Map();
+    const queuedInstructions = [];
+    const queriedElements = /* @__PURE__ */ new Map();
+    const allPreStyleElements = /* @__PURE__ */ new Map();
+    const allPostStyleElements = /* @__PURE__ */ new Map();
+    const disabledElementsSet = /* @__PURE__ */ new Set();
+    this.disabledNodes.forEach((node) => {
+      disabledElementsSet.add(node);
+      const nodesThatAreDisabled = this.driver.query(node, QUEUED_SELECTOR, true);
+      for (let i2 = 0; i2 < nodesThatAreDisabled.length; i2++) {
+        disabledElementsSet.add(nodesThatAreDisabled[i2]);
+      }
+    });
+    const bodyNode = this.bodyNode;
+    const allTriggerElements = Array.from(this.statesByElement.keys());
+    const enterNodeMap = buildRootMap(allTriggerElements, this.collectedEnterElements);
+    const enterNodeMapIds = /* @__PURE__ */ new Map();
+    let i = 0;
+    enterNodeMap.forEach((nodes, root) => {
+      const className = ENTER_CLASSNAME + i++;
+      enterNodeMapIds.set(root, className);
+      nodes.forEach((node) => addClass(node, className));
+    });
+    const allLeaveNodes = [];
+    const mergedLeaveNodes = /* @__PURE__ */ new Set();
+    const leaveNodesWithoutAnimations = /* @__PURE__ */ new Set();
+    for (let i2 = 0; i2 < this.collectedLeaveElements.length; i2++) {
+      const element = this.collectedLeaveElements[i2];
+      const details = element[REMOVAL_FLAG];
+      if (details && details.setForRemoval) {
+        allLeaveNodes.push(element);
+        mergedLeaveNodes.add(element);
+        if (details.hasAnimation) {
+          this.driver.query(element, STAR_SELECTOR, true).forEach((elm) => mergedLeaveNodes.add(elm));
+        } else {
+          leaveNodesWithoutAnimations.add(element);
+        }
+      }
+    }
+    const leaveNodeMapIds = /* @__PURE__ */ new Map();
+    const leaveNodeMap = buildRootMap(allTriggerElements, Array.from(mergedLeaveNodes));
+    leaveNodeMap.forEach((nodes, root) => {
+      const className = LEAVE_CLASSNAME + i++;
+      leaveNodeMapIds.set(root, className);
+      nodes.forEach((node) => addClass(node, className));
+    });
+    cleanupFns.push(() => {
+      enterNodeMap.forEach((nodes, root) => {
+        const className = enterNodeMapIds.get(root);
+        nodes.forEach((node) => removeClass(node, className));
+      });
+      leaveNodeMap.forEach((nodes, root) => {
+        const className = leaveNodeMapIds.get(root);
+        nodes.forEach((node) => removeClass(node, className));
+      });
+      allLeaveNodes.forEach((element) => {
+        this.processLeaveNode(element);
+      });
+    });
+    const allPlayers = [];
+    const erroneousTransitions = [];
+    for (let i2 = this._namespaceList.length - 1; i2 >= 0; i2--) {
+      const ns = this._namespaceList[i2];
+      ns.drainQueuedTransitions(microtaskId).forEach((entry) => {
+        const player = entry.player;
+        const element = entry.element;
+        allPlayers.push(player);
+        if (this.collectedEnterElements.length) {
+          const details = element[REMOVAL_FLAG];
+          if (details && details.setForMove) {
+            if (details.previousTriggersValues && details.previousTriggersValues.has(entry.triggerName)) {
+              const previousValue = details.previousTriggersValues.get(entry.triggerName);
+              const triggersWithStates = this.statesByElement.get(entry.element);
+              if (triggersWithStates && triggersWithStates.has(entry.triggerName)) {
+                const state = triggersWithStates.get(entry.triggerName);
+                state.value = previousValue;
+                triggersWithStates.set(entry.triggerName, state);
+              }
+            }
+            player.destroy();
+            return;
+          }
+        }
+        const nodeIsOrphaned = !bodyNode || !this.driver.containsElement(bodyNode, element);
+        const leaveClassName = leaveNodeMapIds.get(element);
+        const enterClassName = enterNodeMapIds.get(element);
+        const instruction = this._buildInstruction(entry, subTimelines, enterClassName, leaveClassName, nodeIsOrphaned);
+        if (instruction.errors && instruction.errors.length) {
+          erroneousTransitions.push(instruction);
+          return;
+        }
+        if (nodeIsOrphaned) {
+          player.onStart(() => eraseStyles(element, instruction.fromStyles));
+          player.onDestroy(() => setStyles(element, instruction.toStyles));
+          skippedPlayers.push(player);
+          return;
+        }
+        if (entry.isFallbackTransition) {
+          player.onStart(() => eraseStyles(element, instruction.fromStyles));
+          player.onDestroy(() => setStyles(element, instruction.toStyles));
+          skippedPlayers.push(player);
+          return;
+        }
+        const timelines = [];
+        instruction.timelines.forEach((tl) => {
+          tl.stretchStartingKeyframe = true;
+          if (!this.disabledNodes.has(tl.element)) {
+            timelines.push(tl);
+          }
+        });
+        instruction.timelines = timelines;
+        subTimelines.append(element, instruction.timelines);
+        const tuple = {
+          instruction,
+          player,
+          element
+        };
+        queuedInstructions.push(tuple);
+        instruction.queriedElements.forEach((element2) => getOrSetDefaultValue(queriedElements, element2, []).push(player));
+        instruction.preStyleProps.forEach((stringMap, element2) => {
+          if (stringMap.size) {
+            let setVal = allPreStyleElements.get(element2);
+            if (!setVal) {
+              allPreStyleElements.set(element2, setVal = /* @__PURE__ */ new Set());
+            }
+            stringMap.forEach((_, prop) => setVal.add(prop));
+          }
+        });
+        instruction.postStyleProps.forEach((stringMap, element2) => {
+          let setVal = allPostStyleElements.get(element2);
+          if (!setVal) {
+            allPostStyleElements.set(element2, setVal = /* @__PURE__ */ new Set());
+          }
+          stringMap.forEach((_, prop) => setVal.add(prop));
+        });
+      });
+    }
+    if (erroneousTransitions.length) {
+      const errors = [];
+      erroneousTransitions.forEach((instruction) => {
+        errors.push(transitionFailed(instruction.triggerName, instruction.errors));
+      });
+      allPlayers.forEach((player) => player.destroy());
+      this.reportError(errors);
+    }
+    const allPreviousPlayersMap = /* @__PURE__ */ new Map();
+    const animationElementMap = /* @__PURE__ */ new Map();
+    queuedInstructions.forEach((entry) => {
+      const element = entry.element;
+      if (subTimelines.has(element)) {
+        animationElementMap.set(element, element);
+        this._beforeAnimationBuild(entry.player.namespaceId, entry.instruction, allPreviousPlayersMap);
+      }
+    });
+    skippedPlayers.forEach((player) => {
+      const element = player.element;
+      const previousPlayers = this._getPreviousPlayers(element, false, player.namespaceId, player.triggerName, null);
+      previousPlayers.forEach((prevPlayer) => {
+        getOrSetDefaultValue(allPreviousPlayersMap, element, []).push(prevPlayer);
+        prevPlayer.destroy();
+      });
+    });
+    const replaceNodes = allLeaveNodes.filter((node) => {
+      return replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements);
+    });
+    const postStylesMap = /* @__PURE__ */ new Map();
+    const allLeaveQueriedNodes = cloakAndComputeStyles(postStylesMap, this.driver, leaveNodesWithoutAnimations, allPostStyleElements, AUTO_STYLE);
+    allLeaveQueriedNodes.forEach((node) => {
+      if (replacePostStylesAsPre(node, allPreStyleElements, allPostStyleElements)) {
+        replaceNodes.push(node);
+      }
+    });
+    const preStylesMap = /* @__PURE__ */ new Map();
+    enterNodeMap.forEach((nodes, root) => {
+      cloakAndComputeStyles(preStylesMap, this.driver, new Set(nodes), allPreStyleElements, ɵPRE_STYLE);
+    });
+    replaceNodes.forEach((node) => {
+      const post = postStylesMap.get(node);
+      const pre = preStylesMap.get(node);
+      postStylesMap.set(node, new Map([...post?.entries() ?? [], ...pre?.entries() ?? []]));
+    });
+    const rootPlayers = [];
+    const subPlayers = [];
+    const NO_PARENT_ANIMATION_ELEMENT_DETECTED = {};
+    queuedInstructions.forEach((entry) => {
+      const {
+        element,
+        player,
+        instruction
+      } = entry;
+      if (subTimelines.has(element)) {
+        if (disabledElementsSet.has(element)) {
+          player.onDestroy(() => setStyles(element, instruction.toStyles));
+          player.disabled = true;
+          player.overrideTotalTime(instruction.totalTime);
+          skippedPlayers.push(player);
+          return;
+        }
+        let parentWithAnimation = NO_PARENT_ANIMATION_ELEMENT_DETECTED;
+        if (animationElementMap.size > 1) {
+          let elm = element;
+          const parentsToAdd = [];
+          while (elm = elm.parentNode) {
+            const detectedParent = animationElementMap.get(elm);
+            if (detectedParent) {
+              parentWithAnimation = detectedParent;
+              break;
+            }
+            parentsToAdd.push(elm);
+          }
+          parentsToAdd.forEach((parent) => animationElementMap.set(parent, parentWithAnimation));
+        }
+        const innerPlayer = this._buildAnimation(player.namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap);
+        player.setRealPlayer(innerPlayer);
+        if (parentWithAnimation === NO_PARENT_ANIMATION_ELEMENT_DETECTED) {
+          rootPlayers.push(player);
+        } else {
+          const parentPlayers = this.playersByElement.get(parentWithAnimation);
+          if (parentPlayers && parentPlayers.length) {
+            player.parentPlayer = optimizeGroupPlayer(parentPlayers);
+          }
+          skippedPlayers.push(player);
+        }
+      } else {
+        eraseStyles(element, instruction.fromStyles);
+        player.onDestroy(() => setStyles(element, instruction.toStyles));
+        subPlayers.push(player);
+        if (disabledElementsSet.has(element)) {
+          skippedPlayers.push(player);
+        }
+      }
+    });
+    subPlayers.forEach((player) => {
+      const playersForElement = skippedPlayersMap.get(player.element);
+      if (playersForElement && playersForElement.length) {
+        const innerPlayer = optimizeGroupPlayer(playersForElement);
+        player.setRealPlayer(innerPlayer);
+      }
+    });
+    skippedPlayers.forEach((player) => {
+      if (player.parentPlayer) {
+        player.syncPlayerEvents(player.parentPlayer);
+      } else {
+        player.destroy();
+      }
+    });
+    for (let i2 = 0; i2 < allLeaveNodes.length; i2++) {
+      const element = allLeaveNodes[i2];
+      const details = element[REMOVAL_FLAG];
+      removeClass(element, LEAVE_CLASSNAME);
+      if (details && details.hasAnimation) continue;
+      let players = [];
+      if (queriedElements.size) {
+        let queriedPlayerResults = queriedElements.get(element);
+        if (queriedPlayerResults && queriedPlayerResults.length) {
+          players.push(...queriedPlayerResults);
+        }
+        let queriedInnerElements = this.driver.query(element, NG_ANIMATING_SELECTOR, true);
+        for (let j = 0; j < queriedInnerElements.length; j++) {
+          let queriedPlayers = queriedElements.get(queriedInnerElements[j]);
+          if (queriedPlayers && queriedPlayers.length) {
+            players.push(...queriedPlayers);
+          }
+        }
+      }
+      const activePlayers = players.filter((p) => !p.destroyed);
+      if (activePlayers.length) {
+        removeNodesAfterAnimationDone(this, element, activePlayers);
+      } else {
+        this.processLeaveNode(element);
+      }
+    }
+    allLeaveNodes.length = 0;
+    rootPlayers.forEach((player) => {
+      this.players.push(player);
+      player.onDone(() => {
+        player.destroy();
+        const index = this.players.indexOf(player);
+        this.players.splice(index, 1);
+      });
+      player.play();
+    });
+    return rootPlayers;
+  }
+  afterFlush(callback) {
+    this._flushFns.push(callback);
+  }
+  afterFlushAnimationsDone(callback) {
+    this._whenQuietFns.push(callback);
+  }
+  _getPreviousPlayers(element, isQueriedElement, namespaceId, triggerName, toStateValue) {
+    let players = [];
+    if (isQueriedElement) {
+      const queriedElementPlayers = this.playersByQueriedElement.get(element);
+      if (queriedElementPlayers) {
+        players = queriedElementPlayers;
+      }
+    } else {
+      const elementPlayers = this.playersByElement.get(element);
+      if (elementPlayers) {
+        const isRemovalAnimation = !toStateValue || toStateValue == VOID_VALUE;
+        elementPlayers.forEach((player) => {
+          if (player.queued) return;
+          if (!isRemovalAnimation && player.triggerName != triggerName) return;
+          players.push(player);
+        });
+      }
+    }
+    if (namespaceId || triggerName) {
+      players = players.filter((player) => {
+        if (namespaceId && namespaceId != player.namespaceId) return false;
+        if (triggerName && triggerName != player.triggerName) return false;
+        return true;
+      });
+    }
+    return players;
+  }
+  _beforeAnimationBuild(namespaceId, instruction, allPreviousPlayersMap) {
+    const triggerName = instruction.triggerName;
+    const rootElement = instruction.element;
+    const targetNameSpaceId = instruction.isRemovalTransition ? void 0 : namespaceId;
+    const targetTriggerName = instruction.isRemovalTransition ? void 0 : triggerName;
+    for (const timelineInstruction of instruction.timelines) {
+      const element = timelineInstruction.element;
+      const isQueriedElement = element !== rootElement;
+      const players = getOrSetDefaultValue(allPreviousPlayersMap, element, []);
+      const previousPlayers = this._getPreviousPlayers(element, isQueriedElement, targetNameSpaceId, targetTriggerName, instruction.toState);
+      previousPlayers.forEach((player) => {
+        const realPlayer = player.getRealPlayer();
+        if (realPlayer.beforeDestroy) {
+          realPlayer.beforeDestroy();
+        }
+        player.destroy();
+        players.push(player);
+      });
+    }
+    eraseStyles(rootElement, instruction.fromStyles);
+  }
+  _buildAnimation(namespaceId, instruction, allPreviousPlayersMap, skippedPlayersMap, preStylesMap, postStylesMap) {
+    const triggerName = instruction.triggerName;
+    const rootElement = instruction.element;
+    const allQueriedPlayers = [];
+    const allConsumedElements = /* @__PURE__ */ new Set();
+    const allSubElements = /* @__PURE__ */ new Set();
+    const allNewPlayers = instruction.timelines.map((timelineInstruction) => {
+      const element = timelineInstruction.element;
+      allConsumedElements.add(element);
+      const details = element[REMOVAL_FLAG];
+      if (details && details.removedBeforeQueried) return new NoopAnimationPlayer(timelineInstruction.duration, timelineInstruction.delay);
+      const isQueriedElement = element !== rootElement;
+      const previousPlayers = flattenGroupPlayers((allPreviousPlayersMap.get(element) || EMPTY_PLAYER_ARRAY).map((p) => p.getRealPlayer())).filter((p) => {
+        const pp = p;
+        return pp.element ? pp.element === element : false;
+      });
+      const preStyles = preStylesMap.get(element);
+      const postStyles = postStylesMap.get(element);
+      const keyframes = normalizeKeyframes$1(this._normalizer, timelineInstruction.keyframes, preStyles, postStyles);
+      const player2 = this._buildPlayer(timelineInstruction, keyframes, previousPlayers);
+      if (timelineInstruction.subTimeline && skippedPlayersMap) {
+        allSubElements.add(element);
+      }
+      if (isQueriedElement) {
+        const wrappedPlayer = new TransitionAnimationPlayer(namespaceId, triggerName, element);
+        wrappedPlayer.setRealPlayer(player2);
+        allQueriedPlayers.push(wrappedPlayer);
+      }
+      return player2;
+    });
+    allQueriedPlayers.forEach((player2) => {
+      getOrSetDefaultValue(this.playersByQueriedElement, player2.element, []).push(player2);
+      player2.onDone(() => deleteOrUnsetInMap(this.playersByQueriedElement, player2.element, player2));
+    });
+    allConsumedElements.forEach((element) => addClass(element, NG_ANIMATING_CLASSNAME));
+    const player = optimizeGroupPlayer(allNewPlayers);
+    player.onDestroy(() => {
+      allConsumedElements.forEach((element) => removeClass(element, NG_ANIMATING_CLASSNAME));
+      setStyles(rootElement, instruction.toStyles);
+    });
+    allSubElements.forEach((element) => {
+      getOrSetDefaultValue(skippedPlayersMap, element, []).push(player);
+    });
+    return player;
+  }
+  _buildPlayer(instruction, keyframes, previousPlayers) {
+    if (keyframes.length > 0) {
+      return this.driver.animate(instruction.element, keyframes, instruction.duration, instruction.delay, instruction.easing, previousPlayers);
+    }
+    return new NoopAnimationPlayer(instruction.duration, instruction.delay);
+  }
+};
+var TransitionAnimationPlayer = class {
+  namespaceId;
+  triggerName;
+  element;
+  _player = new NoopAnimationPlayer();
+  _containsRealPlayer = false;
+  _queuedCallbacks = /* @__PURE__ */ new Map();
+  destroyed = false;
+  parentPlayer = null;
+  markedForDestroy = false;
+  disabled = false;
+  queued = true;
+  totalTime = 0;
+  constructor(namespaceId, triggerName, element) {
+    this.namespaceId = namespaceId;
+    this.triggerName = triggerName;
+    this.element = element;
+  }
+  setRealPlayer(player) {
+    if (this._containsRealPlayer) return;
+    this._player = player;
+    this._queuedCallbacks.forEach((callbacks, phase) => {
+      callbacks.forEach((callback) => listenOnPlayer(player, phase, void 0, callback));
+    });
+    this._queuedCallbacks.clear();
+    this._containsRealPlayer = true;
+    this.overrideTotalTime(player.totalTime);
+    this.queued = false;
+  }
+  getRealPlayer() {
+    return this._player;
+  }
+  overrideTotalTime(totalTime) {
+    this.totalTime = totalTime;
+  }
+  syncPlayerEvents(player) {
+    const p = this._player;
+    if (p.triggerCallback) {
+      player.onStart(() => p.triggerCallback("start"));
+    }
+    player.onDone(() => this.finish());
+    player.onDestroy(() => this.destroy());
+  }
+  _queueEvent(name, callback) {
+    getOrSetDefaultValue(this._queuedCallbacks, name, []).push(callback);
+  }
+  onDone(fn) {
+    if (this.queued) {
+      this._queueEvent("done", fn);
+    }
+    this._player.onDone(fn);
+  }
+  onStart(fn) {
+    if (this.queued) {
+      this._queueEvent("start", fn);
+    }
+    this._player.onStart(fn);
+  }
+  onDestroy(fn) {
+    if (this.queued) {
+      this._queueEvent("destroy", fn);
+    }
+    this._player.onDestroy(fn);
+  }
+  init() {
+    this._player.init();
+  }
+  hasStarted() {
+    return this.queued ? false : this._player.hasStarted();
+  }
+  play() {
+    !this.queued && this._player.play();
+  }
+  pause() {
+    !this.queued && this._player.pause();
+  }
+  restart() {
+    !this.queued && this._player.restart();
+  }
+  finish() {
+    this._player.finish();
+  }
+  destroy() {
+    this.destroyed = true;
+    this._player.destroy();
+  }
+  reset() {
+    !this.queued && this._player.reset();
+  }
+  setPosition(p) {
+    if (!this.queued) {
+      this._player.setPosition(p);
+    }
+  }
+  getPosition() {
+    return this.queued ? 0 : this._player.getPosition();
+  }
+  /** @internal */
+  triggerCallback(phaseName) {
+    const p = this._player;
+    if (p.triggerCallback) {
+      p.triggerCallback(phaseName);
+    }
+  }
+};
+function deleteOrUnsetInMap(map, key, value) {
+  let currentValues = map.get(key);
+  if (currentValues) {
+    if (currentValues.length) {
+      const index = currentValues.indexOf(value);
+      currentValues.splice(index, 1);
+    }
+    if (currentValues.length == 0) {
+      map.delete(key);
+    }
+  }
+  return currentValues;
+}
+function normalizeTriggerValue(value) {
+  return value != null ? value : null;
+}
+function isElementNode(node) {
+  return node && node["nodeType"] === 1;
+}
+function isTriggerEventValid(eventName) {
+  return eventName == "start" || eventName == "done";
+}
+function cloakElement(element, value) {
+  const oldValue = element.style.display;
+  element.style.display = value != null ? value : "none";
+  return oldValue;
+}
+function cloakAndComputeStyles(valuesMap, driver, elements, elementPropsMap, defaultStyle) {
+  const cloakVals = [];
+  elements.forEach((element) => cloakVals.push(cloakElement(element)));
+  const failedElements = [];
+  elementPropsMap.forEach((props, element) => {
+    const styles = /* @__PURE__ */ new Map();
+    props.forEach((prop) => {
+      const value = driver.computeStyle(element, prop, defaultStyle);
+      styles.set(prop, value);
+      if (!value || value.length == 0) {
+        element[REMOVAL_FLAG] = NULL_REMOVED_QUERIED_STATE;
+        failedElements.push(element);
+      }
+    });
+    valuesMap.set(element, styles);
+  });
+  let i = 0;
+  elements.forEach((element) => cloakElement(element, cloakVals[i++]));
+  return failedElements;
+}
+function buildRootMap(roots, nodes) {
+  const rootMap = /* @__PURE__ */ new Map();
+  roots.forEach((root) => rootMap.set(root, []));
+  if (nodes.length == 0) return rootMap;
+  const NULL_NODE = 1;
+  const nodeSet = new Set(nodes);
+  const localRootMap = /* @__PURE__ */ new Map();
+  function getRoot(node) {
+    if (!node) return NULL_NODE;
+    let root = localRootMap.get(node);
+    if (root) return root;
+    const parent = node.parentNode;
+    if (rootMap.has(parent)) {
+      root = parent;
+    } else if (nodeSet.has(parent)) {
+      root = NULL_NODE;
+    } else {
+      root = getRoot(parent);
+    }
+    localRootMap.set(node, root);
+    return root;
+  }
+  nodes.forEach((node) => {
+    const root = getRoot(node);
+    if (root !== NULL_NODE) {
+      rootMap.get(root).push(node);
+    }
+  });
+  return rootMap;
+}
+function addClass(element, className) {
+  element.classList?.add(className);
+}
+function removeClass(element, className) {
+  element.classList?.remove(className);
+}
+function removeNodesAfterAnimationDone(engine, element, players) {
+  optimizeGroupPlayer(players).onDone(() => engine.processLeaveNode(element));
+}
+function flattenGroupPlayers(players) {
+  const finalPlayers = [];
+  _flattenGroupPlayersRecur(players, finalPlayers);
+  return finalPlayers;
+}
+function _flattenGroupPlayersRecur(players, finalPlayers) {
+  for (let i = 0; i < players.length; i++) {
+    const player = players[i];
+    if (player instanceof AnimationGroupPlayer) {
+      _flattenGroupPlayersRecur(player.players, finalPlayers);
+    } else {
+      finalPlayers.push(player);
+    }
+  }
+}
+function objEquals(a, b) {
+  const k1 = Object.keys(a);
+  const k2 = Object.keys(b);
+  if (k1.length != k2.length) return false;
+  for (let i = 0; i < k1.length; i++) {
+    const prop = k1[i];
+    if (!b.hasOwnProperty(prop) || a[prop] !== b[prop]) return false;
+  }
+  return true;
+}
+function replacePostStylesAsPre(element, allPreStyleElements, allPostStyleElements) {
+  const postEntry = allPostStyleElements.get(element);
+  if (!postEntry) return false;
+  let preEntry = allPreStyleElements.get(element);
+  if (preEntry) {
+    postEntry.forEach((data) => preEntry.add(data));
+  } else {
+    allPreStyleElements.set(element, postEntry);
+  }
+  allPostStyleElements.delete(element);
+  return true;
+}
+var AnimationEngine = class {
+  _driver;
+  _normalizer;
+  _transitionEngine;
+  _timelineEngine;
+  _triggerCache = {};
+  // this method is designed to be overridden by the code that uses this engine
+  onRemovalComplete = (element, context) => {
+  };
+  constructor(doc, _driver, _normalizer) {
+    this._driver = _driver;
+    this._normalizer = _normalizer;
+    this._transitionEngine = new TransitionAnimationEngine(doc.body, _driver, _normalizer);
+    this._timelineEngine = new TimelineAnimationEngine(doc.body, _driver, _normalizer);
+    this._transitionEngine.onRemovalComplete = (element, context) => this.onRemovalComplete(element, context);
+  }
+  registerTrigger(componentId, namespaceId, hostElement, name, metadata) {
+    const cacheKey = componentId + "-" + name;
+    let trigger = this._triggerCache[cacheKey];
+    if (!trigger) {
+      const errors = [];
+      const warnings = [];
+      const ast = buildAnimationAst(this._driver, metadata, errors, warnings);
+      if (errors.length) {
+        throw triggerBuildFailed(name, errors);
+      }
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        if (warnings.length) {
+          warnTriggerBuild(name, warnings);
+        }
+      }
+      trigger = buildTrigger(name, ast, this._normalizer);
+      this._triggerCache[cacheKey] = trigger;
+    }
+    this._transitionEngine.registerTrigger(namespaceId, name, trigger);
+  }
+  register(namespaceId, hostElement) {
+    this._transitionEngine.register(namespaceId, hostElement);
+  }
+  destroy(namespaceId, context) {
+    this._transitionEngine.destroy(namespaceId, context);
+  }
+  onInsert(namespaceId, element, parent, insertBefore) {
+    this._transitionEngine.insertNode(namespaceId, element, parent, insertBefore);
+  }
+  onRemove(namespaceId, element, context) {
+    this._transitionEngine.removeNode(namespaceId, element, context);
+  }
+  disableAnimations(element, disable) {
+    this._transitionEngine.markElementAsDisabled(element, disable);
+  }
+  process(namespaceId, element, property, value) {
+    if (property.charAt(0) == "@") {
+      const [id, action] = parseTimelineCommand(property);
+      const args = value;
+      this._timelineEngine.command(id, element, action, args);
+    } else {
+      this._transitionEngine.trigger(namespaceId, element, property, value);
+    }
+  }
+  listen(namespaceId, element, eventName, eventPhase, callback) {
+    if (eventName.charAt(0) == "@") {
+      const [id, action] = parseTimelineCommand(eventName);
+      return this._timelineEngine.listen(id, element, action, callback);
+    }
+    return this._transitionEngine.listen(namespaceId, element, eventName, eventPhase, callback);
+  }
+  flush(microtaskId = -1) {
+    this._transitionEngine.flush(microtaskId);
+  }
+  get players() {
+    return [...this._transitionEngine.players, ...this._timelineEngine.players];
+  }
+  whenRenderingDone() {
+    return this._transitionEngine.whenRenderingDone();
+  }
+  afterFlushAnimationsDone(cb) {
+    this._transitionEngine.afterFlushAnimationsDone(cb);
+  }
+};
+function packageNonAnimatableStyles(element, styles) {
+  let startStyles = null;
+  let endStyles = null;
+  if (Array.isArray(styles) && styles.length) {
+    startStyles = filterNonAnimatableStyles(styles[0]);
+    if (styles.length > 1) {
+      endStyles = filterNonAnimatableStyles(styles[styles.length - 1]);
+    }
+  } else if (styles instanceof Map) {
+    startStyles = filterNonAnimatableStyles(styles);
+  }
+  return startStyles || endStyles ? new SpecialCasedStyles(element, startStyles, endStyles) : null;
+}
+var SpecialCasedStyles = class _SpecialCasedStyles {
+  _element;
+  _startStyles;
+  _endStyles;
+  static initialStylesByElement = /* @__PURE__ */ new WeakMap();
+  _state = 0;
+  _initialStyles;
+  constructor(_element, _startStyles, _endStyles) {
+    this._element = _element;
+    this._startStyles = _startStyles;
+    this._endStyles = _endStyles;
+    let initialStyles = _SpecialCasedStyles.initialStylesByElement.get(_element);
+    if (!initialStyles) {
+      _SpecialCasedStyles.initialStylesByElement.set(_element, initialStyles = /* @__PURE__ */ new Map());
+    }
+    this._initialStyles = initialStyles;
+  }
+  start() {
+    if (this._state < 1) {
+      if (this._startStyles) {
+        setStyles(this._element, this._startStyles, this._initialStyles);
+      }
+      this._state = 1;
+    }
+  }
+  finish() {
+    this.start();
+    if (this._state < 2) {
+      setStyles(this._element, this._initialStyles);
+      if (this._endStyles) {
+        setStyles(this._element, this._endStyles);
+        this._endStyles = null;
+      }
+      this._state = 1;
+    }
+  }
+  destroy() {
+    this.finish();
+    if (this._state < 3) {
+      _SpecialCasedStyles.initialStylesByElement.delete(this._element);
+      if (this._startStyles) {
+        eraseStyles(this._element, this._startStyles);
+        this._endStyles = null;
+      }
+      if (this._endStyles) {
+        eraseStyles(this._element, this._endStyles);
+        this._endStyles = null;
+      }
+      setStyles(this._element, this._initialStyles);
+      this._state = 3;
+    }
+  }
+};
+function filterNonAnimatableStyles(styles) {
+  let result = null;
+  styles.forEach((val, prop) => {
+    if (isNonAnimatableStyle(prop)) {
+      result = result || /* @__PURE__ */ new Map();
+      result.set(prop, val);
+    }
+  });
+  return result;
+}
+function isNonAnimatableStyle(prop) {
+  return prop === "display" || prop === "position";
+}
+var WebAnimationsPlayer = class {
+  element;
+  keyframes;
+  options;
+  _specialStyles;
+  _onDoneFns = [];
+  _onStartFns = [];
+  _onDestroyFns = [];
+  _duration;
+  _delay;
+  _initialized = false;
+  _finished = false;
+  _started = false;
+  _destroyed = false;
+  _finalKeyframe;
+  // the following original fns are persistent copies of the _onStartFns and _onDoneFns
+  // and are used to reset the fns to their original values upon reset()
+  // (since the _onStartFns and _onDoneFns get deleted after they are called)
+  _originalOnDoneFns = [];
+  _originalOnStartFns = [];
+  // using non-null assertion because it's re(set) by init();
+  domPlayer;
+  time = 0;
+  parentPlayer = null;
+  currentSnapshot = /* @__PURE__ */ new Map();
+  constructor(element, keyframes, options, _specialStyles) {
+    this.element = element;
+    this.keyframes = keyframes;
+    this.options = options;
+    this._specialStyles = _specialStyles;
+    this._duration = options["duration"];
+    this._delay = options["delay"] || 0;
+    this.time = this._duration + this._delay;
+  }
+  _onFinish() {
+    if (!this._finished) {
+      this._finished = true;
+      this._onDoneFns.forEach((fn) => fn());
+      this._onDoneFns = [];
+    }
+  }
+  init() {
+    this._buildPlayer();
+    this._preparePlayerBeforeStart();
+  }
+  _buildPlayer() {
+    if (this._initialized) return;
+    this._initialized = true;
+    const keyframes = this.keyframes;
+    this.domPlayer = this._triggerWebAnimation(this.element, keyframes, this.options);
+    this._finalKeyframe = keyframes.length ? keyframes[keyframes.length - 1] : /* @__PURE__ */ new Map();
+    const onFinish = () => this._onFinish();
+    this.domPlayer.addEventListener("finish", onFinish);
+    this.onDestroy(() => {
+      this.domPlayer.removeEventListener("finish", onFinish);
+    });
+  }
+  _preparePlayerBeforeStart() {
+    if (this._delay) {
+      this._resetDomPlayerState();
+    } else {
+      this.domPlayer.pause();
+    }
+  }
+  _convertKeyframesToObject(keyframes) {
+    const kfs = [];
+    keyframes.forEach((frame) => {
+      kfs.push(Object.fromEntries(frame));
+    });
+    return kfs;
+  }
+  /** @internal */
+  _triggerWebAnimation(element, keyframes, options) {
+    return element.animate(this._convertKeyframesToObject(keyframes), options);
+  }
+  onStart(fn) {
+    this._originalOnStartFns.push(fn);
+    this._onStartFns.push(fn);
+  }
+  onDone(fn) {
+    this._originalOnDoneFns.push(fn);
+    this._onDoneFns.push(fn);
+  }
+  onDestroy(fn) {
+    this._onDestroyFns.push(fn);
+  }
+  play() {
+    this._buildPlayer();
+    if (!this.hasStarted()) {
+      this._onStartFns.forEach((fn) => fn());
+      this._onStartFns = [];
+      this._started = true;
+      if (this._specialStyles) {
+        this._specialStyles.start();
+      }
+    }
+    this.domPlayer.play();
+  }
+  pause() {
+    this.init();
+    this.domPlayer.pause();
+  }
+  finish() {
+    this.init();
+    if (this._specialStyles) {
+      this._specialStyles.finish();
+    }
+    this._onFinish();
+    this.domPlayer.finish();
+  }
+  reset() {
+    this._resetDomPlayerState();
+    this._destroyed = false;
+    this._finished = false;
+    this._started = false;
+    this._onStartFns = this._originalOnStartFns;
+    this._onDoneFns = this._originalOnDoneFns;
+  }
+  _resetDomPlayerState() {
+    if (this.domPlayer) {
+      this.domPlayer.cancel();
+    }
+  }
+  restart() {
+    this.reset();
+    this.play();
+  }
+  hasStarted() {
+    return this._started;
+  }
+  destroy() {
+    if (!this._destroyed) {
+      this._destroyed = true;
+      this._resetDomPlayerState();
+      this._onFinish();
+      if (this._specialStyles) {
+        this._specialStyles.destroy();
+      }
+      this._onDestroyFns.forEach((fn) => fn());
+      this._onDestroyFns = [];
+    }
+  }
+  setPosition(p) {
+    if (this.domPlayer === void 0) {
+      this.init();
+    }
+    this.domPlayer.currentTime = p * this.time;
+  }
+  getPosition() {
+    return +(this.domPlayer.currentTime ?? 0) / this.time;
+  }
+  get totalTime() {
+    return this._delay + this._duration;
+  }
+  beforeDestroy() {
+    const styles = /* @__PURE__ */ new Map();
+    if (this.hasStarted()) {
+      const finalKeyframe = this._finalKeyframe;
+      finalKeyframe.forEach((val, prop) => {
+        if (prop !== "offset") {
+          styles.set(prop, this._finished ? val : computeStyle(this.element, prop));
+        }
+      });
+    }
+    this.currentSnapshot = styles;
+  }
+  /** @internal */
+  triggerCallback(phaseName) {
+    const methods = phaseName === "start" ? this._onStartFns : this._onDoneFns;
+    methods.forEach((fn) => fn());
+    methods.length = 0;
+  }
+};
+var WebAnimationsDriver = class {
+  validateStyleProperty(prop) {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      return validateStyleProperty(prop);
+    }
+    return true;
+  }
+  validateAnimatableStyleProperty(prop) {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      const cssProp = camelCaseToDashCase(prop);
+      return validateWebAnimatableStyleProperty(cssProp);
+    }
+    return true;
+  }
+  containsElement(elm1, elm2) {
+    return containsElement(elm1, elm2);
+  }
+  getParentElement(element) {
+    return getParentElement(element);
+  }
+  query(element, selector, multi) {
+    return invokeQuery(element, selector, multi);
+  }
+  computeStyle(element, prop, defaultValue) {
+    return computeStyle(element, prop);
+  }
+  animate(element, keyframes, duration, delay, easing, previousPlayers = []) {
+    const fill = delay == 0 ? "both" : "forwards";
+    const playerOptions = {
+      duration,
+      delay,
+      fill
+    };
+    if (easing) {
+      playerOptions["easing"] = easing;
+    }
+    const previousStyles = /* @__PURE__ */ new Map();
+    const previousWebAnimationPlayers = previousPlayers.filter((player) => player instanceof WebAnimationsPlayer);
+    if (allowPreviousPlayerStylesMerge(duration, delay)) {
+      previousWebAnimationPlayers.forEach((player) => {
+        player.currentSnapshot.forEach((val, prop) => previousStyles.set(prop, val));
+      });
+    }
+    let _keyframes = normalizeKeyframes(keyframes).map((styles) => new Map(styles));
+    _keyframes = balancePreviousStylesIntoKeyframes(element, _keyframes, previousStyles);
+    const specialStyles = packageNonAnimatableStyles(element, _keyframes);
+    return new WebAnimationsPlayer(element, _keyframes, playerOptions, specialStyles);
+  }
+};
+var ANIMATION_PREFIX = "@";
+var DISABLE_ANIMATIONS_FLAG = "@.disabled";
+var BaseAnimationRenderer = class {
+  namespaceId;
+  delegate;
+  engine;
+  _onDestroy;
+  // We need to explicitly type this property because of an api-extractor bug
+  // See https://github.com/microsoft/rushstack/issues/4390
+  ɵtype = 0;
+  constructor(namespaceId, delegate, engine, _onDestroy) {
+    this.namespaceId = namespaceId;
+    this.delegate = delegate;
+    this.engine = engine;
+    this._onDestroy = _onDestroy;
+  }
+  get data() {
+    return this.delegate.data;
+  }
+  destroyNode(node) {
+    this.delegate.destroyNode?.(node);
+  }
+  destroy() {
+    this.engine.destroy(this.namespaceId, this.delegate);
+    this.engine.afterFlushAnimationsDone(() => {
+      queueMicrotask(() => {
+        this.delegate.destroy();
+      });
+    });
+    this._onDestroy?.();
+  }
+  createElement(name, namespace) {
+    return this.delegate.createElement(name, namespace);
+  }
+  createComment(value) {
+    return this.delegate.createComment(value);
+  }
+  createText(value) {
+    return this.delegate.createText(value);
+  }
+  appendChild(parent, newChild) {
+    this.delegate.appendChild(parent, newChild);
+    this.engine.onInsert(this.namespaceId, newChild, parent, false);
+  }
+  insertBefore(parent, newChild, refChild, isMove = true) {
+    this.delegate.insertBefore(parent, newChild, refChild);
+    this.engine.onInsert(this.namespaceId, newChild, parent, isMove);
+  }
+  removeChild(parent, oldChild, isHostElement) {
+    if (this.parentNode(oldChild)) {
+      this.engine.onRemove(this.namespaceId, oldChild, this.delegate);
+    }
+  }
+  selectRootElement(selectorOrNode, preserveContent) {
+    return this.delegate.selectRootElement(selectorOrNode, preserveContent);
+  }
+  parentNode(node) {
+    return this.delegate.parentNode(node);
+  }
+  nextSibling(node) {
+    return this.delegate.nextSibling(node);
+  }
+  setAttribute(el, name, value, namespace) {
+    this.delegate.setAttribute(el, name, value, namespace);
+  }
+  removeAttribute(el, name, namespace) {
+    this.delegate.removeAttribute(el, name, namespace);
+  }
+  addClass(el, name) {
+    this.delegate.addClass(el, name);
+  }
+  removeClass(el, name) {
+    this.delegate.removeClass(el, name);
+  }
+  setStyle(el, style2, value, flags) {
+    this.delegate.setStyle(el, style2, value, flags);
+  }
+  removeStyle(el, style2, flags) {
+    this.delegate.removeStyle(el, style2, flags);
+  }
+  setProperty(el, name, value) {
+    if (name.charAt(0) == ANIMATION_PREFIX && name == DISABLE_ANIMATIONS_FLAG) {
+      this.disableAnimations(el, !!value);
+    } else {
+      this.delegate.setProperty(el, name, value);
+    }
+  }
+  setValue(node, value) {
+    this.delegate.setValue(node, value);
+  }
+  listen(target, eventName, callback, options) {
+    return this.delegate.listen(target, eventName, callback, options);
+  }
+  disableAnimations(element, value) {
+    this.engine.disableAnimations(element, value);
+  }
+};
+var AnimationRenderer = class extends BaseAnimationRenderer {
+  factory;
+  constructor(factory, namespaceId, delegate, engine, onDestroy) {
+    super(namespaceId, delegate, engine, onDestroy);
+    this.factory = factory;
+    this.namespaceId = namespaceId;
+  }
+  setProperty(el, name, value) {
+    if (name.charAt(0) == ANIMATION_PREFIX) {
+      if (name.charAt(1) == "." && name == DISABLE_ANIMATIONS_FLAG) {
+        value = value === void 0 ? true : !!value;
+        this.disableAnimations(el, value);
+      } else {
+        this.engine.process(this.namespaceId, el, name.slice(1), value);
+      }
+    } else {
+      this.delegate.setProperty(el, name, value);
+    }
+  }
+  listen(target, eventName, callback, options) {
+    if (eventName.charAt(0) == ANIMATION_PREFIX) {
+      const element = resolveElementFromTarget(target);
+      let name = eventName.slice(1);
+      let phase = "";
+      if (name.charAt(0) != ANIMATION_PREFIX) {
+        [name, phase] = parseTriggerCallbackName(name);
+      }
+      return this.engine.listen(this.namespaceId, element, name, phase, (event) => {
+        const countId = event["_data"] || -1;
+        this.factory.scheduleListenerCallback(countId, callback, event);
+      });
+    }
+    return this.delegate.listen(target, eventName, callback, options);
+  }
+};
+function resolveElementFromTarget(target) {
+  switch (target) {
+    case "body":
+      return document.body;
+    case "document":
+      return document;
+    case "window":
+      return window;
+    default:
+      return target;
+  }
+}
+function parseTriggerCallbackName(triggerName) {
+  const dotIndex = triggerName.indexOf(".");
+  const trigger = triggerName.substring(0, dotIndex);
+  const phase = triggerName.slice(dotIndex + 1);
+  return [trigger, phase];
+}
+var AnimationRendererFactory = class {
+  delegate;
+  engine;
+  _zone;
+  _currentId = 0;
+  _microtaskId = 1;
+  _animationCallbacksBuffer = [];
+  _rendererCache = /* @__PURE__ */ new Map();
+  _cdRecurDepth = 0;
+  constructor(delegate, engine, _zone) {
+    this.delegate = delegate;
+    this.engine = engine;
+    this._zone = _zone;
+    engine.onRemovalComplete = (element, delegate2) => {
+      delegate2?.removeChild(null, element);
+    };
+  }
+  createRenderer(hostElement, type) {
+    const EMPTY_NAMESPACE_ID = "";
+    const delegate = this.delegate.createRenderer(hostElement, type);
+    if (!hostElement || !type?.data?.["animation"]) {
+      const cache = this._rendererCache;
+      let renderer = cache.get(delegate);
+      if (!renderer) {
+        const onRendererDestroy = () => cache.delete(delegate);
+        renderer = new BaseAnimationRenderer(EMPTY_NAMESPACE_ID, delegate, this.engine, onRendererDestroy);
+        cache.set(delegate, renderer);
+      }
+      return renderer;
+    }
+    const componentId = type.id;
+    const namespaceId = type.id + "-" + this._currentId;
+    this._currentId++;
+    this.engine.register(namespaceId, hostElement);
+    const registerTrigger = (trigger) => {
+      if (Array.isArray(trigger)) {
+        trigger.forEach(registerTrigger);
+      } else {
+        this.engine.registerTrigger(componentId, namespaceId, hostElement, trigger.name, trigger);
+      }
+    };
+    const animationTriggers = type.data["animation"];
+    animationTriggers.forEach(registerTrigger);
+    return new AnimationRenderer(this, namespaceId, delegate, this.engine);
+  }
+  begin() {
+    this._cdRecurDepth++;
+    if (this.delegate.begin) {
+      this.delegate.begin();
+    }
+  }
+  _scheduleCountTask() {
+    queueMicrotask(() => {
+      this._microtaskId++;
+    });
+  }
+  /** @internal */
+  scheduleListenerCallback(count, fn, data) {
+    if (count >= 0 && count < this._microtaskId) {
+      this._zone.run(() => fn(data));
+      return;
+    }
+    const animationCallbacksBuffer = this._animationCallbacksBuffer;
+    if (animationCallbacksBuffer.length == 0) {
+      queueMicrotask(() => {
+        this._zone.run(() => {
+          animationCallbacksBuffer.forEach((tuple) => {
+            const [fn2, data2] = tuple;
+            fn2(data2);
+          });
+          this._animationCallbacksBuffer = [];
+        });
+      });
+    }
+    animationCallbacksBuffer.push([fn, data]);
+  }
+  end() {
+    this._cdRecurDepth--;
+    if (this._cdRecurDepth == 0) {
+      this._zone.runOutsideAngular(() => {
+        this._scheduleCountTask();
+        this.engine.flush(this._microtaskId);
+      });
+    }
+    if (this.delegate.end) {
+      this.delegate.end();
+    }
+  }
+  whenRenderingDone() {
+    return this.engine.whenRenderingDone();
+  }
+  /**
+   * Used during HMR to clear any cached data about a component.
+   * @param componentId ID of the component that is being replaced.
+   */
+  componentReplaced(componentId) {
+    this.engine.flush();
+    this.delegate.componentReplaced?.(componentId);
+  }
+};
+
+// node_modules/@angular/platform-browser/fesm2022/animations.mjs
+var InjectableAnimationEngine = class _InjectableAnimationEngine extends AnimationEngine {
+  // The `ApplicationRef` is injected here explicitly to force the dependency ordering.
+  // Since the `ApplicationRef` should be created earlier before the `AnimationEngine`, they
+  // both have `ngOnDestroy` hooks and `flush()` must be called after all views are destroyed.
+  constructor(doc, driver, normalizer) {
+    super(doc, driver, normalizer);
+  }
+  ngOnDestroy() {
+    this.flush();
+  }
+  static ɵfac = function InjectableAnimationEngine_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _InjectableAnimationEngine)(ɵɵinject(DOCUMENT), ɵɵinject(AnimationDriver), ɵɵinject(AnimationStyleNormalizer));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _InjectableAnimationEngine,
+    factory: _InjectableAnimationEngine.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(InjectableAnimationEngine, [{
+    type: Injectable
+  }], () => [{
+    type: Document,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }, {
+    type: AnimationDriver
+  }, {
+    type: AnimationStyleNormalizer
+  }], null);
+})();
+function instantiateDefaultStyleNormalizer() {
+  return new WebAnimationsStyleNormalizer();
+}
+function instantiateRendererFactory(renderer, engine, zone) {
+  return new AnimationRendererFactory(renderer, engine, zone);
+}
+var SHARED_ANIMATION_PROVIDERS = [{
+  provide: AnimationStyleNormalizer,
+  useFactory: instantiateDefaultStyleNormalizer
+}, {
+  provide: AnimationEngine,
+  useClass: InjectableAnimationEngine
+}, {
+  provide: RendererFactory2,
+  useFactory: instantiateRendererFactory,
+  deps: [DomRendererFactory2, AnimationEngine, NgZone]
+}];
+var BROWSER_NOOP_ANIMATIONS_PROVIDERS = [{
+  provide: AnimationDriver,
+  useClass: NoopAnimationDriver
+}, {
+  provide: ANIMATION_MODULE_TYPE,
+  useValue: "NoopAnimations"
+}, ...SHARED_ANIMATION_PROVIDERS];
+var BROWSER_ANIMATIONS_PROVIDERS = [
+  // Note: the `ngServerMode` happen inside factories to give the variable time to initialize.
+  {
+    provide: AnimationDriver,
+    useFactory: () => false ? new NoopAnimationDriver() : new WebAnimationsDriver()
+  },
+  {
+    provide: ANIMATION_MODULE_TYPE,
+    useFactory: () => false ? "NoopAnimations" : "BrowserAnimations"
+  },
+  ...SHARED_ANIMATION_PROVIDERS
+];
+var BrowserAnimationsModule = class _BrowserAnimationsModule {
+  /**
+   * Configures the module based on the specified object.
+   *
+   * @param config Object used to configure the behavior of the `BrowserAnimationsModule`.
+   * @see {@link BrowserAnimationsModuleConfig}
+   *
+   * @usageNotes
+   * When registering the `BrowserAnimationsModule`, you can use the `withConfig`
+   * function as follows:
+   * ```ts
+   * @NgModule({
+   *   imports: [BrowserAnimationsModule.withConfig(config)]
+   * })
+   * class MyNgModule {}
+   * ```
+   */
+  static withConfig(config) {
+    return {
+      ngModule: _BrowserAnimationsModule,
+      providers: config.disableAnimations ? BROWSER_NOOP_ANIMATIONS_PROVIDERS : BROWSER_ANIMATIONS_PROVIDERS
+    };
+  }
+  static ɵfac = function BrowserAnimationsModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _BrowserAnimationsModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _BrowserAnimationsModule,
+    exports: [BrowserModule]
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: BROWSER_ANIMATIONS_PROVIDERS,
+    imports: [BrowserModule]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserAnimationsModule, [{
+    type: NgModule,
+    args: [{
+      exports: [BrowserModule],
+      providers: BROWSER_ANIMATIONS_PROVIDERS
+    }]
+  }], null, null);
+})();
+function provideAnimations() {
+  performanceMarkFeature("NgEagerAnimations");
+  return [...BROWSER_ANIMATIONS_PROVIDERS];
+}
+var NoopAnimationsModule = class _NoopAnimationsModule {
+  static ɵfac = function NoopAnimationsModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NoopAnimationsModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _NoopAnimationsModule,
+    exports: [BrowserModule]
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: BROWSER_NOOP_ANIMATIONS_PROVIDERS,
+    imports: [BrowserModule]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NoopAnimationsModule, [{
+    type: NgModule,
+    args: [{
+      exports: [BrowserModule],
+      providers: BROWSER_NOOP_ANIMATIONS_PROVIDERS
+    }]
+  }], null, null);
+})();
+function provideNoopAnimations() {
+  return [...BROWSER_NOOP_ANIMATIONS_PROVIDERS];
+}
+export {
+  ANIMATION_MODULE_TYPE,
+  BrowserAnimationsModule,
+  NoopAnimationsModule,
+  provideAnimations,
+  provideNoopAnimations,
+  InjectableAnimationEngine as ɵInjectableAnimationEngine
+};
+/*! Bundled license information:
+
+@angular/animations/fesm2022/private_export.mjs:
+@angular/animations/fesm2022/util.mjs:
+@angular/animations/fesm2022/browser.mjs:
+@angular/platform-browser/fesm2022/animations.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=@angular_platform-browser_animations.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/@angular_platform-browser_animations.js.map


+ 6052 - 0
ai-interview/vite/deps/@angular_router.js

@@ -0,0 +1,6052 @@
+import {
+  Title
+} from "./chunk-IA3W2FS3.js";
+import "./chunk-YWBOMLBY.js";
+import "./chunk-NFFN32GK.js";
+import {
+  HashLocationStrategy,
+  LOCATION_INITIALIZED,
+  Location,
+  LocationStrategy,
+  PathLocationStrategy,
+  ViewportScroller
+} from "./chunk-VHSNDQRF.js";
+import "./chunk-OPGNYZHR.js";
+import {
+  APP_BOOTSTRAP_LISTENER,
+  ApplicationRef,
+  Attribute,
+  BehaviorSubject,
+  ChangeDetectorRef,
+  Compiler,
+  Component,
+  ConnectableObservable,
+  Console,
+  ContentChildren,
+  DOCUMENT,
+  DestroyRef,
+  Directive,
+  EMPTY,
+  ENVIRONMENT_INITIALIZER,
+  ElementRef,
+  EmptyError,
+  EnvironmentInjector,
+  EventEmitter,
+  HostAttributeToken,
+  HostBinding,
+  HostListener,
+  INTERNAL_APPLICATION_ERROR_HANDLER,
+  Injectable,
+  InjectionToken,
+  Injector,
+  Input,
+  NgModule,
+  NgModuleFactory$1,
+  NgZone,
+  Observable,
+  Optional,
+  Output,
+  PendingTasksInternal,
+  Renderer2,
+  RuntimeError,
+  SkipSelf,
+  Subject,
+  Subscription,
+  Version,
+  ViewContainerRef,
+  afterNextRender,
+  booleanAttribute,
+  catchError,
+  combineLatest,
+  concat,
+  concatMap,
+  createEnvironmentInjector,
+  defaultIfEmpty,
+  defer,
+  filter,
+  finalize,
+  first,
+  from,
+  inject,
+  input,
+  isInjectable,
+  isNgModule,
+  isObservable,
+  isPromise,
+  isStandalone,
+  last,
+  makeEnvironmentProviders,
+  map,
+  mergeAll,
+  mergeMap,
+  of,
+  performanceMarkFeature,
+  pipe,
+  provideAppInitializer,
+  refCount,
+  reflectComponentType,
+  runInInjectionContext,
+  scan,
+  setClassMetadata,
+  signal,
+  startWith,
+  switchMap,
+  take,
+  takeLast,
+  takeUntil,
+  tap,
+  throwError,
+  untracked,
+  ɵɵNgOnChangesFeature,
+  ɵɵattribute,
+  ɵɵcontentQuery,
+  ɵɵdefineComponent,
+  ɵɵdefineDirective,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵdirectiveInject,
+  ɵɵelement,
+  ɵɵgetInheritedFactory,
+  ɵɵinject,
+  ɵɵinjectAttribute,
+  ɵɵinvalidFactory,
+  ɵɵlistener,
+  ɵɵloadQuery,
+  ɵɵqueryRefresh,
+  ɵɵsanitizeUrlOrResourceUrl
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __async,
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/router/fesm2022/router2.mjs
+var PRIMARY_OUTLET = "primary";
+var RouteTitleKey = Symbol("RouteTitle");
+var ParamsAsMap = class {
+  params;
+  constructor(params) {
+    this.params = params || {};
+  }
+  has(name) {
+    return Object.prototype.hasOwnProperty.call(this.params, name);
+  }
+  get(name) {
+    if (this.has(name)) {
+      const v = this.params[name];
+      return Array.isArray(v) ? v[0] : v;
+    }
+    return null;
+  }
+  getAll(name) {
+    if (this.has(name)) {
+      const v = this.params[name];
+      return Array.isArray(v) ? v : [v];
+    }
+    return [];
+  }
+  get keys() {
+    return Object.keys(this.params);
+  }
+};
+function convertToParamMap(params) {
+  return new ParamsAsMap(params);
+}
+function defaultUrlMatcher(segments, segmentGroup, route) {
+  const parts = route.path.split("/");
+  if (parts.length > segments.length) {
+    return null;
+  }
+  if (route.pathMatch === "full" && (segmentGroup.hasChildren() || parts.length < segments.length)) {
+    return null;
+  }
+  const posParams = {};
+  for (let index = 0; index < parts.length; index++) {
+    const part = parts[index];
+    const segment = segments[index];
+    const isParameter = part[0] === ":";
+    if (isParameter) {
+      posParams[part.substring(1)] = segment;
+    } else if (part !== segment.path) {
+      return null;
+    }
+  }
+  return {
+    consumed: segments.slice(0, parts.length),
+    posParams
+  };
+}
+function shallowEqualArrays(a, b) {
+  if (a.length !== b.length) return false;
+  for (let i = 0; i < a.length; ++i) {
+    if (!shallowEqual(a[i], b[i])) return false;
+  }
+  return true;
+}
+function shallowEqual(a, b) {
+  const k1 = a ? getDataKeys(a) : void 0;
+  const k2 = b ? getDataKeys(b) : void 0;
+  if (!k1 || !k2 || k1.length != k2.length) {
+    return false;
+  }
+  let key;
+  for (let i = 0; i < k1.length; i++) {
+    key = k1[i];
+    if (!equalArraysOrString(a[key], b[key])) {
+      return false;
+    }
+  }
+  return true;
+}
+function getDataKeys(obj) {
+  return [...Object.keys(obj), ...Object.getOwnPropertySymbols(obj)];
+}
+function equalArraysOrString(a, b) {
+  if (Array.isArray(a) && Array.isArray(b)) {
+    if (a.length !== b.length) return false;
+    const aSorted = [...a].sort();
+    const bSorted = [...b].sort();
+    return aSorted.every((val, index) => bSorted[index] === val);
+  } else {
+    return a === b;
+  }
+}
+function last2(a) {
+  return a.length > 0 ? a[a.length - 1] : null;
+}
+function wrapIntoObservable(value) {
+  if (isObservable(value)) {
+    return value;
+  }
+  if (isPromise(value)) {
+    return from(Promise.resolve(value));
+  }
+  return of(value);
+}
+var pathCompareMap = {
+  "exact": equalSegmentGroups,
+  "subset": containsSegmentGroup
+};
+var paramCompareMap = {
+  "exact": equalParams,
+  "subset": containsParams,
+  "ignored": () => true
+};
+function containsTree(container, containee, options) {
+  return pathCompareMap[options.paths](container.root, containee.root, options.matrixParams) && paramCompareMap[options.queryParams](container.queryParams, containee.queryParams) && !(options.fragment === "exact" && container.fragment !== containee.fragment);
+}
+function equalParams(container, containee) {
+  return shallowEqual(container, containee);
+}
+function equalSegmentGroups(container, containee, matrixParams) {
+  if (!equalPath(container.segments, containee.segments)) return false;
+  if (!matrixParamsMatch(container.segments, containee.segments, matrixParams)) {
+    return false;
+  }
+  if (container.numberOfChildren !== containee.numberOfChildren) return false;
+  for (const c in containee.children) {
+    if (!container.children[c]) return false;
+    if (!equalSegmentGroups(container.children[c], containee.children[c], matrixParams)) return false;
+  }
+  return true;
+}
+function containsParams(container, containee) {
+  return Object.keys(containee).length <= Object.keys(container).length && Object.keys(containee).every((key) => equalArraysOrString(container[key], containee[key]));
+}
+function containsSegmentGroup(container, containee, matrixParams) {
+  return containsSegmentGroupHelper(container, containee, containee.segments, matrixParams);
+}
+function containsSegmentGroupHelper(container, containee, containeePaths, matrixParams) {
+  if (container.segments.length > containeePaths.length) {
+    const current = container.segments.slice(0, containeePaths.length);
+    if (!equalPath(current, containeePaths)) return false;
+    if (containee.hasChildren()) return false;
+    if (!matrixParamsMatch(current, containeePaths, matrixParams)) return false;
+    return true;
+  } else if (container.segments.length === containeePaths.length) {
+    if (!equalPath(container.segments, containeePaths)) return false;
+    if (!matrixParamsMatch(container.segments, containeePaths, matrixParams)) return false;
+    for (const c in containee.children) {
+      if (!container.children[c]) return false;
+      if (!containsSegmentGroup(container.children[c], containee.children[c], matrixParams)) {
+        return false;
+      }
+    }
+    return true;
+  } else {
+    const current = containeePaths.slice(0, container.segments.length);
+    const next = containeePaths.slice(container.segments.length);
+    if (!equalPath(container.segments, current)) return false;
+    if (!matrixParamsMatch(container.segments, current, matrixParams)) return false;
+    if (!container.children[PRIMARY_OUTLET]) return false;
+    return containsSegmentGroupHelper(container.children[PRIMARY_OUTLET], containee, next, matrixParams);
+  }
+}
+function matrixParamsMatch(containerPaths, containeePaths, options) {
+  return containeePaths.every((containeeSegment, i) => {
+    return paramCompareMap[options](containerPaths[i].parameters, containeeSegment.parameters);
+  });
+}
+var UrlTree = class {
+  root;
+  queryParams;
+  fragment;
+  /** @internal */
+  _queryParamMap;
+  constructor(root = new UrlSegmentGroup([], {}), queryParams = {}, fragment = null) {
+    this.root = root;
+    this.queryParams = queryParams;
+    this.fragment = fragment;
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      if (root.segments.length > 0) {
+        throw new RuntimeError(4015, "The root `UrlSegmentGroup` should not contain `segments`. Instead, these segments belong in the `children` so they can be associated with a named outlet.");
+      }
+    }
+  }
+  get queryParamMap() {
+    this._queryParamMap ??= convertToParamMap(this.queryParams);
+    return this._queryParamMap;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return DEFAULT_SERIALIZER.serialize(this);
+  }
+};
+var UrlSegmentGroup = class {
+  segments;
+  children;
+  /** The parent node in the url tree */
+  parent = null;
+  constructor(segments, children) {
+    this.segments = segments;
+    this.children = children;
+    Object.values(children).forEach((v) => v.parent = this);
+  }
+  /** Whether the segment has child segments */
+  hasChildren() {
+    return this.numberOfChildren > 0;
+  }
+  /** Number of child segments */
+  get numberOfChildren() {
+    return Object.keys(this.children).length;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return serializePaths(this);
+  }
+};
+var UrlSegment = class {
+  path;
+  parameters;
+  /** @internal */
+  _parameterMap;
+  constructor(path, parameters) {
+    this.path = path;
+    this.parameters = parameters;
+  }
+  get parameterMap() {
+    this._parameterMap ??= convertToParamMap(this.parameters);
+    return this._parameterMap;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return serializePath(this);
+  }
+};
+function equalSegments(as, bs) {
+  return equalPath(as, bs) && as.every((a, i) => shallowEqual(a.parameters, bs[i].parameters));
+}
+function equalPath(as, bs) {
+  if (as.length !== bs.length) return false;
+  return as.every((a, i) => a.path === bs[i].path);
+}
+function mapChildrenIntoArray(segment, fn) {
+  let res = [];
+  Object.entries(segment.children).forEach(([childOutlet, child]) => {
+    if (childOutlet === PRIMARY_OUTLET) {
+      res = res.concat(fn(child, childOutlet));
+    }
+  });
+  Object.entries(segment.children).forEach(([childOutlet, child]) => {
+    if (childOutlet !== PRIMARY_OUTLET) {
+      res = res.concat(fn(child, childOutlet));
+    }
+  });
+  return res;
+}
+var UrlSerializer = class _UrlSerializer {
+  static ɵfac = function UrlSerializer_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _UrlSerializer)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _UrlSerializer,
+    factory: () => (() => new DefaultUrlSerializer())(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(UrlSerializer, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => new DefaultUrlSerializer()
+    }]
+  }], null, null);
+})();
+var DefaultUrlSerializer = class {
+  /** Parses a url into a `UrlTree` */
+  parse(url) {
+    const p = new UrlParser(url);
+    return new UrlTree(p.parseRootSegment(), p.parseQueryParams(), p.parseFragment());
+  }
+  /** Converts a `UrlTree` into a url */
+  serialize(tree2) {
+    const segment = `/${serializeSegment(tree2.root, true)}`;
+    const query = serializeQueryParams(tree2.queryParams);
+    const fragment = typeof tree2.fragment === `string` ? `#${encodeUriFragment(tree2.fragment)}` : "";
+    return `${segment}${query}${fragment}`;
+  }
+};
+var DEFAULT_SERIALIZER = new DefaultUrlSerializer();
+function serializePaths(segment) {
+  return segment.segments.map((p) => serializePath(p)).join("/");
+}
+function serializeSegment(segment, root) {
+  if (!segment.hasChildren()) {
+    return serializePaths(segment);
+  }
+  if (root) {
+    const primary = segment.children[PRIMARY_OUTLET] ? serializeSegment(segment.children[PRIMARY_OUTLET], false) : "";
+    const children = [];
+    Object.entries(segment.children).forEach(([k, v]) => {
+      if (k !== PRIMARY_OUTLET) {
+        children.push(`${k}:${serializeSegment(v, false)}`);
+      }
+    });
+    return children.length > 0 ? `${primary}(${children.join("//")})` : primary;
+  } else {
+    const children = mapChildrenIntoArray(segment, (v, k) => {
+      if (k === PRIMARY_OUTLET) {
+        return [serializeSegment(segment.children[PRIMARY_OUTLET], false)];
+      }
+      return [`${k}:${serializeSegment(v, false)}`];
+    });
+    if (Object.keys(segment.children).length === 1 && segment.children[PRIMARY_OUTLET] != null) {
+      return `${serializePaths(segment)}/${children[0]}`;
+    }
+    return `${serializePaths(segment)}/(${children.join("//")})`;
+  }
+}
+function encodeUriString(s) {
+  return encodeURIComponent(s).replace(/%40/g, "@").replace(/%3A/gi, ":").replace(/%24/g, "$").replace(/%2C/gi, ",");
+}
+function encodeUriQuery(s) {
+  return encodeUriString(s).replace(/%3B/gi, ";");
+}
+function encodeUriFragment(s) {
+  return encodeURI(s);
+}
+function encodeUriSegment(s) {
+  return encodeUriString(s).replace(/\(/g, "%28").replace(/\)/g, "%29").replace(/%26/gi, "&");
+}
+function decode(s) {
+  return decodeURIComponent(s);
+}
+function decodeQuery(s) {
+  return decode(s.replace(/\+/g, "%20"));
+}
+function serializePath(path) {
+  return `${encodeUriSegment(path.path)}${serializeMatrixParams(path.parameters)}`;
+}
+function serializeMatrixParams(params) {
+  return Object.entries(params).map(([key, value]) => `;${encodeUriSegment(key)}=${encodeUriSegment(value)}`).join("");
+}
+function serializeQueryParams(params) {
+  const strParams = Object.entries(params).map(([name, value]) => {
+    return Array.isArray(value) ? value.map((v) => `${encodeUriQuery(name)}=${encodeUriQuery(v)}`).join("&") : `${encodeUriQuery(name)}=${encodeUriQuery(value)}`;
+  }).filter((s) => s);
+  return strParams.length ? `?${strParams.join("&")}` : "";
+}
+var SEGMENT_RE = /^[^\/()?;#]+/;
+function matchSegments(str) {
+  const match2 = str.match(SEGMENT_RE);
+  return match2 ? match2[0] : "";
+}
+var MATRIX_PARAM_SEGMENT_RE = /^[^\/()?;=#]+/;
+function matchMatrixKeySegments(str) {
+  const match2 = str.match(MATRIX_PARAM_SEGMENT_RE);
+  return match2 ? match2[0] : "";
+}
+var QUERY_PARAM_RE = /^[^=?&#]+/;
+function matchQueryParams(str) {
+  const match2 = str.match(QUERY_PARAM_RE);
+  return match2 ? match2[0] : "";
+}
+var QUERY_PARAM_VALUE_RE = /^[^&#]+/;
+function matchUrlQueryParamValue(str) {
+  const match2 = str.match(QUERY_PARAM_VALUE_RE);
+  return match2 ? match2[0] : "";
+}
+var UrlParser = class {
+  url;
+  remaining;
+  constructor(url) {
+    this.url = url;
+    this.remaining = url;
+  }
+  parseRootSegment() {
+    this.consumeOptional("/");
+    if (this.remaining === "" || this.peekStartsWith("?") || this.peekStartsWith("#")) {
+      return new UrlSegmentGroup([], {});
+    }
+    return new UrlSegmentGroup([], this.parseChildren());
+  }
+  parseQueryParams() {
+    const params = {};
+    if (this.consumeOptional("?")) {
+      do {
+        this.parseQueryParam(params);
+      } while (this.consumeOptional("&"));
+    }
+    return params;
+  }
+  parseFragment() {
+    return this.consumeOptional("#") ? decodeURIComponent(this.remaining) : null;
+  }
+  parseChildren() {
+    if (this.remaining === "") {
+      return {};
+    }
+    this.consumeOptional("/");
+    const segments = [];
+    if (!this.peekStartsWith("(")) {
+      segments.push(this.parseSegment());
+    }
+    while (this.peekStartsWith("/") && !this.peekStartsWith("//") && !this.peekStartsWith("/(")) {
+      this.capture("/");
+      segments.push(this.parseSegment());
+    }
+    let children = {};
+    if (this.peekStartsWith("/(")) {
+      this.capture("/");
+      children = this.parseParens(true);
+    }
+    let res = {};
+    if (this.peekStartsWith("(")) {
+      res = this.parseParens(false);
+    }
+    if (segments.length > 0 || Object.keys(children).length > 0) {
+      res[PRIMARY_OUTLET] = new UrlSegmentGroup(segments, children);
+    }
+    return res;
+  }
+  // parse a segment with its matrix parameters
+  // ie `name;k1=v1;k2`
+  parseSegment() {
+    const path = matchSegments(this.remaining);
+    if (path === "" && this.peekStartsWith(";")) {
+      throw new RuntimeError(4009, (typeof ngDevMode === "undefined" || ngDevMode) && `Empty path url segment cannot have parameters: '${this.remaining}'.`);
+    }
+    this.capture(path);
+    return new UrlSegment(decode(path), this.parseMatrixParams());
+  }
+  parseMatrixParams() {
+    const params = {};
+    while (this.consumeOptional(";")) {
+      this.parseParam(params);
+    }
+    return params;
+  }
+  parseParam(params) {
+    const key = matchMatrixKeySegments(this.remaining);
+    if (!key) {
+      return;
+    }
+    this.capture(key);
+    let value = "";
+    if (this.consumeOptional("=")) {
+      const valueMatch = matchSegments(this.remaining);
+      if (valueMatch) {
+        value = valueMatch;
+        this.capture(value);
+      }
+    }
+    params[decode(key)] = decode(value);
+  }
+  // Parse a single query parameter `name[=value]`
+  parseQueryParam(params) {
+    const key = matchQueryParams(this.remaining);
+    if (!key) {
+      return;
+    }
+    this.capture(key);
+    let value = "";
+    if (this.consumeOptional("=")) {
+      const valueMatch = matchUrlQueryParamValue(this.remaining);
+      if (valueMatch) {
+        value = valueMatch;
+        this.capture(value);
+      }
+    }
+    const decodedKey = decodeQuery(key);
+    const decodedVal = decodeQuery(value);
+    if (params.hasOwnProperty(decodedKey)) {
+      let currentVal = params[decodedKey];
+      if (!Array.isArray(currentVal)) {
+        currentVal = [currentVal];
+        params[decodedKey] = currentVal;
+      }
+      currentVal.push(decodedVal);
+    } else {
+      params[decodedKey] = decodedVal;
+    }
+  }
+  // parse `(a/b//outlet_name:c/d)`
+  parseParens(allowPrimary) {
+    const segments = {};
+    this.capture("(");
+    while (!this.consumeOptional(")") && this.remaining.length > 0) {
+      const path = matchSegments(this.remaining);
+      const next = this.remaining[path.length];
+      if (next !== "/" && next !== ")" && next !== ";") {
+        throw new RuntimeError(4010, (typeof ngDevMode === "undefined" || ngDevMode) && `Cannot parse url '${this.url}'`);
+      }
+      let outletName = void 0;
+      if (path.indexOf(":") > -1) {
+        outletName = path.slice(0, path.indexOf(":"));
+        this.capture(outletName);
+        this.capture(":");
+      } else if (allowPrimary) {
+        outletName = PRIMARY_OUTLET;
+      }
+      const children = this.parseChildren();
+      segments[outletName] = Object.keys(children).length === 1 ? children[PRIMARY_OUTLET] : new UrlSegmentGroup([], children);
+      this.consumeOptional("//");
+    }
+    return segments;
+  }
+  peekStartsWith(str) {
+    return this.remaining.startsWith(str);
+  }
+  // Consumes the prefix when it is present and returns whether it has been consumed
+  consumeOptional(str) {
+    if (this.peekStartsWith(str)) {
+      this.remaining = this.remaining.substring(str.length);
+      return true;
+    }
+    return false;
+  }
+  capture(str) {
+    if (!this.consumeOptional(str)) {
+      throw new RuntimeError(4011, (typeof ngDevMode === "undefined" || ngDevMode) && `Expected "${str}".`);
+    }
+  }
+};
+function createRoot(rootCandidate) {
+  return rootCandidate.segments.length > 0 ? new UrlSegmentGroup([], {
+    [PRIMARY_OUTLET]: rootCandidate
+  }) : rootCandidate;
+}
+function squashSegmentGroup(segmentGroup) {
+  const newChildren = {};
+  for (const [childOutlet, child] of Object.entries(segmentGroup.children)) {
+    const childCandidate = squashSegmentGroup(child);
+    if (childOutlet === PRIMARY_OUTLET && childCandidate.segments.length === 0 && childCandidate.hasChildren()) {
+      for (const [grandChildOutlet, grandChild] of Object.entries(childCandidate.children)) {
+        newChildren[grandChildOutlet] = grandChild;
+      }
+    } else if (childCandidate.segments.length > 0 || childCandidate.hasChildren()) {
+      newChildren[childOutlet] = childCandidate;
+    }
+  }
+  const s = new UrlSegmentGroup(segmentGroup.segments, newChildren);
+  return mergeTrivialChildren(s);
+}
+function mergeTrivialChildren(s) {
+  if (s.numberOfChildren === 1 && s.children[PRIMARY_OUTLET]) {
+    const c = s.children[PRIMARY_OUTLET];
+    return new UrlSegmentGroup(s.segments.concat(c.segments), c.children);
+  }
+  return s;
+}
+function isUrlTree(v) {
+  return v instanceof UrlTree;
+}
+function createUrlTreeFromSnapshot(relativeTo, commands, queryParams = null, fragment = null) {
+  const relativeToUrlSegmentGroup = createSegmentGroupFromRoute(relativeTo);
+  return createUrlTreeFromSegmentGroup(relativeToUrlSegmentGroup, commands, queryParams, fragment);
+}
+function createSegmentGroupFromRoute(route) {
+  let targetGroup;
+  function createSegmentGroupFromRouteRecursive(currentRoute) {
+    const childOutlets = {};
+    for (const childSnapshot of currentRoute.children) {
+      const root = createSegmentGroupFromRouteRecursive(childSnapshot);
+      childOutlets[childSnapshot.outlet] = root;
+    }
+    const segmentGroup = new UrlSegmentGroup(currentRoute.url, childOutlets);
+    if (currentRoute === route) {
+      targetGroup = segmentGroup;
+    }
+    return segmentGroup;
+  }
+  const rootCandidate = createSegmentGroupFromRouteRecursive(route.root);
+  const rootSegmentGroup = createRoot(rootCandidate);
+  return targetGroup ?? rootSegmentGroup;
+}
+function createUrlTreeFromSegmentGroup(relativeTo, commands, queryParams, fragment) {
+  let root = relativeTo;
+  while (root.parent) {
+    root = root.parent;
+  }
+  if (commands.length === 0) {
+    return tree(root, root, root, queryParams, fragment);
+  }
+  const nav = computeNavigation(commands);
+  if (nav.toRoot()) {
+    return tree(root, root, new UrlSegmentGroup([], {}), queryParams, fragment);
+  }
+  const position = findStartingPositionForTargetGroup(nav, root, relativeTo);
+  const newSegmentGroup = position.processChildren ? updateSegmentGroupChildren(position.segmentGroup, position.index, nav.commands) : updateSegmentGroup(position.segmentGroup, position.index, nav.commands);
+  return tree(root, position.segmentGroup, newSegmentGroup, queryParams, fragment);
+}
+function isMatrixParams(command) {
+  return typeof command === "object" && command != null && !command.outlets && !command.segmentPath;
+}
+function isCommandWithOutlets(command) {
+  return typeof command === "object" && command != null && command.outlets;
+}
+function tree(oldRoot, oldSegmentGroup, newSegmentGroup, queryParams, fragment) {
+  let qp = {};
+  if (queryParams) {
+    Object.entries(queryParams).forEach(([name, value]) => {
+      qp[name] = Array.isArray(value) ? value.map((v) => `${v}`) : `${value}`;
+    });
+  }
+  let rootCandidate;
+  if (oldRoot === oldSegmentGroup) {
+    rootCandidate = newSegmentGroup;
+  } else {
+    rootCandidate = replaceSegment(oldRoot, oldSegmentGroup, newSegmentGroup);
+  }
+  const newRoot = createRoot(squashSegmentGroup(rootCandidate));
+  return new UrlTree(newRoot, qp, fragment);
+}
+function replaceSegment(current, oldSegment, newSegment) {
+  const children = {};
+  Object.entries(current.children).forEach(([outletName, c]) => {
+    if (c === oldSegment) {
+      children[outletName] = newSegment;
+    } else {
+      children[outletName] = replaceSegment(c, oldSegment, newSegment);
+    }
+  });
+  return new UrlSegmentGroup(current.segments, children);
+}
+var Navigation = class {
+  isAbsolute;
+  numberOfDoubleDots;
+  commands;
+  constructor(isAbsolute, numberOfDoubleDots, commands) {
+    this.isAbsolute = isAbsolute;
+    this.numberOfDoubleDots = numberOfDoubleDots;
+    this.commands = commands;
+    if (isAbsolute && commands.length > 0 && isMatrixParams(commands[0])) {
+      throw new RuntimeError(4003, (typeof ngDevMode === "undefined" || ngDevMode) && "Root segment cannot have matrix parameters");
+    }
+    const cmdWithOutlet = commands.find(isCommandWithOutlets);
+    if (cmdWithOutlet && cmdWithOutlet !== last2(commands)) {
+      throw new RuntimeError(4004, (typeof ngDevMode === "undefined" || ngDevMode) && "{outlets:{}} has to be the last command");
+    }
+  }
+  toRoot() {
+    return this.isAbsolute && this.commands.length === 1 && this.commands[0] == "/";
+  }
+};
+function computeNavigation(commands) {
+  if (typeof commands[0] === "string" && commands.length === 1 && commands[0] === "/") {
+    return new Navigation(true, 0, commands);
+  }
+  let numberOfDoubleDots = 0;
+  let isAbsolute = false;
+  const res = commands.reduce((res2, cmd, cmdIdx) => {
+    if (typeof cmd === "object" && cmd != null) {
+      if (cmd.outlets) {
+        const outlets = {};
+        Object.entries(cmd.outlets).forEach(([name, commands2]) => {
+          outlets[name] = typeof commands2 === "string" ? commands2.split("/") : commands2;
+        });
+        return [...res2, {
+          outlets
+        }];
+      }
+      if (cmd.segmentPath) {
+        return [...res2, cmd.segmentPath];
+      }
+    }
+    if (!(typeof cmd === "string")) {
+      return [...res2, cmd];
+    }
+    if (cmdIdx === 0) {
+      cmd.split("/").forEach((urlPart, partIndex) => {
+        if (partIndex == 0 && urlPart === ".") ;
+        else if (partIndex == 0 && urlPart === "") {
+          isAbsolute = true;
+        } else if (urlPart === "..") {
+          numberOfDoubleDots++;
+        } else if (urlPart != "") {
+          res2.push(urlPart);
+        }
+      });
+      return res2;
+    }
+    return [...res2, cmd];
+  }, []);
+  return new Navigation(isAbsolute, numberOfDoubleDots, res);
+}
+var Position = class {
+  segmentGroup;
+  processChildren;
+  index;
+  constructor(segmentGroup, processChildren, index) {
+    this.segmentGroup = segmentGroup;
+    this.processChildren = processChildren;
+    this.index = index;
+  }
+};
+function findStartingPositionForTargetGroup(nav, root, target) {
+  if (nav.isAbsolute) {
+    return new Position(root, true, 0);
+  }
+  if (!target) {
+    return new Position(root, false, NaN);
+  }
+  if (target.parent === null) {
+    return new Position(target, true, 0);
+  }
+  const modifier = isMatrixParams(nav.commands[0]) ? 0 : 1;
+  const index = target.segments.length - 1 + modifier;
+  return createPositionApplyingDoubleDots(target, index, nav.numberOfDoubleDots);
+}
+function createPositionApplyingDoubleDots(group, index, numberOfDoubleDots) {
+  let g = group;
+  let ci = index;
+  let dd = numberOfDoubleDots;
+  while (dd > ci) {
+    dd -= ci;
+    g = g.parent;
+    if (!g) {
+      throw new RuntimeError(4005, (typeof ngDevMode === "undefined" || ngDevMode) && "Invalid number of '../'");
+    }
+    ci = g.segments.length;
+  }
+  return new Position(g, false, ci - dd);
+}
+function getOutlets(commands) {
+  if (isCommandWithOutlets(commands[0])) {
+    return commands[0].outlets;
+  }
+  return {
+    [PRIMARY_OUTLET]: commands
+  };
+}
+function updateSegmentGroup(segmentGroup, startIndex, commands) {
+  segmentGroup ??= new UrlSegmentGroup([], {});
+  if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {
+    return updateSegmentGroupChildren(segmentGroup, startIndex, commands);
+  }
+  const m = prefixedWith(segmentGroup, startIndex, commands);
+  const slicedCommands = commands.slice(m.commandIndex);
+  if (m.match && m.pathIndex < segmentGroup.segments.length) {
+    const g = new UrlSegmentGroup(segmentGroup.segments.slice(0, m.pathIndex), {});
+    g.children[PRIMARY_OUTLET] = new UrlSegmentGroup(segmentGroup.segments.slice(m.pathIndex), segmentGroup.children);
+    return updateSegmentGroupChildren(g, 0, slicedCommands);
+  } else if (m.match && slicedCommands.length === 0) {
+    return new UrlSegmentGroup(segmentGroup.segments, {});
+  } else if (m.match && !segmentGroup.hasChildren()) {
+    return createNewSegmentGroup(segmentGroup, startIndex, commands);
+  } else if (m.match) {
+    return updateSegmentGroupChildren(segmentGroup, 0, slicedCommands);
+  } else {
+    return createNewSegmentGroup(segmentGroup, startIndex, commands);
+  }
+}
+function updateSegmentGroupChildren(segmentGroup, startIndex, commands) {
+  if (commands.length === 0) {
+    return new UrlSegmentGroup(segmentGroup.segments, {});
+  } else {
+    const outlets = getOutlets(commands);
+    const children = {};
+    if (Object.keys(outlets).some((o) => o !== PRIMARY_OUTLET) && segmentGroup.children[PRIMARY_OUTLET] && segmentGroup.numberOfChildren === 1 && segmentGroup.children[PRIMARY_OUTLET].segments.length === 0) {
+      const childrenOfEmptyChild = updateSegmentGroupChildren(segmentGroup.children[PRIMARY_OUTLET], startIndex, commands);
+      return new UrlSegmentGroup(segmentGroup.segments, childrenOfEmptyChild.children);
+    }
+    Object.entries(outlets).forEach(([outlet, commands2]) => {
+      if (typeof commands2 === "string") {
+        commands2 = [commands2];
+      }
+      if (commands2 !== null) {
+        children[outlet] = updateSegmentGroup(segmentGroup.children[outlet], startIndex, commands2);
+      }
+    });
+    Object.entries(segmentGroup.children).forEach(([childOutlet, child]) => {
+      if (outlets[childOutlet] === void 0) {
+        children[childOutlet] = child;
+      }
+    });
+    return new UrlSegmentGroup(segmentGroup.segments, children);
+  }
+}
+function prefixedWith(segmentGroup, startIndex, commands) {
+  let currentCommandIndex = 0;
+  let currentPathIndex = startIndex;
+  const noMatch2 = {
+    match: false,
+    pathIndex: 0,
+    commandIndex: 0
+  };
+  while (currentPathIndex < segmentGroup.segments.length) {
+    if (currentCommandIndex >= commands.length) return noMatch2;
+    const path = segmentGroup.segments[currentPathIndex];
+    const command = commands[currentCommandIndex];
+    if (isCommandWithOutlets(command)) {
+      break;
+    }
+    const curr = `${command}`;
+    const next = currentCommandIndex < commands.length - 1 ? commands[currentCommandIndex + 1] : null;
+    if (currentPathIndex > 0 && curr === void 0) break;
+    if (curr && next && typeof next === "object" && next.outlets === void 0) {
+      if (!compare(curr, next, path)) return noMatch2;
+      currentCommandIndex += 2;
+    } else {
+      if (!compare(curr, {}, path)) return noMatch2;
+      currentCommandIndex++;
+    }
+    currentPathIndex++;
+  }
+  return {
+    match: true,
+    pathIndex: currentPathIndex,
+    commandIndex: currentCommandIndex
+  };
+}
+function createNewSegmentGroup(segmentGroup, startIndex, commands) {
+  const paths = segmentGroup.segments.slice(0, startIndex);
+  let i = 0;
+  while (i < commands.length) {
+    const command = commands[i];
+    if (isCommandWithOutlets(command)) {
+      const children = createNewSegmentChildren(command.outlets);
+      return new UrlSegmentGroup(paths, children);
+    }
+    if (i === 0 && isMatrixParams(commands[0])) {
+      const p = segmentGroup.segments[startIndex];
+      paths.push(new UrlSegment(p.path, stringify(commands[0])));
+      i++;
+      continue;
+    }
+    const curr = isCommandWithOutlets(command) ? command.outlets[PRIMARY_OUTLET] : `${command}`;
+    const next = i < commands.length - 1 ? commands[i + 1] : null;
+    if (curr && next && isMatrixParams(next)) {
+      paths.push(new UrlSegment(curr, stringify(next)));
+      i += 2;
+    } else {
+      paths.push(new UrlSegment(curr, {}));
+      i++;
+    }
+  }
+  return new UrlSegmentGroup(paths, {});
+}
+function createNewSegmentChildren(outlets) {
+  const children = {};
+  Object.entries(outlets).forEach(([outlet, commands]) => {
+    if (typeof commands === "string") {
+      commands = [commands];
+    }
+    if (commands !== null) {
+      children[outlet] = createNewSegmentGroup(new UrlSegmentGroup([], {}), 0, commands);
+    }
+  });
+  return children;
+}
+function stringify(params) {
+  const res = {};
+  Object.entries(params).forEach(([k, v]) => res[k] = `${v}`);
+  return res;
+}
+function compare(path, params, segment) {
+  return path == segment.path && shallowEqual(params, segment.parameters);
+}
+var IMPERATIVE_NAVIGATION = "imperative";
+var EventType;
+(function(EventType2) {
+  EventType2[EventType2["NavigationStart"] = 0] = "NavigationStart";
+  EventType2[EventType2["NavigationEnd"] = 1] = "NavigationEnd";
+  EventType2[EventType2["NavigationCancel"] = 2] = "NavigationCancel";
+  EventType2[EventType2["NavigationError"] = 3] = "NavigationError";
+  EventType2[EventType2["RoutesRecognized"] = 4] = "RoutesRecognized";
+  EventType2[EventType2["ResolveStart"] = 5] = "ResolveStart";
+  EventType2[EventType2["ResolveEnd"] = 6] = "ResolveEnd";
+  EventType2[EventType2["GuardsCheckStart"] = 7] = "GuardsCheckStart";
+  EventType2[EventType2["GuardsCheckEnd"] = 8] = "GuardsCheckEnd";
+  EventType2[EventType2["RouteConfigLoadStart"] = 9] = "RouteConfigLoadStart";
+  EventType2[EventType2["RouteConfigLoadEnd"] = 10] = "RouteConfigLoadEnd";
+  EventType2[EventType2["ChildActivationStart"] = 11] = "ChildActivationStart";
+  EventType2[EventType2["ChildActivationEnd"] = 12] = "ChildActivationEnd";
+  EventType2[EventType2["ActivationStart"] = 13] = "ActivationStart";
+  EventType2[EventType2["ActivationEnd"] = 14] = "ActivationEnd";
+  EventType2[EventType2["Scroll"] = 15] = "Scroll";
+  EventType2[EventType2["NavigationSkipped"] = 16] = "NavigationSkipped";
+})(EventType || (EventType = {}));
+var RouterEvent = class {
+  id;
+  url;
+  constructor(id, url) {
+    this.id = id;
+    this.url = url;
+  }
+};
+var NavigationStart = class extends RouterEvent {
+  type = EventType.NavigationStart;
+  /**
+   * Identifies the call or event that triggered the navigation.
+   * An `imperative` trigger is a call to `router.navigateByUrl()` or `router.navigate()`.
+   *
+   * @see {@link NavigationEnd}
+   * @see {@link NavigationCancel}
+   * @see {@link NavigationError}
+   */
+  navigationTrigger;
+  /**
+   * The navigation state that was previously supplied to the `pushState` call,
+   * when the navigation is triggered by a `popstate` event. Otherwise null.
+   *
+   * The state object is defined by `NavigationExtras`, and contains any
+   * developer-defined state value, as well as a unique ID that
+   * the router assigns to every router transition/navigation.
+   *
+   * From the perspective of the router, the router never "goes back".
+   * When the user clicks on the back button in the browser,
+   * a new navigation ID is created.
+   *
+   * Use the ID in this previous-state object to differentiate between a newly created
+   * state and one returned to by a `popstate` event, so that you can restore some
+   * remembered state, such as scroll position.
+   *
+   */
+  restoredState;
+  constructor(id, url, navigationTrigger = "imperative", restoredState = null) {
+    super(id, url);
+    this.navigationTrigger = navigationTrigger;
+    this.restoredState = restoredState;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return `NavigationStart(id: ${this.id}, url: '${this.url}')`;
+  }
+};
+var NavigationEnd = class extends RouterEvent {
+  urlAfterRedirects;
+  type = EventType.NavigationEnd;
+  constructor(id, url, urlAfterRedirects) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return `NavigationEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}')`;
+  }
+};
+var NavigationCancellationCode;
+(function(NavigationCancellationCode2) {
+  NavigationCancellationCode2[NavigationCancellationCode2["Redirect"] = 0] = "Redirect";
+  NavigationCancellationCode2[NavigationCancellationCode2["SupersededByNewNavigation"] = 1] = "SupersededByNewNavigation";
+  NavigationCancellationCode2[NavigationCancellationCode2["NoDataFromResolver"] = 2] = "NoDataFromResolver";
+  NavigationCancellationCode2[NavigationCancellationCode2["GuardRejected"] = 3] = "GuardRejected";
+  NavigationCancellationCode2[NavigationCancellationCode2["Aborted"] = 4] = "Aborted";
+})(NavigationCancellationCode || (NavigationCancellationCode = {}));
+var NavigationSkippedCode;
+(function(NavigationSkippedCode2) {
+  NavigationSkippedCode2[NavigationSkippedCode2["IgnoredSameUrlNavigation"] = 0] = "IgnoredSameUrlNavigation";
+  NavigationSkippedCode2[NavigationSkippedCode2["IgnoredByUrlHandlingStrategy"] = 1] = "IgnoredByUrlHandlingStrategy";
+})(NavigationSkippedCode || (NavigationSkippedCode = {}));
+var NavigationCancel = class extends RouterEvent {
+  reason;
+  code;
+  type = EventType.NavigationCancel;
+  constructor(id, url, reason, code) {
+    super(id, url);
+    this.reason = reason;
+    this.code = code;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return `NavigationCancel(id: ${this.id}, url: '${this.url}')`;
+  }
+};
+var NavigationSkipped = class extends RouterEvent {
+  reason;
+  code;
+  type = EventType.NavigationSkipped;
+  constructor(id, url, reason, code) {
+    super(id, url);
+    this.reason = reason;
+    this.code = code;
+  }
+};
+var NavigationError = class extends RouterEvent {
+  error;
+  target;
+  type = EventType.NavigationError;
+  constructor(id, url, error, target) {
+    super(id, url);
+    this.error = error;
+    this.target = target;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return `NavigationError(id: ${this.id}, url: '${this.url}', error: ${this.error})`;
+  }
+};
+var RoutesRecognized = class extends RouterEvent {
+  urlAfterRedirects;
+  state;
+  type = EventType.RoutesRecognized;
+  constructor(id, url, urlAfterRedirects, state) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+    this.state = state;
+  }
+  /** @docsNotRequired */
+  toString() {
+    return `RoutesRecognized(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;
+  }
+};
+var GuardsCheckStart = class extends RouterEvent {
+  urlAfterRedirects;
+  state;
+  type = EventType.GuardsCheckStart;
+  constructor(id, url, urlAfterRedirects, state) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+    this.state = state;
+  }
+  toString() {
+    return `GuardsCheckStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;
+  }
+};
+var GuardsCheckEnd = class extends RouterEvent {
+  urlAfterRedirects;
+  state;
+  shouldActivate;
+  type = EventType.GuardsCheckEnd;
+  constructor(id, url, urlAfterRedirects, state, shouldActivate) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+    this.state = state;
+    this.shouldActivate = shouldActivate;
+  }
+  toString() {
+    return `GuardsCheckEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state}, shouldActivate: ${this.shouldActivate})`;
+  }
+};
+var ResolveStart = class extends RouterEvent {
+  urlAfterRedirects;
+  state;
+  type = EventType.ResolveStart;
+  constructor(id, url, urlAfterRedirects, state) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+    this.state = state;
+  }
+  toString() {
+    return `ResolveStart(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;
+  }
+};
+var ResolveEnd = class extends RouterEvent {
+  urlAfterRedirects;
+  state;
+  type = EventType.ResolveEnd;
+  constructor(id, url, urlAfterRedirects, state) {
+    super(id, url);
+    this.urlAfterRedirects = urlAfterRedirects;
+    this.state = state;
+  }
+  toString() {
+    return `ResolveEnd(id: ${this.id}, url: '${this.url}', urlAfterRedirects: '${this.urlAfterRedirects}', state: ${this.state})`;
+  }
+};
+var RouteConfigLoadStart = class {
+  route;
+  type = EventType.RouteConfigLoadStart;
+  constructor(route) {
+    this.route = route;
+  }
+  toString() {
+    return `RouteConfigLoadStart(path: ${this.route.path})`;
+  }
+};
+var RouteConfigLoadEnd = class {
+  route;
+  type = EventType.RouteConfigLoadEnd;
+  constructor(route) {
+    this.route = route;
+  }
+  toString() {
+    return `RouteConfigLoadEnd(path: ${this.route.path})`;
+  }
+};
+var ChildActivationStart = class {
+  snapshot;
+  type = EventType.ChildActivationStart;
+  constructor(snapshot) {
+    this.snapshot = snapshot;
+  }
+  toString() {
+    const path = this.snapshot.routeConfig && this.snapshot.routeConfig.path || "";
+    return `ChildActivationStart(path: '${path}')`;
+  }
+};
+var ChildActivationEnd = class {
+  snapshot;
+  type = EventType.ChildActivationEnd;
+  constructor(snapshot) {
+    this.snapshot = snapshot;
+  }
+  toString() {
+    const path = this.snapshot.routeConfig && this.snapshot.routeConfig.path || "";
+    return `ChildActivationEnd(path: '${path}')`;
+  }
+};
+var ActivationStart = class {
+  snapshot;
+  type = EventType.ActivationStart;
+  constructor(snapshot) {
+    this.snapshot = snapshot;
+  }
+  toString() {
+    const path = this.snapshot.routeConfig && this.snapshot.routeConfig.path || "";
+    return `ActivationStart(path: '${path}')`;
+  }
+};
+var ActivationEnd = class {
+  snapshot;
+  type = EventType.ActivationEnd;
+  constructor(snapshot) {
+    this.snapshot = snapshot;
+  }
+  toString() {
+    const path = this.snapshot.routeConfig && this.snapshot.routeConfig.path || "";
+    return `ActivationEnd(path: '${path}')`;
+  }
+};
+var Scroll = class {
+  routerEvent;
+  position;
+  anchor;
+  type = EventType.Scroll;
+  constructor(routerEvent, position, anchor) {
+    this.routerEvent = routerEvent;
+    this.position = position;
+    this.anchor = anchor;
+  }
+  toString() {
+    const pos = this.position ? `${this.position[0]}, ${this.position[1]}` : null;
+    return `Scroll(anchor: '${this.anchor}', position: '${pos}')`;
+  }
+};
+var BeforeActivateRoutes = class {
+};
+var RedirectRequest = class {
+  url;
+  navigationBehaviorOptions;
+  constructor(url, navigationBehaviorOptions) {
+    this.url = url;
+    this.navigationBehaviorOptions = navigationBehaviorOptions;
+  }
+};
+function isPublicRouterEvent(e) {
+  return !(e instanceof BeforeActivateRoutes) && !(e instanceof RedirectRequest);
+}
+function stringifyEvent(routerEvent) {
+  switch (routerEvent.type) {
+    case EventType.ActivationEnd:
+      return `ActivationEnd(path: '${routerEvent.snapshot.routeConfig?.path || ""}')`;
+    case EventType.ActivationStart:
+      return `ActivationStart(path: '${routerEvent.snapshot.routeConfig?.path || ""}')`;
+    case EventType.ChildActivationEnd:
+      return `ChildActivationEnd(path: '${routerEvent.snapshot.routeConfig?.path || ""}')`;
+    case EventType.ChildActivationStart:
+      return `ChildActivationStart(path: '${routerEvent.snapshot.routeConfig?.path || ""}')`;
+    case EventType.GuardsCheckEnd:
+      return `GuardsCheckEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state}, shouldActivate: ${routerEvent.shouldActivate})`;
+    case EventType.GuardsCheckStart:
+      return `GuardsCheckStart(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;
+    case EventType.NavigationCancel:
+      return `NavigationCancel(id: ${routerEvent.id}, url: '${routerEvent.url}')`;
+    case EventType.NavigationSkipped:
+      return `NavigationSkipped(id: ${routerEvent.id}, url: '${routerEvent.url}')`;
+    case EventType.NavigationEnd:
+      return `NavigationEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}')`;
+    case EventType.NavigationError:
+      return `NavigationError(id: ${routerEvent.id}, url: '${routerEvent.url}', error: ${routerEvent.error})`;
+    case EventType.NavigationStart:
+      return `NavigationStart(id: ${routerEvent.id}, url: '${routerEvent.url}')`;
+    case EventType.ResolveEnd:
+      return `ResolveEnd(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;
+    case EventType.ResolveStart:
+      return `ResolveStart(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;
+    case EventType.RouteConfigLoadEnd:
+      return `RouteConfigLoadEnd(path: ${routerEvent.route.path})`;
+    case EventType.RouteConfigLoadStart:
+      return `RouteConfigLoadStart(path: ${routerEvent.route.path})`;
+    case EventType.RoutesRecognized:
+      return `RoutesRecognized(id: ${routerEvent.id}, url: '${routerEvent.url}', urlAfterRedirects: '${routerEvent.urlAfterRedirects}', state: ${routerEvent.state})`;
+    case EventType.Scroll:
+      const pos = routerEvent.position ? `${routerEvent.position[0]}, ${routerEvent.position[1]}` : null;
+      return `Scroll(anchor: '${routerEvent.anchor}', position: '${pos}')`;
+  }
+}
+function getOrCreateRouteInjectorIfNeeded(route, currentInjector) {
+  if (route.providers && !route._injector) {
+    route._injector = createEnvironmentInjector(route.providers, currentInjector, `Route: ${route.path}`);
+  }
+  return route._injector ?? currentInjector;
+}
+function validateConfig(config, parentPath = "", requireStandaloneComponents = false) {
+  for (let i = 0; i < config.length; i++) {
+    const route = config[i];
+    const fullPath = getFullPath(parentPath, route);
+    validateNode(route, fullPath, requireStandaloneComponents);
+  }
+}
+function assertStandalone(fullPath, component) {
+  if (component && isNgModule(component)) {
+    throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}'. You are using 'loadComponent' with a module, but it must be used with standalone components. Use 'loadChildren' instead.`);
+  } else if (component && !isStandalone(component)) {
+    throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}'. The component must be standalone.`);
+  }
+}
+function validateNode(route, fullPath, requireStandaloneComponents) {
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    if (!route) {
+      throw new RuntimeError(4014, `
+      Invalid configuration of route '${fullPath}': Encountered undefined route.
+      The reason might be an extra comma.
+
+      Example:
+      const routes: Routes = [
+        { path: '', redirectTo: '/dashboard', pathMatch: 'full' },
+        { path: 'dashboard',  component: DashboardComponent },, << two commas
+        { path: 'detail/:id', component: HeroDetailComponent }
+      ];
+    `);
+    }
+    if (Array.isArray(route)) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': Array cannot be specified`);
+    }
+    if (!route.redirectTo && !route.component && !route.loadComponent && !route.children && !route.loadChildren && route.outlet && route.outlet !== PRIMARY_OUTLET) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': a componentless route without children or loadChildren cannot have a named outlet set`);
+    }
+    if (route.redirectTo && route.children) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': redirectTo and children cannot be used together`);
+    }
+    if (route.redirectTo && route.loadChildren) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': redirectTo and loadChildren cannot be used together`);
+    }
+    if (route.children && route.loadChildren) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': children and loadChildren cannot be used together`);
+    }
+    if (route.component && route.loadComponent) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': component and loadComponent cannot be used together`);
+    }
+    if (route.redirectTo) {
+      if (route.component || route.loadComponent) {
+        throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': redirectTo and component/loadComponent cannot be used together`);
+      }
+      if (route.canMatch || route.canActivate) {
+        throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': redirectTo and ${route.canMatch ? "canMatch" : "canActivate"} cannot be used together.Redirects happen before guards are executed.`);
+      }
+    }
+    if (route.path && route.matcher) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': path and matcher cannot be used together`);
+    }
+    if (route.redirectTo === void 0 && !route.component && !route.loadComponent && !route.children && !route.loadChildren) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}'. One of the following must be provided: component, loadComponent, redirectTo, children or loadChildren`);
+    }
+    if (route.path === void 0 && route.matcher === void 0) {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': routes must have either a path or a matcher specified`);
+    }
+    if (typeof route.path === "string" && route.path.charAt(0) === "/") {
+      throw new RuntimeError(4014, `Invalid configuration of route '${fullPath}': path cannot start with a slash`);
+    }
+    if (route.path === "" && route.redirectTo !== void 0 && route.pathMatch === void 0) {
+      const exp = `The default value of 'pathMatch' is 'prefix', but often the intent is to use 'full'.`;
+      throw new RuntimeError(4014, `Invalid configuration of route '{path: "${fullPath}", redirectTo: "${route.redirectTo}"}': please provide 'pathMatch'. ${exp}`);
+    }
+    if (requireStandaloneComponents) {
+      assertStandalone(fullPath, route.component);
+    }
+  }
+  if (route.children) {
+    validateConfig(route.children, fullPath, requireStandaloneComponents);
+  }
+}
+function getFullPath(parentPath, currentRoute) {
+  if (!currentRoute) {
+    return parentPath;
+  }
+  if (!parentPath && !currentRoute.path) {
+    return "";
+  } else if (parentPath && !currentRoute.path) {
+    return `${parentPath}/`;
+  } else if (!parentPath && currentRoute.path) {
+    return currentRoute.path;
+  } else {
+    return `${parentPath}/${currentRoute.path}`;
+  }
+}
+function getOutlet(route) {
+  return route.outlet || PRIMARY_OUTLET;
+}
+function sortByMatchingOutlets(routes, outletName) {
+  const sortedConfig = routes.filter((r) => getOutlet(r) === outletName);
+  sortedConfig.push(...routes.filter((r) => getOutlet(r) !== outletName));
+  return sortedConfig;
+}
+function getClosestRouteInjector(snapshot) {
+  if (!snapshot) return null;
+  if (snapshot.routeConfig?._injector) {
+    return snapshot.routeConfig._injector;
+  }
+  for (let s = snapshot.parent; s; s = s.parent) {
+    const route = s.routeConfig;
+    if (route?._loadedInjector) return route._loadedInjector;
+    if (route?._injector) return route._injector;
+  }
+  return null;
+}
+var OutletContext = class {
+  rootInjector;
+  outlet = null;
+  route = null;
+  children;
+  attachRef = null;
+  get injector() {
+    return getClosestRouteInjector(this.route?.snapshot) ?? this.rootInjector;
+  }
+  constructor(rootInjector) {
+    this.rootInjector = rootInjector;
+    this.children = new ChildrenOutletContexts(this.rootInjector);
+  }
+};
+var ChildrenOutletContexts = class _ChildrenOutletContexts {
+  rootInjector;
+  // contexts for child outlets, by name.
+  contexts = /* @__PURE__ */ new Map();
+  /** @docs-private */
+  constructor(rootInjector) {
+    this.rootInjector = rootInjector;
+  }
+  /** Called when a `RouterOutlet` directive is instantiated */
+  onChildOutletCreated(childName, outlet) {
+    const context = this.getOrCreateContext(childName);
+    context.outlet = outlet;
+    this.contexts.set(childName, context);
+  }
+  /**
+   * Called when a `RouterOutlet` directive is destroyed.
+   * We need to keep the context as the outlet could be destroyed inside a NgIf and might be
+   * re-created later.
+   */
+  onChildOutletDestroyed(childName) {
+    const context = this.getContext(childName);
+    if (context) {
+      context.outlet = null;
+      context.attachRef = null;
+    }
+  }
+  /**
+   * Called when the corresponding route is deactivated during navigation.
+   * Because the component get destroyed, all children outlet are destroyed.
+   */
+  onOutletDeactivated() {
+    const contexts = this.contexts;
+    this.contexts = /* @__PURE__ */ new Map();
+    return contexts;
+  }
+  onOutletReAttached(contexts) {
+    this.contexts = contexts;
+  }
+  getOrCreateContext(childName) {
+    let context = this.getContext(childName);
+    if (!context) {
+      context = new OutletContext(this.rootInjector);
+      this.contexts.set(childName, context);
+    }
+    return context;
+  }
+  getContext(childName) {
+    return this.contexts.get(childName) || null;
+  }
+  static ɵfac = function ChildrenOutletContexts_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ChildrenOutletContexts)(ɵɵinject(EnvironmentInjector));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _ChildrenOutletContexts,
+    factory: _ChildrenOutletContexts.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ChildrenOutletContexts, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: EnvironmentInjector
+  }], null);
+})();
+var Tree = class {
+  /** @internal */
+  _root;
+  constructor(root) {
+    this._root = root;
+  }
+  get root() {
+    return this._root.value;
+  }
+  /**
+   * @internal
+   */
+  parent(t) {
+    const p = this.pathFromRoot(t);
+    return p.length > 1 ? p[p.length - 2] : null;
+  }
+  /**
+   * @internal
+   */
+  children(t) {
+    const n = findNode(t, this._root);
+    return n ? n.children.map((t2) => t2.value) : [];
+  }
+  /**
+   * @internal
+   */
+  firstChild(t) {
+    const n = findNode(t, this._root);
+    return n && n.children.length > 0 ? n.children[0].value : null;
+  }
+  /**
+   * @internal
+   */
+  siblings(t) {
+    const p = findPath(t, this._root);
+    if (p.length < 2) return [];
+    const c = p[p.length - 2].children.map((c2) => c2.value);
+    return c.filter((cc) => cc !== t);
+  }
+  /**
+   * @internal
+   */
+  pathFromRoot(t) {
+    return findPath(t, this._root).map((s) => s.value);
+  }
+};
+function findNode(value, node) {
+  if (value === node.value) return node;
+  for (const child of node.children) {
+    const node2 = findNode(value, child);
+    if (node2) return node2;
+  }
+  return null;
+}
+function findPath(value, node) {
+  if (value === node.value) return [node];
+  for (const child of node.children) {
+    const path = findPath(value, child);
+    if (path.length) {
+      path.unshift(node);
+      return path;
+    }
+  }
+  return [];
+}
+var TreeNode = class {
+  value;
+  children;
+  constructor(value, children) {
+    this.value = value;
+    this.children = children;
+  }
+  toString() {
+    return `TreeNode(${this.value})`;
+  }
+};
+function nodeChildrenAsMap(node) {
+  const map2 = {};
+  if (node) {
+    node.children.forEach((child) => map2[child.value.outlet] = child);
+  }
+  return map2;
+}
+var RouterState = class extends Tree {
+  snapshot;
+  /** @internal */
+  constructor(root, snapshot) {
+    super(root);
+    this.snapshot = snapshot;
+    setRouterState(this, root);
+  }
+  toString() {
+    return this.snapshot.toString();
+  }
+};
+function createEmptyState(rootComponent) {
+  const snapshot = createEmptyStateSnapshot(rootComponent);
+  const emptyUrl = new BehaviorSubject([new UrlSegment("", {})]);
+  const emptyParams = new BehaviorSubject({});
+  const emptyData = new BehaviorSubject({});
+  const emptyQueryParams = new BehaviorSubject({});
+  const fragment = new BehaviorSubject("");
+  const activated = new ActivatedRoute(emptyUrl, emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, snapshot.root);
+  activated.snapshot = snapshot.root;
+  return new RouterState(new TreeNode(activated, []), snapshot);
+}
+function createEmptyStateSnapshot(rootComponent) {
+  const emptyParams = {};
+  const emptyData = {};
+  const emptyQueryParams = {};
+  const fragment = "";
+  const activated = new ActivatedRouteSnapshot([], emptyParams, emptyQueryParams, fragment, emptyData, PRIMARY_OUTLET, rootComponent, null, {});
+  return new RouterStateSnapshot("", new TreeNode(activated, []));
+}
+var ActivatedRoute = class {
+  urlSubject;
+  paramsSubject;
+  queryParamsSubject;
+  fragmentSubject;
+  dataSubject;
+  outlet;
+  component;
+  /** The current snapshot of this route */
+  snapshot;
+  /** @internal */
+  _futureSnapshot;
+  /** @internal */
+  _routerState;
+  /** @internal */
+  _paramMap;
+  /** @internal */
+  _queryParamMap;
+  /** An Observable of the resolved route title */
+  title;
+  /** An observable of the URL segments matched by this route. */
+  url;
+  /** An observable of the matrix parameters scoped to this route. */
+  params;
+  /** An observable of the query parameters shared by all the routes. */
+  queryParams;
+  /** An observable of the URL fragment shared by all the routes. */
+  fragment;
+  /** An observable of the static and resolved data of this route. */
+  data;
+  /** @internal */
+  constructor(urlSubject, paramsSubject, queryParamsSubject, fragmentSubject, dataSubject, outlet, component, futureSnapshot) {
+    this.urlSubject = urlSubject;
+    this.paramsSubject = paramsSubject;
+    this.queryParamsSubject = queryParamsSubject;
+    this.fragmentSubject = fragmentSubject;
+    this.dataSubject = dataSubject;
+    this.outlet = outlet;
+    this.component = component;
+    this._futureSnapshot = futureSnapshot;
+    this.title = this.dataSubject?.pipe(map((d) => d[RouteTitleKey])) ?? of(void 0);
+    this.url = urlSubject;
+    this.params = paramsSubject;
+    this.queryParams = queryParamsSubject;
+    this.fragment = fragmentSubject;
+    this.data = dataSubject;
+  }
+  /** The configuration used to match this route. */
+  get routeConfig() {
+    return this._futureSnapshot.routeConfig;
+  }
+  /** The root of the router state. */
+  get root() {
+    return this._routerState.root;
+  }
+  /** The parent of this route in the router state tree. */
+  get parent() {
+    return this._routerState.parent(this);
+  }
+  /** The first child of this route in the router state tree. */
+  get firstChild() {
+    return this._routerState.firstChild(this);
+  }
+  /** The children of this route in the router state tree. */
+  get children() {
+    return this._routerState.children(this);
+  }
+  /** The path from the root of the router state tree to this route. */
+  get pathFromRoot() {
+    return this._routerState.pathFromRoot(this);
+  }
+  /**
+   * An Observable that contains a map of the required and optional parameters
+   * specific to the route.
+   * The map supports retrieving single and multiple values from the same parameter.
+   */
+  get paramMap() {
+    this._paramMap ??= this.params.pipe(map((p) => convertToParamMap(p)));
+    return this._paramMap;
+  }
+  /**
+   * An Observable that contains a map of the query parameters available to all routes.
+   * The map supports retrieving single and multiple values from the query parameter.
+   */
+  get queryParamMap() {
+    this._queryParamMap ??= this.queryParams.pipe(map((p) => convertToParamMap(p)));
+    return this._queryParamMap;
+  }
+  toString() {
+    return this.snapshot ? this.snapshot.toString() : `Future(${this._futureSnapshot})`;
+  }
+};
+function getInherited(route, parent, paramsInheritanceStrategy = "emptyOnly") {
+  let inherited;
+  const {
+    routeConfig
+  } = route;
+  if (parent !== null && (paramsInheritanceStrategy === "always" || // inherit parent data if route is empty path
+  routeConfig?.path === "" || // inherit parent data if parent was componentless
+  !parent.component && !parent.routeConfig?.loadComponent)) {
+    inherited = {
+      params: __spreadValues(__spreadValues({}, parent.params), route.params),
+      data: __spreadValues(__spreadValues({}, parent.data), route.data),
+      resolve: __spreadValues(__spreadValues(__spreadValues(__spreadValues({}, route.data), parent.data), routeConfig?.data), route._resolvedData)
+    };
+  } else {
+    inherited = {
+      params: __spreadValues({}, route.params),
+      data: __spreadValues({}, route.data),
+      resolve: __spreadValues(__spreadValues({}, route.data), route._resolvedData ?? {})
+    };
+  }
+  if (routeConfig && hasStaticTitle(routeConfig)) {
+    inherited.resolve[RouteTitleKey] = routeConfig.title;
+  }
+  return inherited;
+}
+var ActivatedRouteSnapshot = class {
+  url;
+  params;
+  queryParams;
+  fragment;
+  data;
+  outlet;
+  component;
+  /** The configuration used to match this route **/
+  routeConfig;
+  /** @internal */
+  _resolve;
+  /** @internal */
+  _resolvedData;
+  /** @internal */
+  _routerState;
+  /** @internal */
+  _paramMap;
+  /** @internal */
+  _queryParamMap;
+  /** The resolved route title */
+  get title() {
+    return this.data?.[RouteTitleKey];
+  }
+  /** @internal */
+  constructor(url, params, queryParams, fragment, data, outlet, component, routeConfig, resolve) {
+    this.url = url;
+    this.params = params;
+    this.queryParams = queryParams;
+    this.fragment = fragment;
+    this.data = data;
+    this.outlet = outlet;
+    this.component = component;
+    this.routeConfig = routeConfig;
+    this._resolve = resolve;
+  }
+  /** The root of the router state */
+  get root() {
+    return this._routerState.root;
+  }
+  /** The parent of this route in the router state tree */
+  get parent() {
+    return this._routerState.parent(this);
+  }
+  /** The first child of this route in the router state tree */
+  get firstChild() {
+    return this._routerState.firstChild(this);
+  }
+  /** The children of this route in the router state tree */
+  get children() {
+    return this._routerState.children(this);
+  }
+  /** The path from the root of the router state tree to this route */
+  get pathFromRoot() {
+    return this._routerState.pathFromRoot(this);
+  }
+  get paramMap() {
+    this._paramMap ??= convertToParamMap(this.params);
+    return this._paramMap;
+  }
+  get queryParamMap() {
+    this._queryParamMap ??= convertToParamMap(this.queryParams);
+    return this._queryParamMap;
+  }
+  toString() {
+    const url = this.url.map((segment) => segment.toString()).join("/");
+    const matched = this.routeConfig ? this.routeConfig.path : "";
+    return `Route(url:'${url}', path:'${matched}')`;
+  }
+};
+var RouterStateSnapshot = class extends Tree {
+  url;
+  /** @internal */
+  constructor(url, root) {
+    super(root);
+    this.url = url;
+    setRouterState(this, root);
+  }
+  toString() {
+    return serializeNode(this._root);
+  }
+};
+function setRouterState(state, node) {
+  node.value._routerState = state;
+  node.children.forEach((c) => setRouterState(state, c));
+}
+function serializeNode(node) {
+  const c = node.children.length > 0 ? ` { ${node.children.map(serializeNode).join(", ")} } ` : "";
+  return `${node.value}${c}`;
+}
+function advanceActivatedRoute(route) {
+  if (route.snapshot) {
+    const currentSnapshot = route.snapshot;
+    const nextSnapshot = route._futureSnapshot;
+    route.snapshot = nextSnapshot;
+    if (!shallowEqual(currentSnapshot.queryParams, nextSnapshot.queryParams)) {
+      route.queryParamsSubject.next(nextSnapshot.queryParams);
+    }
+    if (currentSnapshot.fragment !== nextSnapshot.fragment) {
+      route.fragmentSubject.next(nextSnapshot.fragment);
+    }
+    if (!shallowEqual(currentSnapshot.params, nextSnapshot.params)) {
+      route.paramsSubject.next(nextSnapshot.params);
+    }
+    if (!shallowEqualArrays(currentSnapshot.url, nextSnapshot.url)) {
+      route.urlSubject.next(nextSnapshot.url);
+    }
+    if (!shallowEqual(currentSnapshot.data, nextSnapshot.data)) {
+      route.dataSubject.next(nextSnapshot.data);
+    }
+  } else {
+    route.snapshot = route._futureSnapshot;
+    route.dataSubject.next(route._futureSnapshot.data);
+  }
+}
+function equalParamsAndUrlSegments(a, b) {
+  const equalUrlParams = shallowEqual(a.params, b.params) && equalSegments(a.url, b.url);
+  const parentsMismatch = !a.parent !== !b.parent;
+  return equalUrlParams && !parentsMismatch && (!a.parent || equalParamsAndUrlSegments(a.parent, b.parent));
+}
+function hasStaticTitle(config) {
+  return typeof config.title === "string" || config.title === null;
+}
+var ROUTER_OUTLET_DATA = new InjectionToken(ngDevMode ? "RouterOutlet data" : "");
+var RouterOutlet = class _RouterOutlet {
+  activated = null;
+  /** @internal */
+  get activatedComponentRef() {
+    return this.activated;
+  }
+  _activatedRoute = null;
+  /**
+   * The name of the outlet
+   *
+   */
+  name = PRIMARY_OUTLET;
+  activateEvents = new EventEmitter();
+  deactivateEvents = new EventEmitter();
+  /**
+   * Emits an attached component instance when the `RouteReuseStrategy` instructs to re-attach a
+   * previously detached subtree.
+   **/
+  attachEvents = new EventEmitter();
+  /**
+   * Emits a detached component instance when the `RouteReuseStrategy` instructs to detach the
+   * subtree.
+   */
+  detachEvents = new EventEmitter();
+  /**
+   * Data that will be provided to the child injector through the `ROUTER_OUTLET_DATA` token.
+   *
+   * When unset, the value of the token is `undefined` by default.
+   */
+  routerOutletData = input(void 0);
+  parentContexts = inject(ChildrenOutletContexts);
+  location = inject(ViewContainerRef);
+  changeDetector = inject(ChangeDetectorRef);
+  inputBinder = inject(INPUT_BINDER, {
+    optional: true
+  });
+  /** @docs-private */
+  supportsBindingToComponentInputs = true;
+  /** @docs-private */
+  ngOnChanges(changes) {
+    if (changes["name"]) {
+      const {
+        firstChange,
+        previousValue
+      } = changes["name"];
+      if (firstChange) {
+        return;
+      }
+      if (this.isTrackedInParentContexts(previousValue)) {
+        this.deactivate();
+        this.parentContexts.onChildOutletDestroyed(previousValue);
+      }
+      this.initializeOutletWithName();
+    }
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.isTrackedInParentContexts(this.name)) {
+      this.parentContexts.onChildOutletDestroyed(this.name);
+    }
+    this.inputBinder?.unsubscribeFromRouteData(this);
+  }
+  isTrackedInParentContexts(outletName) {
+    return this.parentContexts.getContext(outletName)?.outlet === this;
+  }
+  /** @docs-private */
+  ngOnInit() {
+    this.initializeOutletWithName();
+  }
+  initializeOutletWithName() {
+    this.parentContexts.onChildOutletCreated(this.name, this);
+    if (this.activated) {
+      return;
+    }
+    const context = this.parentContexts.getContext(this.name);
+    if (context?.route) {
+      if (context.attachRef) {
+        this.attach(context.attachRef, context.route);
+      } else {
+        this.activateWith(context.route, context.injector);
+      }
+    }
+  }
+  get isActivated() {
+    return !!this.activated;
+  }
+  /**
+   * @returns The currently activated component instance.
+   * @throws An error if the outlet is not activated.
+   */
+  get component() {
+    if (!this.activated) throw new RuntimeError(4012, (typeof ngDevMode === "undefined" || ngDevMode) && "Outlet is not activated");
+    return this.activated.instance;
+  }
+  get activatedRoute() {
+    if (!this.activated) throw new RuntimeError(4012, (typeof ngDevMode === "undefined" || ngDevMode) && "Outlet is not activated");
+    return this._activatedRoute;
+  }
+  get activatedRouteData() {
+    if (this._activatedRoute) {
+      return this._activatedRoute.snapshot.data;
+    }
+    return {};
+  }
+  /**
+   * Called when the `RouteReuseStrategy` instructs to detach the subtree
+   */
+  detach() {
+    if (!this.activated) throw new RuntimeError(4012, (typeof ngDevMode === "undefined" || ngDevMode) && "Outlet is not activated");
+    this.location.detach();
+    const cmp = this.activated;
+    this.activated = null;
+    this._activatedRoute = null;
+    this.detachEvents.emit(cmp.instance);
+    return cmp;
+  }
+  /**
+   * Called when the `RouteReuseStrategy` instructs to re-attach a previously detached subtree
+   */
+  attach(ref, activatedRoute) {
+    this.activated = ref;
+    this._activatedRoute = activatedRoute;
+    this.location.insert(ref.hostView);
+    this.inputBinder?.bindActivatedRouteToOutletComponent(this);
+    this.attachEvents.emit(ref.instance);
+  }
+  deactivate() {
+    if (this.activated) {
+      const c = this.component;
+      this.activated.destroy();
+      this.activated = null;
+      this._activatedRoute = null;
+      this.deactivateEvents.emit(c);
+    }
+  }
+  activateWith(activatedRoute, environmentInjector) {
+    if (this.isActivated) {
+      throw new RuntimeError(4013, (typeof ngDevMode === "undefined" || ngDevMode) && "Cannot activate an already activated outlet");
+    }
+    this._activatedRoute = activatedRoute;
+    const location = this.location;
+    const snapshot = activatedRoute.snapshot;
+    const component = snapshot.component;
+    const childContexts = this.parentContexts.getOrCreateContext(this.name).children;
+    const injector = new OutletInjector(activatedRoute, childContexts, location.injector, this.routerOutletData);
+    this.activated = location.createComponent(component, {
+      index: location.length,
+      injector,
+      environmentInjector
+    });
+    this.changeDetector.markForCheck();
+    this.inputBinder?.bindActivatedRouteToOutletComponent(this);
+    this.activateEvents.emit(this.activated.instance);
+  }
+  static ɵfac = function RouterOutlet_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterOutlet)();
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _RouterOutlet,
+    selectors: [["router-outlet"]],
+    inputs: {
+      name: "name",
+      routerOutletData: [1, "routerOutletData"]
+    },
+    outputs: {
+      activateEvents: "activate",
+      deactivateEvents: "deactivate",
+      attachEvents: "attach",
+      detachEvents: "detach"
+    },
+    exportAs: ["outlet"],
+    features: [ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterOutlet, [{
+    type: Directive,
+    args: [{
+      selector: "router-outlet",
+      exportAs: "outlet"
+    }]
+  }], null, {
+    name: [{
+      type: Input
+    }],
+    activateEvents: [{
+      type: Output,
+      args: ["activate"]
+    }],
+    deactivateEvents: [{
+      type: Output,
+      args: ["deactivate"]
+    }],
+    attachEvents: [{
+      type: Output,
+      args: ["attach"]
+    }],
+    detachEvents: [{
+      type: Output,
+      args: ["detach"]
+    }]
+  });
+})();
+var OutletInjector = class {
+  route;
+  childContexts;
+  parent;
+  outletData;
+  constructor(route, childContexts, parent, outletData) {
+    this.route = route;
+    this.childContexts = childContexts;
+    this.parent = parent;
+    this.outletData = outletData;
+  }
+  get(token, notFoundValue) {
+    if (token === ActivatedRoute) {
+      return this.route;
+    }
+    if (token === ChildrenOutletContexts) {
+      return this.childContexts;
+    }
+    if (token === ROUTER_OUTLET_DATA) {
+      return this.outletData;
+    }
+    return this.parent.get(token, notFoundValue);
+  }
+};
+var INPUT_BINDER = new InjectionToken("");
+var RoutedComponentInputBinder = class _RoutedComponentInputBinder {
+  outletDataSubscriptions = /* @__PURE__ */ new Map();
+  bindActivatedRouteToOutletComponent(outlet) {
+    this.unsubscribeFromRouteData(outlet);
+    this.subscribeToRouteData(outlet);
+  }
+  unsubscribeFromRouteData(outlet) {
+    this.outletDataSubscriptions.get(outlet)?.unsubscribe();
+    this.outletDataSubscriptions.delete(outlet);
+  }
+  subscribeToRouteData(outlet) {
+    const {
+      activatedRoute
+    } = outlet;
+    const dataSubscription = combineLatest([activatedRoute.queryParams, activatedRoute.params, activatedRoute.data]).pipe(switchMap(([queryParams, params, data], index) => {
+      data = __spreadValues(__spreadValues(__spreadValues({}, queryParams), params), data);
+      if (index === 0) {
+        return of(data);
+      }
+      return Promise.resolve(data);
+    })).subscribe((data) => {
+      if (!outlet.isActivated || !outlet.activatedComponentRef || outlet.activatedRoute !== activatedRoute || activatedRoute.component === null) {
+        this.unsubscribeFromRouteData(outlet);
+        return;
+      }
+      const mirror = reflectComponentType(activatedRoute.component);
+      if (!mirror) {
+        this.unsubscribeFromRouteData(outlet);
+        return;
+      }
+      for (const {
+        templateName
+      } of mirror.inputs) {
+        outlet.activatedComponentRef.setInput(templateName, data[templateName]);
+      }
+    });
+    this.outletDataSubscriptions.set(outlet, dataSubscription);
+  }
+  static ɵfac = function RoutedComponentInputBinder_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RoutedComponentInputBinder)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RoutedComponentInputBinder,
+    factory: _RoutedComponentInputBinder.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RoutedComponentInputBinder, [{
+    type: Injectable
+  }], null, null);
+})();
+var ɵEmptyOutletComponent = class _ɵEmptyOutletComponent {
+  static ɵfac = function ɵEmptyOutletComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ɵEmptyOutletComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _ɵEmptyOutletComponent,
+    selectors: [["ng-component"]],
+    exportAs: ["emptyRouterOutlet"],
+    decls: 1,
+    vars: 0,
+    template: function _EmptyOutletComponent_Template(rf, ctx) {
+      if (rf & 1) {
+        ɵɵelement(0, "router-outlet");
+      }
+    },
+    dependencies: [RouterOutlet],
+    encapsulation: 2
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ɵEmptyOutletComponent, [{
+    type: Component,
+    args: [{
+      template: `<router-outlet/>`,
+      imports: [RouterOutlet],
+      // Used to avoid component ID collisions with user code.
+      exportAs: "emptyRouterOutlet"
+    }]
+  }], null, null);
+})();
+function standardizeConfig(r) {
+  const children = r.children && r.children.map(standardizeConfig);
+  const c = children ? __spreadProps(__spreadValues({}, r), {
+    children
+  }) : __spreadValues({}, r);
+  if (!c.component && !c.loadComponent && (children || c.loadChildren) && c.outlet && c.outlet !== PRIMARY_OUTLET) {
+    c.component = ɵEmptyOutletComponent;
+  }
+  return c;
+}
+function createRouterState(routeReuseStrategy, curr, prevState) {
+  const root = createNode(routeReuseStrategy, curr._root, prevState ? prevState._root : void 0);
+  return new RouterState(root, curr);
+}
+function createNode(routeReuseStrategy, curr, prevState) {
+  if (prevState && routeReuseStrategy.shouldReuseRoute(curr.value, prevState.value.snapshot)) {
+    const value = prevState.value;
+    value._futureSnapshot = curr.value;
+    const children = createOrReuseChildren(routeReuseStrategy, curr, prevState);
+    return new TreeNode(value, children);
+  } else {
+    if (routeReuseStrategy.shouldAttach(curr.value)) {
+      const detachedRouteHandle = routeReuseStrategy.retrieve(curr.value);
+      if (detachedRouteHandle !== null) {
+        const tree2 = detachedRouteHandle.route;
+        tree2.value._futureSnapshot = curr.value;
+        tree2.children = curr.children.map((c) => createNode(routeReuseStrategy, c));
+        return tree2;
+      }
+    }
+    const value = createActivatedRoute(curr.value);
+    const children = curr.children.map((c) => createNode(routeReuseStrategy, c));
+    return new TreeNode(value, children);
+  }
+}
+function createOrReuseChildren(routeReuseStrategy, curr, prevState) {
+  return curr.children.map((child) => {
+    for (const p of prevState.children) {
+      if (routeReuseStrategy.shouldReuseRoute(child.value, p.value.snapshot)) {
+        return createNode(routeReuseStrategy, child, p);
+      }
+    }
+    return createNode(routeReuseStrategy, child);
+  });
+}
+function createActivatedRoute(c) {
+  return new ActivatedRoute(new BehaviorSubject(c.url), new BehaviorSubject(c.params), new BehaviorSubject(c.queryParams), new BehaviorSubject(c.fragment), new BehaviorSubject(c.data), c.outlet, c.component, c);
+}
+var RedirectCommand = class {
+  redirectTo;
+  navigationBehaviorOptions;
+  constructor(redirectTo, navigationBehaviorOptions) {
+    this.redirectTo = redirectTo;
+    this.navigationBehaviorOptions = navigationBehaviorOptions;
+  }
+};
+var NAVIGATION_CANCELING_ERROR = "ngNavigationCancelingError";
+function redirectingNavigationError(urlSerializer, redirect) {
+  const {
+    redirectTo,
+    navigationBehaviorOptions
+  } = isUrlTree(redirect) ? {
+    redirectTo: redirect,
+    navigationBehaviorOptions: void 0
+  } : redirect;
+  const error = navigationCancelingError(ngDevMode && `Redirecting to "${urlSerializer.serialize(redirectTo)}"`, NavigationCancellationCode.Redirect);
+  error.url = redirectTo;
+  error.navigationBehaviorOptions = navigationBehaviorOptions;
+  return error;
+}
+function navigationCancelingError(message, code) {
+  const error = new Error(`NavigationCancelingError: ${message || ""}`);
+  error[NAVIGATION_CANCELING_ERROR] = true;
+  error.cancellationCode = code;
+  return error;
+}
+function isRedirectingNavigationCancelingError(error) {
+  return isNavigationCancelingError(error) && isUrlTree(error.url);
+}
+function isNavigationCancelingError(error) {
+  return !!error && error[NAVIGATION_CANCELING_ERROR];
+}
+var warnedAboutUnsupportedInputBinding = false;
+var activateRoutes = (rootContexts, routeReuseStrategy, forwardEvent, inputBindingEnabled) => map((t) => {
+  new ActivateRoutes(routeReuseStrategy, t.targetRouterState, t.currentRouterState, forwardEvent, inputBindingEnabled).activate(rootContexts);
+  return t;
+});
+var ActivateRoutes = class {
+  routeReuseStrategy;
+  futureState;
+  currState;
+  forwardEvent;
+  inputBindingEnabled;
+  constructor(routeReuseStrategy, futureState, currState, forwardEvent, inputBindingEnabled) {
+    this.routeReuseStrategy = routeReuseStrategy;
+    this.futureState = futureState;
+    this.currState = currState;
+    this.forwardEvent = forwardEvent;
+    this.inputBindingEnabled = inputBindingEnabled;
+  }
+  activate(parentContexts) {
+    const futureRoot = this.futureState._root;
+    const currRoot = this.currState ? this.currState._root : null;
+    this.deactivateChildRoutes(futureRoot, currRoot, parentContexts);
+    advanceActivatedRoute(this.futureState.root);
+    this.activateChildRoutes(futureRoot, currRoot, parentContexts);
+  }
+  // De-activate the child route that are not re-used for the future state
+  deactivateChildRoutes(futureNode, currNode, contexts) {
+    const children = nodeChildrenAsMap(currNode);
+    futureNode.children.forEach((futureChild) => {
+      const childOutletName = futureChild.value.outlet;
+      this.deactivateRoutes(futureChild, children[childOutletName], contexts);
+      delete children[childOutletName];
+    });
+    Object.values(children).forEach((v) => {
+      this.deactivateRouteAndItsChildren(v, contexts);
+    });
+  }
+  deactivateRoutes(futureNode, currNode, parentContext) {
+    const future = futureNode.value;
+    const curr = currNode ? currNode.value : null;
+    if (future === curr) {
+      if (future.component) {
+        const context = parentContext.getContext(future.outlet);
+        if (context) {
+          this.deactivateChildRoutes(futureNode, currNode, context.children);
+        }
+      } else {
+        this.deactivateChildRoutes(futureNode, currNode, parentContext);
+      }
+    } else {
+      if (curr) {
+        this.deactivateRouteAndItsChildren(currNode, parentContext);
+      }
+    }
+  }
+  deactivateRouteAndItsChildren(route, parentContexts) {
+    if (route.value.component && this.routeReuseStrategy.shouldDetach(route.value.snapshot)) {
+      this.detachAndStoreRouteSubtree(route, parentContexts);
+    } else {
+      this.deactivateRouteAndOutlet(route, parentContexts);
+    }
+  }
+  detachAndStoreRouteSubtree(route, parentContexts) {
+    const context = parentContexts.getContext(route.value.outlet);
+    const contexts = context && route.value.component ? context.children : parentContexts;
+    const children = nodeChildrenAsMap(route);
+    for (const treeNode of Object.values(children)) {
+      this.deactivateRouteAndItsChildren(treeNode, contexts);
+    }
+    if (context && context.outlet) {
+      const componentRef = context.outlet.detach();
+      const contexts2 = context.children.onOutletDeactivated();
+      this.routeReuseStrategy.store(route.value.snapshot, {
+        componentRef,
+        route,
+        contexts: contexts2
+      });
+    }
+  }
+  deactivateRouteAndOutlet(route, parentContexts) {
+    const context = parentContexts.getContext(route.value.outlet);
+    const contexts = context && route.value.component ? context.children : parentContexts;
+    const children = nodeChildrenAsMap(route);
+    for (const treeNode of Object.values(children)) {
+      this.deactivateRouteAndItsChildren(treeNode, contexts);
+    }
+    if (context) {
+      if (context.outlet) {
+        context.outlet.deactivate();
+        context.children.onOutletDeactivated();
+      }
+      context.attachRef = null;
+      context.route = null;
+    }
+  }
+  activateChildRoutes(futureNode, currNode, contexts) {
+    const children = nodeChildrenAsMap(currNode);
+    futureNode.children.forEach((c) => {
+      this.activateRoutes(c, children[c.value.outlet], contexts);
+      this.forwardEvent(new ActivationEnd(c.value.snapshot));
+    });
+    if (futureNode.children.length) {
+      this.forwardEvent(new ChildActivationEnd(futureNode.value.snapshot));
+    }
+  }
+  activateRoutes(futureNode, currNode, parentContexts) {
+    const future = futureNode.value;
+    const curr = currNode ? currNode.value : null;
+    advanceActivatedRoute(future);
+    if (future === curr) {
+      if (future.component) {
+        const context = parentContexts.getOrCreateContext(future.outlet);
+        this.activateChildRoutes(futureNode, currNode, context.children);
+      } else {
+        this.activateChildRoutes(futureNode, currNode, parentContexts);
+      }
+    } else {
+      if (future.component) {
+        const context = parentContexts.getOrCreateContext(future.outlet);
+        if (this.routeReuseStrategy.shouldAttach(future.snapshot)) {
+          const stored = this.routeReuseStrategy.retrieve(future.snapshot);
+          this.routeReuseStrategy.store(future.snapshot, null);
+          context.children.onOutletReAttached(stored.contexts);
+          context.attachRef = stored.componentRef;
+          context.route = stored.route.value;
+          if (context.outlet) {
+            context.outlet.attach(stored.componentRef, stored.route.value);
+          }
+          advanceActivatedRoute(stored.route.value);
+          this.activateChildRoutes(futureNode, null, context.children);
+        } else {
+          context.attachRef = null;
+          context.route = future;
+          if (context.outlet) {
+            context.outlet.activateWith(future, context.injector);
+          }
+          this.activateChildRoutes(futureNode, null, context.children);
+        }
+      } else {
+        this.activateChildRoutes(futureNode, null, parentContexts);
+      }
+    }
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      const context = parentContexts.getOrCreateContext(future.outlet);
+      const outlet = context.outlet;
+      if (outlet && this.inputBindingEnabled && !outlet.supportsBindingToComponentInputs && !warnedAboutUnsupportedInputBinding) {
+        console.warn(`'withComponentInputBinding' feature is enabled but this application is using an outlet that may not support binding to component inputs.`);
+        warnedAboutUnsupportedInputBinding = true;
+      }
+    }
+  }
+};
+var CanActivate = class {
+  path;
+  route;
+  constructor(path) {
+    this.path = path;
+    this.route = this.path[this.path.length - 1];
+  }
+};
+var CanDeactivate = class {
+  component;
+  route;
+  constructor(component, route) {
+    this.component = component;
+    this.route = route;
+  }
+};
+function getAllRouteGuards(future, curr, parentContexts) {
+  const futureRoot = future._root;
+  const currRoot = curr ? curr._root : null;
+  return getChildRouteGuards(futureRoot, currRoot, parentContexts, [futureRoot.value]);
+}
+function getCanActivateChild(p) {
+  const canActivateChild = p.routeConfig ? p.routeConfig.canActivateChild : null;
+  if (!canActivateChild || canActivateChild.length === 0) return null;
+  return {
+    node: p,
+    guards: canActivateChild
+  };
+}
+function getTokenOrFunctionIdentity(tokenOrFunction, injector) {
+  const NOT_FOUND = Symbol();
+  const result = injector.get(tokenOrFunction, NOT_FOUND);
+  if (result === NOT_FOUND) {
+    if (typeof tokenOrFunction === "function" && !isInjectable(tokenOrFunction)) {
+      return tokenOrFunction;
+    } else {
+      return injector.get(tokenOrFunction);
+    }
+  }
+  return result;
+}
+function getChildRouteGuards(futureNode, currNode, contexts, futurePath, checks = {
+  canDeactivateChecks: [],
+  canActivateChecks: []
+}) {
+  const prevChildren = nodeChildrenAsMap(currNode);
+  futureNode.children.forEach((c) => {
+    getRouteGuards(c, prevChildren[c.value.outlet], contexts, futurePath.concat([c.value]), checks);
+    delete prevChildren[c.value.outlet];
+  });
+  Object.entries(prevChildren).forEach(([k, v]) => deactivateRouteAndItsChildren(v, contexts.getContext(k), checks));
+  return checks;
+}
+function getRouteGuards(futureNode, currNode, parentContexts, futurePath, checks = {
+  canDeactivateChecks: [],
+  canActivateChecks: []
+}) {
+  const future = futureNode.value;
+  const curr = currNode ? currNode.value : null;
+  const context = parentContexts ? parentContexts.getContext(futureNode.value.outlet) : null;
+  if (curr && future.routeConfig === curr.routeConfig) {
+    const shouldRun = shouldRunGuardsAndResolvers(curr, future, future.routeConfig.runGuardsAndResolvers);
+    if (shouldRun) {
+      checks.canActivateChecks.push(new CanActivate(futurePath));
+    } else {
+      future.data = curr.data;
+      future._resolvedData = curr._resolvedData;
+    }
+    if (future.component) {
+      getChildRouteGuards(futureNode, currNode, context ? context.children : null, futurePath, checks);
+    } else {
+      getChildRouteGuards(futureNode, currNode, parentContexts, futurePath, checks);
+    }
+    if (shouldRun && context && context.outlet && context.outlet.isActivated) {
+      checks.canDeactivateChecks.push(new CanDeactivate(context.outlet.component, curr));
+    }
+  } else {
+    if (curr) {
+      deactivateRouteAndItsChildren(currNode, context, checks);
+    }
+    checks.canActivateChecks.push(new CanActivate(futurePath));
+    if (future.component) {
+      getChildRouteGuards(futureNode, null, context ? context.children : null, futurePath, checks);
+    } else {
+      getChildRouteGuards(futureNode, null, parentContexts, futurePath, checks);
+    }
+  }
+  return checks;
+}
+function shouldRunGuardsAndResolvers(curr, future, mode) {
+  if (typeof mode === "function") {
+    return mode(curr, future);
+  }
+  switch (mode) {
+    case "pathParamsChange":
+      return !equalPath(curr.url, future.url);
+    case "pathParamsOrQueryParamsChange":
+      return !equalPath(curr.url, future.url) || !shallowEqual(curr.queryParams, future.queryParams);
+    case "always":
+      return true;
+    case "paramsOrQueryParamsChange":
+      return !equalParamsAndUrlSegments(curr, future) || !shallowEqual(curr.queryParams, future.queryParams);
+    case "paramsChange":
+    default:
+      return !equalParamsAndUrlSegments(curr, future);
+  }
+}
+function deactivateRouteAndItsChildren(route, context, checks) {
+  const children = nodeChildrenAsMap(route);
+  const r = route.value;
+  Object.entries(children).forEach(([childName, node]) => {
+    if (!r.component) {
+      deactivateRouteAndItsChildren(node, context, checks);
+    } else if (context) {
+      deactivateRouteAndItsChildren(node, context.children.getContext(childName), checks);
+    } else {
+      deactivateRouteAndItsChildren(node, null, checks);
+    }
+  });
+  if (!r.component) {
+    checks.canDeactivateChecks.push(new CanDeactivate(null, r));
+  } else if (context && context.outlet && context.outlet.isActivated) {
+    checks.canDeactivateChecks.push(new CanDeactivate(context.outlet.component, r));
+  } else {
+    checks.canDeactivateChecks.push(new CanDeactivate(null, r));
+  }
+}
+function isFunction(v) {
+  return typeof v === "function";
+}
+function isBoolean(v) {
+  return typeof v === "boolean";
+}
+function isCanLoad(guard) {
+  return guard && isFunction(guard.canLoad);
+}
+function isCanActivate(guard) {
+  return guard && isFunction(guard.canActivate);
+}
+function isCanActivateChild(guard) {
+  return guard && isFunction(guard.canActivateChild);
+}
+function isCanDeactivate(guard) {
+  return guard && isFunction(guard.canDeactivate);
+}
+function isCanMatch(guard) {
+  return guard && isFunction(guard.canMatch);
+}
+function isEmptyError(e) {
+  return e instanceof EmptyError || e?.name === "EmptyError";
+}
+var INITIAL_VALUE = Symbol("INITIAL_VALUE");
+function prioritizedGuardValue() {
+  return switchMap((obs) => {
+    return combineLatest(obs.map((o) => o.pipe(take(1), startWith(INITIAL_VALUE)))).pipe(map((results) => {
+      for (const result of results) {
+        if (result === true) {
+          continue;
+        } else if (result === INITIAL_VALUE) {
+          return INITIAL_VALUE;
+        } else if (result === false || isRedirect(result)) {
+          return result;
+        }
+      }
+      return true;
+    }), filter((item) => item !== INITIAL_VALUE), take(1));
+  });
+}
+function isRedirect(val) {
+  return isUrlTree(val) || val instanceof RedirectCommand;
+}
+function checkGuards(injector, forwardEvent) {
+  return mergeMap((t) => {
+    const {
+      targetSnapshot,
+      currentSnapshot,
+      guards: {
+        canActivateChecks,
+        canDeactivateChecks
+      }
+    } = t;
+    if (canDeactivateChecks.length === 0 && canActivateChecks.length === 0) {
+      return of(__spreadProps(__spreadValues({}, t), {
+        guardsResult: true
+      }));
+    }
+    return runCanDeactivateChecks(canDeactivateChecks, targetSnapshot, currentSnapshot, injector).pipe(mergeMap((canDeactivate) => {
+      return canDeactivate && isBoolean(canDeactivate) ? runCanActivateChecks(targetSnapshot, canActivateChecks, injector, forwardEvent) : of(canDeactivate);
+    }), map((guardsResult) => __spreadProps(__spreadValues({}, t), {
+      guardsResult
+    })));
+  });
+}
+function runCanDeactivateChecks(checks, futureRSS, currRSS, injector) {
+  return from(checks).pipe(mergeMap((check) => runCanDeactivate(check.component, check.route, currRSS, futureRSS, injector)), first((result) => {
+    return result !== true;
+  }, true));
+}
+function runCanActivateChecks(futureSnapshot, checks, injector, forwardEvent) {
+  return from(checks).pipe(concatMap((check) => {
+    return concat(fireChildActivationStart(check.route.parent, forwardEvent), fireActivationStart(check.route, forwardEvent), runCanActivateChild(futureSnapshot, check.path, injector), runCanActivate(futureSnapshot, check.route, injector));
+  }), first((result) => {
+    return result !== true;
+  }, true));
+}
+function fireActivationStart(snapshot, forwardEvent) {
+  if (snapshot !== null && forwardEvent) {
+    forwardEvent(new ActivationStart(snapshot));
+  }
+  return of(true);
+}
+function fireChildActivationStart(snapshot, forwardEvent) {
+  if (snapshot !== null && forwardEvent) {
+    forwardEvent(new ChildActivationStart(snapshot));
+  }
+  return of(true);
+}
+function runCanActivate(futureRSS, futureARS, injector) {
+  const canActivate = futureARS.routeConfig ? futureARS.routeConfig.canActivate : null;
+  if (!canActivate || canActivate.length === 0) return of(true);
+  const canActivateObservables = canActivate.map((canActivate2) => {
+    return defer(() => {
+      const closestInjector = getClosestRouteInjector(futureARS) ?? injector;
+      const guard = getTokenOrFunctionIdentity(canActivate2, closestInjector);
+      const guardVal = isCanActivate(guard) ? guard.canActivate(futureARS, futureRSS) : runInInjectionContext(closestInjector, () => guard(futureARS, futureRSS));
+      return wrapIntoObservable(guardVal).pipe(first());
+    });
+  });
+  return of(canActivateObservables).pipe(prioritizedGuardValue());
+}
+function runCanActivateChild(futureRSS, path, injector) {
+  const futureARS = path[path.length - 1];
+  const canActivateChildGuards = path.slice(0, path.length - 1).reverse().map((p) => getCanActivateChild(p)).filter((_) => _ !== null);
+  const canActivateChildGuardsMapped = canActivateChildGuards.map((d) => {
+    return defer(() => {
+      const guardsMapped = d.guards.map((canActivateChild) => {
+        const closestInjector = getClosestRouteInjector(d.node) ?? injector;
+        const guard = getTokenOrFunctionIdentity(canActivateChild, closestInjector);
+        const guardVal = isCanActivateChild(guard) ? guard.canActivateChild(futureARS, futureRSS) : runInInjectionContext(closestInjector, () => guard(futureARS, futureRSS));
+        return wrapIntoObservable(guardVal).pipe(first());
+      });
+      return of(guardsMapped).pipe(prioritizedGuardValue());
+    });
+  });
+  return of(canActivateChildGuardsMapped).pipe(prioritizedGuardValue());
+}
+function runCanDeactivate(component, currARS, currRSS, futureRSS, injector) {
+  const canDeactivate = currARS && currARS.routeConfig ? currARS.routeConfig.canDeactivate : null;
+  if (!canDeactivate || canDeactivate.length === 0) return of(true);
+  const canDeactivateObservables = canDeactivate.map((c) => {
+    const closestInjector = getClosestRouteInjector(currARS) ?? injector;
+    const guard = getTokenOrFunctionIdentity(c, closestInjector);
+    const guardVal = isCanDeactivate(guard) ? guard.canDeactivate(component, currARS, currRSS, futureRSS) : runInInjectionContext(closestInjector, () => guard(component, currARS, currRSS, futureRSS));
+    return wrapIntoObservable(guardVal).pipe(first());
+  });
+  return of(canDeactivateObservables).pipe(prioritizedGuardValue());
+}
+function runCanLoadGuards(injector, route, segments, urlSerializer) {
+  const canLoad = route.canLoad;
+  if (canLoad === void 0 || canLoad.length === 0) {
+    return of(true);
+  }
+  const canLoadObservables = canLoad.map((injectionToken) => {
+    const guard = getTokenOrFunctionIdentity(injectionToken, injector);
+    const guardVal = isCanLoad(guard) ? guard.canLoad(route, segments) : runInInjectionContext(injector, () => guard(route, segments));
+    return wrapIntoObservable(guardVal);
+  });
+  return of(canLoadObservables).pipe(prioritizedGuardValue(), redirectIfUrlTree(urlSerializer));
+}
+function redirectIfUrlTree(urlSerializer) {
+  return pipe(tap((result) => {
+    if (typeof result === "boolean") return;
+    throw redirectingNavigationError(urlSerializer, result);
+  }), map((result) => result === true));
+}
+function runCanMatchGuards(injector, route, segments, urlSerializer) {
+  const canMatch = route.canMatch;
+  if (!canMatch || canMatch.length === 0) return of(true);
+  const canMatchObservables = canMatch.map((injectionToken) => {
+    const guard = getTokenOrFunctionIdentity(injectionToken, injector);
+    const guardVal = isCanMatch(guard) ? guard.canMatch(route, segments) : runInInjectionContext(injector, () => guard(route, segments));
+    return wrapIntoObservable(guardVal);
+  });
+  return of(canMatchObservables).pipe(prioritizedGuardValue(), redirectIfUrlTree(urlSerializer));
+}
+var NoMatch = class {
+  segmentGroup;
+  constructor(segmentGroup) {
+    this.segmentGroup = segmentGroup || null;
+  }
+};
+var AbsoluteRedirect = class extends Error {
+  urlTree;
+  constructor(urlTree) {
+    super();
+    this.urlTree = urlTree;
+  }
+};
+function noMatch$1(segmentGroup) {
+  return throwError(new NoMatch(segmentGroup));
+}
+function namedOutletsRedirect(redirectTo) {
+  return throwError(new RuntimeError(4e3, (typeof ngDevMode === "undefined" || ngDevMode) && `Only absolute redirects can have named outlets. redirectTo: '${redirectTo}'`));
+}
+function canLoadFails(route) {
+  return throwError(navigationCancelingError((typeof ngDevMode === "undefined" || ngDevMode) && `Cannot load children because the guard of the route "path: '${route.path}'" returned false`, NavigationCancellationCode.GuardRejected));
+}
+var ApplyRedirects = class {
+  urlSerializer;
+  urlTree;
+  constructor(urlSerializer, urlTree) {
+    this.urlSerializer = urlSerializer;
+    this.urlTree = urlTree;
+  }
+  lineralizeSegments(route, urlTree) {
+    let res = [];
+    let c = urlTree.root;
+    while (true) {
+      res = res.concat(c.segments);
+      if (c.numberOfChildren === 0) {
+        return of(res);
+      }
+      if (c.numberOfChildren > 1 || !c.children[PRIMARY_OUTLET]) {
+        return namedOutletsRedirect(`${route.redirectTo}`);
+      }
+      c = c.children[PRIMARY_OUTLET];
+    }
+  }
+  applyRedirectCommands(segments, redirectTo, posParams, currentSnapshot, injector) {
+    return getRedirectResult(redirectTo, currentSnapshot, injector).pipe(map((redirect) => {
+      if (redirect instanceof UrlTree) {
+        throw new AbsoluteRedirect(redirect);
+      }
+      const newTree = this.applyRedirectCreateUrlTree(redirect, this.urlSerializer.parse(redirect), segments, posParams);
+      if (redirect[0] === "/") {
+        throw new AbsoluteRedirect(newTree);
+      }
+      return newTree;
+    }));
+  }
+  applyRedirectCreateUrlTree(redirectTo, urlTree, segments, posParams) {
+    const newRoot = this.createSegmentGroup(redirectTo, urlTree.root, segments, posParams);
+    return new UrlTree(newRoot, this.createQueryParams(urlTree.queryParams, this.urlTree.queryParams), urlTree.fragment);
+  }
+  createQueryParams(redirectToParams, actualParams) {
+    const res = {};
+    Object.entries(redirectToParams).forEach(([k, v]) => {
+      const copySourceValue = typeof v === "string" && v[0] === ":";
+      if (copySourceValue) {
+        const sourceName = v.substring(1);
+        res[k] = actualParams[sourceName];
+      } else {
+        res[k] = v;
+      }
+    });
+    return res;
+  }
+  createSegmentGroup(redirectTo, group, segments, posParams) {
+    const updatedSegments = this.createSegments(redirectTo, group.segments, segments, posParams);
+    let children = {};
+    Object.entries(group.children).forEach(([name, child]) => {
+      children[name] = this.createSegmentGroup(redirectTo, child, segments, posParams);
+    });
+    return new UrlSegmentGroup(updatedSegments, children);
+  }
+  createSegments(redirectTo, redirectToSegments, actualSegments, posParams) {
+    return redirectToSegments.map((s) => s.path[0] === ":" ? this.findPosParam(redirectTo, s, posParams) : this.findOrReturn(s, actualSegments));
+  }
+  findPosParam(redirectTo, redirectToUrlSegment, posParams) {
+    const pos = posParams[redirectToUrlSegment.path.substring(1)];
+    if (!pos) throw new RuntimeError(4001, (typeof ngDevMode === "undefined" || ngDevMode) && `Cannot redirect to '${redirectTo}'. Cannot find '${redirectToUrlSegment.path}'.`);
+    return pos;
+  }
+  findOrReturn(redirectToUrlSegment, actualSegments) {
+    let idx = 0;
+    for (const s of actualSegments) {
+      if (s.path === redirectToUrlSegment.path) {
+        actualSegments.splice(idx);
+        return s;
+      }
+      idx++;
+    }
+    return redirectToUrlSegment;
+  }
+};
+function getRedirectResult(redirectTo, currentSnapshot, injector) {
+  if (typeof redirectTo === "string") {
+    return of(redirectTo);
+  }
+  const redirectToFn = redirectTo;
+  const {
+    queryParams,
+    fragment,
+    routeConfig,
+    url,
+    outlet,
+    params,
+    data,
+    title
+  } = currentSnapshot;
+  return wrapIntoObservable(runInInjectionContext(injector, () => redirectToFn({
+    params,
+    data,
+    queryParams,
+    fragment,
+    routeConfig,
+    url,
+    outlet,
+    title
+  })));
+}
+var noMatch = {
+  matched: false,
+  consumedSegments: [],
+  remainingSegments: [],
+  parameters: {},
+  positionalParamSegments: {}
+};
+function matchWithChecks(segmentGroup, route, segments, injector, urlSerializer) {
+  const result = match(segmentGroup, route, segments);
+  if (!result.matched) {
+    return of(result);
+  }
+  injector = getOrCreateRouteInjectorIfNeeded(route, injector);
+  return runCanMatchGuards(injector, route, segments, urlSerializer).pipe(map((v) => v === true ? result : __spreadValues({}, noMatch)));
+}
+function match(segmentGroup, route, segments) {
+  if (route.path === "**") {
+    return createWildcardMatchResult(segments);
+  }
+  if (route.path === "") {
+    if (route.pathMatch === "full" && (segmentGroup.hasChildren() || segments.length > 0)) {
+      return __spreadValues({}, noMatch);
+    }
+    return {
+      matched: true,
+      consumedSegments: [],
+      remainingSegments: segments,
+      parameters: {},
+      positionalParamSegments: {}
+    };
+  }
+  const matcher = route.matcher || defaultUrlMatcher;
+  const res = matcher(segments, segmentGroup, route);
+  if (!res) return __spreadValues({}, noMatch);
+  const posParams = {};
+  Object.entries(res.posParams ?? {}).forEach(([k, v]) => {
+    posParams[k] = v.path;
+  });
+  const parameters = res.consumed.length > 0 ? __spreadValues(__spreadValues({}, posParams), res.consumed[res.consumed.length - 1].parameters) : posParams;
+  return {
+    matched: true,
+    consumedSegments: res.consumed,
+    remainingSegments: segments.slice(res.consumed.length),
+    // TODO(atscott): investigate combining parameters and positionalParamSegments
+    parameters,
+    positionalParamSegments: res.posParams ?? {}
+  };
+}
+function createWildcardMatchResult(segments) {
+  return {
+    matched: true,
+    parameters: segments.length > 0 ? last2(segments).parameters : {},
+    consumedSegments: segments,
+    remainingSegments: [],
+    positionalParamSegments: {}
+  };
+}
+function split(segmentGroup, consumedSegments, slicedSegments, config) {
+  if (slicedSegments.length > 0 && containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, config)) {
+    const s2 = new UrlSegmentGroup(consumedSegments, createChildrenForEmptyPaths(config, new UrlSegmentGroup(slicedSegments, segmentGroup.children)));
+    return {
+      segmentGroup: s2,
+      slicedSegments: []
+    };
+  }
+  if (slicedSegments.length === 0 && containsEmptyPathMatches(segmentGroup, slicedSegments, config)) {
+    const s2 = new UrlSegmentGroup(segmentGroup.segments, addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, config, segmentGroup.children));
+    return {
+      segmentGroup: s2,
+      slicedSegments
+    };
+  }
+  const s = new UrlSegmentGroup(segmentGroup.segments, segmentGroup.children);
+  return {
+    segmentGroup: s,
+    slicedSegments
+  };
+}
+function addEmptyPathsToChildrenIfNeeded(segmentGroup, slicedSegments, routes, children) {
+  const res = {};
+  for (const r of routes) {
+    if (emptyPathMatch(segmentGroup, slicedSegments, r) && !children[getOutlet(r)]) {
+      const s = new UrlSegmentGroup([], {});
+      res[getOutlet(r)] = s;
+    }
+  }
+  return __spreadValues(__spreadValues({}, children), res);
+}
+function createChildrenForEmptyPaths(routes, primarySegment) {
+  const res = {};
+  res[PRIMARY_OUTLET] = primarySegment;
+  for (const r of routes) {
+    if (r.path === "" && getOutlet(r) !== PRIMARY_OUTLET) {
+      const s = new UrlSegmentGroup([], {});
+      res[getOutlet(r)] = s;
+    }
+  }
+  return res;
+}
+function containsEmptyPathMatchesWithNamedOutlets(segmentGroup, slicedSegments, routes) {
+  return routes.some((r) => emptyPathMatch(segmentGroup, slicedSegments, r) && getOutlet(r) !== PRIMARY_OUTLET);
+}
+function containsEmptyPathMatches(segmentGroup, slicedSegments, routes) {
+  return routes.some((r) => emptyPathMatch(segmentGroup, slicedSegments, r));
+}
+function emptyPathMatch(segmentGroup, slicedSegments, r) {
+  if ((segmentGroup.hasChildren() || slicedSegments.length > 0) && r.pathMatch === "full") {
+    return false;
+  }
+  return r.path === "";
+}
+function noLeftoversInUrl(segmentGroup, segments, outlet) {
+  return segments.length === 0 && !segmentGroup.children[outlet];
+}
+var NoLeftoversInUrl = class {
+};
+function recognize$1(injector, configLoader, rootComponentType, config, urlTree, urlSerializer, paramsInheritanceStrategy = "emptyOnly") {
+  return new Recognizer(injector, configLoader, rootComponentType, config, urlTree, paramsInheritanceStrategy, urlSerializer).recognize();
+}
+var MAX_ALLOWED_REDIRECTS = 31;
+var Recognizer = class {
+  injector;
+  configLoader;
+  rootComponentType;
+  config;
+  urlTree;
+  paramsInheritanceStrategy;
+  urlSerializer;
+  applyRedirects;
+  absoluteRedirectCount = 0;
+  allowRedirects = true;
+  constructor(injector, configLoader, rootComponentType, config, urlTree, paramsInheritanceStrategy, urlSerializer) {
+    this.injector = injector;
+    this.configLoader = configLoader;
+    this.rootComponentType = rootComponentType;
+    this.config = config;
+    this.urlTree = urlTree;
+    this.paramsInheritanceStrategy = paramsInheritanceStrategy;
+    this.urlSerializer = urlSerializer;
+    this.applyRedirects = new ApplyRedirects(this.urlSerializer, this.urlTree);
+  }
+  noMatchError(e) {
+    return new RuntimeError(4002, typeof ngDevMode === "undefined" || ngDevMode ? `Cannot match any routes. URL Segment: '${e.segmentGroup}'` : `'${e.segmentGroup}'`);
+  }
+  recognize() {
+    const rootSegmentGroup = split(this.urlTree.root, [], [], this.config).segmentGroup;
+    return this.match(rootSegmentGroup).pipe(map(({
+      children,
+      rootSnapshot
+    }) => {
+      const rootNode = new TreeNode(rootSnapshot, children);
+      const routeState = new RouterStateSnapshot("", rootNode);
+      const tree2 = createUrlTreeFromSnapshot(rootSnapshot, [], this.urlTree.queryParams, this.urlTree.fragment);
+      tree2.queryParams = this.urlTree.queryParams;
+      routeState.url = this.urlSerializer.serialize(tree2);
+      return {
+        state: routeState,
+        tree: tree2
+      };
+    }));
+  }
+  match(rootSegmentGroup) {
+    const rootSnapshot = new ActivatedRouteSnapshot([], Object.freeze({}), Object.freeze(__spreadValues({}, this.urlTree.queryParams)), this.urlTree.fragment, Object.freeze({}), PRIMARY_OUTLET, this.rootComponentType, null, {});
+    return this.processSegmentGroup(this.injector, this.config, rootSegmentGroup, PRIMARY_OUTLET, rootSnapshot).pipe(map((children) => {
+      return {
+        children,
+        rootSnapshot
+      };
+    }), catchError((e) => {
+      if (e instanceof AbsoluteRedirect) {
+        this.urlTree = e.urlTree;
+        return this.match(e.urlTree.root);
+      }
+      if (e instanceof NoMatch) {
+        throw this.noMatchError(e);
+      }
+      throw e;
+    }));
+  }
+  processSegmentGroup(injector, config, segmentGroup, outlet, parentRoute) {
+    if (segmentGroup.segments.length === 0 && segmentGroup.hasChildren()) {
+      return this.processChildren(injector, config, segmentGroup, parentRoute);
+    }
+    return this.processSegment(injector, config, segmentGroup, segmentGroup.segments, outlet, true, parentRoute).pipe(map((child) => child instanceof TreeNode ? [child] : []));
+  }
+  /**
+   * Matches every child outlet in the `segmentGroup` to a `Route` in the config. Returns `null` if
+   * we cannot find a match for _any_ of the children.
+   *
+   * @param config - The `Routes` to match against
+   * @param segmentGroup - The `UrlSegmentGroup` whose children need to be matched against the
+   *     config.
+   */
+  processChildren(injector, config, segmentGroup, parentRoute) {
+    const childOutlets = [];
+    for (const child of Object.keys(segmentGroup.children)) {
+      if (child === "primary") {
+        childOutlets.unshift(child);
+      } else {
+        childOutlets.push(child);
+      }
+    }
+    return from(childOutlets).pipe(concatMap((childOutlet) => {
+      const child = segmentGroup.children[childOutlet];
+      const sortedConfig = sortByMatchingOutlets(config, childOutlet);
+      return this.processSegmentGroup(injector, sortedConfig, child, childOutlet, parentRoute);
+    }), scan((children, outletChildren) => {
+      children.push(...outletChildren);
+      return children;
+    }), defaultIfEmpty(null), last(), mergeMap((children) => {
+      if (children === null) return noMatch$1(segmentGroup);
+      const mergedChildren = mergeEmptyPathMatches(children);
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        checkOutletNameUniqueness(mergedChildren);
+      }
+      sortActivatedRouteSnapshots(mergedChildren);
+      return of(mergedChildren);
+    }));
+  }
+  processSegment(injector, routes, segmentGroup, segments, outlet, allowRedirects, parentRoute) {
+    return from(routes).pipe(concatMap((r) => {
+      return this.processSegmentAgainstRoute(r._injector ?? injector, routes, r, segmentGroup, segments, outlet, allowRedirects, parentRoute).pipe(catchError((e) => {
+        if (e instanceof NoMatch) {
+          return of(null);
+        }
+        throw e;
+      }));
+    }), first((x) => !!x), catchError((e) => {
+      if (isEmptyError(e)) {
+        if (noLeftoversInUrl(segmentGroup, segments, outlet)) {
+          return of(new NoLeftoversInUrl());
+        }
+        return noMatch$1(segmentGroup);
+      }
+      throw e;
+    }));
+  }
+  processSegmentAgainstRoute(injector, routes, route, rawSegment, segments, outlet, allowRedirects, parentRoute) {
+    if (getOutlet(route) !== outlet && (outlet === PRIMARY_OUTLET || !emptyPathMatch(rawSegment, segments, route))) {
+      return noMatch$1(rawSegment);
+    }
+    if (route.redirectTo === void 0) {
+      return this.matchSegmentAgainstRoute(injector, rawSegment, route, segments, outlet, parentRoute);
+    }
+    if (this.allowRedirects && allowRedirects) {
+      return this.expandSegmentAgainstRouteUsingRedirect(injector, rawSegment, routes, route, segments, outlet, parentRoute);
+    }
+    return noMatch$1(rawSegment);
+  }
+  expandSegmentAgainstRouteUsingRedirect(injector, segmentGroup, routes, route, segments, outlet, parentRoute) {
+    const {
+      matched,
+      parameters,
+      consumedSegments,
+      positionalParamSegments,
+      remainingSegments
+    } = match(segmentGroup, route, segments);
+    if (!matched) return noMatch$1(segmentGroup);
+    if (typeof route.redirectTo === "string" && route.redirectTo[0] === "/") {
+      this.absoluteRedirectCount++;
+      if (this.absoluteRedirectCount > MAX_ALLOWED_REDIRECTS) {
+        if (ngDevMode) {
+          throw new RuntimeError(4016, `Detected possible infinite redirect when redirecting from '${this.urlTree}' to '${route.redirectTo}'.
+This is currently a dev mode only error but will become a call stack size exceeded error in production in a future major version.`);
+        }
+        this.allowRedirects = false;
+      }
+    }
+    const currentSnapshot = new ActivatedRouteSnapshot(segments, parameters, Object.freeze(__spreadValues({}, this.urlTree.queryParams)), this.urlTree.fragment, getData(route), getOutlet(route), route.component ?? route._loadedComponent ?? null, route, getResolve(route));
+    const inherited = getInherited(currentSnapshot, parentRoute, this.paramsInheritanceStrategy);
+    currentSnapshot.params = Object.freeze(inherited.params);
+    currentSnapshot.data = Object.freeze(inherited.data);
+    const newTree$ = this.applyRedirects.applyRedirectCommands(consumedSegments, route.redirectTo, positionalParamSegments, currentSnapshot, injector);
+    return newTree$.pipe(switchMap((newTree) => this.applyRedirects.lineralizeSegments(route, newTree)), mergeMap((newSegments) => {
+      return this.processSegment(injector, routes, segmentGroup, newSegments.concat(remainingSegments), outlet, false, parentRoute);
+    }));
+  }
+  matchSegmentAgainstRoute(injector, rawSegment, route, segments, outlet, parentRoute) {
+    const matchResult = matchWithChecks(rawSegment, route, segments, injector, this.urlSerializer);
+    if (route.path === "**") {
+      rawSegment.children = {};
+    }
+    return matchResult.pipe(switchMap((result) => {
+      if (!result.matched) {
+        return noMatch$1(rawSegment);
+      }
+      injector = route._injector ?? injector;
+      return this.getChildConfig(injector, route, segments).pipe(switchMap(({
+        routes: childConfig
+      }) => {
+        const childInjector = route._loadedInjector ?? injector;
+        const {
+          parameters,
+          consumedSegments,
+          remainingSegments
+        } = result;
+        const snapshot = new ActivatedRouteSnapshot(consumedSegments, parameters, Object.freeze(__spreadValues({}, this.urlTree.queryParams)), this.urlTree.fragment, getData(route), getOutlet(route), route.component ?? route._loadedComponent ?? null, route, getResolve(route));
+        const inherited = getInherited(snapshot, parentRoute, this.paramsInheritanceStrategy);
+        snapshot.params = Object.freeze(inherited.params);
+        snapshot.data = Object.freeze(inherited.data);
+        const {
+          segmentGroup,
+          slicedSegments
+        } = split(rawSegment, consumedSegments, remainingSegments, childConfig);
+        if (slicedSegments.length === 0 && segmentGroup.hasChildren()) {
+          return this.processChildren(childInjector, childConfig, segmentGroup, snapshot).pipe(map((children) => {
+            return new TreeNode(snapshot, children);
+          }));
+        }
+        if (childConfig.length === 0 && slicedSegments.length === 0) {
+          return of(new TreeNode(snapshot, []));
+        }
+        const matchedOnOutlet = getOutlet(route) === outlet;
+        return this.processSegment(childInjector, childConfig, segmentGroup, slicedSegments, matchedOnOutlet ? PRIMARY_OUTLET : outlet, true, snapshot).pipe(map((child) => {
+          return new TreeNode(snapshot, child instanceof TreeNode ? [child] : []);
+        }));
+      }));
+    }));
+  }
+  getChildConfig(injector, route, segments) {
+    if (route.children) {
+      return of({
+        routes: route.children,
+        injector
+      });
+    }
+    if (route.loadChildren) {
+      if (route._loadedRoutes !== void 0) {
+        return of({
+          routes: route._loadedRoutes,
+          injector: route._loadedInjector
+        });
+      }
+      return runCanLoadGuards(injector, route, segments, this.urlSerializer).pipe(mergeMap((shouldLoadResult) => {
+        if (shouldLoadResult) {
+          return this.configLoader.loadChildren(injector, route).pipe(tap((cfg) => {
+            route._loadedRoutes = cfg.routes;
+            route._loadedInjector = cfg.injector;
+          }));
+        }
+        return canLoadFails(route);
+      }));
+    }
+    return of({
+      routes: [],
+      injector
+    });
+  }
+};
+function sortActivatedRouteSnapshots(nodes) {
+  nodes.sort((a, b) => {
+    if (a.value.outlet === PRIMARY_OUTLET) return -1;
+    if (b.value.outlet === PRIMARY_OUTLET) return 1;
+    return a.value.outlet.localeCompare(b.value.outlet);
+  });
+}
+function hasEmptyPathConfig(node) {
+  const config = node.value.routeConfig;
+  return config && config.path === "";
+}
+function mergeEmptyPathMatches(nodes) {
+  const result = [];
+  const mergedNodes = /* @__PURE__ */ new Set();
+  for (const node of nodes) {
+    if (!hasEmptyPathConfig(node)) {
+      result.push(node);
+      continue;
+    }
+    const duplicateEmptyPathNode = result.find((resultNode) => node.value.routeConfig === resultNode.value.routeConfig);
+    if (duplicateEmptyPathNode !== void 0) {
+      duplicateEmptyPathNode.children.push(...node.children);
+      mergedNodes.add(duplicateEmptyPathNode);
+    } else {
+      result.push(node);
+    }
+  }
+  for (const mergedNode of mergedNodes) {
+    const mergedChildren = mergeEmptyPathMatches(mergedNode.children);
+    result.push(new TreeNode(mergedNode.value, mergedChildren));
+  }
+  return result.filter((n) => !mergedNodes.has(n));
+}
+function checkOutletNameUniqueness(nodes) {
+  const names = {};
+  nodes.forEach((n) => {
+    const routeWithSameOutletName = names[n.value.outlet];
+    if (routeWithSameOutletName) {
+      const p = routeWithSameOutletName.url.map((s) => s.toString()).join("/");
+      const c = n.value.url.map((s) => s.toString()).join("/");
+      throw new RuntimeError(4006, (typeof ngDevMode === "undefined" || ngDevMode) && `Two segments cannot have the same outlet name: '${p}' and '${c}'.`);
+    }
+    names[n.value.outlet] = n.value;
+  });
+}
+function getData(route) {
+  return route.data || {};
+}
+function getResolve(route) {
+  return route.resolve || {};
+}
+function recognize(injector, configLoader, rootComponentType, config, serializer, paramsInheritanceStrategy) {
+  return mergeMap((t) => recognize$1(injector, configLoader, rootComponentType, config, t.extractedUrl, serializer, paramsInheritanceStrategy).pipe(map(({
+    state: targetSnapshot,
+    tree: urlAfterRedirects
+  }) => {
+    return __spreadProps(__spreadValues({}, t), {
+      targetSnapshot,
+      urlAfterRedirects
+    });
+  })));
+}
+function resolveData(paramsInheritanceStrategy, injector) {
+  return mergeMap((t) => {
+    const {
+      targetSnapshot,
+      guards: {
+        canActivateChecks
+      }
+    } = t;
+    if (!canActivateChecks.length) {
+      return of(t);
+    }
+    const routesWithResolversToRun = new Set(canActivateChecks.map((check) => check.route));
+    const routesNeedingDataUpdates = /* @__PURE__ */ new Set();
+    for (const route of routesWithResolversToRun) {
+      if (routesNeedingDataUpdates.has(route)) {
+        continue;
+      }
+      for (const newRoute of flattenRouteTree(route)) {
+        routesNeedingDataUpdates.add(newRoute);
+      }
+    }
+    let routesProcessed = 0;
+    return from(routesNeedingDataUpdates).pipe(concatMap((route) => {
+      if (routesWithResolversToRun.has(route)) {
+        return runResolve(route, targetSnapshot, paramsInheritanceStrategy, injector);
+      } else {
+        route.data = getInherited(route, route.parent, paramsInheritanceStrategy).resolve;
+        return of(void 0);
+      }
+    }), tap(() => routesProcessed++), takeLast(1), mergeMap((_) => routesProcessed === routesNeedingDataUpdates.size ? of(t) : EMPTY));
+  });
+}
+function flattenRouteTree(route) {
+  const descendants = route.children.map((child) => flattenRouteTree(child)).flat();
+  return [route, ...descendants];
+}
+function runResolve(futureARS, futureRSS, paramsInheritanceStrategy, injector) {
+  const config = futureARS.routeConfig;
+  const resolve = futureARS._resolve;
+  if (config?.title !== void 0 && !hasStaticTitle(config)) {
+    resolve[RouteTitleKey] = config.title;
+  }
+  return defer(() => {
+    futureARS.data = getInherited(futureARS, futureARS.parent, paramsInheritanceStrategy).resolve;
+    return resolveNode(resolve, futureARS, futureRSS, injector).pipe(map((resolvedData) => {
+      futureARS._resolvedData = resolvedData;
+      futureARS.data = __spreadValues(__spreadValues({}, futureARS.data), resolvedData);
+      return null;
+    }));
+  });
+}
+function resolveNode(resolve, futureARS, futureRSS, injector) {
+  const keys = getDataKeys(resolve);
+  if (keys.length === 0) {
+    return of({});
+  }
+  const data = {};
+  return from(keys).pipe(mergeMap((key) => getResolver(resolve[key], futureARS, futureRSS, injector).pipe(first(), tap((value) => {
+    if (value instanceof RedirectCommand) {
+      throw redirectingNavigationError(new DefaultUrlSerializer(), value);
+    }
+    data[key] = value;
+  }))), takeLast(1), map(() => data), catchError((e) => isEmptyError(e) ? EMPTY : throwError(e)));
+}
+function getResolver(injectionToken, futureARS, futureRSS, injector) {
+  const closestInjector = getClosestRouteInjector(futureARS) ?? injector;
+  const resolver = getTokenOrFunctionIdentity(injectionToken, closestInjector);
+  const resolverValue = resolver.resolve ? resolver.resolve(futureARS, futureRSS) : runInInjectionContext(closestInjector, () => resolver(futureARS, futureRSS));
+  return wrapIntoObservable(resolverValue);
+}
+function switchTap(next) {
+  return switchMap((v) => {
+    const nextResult = next(v);
+    if (nextResult) {
+      return from(nextResult).pipe(map(() => v));
+    }
+    return of(v);
+  });
+}
+var TitleStrategy = class _TitleStrategy {
+  /**
+   * @returns The `title` of the deepest primary route.
+   */
+  buildTitle(snapshot) {
+    let pageTitle;
+    let route = snapshot.root;
+    while (route !== void 0) {
+      pageTitle = this.getResolvedTitleForRoute(route) ?? pageTitle;
+      route = route.children.find((child) => child.outlet === PRIMARY_OUTLET);
+    }
+    return pageTitle;
+  }
+  /**
+   * Given an `ActivatedRouteSnapshot`, returns the final value of the
+   * `Route.title` property, which can either be a static string or a resolved value.
+   */
+  getResolvedTitleForRoute(snapshot) {
+    return snapshot.data[RouteTitleKey];
+  }
+  static ɵfac = function TitleStrategy_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _TitleStrategy)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _TitleStrategy,
+    factory: () => (() => inject(DefaultTitleStrategy))(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(TitleStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => inject(DefaultTitleStrategy)
+    }]
+  }], null, null);
+})();
+var DefaultTitleStrategy = class _DefaultTitleStrategy extends TitleStrategy {
+  title;
+  constructor(title) {
+    super();
+    this.title = title;
+  }
+  /**
+   * Sets the title of the browser to the given value.
+   *
+   * @param title The `pageTitle` from the deepest primary route.
+   */
+  updateTitle(snapshot) {
+    const title = this.buildTitle(snapshot);
+    if (title !== void 0) {
+      this.title.setTitle(title);
+    }
+  }
+  static ɵfac = function DefaultTitleStrategy_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DefaultTitleStrategy)(ɵɵinject(Title));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DefaultTitleStrategy,
+    factory: _DefaultTitleStrategy.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DefaultTitleStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: Title
+  }], null);
+})();
+var ROUTER_CONFIGURATION = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "router config" : "", {
+  providedIn: "root",
+  factory: () => ({})
+});
+var ROUTES = new InjectionToken(ngDevMode ? "ROUTES" : "");
+var RouterConfigLoader = class _RouterConfigLoader {
+  componentLoaders = /* @__PURE__ */ new WeakMap();
+  childrenLoaders = /* @__PURE__ */ new WeakMap();
+  onLoadStartListener;
+  onLoadEndListener;
+  compiler = inject(Compiler);
+  loadComponent(route) {
+    if (this.componentLoaders.get(route)) {
+      return this.componentLoaders.get(route);
+    } else if (route._loadedComponent) {
+      return of(route._loadedComponent);
+    }
+    if (this.onLoadStartListener) {
+      this.onLoadStartListener(route);
+    }
+    const loadRunner = wrapIntoObservable(route.loadComponent()).pipe(map(maybeUnwrapDefaultExport), tap((component) => {
+      if (this.onLoadEndListener) {
+        this.onLoadEndListener(route);
+      }
+      (typeof ngDevMode === "undefined" || ngDevMode) && assertStandalone(route.path ?? "", component);
+      route._loadedComponent = component;
+    }), finalize(() => {
+      this.componentLoaders.delete(route);
+    }));
+    const loader = new ConnectableObservable(loadRunner, () => new Subject()).pipe(refCount());
+    this.componentLoaders.set(route, loader);
+    return loader;
+  }
+  loadChildren(parentInjector, route) {
+    if (this.childrenLoaders.get(route)) {
+      return this.childrenLoaders.get(route);
+    } else if (route._loadedRoutes) {
+      return of({
+        routes: route._loadedRoutes,
+        injector: route._loadedInjector
+      });
+    }
+    if (this.onLoadStartListener) {
+      this.onLoadStartListener(route);
+    }
+    const moduleFactoryOrRoutes$ = loadChildren(route, this.compiler, parentInjector, this.onLoadEndListener);
+    const loadRunner = moduleFactoryOrRoutes$.pipe(finalize(() => {
+      this.childrenLoaders.delete(route);
+    }));
+    const loader = new ConnectableObservable(loadRunner, () => new Subject()).pipe(refCount());
+    this.childrenLoaders.set(route, loader);
+    return loader;
+  }
+  static ɵfac = function RouterConfigLoader_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterConfigLoader)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RouterConfigLoader,
+    factory: _RouterConfigLoader.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterConfigLoader, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+function loadChildren(route, compiler, parentInjector, onLoadEndListener) {
+  return wrapIntoObservable(route.loadChildren()).pipe(map(maybeUnwrapDefaultExport), mergeMap((t) => {
+    if (t instanceof NgModuleFactory$1 || Array.isArray(t)) {
+      return of(t);
+    } else {
+      return from(compiler.compileModuleAsync(t));
+    }
+  }), map((factoryOrRoutes) => {
+    if (onLoadEndListener) {
+      onLoadEndListener(route);
+    }
+    let injector;
+    let rawRoutes;
+    let requireStandaloneComponents = false;
+    if (Array.isArray(factoryOrRoutes)) {
+      rawRoutes = factoryOrRoutes;
+      requireStandaloneComponents = true;
+    } else {
+      injector = factoryOrRoutes.create(parentInjector).injector;
+      rawRoutes = injector.get(ROUTES, [], {
+        optional: true,
+        self: true
+      }).flat();
+    }
+    const routes = rawRoutes.map(standardizeConfig);
+    (typeof ngDevMode === "undefined" || ngDevMode) && validateConfig(routes, route.path, requireStandaloneComponents);
+    return {
+      routes,
+      injector
+    };
+  }));
+}
+function isWrappedDefaultExport(value) {
+  return value && typeof value === "object" && "default" in value;
+}
+function maybeUnwrapDefaultExport(input2) {
+  return isWrappedDefaultExport(input2) ? input2["default"] : input2;
+}
+var UrlHandlingStrategy = class _UrlHandlingStrategy {
+  static ɵfac = function UrlHandlingStrategy_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _UrlHandlingStrategy)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _UrlHandlingStrategy,
+    factory: () => (() => inject(DefaultUrlHandlingStrategy))(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(UrlHandlingStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => inject(DefaultUrlHandlingStrategy)
+    }]
+  }], null, null);
+})();
+var DefaultUrlHandlingStrategy = class _DefaultUrlHandlingStrategy {
+  shouldProcessUrl(url) {
+    return true;
+  }
+  extract(url) {
+    return url;
+  }
+  merge(newUrlPart, wholeUrl) {
+    return newUrlPart;
+  }
+  static ɵfac = function DefaultUrlHandlingStrategy_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DefaultUrlHandlingStrategy)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DefaultUrlHandlingStrategy,
+    factory: _DefaultUrlHandlingStrategy.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DefaultUrlHandlingStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var CREATE_VIEW_TRANSITION = new InjectionToken(ngDevMode ? "view transition helper" : "");
+var VIEW_TRANSITION_OPTIONS = new InjectionToken(ngDevMode ? "view transition options" : "");
+function createViewTransition(injector, from2, to) {
+  const transitionOptions = injector.get(VIEW_TRANSITION_OPTIONS);
+  const document = injector.get(DOCUMENT);
+  if (!document.startViewTransition || transitionOptions.skipNextTransition) {
+    transitionOptions.skipNextTransition = false;
+    return new Promise((resolve) => setTimeout(resolve));
+  }
+  let resolveViewTransitionStarted;
+  const viewTransitionStarted = new Promise((resolve) => {
+    resolveViewTransitionStarted = resolve;
+  });
+  const transition = document.startViewTransition(() => {
+    resolveViewTransitionStarted();
+    return createRenderPromise(injector);
+  });
+  const {
+    onViewTransitionCreated
+  } = transitionOptions;
+  if (onViewTransitionCreated) {
+    runInInjectionContext(injector, () => onViewTransitionCreated({
+      transition,
+      from: from2,
+      to
+    }));
+  }
+  return viewTransitionStarted;
+}
+function createRenderPromise(injector) {
+  return new Promise((resolve) => {
+    afterNextRender({
+      read: () => setTimeout(resolve)
+    }, {
+      injector
+    });
+  });
+}
+var NAVIGATION_ERROR_HANDLER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "navigation error handler" : "");
+var NavigationTransitions = class _NavigationTransitions {
+  currentNavigation = null;
+  currentTransition = null;
+  lastSuccessfulNavigation = null;
+  /**
+   * These events are used to communicate back to the Router about the state of the transition. The
+   * Router wants to respond to these events in various ways. Because the `NavigationTransition`
+   * class is not public, this event subject is not publicly exposed.
+   */
+  events = new Subject();
+  /**
+   * Used to abort the current transition with an error.
+   */
+  transitionAbortWithErrorSubject = new Subject();
+  configLoader = inject(RouterConfigLoader);
+  environmentInjector = inject(EnvironmentInjector);
+  destroyRef = inject(DestroyRef);
+  urlSerializer = inject(UrlSerializer);
+  rootContexts = inject(ChildrenOutletContexts);
+  location = inject(Location);
+  inputBindingEnabled = inject(INPUT_BINDER, {
+    optional: true
+  }) !== null;
+  titleStrategy = inject(TitleStrategy);
+  options = inject(ROUTER_CONFIGURATION, {
+    optional: true
+  }) || {};
+  paramsInheritanceStrategy = this.options.paramsInheritanceStrategy || "emptyOnly";
+  urlHandlingStrategy = inject(UrlHandlingStrategy);
+  createViewTransition = inject(CREATE_VIEW_TRANSITION, {
+    optional: true
+  });
+  navigationErrorHandler = inject(NAVIGATION_ERROR_HANDLER, {
+    optional: true
+  });
+  navigationId = 0;
+  get hasRequestedNavigation() {
+    return this.navigationId !== 0;
+  }
+  transitions;
+  /**
+   * Hook that enables you to pause navigation after the preactivation phase.
+   * Used by `RouterModule`.
+   *
+   * @internal
+   */
+  afterPreactivation = () => of(void 0);
+  /** @internal */
+  rootComponentType = null;
+  destroyed = false;
+  constructor() {
+    const onLoadStart = (r) => this.events.next(new RouteConfigLoadStart(r));
+    const onLoadEnd = (r) => this.events.next(new RouteConfigLoadEnd(r));
+    this.configLoader.onLoadEndListener = onLoadEnd;
+    this.configLoader.onLoadStartListener = onLoadStart;
+    this.destroyRef.onDestroy(() => {
+      this.destroyed = true;
+    });
+  }
+  complete() {
+    this.transitions?.complete();
+  }
+  handleNavigationRequest(request) {
+    const id = ++this.navigationId;
+    this.transitions?.next(__spreadProps(__spreadValues({}, request), {
+      extractedUrl: this.urlHandlingStrategy.extract(request.rawUrl),
+      targetSnapshot: null,
+      targetRouterState: null,
+      guards: {
+        canActivateChecks: [],
+        canDeactivateChecks: []
+      },
+      guardsResult: null,
+      abortController: new AbortController(),
+      id
+    }));
+  }
+  setupNavigations(router) {
+    this.transitions = new BehaviorSubject(null);
+    return this.transitions.pipe(
+      filter((t) => t !== null),
+      // Using switchMap so we cancel executing navigations when a new one comes in
+      switchMap((overallTransitionState) => {
+        let completedOrAborted = false;
+        return of(overallTransitionState).pipe(
+          switchMap((t) => {
+            if (this.navigationId > overallTransitionState.id) {
+              const cancellationReason = typeof ngDevMode === "undefined" || ngDevMode ? `Navigation ID ${overallTransitionState.id} is not equal to the current navigation id ${this.navigationId}` : "";
+              this.cancelNavigationTransition(overallTransitionState, cancellationReason, NavigationCancellationCode.SupersededByNewNavigation);
+              return EMPTY;
+            }
+            this.currentTransition = overallTransitionState;
+            this.currentNavigation = {
+              id: t.id,
+              initialUrl: t.rawUrl,
+              extractedUrl: t.extractedUrl,
+              targetBrowserUrl: typeof t.extras.browserUrl === "string" ? this.urlSerializer.parse(t.extras.browserUrl) : t.extras.browserUrl,
+              trigger: t.source,
+              extras: t.extras,
+              previousNavigation: !this.lastSuccessfulNavigation ? null : __spreadProps(__spreadValues({}, this.lastSuccessfulNavigation), {
+                previousNavigation: null
+              }),
+              abort: () => t.abortController.abort()
+            };
+            const urlTransition = !router.navigated || this.isUpdatingInternalState() || this.isUpdatedBrowserUrl();
+            const onSameUrlNavigation = t.extras.onSameUrlNavigation ?? router.onSameUrlNavigation;
+            if (!urlTransition && onSameUrlNavigation !== "reload") {
+              const reason = typeof ngDevMode === "undefined" || ngDevMode ? `Navigation to ${t.rawUrl} was ignored because it is the same as the current Router URL.` : "";
+              this.events.next(new NavigationSkipped(t.id, this.urlSerializer.serialize(t.rawUrl), reason, NavigationSkippedCode.IgnoredSameUrlNavigation));
+              t.resolve(false);
+              return EMPTY;
+            }
+            if (this.urlHandlingStrategy.shouldProcessUrl(t.rawUrl)) {
+              return of(t).pipe(
+                // Fire NavigationStart event
+                switchMap((t2) => {
+                  this.events.next(new NavigationStart(t2.id, this.urlSerializer.serialize(t2.extractedUrl), t2.source, t2.restoredState));
+                  if (t2.id !== this.navigationId) {
+                    return EMPTY;
+                  }
+                  return Promise.resolve(t2);
+                }),
+                // Recognize
+                recognize(this.environmentInjector, this.configLoader, this.rootComponentType, router.config, this.urlSerializer, this.paramsInheritanceStrategy),
+                // Update URL if in `eager` update mode
+                tap((t2) => {
+                  overallTransitionState.targetSnapshot = t2.targetSnapshot;
+                  overallTransitionState.urlAfterRedirects = t2.urlAfterRedirects;
+                  this.currentNavigation = __spreadProps(__spreadValues({}, this.currentNavigation), {
+                    finalUrl: t2.urlAfterRedirects
+                  });
+                  const routesRecognized = new RoutesRecognized(t2.id, this.urlSerializer.serialize(t2.extractedUrl), this.urlSerializer.serialize(t2.urlAfterRedirects), t2.targetSnapshot);
+                  this.events.next(routesRecognized);
+                })
+              );
+            } else if (urlTransition && this.urlHandlingStrategy.shouldProcessUrl(t.currentRawUrl)) {
+              const {
+                id,
+                extractedUrl,
+                source,
+                restoredState,
+                extras
+              } = t;
+              const navStart = new NavigationStart(id, this.urlSerializer.serialize(extractedUrl), source, restoredState);
+              this.events.next(navStart);
+              const targetSnapshot = createEmptyState(this.rootComponentType).snapshot;
+              this.currentTransition = overallTransitionState = __spreadProps(__spreadValues({}, t), {
+                targetSnapshot,
+                urlAfterRedirects: extractedUrl,
+                extras: __spreadProps(__spreadValues({}, extras), {
+                  skipLocationChange: false,
+                  replaceUrl: false
+                })
+              });
+              this.currentNavigation.finalUrl = extractedUrl;
+              return of(overallTransitionState);
+            } else {
+              const reason = typeof ngDevMode === "undefined" || ngDevMode ? `Navigation was ignored because the UrlHandlingStrategy indicated neither the current URL ${t.currentRawUrl} nor target URL ${t.rawUrl} should be processed.` : "";
+              this.events.next(new NavigationSkipped(t.id, this.urlSerializer.serialize(t.extractedUrl), reason, NavigationSkippedCode.IgnoredByUrlHandlingStrategy));
+              t.resolve(false);
+              return EMPTY;
+            }
+          }),
+          // --- GUARDS ---
+          tap((t) => {
+            const guardsStart = new GuardsCheckStart(t.id, this.urlSerializer.serialize(t.extractedUrl), this.urlSerializer.serialize(t.urlAfterRedirects), t.targetSnapshot);
+            this.events.next(guardsStart);
+          }),
+          map((t) => {
+            this.currentTransition = overallTransitionState = __spreadProps(__spreadValues({}, t), {
+              guards: getAllRouteGuards(t.targetSnapshot, t.currentSnapshot, this.rootContexts)
+            });
+            return overallTransitionState;
+          }),
+          checkGuards(this.environmentInjector, (evt) => this.events.next(evt)),
+          tap((t) => {
+            overallTransitionState.guardsResult = t.guardsResult;
+            if (t.guardsResult && typeof t.guardsResult !== "boolean") {
+              throw redirectingNavigationError(this.urlSerializer, t.guardsResult);
+            }
+            const guardsEnd = new GuardsCheckEnd(t.id, this.urlSerializer.serialize(t.extractedUrl), this.urlSerializer.serialize(t.urlAfterRedirects), t.targetSnapshot, !!t.guardsResult);
+            this.events.next(guardsEnd);
+          }),
+          filter((t) => {
+            if (!t.guardsResult) {
+              this.cancelNavigationTransition(t, "", NavigationCancellationCode.GuardRejected);
+              return false;
+            }
+            return true;
+          }),
+          // --- RESOLVE ---
+          switchTap((t) => {
+            if (t.guards.canActivateChecks.length === 0) {
+              return void 0;
+            }
+            return of(t).pipe(tap((t2) => {
+              const resolveStart = new ResolveStart(t2.id, this.urlSerializer.serialize(t2.extractedUrl), this.urlSerializer.serialize(t2.urlAfterRedirects), t2.targetSnapshot);
+              this.events.next(resolveStart);
+            }), switchMap((t2) => {
+              let dataResolved = false;
+              return of(t2).pipe(resolveData(this.paramsInheritanceStrategy, this.environmentInjector), tap({
+                next: () => dataResolved = true,
+                complete: () => {
+                  if (!dataResolved) {
+                    this.cancelNavigationTransition(t2, typeof ngDevMode === "undefined" || ngDevMode ? `At least one route resolver didn't emit any value.` : "", NavigationCancellationCode.NoDataFromResolver);
+                  }
+                }
+              }));
+            }), tap((t2) => {
+              const resolveEnd = new ResolveEnd(t2.id, this.urlSerializer.serialize(t2.extractedUrl), this.urlSerializer.serialize(t2.urlAfterRedirects), t2.targetSnapshot);
+              this.events.next(resolveEnd);
+            }));
+          }),
+          // --- LOAD COMPONENTS ---
+          switchTap((t) => {
+            const loadComponents = (route) => {
+              const loaders = [];
+              if (route.routeConfig?.loadComponent && !route.routeConfig._loadedComponent) {
+                loaders.push(this.configLoader.loadComponent(route.routeConfig).pipe(tap((loadedComponent) => {
+                  route.component = loadedComponent;
+                }), map(() => void 0)));
+              }
+              for (const child of route.children) {
+                loaders.push(...loadComponents(child));
+              }
+              return loaders;
+            };
+            return combineLatest(loadComponents(t.targetSnapshot.root)).pipe(defaultIfEmpty(null), take(1));
+          }),
+          switchTap(() => this.afterPreactivation()),
+          switchMap(() => {
+            const {
+              currentSnapshot,
+              targetSnapshot
+            } = overallTransitionState;
+            const viewTransitionStarted = this.createViewTransition?.(this.environmentInjector, currentSnapshot.root, targetSnapshot.root);
+            return viewTransitionStarted ? from(viewTransitionStarted).pipe(map(() => overallTransitionState)) : of(overallTransitionState);
+          }),
+          map((t) => {
+            const targetRouterState = createRouterState(router.routeReuseStrategy, t.targetSnapshot, t.currentRouterState);
+            this.currentTransition = overallTransitionState = __spreadProps(__spreadValues({}, t), {
+              targetRouterState
+            });
+            this.currentNavigation.targetRouterState = targetRouterState;
+            return overallTransitionState;
+          }),
+          tap(() => {
+            this.events.next(new BeforeActivateRoutes());
+          }),
+          activateRoutes(this.rootContexts, router.routeReuseStrategy, (evt) => this.events.next(evt), this.inputBindingEnabled),
+          // Ensure that if some observable used to drive the transition doesn't
+          // complete, the navigation still finalizes This should never happen, but
+          // this is done as a safety measure to avoid surfacing this error (#49567).
+          take(1),
+          takeUntil(new Observable((subscriber) => {
+            const abortSignal = overallTransitionState.abortController.signal;
+            const handler = () => subscriber.next();
+            abortSignal.addEventListener("abort", handler);
+            return () => abortSignal.removeEventListener("abort", handler);
+          }).pipe(
+            // Ignore aborts if we are already completed, canceled, or are in the activation stage (we have targetRouterState)
+            filter(() => !completedOrAborted && !overallTransitionState.targetRouterState),
+            tap(() => {
+              this.cancelNavigationTransition(overallTransitionState, overallTransitionState.abortController.signal.reason + "", NavigationCancellationCode.Aborted);
+            })
+          )),
+          tap({
+            next: (t) => {
+              completedOrAborted = true;
+              this.lastSuccessfulNavigation = this.currentNavigation;
+              this.events.next(new NavigationEnd(t.id, this.urlSerializer.serialize(t.extractedUrl), this.urlSerializer.serialize(t.urlAfterRedirects)));
+              this.titleStrategy?.updateTitle(t.targetRouterState.snapshot);
+              t.resolve(true);
+            },
+            complete: () => {
+              completedOrAborted = true;
+            }
+          }),
+          // There used to be a lot more logic happening directly within the
+          // transition Observable. Some of this logic has been refactored out to
+          // other places but there may still be errors that happen there. This gives
+          // us a way to cancel the transition from the outside. This may also be
+          // required in the future to support something like the abort signal of the
+          // Navigation API where the navigation gets aborted from outside the
+          // transition.
+          takeUntil(this.transitionAbortWithErrorSubject.pipe(tap((err) => {
+            throw err;
+          }))),
+          finalize(() => {
+            if (!completedOrAborted) {
+              const cancelationReason = typeof ngDevMode === "undefined" || ngDevMode ? `Navigation ID ${overallTransitionState.id} is not equal to the current navigation id ${this.navigationId}` : "";
+              this.cancelNavigationTransition(overallTransitionState, cancelationReason, NavigationCancellationCode.SupersededByNewNavigation);
+            }
+            if (this.currentTransition?.id === overallTransitionState.id) {
+              this.currentNavigation = null;
+              this.currentTransition = null;
+            }
+          }),
+          catchError((e) => {
+            if (this.destroyed) {
+              overallTransitionState.resolve(false);
+              return EMPTY;
+            }
+            completedOrAborted = true;
+            if (isNavigationCancelingError(e)) {
+              this.events.next(new NavigationCancel(overallTransitionState.id, this.urlSerializer.serialize(overallTransitionState.extractedUrl), e.message, e.cancellationCode));
+              if (!isRedirectingNavigationCancelingError(e)) {
+                overallTransitionState.resolve(false);
+              } else {
+                this.events.next(new RedirectRequest(e.url, e.navigationBehaviorOptions));
+              }
+            } else {
+              const navigationError = new NavigationError(overallTransitionState.id, this.urlSerializer.serialize(overallTransitionState.extractedUrl), e, overallTransitionState.targetSnapshot ?? void 0);
+              try {
+                const navigationErrorHandlerResult = runInInjectionContext(this.environmentInjector, () => this.navigationErrorHandler?.(navigationError));
+                if (navigationErrorHandlerResult instanceof RedirectCommand) {
+                  const {
+                    message,
+                    cancellationCode
+                  } = redirectingNavigationError(this.urlSerializer, navigationErrorHandlerResult);
+                  this.events.next(new NavigationCancel(overallTransitionState.id, this.urlSerializer.serialize(overallTransitionState.extractedUrl), message, cancellationCode));
+                  this.events.next(new RedirectRequest(navigationErrorHandlerResult.redirectTo, navigationErrorHandlerResult.navigationBehaviorOptions));
+                } else {
+                  this.events.next(navigationError);
+                  throw e;
+                }
+              } catch (ee) {
+                if (this.options.resolveNavigationPromiseOnError) {
+                  overallTransitionState.resolve(false);
+                } else {
+                  overallTransitionState.reject(ee);
+                }
+              }
+            }
+            return EMPTY;
+          })
+        );
+      })
+    );
+  }
+  cancelNavigationTransition(t, reason, code) {
+    const navCancel = new NavigationCancel(t.id, this.urlSerializer.serialize(t.extractedUrl), reason, code);
+    this.events.next(navCancel);
+    t.resolve(false);
+  }
+  /**
+   * @returns Whether we're navigating to somewhere that is not what the Router is
+   * currently set to.
+   */
+  isUpdatingInternalState() {
+    return this.currentTransition?.extractedUrl.toString() !== this.currentTransition?.currentUrlTree.toString();
+  }
+  /**
+   * @returns Whether we're updating the browser URL to something new (navigation is going
+   * to somewhere not displayed in the URL bar and we will update the URL
+   * bar if navigation succeeds).
+   */
+  isUpdatedBrowserUrl() {
+    const currentBrowserUrl = this.urlHandlingStrategy.extract(this.urlSerializer.parse(this.location.path(true)));
+    const targetBrowserUrl = this.currentNavigation?.targetBrowserUrl ?? this.currentNavigation?.extractedUrl;
+    return currentBrowserUrl.toString() !== targetBrowserUrl?.toString() && !this.currentNavigation?.extras.skipLocationChange;
+  }
+  static ɵfac = function NavigationTransitions_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NavigationTransitions)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _NavigationTransitions,
+    factory: _NavigationTransitions.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NavigationTransitions, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [], null);
+})();
+function isBrowserTriggeredNavigation(source) {
+  return source !== IMPERATIVE_NAVIGATION;
+}
+var RouteReuseStrategy = class _RouteReuseStrategy {
+  static ɵfac = function RouteReuseStrategy_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouteReuseStrategy)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RouteReuseStrategy,
+    factory: () => (() => inject(DefaultRouteReuseStrategy))(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouteReuseStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => inject(DefaultRouteReuseStrategy)
+    }]
+  }], null, null);
+})();
+var BaseRouteReuseStrategy = class {
+  /**
+   * Whether the given route should detach for later reuse.
+   * Always returns false for `BaseRouteReuseStrategy`.
+   * */
+  shouldDetach(route) {
+    return false;
+  }
+  /**
+   * A no-op; the route is never stored since this strategy never detaches routes for later re-use.
+   */
+  store(route, detachedTree) {
+  }
+  /** Returns `false`, meaning the route (and its subtree) is never reattached */
+  shouldAttach(route) {
+    return false;
+  }
+  /** Returns `null` because this strategy does not store routes for later re-use. */
+  retrieve(route) {
+    return null;
+  }
+  /**
+   * Determines if a route should be reused.
+   * This strategy returns `true` when the future route config and current route config are
+   * identical.
+   */
+  shouldReuseRoute(future, curr) {
+    return future.routeConfig === curr.routeConfig;
+  }
+};
+var DefaultRouteReuseStrategy = class _DefaultRouteReuseStrategy extends BaseRouteReuseStrategy {
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵDefaultRouteReuseStrategy_BaseFactory;
+    return function DefaultRouteReuseStrategy_Factory(__ngFactoryType__) {
+      return (ɵDefaultRouteReuseStrategy_BaseFactory || (ɵDefaultRouteReuseStrategy_BaseFactory = ɵɵgetInheritedFactory(_DefaultRouteReuseStrategy)))(__ngFactoryType__ || _DefaultRouteReuseStrategy);
+    };
+  })();
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DefaultRouteReuseStrategy,
+    factory: _DefaultRouteReuseStrategy.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DefaultRouteReuseStrategy, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var StateManager = class _StateManager {
+  urlSerializer = inject(UrlSerializer);
+  options = inject(ROUTER_CONFIGURATION, {
+    optional: true
+  }) || {};
+  canceledNavigationResolution = this.options.canceledNavigationResolution || "replace";
+  location = inject(Location);
+  urlHandlingStrategy = inject(UrlHandlingStrategy);
+  urlUpdateStrategy = this.options.urlUpdateStrategy || "deferred";
+  currentUrlTree = new UrlTree();
+  /**
+   * Returns the currently activated `UrlTree`.
+   *
+   * This `UrlTree` shows only URLs that the `Router` is configured to handle (through
+   * `UrlHandlingStrategy`).
+   *
+   * The value is set after finding the route config tree to activate but before activating the
+   * route.
+   */
+  getCurrentUrlTree() {
+    return this.currentUrlTree;
+  }
+  rawUrlTree = this.currentUrlTree;
+  /**
+   * Returns a `UrlTree` that is represents what the browser is actually showing.
+   *
+   * In the life of a navigation transition:
+   * 1. When a navigation begins, the raw `UrlTree` is updated to the full URL that's being
+   * navigated to.
+   * 2. During a navigation, redirects are applied, which might only apply to _part_ of the URL (due
+   * to `UrlHandlingStrategy`).
+   * 3. Just before activation, the raw `UrlTree` is updated to include the redirects on top of the
+   * original raw URL.
+   *
+   * Note that this is _only_ here to support `UrlHandlingStrategy.extract` and
+   * `UrlHandlingStrategy.shouldProcessUrl`. Without those APIs, the current `UrlTree` would not
+   * deviated from the raw `UrlTree`.
+   *
+   * For `extract`, a raw `UrlTree` is needed because `extract` may only return part
+   * of the navigation URL. Thus, the current `UrlTree` may only represent _part_ of the browser
+   * URL. When a navigation gets cancelled and the router needs to reset the URL or a new navigation
+   * occurs, it needs to know the _whole_ browser URL, not just the part handled by
+   * `UrlHandlingStrategy`.
+   * For `shouldProcessUrl`, when the return is `false`, the router ignores the navigation but
+   * still updates the raw `UrlTree` with the assumption that the navigation was caused by the
+   * location change listener due to a URL update by the AngularJS router. In this case, the router
+   * still need to know what the browser's URL is for future navigations.
+   */
+  getRawUrlTree() {
+    return this.rawUrlTree;
+  }
+  createBrowserPath({
+    finalUrl,
+    initialUrl,
+    targetBrowserUrl
+  }) {
+    const rawUrl = finalUrl !== void 0 ? this.urlHandlingStrategy.merge(finalUrl, initialUrl) : initialUrl;
+    const url = targetBrowserUrl ?? rawUrl;
+    const path = url instanceof UrlTree ? this.urlSerializer.serialize(url) : url;
+    return path;
+  }
+  commitTransition({
+    targetRouterState,
+    finalUrl,
+    initialUrl
+  }) {
+    if (finalUrl && targetRouterState) {
+      this.currentUrlTree = finalUrl;
+      this.rawUrlTree = this.urlHandlingStrategy.merge(finalUrl, initialUrl);
+      this.routerState = targetRouterState;
+    } else {
+      this.rawUrlTree = initialUrl;
+    }
+  }
+  routerState = createEmptyState(null);
+  /** Returns the current RouterState. */
+  getRouterState() {
+    return this.routerState;
+  }
+  stateMemento = this.createStateMemento();
+  updateStateMemento() {
+    this.stateMemento = this.createStateMemento();
+  }
+  createStateMemento() {
+    return {
+      rawUrlTree: this.rawUrlTree,
+      currentUrlTree: this.currentUrlTree,
+      routerState: this.routerState
+    };
+  }
+  resetInternalState({
+    finalUrl
+  }) {
+    this.routerState = this.stateMemento.routerState;
+    this.currentUrlTree = this.stateMemento.currentUrlTree;
+    this.rawUrlTree = this.urlHandlingStrategy.merge(this.currentUrlTree, finalUrl ?? this.rawUrlTree);
+  }
+  static ɵfac = function StateManager_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _StateManager)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _StateManager,
+    factory: () => (() => inject(HistoryStateManager))(),
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(StateManager, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useFactory: () => inject(HistoryStateManager)
+    }]
+  }], null, null);
+})();
+var HistoryStateManager = class _HistoryStateManager extends StateManager {
+  /**
+   * The id of the currently active page in the router.
+   * Updated to the transition's target id on a successful navigation.
+   *
+   * This is used to track what page the router last activated. When an attempted navigation fails,
+   * the router can then use this to compute how to restore the state back to the previously active
+   * page.
+   */
+  currentPageId = 0;
+  lastSuccessfulId = -1;
+  restoredState() {
+    return this.location.getState();
+  }
+  /**
+   * The ɵrouterPageId of whatever page is currently active in the browser history. This is
+   * important for computing the target page id for new navigations because we need to ensure each
+   * page id in the browser history is 1 more than the previous entry.
+   */
+  get browserPageId() {
+    if (this.canceledNavigationResolution !== "computed") {
+      return this.currentPageId;
+    }
+    return this.restoredState()?.ɵrouterPageId ?? this.currentPageId;
+  }
+  registerNonRouterCurrentEntryChangeListener(listener) {
+    return this.location.subscribe((event) => {
+      if (event["type"] === "popstate") {
+        setTimeout(() => {
+          listener(event["url"], event.state, "popstate");
+        });
+      }
+    });
+  }
+  handleRouterEvent(e, currentTransition) {
+    if (e instanceof NavigationStart) {
+      this.updateStateMemento();
+    } else if (e instanceof NavigationSkipped) {
+      this.commitTransition(currentTransition);
+    } else if (e instanceof RoutesRecognized) {
+      if (this.urlUpdateStrategy === "eager") {
+        if (!currentTransition.extras.skipLocationChange) {
+          this.setBrowserUrl(this.createBrowserPath(currentTransition), currentTransition);
+        }
+      }
+    } else if (e instanceof BeforeActivateRoutes) {
+      this.commitTransition(currentTransition);
+      if (this.urlUpdateStrategy === "deferred" && !currentTransition.extras.skipLocationChange) {
+        this.setBrowserUrl(this.createBrowserPath(currentTransition), currentTransition);
+      }
+    } else if (e instanceof NavigationCancel && e.code !== NavigationCancellationCode.SupersededByNewNavigation && e.code !== NavigationCancellationCode.Redirect) {
+      this.restoreHistory(currentTransition);
+    } else if (e instanceof NavigationError) {
+      this.restoreHistory(currentTransition, true);
+    } else if (e instanceof NavigationEnd) {
+      this.lastSuccessfulId = e.id;
+      this.currentPageId = this.browserPageId;
+    }
+  }
+  setBrowserUrl(path, {
+    extras,
+    id
+  }) {
+    const {
+      replaceUrl,
+      state
+    } = extras;
+    if (this.location.isCurrentPathEqualTo(path) || !!replaceUrl) {
+      const currentBrowserPageId = this.browserPageId;
+      const newState = __spreadValues(__spreadValues({}, state), this.generateNgRouterState(id, currentBrowserPageId));
+      this.location.replaceState(path, "", newState);
+    } else {
+      const newState = __spreadValues(__spreadValues({}, state), this.generateNgRouterState(id, this.browserPageId + 1));
+      this.location.go(path, "", newState);
+    }
+  }
+  /**
+   * Performs the necessary rollback action to restore the browser URL to the
+   * state before the transition.
+   */
+  restoreHistory(navigation, restoringFromCaughtError = false) {
+    if (this.canceledNavigationResolution === "computed") {
+      const currentBrowserPageId = this.browserPageId;
+      const targetPagePosition = this.currentPageId - currentBrowserPageId;
+      if (targetPagePosition !== 0) {
+        this.location.historyGo(targetPagePosition);
+      } else if (this.getCurrentUrlTree() === navigation.finalUrl && targetPagePosition === 0) {
+        this.resetInternalState(navigation);
+        this.resetUrlToCurrentUrlTree();
+      } else ;
+    } else if (this.canceledNavigationResolution === "replace") {
+      if (restoringFromCaughtError) {
+        this.resetInternalState(navigation);
+      }
+      this.resetUrlToCurrentUrlTree();
+    }
+  }
+  resetUrlToCurrentUrlTree() {
+    this.location.replaceState(this.urlSerializer.serialize(this.getRawUrlTree()), "", this.generateNgRouterState(this.lastSuccessfulId, this.currentPageId));
+  }
+  generateNgRouterState(navigationId, routerPageId) {
+    if (this.canceledNavigationResolution === "computed") {
+      return {
+        navigationId,
+        ɵrouterPageId: routerPageId
+      };
+    }
+    return {
+      navigationId
+    };
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵHistoryStateManager_BaseFactory;
+    return function HistoryStateManager_Factory(__ngFactoryType__) {
+      return (ɵHistoryStateManager_BaseFactory || (ɵHistoryStateManager_BaseFactory = ɵɵgetInheritedFactory(_HistoryStateManager)))(__ngFactoryType__ || _HistoryStateManager);
+    };
+  })();
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HistoryStateManager,
+    factory: _HistoryStateManager.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HistoryStateManager, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+function afterNextNavigation(router, action) {
+  router.events.pipe(filter((e) => e instanceof NavigationEnd || e instanceof NavigationCancel || e instanceof NavigationError || e instanceof NavigationSkipped), map((e) => {
+    if (e instanceof NavigationEnd || e instanceof NavigationSkipped) {
+      return 0;
+    }
+    const redirecting = e instanceof NavigationCancel ? e.code === NavigationCancellationCode.Redirect || e.code === NavigationCancellationCode.SupersededByNewNavigation : false;
+    return redirecting ? 2 : 1;
+  }), filter(
+    (result) => result !== 2
+    /* NavigationResult.REDIRECTING */
+  ), take(1)).subscribe(() => {
+    action();
+  });
+}
+var exactMatchOptions = {
+  paths: "exact",
+  fragment: "ignored",
+  matrixParams: "ignored",
+  queryParams: "exact"
+};
+var subsetMatchOptions = {
+  paths: "subset",
+  fragment: "ignored",
+  matrixParams: "ignored",
+  queryParams: "subset"
+};
+var Router = class _Router {
+  get currentUrlTree() {
+    return this.stateManager.getCurrentUrlTree();
+  }
+  get rawUrlTree() {
+    return this.stateManager.getRawUrlTree();
+  }
+  disposed = false;
+  nonRouterCurrentEntryChangeSubscription;
+  console = inject(Console);
+  stateManager = inject(StateManager);
+  options = inject(ROUTER_CONFIGURATION, {
+    optional: true
+  }) || {};
+  pendingTasks = inject(PendingTasksInternal);
+  urlUpdateStrategy = this.options.urlUpdateStrategy || "deferred";
+  navigationTransitions = inject(NavigationTransitions);
+  urlSerializer = inject(UrlSerializer);
+  location = inject(Location);
+  urlHandlingStrategy = inject(UrlHandlingStrategy);
+  injector = inject(EnvironmentInjector);
+  /**
+   * The private `Subject` type for the public events exposed in the getter. This is used internally
+   * to push events to. The separate field allows us to expose separate types in the public API
+   * (i.e., an Observable rather than the Subject).
+   */
+  _events = new Subject();
+  /**
+   * An event stream for routing events.
+   */
+  get events() {
+    return this._events;
+  }
+  /**
+   * The current state of routing in this NgModule.
+   */
+  get routerState() {
+    return this.stateManager.getRouterState();
+  }
+  /**
+   * True if at least one navigation event has occurred,
+   * false otherwise.
+   */
+  navigated = false;
+  /**
+   * A strategy for re-using routes.
+   *
+   * @deprecated Configure using `providers` instead:
+   *   `{provide: RouteReuseStrategy, useClass: MyStrategy}`.
+   */
+  routeReuseStrategy = inject(RouteReuseStrategy);
+  /**
+   * How to handle a navigation request to the current URL.
+   *
+   *
+   * @deprecated Configure this through `provideRouter` or `RouterModule.forRoot` instead.
+   * @see {@link withRouterConfig}
+   * @see {@link provideRouter}
+   * @see {@link RouterModule}
+   */
+  onSameUrlNavigation = this.options.onSameUrlNavigation || "ignore";
+  config = inject(ROUTES, {
+    optional: true
+  })?.flat() ?? [];
+  /**
+   * Indicates whether the application has opted in to binding Router data to component inputs.
+   *
+   * This option is enabled by the `withComponentInputBinding` feature of `provideRouter` or
+   * `bindToComponentInputs` in the `ExtraOptions` of `RouterModule.forRoot`.
+   */
+  componentInputBindingEnabled = !!inject(INPUT_BINDER, {
+    optional: true
+  });
+  constructor() {
+    this.resetConfig(this.config);
+    this.navigationTransitions.setupNavigations(this).subscribe({
+      error: (e) => {
+        this.console.warn(ngDevMode ? `Unhandled Navigation Error: ${e}` : e);
+      }
+    });
+    this.subscribeToNavigationEvents();
+  }
+  eventsSubscription = new Subscription();
+  subscribeToNavigationEvents() {
+    const subscription = this.navigationTransitions.events.subscribe((e) => {
+      try {
+        const currentTransition = this.navigationTransitions.currentTransition;
+        const currentNavigation = this.navigationTransitions.currentNavigation;
+        if (currentTransition !== null && currentNavigation !== null) {
+          this.stateManager.handleRouterEvent(e, currentNavigation);
+          if (e instanceof NavigationCancel && e.code !== NavigationCancellationCode.Redirect && e.code !== NavigationCancellationCode.SupersededByNewNavigation) {
+            this.navigated = true;
+          } else if (e instanceof NavigationEnd) {
+            this.navigated = true;
+          } else if (e instanceof RedirectRequest) {
+            const opts = e.navigationBehaviorOptions;
+            const mergedTree = this.urlHandlingStrategy.merge(e.url, currentTransition.currentRawUrl);
+            const extras = __spreadValues({
+              browserUrl: currentTransition.extras.browserUrl,
+              info: currentTransition.extras.info,
+              skipLocationChange: currentTransition.extras.skipLocationChange,
+              // The URL is already updated at this point if we have 'eager' URL
+              // updates or if the navigation was triggered by the browser (back
+              // button, URL bar, etc). We want to replace that item in history
+              // if the navigation is rejected.
+              replaceUrl: currentTransition.extras.replaceUrl || this.urlUpdateStrategy === "eager" || isBrowserTriggeredNavigation(currentTransition.source)
+            }, opts);
+            this.scheduleNavigation(mergedTree, IMPERATIVE_NAVIGATION, null, extras, {
+              resolve: currentTransition.resolve,
+              reject: currentTransition.reject,
+              promise: currentTransition.promise
+            });
+          }
+        }
+        if (isPublicRouterEvent(e)) {
+          this._events.next(e);
+        }
+      } catch (e2) {
+        this.navigationTransitions.transitionAbortWithErrorSubject.next(e2);
+      }
+    });
+    this.eventsSubscription.add(subscription);
+  }
+  /** @internal */
+  resetRootComponentType(rootComponentType) {
+    this.routerState.root.component = rootComponentType;
+    this.navigationTransitions.rootComponentType = rootComponentType;
+  }
+  /**
+   * Sets up the location change listener and performs the initial navigation.
+   */
+  initialNavigation() {
+    this.setUpLocationChangeListener();
+    if (!this.navigationTransitions.hasRequestedNavigation) {
+      this.navigateToSyncWithBrowser(this.location.path(true), IMPERATIVE_NAVIGATION, this.stateManager.restoredState());
+    }
+  }
+  /**
+   * Sets up the location change listener. This listener detects navigations triggered from outside
+   * the Router (the browser back/forward buttons, for example) and schedules a corresponding Router
+   * navigation so that the correct events, guards, etc. are triggered.
+   */
+  setUpLocationChangeListener() {
+    this.nonRouterCurrentEntryChangeSubscription ??= this.stateManager.registerNonRouterCurrentEntryChangeListener((url, state, source) => {
+      this.navigateToSyncWithBrowser(url, source, state);
+    });
+  }
+  /**
+   * Schedules a router navigation to synchronize Router state with the browser state.
+   *
+   * This is done as a response to a popstate event and the initial navigation. These
+   * two scenarios represent times when the browser URL/state has been updated and
+   * the Router needs to respond to ensure its internal state matches.
+   */
+  navigateToSyncWithBrowser(url, source, state) {
+    const extras = {
+      replaceUrl: true
+    };
+    const restoredState = state?.navigationId ? state : null;
+    if (state) {
+      const stateCopy = __spreadValues({}, state);
+      delete stateCopy.navigationId;
+      delete stateCopy.ɵrouterPageId;
+      if (Object.keys(stateCopy).length !== 0) {
+        extras.state = stateCopy;
+      }
+    }
+    const urlTree = this.parseUrl(url);
+    this.scheduleNavigation(urlTree, source, restoredState, extras).catch((e) => {
+      this.injector.get(INTERNAL_APPLICATION_ERROR_HANDLER)(e);
+    });
+  }
+  /** The current URL. */
+  get url() {
+    return this.serializeUrl(this.currentUrlTree);
+  }
+  /**
+   * Returns the current `Navigation` object when the router is navigating,
+   * and `null` when idle.
+   */
+  getCurrentNavigation() {
+    return this.navigationTransitions.currentNavigation;
+  }
+  /**
+   * The `Navigation` object of the most recent navigation to succeed and `null` if there
+   *     has not been a successful navigation yet.
+   */
+  get lastSuccessfulNavigation() {
+    return this.navigationTransitions.lastSuccessfulNavigation;
+  }
+  /**
+   * Resets the route configuration used for navigation and generating links.
+   *
+   * @param config The route array for the new configuration.
+   *
+   * @usageNotes
+   *
+   * ```ts
+   * router.resetConfig([
+   *  { path: 'team/:id', component: TeamCmp, children: [
+   *    { path: 'simple', component: SimpleCmp },
+   *    { path: 'user/:name', component: UserCmp }
+   *  ]}
+   * ]);
+   * ```
+   */
+  resetConfig(config) {
+    (typeof ngDevMode === "undefined" || ngDevMode) && validateConfig(config);
+    this.config = config.map(standardizeConfig);
+    this.navigated = false;
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this.dispose();
+  }
+  /** Disposes of the router. */
+  dispose() {
+    this._events.unsubscribe();
+    this.navigationTransitions.complete();
+    if (this.nonRouterCurrentEntryChangeSubscription) {
+      this.nonRouterCurrentEntryChangeSubscription.unsubscribe();
+      this.nonRouterCurrentEntryChangeSubscription = void 0;
+    }
+    this.disposed = true;
+    this.eventsSubscription.unsubscribe();
+  }
+  /**
+   * Appends URL segments to the current URL tree to create a new URL tree.
+   *
+   * @param commands An array of URL fragments with which to construct the new URL tree.
+   * If the path is static, can be the literal URL string. For a dynamic path, pass an array of path
+   * segments, followed by the parameters for each segment.
+   * The fragments are applied to the current URL tree or the one provided  in the `relativeTo`
+   * property of the options object, if supplied.
+   * @param navigationExtras Options that control the navigation strategy.
+   * @returns The new URL tree.
+   *
+   * @usageNotes
+   *
+   * ```
+   * // create /team/33/user/11
+   * router.createUrlTree(['/team', 33, 'user', 11]);
+   *
+   * // create /team/33;expand=true/user/11
+   * router.createUrlTree(['/team', 33, {expand: true}, 'user', 11]);
+   *
+   * // you can collapse static segments like this (this works only with the first passed-in value):
+   * router.createUrlTree(['/team/33/user', userId]);
+   *
+   * // If the first segment can contain slashes, and you do not want the router to split it,
+   * // you can do the following:
+   * router.createUrlTree([{segmentPath: '/one/two'}]);
+   *
+   * // create /team/33/(user/11//right:chat)
+   * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: 'chat'}}]);
+   *
+   * // remove the right secondary node
+   * router.createUrlTree(['/team', 33, {outlets: {primary: 'user/11', right: null}}]);
+   *
+   * // assuming the current url is `/team/33/user/11` and the route points to `user/11`
+   *
+   * // navigate to /team/33/user/11/details
+   * router.createUrlTree(['details'], {relativeTo: route});
+   *
+   * // navigate to /team/33/user/22
+   * router.createUrlTree(['../22'], {relativeTo: route});
+   *
+   * // navigate to /team/44/user/22
+   * router.createUrlTree(['../../team/44/user/22'], {relativeTo: route});
+   *
+   * Note that a value of `null` or `undefined` for `relativeTo` indicates that the
+   * tree should be created relative to the root.
+   * ```
+   */
+  createUrlTree(commands, navigationExtras = {}) {
+    const {
+      relativeTo,
+      queryParams,
+      fragment,
+      queryParamsHandling,
+      preserveFragment
+    } = navigationExtras;
+    const f = preserveFragment ? this.currentUrlTree.fragment : fragment;
+    let q = null;
+    switch (queryParamsHandling ?? this.options.defaultQueryParamsHandling) {
+      case "merge":
+        q = __spreadValues(__spreadValues({}, this.currentUrlTree.queryParams), queryParams);
+        break;
+      case "preserve":
+        q = this.currentUrlTree.queryParams;
+        break;
+      default:
+        q = queryParams || null;
+    }
+    if (q !== null) {
+      q = this.removeEmptyProps(q);
+    }
+    let relativeToUrlSegmentGroup;
+    try {
+      const relativeToSnapshot = relativeTo ? relativeTo.snapshot : this.routerState.snapshot.root;
+      relativeToUrlSegmentGroup = createSegmentGroupFromRoute(relativeToSnapshot);
+    } catch (e) {
+      if (typeof commands[0] !== "string" || commands[0][0] !== "/") {
+        commands = [];
+      }
+      relativeToUrlSegmentGroup = this.currentUrlTree.root;
+    }
+    return createUrlTreeFromSegmentGroup(relativeToUrlSegmentGroup, commands, q, f ?? null);
+  }
+  /**
+   * Navigates to a view using an absolute route path.
+   *
+   * @param url An absolute path for a defined route. The function does not apply any delta to the
+   *     current URL.
+   * @param extras An object containing properties that modify the navigation strategy.
+   *
+   * @returns A Promise that resolves to 'true' when navigation succeeds,
+   * to 'false' when navigation fails, or is rejected on error.
+   *
+   * @usageNotes
+   *
+   * The following calls request navigation to an absolute path.
+   *
+   * ```ts
+   * router.navigateByUrl("/team/33/user/11");
+   *
+   * // Navigate without updating the URL
+   * router.navigateByUrl("/team/33/user/11", { skipLocationChange: true });
+   * ```
+   *
+   * @see [Routing and Navigation guide](guide/routing/common-router-tasks)
+   *
+   */
+  navigateByUrl(url, extras = {
+    skipLocationChange: false
+  }) {
+    const urlTree = isUrlTree(url) ? url : this.parseUrl(url);
+    const mergedTree = this.urlHandlingStrategy.merge(urlTree, this.rawUrlTree);
+    return this.scheduleNavigation(mergedTree, IMPERATIVE_NAVIGATION, null, extras);
+  }
+  /**
+   * Navigate based on the provided array of commands and a starting point.
+   * If no starting route is provided, the navigation is absolute.
+   *
+   * @param commands An array of URL fragments with which to construct the target URL.
+   * If the path is static, can be the literal URL string. For a dynamic path, pass an array of path
+   * segments, followed by the parameters for each segment.
+   * The fragments are applied to the current URL or the one provided  in the `relativeTo` property
+   * of the options object, if supplied.
+   * @param extras An options object that determines how the URL should be constructed or
+   *     interpreted.
+   *
+   * @returns A Promise that resolves to `true` when navigation succeeds, or `false` when navigation
+   *     fails. The Promise is rejected when an error occurs if `resolveNavigationPromiseOnError` is
+   * not `true`.
+   *
+   * @usageNotes
+   *
+   * The following calls request navigation to a dynamic route path relative to the current URL.
+   *
+   * ```ts
+   * router.navigate(['team', 33, 'user', 11], {relativeTo: route});
+   *
+   * // Navigate without updating the URL, overriding the default behavior
+   * router.navigate(['team', 33, 'user', 11], {relativeTo: route, skipLocationChange: true});
+   * ```
+   *
+   * @see [Routing and Navigation guide](guide/routing/common-router-tasks)
+   *
+   */
+  navigate(commands, extras = {
+    skipLocationChange: false
+  }) {
+    validateCommands(commands);
+    return this.navigateByUrl(this.createUrlTree(commands, extras), extras);
+  }
+  /** Serializes a `UrlTree` into a string */
+  serializeUrl(url) {
+    return this.urlSerializer.serialize(url);
+  }
+  /** Parses a string into a `UrlTree` */
+  parseUrl(url) {
+    try {
+      return this.urlSerializer.parse(url);
+    } catch {
+      return this.urlSerializer.parse("/");
+    }
+  }
+  isActive(url, matchOptions) {
+    let options;
+    if (matchOptions === true) {
+      options = __spreadValues({}, exactMatchOptions);
+    } else if (matchOptions === false) {
+      options = __spreadValues({}, subsetMatchOptions);
+    } else {
+      options = matchOptions;
+    }
+    if (isUrlTree(url)) {
+      return containsTree(this.currentUrlTree, url, options);
+    }
+    const urlTree = this.parseUrl(url);
+    return containsTree(this.currentUrlTree, urlTree, options);
+  }
+  removeEmptyProps(params) {
+    return Object.entries(params).reduce((result, [key, value]) => {
+      if (value !== null && value !== void 0) {
+        result[key] = value;
+      }
+      return result;
+    }, {});
+  }
+  scheduleNavigation(rawUrl, source, restoredState, extras, priorPromise) {
+    if (this.disposed) {
+      return Promise.resolve(false);
+    }
+    let resolve;
+    let reject;
+    let promise;
+    if (priorPromise) {
+      resolve = priorPromise.resolve;
+      reject = priorPromise.reject;
+      promise = priorPromise.promise;
+    } else {
+      promise = new Promise((res, rej) => {
+        resolve = res;
+        reject = rej;
+      });
+    }
+    const taskId = this.pendingTasks.add();
+    afterNextNavigation(this, () => {
+      queueMicrotask(() => this.pendingTasks.remove(taskId));
+    });
+    this.navigationTransitions.handleNavigationRequest({
+      source,
+      restoredState,
+      currentUrlTree: this.currentUrlTree,
+      currentRawUrl: this.currentUrlTree,
+      rawUrl,
+      extras,
+      resolve,
+      reject,
+      promise,
+      currentSnapshot: this.routerState.snapshot,
+      currentRouterState: this.routerState
+    });
+    return promise.catch((e) => {
+      return Promise.reject(e);
+    });
+  }
+  static ɵfac = function Router_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Router)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _Router,
+    factory: _Router.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Router, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [], null);
+})();
+function validateCommands(commands) {
+  for (let i = 0; i < commands.length; i++) {
+    const cmd = commands[i];
+    if (cmd == null) {
+      throw new RuntimeError(4008, (typeof ngDevMode === "undefined" || ngDevMode) && `The requested path contains ${cmd} segment at index ${i}`);
+    }
+  }
+}
+
+// node_modules/@angular/router/fesm2022/router_module.mjs
+var RouterLink = class _RouterLink {
+  router;
+  route;
+  tabIndexAttribute;
+  renderer;
+  el;
+  locationStrategy;
+  /** @nodoc */
+  reactiveHref = signal(null);
+  /**
+   * Represents an `href` attribute value applied to a host element,
+   * when a host element is an `<a>`/`<area>` tag or a compatible custom element.
+   * For other tags, the value is `null`.
+   */
+  get href() {
+    return untracked(this.reactiveHref);
+  }
+  /** @deprecated */
+  set href(value) {
+    this.reactiveHref.set(value);
+  }
+  /**
+   * Represents the `target` attribute on a host element.
+   * This is only used when the host element is
+   * an `<a>`/`<area>` tag or a compatible custom element.
+   */
+  target;
+  /**
+   * Passed to {@link Router#createUrlTree} as part of the
+   * `UrlCreationOptions`.
+   * @see {@link UrlCreationOptions#queryParams}
+   * @see {@link Router#createUrlTree}
+   */
+  queryParams;
+  /**
+   * Passed to {@link Router#createUrlTree} as part of the
+   * `UrlCreationOptions`.
+   * @see {@link UrlCreationOptions#fragment}
+   * @see {@link Router#createUrlTree}
+   */
+  fragment;
+  /**
+   * Passed to {@link Router#createUrlTree} as part of the
+   * `UrlCreationOptions`.
+   * @see {@link UrlCreationOptions#queryParamsHandling}
+   * @see {@link Router#createUrlTree}
+   */
+  queryParamsHandling;
+  /**
+   * Passed to {@link Router#navigateByUrl} as part of the
+   * `NavigationBehaviorOptions`.
+   * @see {@link NavigationBehaviorOptions#state}
+   * @see {@link Router#navigateByUrl}
+   */
+  state;
+  /**
+   * Passed to {@link Router#navigateByUrl} as part of the
+   * `NavigationBehaviorOptions`.
+   * @see {@link NavigationBehaviorOptions#info}
+   * @see {@link Router#navigateByUrl}
+   */
+  info;
+  /**
+   * Passed to {@link Router#createUrlTree} as part of the
+   * `UrlCreationOptions`.
+   * Specify a value here when you do not want to use the default value
+   * for `routerLink`, which is the current activated route.
+   * Note that a value of `undefined` here will use the `routerLink` default.
+   * @see {@link UrlCreationOptions#relativeTo}
+   * @see {@link Router#createUrlTree}
+   */
+  relativeTo;
+  /** Whether a host element is an `<a>`/`<area>` tag or a compatible custom element. */
+  isAnchorElement;
+  subscription;
+  /** @internal */
+  onChanges = new Subject();
+  applicationErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+  options = inject(ROUTER_CONFIGURATION, {
+    optional: true
+  });
+  constructor(router, route, tabIndexAttribute, renderer, el, locationStrategy) {
+    this.router = router;
+    this.route = route;
+    this.tabIndexAttribute = tabIndexAttribute;
+    this.renderer = renderer;
+    this.el = el;
+    this.locationStrategy = locationStrategy;
+    this.reactiveHref.set(inject(new HostAttributeToken("href"), {
+      optional: true
+    }));
+    const tagName = el.nativeElement.tagName?.toLowerCase();
+    this.isAnchorElement = tagName === "a" || tagName === "area" || !!// Avoid breaking in an SSR context where customElements might not be defined.
+    (typeof customElements === "object" && // observedAttributes is an optional static property/getter on a custom element.
+    // The spec states that this must be an array of strings.
+    customElements.get(tagName)?.observedAttributes?.includes?.("href"));
+    if (!this.isAnchorElement) {
+      this.subscribeToNavigationEventsIfNecessary();
+    } else {
+      this.setTabIndexIfNotOnNativeEl("0");
+    }
+  }
+  subscribeToNavigationEventsIfNecessary() {
+    if (this.subscription !== void 0 || !this.isAnchorElement) {
+      return;
+    }
+    let createSubcription = this.preserveFragment;
+    const dependsOnRouterState = (handling) => handling === "merge" || handling === "preserve";
+    createSubcription ||= dependsOnRouterState(this.queryParamsHandling);
+    createSubcription ||= !this.queryParamsHandling && !dependsOnRouterState(this.options?.defaultQueryParamsHandling);
+    if (!createSubcription) {
+      return;
+    }
+    this.subscription = this.router.events.subscribe((s) => {
+      if (s instanceof NavigationEnd) {
+        this.updateHref();
+      }
+    });
+  }
+  /**
+   * Passed to {@link Router#createUrlTree} as part of the
+   * `UrlCreationOptions`.
+   * @see {@link UrlCreationOptions#preserveFragment}
+   * @see {@link Router#createUrlTree}
+   */
+  preserveFragment = false;
+  /**
+   * Passed to {@link Router#navigateByUrl} as part of the
+   * `NavigationBehaviorOptions`.
+   * @see {@link NavigationBehaviorOptions#skipLocationChange}
+   * @see {@link Router#navigateByUrl}
+   */
+  skipLocationChange = false;
+  /**
+   * Passed to {@link Router#navigateByUrl} as part of the
+   * `NavigationBehaviorOptions`.
+   * @see {@link NavigationBehaviorOptions#replaceUrl}
+   * @see {@link Router#navigateByUrl}
+   */
+  replaceUrl = false;
+  /**
+   * Modifies the tab index if there was not a tabindex attribute on the element during
+   * instantiation.
+   */
+  setTabIndexIfNotOnNativeEl(newTabIndex) {
+    if (this.tabIndexAttribute != null || this.isAnchorElement) {
+      return;
+    }
+    this.applyAttributeValue("tabindex", newTabIndex);
+  }
+  /** @docs-private */
+  // TODO(atscott): Remove changes parameter in major version as a breaking change.
+  ngOnChanges(changes) {
+    if (ngDevMode && isUrlTree(this.routerLinkInput) && (this.fragment !== void 0 || this.queryParams || this.queryParamsHandling || this.preserveFragment || this.relativeTo)) {
+      throw new RuntimeError(4016, "Cannot configure queryParams or fragment when using a UrlTree as the routerLink input value.");
+    }
+    if (this.isAnchorElement) {
+      this.updateHref();
+      this.subscribeToNavigationEventsIfNecessary();
+    }
+    this.onChanges.next(this);
+  }
+  routerLinkInput = null;
+  /**
+   * Commands to pass to {@link Router#createUrlTree} or a `UrlTree`.
+   *   - **array**: commands to pass to {@link Router#createUrlTree}.
+   *   - **string**: shorthand for array of commands with just the string, i.e. `['/route']`
+   *   - **UrlTree**: a `UrlTree` for this link rather than creating one from the commands
+   *     and other inputs that correspond to properties of `UrlCreationOptions`.
+   *   - **null|undefined**: effectively disables the `routerLink`
+   * @see {@link Router#createUrlTree}
+   */
+  set routerLink(commandsOrUrlTree) {
+    if (commandsOrUrlTree == null) {
+      this.routerLinkInput = null;
+      this.setTabIndexIfNotOnNativeEl(null);
+    } else {
+      if (isUrlTree(commandsOrUrlTree)) {
+        this.routerLinkInput = commandsOrUrlTree;
+      } else {
+        this.routerLinkInput = Array.isArray(commandsOrUrlTree) ? commandsOrUrlTree : [commandsOrUrlTree];
+      }
+      this.setTabIndexIfNotOnNativeEl("0");
+    }
+  }
+  /** @docs-private */
+  onClick(button, ctrlKey, shiftKey, altKey, metaKey) {
+    const urlTree = this.urlTree;
+    if (urlTree === null) {
+      return true;
+    }
+    if (this.isAnchorElement) {
+      if (button !== 0 || ctrlKey || shiftKey || altKey || metaKey) {
+        return true;
+      }
+      if (typeof this.target === "string" && this.target != "_self") {
+        return true;
+      }
+    }
+    const extras = {
+      skipLocationChange: this.skipLocationChange,
+      replaceUrl: this.replaceUrl,
+      state: this.state,
+      info: this.info
+    };
+    this.router.navigateByUrl(urlTree, extras)?.catch((e) => {
+      this.applicationErrorHandler(e);
+    });
+    return !this.isAnchorElement;
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this.subscription?.unsubscribe();
+  }
+  updateHref() {
+    const urlTree = this.urlTree;
+    this.reactiveHref.set(urlTree !== null && this.locationStrategy ? this.locationStrategy?.prepareExternalUrl(this.router.serializeUrl(urlTree)) ?? "" : null);
+  }
+  applyAttributeValue(attrName, attrValue) {
+    const renderer = this.renderer;
+    const nativeElement = this.el.nativeElement;
+    if (attrValue !== null) {
+      renderer.setAttribute(nativeElement, attrName, attrValue);
+    } else {
+      renderer.removeAttribute(nativeElement, attrName);
+    }
+  }
+  get urlTree() {
+    if (this.routerLinkInput === null) {
+      return null;
+    } else if (isUrlTree(this.routerLinkInput)) {
+      return this.routerLinkInput;
+    }
+    return this.router.createUrlTree(this.routerLinkInput, {
+      // If the `relativeTo` input is not defined, we want to use `this.route` by default.
+      // Otherwise, we should use the value provided by the user in the input.
+      relativeTo: this.relativeTo !== void 0 ? this.relativeTo : this.route,
+      queryParams: this.queryParams,
+      fragment: this.fragment,
+      queryParamsHandling: this.queryParamsHandling,
+      preserveFragment: this.preserveFragment
+    });
+  }
+  static ɵfac = function RouterLink_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterLink)(ɵɵdirectiveInject(Router), ɵɵdirectiveInject(ActivatedRoute), ɵɵinjectAttribute("tabindex"), ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(LocationStrategy));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _RouterLink,
+    selectors: [["", "routerLink", ""]],
+    hostVars: 2,
+    hostBindings: function RouterLink_HostBindings(rf, ctx) {
+      if (rf & 1) {
+        ɵɵlistener("click", function RouterLink_click_HostBindingHandler($event) {
+          return ctx.onClick($event.button, $event.ctrlKey, $event.shiftKey, $event.altKey, $event.metaKey);
+        });
+      }
+      if (rf & 2) {
+        ɵɵattribute("href", ctx.reactiveHref(), ɵɵsanitizeUrlOrResourceUrl)("target", ctx.target);
+      }
+    },
+    inputs: {
+      target: "target",
+      queryParams: "queryParams",
+      fragment: "fragment",
+      queryParamsHandling: "queryParamsHandling",
+      state: "state",
+      info: "info",
+      relativeTo: "relativeTo",
+      preserveFragment: [2, "preserveFragment", "preserveFragment", booleanAttribute],
+      skipLocationChange: [2, "skipLocationChange", "skipLocationChange", booleanAttribute],
+      replaceUrl: [2, "replaceUrl", "replaceUrl", booleanAttribute],
+      routerLink: "routerLink"
+    },
+    features: [ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterLink, [{
+    type: Directive,
+    args: [{
+      selector: "[routerLink]",
+      host: {
+        "[attr.href]": "reactiveHref()"
+      }
+    }]
+  }], () => [{
+    type: Router
+  }, {
+    type: ActivatedRoute
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Attribute,
+      args: ["tabindex"]
+    }]
+  }, {
+    type: Renderer2
+  }, {
+    type: ElementRef
+  }, {
+    type: LocationStrategy
+  }], {
+    target: [{
+      type: HostBinding,
+      args: ["attr.target"]
+    }, {
+      type: Input
+    }],
+    queryParams: [{
+      type: Input
+    }],
+    fragment: [{
+      type: Input
+    }],
+    queryParamsHandling: [{
+      type: Input
+    }],
+    state: [{
+      type: Input
+    }],
+    info: [{
+      type: Input
+    }],
+    relativeTo: [{
+      type: Input
+    }],
+    preserveFragment: [{
+      type: Input,
+      args: [{
+        transform: booleanAttribute
+      }]
+    }],
+    skipLocationChange: [{
+      type: Input,
+      args: [{
+        transform: booleanAttribute
+      }]
+    }],
+    replaceUrl: [{
+      type: Input,
+      args: [{
+        transform: booleanAttribute
+      }]
+    }],
+    routerLink: [{
+      type: Input
+    }],
+    onClick: [{
+      type: HostListener,
+      args: ["click", ["$event.button", "$event.ctrlKey", "$event.shiftKey", "$event.altKey", "$event.metaKey"]]
+    }]
+  });
+})();
+var RouterLinkActive = class _RouterLinkActive {
+  router;
+  element;
+  renderer;
+  cdr;
+  link;
+  links;
+  classes = [];
+  routerEventsSubscription;
+  linkInputChangesSubscription;
+  _isActive = false;
+  get isActive() {
+    return this._isActive;
+  }
+  /**
+   * Options to configure how to determine if the router link is active.
+   *
+   * These options are passed to the `Router.isActive()` function.
+   *
+   * @see {@link Router#isActive}
+   */
+  routerLinkActiveOptions = {
+    exact: false
+  };
+  /**
+   * Aria-current attribute to apply when the router link is active.
+   *
+   * Possible values: `'page'` | `'step'` | `'location'` | `'date'` | `'time'` | `true` | `false`.
+   *
+   * @see {@link https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Attributes/aria-current}
+   */
+  ariaCurrentWhenActive;
+  /**
+   *
+   * You can use the output `isActiveChange` to get notified each time the link becomes
+   * active or inactive.
+   *
+   * Emits:
+   * true  -> Route is active
+   * false -> Route is inactive
+   *
+   * ```html
+   * <a
+   *  routerLink="/user/bob"
+   *  routerLinkActive="active-link"
+   *  (isActiveChange)="this.onRouterLinkActive($event)">Bob</a>
+   * ```
+   */
+  isActiveChange = new EventEmitter();
+  constructor(router, element, renderer, cdr, link) {
+    this.router = router;
+    this.element = element;
+    this.renderer = renderer;
+    this.cdr = cdr;
+    this.link = link;
+    this.routerEventsSubscription = router.events.subscribe((s) => {
+      if (s instanceof NavigationEnd) {
+        this.update();
+      }
+    });
+  }
+  /** @docs-private */
+  ngAfterContentInit() {
+    of(this.links.changes, of(null)).pipe(mergeAll()).subscribe((_) => {
+      this.update();
+      this.subscribeToEachLinkOnChanges();
+    });
+  }
+  subscribeToEachLinkOnChanges() {
+    this.linkInputChangesSubscription?.unsubscribe();
+    const allLinkChanges = [...this.links.toArray(), this.link].filter((link) => !!link).map((link) => link.onChanges);
+    this.linkInputChangesSubscription = from(allLinkChanges).pipe(mergeAll()).subscribe((link) => {
+      if (this._isActive !== this.isLinkActive(this.router)(link)) {
+        this.update();
+      }
+    });
+  }
+  set routerLinkActive(data) {
+    const classes = Array.isArray(data) ? data : data.split(" ");
+    this.classes = classes.filter((c) => !!c);
+  }
+  /** @docs-private */
+  ngOnChanges(changes) {
+    this.update();
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this.routerEventsSubscription.unsubscribe();
+    this.linkInputChangesSubscription?.unsubscribe();
+  }
+  update() {
+    if (!this.links || !this.router.navigated) return;
+    queueMicrotask(() => {
+      const hasActiveLinks = this.hasActiveLinks();
+      this.classes.forEach((c) => {
+        if (hasActiveLinks) {
+          this.renderer.addClass(this.element.nativeElement, c);
+        } else {
+          this.renderer.removeClass(this.element.nativeElement, c);
+        }
+      });
+      if (hasActiveLinks && this.ariaCurrentWhenActive !== void 0) {
+        this.renderer.setAttribute(this.element.nativeElement, "aria-current", this.ariaCurrentWhenActive.toString());
+      } else {
+        this.renderer.removeAttribute(this.element.nativeElement, "aria-current");
+      }
+      if (this._isActive !== hasActiveLinks) {
+        this._isActive = hasActiveLinks;
+        this.cdr.markForCheck();
+        this.isActiveChange.emit(hasActiveLinks);
+      }
+    });
+  }
+  isLinkActive(router) {
+    const options = isActiveMatchOptions(this.routerLinkActiveOptions) ? this.routerLinkActiveOptions : (
+      // While the types should disallow `undefined` here, it's possible without strict inputs
+      this.routerLinkActiveOptions.exact || false
+    );
+    return (link) => {
+      const urlTree = link.urlTree;
+      return urlTree ? router.isActive(urlTree, options) : false;
+    };
+  }
+  hasActiveLinks() {
+    const isActiveCheckFn = this.isLinkActive(this.router);
+    return this.link && isActiveCheckFn(this.link) || this.links.some(isActiveCheckFn);
+  }
+  static ɵfac = function RouterLinkActive_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterLinkActive)(ɵɵdirectiveInject(Router), ɵɵdirectiveInject(ElementRef), ɵɵdirectiveInject(Renderer2), ɵɵdirectiveInject(ChangeDetectorRef), ɵɵdirectiveInject(RouterLink, 8));
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _RouterLinkActive,
+    selectors: [["", "routerLinkActive", ""]],
+    contentQueries: function RouterLinkActive_ContentQueries(rf, ctx, dirIndex) {
+      if (rf & 1) {
+        ɵɵcontentQuery(dirIndex, RouterLink, 5);
+      }
+      if (rf & 2) {
+        let _t;
+        ɵɵqueryRefresh(_t = ɵɵloadQuery()) && (ctx.links = _t);
+      }
+    },
+    inputs: {
+      routerLinkActiveOptions: "routerLinkActiveOptions",
+      ariaCurrentWhenActive: "ariaCurrentWhenActive",
+      routerLinkActive: "routerLinkActive"
+    },
+    outputs: {
+      isActiveChange: "isActiveChange"
+    },
+    exportAs: ["routerLinkActive"],
+    features: [ɵɵNgOnChangesFeature]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterLinkActive, [{
+    type: Directive,
+    args: [{
+      selector: "[routerLinkActive]",
+      exportAs: "routerLinkActive"
+    }]
+  }], () => [{
+    type: Router
+  }, {
+    type: ElementRef
+  }, {
+    type: Renderer2
+  }, {
+    type: ChangeDetectorRef
+  }, {
+    type: RouterLink,
+    decorators: [{
+      type: Optional
+    }]
+  }], {
+    links: [{
+      type: ContentChildren,
+      args: [RouterLink, {
+        descendants: true
+      }]
+    }],
+    routerLinkActiveOptions: [{
+      type: Input
+    }],
+    ariaCurrentWhenActive: [{
+      type: Input
+    }],
+    isActiveChange: [{
+      type: Output
+    }],
+    routerLinkActive: [{
+      type: Input
+    }]
+  });
+})();
+function isActiveMatchOptions(options) {
+  return !!options.paths;
+}
+var PreloadingStrategy = class {
+};
+var PreloadAllModules = class _PreloadAllModules {
+  preload(route, fn) {
+    return fn().pipe(catchError(() => of(null)));
+  }
+  static ɵfac = function PreloadAllModules_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _PreloadAllModules)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _PreloadAllModules,
+    factory: _PreloadAllModules.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(PreloadAllModules, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var NoPreloading = class _NoPreloading {
+  preload(route, fn) {
+    return of(null);
+  }
+  static ɵfac = function NoPreloading_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NoPreloading)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _NoPreloading,
+    factory: _NoPreloading.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NoPreloading, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var RouterPreloader = class _RouterPreloader {
+  router;
+  injector;
+  preloadingStrategy;
+  loader;
+  subscription;
+  constructor(router, injector, preloadingStrategy, loader) {
+    this.router = router;
+    this.injector = injector;
+    this.preloadingStrategy = preloadingStrategy;
+    this.loader = loader;
+  }
+  setUpPreloading() {
+    this.subscription = this.router.events.pipe(filter((e) => e instanceof NavigationEnd), concatMap(() => this.preload())).subscribe(() => {
+    });
+  }
+  preload() {
+    return this.processRoutes(this.injector, this.router.config);
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    if (this.subscription) {
+      this.subscription.unsubscribe();
+    }
+  }
+  processRoutes(injector, routes) {
+    const res = [];
+    for (const route of routes) {
+      if (route.providers && !route._injector) {
+        route._injector = createEnvironmentInjector(route.providers, injector, `Route: ${route.path}`);
+      }
+      const injectorForCurrentRoute = route._injector ?? injector;
+      const injectorForChildren = route._loadedInjector ?? injectorForCurrentRoute;
+      if (route.loadChildren && !route._loadedRoutes && route.canLoad === void 0 || route.loadComponent && !route._loadedComponent) {
+        res.push(this.preloadConfig(injectorForCurrentRoute, route));
+      }
+      if (route.children || route._loadedRoutes) {
+        res.push(this.processRoutes(injectorForChildren, route.children ?? route._loadedRoutes));
+      }
+    }
+    return from(res).pipe(mergeAll());
+  }
+  preloadConfig(injector, route) {
+    return this.preloadingStrategy.preload(route, () => {
+      let loadedChildren$;
+      if (route.loadChildren && route.canLoad === void 0) {
+        loadedChildren$ = this.loader.loadChildren(injector, route);
+      } else {
+        loadedChildren$ = of(null);
+      }
+      const recursiveLoadChildren$ = loadedChildren$.pipe(mergeMap((config) => {
+        if (config === null) {
+          return of(void 0);
+        }
+        route._loadedRoutes = config.routes;
+        route._loadedInjector = config.injector;
+        return this.processRoutes(config.injector ?? injector, config.routes);
+      }));
+      if (route.loadComponent && !route._loadedComponent) {
+        const loadComponent$ = this.loader.loadComponent(route);
+        return from([recursiveLoadChildren$, loadComponent$]).pipe(mergeAll());
+      } else {
+        return recursiveLoadChildren$;
+      }
+    });
+  }
+  static ɵfac = function RouterPreloader_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterPreloader)(ɵɵinject(Router), ɵɵinject(EnvironmentInjector), ɵɵinject(PreloadingStrategy), ɵɵinject(RouterConfigLoader));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RouterPreloader,
+    factory: _RouterPreloader.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterPreloader, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: Router
+  }, {
+    type: EnvironmentInjector
+  }, {
+    type: PreloadingStrategy
+  }, {
+    type: RouterConfigLoader
+  }], null);
+})();
+var ROUTER_SCROLLER = new InjectionToken("");
+var RouterScroller = class _RouterScroller {
+  urlSerializer;
+  transitions;
+  viewportScroller;
+  zone;
+  options;
+  routerEventsSubscription;
+  scrollEventsSubscription;
+  lastId = 0;
+  lastSource = IMPERATIVE_NAVIGATION;
+  restoredId = 0;
+  store = {};
+  /** @docs-private */
+  constructor(urlSerializer, transitions, viewportScroller, zone, options = {}) {
+    this.urlSerializer = urlSerializer;
+    this.transitions = transitions;
+    this.viewportScroller = viewportScroller;
+    this.zone = zone;
+    this.options = options;
+    options.scrollPositionRestoration ||= "disabled";
+    options.anchorScrolling ||= "disabled";
+  }
+  init() {
+    if (this.options.scrollPositionRestoration !== "disabled") {
+      this.viewportScroller.setHistoryScrollRestoration("manual");
+    }
+    this.routerEventsSubscription = this.createScrollEvents();
+    this.scrollEventsSubscription = this.consumeScrollEvents();
+  }
+  createScrollEvents() {
+    return this.transitions.events.subscribe((e) => {
+      if (e instanceof NavigationStart) {
+        this.store[this.lastId] = this.viewportScroller.getScrollPosition();
+        this.lastSource = e.navigationTrigger;
+        this.restoredId = e.restoredState ? e.restoredState.navigationId : 0;
+      } else if (e instanceof NavigationEnd) {
+        this.lastId = e.id;
+        this.scheduleScrollEvent(e, this.urlSerializer.parse(e.urlAfterRedirects).fragment);
+      } else if (e instanceof NavigationSkipped && e.code === NavigationSkippedCode.IgnoredSameUrlNavigation) {
+        this.lastSource = void 0;
+        this.restoredId = 0;
+        this.scheduleScrollEvent(e, this.urlSerializer.parse(e.url).fragment);
+      }
+    });
+  }
+  consumeScrollEvents() {
+    return this.transitions.events.subscribe((e) => {
+      if (!(e instanceof Scroll)) return;
+      if (e.position) {
+        if (this.options.scrollPositionRestoration === "top") {
+          this.viewportScroller.scrollToPosition([0, 0]);
+        } else if (this.options.scrollPositionRestoration === "enabled") {
+          this.viewportScroller.scrollToPosition(e.position);
+        }
+      } else {
+        if (e.anchor && this.options.anchorScrolling === "enabled") {
+          this.viewportScroller.scrollToAnchor(e.anchor);
+        } else if (this.options.scrollPositionRestoration !== "disabled") {
+          this.viewportScroller.scrollToPosition([0, 0]);
+        }
+      }
+    });
+  }
+  scheduleScrollEvent(routerEvent, anchor) {
+    this.zone.runOutsideAngular(() => __async(this, null, function* () {
+      yield new Promise((resolve) => {
+        setTimeout(resolve);
+        if (typeof requestAnimationFrame !== "undefined") {
+          requestAnimationFrame(resolve);
+        }
+      });
+      this.zone.run(() => {
+        this.transitions.events.next(new Scroll(routerEvent, this.lastSource === "popstate" ? this.store[this.restoredId] : null, anchor));
+      });
+    }));
+  }
+  /** @docs-private */
+  ngOnDestroy() {
+    this.routerEventsSubscription?.unsubscribe();
+    this.scrollEventsSubscription?.unsubscribe();
+  }
+  static ɵfac = function RouterScroller_Factory(__ngFactoryType__) {
+    ɵɵinvalidFactory();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _RouterScroller,
+    factory: _RouterScroller.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterScroller, [{
+    type: Injectable
+  }], () => [{
+    type: UrlSerializer
+  }, {
+    type: NavigationTransitions
+  }, {
+    type: ViewportScroller
+  }, {
+    type: NgZone
+  }, {
+    type: void 0
+  }], null);
+})();
+function provideRouter(routes, ...features) {
+  return makeEnvironmentProviders([{
+    provide: ROUTES,
+    multi: true,
+    useValue: routes
+  }, typeof ngDevMode === "undefined" || ngDevMode ? {
+    provide: ROUTER_IS_PROVIDED,
+    useValue: true
+  } : [], {
+    provide: ActivatedRoute,
+    useFactory: rootRoute,
+    deps: [Router]
+  }, {
+    provide: APP_BOOTSTRAP_LISTENER,
+    multi: true,
+    useFactory: getBootstrapListener
+  }, features.map((feature) => feature.ɵproviders)]);
+}
+function rootRoute(router) {
+  return router.routerState.root;
+}
+function routerFeature(kind, providers) {
+  return {
+    ɵkind: kind,
+    ɵproviders: providers
+  };
+}
+var ROUTER_IS_PROVIDED = new InjectionToken("", {
+  providedIn: "root",
+  factory: () => false
+});
+var routerIsProvidedDevModeCheck = {
+  provide: ENVIRONMENT_INITIALIZER,
+  multi: true,
+  useFactory() {
+    return () => {
+      if (!inject(ROUTER_IS_PROVIDED)) {
+        console.warn("`provideRoutes` was called without `provideRouter` or `RouterModule.forRoot`. This is likely a mistake.");
+      }
+    };
+  }
+};
+function provideRoutes(routes) {
+  return [{
+    provide: ROUTES,
+    multi: true,
+    useValue: routes
+  }, typeof ngDevMode === "undefined" || ngDevMode ? routerIsProvidedDevModeCheck : []];
+}
+function withInMemoryScrolling(options = {}) {
+  const providers = [{
+    provide: ROUTER_SCROLLER,
+    useFactory: () => {
+      const viewportScroller = inject(ViewportScroller);
+      const zone = inject(NgZone);
+      const transitions = inject(NavigationTransitions);
+      const urlSerializer = inject(UrlSerializer);
+      return new RouterScroller(urlSerializer, transitions, viewportScroller, zone, options);
+    }
+  }];
+  return routerFeature(4, providers);
+}
+function getBootstrapListener() {
+  const injector = inject(Injector);
+  return (bootstrappedComponentRef) => {
+    const ref = injector.get(ApplicationRef);
+    if (bootstrappedComponentRef !== ref.components[0]) {
+      return;
+    }
+    const router = injector.get(Router);
+    const bootstrapDone = injector.get(BOOTSTRAP_DONE);
+    if (injector.get(INITIAL_NAVIGATION) === 1) {
+      router.initialNavigation();
+    }
+    injector.get(ROUTER_PRELOADER, null, {
+      optional: true
+    })?.setUpPreloading();
+    injector.get(ROUTER_SCROLLER, null, {
+      optional: true
+    })?.init();
+    router.resetRootComponentType(ref.componentTypes[0]);
+    if (!bootstrapDone.closed) {
+      bootstrapDone.next();
+      bootstrapDone.complete();
+      bootstrapDone.unsubscribe();
+    }
+  };
+}
+var BOOTSTRAP_DONE = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "bootstrap done indicator" : "", {
+  factory: () => {
+    return new Subject();
+  }
+});
+var INITIAL_NAVIGATION = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "initial navigation" : "", {
+  providedIn: "root",
+  factory: () => 1
+  /* InitialNavigation.EnabledNonBlocking */
+});
+function withEnabledBlockingInitialNavigation() {
+  const providers = [{
+    provide: INITIAL_NAVIGATION,
+    useValue: 0
+    /* InitialNavigation.EnabledBlocking */
+  }, provideAppInitializer(() => {
+    const injector = inject(Injector);
+    const locationInitialized = injector.get(LOCATION_INITIALIZED, Promise.resolve());
+    return locationInitialized.then(() => {
+      return new Promise((resolve) => {
+        const router = injector.get(Router);
+        const bootstrapDone = injector.get(BOOTSTRAP_DONE);
+        afterNextNavigation(router, () => {
+          resolve(true);
+        });
+        injector.get(NavigationTransitions).afterPreactivation = () => {
+          resolve(true);
+          return bootstrapDone.closed ? of(void 0) : bootstrapDone;
+        };
+        router.initialNavigation();
+      });
+    });
+  })];
+  return routerFeature(2, providers);
+}
+function withDisabledInitialNavigation() {
+  const providers = [provideAppInitializer(() => {
+    inject(Router).setUpLocationChangeListener();
+  }), {
+    provide: INITIAL_NAVIGATION,
+    useValue: 2
+    /* InitialNavigation.Disabled */
+  }];
+  return routerFeature(3, providers);
+}
+function withDebugTracing() {
+  let providers = [];
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    providers = [{
+      provide: ENVIRONMENT_INITIALIZER,
+      multi: true,
+      useFactory: () => {
+        const router = inject(Router);
+        return () => router.events.subscribe((e) => {
+          console.group?.(`Router Event: ${e.constructor.name}`);
+          console.log(stringifyEvent(e));
+          console.log(e);
+          console.groupEnd?.();
+        });
+      }
+    }];
+  } else {
+    providers = [];
+  }
+  return routerFeature(1, providers);
+}
+var ROUTER_PRELOADER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "router preloader" : "");
+function withPreloading(preloadingStrategy) {
+  const providers = [{
+    provide: ROUTER_PRELOADER,
+    useExisting: RouterPreloader
+  }, {
+    provide: PreloadingStrategy,
+    useExisting: preloadingStrategy
+  }];
+  return routerFeature(0, providers);
+}
+function withRouterConfig(options) {
+  const providers = [{
+    provide: ROUTER_CONFIGURATION,
+    useValue: options
+  }];
+  return routerFeature(5, providers);
+}
+function withHashLocation() {
+  const providers = [{
+    provide: LocationStrategy,
+    useClass: HashLocationStrategy
+  }];
+  return routerFeature(6, providers);
+}
+function withNavigationErrorHandler(handler) {
+  const providers = [{
+    provide: NAVIGATION_ERROR_HANDLER,
+    useValue: handler
+  }];
+  return routerFeature(7, providers);
+}
+function withComponentInputBinding() {
+  const providers = [RoutedComponentInputBinder, {
+    provide: INPUT_BINDER,
+    useExisting: RoutedComponentInputBinder
+  }];
+  return routerFeature(8, providers);
+}
+function withViewTransitions(options) {
+  performanceMarkFeature("NgRouterViewTransitions");
+  const providers = [{
+    provide: CREATE_VIEW_TRANSITION,
+    useValue: createViewTransition
+  }, {
+    provide: VIEW_TRANSITION_OPTIONS,
+    useValue: __spreadValues({
+      skipNextTransition: !!options?.skipInitialTransition
+    }, options)
+  }];
+  return routerFeature(9, providers);
+}
+var ROUTER_DIRECTIVES = [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent];
+var ROUTER_FORROOT_GUARD = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "router duplicate forRoot guard" : "");
+var ROUTER_PROVIDERS = [
+  Location,
+  {
+    provide: UrlSerializer,
+    useClass: DefaultUrlSerializer
+  },
+  Router,
+  ChildrenOutletContexts,
+  {
+    provide: ActivatedRoute,
+    useFactory: rootRoute,
+    deps: [Router]
+  },
+  RouterConfigLoader,
+  // Only used to warn when `provideRoutes` is used without `RouterModule` or `provideRouter`. Can
+  // be removed when `provideRoutes` is removed.
+  typeof ngDevMode === "undefined" || ngDevMode ? {
+    provide: ROUTER_IS_PROVIDED,
+    useValue: true
+  } : []
+];
+var RouterModule = class _RouterModule {
+  constructor() {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      inject(ROUTER_FORROOT_GUARD, {
+        optional: true
+      });
+    }
+  }
+  /**
+   * Creates and configures a module with all the router providers and directives.
+   * Optionally sets up an application listener to perform an initial navigation.
+   *
+   * When registering the NgModule at the root, import as follows:
+   *
+   * ```ts
+   * @NgModule({
+   *   imports: [RouterModule.forRoot(ROUTES)]
+   * })
+   * class MyNgModule {}
+   * ```
+   *
+   * @param routes An array of `Route` objects that define the navigation paths for the application.
+   * @param config An `ExtraOptions` configuration object that controls how navigation is performed.
+   * @return The new `NgModule`.
+   *
+   */
+  static forRoot(routes, config) {
+    return {
+      ngModule: _RouterModule,
+      providers: [ROUTER_PROVIDERS, typeof ngDevMode === "undefined" || ngDevMode ? config?.enableTracing ? withDebugTracing().ɵproviders : [] : [], {
+        provide: ROUTES,
+        multi: true,
+        useValue: routes
+      }, typeof ngDevMode === "undefined" || ngDevMode ? {
+        provide: ROUTER_FORROOT_GUARD,
+        useFactory: provideForRootGuard,
+        deps: [[Router, new Optional(), new SkipSelf()]]
+      } : [], config?.errorHandler ? {
+        provide: NAVIGATION_ERROR_HANDLER,
+        useValue: config.errorHandler
+      } : [], {
+        provide: ROUTER_CONFIGURATION,
+        useValue: config ? config : {}
+      }, config?.useHash ? provideHashLocationStrategy() : providePathLocationStrategy(), provideRouterScroller(), config?.preloadingStrategy ? withPreloading(config.preloadingStrategy).ɵproviders : [], config?.initialNavigation ? provideInitialNavigation(config) : [], config?.bindToComponentInputs ? withComponentInputBinding().ɵproviders : [], config?.enableViewTransitions ? withViewTransitions().ɵproviders : [], provideRouterInitializer()]
+    };
+  }
+  /**
+   * Creates a module with all the router directives and a provider registering routes,
+   * without creating a new Router service.
+   * When registering for submodules and lazy-loaded submodules, create the NgModule as follows:
+   *
+   * ```ts
+   * @NgModule({
+   *   imports: [RouterModule.forChild(ROUTES)]
+   * })
+   * class MyNgModule {}
+   * ```
+   *
+   * @param routes An array of `Route` objects that define the navigation paths for the submodule.
+   * @return The new NgModule.
+   *
+   */
+  static forChild(routes) {
+    return {
+      ngModule: _RouterModule,
+      providers: [{
+        provide: ROUTES,
+        multi: true,
+        useValue: routes
+      }]
+    };
+  }
+  static ɵfac = function RouterModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _RouterModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _RouterModule,
+    imports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent],
+    exports: [RouterOutlet, RouterLink, RouterLinkActive, ɵEmptyOutletComponent]
+  });
+  static ɵinj = ɵɵdefineInjector({});
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(RouterModule, [{
+    type: NgModule,
+    args: [{
+      imports: ROUTER_DIRECTIVES,
+      exports: ROUTER_DIRECTIVES
+    }]
+  }], () => [], null);
+})();
+function provideRouterScroller() {
+  return {
+    provide: ROUTER_SCROLLER,
+    useFactory: () => {
+      const viewportScroller = inject(ViewportScroller);
+      const zone = inject(NgZone);
+      const config = inject(ROUTER_CONFIGURATION);
+      const transitions = inject(NavigationTransitions);
+      const urlSerializer = inject(UrlSerializer);
+      if (config.scrollOffset) {
+        viewportScroller.setOffset(config.scrollOffset);
+      }
+      return new RouterScroller(urlSerializer, transitions, viewportScroller, zone, config);
+    }
+  };
+}
+function provideHashLocationStrategy() {
+  return {
+    provide: LocationStrategy,
+    useClass: HashLocationStrategy
+  };
+}
+function providePathLocationStrategy() {
+  return {
+    provide: LocationStrategy,
+    useClass: PathLocationStrategy
+  };
+}
+function provideForRootGuard(router) {
+  if (router) {
+    throw new RuntimeError(4007, `The Router was provided more than once. This can happen if 'forRoot' is used outside of the root injector. Lazy loaded modules should use RouterModule.forChild() instead.`);
+  }
+  return "guarded";
+}
+function provideInitialNavigation(config) {
+  return [config.initialNavigation === "disabled" ? withDisabledInitialNavigation().ɵproviders : [], config.initialNavigation === "enabledBlocking" ? withEnabledBlockingInitialNavigation().ɵproviders : []];
+}
+var ROUTER_INITIALIZER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "Router Initializer" : "");
+function provideRouterInitializer() {
+  return [
+    // ROUTER_INITIALIZER token should be removed. It's public API but shouldn't be. We can just
+    // have `getBootstrapListener` directly attached to APP_BOOTSTRAP_LISTENER.
+    {
+      provide: ROUTER_INITIALIZER,
+      useFactory: getBootstrapListener
+    },
+    {
+      provide: APP_BOOTSTRAP_LISTENER,
+      multi: true,
+      useExisting: ROUTER_INITIALIZER
+    }
+  ];
+}
+
+// node_modules/@angular/router/fesm2022/router.mjs
+function mapToCanMatch(providers) {
+  return providers.map((provider) => (...params) => inject(provider).canMatch(...params));
+}
+function mapToCanActivate(providers) {
+  return providers.map((provider) => (...params) => inject(provider).canActivate(...params));
+}
+function mapToCanActivateChild(providers) {
+  return providers.map((provider) => (...params) => inject(provider).canActivateChild(...params));
+}
+function mapToCanDeactivate(providers) {
+  return providers.map((provider) => (...params) => inject(provider).canDeactivate(...params));
+}
+function mapToResolve(provider) {
+  return (...params) => inject(provider).resolve(...params);
+}
+var VERSION = new Version("20.0.5");
+export {
+  ActivatedRoute,
+  ActivatedRouteSnapshot,
+  ActivationEnd,
+  ActivationStart,
+  BaseRouteReuseStrategy,
+  ChildActivationEnd,
+  ChildActivationStart,
+  ChildrenOutletContexts,
+  DefaultTitleStrategy,
+  DefaultUrlSerializer,
+  EventType,
+  GuardsCheckEnd,
+  GuardsCheckStart,
+  NavigationCancel,
+  NavigationCancellationCode,
+  NavigationEnd,
+  NavigationError,
+  NavigationSkipped,
+  NavigationSkippedCode,
+  NavigationStart,
+  NoPreloading,
+  OutletContext,
+  PRIMARY_OUTLET,
+  PreloadAllModules,
+  PreloadingStrategy,
+  ROUTER_CONFIGURATION,
+  ROUTER_INITIALIZER,
+  ROUTER_OUTLET_DATA,
+  ROUTES,
+  RedirectCommand,
+  ResolveEnd,
+  ResolveStart,
+  RouteConfigLoadEnd,
+  RouteConfigLoadStart,
+  RouteReuseStrategy,
+  Router,
+  RouterEvent,
+  RouterLink,
+  RouterLinkActive,
+  RouterLink as RouterLinkWithHref,
+  RouterModule,
+  RouterOutlet,
+  RouterPreloader,
+  RouterState,
+  RouterStateSnapshot,
+  RoutesRecognized,
+  Scroll,
+  TitleStrategy,
+  UrlHandlingStrategy,
+  UrlSegment,
+  UrlSegmentGroup,
+  UrlSerializer,
+  UrlTree,
+  VERSION,
+  convertToParamMap,
+  createUrlTreeFromSnapshot,
+  defaultUrlMatcher,
+  mapToCanActivate,
+  mapToCanActivateChild,
+  mapToCanDeactivate,
+  mapToCanMatch,
+  mapToResolve,
+  provideRouter,
+  provideRoutes,
+  withComponentInputBinding,
+  withDebugTracing,
+  withDisabledInitialNavigation,
+  withEnabledBlockingInitialNavigation,
+  withHashLocation,
+  withInMemoryScrolling,
+  withNavigationErrorHandler,
+  withPreloading,
+  withRouterConfig,
+  withViewTransitions,
+  ɵEmptyOutletComponent,
+  ROUTER_PROVIDERS as ɵROUTER_PROVIDERS,
+  afterNextNavigation as ɵafterNextNavigation,
+  loadChildren as ɵloadChildren
+};
+/*! Bundled license information:
+
+@angular/router/fesm2022/router2.mjs:
+@angular/router/fesm2022/router_module.mjs:
+@angular/router/fesm2022/router.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=@angular_router.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/@angular_router.js.map


+ 886 - 0
ai-interview/vite/deps/@fortawesome_angular-fontawesome.js

@@ -0,0 +1,886 @@
+import {
+  config$1,
+  counter,
+  dom$1,
+  icon,
+  parse$1,
+  text
+} from "./chunk-T7KLW67N.js";
+import {
+  DomSanitizer
+} from "./chunk-IA3W2FS3.js";
+import "./chunk-YWBOMLBY.js";
+import "./chunk-NFFN32GK.js";
+import "./chunk-VHSNDQRF.js";
+import "./chunk-OPGNYZHR.js";
+import {
+  ChangeDetectionStrategy,
+  Component,
+  DOCUMENT,
+  Directive,
+  Injectable,
+  NgModule,
+  computed,
+  effect,
+  inject,
+  input,
+  model,
+  setClassMetadata,
+  ɵɵInheritDefinitionFeature,
+  ɵɵattribute,
+  ɵɵclassMap,
+  ɵɵdefineComponent,
+  ɵɵdefineDirective,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵdomProperty,
+  ɵɵgetInheritedFactory,
+  ɵɵprojection,
+  ɵɵprojectionDef,
+  ɵɵsanitizeHtml
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@fortawesome/angular-fontawesome/fesm2022/angular-fontawesome.mjs
+var _c0 = ["*"];
+var FaConfig = class _FaConfig {
+  /**
+   * Default prefix to use, when one is not provided with the icon name.
+   *
+   * @default 'fas'
+   */
+  defaultPrefix = "fas";
+  /**
+   * Provides a fallback icon to use whilst main icon is being loaded asynchronously.
+   * When value is null, then fa-icon component will throw an error if icon input is missing.
+   * When value is not null, then the provided icon will be used as a fallback icon if icon input is missing.
+   *
+   * @default null
+   */
+  fallbackIcon = null;
+  /**
+   * Set icons to the same fixed width.
+   *
+   * @see {@link: https://fontawesome.com/how-to-use/on-the-web/styling/fixed-width-icons}
+   * @default false
+   */
+  fixedWidth;
+  /**
+   * Automatically add Font Awesome styles to the document when icon is rendered.
+   *
+   * For the majority of the cases the automatically added CSS is sufficient,
+   * please refer to the linked guide for more information on when to disable
+   * this feature.
+   *
+   * @see {@link: https://github.com/FortAwesome/angular-fontawesome/blob/main/docs/guide/adding-css.md}
+   * @default true
+   */
+  set autoAddCss(value) {
+    config$1.autoAddCss = value;
+    this._autoAddCss = value;
+  }
+  get autoAddCss() {
+    return this._autoAddCss;
+  }
+  _autoAddCss = true;
+  static ɵfac = function FaConfig_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaConfig)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _FaConfig,
+    factory: _FaConfig.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaConfig, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var FaIconLibrary = class _FaIconLibrary {
+  definitions = {};
+  addIcons(...icons) {
+    for (const icon2 of icons) {
+      if (!(icon2.prefix in this.definitions)) {
+        this.definitions[icon2.prefix] = {};
+      }
+      this.definitions[icon2.prefix][icon2.iconName] = icon2;
+      for (const alias of icon2.icon[2]) {
+        if (typeof alias === "string") {
+          this.definitions[icon2.prefix][alias] = icon2;
+        }
+      }
+    }
+  }
+  addIconPacks(...packs) {
+    for (const pack of packs) {
+      const icons = Object.keys(pack).map((key) => pack[key]);
+      this.addIcons(...icons);
+    }
+  }
+  getIconDefinition(prefix, name) {
+    if (prefix in this.definitions && name in this.definitions[prefix]) {
+      return this.definitions[prefix][name];
+    }
+    return null;
+  }
+  static ɵfac = function FaIconLibrary_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaIconLibrary)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _FaIconLibrary,
+    factory: _FaIconLibrary.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaIconLibrary, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], null, null);
+})();
+var faWarnIfIconDefinitionMissing = (iconSpec) => {
+  throw new Error(`Could not find icon with iconName=${iconSpec.iconName} and prefix=${iconSpec.prefix} in the icon library.`);
+};
+var faWarnIfIconSpecMissing = () => {
+  throw new Error("Property `icon` is required for `fa-icon`/`fa-duotone-icon` components.");
+};
+var isKnownRotateValue = (rotate) => rotate != null && (rotate === 90 || rotate === 180 || rotate === 270 || rotate === "90" || rotate === "180" || rotate === "270");
+var faClassList = (props) => {
+  const knownRotateValue = isKnownRotateValue(props.rotate);
+  const classes = {
+    [`fa-${props.animation}`]: props.animation != null && !props.animation.startsWith("spin"),
+    "fa-spin": props.animation === "spin" || props.animation === "spin-reverse",
+    "fa-spin-pulse": props.animation === "spin-pulse" || props.animation === "spin-pulse-reverse",
+    "fa-spin-reverse": props.animation === "spin-reverse" || props.animation === "spin-pulse-reverse",
+    // According to https://fontawesome.com/docs/web/style/animate#spin fa-pulse
+    // class is deprecated, remove the below line when Font Awesome 5 support
+    // is dropped.
+    "fa-pulse": props.animation === "spin-pulse" || props.animation === "spin-pulse-reverse",
+    "fa-fw": props.fixedWidth,
+    "fa-border": props.border,
+    "fa-inverse": props.inverse,
+    "fa-layers-counter": props.counter,
+    "fa-flip-horizontal": props.flip === "horizontal" || props.flip === "both",
+    "fa-flip-vertical": props.flip === "vertical" || props.flip === "both",
+    [`fa-${props.size}`]: props.size !== null,
+    [`fa-rotate-${props.rotate}`]: knownRotateValue,
+    "fa-rotate-by": props.rotate != null && !knownRotateValue,
+    [`fa-pull-${props.pull}`]: props.pull !== null,
+    [`fa-stack-${props.stackItemSize}`]: props.stackItemSize != null
+  };
+  return Object.keys(classes).map((key) => classes[key] ? key : null).filter((key) => key != null);
+};
+var cssInserted = /* @__PURE__ */ new WeakSet();
+var autoCssId = "fa-auto-css";
+function ensureCss(document, config) {
+  if (!config.autoAddCss) {
+    return;
+  }
+  if (cssInserted.has(document)) {
+    return;
+  }
+  if (document.getElementById(autoCssId) != null) {
+    config.autoAddCss = false;
+    cssInserted.add(document);
+    return;
+  }
+  const style = document.createElement("style");
+  style.setAttribute("type", "text/css");
+  style.setAttribute("id", autoCssId);
+  style.innerHTML = dom$1.css();
+  const headChildren = document.head.childNodes;
+  let beforeChild = null;
+  for (let i = headChildren.length - 1; i > -1; i--) {
+    const child = headChildren[i];
+    const tagName = child.nodeName.toUpperCase();
+    if (["STYLE", "LINK"].indexOf(tagName) > -1) {
+      beforeChild = child;
+    }
+  }
+  document.head.insertBefore(style, beforeChild);
+  config.autoAddCss = false;
+  cssInserted.add(document);
+}
+var isIconLookup = (i) => i.prefix !== void 0 && i.iconName !== void 0;
+var faNormalizeIconSpec = (iconSpec, defaultPrefix) => {
+  if (isIconLookup(iconSpec)) {
+    return iconSpec;
+  }
+  if (Array.isArray(iconSpec) && iconSpec.length === 2) {
+    return {
+      prefix: iconSpec[0],
+      iconName: iconSpec[1]
+    };
+  }
+  return {
+    prefix: defaultPrefix,
+    iconName: iconSpec
+  };
+};
+var FaStackItemSizeDirective = class _FaStackItemSizeDirective {
+  /**
+   * Specify whether icon inside {@link FaStackComponent} should be rendered in
+   * regular size (1x) or as a larger icon (2x).
+   */
+  stackItemSize = input("1x");
+  /**
+   * @internal
+   */
+  size = input();
+  _effect = effect(() => {
+    const size = this.size();
+    if (size) {
+      throw new Error('fa-icon is not allowed to customize size when used inside fa-stack. Set size on the enclosing fa-stack instead: <fa-stack size="4x">...</fa-stack>.');
+    }
+  });
+  static ɵfac = function FaStackItemSizeDirective_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaStackItemSizeDirective)();
+  };
+  static ɵdir = ɵɵdefineDirective({
+    type: _FaStackItemSizeDirective,
+    selectors: [["fa-icon", "stackItemSize", ""], ["fa-duotone-icon", "stackItemSize", ""]],
+    inputs: {
+      stackItemSize: [1, "stackItemSize"],
+      size: [1, "size"]
+    }
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaStackItemSizeDirective, [{
+    type: Directive,
+    args: [{
+      // eslint-disable-next-line @angular-eslint/directive-selector
+      selector: "fa-icon[stackItemSize],fa-duotone-icon[stackItemSize]"
+    }]
+  }], null, null);
+})();
+var FaStackComponent = class _FaStackComponent {
+  /**
+   * Size of the stacked icon.
+   * Note that stacked icon is by default 2 times bigger, than non-stacked icon.
+   * You'll need to set size using custom CSS to align stacked icon with a
+   * simple one. E.g. `fa-stack { font-size: 0.5em; }`.
+   */
+  size = input();
+  classes = computed(() => {
+    const sizeValue = this.size();
+    const sizeClass = sizeValue ? {
+      [`fa-${sizeValue}`]: true
+    } : {};
+    return __spreadProps(__spreadValues({}, sizeClass), {
+      "fa-stack": true
+    });
+  });
+  static ɵfac = function FaStackComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaStackComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaStackComponent,
+    selectors: [["fa-stack"]],
+    hostVars: 2,
+    hostBindings: function FaStackComponent_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵclassMap(ctx.classes());
+      }
+    },
+    inputs: {
+      size: [1, "size"]
+    },
+    ngContentSelectors: _c0,
+    decls: 1,
+    vars: 0,
+    template: function FaStackComponent_Template(rf, ctx) {
+      if (rf & 1) {
+        ɵɵprojectionDef();
+        ɵɵprojection(0);
+      }
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaStackComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-stack",
+      template: `<ng-content></ng-content>`,
+      host: {
+        "[class]": "classes()"
+      },
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], null, null);
+})();
+var FaIconComponent = class _FaIconComponent {
+  icon = model.required();
+  /**
+   * Specify a title for the icon.
+   *
+   * This text will be displayed in a tooltip on hover and presented to the
+   * screen readers.
+   */
+  title = model();
+  /**
+   * Icon animation.
+   *
+   * Most of the animations are only available when using Font Awesome 6. With
+   * Font Awesome 5, only 'spin' and 'spin-pulse' are supported.
+   */
+  animation = model();
+  mask = model();
+  flip = model();
+  size = model();
+  pull = model();
+  border = model();
+  inverse = model();
+  symbol = model();
+  rotate = model();
+  fixedWidth = model();
+  transform = model();
+  /**
+   * Specify the `role` attribute for the rendered <svg> element.
+   *
+   * @default 'img'
+   */
+  a11yRole = model();
+  renderedIconHTML = computed(() => {
+    const iconValue = this.icon();
+    if (iconValue == null && this.config.fallbackIcon == null) {
+      faWarnIfIconSpecMissing();
+      return "";
+    }
+    const iconDefinition = this.findIconDefinition(iconValue ?? this.config.fallbackIcon);
+    if (!iconDefinition) {
+      return "";
+    }
+    const params = this.buildParams();
+    ensureCss(this.document, this.config);
+    const renderedIcon = icon(iconDefinition, params);
+    return this.sanitizer.bypassSecurityTrustHtml(renderedIcon.html.join("\n"));
+  });
+  document = inject(DOCUMENT);
+  sanitizer = inject(DomSanitizer);
+  config = inject(FaConfig);
+  iconLibrary = inject(FaIconLibrary);
+  stackItem = inject(FaStackItemSizeDirective, {
+    optional: true
+  });
+  stack = inject(FaStackComponent, {
+    optional: true
+  });
+  constructor() {
+    if (this.stack != null && this.stackItem == null) {
+      console.error('FontAwesome: fa-icon and fa-duotone-icon elements must specify stackItemSize attribute when wrapped into fa-stack. Example: <fa-icon stackItemSize="2x"></fa-icon>.');
+    }
+  }
+  findIconDefinition(i) {
+    const lookup = faNormalizeIconSpec(i, this.config.defaultPrefix);
+    if ("icon" in lookup) {
+      return lookup;
+    }
+    const definition = this.iconLibrary.getIconDefinition(lookup.prefix, lookup.iconName);
+    if (definition != null) {
+      return definition;
+    }
+    faWarnIfIconDefinitionMissing(lookup);
+    return null;
+  }
+  buildParams() {
+    const fixedWidth = this.fixedWidth();
+    const classOpts = {
+      flip: this.flip(),
+      animation: this.animation(),
+      border: this.border(),
+      inverse: this.inverse(),
+      size: this.size(),
+      pull: this.pull(),
+      rotate: this.rotate(),
+      fixedWidth: typeof fixedWidth === "boolean" ? fixedWidth : this.config.fixedWidth,
+      stackItemSize: this.stackItem != null ? this.stackItem.stackItemSize() : void 0
+    };
+    const transform = this.transform();
+    const parsedTransform = typeof transform === "string" ? parse$1.transform(transform) : transform;
+    const mask = this.mask();
+    const maskIconDefinition = mask != null ? this.findIconDefinition(mask) : null;
+    const attributes = {};
+    const a11yRole = this.a11yRole();
+    if (a11yRole != null) {
+      attributes["role"] = a11yRole;
+    }
+    const styles = {};
+    if (classOpts.rotate != null && !isKnownRotateValue(classOpts.rotate)) {
+      styles["--fa-rotate-angle"] = `${classOpts.rotate}`;
+    }
+    return {
+      title: this.title(),
+      transform: parsedTransform,
+      classes: faClassList(classOpts),
+      mask: maskIconDefinition ?? void 0,
+      symbol: this.symbol(),
+      attributes,
+      styles
+    };
+  }
+  static ɵfac = function FaIconComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaIconComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaIconComponent,
+    selectors: [["fa-icon"]],
+    hostAttrs: [1, "ng-fa-icon"],
+    hostVars: 2,
+    hostBindings: function FaIconComponent_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵdomProperty("innerHTML", ctx.renderedIconHTML(), ɵɵsanitizeHtml);
+        ɵɵattribute("title", ctx.title());
+      }
+    },
+    inputs: {
+      icon: [1, "icon"],
+      title: [1, "title"],
+      animation: [1, "animation"],
+      mask: [1, "mask"],
+      flip: [1, "flip"],
+      size: [1, "size"],
+      pull: [1, "pull"],
+      border: [1, "border"],
+      inverse: [1, "inverse"],
+      symbol: [1, "symbol"],
+      rotate: [1, "rotate"],
+      fixedWidth: [1, "fixedWidth"],
+      transform: [1, "transform"],
+      a11yRole: [1, "a11yRole"]
+    },
+    outputs: {
+      icon: "iconChange",
+      title: "titleChange",
+      animation: "animationChange",
+      mask: "maskChange",
+      flip: "flipChange",
+      size: "sizeChange",
+      pull: "pullChange",
+      border: "borderChange",
+      inverse: "inverseChange",
+      symbol: "symbolChange",
+      rotate: "rotateChange",
+      fixedWidth: "fixedWidthChange",
+      transform: "transformChange",
+      a11yRole: "a11yRoleChange"
+    },
+    decls: 0,
+    vars: 0,
+    template: function FaIconComponent_Template(rf, ctx) {
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaIconComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-icon",
+      template: ``,
+      host: {
+        class: "ng-fa-icon",
+        "[attr.title]": "title()",
+        "[innerHTML]": "renderedIconHTML()"
+      },
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], () => [], null);
+})();
+var FaDuotoneIconComponent = class _FaDuotoneIconComponent extends FaIconComponent {
+  /**
+   * Swap the default opacity of each duotone icon’s layers. This will make an
+   * icon’s primary layer have the default opacity of 40% rather than its
+   * secondary layer.
+   *
+   * @default false
+   */
+  swapOpacity = input();
+  /**
+   * Customize the opacity of the primary icon layer.
+   * Valid values are in range [0, 1.0].
+   *
+   * @default 1.0
+   */
+  primaryOpacity = input();
+  /**
+   * Customize the opacity of the secondary icon layer.
+   * Valid values are in range [0, 1.0].
+   *
+   * @default 0.4
+   */
+  secondaryOpacity = input();
+  /**
+   * Customize the color of the primary icon layer.
+   * Accepts any valid CSS color value.
+   *
+   * @default CSS inherited color
+   */
+  primaryColor = input();
+  /**
+   * Customize the color of the secondary icon layer.
+   * Accepts any valid CSS color value.
+   *
+   * @default CSS inherited color
+   */
+  secondaryColor = input();
+  findIconDefinition(i) {
+    const definition = super.findIconDefinition(i);
+    if (definition != null && !Array.isArray(definition.icon[4])) {
+      throw new Error(`The specified icon does not appear to be a Duotone icon. Check that you specified the correct style: <fa-duotone-icon [icon]="['fad', '${definition.iconName}']"></fa-duotone-icon> or use: <fa-icon icon="${definition.iconName}"></fa-icon> instead.`);
+    }
+    return definition;
+  }
+  buildParams() {
+    const params = super.buildParams();
+    const swapOpacity = this.swapOpacity();
+    if (swapOpacity === true || swapOpacity === "true") {
+      if (Array.isArray(params.classes)) {
+        params.classes.push("fa-swap-opacity");
+      } else if (typeof params.classes === "string") {
+        params.classes = [params.classes, "fa-swap-opacity"];
+      } else {
+        params.classes = ["fa-swap-opacity"];
+      }
+    }
+    if (params.styles == null) {
+      params.styles = {};
+    }
+    const primaryOpacity = this.primaryOpacity();
+    if (primaryOpacity != null) {
+      params.styles["--fa-primary-opacity"] = primaryOpacity.toString();
+    }
+    const secondaryOpacity = this.secondaryOpacity();
+    if (secondaryOpacity != null) {
+      params.styles["--fa-secondary-opacity"] = secondaryOpacity.toString();
+    }
+    const primaryColor = this.primaryColor();
+    if (primaryColor != null) {
+      params.styles["--fa-primary-color"] = primaryColor;
+    }
+    const secondaryColor = this.secondaryColor();
+    if (secondaryColor != null) {
+      params.styles["--fa-secondary-color"] = secondaryColor;
+    }
+    return params;
+  }
+  static ɵfac = /* @__PURE__ */ (() => {
+    let ɵFaDuotoneIconComponent_BaseFactory;
+    return function FaDuotoneIconComponent_Factory(__ngFactoryType__) {
+      return (ɵFaDuotoneIconComponent_BaseFactory || (ɵFaDuotoneIconComponent_BaseFactory = ɵɵgetInheritedFactory(_FaDuotoneIconComponent)))(__ngFactoryType__ || _FaDuotoneIconComponent);
+    };
+  })();
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaDuotoneIconComponent,
+    selectors: [["fa-duotone-icon"]],
+    inputs: {
+      swapOpacity: [1, "swapOpacity"],
+      primaryOpacity: [1, "primaryOpacity"],
+      secondaryOpacity: [1, "secondaryOpacity"],
+      primaryColor: [1, "primaryColor"],
+      secondaryColor: [1, "secondaryColor"]
+    },
+    features: [ɵɵInheritDefinitionFeature],
+    decls: 0,
+    vars: 0,
+    template: function FaDuotoneIconComponent_Template(rf, ctx) {
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaDuotoneIconComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-duotone-icon",
+      template: ``,
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], null, null);
+})();
+var faWarnIfParentNotExist = (parent, parentName, childName) => {
+  if (!parent) {
+    throw new Error(`${childName} should be used as child of ${parentName} only.`);
+  }
+};
+var FaLayersComponent = class _FaLayersComponent {
+  size = input();
+  fixedWidth = input();
+  faFw = computed(() => {
+    const fixedWidth = this.fixedWidth();
+    return typeof fixedWidth === "boolean" ? fixedWidth : this.config.fixedWidth;
+  });
+  classes = computed(() => {
+    const sizeValue = this.size();
+    const sizeClass = sizeValue ? {
+      [`fa-${sizeValue}`]: true
+    } : {};
+    return __spreadProps(__spreadValues({}, sizeClass), {
+      "fa-fw": this.faFw(),
+      "fa-layers": true
+    });
+  });
+  document = inject(DOCUMENT);
+  config = inject(FaConfig);
+  ngOnInit() {
+    ensureCss(this.document, this.config);
+  }
+  static ɵfac = function FaLayersComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaLayersComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaLayersComponent,
+    selectors: [["fa-layers"]],
+    hostVars: 2,
+    hostBindings: function FaLayersComponent_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵclassMap(ctx.classes());
+      }
+    },
+    inputs: {
+      size: [1, "size"],
+      fixedWidth: [1, "fixedWidth"]
+    },
+    ngContentSelectors: _c0,
+    decls: 1,
+    vars: 0,
+    template: function FaLayersComponent_Template(rf, ctx) {
+      if (rf & 1) {
+        ɵɵprojectionDef();
+        ɵɵprojection(0);
+      }
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaLayersComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-layers",
+      template: `<ng-content></ng-content>`,
+      host: {
+        "[class]": "classes()"
+      },
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], null, null);
+})();
+var FaLayersCounterComponent = class _FaLayersCounterComponent {
+  content = input.required();
+  title = input();
+  position = input();
+  renderedHTML = computed(() => {
+    const params = this.buildParams();
+    return this.updateContent(params);
+  });
+  document = inject(DOCUMENT);
+  config = inject(FaConfig);
+  parent = inject(FaLayersComponent, {
+    optional: true
+  });
+  sanitizer = inject(DomSanitizer);
+  constructor() {
+    faWarnIfParentNotExist(this.parent, "FaLayersComponent", this.constructor.name);
+  }
+  buildParams() {
+    const position = this.position();
+    return {
+      title: this.title(),
+      classes: position != null ? [`fa-layers-${position}`] : void 0
+    };
+  }
+  updateContent(params) {
+    ensureCss(this.document, this.config);
+    return this.sanitizer.bypassSecurityTrustHtml(counter(this.content() || "", params).html.join(""));
+  }
+  static ɵfac = function FaLayersCounterComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaLayersCounterComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaLayersCounterComponent,
+    selectors: [["fa-layers-counter"]],
+    hostAttrs: [1, "ng-fa-layers-counter"],
+    hostVars: 1,
+    hostBindings: function FaLayersCounterComponent_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵdomProperty("innerHTML", ctx.renderedHTML(), ɵɵsanitizeHtml);
+      }
+    },
+    inputs: {
+      content: [1, "content"],
+      title: [1, "title"],
+      position: [1, "position"]
+    },
+    decls: 0,
+    vars: 0,
+    template: function FaLayersCounterComponent_Template(rf, ctx) {
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaLayersCounterComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-layers-counter",
+      template: "",
+      host: {
+        class: "ng-fa-layers-counter",
+        "[innerHTML]": "renderedHTML()"
+      },
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], () => [], null);
+})();
+var FaLayersTextComponent = class _FaLayersTextComponent {
+  content = input.required();
+  title = input();
+  flip = input();
+  size = input();
+  pull = input();
+  border = input();
+  inverse = input();
+  rotate = input();
+  fixedWidth = input();
+  transform = input();
+  renderedHTML = computed(() => {
+    const params = this.buildParams();
+    return this.updateContent(params);
+  });
+  document = inject(DOCUMENT);
+  config = inject(FaConfig);
+  parent = inject(FaLayersComponent, {
+    optional: true
+  });
+  sanitizer = inject(DomSanitizer);
+  constructor() {
+    faWarnIfParentNotExist(this.parent, "FaLayersComponent", this.constructor.name);
+  }
+  /**
+   * Updating params by component props.
+   */
+  buildParams() {
+    const classOpts = {
+      flip: this.flip(),
+      border: this.border(),
+      inverse: this.inverse(),
+      size: this.size(),
+      pull: this.pull(),
+      rotate: this.rotate(),
+      fixedWidth: this.fixedWidth()
+    };
+    const transform = this.transform();
+    const parsedTransform = typeof transform === "string" ? parse$1.transform(transform) : transform;
+    const styles = {};
+    if (classOpts.rotate != null && !isKnownRotateValue(classOpts.rotate)) {
+      styles["--fa-rotate-angle"] = `${classOpts.rotate}`;
+    }
+    return {
+      transform: parsedTransform,
+      classes: faClassList(classOpts),
+      title: this.title(),
+      styles
+    };
+  }
+  updateContent(params) {
+    ensureCss(this.document, this.config);
+    return this.sanitizer.bypassSecurityTrustHtml(text(this.content() || "", params).html.join("\n"));
+  }
+  static ɵfac = function FaLayersTextComponent_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FaLayersTextComponent)();
+  };
+  static ɵcmp = ɵɵdefineComponent({
+    type: _FaLayersTextComponent,
+    selectors: [["fa-layers-text"]],
+    hostAttrs: [1, "ng-fa-layers-text"],
+    hostVars: 1,
+    hostBindings: function FaLayersTextComponent_HostBindings(rf, ctx) {
+      if (rf & 2) {
+        ɵɵdomProperty("innerHTML", ctx.renderedHTML(), ɵɵsanitizeHtml);
+      }
+    },
+    inputs: {
+      content: [1, "content"],
+      title: [1, "title"],
+      flip: [1, "flip"],
+      size: [1, "size"],
+      pull: [1, "pull"],
+      border: [1, "border"],
+      inverse: [1, "inverse"],
+      rotate: [1, "rotate"],
+      fixedWidth: [1, "fixedWidth"],
+      transform: [1, "transform"]
+    },
+    decls: 0,
+    vars: 0,
+    template: function FaLayersTextComponent_Template(rf, ctx) {
+    },
+    encapsulation: 2,
+    changeDetection: 0
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FaLayersTextComponent, [{
+    type: Component,
+    args: [{
+      selector: "fa-layers-text",
+      template: "",
+      host: {
+        class: "ng-fa-layers-text",
+        "[innerHTML]": "renderedHTML()"
+      },
+      changeDetection: ChangeDetectionStrategy.OnPush
+    }]
+  }], () => [], null);
+})();
+var FontAwesomeModule = class _FontAwesomeModule {
+  static ɵfac = function FontAwesomeModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FontAwesomeModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _FontAwesomeModule,
+    imports: [FaIconComponent, FaDuotoneIconComponent, FaLayersComponent, FaLayersTextComponent, FaLayersCounterComponent, FaStackComponent, FaStackItemSizeDirective],
+    exports: [FaIconComponent, FaDuotoneIconComponent, FaLayersComponent, FaLayersTextComponent, FaLayersCounterComponent, FaStackComponent, FaStackItemSizeDirective]
+  });
+  static ɵinj = ɵɵdefineInjector({});
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FontAwesomeModule, [{
+    type: NgModule,
+    args: [{
+      imports: [FaIconComponent, FaDuotoneIconComponent, FaLayersComponent, FaLayersTextComponent, FaLayersCounterComponent, FaStackComponent, FaStackItemSizeDirective],
+      exports: [FaIconComponent, FaDuotoneIconComponent, FaLayersComponent, FaLayersTextComponent, FaLayersCounterComponent, FaStackComponent, FaStackItemSizeDirective]
+    }]
+  }], null, null);
+})();
+export {
+  FaConfig,
+  FaDuotoneIconComponent,
+  FaIconComponent,
+  FaIconLibrary,
+  FaLayersComponent,
+  FaLayersCounterComponent,
+  FaLayersTextComponent,
+  FaStackComponent,
+  FaStackItemSizeDirective,
+  FontAwesomeModule
+};
+//# sourceMappingURL=@fortawesome_angular-fontawesome.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/@fortawesome_angular-fontawesome.js.map


+ 29 - 0
ai-interview/vite/deps/@fortawesome_fontawesome-svg-core.js

@@ -0,0 +1,29 @@
+import {
+  api,
+  config$1,
+  counter,
+  dom$1,
+  findIconDefinition$1,
+  icon,
+  layer,
+  library$1,
+  noAuto$1,
+  parse$1,
+  text,
+  toHtml$1
+} from "./chunk-T7KLW67N.js";
+import "./chunk-WDMUDEB6.js";
+export {
+  api,
+  config$1 as config,
+  counter,
+  dom$1 as dom,
+  findIconDefinition$1 as findIconDefinition,
+  icon,
+  layer,
+  library$1 as library,
+  noAuto$1 as noAuto,
+  parse$1 as parse,
+  text,
+  toHtml$1 as toHtml
+};

+ 7 - 0
ai-interview/vite/deps/@fortawesome_fontawesome-svg-core.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 366 - 0
ai-interview/vite/deps/@fortawesome_free-solid-svg-icons.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/@fortawesome_free-solid-svg-icons.js.map


+ 106 - 0
ai-interview/vite/deps/_metadata.json

@@ -0,0 +1,106 @@
+{
+  "hash": "3e62cdbf",
+  "configHash": "212f4764",
+  "lockfileHash": "67e957ad",
+  "browserHash": "c9dbf4d9",
+  "optimized": {
+    "@angular/common": {
+      "src": "../../../../../../node_modules/@angular/common/fesm2022/common.mjs",
+      "file": "@angular_common.js",
+      "fileHash": "ba76f9b6",
+      "needsInterop": false
+    },
+    "@angular/common/http": {
+      "src": "../../../../../../node_modules/@angular/common/fesm2022/http.mjs",
+      "file": "@angular_common_http.js",
+      "fileHash": "520ac589",
+      "needsInterop": false
+    },
+    "@angular/core": {
+      "src": "../../../../../../node_modules/@angular/core/fesm2022/core.mjs",
+      "file": "@angular_core.js",
+      "fileHash": "30041d03",
+      "needsInterop": false
+    },
+    "@angular/forms": {
+      "src": "../../../../../../node_modules/@angular/forms/fesm2022/forms.mjs",
+      "file": "@angular_forms.js",
+      "fileHash": "a43d0bf7",
+      "needsInterop": false
+    },
+    "@angular/platform-browser": {
+      "src": "../../../../../../node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs",
+      "file": "@angular_platform-browser.js",
+      "fileHash": "7a2456f7",
+      "needsInterop": false
+    },
+    "@angular/platform-browser/animations": {
+      "src": "../../../../../../node_modules/@angular/platform-browser/fesm2022/animations.mjs",
+      "file": "@angular_platform-browser_animations.js",
+      "fileHash": "fe57afe8",
+      "needsInterop": false
+    },
+    "@angular/router": {
+      "src": "../../../../../../node_modules/@angular/router/fesm2022/router.mjs",
+      "file": "@angular_router.js",
+      "fileHash": "f34c3c56",
+      "needsInterop": false
+    },
+    "@fortawesome/angular-fontawesome": {
+      "src": "../../../../../../node_modules/@fortawesome/angular-fontawesome/fesm2022/angular-fontawesome.mjs",
+      "file": "@fortawesome_angular-fontawesome.js",
+      "fileHash": "79a367cf",
+      "needsInterop": false
+    },
+    "@fortawesome/fontawesome-svg-core": {
+      "src": "../../../../../../node_modules/@fortawesome/fontawesome-svg-core/index.mjs",
+      "file": "@fortawesome_fontawesome-svg-core.js",
+      "fileHash": "d01d0dfe",
+      "needsInterop": false
+    },
+    "@fortawesome/free-solid-svg-icons": {
+      "src": "../../../../../../node_modules/@fortawesome/free-solid-svg-icons/index.mjs",
+      "file": "@fortawesome_free-solid-svg-icons.js",
+      "fileHash": "cf05f215",
+      "needsInterop": false
+    },
+    "swiper": {
+      "src": "../../../../../../node_modules/swiper/swiper.mjs",
+      "file": "swiper.js",
+      "fileHash": "a775aa09",
+      "needsInterop": false
+    },
+    "zone.js": {
+      "src": "../../../../../../node_modules/zone.js/fesm2015/zone.js",
+      "file": "zone__js.js",
+      "fileHash": "4ad00ee3",
+      "needsInterop": true
+    }
+  },
+  "chunks": {
+    "chunk-T7KLW67N": {
+      "file": "chunk-T7KLW67N.js"
+    },
+    "chunk-IA3W2FS3": {
+      "file": "chunk-IA3W2FS3.js"
+    },
+    "chunk-YWBOMLBY": {
+      "file": "chunk-YWBOMLBY.js"
+    },
+    "chunk-NFFN32GK": {
+      "file": "chunk-NFFN32GK.js"
+    },
+    "chunk-VHSNDQRF": {
+      "file": "chunk-VHSNDQRF.js"
+    },
+    "chunk-OPGNYZHR": {
+      "file": "chunk-OPGNYZHR.js"
+    },
+    "chunk-Y7NS2SYH": {
+      "file": "chunk-Y7NS2SYH.js"
+    },
+    "chunk-WDMUDEB6": {
+      "file": "chunk-WDMUDEB6.js"
+    }
+  }
+}

+ 821 - 0
ai-interview/vite/deps/chunk-IA3W2FS3.js

@@ -0,0 +1,821 @@
+import {
+  withHttpTransferCache
+} from "./chunk-YWBOMLBY.js";
+import {
+  EVENT_MANAGER_PLUGINS,
+  EventManagerPlugin
+} from "./chunk-NFFN32GK.js";
+import {
+  getDOM
+} from "./chunk-VHSNDQRF.js";
+import {
+  ApplicationRef,
+  Console,
+  DOCUMENT,
+  ENVIRONMENT_INITIALIZER,
+  Inject,
+  Injectable,
+  InjectionToken,
+  Injector,
+  NgModule,
+  NgZone,
+  Optional,
+  RuntimeError,
+  SecurityContext,
+  Version,
+  XSS_SECURITY_URL,
+  ZONELESS_ENABLED,
+  _global,
+  _sanitizeHtml,
+  _sanitizeUrl,
+  allowSanitizationBypassAndThrow,
+  bypassSanitizationTrustHtml,
+  bypassSanitizationTrustResourceUrl,
+  bypassSanitizationTrustScript,
+  bypassSanitizationTrustStyle,
+  bypassSanitizationTrustUrl,
+  formatRuntimeError,
+  forwardRef,
+  inject,
+  makeEnvironmentProviders,
+  setClassMetadata,
+  unwrapSafeValue,
+  withDomHydration,
+  withEventReplay,
+  withI18nSupport,
+  withIncrementalHydration,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵinject
+} from "./chunk-Y7NS2SYH.js";
+
+// node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs
+var Meta = class _Meta {
+  _doc;
+  _dom;
+  constructor(_doc) {
+    this._doc = _doc;
+    this._dom = getDOM();
+  }
+  /**
+   * Retrieves or creates a specific `<meta>` tag element in the current HTML document.
+   * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
+   * values in the provided tag definition, and verifies that all other attribute values are equal.
+   * If an existing element is found, it is returned and is not modified in any way.
+   * @param tag The definition of a `<meta>` element to match or create.
+   * @param forceCreation True to create a new element without checking whether one already exists.
+   * @returns The existing element with the same attributes and values if found,
+   * the new element if no match is found, or `null` if the tag parameter is not defined.
+   */
+  addTag(tag, forceCreation = false) {
+    if (!tag) return null;
+    return this._getOrCreateElement(tag, forceCreation);
+  }
+  /**
+   * Retrieves or creates a set of `<meta>` tag elements in the current HTML document.
+   * In searching for an existing tag, Angular attempts to match the `name` or `property` attribute
+   * values in the provided tag definition, and verifies that all other attribute values are equal.
+   * @param tags An array of tag definitions to match or create.
+   * @param forceCreation True to create new elements without checking whether they already exist.
+   * @returns The matching elements if found, or the new elements.
+   */
+  addTags(tags, forceCreation = false) {
+    if (!tags) return [];
+    return tags.reduce((result, tag) => {
+      if (tag) {
+        result.push(this._getOrCreateElement(tag, forceCreation));
+      }
+      return result;
+    }, []);
+  }
+  /**
+   * Retrieves a `<meta>` tag element in the current HTML document.
+   * @param attrSelector The tag attribute and value to match against, in the format
+   * `"tag_attribute='value string'"`.
+   * @returns The matching element, if any.
+   */
+  getTag(attrSelector) {
+    if (!attrSelector) return null;
+    return this._doc.querySelector(`meta[${attrSelector}]`) || null;
+  }
+  /**
+   * Retrieves a set of `<meta>` tag elements in the current HTML document.
+   * @param attrSelector The tag attribute and value to match against, in the format
+   * `"tag_attribute='value string'"`.
+   * @returns The matching elements, if any.
+   */
+  getTags(attrSelector) {
+    if (!attrSelector) return [];
+    const list = this._doc.querySelectorAll(`meta[${attrSelector}]`);
+    return list ? [].slice.call(list) : [];
+  }
+  /**
+   * Modifies an existing `<meta>` tag element in the current HTML document.
+   * @param tag The tag description with which to replace the existing tag content.
+   * @param selector A tag attribute and value to match against, to identify
+   * an existing tag. A string in the format `"tag_attribute=`value string`"`.
+   * If not supplied, matches a tag with the same `name` or `property` attribute value as the
+   * replacement tag.
+   * @return The modified element.
+   */
+  updateTag(tag, selector) {
+    if (!tag) return null;
+    selector = selector || this._parseSelector(tag);
+    const meta = this.getTag(selector);
+    if (meta) {
+      return this._setMetaElementAttributes(tag, meta);
+    }
+    return this._getOrCreateElement(tag, true);
+  }
+  /**
+   * Removes an existing `<meta>` tag element from the current HTML document.
+   * @param attrSelector A tag attribute and value to match against, to identify
+   * an existing tag. A string in the format `"tag_attribute=`value string`"`.
+   */
+  removeTag(attrSelector) {
+    this.removeTagElement(this.getTag(attrSelector));
+  }
+  /**
+   * Removes an existing `<meta>` tag element from the current HTML document.
+   * @param meta The tag definition to match against to identify an existing tag.
+   */
+  removeTagElement(meta) {
+    if (meta) {
+      this._dom.remove(meta);
+    }
+  }
+  _getOrCreateElement(meta, forceCreation = false) {
+    if (!forceCreation) {
+      const selector = this._parseSelector(meta);
+      const elem = this.getTags(selector).filter((elem2) => this._containsAttributes(meta, elem2))[0];
+      if (elem !== void 0) return elem;
+    }
+    const element = this._dom.createElement("meta");
+    this._setMetaElementAttributes(meta, element);
+    const head = this._doc.getElementsByTagName("head")[0];
+    head.appendChild(element);
+    return element;
+  }
+  _setMetaElementAttributes(tag, el) {
+    Object.keys(tag).forEach((prop) => el.setAttribute(this._getMetaKeyMap(prop), tag[prop]));
+    return el;
+  }
+  _parseSelector(tag) {
+    const attr = tag.name ? "name" : "property";
+    return `${attr}="${tag[attr]}"`;
+  }
+  _containsAttributes(tag, elem) {
+    return Object.keys(tag).every((key) => elem.getAttribute(this._getMetaKeyMap(key)) === tag[key]);
+  }
+  _getMetaKeyMap(prop) {
+    return META_KEYS_MAP[prop] || prop;
+  }
+  static ɵfac = function Meta_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Meta)(ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _Meta,
+    factory: _Meta.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Meta, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+var META_KEYS_MAP = {
+  httpEquiv: "http-equiv"
+};
+var Title = class _Title {
+  _doc;
+  constructor(_doc) {
+    this._doc = _doc;
+  }
+  /**
+   * Get the title of the current HTML document.
+   */
+  getTitle() {
+    return this._doc.title;
+  }
+  /**
+   * Set the title of the current HTML document.
+   * @param newTitle
+   */
+  setTitle(newTitle) {
+    this._doc.title = newTitle || "";
+  }
+  static ɵfac = function Title_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Title)(ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _Title,
+    factory: _Title.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Title, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+function exportNgVar(name, value) {
+  if (typeof COMPILED === "undefined" || !COMPILED) {
+    const ng = _global["ng"] = _global["ng"] || {};
+    ng[name] = value;
+  }
+}
+var ChangeDetectionPerfRecord = class {
+  msPerTick;
+  numTicks;
+  constructor(msPerTick, numTicks) {
+    this.msPerTick = msPerTick;
+    this.numTicks = numTicks;
+  }
+};
+var AngularProfiler = class {
+  appRef;
+  constructor(ref) {
+    this.appRef = ref.injector.get(ApplicationRef);
+  }
+  // tslint:disable:no-console
+  /**
+   * Exercises change detection in a loop and then prints the average amount of
+   * time in milliseconds how long a single round of change detection takes for
+   * the current state of the UI. It runs a minimum of 5 rounds for a minimum
+   * of 500 milliseconds.
+   *
+   * Optionally, a user may pass a `config` parameter containing a map of
+   * options. Supported options are:
+   *
+   * `record` (boolean) - causes the profiler to record a CPU profile while
+   * it exercises the change detector. Example:
+   *
+   * ```ts
+   * ng.profiler.timeChangeDetection({record: true})
+   * ```
+   */
+  timeChangeDetection(config) {
+    const record = config && config["record"];
+    const profileName = "Change Detection";
+    if (record && "profile" in console && typeof console.profile === "function") {
+      console.profile(profileName);
+    }
+    const start = performance.now();
+    let numTicks = 0;
+    while (numTicks < 5 || performance.now() - start < 500) {
+      this.appRef.tick();
+      numTicks++;
+    }
+    const end = performance.now();
+    if (record && "profileEnd" in console && typeof console.profileEnd === "function") {
+      console.profileEnd(profileName);
+    }
+    const msPerTick = (end - start) / numTicks;
+    console.log(`ran ${numTicks} change detection cycles`);
+    console.log(`${msPerTick.toFixed(2)} ms per check`);
+    return new ChangeDetectionPerfRecord(msPerTick, numTicks);
+  }
+};
+var PROFILER_GLOBAL_NAME = "profiler";
+function enableDebugTools(ref) {
+  exportNgVar(PROFILER_GLOBAL_NAME, new AngularProfiler(ref));
+  return ref;
+}
+function disableDebugTools() {
+  exportNgVar(PROFILER_GLOBAL_NAME, null);
+}
+var By = class {
+  /**
+   * Match all nodes.
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_all'}
+   */
+  static all() {
+    return () => true;
+  }
+  /**
+   * Match elements by the given CSS selector.
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_css'}
+   */
+  static css(selector) {
+    return (debugElement) => {
+      return debugElement.nativeElement != null ? elementMatches(debugElement.nativeElement, selector) : false;
+    };
+  }
+  /**
+   * Match nodes that have the given directive present.
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * {@example platform-browser/dom/debug/ts/by/by.ts region='by_directive'}
+   */
+  static directive(type) {
+    return (debugNode) => debugNode.providerTokens.indexOf(type) !== -1;
+  }
+};
+function elementMatches(n, selector) {
+  if (getDOM().isElementNode(n)) {
+    return n.matches && n.matches(selector) || n.msMatchesSelector && n.msMatchesSelector(selector) || n.webkitMatchesSelector && n.webkitMatchesSelector(selector);
+  }
+  return false;
+}
+var EVENT_NAMES = {
+  // pan
+  "pan": true,
+  "panstart": true,
+  "panmove": true,
+  "panend": true,
+  "pancancel": true,
+  "panleft": true,
+  "panright": true,
+  "panup": true,
+  "pandown": true,
+  // pinch
+  "pinch": true,
+  "pinchstart": true,
+  "pinchmove": true,
+  "pinchend": true,
+  "pinchcancel": true,
+  "pinchin": true,
+  "pinchout": true,
+  // press
+  "press": true,
+  "pressup": true,
+  // rotate
+  "rotate": true,
+  "rotatestart": true,
+  "rotatemove": true,
+  "rotateend": true,
+  "rotatecancel": true,
+  // swipe
+  "swipe": true,
+  "swipeleft": true,
+  "swiperight": true,
+  "swipeup": true,
+  "swipedown": true,
+  // tap
+  "tap": true,
+  "doubletap": true
+};
+var HAMMER_GESTURE_CONFIG = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "HammerGestureConfig" : "");
+var HAMMER_LOADER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "HammerLoader" : "");
+var HammerGestureConfig = class _HammerGestureConfig {
+  /**
+   * A set of supported event names for gestures to be used in Angular.
+   * Angular supports all built-in recognizers, as listed in
+   * [HammerJS documentation](https://hammerjs.github.io/).
+   */
+  events = [];
+  /**
+   * Maps gesture event names to a set of configuration options
+   * that specify overrides to the default values for specific properties.
+   *
+   * The key is a supported event name to be configured,
+   * and the options object contains a set of properties, with override values
+   * to be applied to the named recognizer event.
+   * For example, to disable recognition of the rotate event, specify
+   *  `{"rotate": {"enable": false}}`.
+   *
+   * Properties that are not present take the HammerJS default values.
+   * For information about which properties are supported for which events,
+   * and their allowed and default values, see
+   * [HammerJS documentation](https://hammerjs.github.io/).
+   *
+   */
+  overrides = {};
+  /**
+   * Properties whose default values can be overridden for a given event.
+   * Different sets of properties apply to different events.
+   * For information about which properties are supported for which events,
+   * and their allowed and default values, see
+   * [HammerJS documentation](https://hammerjs.github.io/).
+   */
+  options;
+  /**
+   * Creates a [HammerJS Manager](https://hammerjs.github.io/api/#hammermanager)
+   * and attaches it to a given HTML element.
+   * @param element The element that will recognize gestures.
+   * @returns A HammerJS event-manager object.
+   */
+  buildHammer(element) {
+    const mc = new Hammer(element, this.options);
+    mc.get("pinch").set({
+      enable: true
+    });
+    mc.get("rotate").set({
+      enable: true
+    });
+    for (const eventName in this.overrides) {
+      mc.get(eventName).set(this.overrides[eventName]);
+    }
+    return mc;
+  }
+  static ɵfac = function HammerGestureConfig_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HammerGestureConfig)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HammerGestureConfig,
+    factory: _HammerGestureConfig.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGestureConfig, [{
+    type: Injectable
+  }], null, null);
+})();
+var HammerGesturesPlugin = class _HammerGesturesPlugin extends EventManagerPlugin {
+  _config;
+  _injector;
+  loader;
+  _loaderPromise = null;
+  constructor(doc, _config, _injector, loader) {
+    super(doc);
+    this._config = _config;
+    this._injector = _injector;
+    this.loader = loader;
+  }
+  supports(eventName) {
+    if (!EVENT_NAMES.hasOwnProperty(eventName.toLowerCase()) && !this.isCustomEvent(eventName)) {
+      return false;
+    }
+    if (!window.Hammer && !this.loader) {
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        const _console = this._injector.get(Console);
+        _console.warn(`The "${eventName}" event cannot be bound because Hammer.JS is not loaded and no custom loader has been specified.`);
+      }
+      return false;
+    }
+    return true;
+  }
+  addEventListener(element, eventName, handler) {
+    const zone = this.manager.getZone();
+    eventName = eventName.toLowerCase();
+    if (!window.Hammer && this.loader) {
+      this._loaderPromise = this._loaderPromise || zone.runOutsideAngular(() => this.loader());
+      let cancelRegistration = false;
+      let deregister = () => {
+        cancelRegistration = true;
+      };
+      zone.runOutsideAngular(() => this._loaderPromise.then(() => {
+        if (!window.Hammer) {
+          if (typeof ngDevMode === "undefined" || ngDevMode) {
+            const _console = this._injector.get(Console);
+            _console.warn(`The custom HAMMER_LOADER completed, but Hammer.JS is not present.`);
+          }
+          deregister = () => {
+          };
+          return;
+        }
+        if (!cancelRegistration) {
+          deregister = this.addEventListener(element, eventName, handler);
+        }
+      }).catch(() => {
+        if (typeof ngDevMode === "undefined" || ngDevMode) {
+          const _console = this._injector.get(Console);
+          _console.warn(`The "${eventName}" event cannot be bound because the custom Hammer.JS loader failed.`);
+        }
+        deregister = () => {
+        };
+      }));
+      return () => {
+        deregister();
+      };
+    }
+    return zone.runOutsideAngular(() => {
+      const mc = this._config.buildHammer(element);
+      const callback = function(eventObj) {
+        zone.runGuarded(function() {
+          handler(eventObj);
+        });
+      };
+      mc.on(eventName, callback);
+      return () => {
+        mc.off(eventName, callback);
+        if (typeof mc.destroy === "function") {
+          mc.destroy();
+        }
+      };
+    });
+  }
+  isCustomEvent(eventName) {
+    return this._config.events.indexOf(eventName) > -1;
+  }
+  static ɵfac = function HammerGesturesPlugin_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HammerGesturesPlugin)(ɵɵinject(DOCUMENT), ɵɵinject(HAMMER_GESTURE_CONFIG), ɵɵinject(Injector), ɵɵinject(HAMMER_LOADER, 8));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HammerGesturesPlugin,
+    factory: _HammerGesturesPlugin.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerGesturesPlugin, [{
+    type: Injectable
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }, {
+    type: HammerGestureConfig,
+    decorators: [{
+      type: Inject,
+      args: [HAMMER_GESTURE_CONFIG]
+    }]
+  }, {
+    type: Injector
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Optional
+    }, {
+      type: Inject,
+      args: [HAMMER_LOADER]
+    }]
+  }], null);
+})();
+var HammerModule = class _HammerModule {
+  static ɵfac = function HammerModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HammerModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _HammerModule
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: [{
+      provide: EVENT_MANAGER_PLUGINS,
+      useClass: HammerGesturesPlugin,
+      multi: true,
+      deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]
+    }, {
+      provide: HAMMER_GESTURE_CONFIG,
+      useClass: HammerGestureConfig
+    }]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HammerModule, [{
+    type: NgModule,
+    args: [{
+      providers: [{
+        provide: EVENT_MANAGER_PLUGINS,
+        useClass: HammerGesturesPlugin,
+        multi: true,
+        deps: [DOCUMENT, HAMMER_GESTURE_CONFIG, Injector, [new Optional(), HAMMER_LOADER]]
+      }, {
+        provide: HAMMER_GESTURE_CONFIG,
+        useClass: HammerGestureConfig
+      }]
+    }]
+  }], null, null);
+})();
+var DomSanitizer = class _DomSanitizer {
+  static ɵfac = function DomSanitizer_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DomSanitizer)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DomSanitizer,
+    factory: function DomSanitizer_Factory(__ngFactoryType__) {
+      let __ngConditionalFactory__ = null;
+      if (__ngFactoryType__) {
+        __ngConditionalFactory__ = new (__ngFactoryType__ || _DomSanitizer)();
+      } else {
+        __ngConditionalFactory__ = ɵɵinject(DomSanitizerImpl);
+      }
+      return __ngConditionalFactory__;
+    },
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizer, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root",
+      useExisting: forwardRef(() => DomSanitizerImpl)
+    }]
+  }], null, null);
+})();
+var DomSanitizerImpl = class _DomSanitizerImpl extends DomSanitizer {
+  _doc;
+  constructor(_doc) {
+    super();
+    this._doc = _doc;
+  }
+  sanitize(ctx, value) {
+    if (value == null) return null;
+    switch (ctx) {
+      case SecurityContext.NONE:
+        return value;
+      case SecurityContext.HTML:
+        if (allowSanitizationBypassAndThrow(
+          value,
+          "HTML"
+          /* BypassType.Html */
+        )) {
+          return unwrapSafeValue(value);
+        }
+        return _sanitizeHtml(this._doc, String(value)).toString();
+      case SecurityContext.STYLE:
+        if (allowSanitizationBypassAndThrow(
+          value,
+          "Style"
+          /* BypassType.Style */
+        )) {
+          return unwrapSafeValue(value);
+        }
+        return value;
+      case SecurityContext.SCRIPT:
+        if (allowSanitizationBypassAndThrow(
+          value,
+          "Script"
+          /* BypassType.Script */
+        )) {
+          return unwrapSafeValue(value);
+        }
+        throw new RuntimeError(5200, (typeof ngDevMode === "undefined" || ngDevMode) && "unsafe value used in a script context");
+      case SecurityContext.URL:
+        if (allowSanitizationBypassAndThrow(
+          value,
+          "URL"
+          /* BypassType.Url */
+        )) {
+          return unwrapSafeValue(value);
+        }
+        return _sanitizeUrl(String(value));
+      case SecurityContext.RESOURCE_URL:
+        if (allowSanitizationBypassAndThrow(
+          value,
+          "ResourceURL"
+          /* BypassType.ResourceUrl */
+        )) {
+          return unwrapSafeValue(value);
+        }
+        throw new RuntimeError(5201, (typeof ngDevMode === "undefined" || ngDevMode) && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`);
+      default:
+        throw new RuntimeError(5202, (typeof ngDevMode === "undefined" || ngDevMode) && `Unexpected SecurityContext ${ctx} (see ${XSS_SECURITY_URL})`);
+    }
+  }
+  bypassSecurityTrustHtml(value) {
+    return bypassSanitizationTrustHtml(value);
+  }
+  bypassSecurityTrustStyle(value) {
+    return bypassSanitizationTrustStyle(value);
+  }
+  bypassSecurityTrustScript(value) {
+    return bypassSanitizationTrustScript(value);
+  }
+  bypassSecurityTrustUrl(value) {
+    return bypassSanitizationTrustUrl(value);
+  }
+  bypassSecurityTrustResourceUrl(value) {
+    return bypassSanitizationTrustResourceUrl(value);
+  }
+  static ɵfac = function DomSanitizerImpl_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DomSanitizerImpl)(ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DomSanitizerImpl,
+    factory: _DomSanitizerImpl.ɵfac,
+    providedIn: "root"
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomSanitizerImpl, [{
+    type: Injectable,
+    args: [{
+      providedIn: "root"
+    }]
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+var HydrationFeatureKind;
+(function(HydrationFeatureKind2) {
+  HydrationFeatureKind2[HydrationFeatureKind2["NoHttpTransferCache"] = 0] = "NoHttpTransferCache";
+  HydrationFeatureKind2[HydrationFeatureKind2["HttpTransferCacheOptions"] = 1] = "HttpTransferCacheOptions";
+  HydrationFeatureKind2[HydrationFeatureKind2["I18nSupport"] = 2] = "I18nSupport";
+  HydrationFeatureKind2[HydrationFeatureKind2["EventReplay"] = 3] = "EventReplay";
+  HydrationFeatureKind2[HydrationFeatureKind2["IncrementalHydration"] = 4] = "IncrementalHydration";
+})(HydrationFeatureKind || (HydrationFeatureKind = {}));
+function hydrationFeature(ɵkind, ɵproviders = [], ɵoptions = {}) {
+  return {
+    ɵkind,
+    ɵproviders
+  };
+}
+function withNoHttpTransferCache() {
+  return hydrationFeature(HydrationFeatureKind.NoHttpTransferCache);
+}
+function withHttpTransferCacheOptions(options) {
+  return hydrationFeature(HydrationFeatureKind.HttpTransferCacheOptions, withHttpTransferCache(options));
+}
+function withI18nSupport2() {
+  return hydrationFeature(HydrationFeatureKind.I18nSupport, withI18nSupport());
+}
+function withEventReplay2() {
+  return hydrationFeature(HydrationFeatureKind.EventReplay, withEventReplay());
+}
+function withIncrementalHydration2() {
+  return hydrationFeature(HydrationFeatureKind.IncrementalHydration, withIncrementalHydration());
+}
+function provideZoneJsCompatibilityDetector() {
+  return [{
+    provide: ENVIRONMENT_INITIALIZER,
+    useValue: () => {
+      const ngZone = inject(NgZone);
+      const isZoneless = inject(ZONELESS_ENABLED);
+      if (!isZoneless && ngZone.constructor !== NgZone) {
+        const console2 = inject(Console);
+        const message = formatRuntimeError(-5e3, "Angular detected that hydration was enabled for an application that uses a custom or a noop Zone.js implementation. This is not yet a fully supported configuration.");
+        console2.warn(message);
+      }
+    },
+    multi: true
+  }];
+}
+function provideClientHydration(...features) {
+  const providers = [];
+  const featuresKind = /* @__PURE__ */ new Set();
+  for (const {
+    ɵproviders,
+    ɵkind
+  } of features) {
+    featuresKind.add(ɵkind);
+    if (ɵproviders.length) {
+      providers.push(ɵproviders);
+    }
+  }
+  const hasHttpTransferCacheOptions = featuresKind.has(HydrationFeatureKind.HttpTransferCacheOptions);
+  if (typeof ngDevMode !== "undefined" && ngDevMode && featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) && hasHttpTransferCacheOptions) {
+    throw new Error("Configuration error: found both withHttpTransferCacheOptions() and withNoHttpTransferCache() in the same call to provideClientHydration(), which is a contradiction.");
+  }
+  return makeEnvironmentProviders([typeof ngDevMode !== "undefined" && ngDevMode ? provideZoneJsCompatibilityDetector() : [], withDomHydration(), featuresKind.has(HydrationFeatureKind.NoHttpTransferCache) || hasHttpTransferCacheOptions ? [] : withHttpTransferCache({}), providers]);
+}
+var VERSION = new Version("20.0.5");
+
+export {
+  Meta,
+  Title,
+  enableDebugTools,
+  disableDebugTools,
+  By,
+  HAMMER_GESTURE_CONFIG,
+  HAMMER_LOADER,
+  HammerGestureConfig,
+  HammerGesturesPlugin,
+  HammerModule,
+  DomSanitizer,
+  DomSanitizerImpl,
+  HydrationFeatureKind,
+  withNoHttpTransferCache,
+  withHttpTransferCacheOptions,
+  withI18nSupport2 as withI18nSupport,
+  withEventReplay2 as withEventReplay,
+  withIncrementalHydration2 as withIncrementalHydration,
+  provideClientHydration,
+  VERSION
+};
+/*! Bundled license information:
+
+@angular/platform-browser/fesm2022/platform-browser.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=chunk-IA3W2FS3.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/chunk-IA3W2FS3.js.map


+ 1232 - 0
ai-interview/vite/deps/chunk-NFFN32GK.js

@@ -0,0 +1,1232 @@
+import {
+  CommonModule,
+  DomAdapter,
+  PLATFORM_BROWSER_ID,
+  getDOM,
+  isPlatformServer,
+  setRootDomAdapter
+} from "./chunk-VHSNDQRF.js";
+import {
+  XhrFactory,
+  parseCookieValue
+} from "./chunk-OPGNYZHR.js";
+import {
+  APP_ID,
+  ApplicationModule,
+  CSP_NONCE,
+  DOCUMENT,
+  ErrorHandler,
+  INJECTOR_SCOPE,
+  Inject,
+  Injectable,
+  InjectionToken,
+  NgModule,
+  NgZone,
+  Optional,
+  PLATFORM_ID,
+  PLATFORM_INITIALIZER,
+  RendererFactory2,
+  RendererStyleFlags2,
+  RuntimeError,
+  TESTABILITY,
+  TESTABILITY_GETTER,
+  Testability,
+  TestabilityRegistry,
+  TracingService,
+  ViewEncapsulation,
+  _global,
+  createPlatformFactory,
+  inject,
+  internalCreateApplication,
+  platformCore,
+  setClassMetadata,
+  setDocument,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵinject
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/platform-browser/fesm2022/dom_renderer.mjs
+var EVENT_MANAGER_PLUGINS = new InjectionToken(ngDevMode ? "EventManagerPlugins" : "");
+var EventManager = class _EventManager {
+  _zone;
+  _plugins;
+  _eventNameToPlugin = /* @__PURE__ */ new Map();
+  /**
+   * Initializes an instance of the event-manager service.
+   */
+  constructor(plugins, _zone) {
+    this._zone = _zone;
+    plugins.forEach((plugin) => {
+      plugin.manager = this;
+    });
+    this._plugins = plugins.slice().reverse();
+  }
+  /**
+   * Registers a handler for a specific element and event.
+   *
+   * @param element The HTML element to receive event notifications.
+   * @param eventName The name of the event to listen for.
+   * @param handler A function to call when the notification occurs. Receives the
+   * event object as an argument.
+   * @param options Options that configure how the event listener is bound.
+   * @returns  A callback function that can be used to remove the handler.
+   */
+  addEventListener(element, eventName, handler, options) {
+    const plugin = this._findPluginFor(eventName);
+    return plugin.addEventListener(element, eventName, handler, options);
+  }
+  /**
+   * Retrieves the compilation zone in which event listeners are registered.
+   */
+  getZone() {
+    return this._zone;
+  }
+  /** @internal */
+  _findPluginFor(eventName) {
+    let plugin = this._eventNameToPlugin.get(eventName);
+    if (plugin) {
+      return plugin;
+    }
+    const plugins = this._plugins;
+    plugin = plugins.find((plugin2) => plugin2.supports(eventName));
+    if (!plugin) {
+      throw new RuntimeError(5101, (typeof ngDevMode === "undefined" || ngDevMode) && `No event manager plugin found for event ${eventName}`);
+    }
+    this._eventNameToPlugin.set(eventName, plugin);
+    return plugin;
+  }
+  static ɵfac = function EventManager_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _EventManager)(ɵɵinject(EVENT_MANAGER_PLUGINS), ɵɵinject(NgZone));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _EventManager,
+    factory: _EventManager.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(EventManager, [{
+    type: Injectable
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [EVENT_MANAGER_PLUGINS]
+    }]
+  }, {
+    type: NgZone
+  }], null);
+})();
+var EventManagerPlugin = class {
+  _doc;
+  // TODO: remove (has some usage in G3)
+  constructor(_doc) {
+    this._doc = _doc;
+  }
+  // Using non-null assertion because it's set by EventManager's constructor
+  manager;
+};
+var APP_ID_ATTRIBUTE_NAME = "ng-app-id";
+function removeElements(elements) {
+  for (const element of elements) {
+    element.remove();
+  }
+}
+function createStyleElement(style, doc) {
+  const styleElement = doc.createElement("style");
+  styleElement.textContent = style;
+  return styleElement;
+}
+function addServerStyles(doc, appId, inline, external) {
+  const elements = doc.head?.querySelectorAll(`style[${APP_ID_ATTRIBUTE_NAME}="${appId}"],link[${APP_ID_ATTRIBUTE_NAME}="${appId}"]`);
+  if (elements) {
+    for (const styleElement of elements) {
+      styleElement.removeAttribute(APP_ID_ATTRIBUTE_NAME);
+      if (styleElement instanceof HTMLLinkElement) {
+        external.set(styleElement.href.slice(styleElement.href.lastIndexOf("/") + 1), {
+          usage: 0,
+          elements: [styleElement]
+        });
+      } else if (styleElement.textContent) {
+        inline.set(styleElement.textContent, {
+          usage: 0,
+          elements: [styleElement]
+        });
+      }
+    }
+  }
+}
+function createLinkElement(url, doc) {
+  const linkElement = doc.createElement("link");
+  linkElement.setAttribute("rel", "stylesheet");
+  linkElement.setAttribute("href", url);
+  return linkElement;
+}
+var SharedStylesHost = class _SharedStylesHost {
+  doc;
+  appId;
+  nonce;
+  /**
+   * Provides usage information for active inline style content and associated HTML <style> elements.
+   * Embedded styles typically originate from the `styles` metadata of a rendered component.
+   */
+  inline = /* @__PURE__ */ new Map();
+  /**
+   * Provides usage information for active external style URLs and the associated HTML <link> elements.
+   * External styles typically originate from the `ɵɵExternalStylesFeature` of a rendered component.
+   */
+  external = /* @__PURE__ */ new Map();
+  /**
+   * Set of host DOM nodes that will have styles attached.
+   */
+  hosts = /* @__PURE__ */ new Set();
+  /**
+   * Whether the application code is currently executing on a server.
+   */
+  isServer;
+  constructor(doc, appId, nonce, platformId = {}) {
+    this.doc = doc;
+    this.appId = appId;
+    this.nonce = nonce;
+    this.isServer = isPlatformServer(platformId);
+    addServerStyles(doc, appId, this.inline, this.external);
+    this.hosts.add(doc.head);
+  }
+  /**
+   * Adds embedded styles to the DOM via HTML `style` elements.
+   * @param styles An array of style content strings.
+   */
+  addStyles(styles, urls) {
+    for (const value of styles) {
+      this.addUsage(value, this.inline, createStyleElement);
+    }
+    urls?.forEach((value) => this.addUsage(value, this.external, createLinkElement));
+  }
+  /**
+   * Removes embedded styles from the DOM that were added as HTML `style` elements.
+   * @param styles An array of style content strings.
+   */
+  removeStyles(styles, urls) {
+    for (const value of styles) {
+      this.removeUsage(value, this.inline);
+    }
+    urls?.forEach((value) => this.removeUsage(value, this.external));
+  }
+  addUsage(value, usages, creator) {
+    const record = usages.get(value);
+    if (record) {
+      if ((typeof ngDevMode === "undefined" || ngDevMode) && record.usage === 0) {
+        record.elements.forEach((element) => element.setAttribute("ng-style-reused", ""));
+      }
+      record.usage++;
+    } else {
+      usages.set(value, {
+        usage: 1,
+        elements: [...this.hosts].map((host) => this.addElement(host, creator(value, this.doc)))
+      });
+    }
+  }
+  removeUsage(value, usages) {
+    const record = usages.get(value);
+    if (record) {
+      record.usage--;
+      if (record.usage <= 0) {
+        removeElements(record.elements);
+        usages.delete(value);
+      }
+    }
+  }
+  ngOnDestroy() {
+    for (const [, {
+      elements
+    }] of [...this.inline, ...this.external]) {
+      removeElements(elements);
+    }
+    this.hosts.clear();
+  }
+  /**
+   * Adds a host node to the set of style hosts and adds all existing style usage to
+   * the newly added host node.
+   *
+   * This is currently only used for Shadow DOM encapsulation mode.
+   */
+  addHost(hostNode) {
+    this.hosts.add(hostNode);
+    for (const [style, {
+      elements
+    }] of this.inline) {
+      elements.push(this.addElement(hostNode, createStyleElement(style, this.doc)));
+    }
+    for (const [url, {
+      elements
+    }] of this.external) {
+      elements.push(this.addElement(hostNode, createLinkElement(url, this.doc)));
+    }
+  }
+  removeHost(hostNode) {
+    this.hosts.delete(hostNode);
+  }
+  addElement(host, element) {
+    if (this.nonce) {
+      element.setAttribute("nonce", this.nonce);
+    }
+    if (this.isServer) {
+      element.setAttribute(APP_ID_ATTRIBUTE_NAME, this.appId);
+    }
+    return host.appendChild(element);
+  }
+  static ɵfac = function SharedStylesHost_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _SharedStylesHost)(ɵɵinject(DOCUMENT), ɵɵinject(APP_ID), ɵɵinject(CSP_NONCE, 8), ɵɵinject(PLATFORM_ID));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _SharedStylesHost,
+    factory: _SharedStylesHost.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(SharedStylesHost, [{
+    type: Injectable
+  }], () => [{
+    type: Document,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [APP_ID]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [CSP_NONCE]
+    }, {
+      type: Optional
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [PLATFORM_ID]
+    }]
+  }], null);
+})();
+var NAMESPACE_URIS = {
+  "svg": "http://www.w3.org/2000/svg",
+  "xhtml": "http://www.w3.org/1999/xhtml",
+  "xlink": "http://www.w3.org/1999/xlink",
+  "xml": "http://www.w3.org/XML/1998/namespace",
+  "xmlns": "http://www.w3.org/2000/xmlns/",
+  "math": "http://www.w3.org/1998/Math/MathML"
+};
+var COMPONENT_REGEX = /%COMP%/g;
+var SOURCEMAP_URL_REGEXP = /\/\*#\s*sourceMappingURL=(.+?)\s*\*\//;
+var PROTOCOL_REGEXP = /^https?:/;
+var COMPONENT_VARIABLE = "%COMP%";
+var HOST_ATTR = `_nghost-${COMPONENT_VARIABLE}`;
+var CONTENT_ATTR = `_ngcontent-${COMPONENT_VARIABLE}`;
+var REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT = true;
+var REMOVE_STYLES_ON_COMPONENT_DESTROY = new InjectionToken(ngDevMode ? "RemoveStylesOnCompDestroy" : "", {
+  providedIn: "root",
+  factory: () => REMOVE_STYLES_ON_COMPONENT_DESTROY_DEFAULT
+});
+function shimContentAttribute(componentShortId) {
+  return CONTENT_ATTR.replace(COMPONENT_REGEX, componentShortId);
+}
+function shimHostAttribute(componentShortId) {
+  return HOST_ATTR.replace(COMPONENT_REGEX, componentShortId);
+}
+function shimStylesContent(compId, styles) {
+  return styles.map((s) => s.replace(COMPONENT_REGEX, compId));
+}
+function addBaseHrefToCssSourceMap(baseHref, styles) {
+  if (!baseHref) {
+    return styles;
+  }
+  const absoluteBaseHrefUrl = new URL(baseHref, "http://localhost");
+  return styles.map((cssContent) => {
+    if (!cssContent.includes("sourceMappingURL=")) {
+      return cssContent;
+    }
+    return cssContent.replace(SOURCEMAP_URL_REGEXP, (_, sourceMapUrl) => {
+      if (sourceMapUrl[0] === "/" || sourceMapUrl.startsWith("data:") || PROTOCOL_REGEXP.test(sourceMapUrl)) {
+        return `/*# sourceMappingURL=${sourceMapUrl} */`;
+      }
+      const {
+        pathname: resolvedSourceMapUrl
+      } = new URL(sourceMapUrl, absoluteBaseHrefUrl);
+      return `/*# sourceMappingURL=${resolvedSourceMapUrl} */`;
+    });
+  });
+}
+var DomRendererFactory2 = class _DomRendererFactory2 {
+  eventManager;
+  sharedStylesHost;
+  appId;
+  removeStylesOnCompDestroy;
+  doc;
+  platformId;
+  ngZone;
+  nonce;
+  tracingService;
+  rendererByCompId = /* @__PURE__ */ new Map();
+  defaultRenderer;
+  platformIsServer;
+  constructor(eventManager, sharedStylesHost, appId, removeStylesOnCompDestroy, doc, platformId, ngZone, nonce = null, tracingService = null) {
+    this.eventManager = eventManager;
+    this.sharedStylesHost = sharedStylesHost;
+    this.appId = appId;
+    this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
+    this.doc = doc;
+    this.platformId = platformId;
+    this.ngZone = ngZone;
+    this.nonce = nonce;
+    this.tracingService = tracingService;
+    this.platformIsServer = false;
+    this.defaultRenderer = new DefaultDomRenderer2(eventManager, doc, ngZone, this.platformIsServer, this.tracingService);
+  }
+  createRenderer(element, type) {
+    if (!element || !type) {
+      return this.defaultRenderer;
+    }
+    if (false) {
+      type = __spreadProps(__spreadValues({}, type), {
+        encapsulation: ViewEncapsulation.Emulated
+      });
+    }
+    const renderer = this.getOrCreateRenderer(element, type);
+    if (renderer instanceof EmulatedEncapsulationDomRenderer2) {
+      renderer.applyToHost(element);
+    } else if (renderer instanceof NoneEncapsulationDomRenderer) {
+      renderer.applyStyles();
+    }
+    return renderer;
+  }
+  getOrCreateRenderer(element, type) {
+    const rendererByCompId = this.rendererByCompId;
+    let renderer = rendererByCompId.get(type.id);
+    if (!renderer) {
+      const doc = this.doc;
+      const ngZone = this.ngZone;
+      const eventManager = this.eventManager;
+      const sharedStylesHost = this.sharedStylesHost;
+      const removeStylesOnCompDestroy = this.removeStylesOnCompDestroy;
+      const platformIsServer = this.platformIsServer;
+      const tracingService = this.tracingService;
+      switch (type.encapsulation) {
+        case ViewEncapsulation.Emulated:
+          renderer = new EmulatedEncapsulationDomRenderer2(eventManager, sharedStylesHost, type, this.appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
+          break;
+        case ViewEncapsulation.ShadowDom:
+          return new ShadowDomRenderer(eventManager, sharedStylesHost, element, type, doc, ngZone, this.nonce, platformIsServer, tracingService);
+        default:
+          renderer = new NoneEncapsulationDomRenderer(eventManager, sharedStylesHost, type, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService);
+          break;
+      }
+      rendererByCompId.set(type.id, renderer);
+    }
+    return renderer;
+  }
+  ngOnDestroy() {
+    this.rendererByCompId.clear();
+  }
+  /**
+   * Used during HMR to clear any cached data about a component.
+   * @param componentId ID of the component that is being replaced.
+   */
+  componentReplaced(componentId) {
+    this.rendererByCompId.delete(componentId);
+  }
+  static ɵfac = function DomRendererFactory2_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DomRendererFactory2)(ɵɵinject(EventManager), ɵɵinject(SharedStylesHost), ɵɵinject(APP_ID), ɵɵinject(REMOVE_STYLES_ON_COMPONENT_DESTROY), ɵɵinject(DOCUMENT), ɵɵinject(PLATFORM_ID), ɵɵinject(NgZone), ɵɵinject(CSP_NONCE), ɵɵinject(TracingService, 8));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DomRendererFactory2,
+    factory: _DomRendererFactory2.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomRendererFactory2, [{
+    type: Injectable
+  }], () => [{
+    type: EventManager
+  }, {
+    type: SharedStylesHost
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [APP_ID]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [REMOVE_STYLES_ON_COMPONENT_DESTROY]
+    }]
+  }, {
+    type: Document,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }, {
+    type: Object,
+    decorators: [{
+      type: Inject,
+      args: [PLATFORM_ID]
+    }]
+  }, {
+    type: NgZone
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [CSP_NONCE]
+    }]
+  }, {
+    type: TracingService,
+    decorators: [{
+      type: Inject,
+      args: [TracingService]
+    }, {
+      type: Optional
+    }]
+  }], null);
+})();
+var DefaultDomRenderer2 = class {
+  eventManager;
+  doc;
+  ngZone;
+  platformIsServer;
+  tracingService;
+  data = /* @__PURE__ */ Object.create(null);
+  /**
+   * By default this renderer throws when encountering synthetic properties
+   * This can be disabled for example by the AsyncAnimationRendererFactory
+   */
+  throwOnSyntheticProps = true;
+  constructor(eventManager, doc, ngZone, platformIsServer, tracingService) {
+    this.eventManager = eventManager;
+    this.doc = doc;
+    this.ngZone = ngZone;
+    this.platformIsServer = platformIsServer;
+    this.tracingService = tracingService;
+  }
+  destroy() {
+  }
+  destroyNode = null;
+  createElement(name, namespace) {
+    if (namespace) {
+      return this.doc.createElementNS(NAMESPACE_URIS[namespace] || namespace, name);
+    }
+    return this.doc.createElement(name);
+  }
+  createComment(value) {
+    return this.doc.createComment(value);
+  }
+  createText(value) {
+    return this.doc.createTextNode(value);
+  }
+  appendChild(parent, newChild) {
+    const targetParent = isTemplateNode(parent) ? parent.content : parent;
+    targetParent.appendChild(newChild);
+  }
+  insertBefore(parent, newChild, refChild) {
+    if (parent) {
+      const targetParent = isTemplateNode(parent) ? parent.content : parent;
+      targetParent.insertBefore(newChild, refChild);
+    }
+  }
+  removeChild(_parent, oldChild) {
+    oldChild.remove();
+  }
+  selectRootElement(selectorOrNode, preserveContent) {
+    let el = typeof selectorOrNode === "string" ? this.doc.querySelector(selectorOrNode) : selectorOrNode;
+    if (!el) {
+      throw new RuntimeError(-5104, (typeof ngDevMode === "undefined" || ngDevMode) && `The selector "${selectorOrNode}" did not match any elements`);
+    }
+    if (!preserveContent) {
+      el.textContent = "";
+    }
+    return el;
+  }
+  parentNode(node) {
+    return node.parentNode;
+  }
+  nextSibling(node) {
+    return node.nextSibling;
+  }
+  setAttribute(el, name, value, namespace) {
+    if (namespace) {
+      name = namespace + ":" + name;
+      const namespaceUri = NAMESPACE_URIS[namespace];
+      if (namespaceUri) {
+        el.setAttributeNS(namespaceUri, name, value);
+      } else {
+        el.setAttribute(name, value);
+      }
+    } else {
+      el.setAttribute(name, value);
+    }
+  }
+  removeAttribute(el, name, namespace) {
+    if (namespace) {
+      const namespaceUri = NAMESPACE_URIS[namespace];
+      if (namespaceUri) {
+        el.removeAttributeNS(namespaceUri, name);
+      } else {
+        el.removeAttribute(`${namespace}:${name}`);
+      }
+    } else {
+      el.removeAttribute(name);
+    }
+  }
+  addClass(el, name) {
+    el.classList.add(name);
+  }
+  removeClass(el, name) {
+    el.classList.remove(name);
+  }
+  setStyle(el, style, value, flags) {
+    if (flags & (RendererStyleFlags2.DashCase | RendererStyleFlags2.Important)) {
+      el.style.setProperty(style, value, flags & RendererStyleFlags2.Important ? "important" : "");
+    } else {
+      el.style[style] = value;
+    }
+  }
+  removeStyle(el, style, flags) {
+    if (flags & RendererStyleFlags2.DashCase) {
+      el.style.removeProperty(style);
+    } else {
+      el.style[style] = "";
+    }
+  }
+  setProperty(el, name, value) {
+    if (el == null) {
+      return;
+    }
+    (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(name, "property");
+    el[name] = value;
+  }
+  setValue(node, value) {
+    node.nodeValue = value;
+  }
+  listen(target, event, callback, options) {
+    (typeof ngDevMode === "undefined" || ngDevMode) && this.throwOnSyntheticProps && checkNoSyntheticProp(event, "listener");
+    if (typeof target === "string") {
+      target = getDOM().getGlobalEventTarget(this.doc, target);
+      if (!target) {
+        throw new RuntimeError(5102, (typeof ngDevMode === "undefined" || ngDevMode) && `Unsupported event target ${target} for event ${event}`);
+      }
+    }
+    let wrappedCallback = this.decoratePreventDefault(callback);
+    if (this.tracingService?.wrapEventListener) {
+      wrappedCallback = this.tracingService.wrapEventListener(target, event, wrappedCallback);
+    }
+    return this.eventManager.addEventListener(target, event, wrappedCallback, options);
+  }
+  decoratePreventDefault(eventHandler) {
+    return (event) => {
+      if (event === "__ngUnwrap__") {
+        return eventHandler;
+      }
+      const allowDefaultBehavior = false ? this.ngZone.runGuarded(() => eventHandler(event)) : eventHandler(event);
+      if (allowDefaultBehavior === false) {
+        event.preventDefault();
+      }
+      return void 0;
+    };
+  }
+};
+var AT_CHARCODE = (() => "@".charCodeAt(0))();
+function checkNoSyntheticProp(name, nameKind) {
+  if (name.charCodeAt(0) === AT_CHARCODE) {
+    throw new RuntimeError(5105, `Unexpected synthetic ${nameKind} ${name} found. Please make sure that:
+  - Make sure \`provideAnimationsAsync()\`, \`provideAnimations()\` or \`provideNoopAnimations()\` call was added to a list of providers used to bootstrap an application.
+  - There is a corresponding animation configuration named \`${name}\` defined in the \`animations\` field of the \`@Component\` decorator (see https://angular.dev/api/core/Component#animations).`);
+  }
+}
+function isTemplateNode(node) {
+  return node.tagName === "TEMPLATE" && node.content !== void 0;
+}
+var ShadowDomRenderer = class extends DefaultDomRenderer2 {
+  sharedStylesHost;
+  hostEl;
+  shadowRoot;
+  constructor(eventManager, sharedStylesHost, hostEl, component, doc, ngZone, nonce, platformIsServer, tracingService) {
+    super(eventManager, doc, ngZone, platformIsServer, tracingService);
+    this.sharedStylesHost = sharedStylesHost;
+    this.hostEl = hostEl;
+    this.shadowRoot = hostEl.attachShadow({
+      mode: "open"
+    });
+    this.sharedStylesHost.addHost(this.shadowRoot);
+    let styles = component.styles;
+    if (ngDevMode) {
+      const baseHref = getDOM().getBaseHref(doc) ?? "";
+      styles = addBaseHrefToCssSourceMap(baseHref, styles);
+    }
+    styles = shimStylesContent(component.id, styles);
+    for (const style of styles) {
+      const styleEl = document.createElement("style");
+      if (nonce) {
+        styleEl.setAttribute("nonce", nonce);
+      }
+      styleEl.textContent = style;
+      this.shadowRoot.appendChild(styleEl);
+    }
+    const styleUrls = component.getExternalStyles?.();
+    if (styleUrls) {
+      for (const styleUrl of styleUrls) {
+        const linkEl = createLinkElement(styleUrl, doc);
+        if (nonce) {
+          linkEl.setAttribute("nonce", nonce);
+        }
+        this.shadowRoot.appendChild(linkEl);
+      }
+    }
+  }
+  nodeOrShadowRoot(node) {
+    return node === this.hostEl ? this.shadowRoot : node;
+  }
+  appendChild(parent, newChild) {
+    return super.appendChild(this.nodeOrShadowRoot(parent), newChild);
+  }
+  insertBefore(parent, newChild, refChild) {
+    return super.insertBefore(this.nodeOrShadowRoot(parent), newChild, refChild);
+  }
+  removeChild(_parent, oldChild) {
+    return super.removeChild(null, oldChild);
+  }
+  parentNode(node) {
+    return this.nodeOrShadowRoot(super.parentNode(this.nodeOrShadowRoot(node)));
+  }
+  destroy() {
+    this.sharedStylesHost.removeHost(this.shadowRoot);
+  }
+};
+var NoneEncapsulationDomRenderer = class extends DefaultDomRenderer2 {
+  sharedStylesHost;
+  removeStylesOnCompDestroy;
+  styles;
+  styleUrls;
+  constructor(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId) {
+    super(eventManager, doc, ngZone, platformIsServer, tracingService);
+    this.sharedStylesHost = sharedStylesHost;
+    this.removeStylesOnCompDestroy = removeStylesOnCompDestroy;
+    let styles = component.styles;
+    if (ngDevMode) {
+      const baseHref = getDOM().getBaseHref(doc) ?? "";
+      styles = addBaseHrefToCssSourceMap(baseHref, styles);
+    }
+    this.styles = compId ? shimStylesContent(compId, styles) : styles;
+    this.styleUrls = component.getExternalStyles?.(compId);
+  }
+  applyStyles() {
+    this.sharedStylesHost.addStyles(this.styles, this.styleUrls);
+  }
+  destroy() {
+    if (!this.removeStylesOnCompDestroy) {
+      return;
+    }
+    this.sharedStylesHost.removeStyles(this.styles, this.styleUrls);
+  }
+};
+var EmulatedEncapsulationDomRenderer2 = class extends NoneEncapsulationDomRenderer {
+  contentAttr;
+  hostAttr;
+  constructor(eventManager, sharedStylesHost, component, appId, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService) {
+    const compId = appId + "-" + component.id;
+    super(eventManager, sharedStylesHost, component, removeStylesOnCompDestroy, doc, ngZone, platformIsServer, tracingService, compId);
+    this.contentAttr = shimContentAttribute(compId);
+    this.hostAttr = shimHostAttribute(compId);
+  }
+  applyToHost(element) {
+    this.applyStyles();
+    this.setAttribute(element, this.hostAttr, "");
+  }
+  createElement(parent, name) {
+    const el = super.createElement(parent, name);
+    super.setAttribute(el, this.contentAttr, "");
+    return el;
+  }
+};
+
+// node_modules/@angular/platform-browser/fesm2022/browser.mjs
+var BrowserDomAdapter = class _BrowserDomAdapter extends DomAdapter {
+  supportsDOMEvents = true;
+  static makeCurrent() {
+    setRootDomAdapter(new _BrowserDomAdapter());
+  }
+  onAndCancel(el, evt, listener, options) {
+    el.addEventListener(evt, listener, options);
+    return () => {
+      el.removeEventListener(evt, listener, options);
+    };
+  }
+  dispatchEvent(el, evt) {
+    el.dispatchEvent(evt);
+  }
+  remove(node) {
+    node.remove();
+  }
+  createElement(tagName, doc) {
+    doc = doc || this.getDefaultDocument();
+    return doc.createElement(tagName);
+  }
+  createHtmlDocument() {
+    return document.implementation.createHTMLDocument("fakeTitle");
+  }
+  getDefaultDocument() {
+    return document;
+  }
+  isElementNode(node) {
+    return node.nodeType === Node.ELEMENT_NODE;
+  }
+  isShadowRoot(node) {
+    return node instanceof DocumentFragment;
+  }
+  /** @deprecated No longer being used in Ivy code. To be removed in version 14. */
+  getGlobalEventTarget(doc, target) {
+    if (target === "window") {
+      return window;
+    }
+    if (target === "document") {
+      return doc;
+    }
+    if (target === "body") {
+      return doc.body;
+    }
+    return null;
+  }
+  getBaseHref(doc) {
+    const href = getBaseElementHref();
+    return href == null ? null : relativePath(href);
+  }
+  resetBaseElement() {
+    baseElement = null;
+  }
+  getUserAgent() {
+    return window.navigator.userAgent;
+  }
+  getCookie(name) {
+    return parseCookieValue(document.cookie, name);
+  }
+};
+var baseElement = null;
+function getBaseElementHref() {
+  baseElement = baseElement || document.head.querySelector("base");
+  return baseElement ? baseElement.getAttribute("href") : null;
+}
+function relativePath(url) {
+  return new URL(url, document.baseURI).pathname;
+}
+var BrowserGetTestability = class {
+  addToWindow(registry) {
+    _global["getAngularTestability"] = (elem, findInAncestors = true) => {
+      const testability = registry.findTestabilityInTree(elem, findInAncestors);
+      if (testability == null) {
+        throw new RuntimeError(5103, (typeof ngDevMode === "undefined" || ngDevMode) && "Could not find testability for element.");
+      }
+      return testability;
+    };
+    _global["getAllAngularTestabilities"] = () => registry.getAllTestabilities();
+    _global["getAllAngularRootElements"] = () => registry.getAllRootElements();
+    const whenAllStable = (callback) => {
+      const testabilities = _global["getAllAngularTestabilities"]();
+      let count = testabilities.length;
+      const decrement = function() {
+        count--;
+        if (count == 0) {
+          callback();
+        }
+      };
+      testabilities.forEach((testability) => {
+        testability.whenStable(decrement);
+      });
+    };
+    if (!_global["frameworkStabilizers"]) {
+      _global["frameworkStabilizers"] = [];
+    }
+    _global["frameworkStabilizers"].push(whenAllStable);
+  }
+  findTestabilityInTree(registry, elem, findInAncestors) {
+    if (elem == null) {
+      return null;
+    }
+    const t = registry.getTestability(elem);
+    if (t != null) {
+      return t;
+    } else if (!findInAncestors) {
+      return null;
+    }
+    if (getDOM().isShadowRoot(elem)) {
+      return this.findTestabilityInTree(registry, elem.host, true);
+    }
+    return this.findTestabilityInTree(registry, elem.parentElement, true);
+  }
+};
+var BrowserXhr = class _BrowserXhr {
+  build() {
+    return new XMLHttpRequest();
+  }
+  static ɵfac = function BrowserXhr_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _BrowserXhr)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _BrowserXhr,
+    factory: _BrowserXhr.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserXhr, [{
+    type: Injectable
+  }], null, null);
+})();
+var DomEventsPlugin = class _DomEventsPlugin extends EventManagerPlugin {
+  constructor(doc) {
+    super(doc);
+  }
+  // This plugin should come last in the list of plugins, because it accepts all
+  // events.
+  supports(eventName) {
+    return true;
+  }
+  addEventListener(element, eventName, handler, options) {
+    element.addEventListener(eventName, handler, options);
+    return () => this.removeEventListener(element, eventName, handler, options);
+  }
+  removeEventListener(target, eventName, callback, options) {
+    return target.removeEventListener(eventName, callback, options);
+  }
+  static ɵfac = function DomEventsPlugin_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _DomEventsPlugin)(ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _DomEventsPlugin,
+    factory: _DomEventsPlugin.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(DomEventsPlugin, [{
+    type: Injectable
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+var MODIFIER_KEYS = ["alt", "control", "meta", "shift"];
+var _keyMap = {
+  "\b": "Backspace",
+  "	": "Tab",
+  "": "Delete",
+  "\x1B": "Escape",
+  "Del": "Delete",
+  "Esc": "Escape",
+  "Left": "ArrowLeft",
+  "Right": "ArrowRight",
+  "Up": "ArrowUp",
+  "Down": "ArrowDown",
+  "Menu": "ContextMenu",
+  "Scroll": "ScrollLock",
+  "Win": "OS"
+};
+var MODIFIER_KEY_GETTERS = {
+  "alt": (event) => event.altKey,
+  "control": (event) => event.ctrlKey,
+  "meta": (event) => event.metaKey,
+  "shift": (event) => event.shiftKey
+};
+var KeyEventsPlugin = class _KeyEventsPlugin extends EventManagerPlugin {
+  /**
+   * Initializes an instance of the browser plug-in.
+   * @param doc The document in which key events will be detected.
+   */
+  constructor(doc) {
+    super(doc);
+  }
+  /**
+   * Reports whether a named key event is supported.
+   * @param eventName The event name to query.
+   * @return True if the named key event is supported.
+   */
+  supports(eventName) {
+    return _KeyEventsPlugin.parseEventName(eventName) != null;
+  }
+  /**
+   * Registers a handler for a specific element and key event.
+   * @param element The HTML element to receive event notifications.
+   * @param eventName The name of the key event to listen for.
+   * @param handler A function to call when the notification occurs. Receives the
+   * event object as an argument.
+   * @returns The key event that was registered.
+   */
+  addEventListener(element, eventName, handler, options) {
+    const parsedEvent = _KeyEventsPlugin.parseEventName(eventName);
+    const outsideHandler = _KeyEventsPlugin.eventCallback(parsedEvent["fullKey"], handler, this.manager.getZone());
+    return this.manager.getZone().runOutsideAngular(() => {
+      return getDOM().onAndCancel(element, parsedEvent["domEventName"], outsideHandler, options);
+    });
+  }
+  /**
+   * Parses the user provided full keyboard event definition and normalizes it for
+   * later internal use. It ensures the string is all lowercase, converts special
+   * characters to a standard spelling, and orders all the values consistently.
+   *
+   * @param eventName The name of the key event to listen for.
+   * @returns an object with the full, normalized string, and the dom event name
+   * or null in the case when the event doesn't match a keyboard event.
+   */
+  static parseEventName(eventName) {
+    const parts = eventName.toLowerCase().split(".");
+    const domEventName = parts.shift();
+    if (parts.length === 0 || !(domEventName === "keydown" || domEventName === "keyup")) {
+      return null;
+    }
+    const key = _KeyEventsPlugin._normalizeKey(parts.pop());
+    let fullKey = "";
+    let codeIX = parts.indexOf("code");
+    if (codeIX > -1) {
+      parts.splice(codeIX, 1);
+      fullKey = "code.";
+    }
+    MODIFIER_KEYS.forEach((modifierName) => {
+      const index = parts.indexOf(modifierName);
+      if (index > -1) {
+        parts.splice(index, 1);
+        fullKey += modifierName + ".";
+      }
+    });
+    fullKey += key;
+    if (parts.length != 0 || key.length === 0) {
+      return null;
+    }
+    const result = {};
+    result["domEventName"] = domEventName;
+    result["fullKey"] = fullKey;
+    return result;
+  }
+  /**
+   * Determines whether the actual keys pressed match the configured key code string.
+   * The `fullKeyCode` event is normalized in the `parseEventName` method when the
+   * event is attached to the DOM during the `addEventListener` call. This is unseen
+   * by the end user and is normalized for internal consistency and parsing.
+   *
+   * @param event The keyboard event.
+   * @param fullKeyCode The normalized user defined expected key event string
+   * @returns boolean.
+   */
+  static matchEventFullKeyCode(event, fullKeyCode) {
+    let keycode = _keyMap[event.key] || event.key;
+    let key = "";
+    if (fullKeyCode.indexOf("code.") > -1) {
+      keycode = event.code;
+      key = "code.";
+    }
+    if (keycode == null || !keycode) return false;
+    keycode = keycode.toLowerCase();
+    if (keycode === " ") {
+      keycode = "space";
+    } else if (keycode === ".") {
+      keycode = "dot";
+    }
+    MODIFIER_KEYS.forEach((modifierName) => {
+      if (modifierName !== keycode) {
+        const modifierGetter = MODIFIER_KEY_GETTERS[modifierName];
+        if (modifierGetter(event)) {
+          key += modifierName + ".";
+        }
+      }
+    });
+    key += keycode;
+    return key === fullKeyCode;
+  }
+  /**
+   * Configures a handler callback for a key event.
+   * @param fullKey The event name that combines all simultaneous keystrokes.
+   * @param handler The function that responds to the key event.
+   * @param zone The zone in which the event occurred.
+   * @returns A callback function.
+   */
+  static eventCallback(fullKey, handler, zone) {
+    return (event) => {
+      if (_KeyEventsPlugin.matchEventFullKeyCode(event, fullKey)) {
+        zone.runGuarded(() => handler(event));
+      }
+    };
+  }
+  /** @internal */
+  static _normalizeKey(keyName) {
+    return keyName === "esc" ? "escape" : keyName;
+  }
+  static ɵfac = function KeyEventsPlugin_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _KeyEventsPlugin)(ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _KeyEventsPlugin,
+    factory: _KeyEventsPlugin.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(KeyEventsPlugin, [{
+    type: Injectable
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+function bootstrapApplication(rootComponent, options) {
+  return internalCreateApplication(__spreadValues({
+    rootComponent
+  }, createProvidersConfig(options)));
+}
+function createApplication(options) {
+  return internalCreateApplication(createProvidersConfig(options));
+}
+function createProvidersConfig(options) {
+  return {
+    appProviders: [...BROWSER_MODULE_PROVIDERS, ...options?.providers ?? []],
+    platformProviders: INTERNAL_BROWSER_PLATFORM_PROVIDERS
+  };
+}
+function provideProtractorTestingSupport() {
+  return [...TESTABILITY_PROVIDERS];
+}
+function initDomAdapter() {
+  BrowserDomAdapter.makeCurrent();
+}
+function errorHandler() {
+  return new ErrorHandler();
+}
+function _document() {
+  setDocument(document);
+  return document;
+}
+var INTERNAL_BROWSER_PLATFORM_PROVIDERS = [{
+  provide: PLATFORM_ID,
+  useValue: PLATFORM_BROWSER_ID
+}, {
+  provide: PLATFORM_INITIALIZER,
+  useValue: initDomAdapter,
+  multi: true
+}, {
+  provide: DOCUMENT,
+  useFactory: _document
+}];
+var platformBrowser = createPlatformFactory(platformCore, "browser", INTERNAL_BROWSER_PLATFORM_PROVIDERS);
+var BROWSER_MODULE_PROVIDERS_MARKER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "BrowserModule Providers Marker" : "");
+var TESTABILITY_PROVIDERS = [{
+  provide: TESTABILITY_GETTER,
+  useClass: BrowserGetTestability
+}, {
+  provide: TESTABILITY,
+  useClass: Testability,
+  deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
+}, {
+  provide: Testability,
+  // Also provide as `Testability` for backwards-compatibility.
+  useClass: Testability,
+  deps: [NgZone, TestabilityRegistry, TESTABILITY_GETTER]
+}];
+var BROWSER_MODULE_PROVIDERS = [{
+  provide: INJECTOR_SCOPE,
+  useValue: "root"
+}, {
+  provide: ErrorHandler,
+  useFactory: errorHandler
+}, {
+  provide: EVENT_MANAGER_PLUGINS,
+  useClass: DomEventsPlugin,
+  multi: true,
+  deps: [DOCUMENT]
+}, {
+  provide: EVENT_MANAGER_PLUGINS,
+  useClass: KeyEventsPlugin,
+  multi: true,
+  deps: [DOCUMENT]
+}, DomRendererFactory2, SharedStylesHost, EventManager, {
+  provide: RendererFactory2,
+  useExisting: DomRendererFactory2
+}, {
+  provide: XhrFactory,
+  useClass: BrowserXhr
+}, typeof ngDevMode === "undefined" || ngDevMode ? {
+  provide: BROWSER_MODULE_PROVIDERS_MARKER,
+  useValue: true
+} : []];
+var BrowserModule = class _BrowserModule {
+  constructor() {
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      const providersAlreadyPresent = inject(BROWSER_MODULE_PROVIDERS_MARKER, {
+        optional: true,
+        skipSelf: true
+      });
+      if (providersAlreadyPresent) {
+        throw new RuntimeError(5100, `Providers from the \`BrowserModule\` have already been loaded. If you need access to common directives such as NgIf and NgFor, import the \`CommonModule\` instead.`);
+      }
+    }
+  }
+  static ɵfac = function BrowserModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _BrowserModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _BrowserModule,
+    exports: [CommonModule, ApplicationModule]
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
+    imports: [CommonModule, ApplicationModule]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(BrowserModule, [{
+    type: NgModule,
+    args: [{
+      providers: [...BROWSER_MODULE_PROVIDERS, ...TESTABILITY_PROVIDERS],
+      exports: [CommonModule, ApplicationModule]
+    }]
+  }], () => [], null);
+})();
+
+export {
+  EVENT_MANAGER_PLUGINS,
+  EventManager,
+  EventManagerPlugin,
+  SharedStylesHost,
+  REMOVE_STYLES_ON_COMPONENT_DESTROY,
+  DomRendererFactory2,
+  BrowserDomAdapter,
+  BrowserGetTestability,
+  DomEventsPlugin,
+  KeyEventsPlugin,
+  bootstrapApplication,
+  createApplication,
+  provideProtractorTestingSupport,
+  platformBrowser,
+  BrowserModule
+};
+/*! Bundled license information:
+
+@angular/platform-browser/fesm2022/dom_renderer.mjs:
+@angular/platform-browser/fesm2022/browser.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=chunk-NFFN32GK.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/chunk-NFFN32GK.js.map


+ 29 - 0
ai-interview/vite/deps/chunk-OPGNYZHR.js

@@ -0,0 +1,29 @@
+// node_modules/@angular/common/fesm2022/xhr.mjs
+function parseCookieValue(cookieStr, name) {
+  name = encodeURIComponent(name);
+  for (const cookie of cookieStr.split(";")) {
+    const eqIndex = cookie.indexOf("=");
+    const [cookieName, cookieValue] = eqIndex == -1 ? [cookie, ""] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];
+    if (cookieName.trim() === name) {
+      return decodeURIComponent(cookieValue);
+    }
+  }
+  return null;
+}
+var XhrFactory = class {
+};
+
+export {
+  parseCookieValue,
+  XhrFactory
+};
+/*! Bundled license information:
+
+@angular/common/fesm2022/xhr.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=chunk-OPGNYZHR.js.map

+ 7 - 0
ai-interview/vite/deps/chunk-OPGNYZHR.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": ["../../../../../../node_modules/@angular/common/fesm2022/xhr.mjs"],
+  "sourcesContent": ["/**\n * @license Angular v20.0.5\n * (c) 2010-2025 Google LLC. https://angular.io/\n * License: MIT\n */\n\nfunction parseCookieValue(cookieStr, name) {\n    name = encodeURIComponent(name);\n    for (const cookie of cookieStr.split(';')) {\n        const eqIndex = cookie.indexOf('=');\n        const [cookieName, cookieValue] = eqIndex == -1 ? [cookie, ''] : [cookie.slice(0, eqIndex), cookie.slice(eqIndex + 1)];\n        if (cookieName.trim() === name) {\n            return decodeURIComponent(cookieValue);\n        }\n    }\n    return null;\n}\n\n/**\n * A wrapper around the `XMLHttpRequest` constructor.\n *\n * @publicApi\n */\nclass XhrFactory {\n}\n\nexport { XhrFactory, parseCookieValue };\n\n"],
+  "mappings": ";AAMA,SAAS,iBAAiB,WAAW,MAAM;AACvC,SAAO,mBAAmB,IAAI;AAC9B,aAAW,UAAU,UAAU,MAAM,GAAG,GAAG;AACvC,UAAM,UAAU,OAAO,QAAQ,GAAG;AAClC,UAAM,CAAC,YAAY,WAAW,IAAI,WAAW,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,MAAM,GAAG,OAAO,GAAG,OAAO,MAAM,UAAU,CAAC,CAAC;AACrH,QAAI,WAAW,KAAK,MAAM,MAAM;AAC5B,aAAO,mBAAmB,WAAW;AAAA,IACzC;AAAA,EACJ;AACA,SAAO;AACX;AAOA,IAAM,aAAN,MAAiB;AACjB;",
+  "names": []
+}

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 688 - 0
ai-interview/vite/deps/chunk-T7KLW67N.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/chunk-T7KLW67N.js.map


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3177 - 0
ai-interview/vite/deps/chunk-VHSNDQRF.js


A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/chunk-VHSNDQRF.js.map


+ 58 - 0
ai-interview/vite/deps/chunk-WDMUDEB6.js

@@ -0,0 +1,58 @@
+var __defProp = Object.defineProperty;
+var __defProps = Object.defineProperties;
+var __getOwnPropDescs = Object.getOwnPropertyDescriptors;
+var __getOwnPropSymbols = Object.getOwnPropertySymbols;
+var __hasOwnProp = Object.prototype.hasOwnProperty;
+var __propIsEnum = Object.prototype.propertyIsEnumerable;
+var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
+var __spreadValues = (a, b) => {
+  for (var prop in b ||= {})
+    if (__hasOwnProp.call(b, prop))
+      __defNormalProp(a, prop, b[prop]);
+  if (__getOwnPropSymbols)
+    for (var prop of __getOwnPropSymbols(b)) {
+      if (__propIsEnum.call(b, prop))
+        __defNormalProp(a, prop, b[prop]);
+    }
+  return a;
+};
+var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
+var __objRest = (source, exclude) => {
+  var target = {};
+  for (var prop in source)
+    if (__hasOwnProp.call(source, prop) && exclude.indexOf(prop) < 0)
+      target[prop] = source[prop];
+  if (source != null && __getOwnPropSymbols)
+    for (var prop of __getOwnPropSymbols(source)) {
+      if (exclude.indexOf(prop) < 0 && __propIsEnum.call(source, prop))
+        target[prop] = source[prop];
+    }
+  return target;
+};
+var __async = (__this, __arguments, generator) => {
+  return new Promise((resolve, reject) => {
+    var fulfilled = (value) => {
+      try {
+        step(generator.next(value));
+      } catch (e) {
+        reject(e);
+      }
+    };
+    var rejected = (value) => {
+      try {
+        step(generator.throw(value));
+      } catch (e) {
+        reject(e);
+      }
+    };
+    var step = (x) => x.done ? resolve(x.value) : Promise.resolve(x.value).then(fulfilled, rejected);
+    step((generator = generator.apply(__this, __arguments)).next());
+  });
+};
+
+export {
+  __spreadValues,
+  __spreadProps,
+  __objRest,
+  __async
+};

+ 7 - 0
ai-interview/vite/deps/chunk-WDMUDEB6.js.map

@@ -0,0 +1,7 @@
+{
+  "version": 3,
+  "sources": [],
+  "sourcesContent": [],
+  "mappings": "",
+  "names": []
+}

+ 29822 - 0
ai-interview/vite/deps/chunk-Y7NS2SYH.js

@@ -0,0 +1,29822 @@
+import {
+  __async,
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/core/fesm2022/primitives/di.mjs
+var _currentInjector = void 0;
+function getCurrentInjector() {
+  return _currentInjector;
+}
+function setCurrentInjector(injector) {
+  const former = _currentInjector;
+  _currentInjector = injector;
+  return former;
+}
+var NOT_FOUND = Symbol("NotFound");
+var NotFoundError = class extends Error {
+  name = "ɵNotFound";
+  constructor(message) {
+    super(message);
+  }
+};
+function isNotFound(e) {
+  return e === NOT_FOUND || e?.name === "ɵNotFound";
+}
+
+// node_modules/@angular/core/fesm2022/signal.mjs
+function defaultEquals(a, b) {
+  return Object.is(a, b);
+}
+var activeConsumer = null;
+var inNotificationPhase = false;
+var epoch = 1;
+var postProducerCreatedFn = null;
+var SIGNAL = Symbol("SIGNAL");
+function setActiveConsumer(consumer) {
+  const prev = activeConsumer;
+  activeConsumer = consumer;
+  return prev;
+}
+function getActiveConsumer() {
+  return activeConsumer;
+}
+function isInNotificationPhase() {
+  return inNotificationPhase;
+}
+var REACTIVE_NODE = {
+  version: 0,
+  lastCleanEpoch: 0,
+  dirty: false,
+  producerNode: void 0,
+  producerLastReadVersion: void 0,
+  producerIndexOfThis: void 0,
+  nextProducerIndex: 0,
+  liveConsumerNode: void 0,
+  liveConsumerIndexOfThis: void 0,
+  consumerAllowSignalWrites: false,
+  consumerIsAlwaysLive: false,
+  kind: "unknown",
+  producerMustRecompute: () => false,
+  producerRecomputeValue: () => {
+  },
+  consumerMarkedDirty: () => {
+  },
+  consumerOnSignalRead: () => {
+  }
+};
+function producerAccessed(node) {
+  if (inNotificationPhase) {
+    throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? `Assertion error: signal read during notification phase` : "");
+  }
+  if (activeConsumer === null) {
+    return;
+  }
+  activeConsumer.consumerOnSignalRead(node);
+  const idx = activeConsumer.nextProducerIndex++;
+  assertConsumerNode(activeConsumer);
+  if (idx < activeConsumer.producerNode.length && activeConsumer.producerNode[idx] !== node) {
+    if (consumerIsLive(activeConsumer)) {
+      const staleProducer = activeConsumer.producerNode[idx];
+      producerRemoveLiveConsumerAtIndex(staleProducer, activeConsumer.producerIndexOfThis[idx]);
+    }
+  }
+  if (activeConsumer.producerNode[idx] !== node) {
+    activeConsumer.producerNode[idx] = node;
+    activeConsumer.producerIndexOfThis[idx] = consumerIsLive(activeConsumer) ? producerAddLiveConsumer(node, activeConsumer, idx) : 0;
+  }
+  activeConsumer.producerLastReadVersion[idx] = node.version;
+}
+function producerIncrementEpoch() {
+  epoch++;
+}
+function producerUpdateValueVersion(node) {
+  if (consumerIsLive(node) && !node.dirty) {
+    return;
+  }
+  if (!node.dirty && node.lastCleanEpoch === epoch) {
+    return;
+  }
+  if (!node.producerMustRecompute(node) && !consumerPollProducersForChange(node)) {
+    producerMarkClean(node);
+    return;
+  }
+  node.producerRecomputeValue(node);
+  producerMarkClean(node);
+}
+function producerNotifyConsumers(node) {
+  if (node.liveConsumerNode === void 0) {
+    return;
+  }
+  const prev = inNotificationPhase;
+  inNotificationPhase = true;
+  try {
+    for (const consumer of node.liveConsumerNode) {
+      if (!consumer.dirty) {
+        consumerMarkDirty(consumer);
+      }
+    }
+  } finally {
+    inNotificationPhase = prev;
+  }
+}
+function producerUpdatesAllowed() {
+  return activeConsumer?.consumerAllowSignalWrites !== false;
+}
+function consumerMarkDirty(node) {
+  node.dirty = true;
+  producerNotifyConsumers(node);
+  node.consumerMarkedDirty?.(node);
+}
+function producerMarkClean(node) {
+  node.dirty = false;
+  node.lastCleanEpoch = epoch;
+}
+function consumerBeforeComputation(node) {
+  node && (node.nextProducerIndex = 0);
+  return setActiveConsumer(node);
+}
+function consumerAfterComputation(node, prevConsumer) {
+  setActiveConsumer(prevConsumer);
+  if (!node || node.producerNode === void 0 || node.producerIndexOfThis === void 0 || node.producerLastReadVersion === void 0) {
+    return;
+  }
+  if (consumerIsLive(node)) {
+    for (let i = node.nextProducerIndex; i < node.producerNode.length; i++) {
+      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
+    }
+  }
+  while (node.producerNode.length > node.nextProducerIndex) {
+    node.producerNode.pop();
+    node.producerLastReadVersion.pop();
+    node.producerIndexOfThis.pop();
+  }
+}
+function consumerPollProducersForChange(node) {
+  assertConsumerNode(node);
+  for (let i = 0; i < node.producerNode.length; i++) {
+    const producer = node.producerNode[i];
+    const seenVersion = node.producerLastReadVersion[i];
+    if (seenVersion !== producer.version) {
+      return true;
+    }
+    producerUpdateValueVersion(producer);
+    if (seenVersion !== producer.version) {
+      return true;
+    }
+  }
+  return false;
+}
+function consumerDestroy(node) {
+  assertConsumerNode(node);
+  if (consumerIsLive(node)) {
+    for (let i = 0; i < node.producerNode.length; i++) {
+      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
+    }
+  }
+  node.producerNode.length = node.producerLastReadVersion.length = node.producerIndexOfThis.length = 0;
+  if (node.liveConsumerNode) {
+    node.liveConsumerNode.length = node.liveConsumerIndexOfThis.length = 0;
+  }
+}
+function producerAddLiveConsumer(node, consumer, indexOfThis) {
+  assertProducerNode(node);
+  if (node.liveConsumerNode.length === 0 && isConsumerNode(node)) {
+    for (let i = 0; i < node.producerNode.length; i++) {
+      node.producerIndexOfThis[i] = producerAddLiveConsumer(node.producerNode[i], node, i);
+    }
+  }
+  node.liveConsumerIndexOfThis.push(indexOfThis);
+  return node.liveConsumerNode.push(consumer) - 1;
+}
+function producerRemoveLiveConsumerAtIndex(node, idx) {
+  assertProducerNode(node);
+  if (typeof ngDevMode !== "undefined" && ngDevMode && idx >= node.liveConsumerNode.length) {
+    throw new Error(`Assertion error: active consumer index ${idx} is out of bounds of ${node.liveConsumerNode.length} consumers)`);
+  }
+  if (node.liveConsumerNode.length === 1 && isConsumerNode(node)) {
+    for (let i = 0; i < node.producerNode.length; i++) {
+      producerRemoveLiveConsumerAtIndex(node.producerNode[i], node.producerIndexOfThis[i]);
+    }
+  }
+  const lastIdx = node.liveConsumerNode.length - 1;
+  node.liveConsumerNode[idx] = node.liveConsumerNode[lastIdx];
+  node.liveConsumerIndexOfThis[idx] = node.liveConsumerIndexOfThis[lastIdx];
+  node.liveConsumerNode.length--;
+  node.liveConsumerIndexOfThis.length--;
+  if (idx < node.liveConsumerNode.length) {
+    const idxProducer = node.liveConsumerIndexOfThis[idx];
+    const consumer = node.liveConsumerNode[idx];
+    assertConsumerNode(consumer);
+    consumer.producerIndexOfThis[idxProducer] = idx;
+  }
+}
+function consumerIsLive(node) {
+  return node.consumerIsAlwaysLive || (node?.liveConsumerNode?.length ?? 0) > 0;
+}
+function assertConsumerNode(node) {
+  node.producerNode ??= [];
+  node.producerIndexOfThis ??= [];
+  node.producerLastReadVersion ??= [];
+}
+function assertProducerNode(node) {
+  node.liveConsumerNode ??= [];
+  node.liveConsumerIndexOfThis ??= [];
+}
+function isConsumerNode(node) {
+  return node.producerNode !== void 0;
+}
+function runPostProducerCreatedFn(node) {
+  postProducerCreatedFn?.(node);
+}
+function createComputed(computation, equal) {
+  const node = Object.create(COMPUTED_NODE);
+  node.computation = computation;
+  if (equal !== void 0) {
+    node.equal = equal;
+  }
+  const computed2 = () => {
+    producerUpdateValueVersion(node);
+    producerAccessed(node);
+    if (node.value === ERRORED) {
+      throw node.error;
+    }
+    return node.value;
+  };
+  computed2[SIGNAL] = node;
+  if (typeof ngDevMode !== "undefined" && ngDevMode) {
+    const debugName = node.debugName ? " (" + node.debugName + ")" : "";
+    computed2.toString = () => `[Computed${debugName}: ${node.value}]`;
+  }
+  runPostProducerCreatedFn(node);
+  return computed2;
+}
+var UNSET = Symbol("UNSET");
+var COMPUTING = Symbol("COMPUTING");
+var ERRORED = Symbol("ERRORED");
+var COMPUTED_NODE = (() => {
+  return __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+    value: UNSET,
+    dirty: true,
+    error: null,
+    equal: defaultEquals,
+    kind: "computed",
+    producerMustRecompute(node) {
+      return node.value === UNSET || node.value === COMPUTING;
+    },
+    producerRecomputeValue(node) {
+      if (node.value === COMPUTING) {
+        throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Detected cycle in computations." : "");
+      }
+      const oldValue = node.value;
+      node.value = COMPUTING;
+      const prevConsumer = consumerBeforeComputation(node);
+      let newValue;
+      let wasEqual = false;
+      try {
+        newValue = node.computation();
+        setActiveConsumer(null);
+        wasEqual = oldValue !== UNSET && oldValue !== ERRORED && newValue !== ERRORED && node.equal(oldValue, newValue);
+      } catch (err) {
+        newValue = ERRORED;
+        node.error = err;
+      } finally {
+        consumerAfterComputation(node, prevConsumer);
+      }
+      if (wasEqual) {
+        node.value = oldValue;
+        return;
+      }
+      node.value = newValue;
+      node.version++;
+    }
+  });
+})();
+function defaultThrowError() {
+  throw new Error();
+}
+var throwInvalidWriteToSignalErrorFn = defaultThrowError;
+function throwInvalidWriteToSignalError(node) {
+  throwInvalidWriteToSignalErrorFn(node);
+}
+function setThrowInvalidWriteToSignalError(fn) {
+  throwInvalidWriteToSignalErrorFn = fn;
+}
+var postSignalSetFn = null;
+function createSignal(initialValue, equal) {
+  const node = Object.create(SIGNAL_NODE);
+  node.value = initialValue;
+  if (equal !== void 0) {
+    node.equal = equal;
+  }
+  const getter = () => signalGetFn(node);
+  getter[SIGNAL] = node;
+  if (typeof ngDevMode !== "undefined" && ngDevMode) {
+    const debugName = node.debugName ? " (" + node.debugName + ")" : "";
+    getter.toString = () => `[Signal${debugName}: ${node.value}]`;
+  }
+  runPostProducerCreatedFn(node);
+  const set2 = (newValue) => signalSetFn(node, newValue);
+  const update = (updateFn) => signalUpdateFn(node, updateFn);
+  return [getter, set2, update];
+}
+function signalGetFn(node) {
+  producerAccessed(node);
+  return node.value;
+}
+function signalSetFn(node, newValue) {
+  if (!producerUpdatesAllowed()) {
+    throwInvalidWriteToSignalError(node);
+  }
+  if (!node.equal(node.value, newValue)) {
+    node.value = newValue;
+    signalValueChanged(node);
+  }
+}
+function signalUpdateFn(node, updater) {
+  if (!producerUpdatesAllowed()) {
+    throwInvalidWriteToSignalError(node);
+  }
+  signalSetFn(node, updater(node.value));
+}
+var SIGNAL_NODE = (() => {
+  return __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+    equal: defaultEquals,
+    value: void 0,
+    kind: "signal"
+  });
+})();
+function signalValueChanged(node) {
+  node.version++;
+  producerIncrementEpoch();
+  producerNotifyConsumers(node);
+  postSignalSetFn?.(node);
+}
+
+// node_modules/tslib/tslib.es6.mjs
+var extendStatics = function(d, b) {
+  extendStatics = Object.setPrototypeOf || { __proto__: [] } instanceof Array && function(d2, b2) {
+    d2.__proto__ = b2;
+  } || function(d2, b2) {
+    for (var p in b2) if (Object.prototype.hasOwnProperty.call(b2, p)) d2[p] = b2[p];
+  };
+  return extendStatics(d, b);
+};
+function __extends(d, b) {
+  if (typeof b !== "function" && b !== null)
+    throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
+  extendStatics(d, b);
+  function __() {
+    this.constructor = d;
+  }
+  d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
+}
+function __awaiter(thisArg, _arguments, P, generator) {
+  function adopt(value) {
+    return value instanceof P ? value : new P(function(resolve) {
+      resolve(value);
+    });
+  }
+  return new (P || (P = Promise))(function(resolve, reject) {
+    function fulfilled(value) {
+      try {
+        step(generator.next(value));
+      } catch (e) {
+        reject(e);
+      }
+    }
+    function rejected(value) {
+      try {
+        step(generator["throw"](value));
+      } catch (e) {
+        reject(e);
+      }
+    }
+    function step(result) {
+      result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected);
+    }
+    step((generator = generator.apply(thisArg, _arguments || [])).next());
+  });
+}
+function __generator(thisArg, body) {
+  var _ = { label: 0, sent: function() {
+    if (t[0] & 1) throw t[1];
+    return t[1];
+  }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
+  return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() {
+    return this;
+  }), g;
+  function verb(n) {
+    return function(v) {
+      return step([n, v]);
+    };
+  }
+  function step(op) {
+    if (f) throw new TypeError("Generator is already executing.");
+    while (g && (g = 0, op[0] && (_ = 0)), _) try {
+      if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
+      if (y = 0, t) op = [op[0] & 2, t.value];
+      switch (op[0]) {
+        case 0:
+        case 1:
+          t = op;
+          break;
+        case 4:
+          _.label++;
+          return { value: op[1], done: false };
+        case 5:
+          _.label++;
+          y = op[1];
+          op = [0];
+          continue;
+        case 7:
+          op = _.ops.pop();
+          _.trys.pop();
+          continue;
+        default:
+          if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) {
+            _ = 0;
+            continue;
+          }
+          if (op[0] === 3 && (!t || op[1] > t[0] && op[1] < t[3])) {
+            _.label = op[1];
+            break;
+          }
+          if (op[0] === 6 && _.label < t[1]) {
+            _.label = t[1];
+            t = op;
+            break;
+          }
+          if (t && _.label < t[2]) {
+            _.label = t[2];
+            _.ops.push(op);
+            break;
+          }
+          if (t[2]) _.ops.pop();
+          _.trys.pop();
+          continue;
+      }
+      op = body.call(thisArg, _);
+    } catch (e) {
+      op = [6, e];
+      y = 0;
+    } finally {
+      f = t = 0;
+    }
+    if (op[0] & 5) throw op[1];
+    return { value: op[0] ? op[1] : void 0, done: true };
+  }
+}
+function __values(o) {
+  var s = typeof Symbol === "function" && Symbol.iterator, m = s && o[s], i = 0;
+  if (m) return m.call(o);
+  if (o && typeof o.length === "number") return {
+    next: function() {
+      if (o && i >= o.length) o = void 0;
+      return { value: o && o[i++], done: !o };
+    }
+  };
+  throw new TypeError(s ? "Object is not iterable." : "Symbol.iterator is not defined.");
+}
+function __read(o, n) {
+  var m = typeof Symbol === "function" && o[Symbol.iterator];
+  if (!m) return o;
+  var i = m.call(o), r, ar = [], e;
+  try {
+    while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
+  } catch (error) {
+    e = { error };
+  } finally {
+    try {
+      if (r && !r.done && (m = i["return"])) m.call(i);
+    } finally {
+      if (e) throw e.error;
+    }
+  }
+  return ar;
+}
+function __spreadArray(to, from2, pack) {
+  if (pack || arguments.length === 2) for (var i = 0, l = from2.length, ar; i < l; i++) {
+    if (ar || !(i in from2)) {
+      if (!ar) ar = Array.prototype.slice.call(from2, 0, i);
+      ar[i] = from2[i];
+    }
+  }
+  return to.concat(ar || Array.prototype.slice.call(from2));
+}
+function __await(v) {
+  return this instanceof __await ? (this.v = v, this) : new __await(v);
+}
+function __asyncGenerator(thisArg, _arguments, generator) {
+  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+  var g = generator.apply(thisArg, _arguments || []), i, q = [];
+  return i = Object.create((typeof AsyncIterator === "function" ? AsyncIterator : Object).prototype), verb("next"), verb("throw"), verb("return", awaitReturn), i[Symbol.asyncIterator] = function() {
+    return this;
+  }, i;
+  function awaitReturn(f) {
+    return function(v) {
+      return Promise.resolve(v).then(f, reject);
+    };
+  }
+  function verb(n, f) {
+    if (g[n]) {
+      i[n] = function(v) {
+        return new Promise(function(a, b) {
+          q.push([n, v, a, b]) > 1 || resume(n, v);
+        });
+      };
+      if (f) i[n] = f(i[n]);
+    }
+  }
+  function resume(n, v) {
+    try {
+      step(g[n](v));
+    } catch (e) {
+      settle(q[0][3], e);
+    }
+  }
+  function step(r) {
+    r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r);
+  }
+  function fulfill(value) {
+    resume("next", value);
+  }
+  function reject(value) {
+    resume("throw", value);
+  }
+  function settle(f, v) {
+    if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]);
+  }
+}
+function __asyncValues(o) {
+  if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined.");
+  var m = o[Symbol.asyncIterator], i;
+  return m ? m.call(o) : (o = typeof __values === "function" ? __values(o) : o[Symbol.iterator](), i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function() {
+    return this;
+  }, i);
+  function verb(n) {
+    i[n] = o[n] && function(v) {
+      return new Promise(function(resolve, reject) {
+        v = o[n](v), settle(resolve, reject, v.done, v.value);
+      });
+    };
+  }
+  function settle(resolve, reject, d, v) {
+    Promise.resolve(v).then(function(v2) {
+      resolve({ value: v2, done: d });
+    }, reject);
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isFunction.js
+function isFunction(value) {
+  return typeof value === "function";
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/createErrorClass.js
+function createErrorClass(createImpl) {
+  var _super = function(instance) {
+    Error.call(instance);
+    instance.stack = new Error().stack;
+  };
+  var ctorFunc = createImpl(_super);
+  ctorFunc.prototype = Object.create(Error.prototype);
+  ctorFunc.prototype.constructor = ctorFunc;
+  return ctorFunc;
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/UnsubscriptionError.js
+var UnsubscriptionError = createErrorClass(function(_super) {
+  return function UnsubscriptionErrorImpl(errors) {
+    _super(this);
+    this.message = errors ? errors.length + " errors occurred during unsubscription:\n" + errors.map(function(err, i) {
+      return i + 1 + ") " + err.toString();
+    }).join("\n  ") : "";
+    this.name = "UnsubscriptionError";
+    this.errors = errors;
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/util/arrRemove.js
+function arrRemove(arr, item) {
+  if (arr) {
+    var index = arr.indexOf(item);
+    0 <= index && arr.splice(index, 1);
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/Subscription.js
+var Subscription = function() {
+  function Subscription2(initialTeardown) {
+    this.initialTeardown = initialTeardown;
+    this.closed = false;
+    this._parentage = null;
+    this._finalizers = null;
+  }
+  Subscription2.prototype.unsubscribe = function() {
+    var e_1, _a, e_2, _b;
+    var errors;
+    if (!this.closed) {
+      this.closed = true;
+      var _parentage = this._parentage;
+      if (_parentage) {
+        this._parentage = null;
+        if (Array.isArray(_parentage)) {
+          try {
+            for (var _parentage_1 = __values(_parentage), _parentage_1_1 = _parentage_1.next(); !_parentage_1_1.done; _parentage_1_1 = _parentage_1.next()) {
+              var parent_1 = _parentage_1_1.value;
+              parent_1.remove(this);
+            }
+          } catch (e_1_1) {
+            e_1 = { error: e_1_1 };
+          } finally {
+            try {
+              if (_parentage_1_1 && !_parentage_1_1.done && (_a = _parentage_1.return)) _a.call(_parentage_1);
+            } finally {
+              if (e_1) throw e_1.error;
+            }
+          }
+        } else {
+          _parentage.remove(this);
+        }
+      }
+      var initialFinalizer = this.initialTeardown;
+      if (isFunction(initialFinalizer)) {
+        try {
+          initialFinalizer();
+        } catch (e) {
+          errors = e instanceof UnsubscriptionError ? e.errors : [e];
+        }
+      }
+      var _finalizers = this._finalizers;
+      if (_finalizers) {
+        this._finalizers = null;
+        try {
+          for (var _finalizers_1 = __values(_finalizers), _finalizers_1_1 = _finalizers_1.next(); !_finalizers_1_1.done; _finalizers_1_1 = _finalizers_1.next()) {
+            var finalizer = _finalizers_1_1.value;
+            try {
+              execFinalizer(finalizer);
+            } catch (err) {
+              errors = errors !== null && errors !== void 0 ? errors : [];
+              if (err instanceof UnsubscriptionError) {
+                errors = __spreadArray(__spreadArray([], __read(errors)), __read(err.errors));
+              } else {
+                errors.push(err);
+              }
+            }
+          }
+        } catch (e_2_1) {
+          e_2 = { error: e_2_1 };
+        } finally {
+          try {
+            if (_finalizers_1_1 && !_finalizers_1_1.done && (_b = _finalizers_1.return)) _b.call(_finalizers_1);
+          } finally {
+            if (e_2) throw e_2.error;
+          }
+        }
+      }
+      if (errors) {
+        throw new UnsubscriptionError(errors);
+      }
+    }
+  };
+  Subscription2.prototype.add = function(teardown) {
+    var _a;
+    if (teardown && teardown !== this) {
+      if (this.closed) {
+        execFinalizer(teardown);
+      } else {
+        if (teardown instanceof Subscription2) {
+          if (teardown.closed || teardown._hasParent(this)) {
+            return;
+          }
+          teardown._addParent(this);
+        }
+        (this._finalizers = (_a = this._finalizers) !== null && _a !== void 0 ? _a : []).push(teardown);
+      }
+    }
+  };
+  Subscription2.prototype._hasParent = function(parent) {
+    var _parentage = this._parentage;
+    return _parentage === parent || Array.isArray(_parentage) && _parentage.includes(parent);
+  };
+  Subscription2.prototype._addParent = function(parent) {
+    var _parentage = this._parentage;
+    this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;
+  };
+  Subscription2.prototype._removeParent = function(parent) {
+    var _parentage = this._parentage;
+    if (_parentage === parent) {
+      this._parentage = null;
+    } else if (Array.isArray(_parentage)) {
+      arrRemove(_parentage, parent);
+    }
+  };
+  Subscription2.prototype.remove = function(teardown) {
+    var _finalizers = this._finalizers;
+    _finalizers && arrRemove(_finalizers, teardown);
+    if (teardown instanceof Subscription2) {
+      teardown._removeParent(this);
+    }
+  };
+  Subscription2.EMPTY = function() {
+    var empty2 = new Subscription2();
+    empty2.closed = true;
+    return empty2;
+  }();
+  return Subscription2;
+}();
+var EMPTY_SUBSCRIPTION = Subscription.EMPTY;
+function isSubscription(value) {
+  return value instanceof Subscription || value && "closed" in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe);
+}
+function execFinalizer(finalizer) {
+  if (isFunction(finalizer)) {
+    finalizer();
+  } else {
+    finalizer.unsubscribe();
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/config.js
+var config = {
+  onUnhandledError: null,
+  onStoppedNotification: null,
+  Promise: void 0,
+  useDeprecatedSynchronousErrorHandling: false,
+  useDeprecatedNextContext: false
+};
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/timeoutProvider.js
+var timeoutProvider = {
+  setTimeout: function(handler, timeout2) {
+    var args = [];
+    for (var _i = 2; _i < arguments.length; _i++) {
+      args[_i - 2] = arguments[_i];
+    }
+    var delegate = timeoutProvider.delegate;
+    if (delegate === null || delegate === void 0 ? void 0 : delegate.setTimeout) {
+      return delegate.setTimeout.apply(delegate, __spreadArray([handler, timeout2], __read(args)));
+    }
+    return setTimeout.apply(void 0, __spreadArray([handler, timeout2], __read(args)));
+  },
+  clearTimeout: function(handle) {
+    var delegate = timeoutProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearTimeout) || clearTimeout)(handle);
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/util/reportUnhandledError.js
+function reportUnhandledError(err) {
+  timeoutProvider.setTimeout(function() {
+    var onUnhandledError = config.onUnhandledError;
+    if (onUnhandledError) {
+      onUnhandledError(err);
+    } else {
+      throw err;
+    }
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/noop.js
+function noop() {
+}
+
+// node_modules/rxjs/dist/esm5/internal/NotificationFactories.js
+var COMPLETE_NOTIFICATION = function() {
+  return createNotification("C", void 0, void 0);
+}();
+function errorNotification(error) {
+  return createNotification("E", void 0, error);
+}
+function nextNotification(value) {
+  return createNotification("N", value, void 0);
+}
+function createNotification(kind, value, error) {
+  return {
+    kind,
+    value,
+    error
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/errorContext.js
+var context = null;
+function errorContext(cb) {
+  if (config.useDeprecatedSynchronousErrorHandling) {
+    var isRoot = !context;
+    if (isRoot) {
+      context = { errorThrown: false, error: null };
+    }
+    cb();
+    if (isRoot) {
+      var _a = context, errorThrown = _a.errorThrown, error = _a.error;
+      context = null;
+      if (errorThrown) {
+        throw error;
+      }
+    }
+  } else {
+    cb();
+  }
+}
+function captureError(err) {
+  if (config.useDeprecatedSynchronousErrorHandling && context) {
+    context.errorThrown = true;
+    context.error = err;
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/Subscriber.js
+var Subscriber = function(_super) {
+  __extends(Subscriber2, _super);
+  function Subscriber2(destination) {
+    var _this = _super.call(this) || this;
+    _this.isStopped = false;
+    if (destination) {
+      _this.destination = destination;
+      if (isSubscription(destination)) {
+        destination.add(_this);
+      }
+    } else {
+      _this.destination = EMPTY_OBSERVER;
+    }
+    return _this;
+  }
+  Subscriber2.create = function(next, error, complete) {
+    return new SafeSubscriber(next, error, complete);
+  };
+  Subscriber2.prototype.next = function(value) {
+    if (this.isStopped) {
+      handleStoppedNotification(nextNotification(value), this);
+    } else {
+      this._next(value);
+    }
+  };
+  Subscriber2.prototype.error = function(err) {
+    if (this.isStopped) {
+      handleStoppedNotification(errorNotification(err), this);
+    } else {
+      this.isStopped = true;
+      this._error(err);
+    }
+  };
+  Subscriber2.prototype.complete = function() {
+    if (this.isStopped) {
+      handleStoppedNotification(COMPLETE_NOTIFICATION, this);
+    } else {
+      this.isStopped = true;
+      this._complete();
+    }
+  };
+  Subscriber2.prototype.unsubscribe = function() {
+    if (!this.closed) {
+      this.isStopped = true;
+      _super.prototype.unsubscribe.call(this);
+      this.destination = null;
+    }
+  };
+  Subscriber2.prototype._next = function(value) {
+    this.destination.next(value);
+  };
+  Subscriber2.prototype._error = function(err) {
+    try {
+      this.destination.error(err);
+    } finally {
+      this.unsubscribe();
+    }
+  };
+  Subscriber2.prototype._complete = function() {
+    try {
+      this.destination.complete();
+    } finally {
+      this.unsubscribe();
+    }
+  };
+  return Subscriber2;
+}(Subscription);
+var _bind = Function.prototype.bind;
+function bind(fn, thisArg) {
+  return _bind.call(fn, thisArg);
+}
+var ConsumerObserver = function() {
+  function ConsumerObserver2(partialObserver) {
+    this.partialObserver = partialObserver;
+  }
+  ConsumerObserver2.prototype.next = function(value) {
+    var partialObserver = this.partialObserver;
+    if (partialObserver.next) {
+      try {
+        partialObserver.next(value);
+      } catch (error) {
+        handleUnhandledError(error);
+      }
+    }
+  };
+  ConsumerObserver2.prototype.error = function(err) {
+    var partialObserver = this.partialObserver;
+    if (partialObserver.error) {
+      try {
+        partialObserver.error(err);
+      } catch (error) {
+        handleUnhandledError(error);
+      }
+    } else {
+      handleUnhandledError(err);
+    }
+  };
+  ConsumerObserver2.prototype.complete = function() {
+    var partialObserver = this.partialObserver;
+    if (partialObserver.complete) {
+      try {
+        partialObserver.complete();
+      } catch (error) {
+        handleUnhandledError(error);
+      }
+    }
+  };
+  return ConsumerObserver2;
+}();
+var SafeSubscriber = function(_super) {
+  __extends(SafeSubscriber2, _super);
+  function SafeSubscriber2(observerOrNext, error, complete) {
+    var _this = _super.call(this) || this;
+    var partialObserver;
+    if (isFunction(observerOrNext) || !observerOrNext) {
+      partialObserver = {
+        next: observerOrNext !== null && observerOrNext !== void 0 ? observerOrNext : void 0,
+        error: error !== null && error !== void 0 ? error : void 0,
+        complete: complete !== null && complete !== void 0 ? complete : void 0
+      };
+    } else {
+      var context_1;
+      if (_this && config.useDeprecatedNextContext) {
+        context_1 = Object.create(observerOrNext);
+        context_1.unsubscribe = function() {
+          return _this.unsubscribe();
+        };
+        partialObserver = {
+          next: observerOrNext.next && bind(observerOrNext.next, context_1),
+          error: observerOrNext.error && bind(observerOrNext.error, context_1),
+          complete: observerOrNext.complete && bind(observerOrNext.complete, context_1)
+        };
+      } else {
+        partialObserver = observerOrNext;
+      }
+    }
+    _this.destination = new ConsumerObserver(partialObserver);
+    return _this;
+  }
+  return SafeSubscriber2;
+}(Subscriber);
+function handleUnhandledError(error) {
+  if (config.useDeprecatedSynchronousErrorHandling) {
+    captureError(error);
+  } else {
+    reportUnhandledError(error);
+  }
+}
+function defaultErrorHandler(err) {
+  throw err;
+}
+function handleStoppedNotification(notification, subscriber) {
+  var onStoppedNotification = config.onStoppedNotification;
+  onStoppedNotification && timeoutProvider.setTimeout(function() {
+    return onStoppedNotification(notification, subscriber);
+  });
+}
+var EMPTY_OBSERVER = {
+  closed: true,
+  next: noop,
+  error: defaultErrorHandler,
+  complete: noop
+};
+
+// node_modules/rxjs/dist/esm5/internal/symbol/observable.js
+var observable = function() {
+  return typeof Symbol === "function" && Symbol.observable || "@@observable";
+}();
+
+// node_modules/rxjs/dist/esm5/internal/util/identity.js
+function identity(x) {
+  return x;
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/pipe.js
+function pipe() {
+  var fns = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    fns[_i] = arguments[_i];
+  }
+  return pipeFromArray(fns);
+}
+function pipeFromArray(fns) {
+  if (fns.length === 0) {
+    return identity;
+  }
+  if (fns.length === 1) {
+    return fns[0];
+  }
+  return function piped(input2) {
+    return fns.reduce(function(prev, fn) {
+      return fn(prev);
+    }, input2);
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/Observable.js
+var Observable = function() {
+  function Observable2(subscribe) {
+    if (subscribe) {
+      this._subscribe = subscribe;
+    }
+  }
+  Observable2.prototype.lift = function(operator) {
+    var observable2 = new Observable2();
+    observable2.source = this;
+    observable2.operator = operator;
+    return observable2;
+  };
+  Observable2.prototype.subscribe = function(observerOrNext, error, complete) {
+    var _this = this;
+    var subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);
+    errorContext(function() {
+      var _a = _this, operator = _a.operator, source = _a.source;
+      subscriber.add(operator ? operator.call(subscriber, source) : source ? _this._subscribe(subscriber) : _this._trySubscribe(subscriber));
+    });
+    return subscriber;
+  };
+  Observable2.prototype._trySubscribe = function(sink) {
+    try {
+      return this._subscribe(sink);
+    } catch (err) {
+      sink.error(err);
+    }
+  };
+  Observable2.prototype.forEach = function(next, promiseCtor) {
+    var _this = this;
+    promiseCtor = getPromiseCtor(promiseCtor);
+    return new promiseCtor(function(resolve, reject) {
+      var subscriber = new SafeSubscriber({
+        next: function(value) {
+          try {
+            next(value);
+          } catch (err) {
+            reject(err);
+            subscriber.unsubscribe();
+          }
+        },
+        error: reject,
+        complete: resolve
+      });
+      _this.subscribe(subscriber);
+    });
+  };
+  Observable2.prototype._subscribe = function(subscriber) {
+    var _a;
+    return (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber);
+  };
+  Observable2.prototype[observable] = function() {
+    return this;
+  };
+  Observable2.prototype.pipe = function() {
+    var operations = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+      operations[_i] = arguments[_i];
+    }
+    return pipeFromArray(operations)(this);
+  };
+  Observable2.prototype.toPromise = function(promiseCtor) {
+    var _this = this;
+    promiseCtor = getPromiseCtor(promiseCtor);
+    return new promiseCtor(function(resolve, reject) {
+      var value;
+      _this.subscribe(function(x) {
+        return value = x;
+      }, function(err) {
+        return reject(err);
+      }, function() {
+        return resolve(value);
+      });
+    });
+  };
+  Observable2.create = function(subscribe) {
+    return new Observable2(subscribe);
+  };
+  return Observable2;
+}();
+function getPromiseCtor(promiseCtor) {
+  var _a;
+  return (_a = promiseCtor !== null && promiseCtor !== void 0 ? promiseCtor : config.Promise) !== null && _a !== void 0 ? _a : Promise;
+}
+function isObserver(value) {
+  return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);
+}
+function isSubscriber(value) {
+  return value && value instanceof Subscriber || isObserver(value) && isSubscription(value);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/lift.js
+function hasLift(source) {
+  return isFunction(source === null || source === void 0 ? void 0 : source.lift);
+}
+function operate(init) {
+  return function(source) {
+    if (hasLift(source)) {
+      return source.lift(function(liftedSource) {
+        try {
+          return init(liftedSource, this);
+        } catch (err) {
+          this.error(err);
+        }
+      });
+    }
+    throw new TypeError("Unable to lift unknown Observable type");
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/OperatorSubscriber.js
+function createOperatorSubscriber(destination, onNext, onComplete, onError, onFinalize) {
+  return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);
+}
+var OperatorSubscriber = function(_super) {
+  __extends(OperatorSubscriber2, _super);
+  function OperatorSubscriber2(destination, onNext, onComplete, onError, onFinalize, shouldUnsubscribe) {
+    var _this = _super.call(this, destination) || this;
+    _this.onFinalize = onFinalize;
+    _this.shouldUnsubscribe = shouldUnsubscribe;
+    _this._next = onNext ? function(value) {
+      try {
+        onNext(value);
+      } catch (err) {
+        destination.error(err);
+      }
+    } : _super.prototype._next;
+    _this._error = onError ? function(err) {
+      try {
+        onError(err);
+      } catch (err2) {
+        destination.error(err2);
+      } finally {
+        this.unsubscribe();
+      }
+    } : _super.prototype._error;
+    _this._complete = onComplete ? function() {
+      try {
+        onComplete();
+      } catch (err) {
+        destination.error(err);
+      } finally {
+        this.unsubscribe();
+      }
+    } : _super.prototype._complete;
+    return _this;
+  }
+  OperatorSubscriber2.prototype.unsubscribe = function() {
+    var _a;
+    if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {
+      var closed_1 = this.closed;
+      _super.prototype.unsubscribe.call(this);
+      !closed_1 && ((_a = this.onFinalize) === null || _a === void 0 ? void 0 : _a.call(this));
+    }
+  };
+  return OperatorSubscriber2;
+}(Subscriber);
+
+// node_modules/rxjs/dist/esm5/internal/operators/refCount.js
+function refCount() {
+  return operate(function(source, subscriber) {
+    var connection = null;
+    source._refCount++;
+    var refCounter = createOperatorSubscriber(subscriber, void 0, void 0, void 0, function() {
+      if (!source || source._refCount <= 0 || 0 < --source._refCount) {
+        connection = null;
+        return;
+      }
+      var sharedConnection = source._connection;
+      var conn = connection;
+      connection = null;
+      if (sharedConnection && (!conn || sharedConnection === conn)) {
+        sharedConnection.unsubscribe();
+      }
+      subscriber.unsubscribe();
+    });
+    source.subscribe(refCounter);
+    if (!refCounter.closed) {
+      connection = source.connect();
+    }
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/ConnectableObservable.js
+var ConnectableObservable = function(_super) {
+  __extends(ConnectableObservable2, _super);
+  function ConnectableObservable2(source, subjectFactory) {
+    var _this = _super.call(this) || this;
+    _this.source = source;
+    _this.subjectFactory = subjectFactory;
+    _this._subject = null;
+    _this._refCount = 0;
+    _this._connection = null;
+    if (hasLift(source)) {
+      _this.lift = source.lift;
+    }
+    return _this;
+  }
+  ConnectableObservable2.prototype._subscribe = function(subscriber) {
+    return this.getSubject().subscribe(subscriber);
+  };
+  ConnectableObservable2.prototype.getSubject = function() {
+    var subject = this._subject;
+    if (!subject || subject.isStopped) {
+      this._subject = this.subjectFactory();
+    }
+    return this._subject;
+  };
+  ConnectableObservable2.prototype._teardown = function() {
+    this._refCount = 0;
+    var _connection = this._connection;
+    this._subject = this._connection = null;
+    _connection === null || _connection === void 0 ? void 0 : _connection.unsubscribe();
+  };
+  ConnectableObservable2.prototype.connect = function() {
+    var _this = this;
+    var connection = this._connection;
+    if (!connection) {
+      connection = this._connection = new Subscription();
+      var subject_1 = this.getSubject();
+      connection.add(this.source.subscribe(createOperatorSubscriber(subject_1, void 0, function() {
+        _this._teardown();
+        subject_1.complete();
+      }, function(err) {
+        _this._teardown();
+        subject_1.error(err);
+      }, function() {
+        return _this._teardown();
+      })));
+      if (connection.closed) {
+        this._connection = null;
+        connection = Subscription.EMPTY;
+      }
+    }
+    return connection;
+  };
+  ConnectableObservable2.prototype.refCount = function() {
+    return refCount()(this);
+  };
+  return ConnectableObservable2;
+}(Observable);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/performanceTimestampProvider.js
+var performanceTimestampProvider = {
+  now: function() {
+    return (performanceTimestampProvider.delegate || performance).now();
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/animationFrameProvider.js
+var animationFrameProvider = {
+  schedule: function(callback) {
+    var request = requestAnimationFrame;
+    var cancel = cancelAnimationFrame;
+    var delegate = animationFrameProvider.delegate;
+    if (delegate) {
+      request = delegate.requestAnimationFrame;
+      cancel = delegate.cancelAnimationFrame;
+    }
+    var handle = request(function(timestamp2) {
+      cancel = void 0;
+      callback(timestamp2);
+    });
+    return new Subscription(function() {
+      return cancel === null || cancel === void 0 ? void 0 : cancel(handle);
+    });
+  },
+  requestAnimationFrame: function() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+      args[_i] = arguments[_i];
+    }
+    var delegate = animationFrameProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.requestAnimationFrame) || requestAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
+  },
+  cancelAnimationFrame: function() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+      args[_i] = arguments[_i];
+    }
+    var delegate = animationFrameProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.cancelAnimationFrame) || cancelAnimationFrame).apply(void 0, __spreadArray([], __read(args)));
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/observable/dom/animationFrames.js
+function animationFramesFactory(timestampProvider) {
+  return new Observable(function(subscriber) {
+    var provider = timestampProvider || performanceTimestampProvider;
+    var start = provider.now();
+    var id = 0;
+    var run = function() {
+      if (!subscriber.closed) {
+        id = animationFrameProvider.requestAnimationFrame(function(timestamp2) {
+          id = 0;
+          var now = provider.now();
+          subscriber.next({
+            timestamp: timestampProvider ? now : timestamp2,
+            elapsed: now - start
+          });
+          run();
+        });
+      }
+    };
+    run();
+    return function() {
+      if (id) {
+        animationFrameProvider.cancelAnimationFrame(id);
+      }
+    };
+  });
+}
+var DEFAULT_ANIMATION_FRAMES = animationFramesFactory();
+
+// node_modules/rxjs/dist/esm5/internal/util/ObjectUnsubscribedError.js
+var ObjectUnsubscribedError = createErrorClass(function(_super) {
+  return function ObjectUnsubscribedErrorImpl() {
+    _super(this);
+    this.name = "ObjectUnsubscribedError";
+    this.message = "object unsubscribed";
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/Subject.js
+var Subject = function(_super) {
+  __extends(Subject2, _super);
+  function Subject2() {
+    var _this = _super.call(this) || this;
+    _this.closed = false;
+    _this.currentObservers = null;
+    _this.observers = [];
+    _this.isStopped = false;
+    _this.hasError = false;
+    _this.thrownError = null;
+    return _this;
+  }
+  Subject2.prototype.lift = function(operator) {
+    var subject = new AnonymousSubject(this, this);
+    subject.operator = operator;
+    return subject;
+  };
+  Subject2.prototype._throwIfClosed = function() {
+    if (this.closed) {
+      throw new ObjectUnsubscribedError();
+    }
+  };
+  Subject2.prototype.next = function(value) {
+    var _this = this;
+    errorContext(function() {
+      var e_1, _a;
+      _this._throwIfClosed();
+      if (!_this.isStopped) {
+        if (!_this.currentObservers) {
+          _this.currentObservers = Array.from(_this.observers);
+        }
+        try {
+          for (var _b = __values(_this.currentObservers), _c = _b.next(); !_c.done; _c = _b.next()) {
+            var observer = _c.value;
+            observer.next(value);
+          }
+        } catch (e_1_1) {
+          e_1 = { error: e_1_1 };
+        } finally {
+          try {
+            if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
+          } finally {
+            if (e_1) throw e_1.error;
+          }
+        }
+      }
+    });
+  };
+  Subject2.prototype.error = function(err) {
+    var _this = this;
+    errorContext(function() {
+      _this._throwIfClosed();
+      if (!_this.isStopped) {
+        _this.hasError = _this.isStopped = true;
+        _this.thrownError = err;
+        var observers = _this.observers;
+        while (observers.length) {
+          observers.shift().error(err);
+        }
+      }
+    });
+  };
+  Subject2.prototype.complete = function() {
+    var _this = this;
+    errorContext(function() {
+      _this._throwIfClosed();
+      if (!_this.isStopped) {
+        _this.isStopped = true;
+        var observers = _this.observers;
+        while (observers.length) {
+          observers.shift().complete();
+        }
+      }
+    });
+  };
+  Subject2.prototype.unsubscribe = function() {
+    this.isStopped = this.closed = true;
+    this.observers = this.currentObservers = null;
+  };
+  Object.defineProperty(Subject2.prototype, "observed", {
+    get: function() {
+      var _a;
+      return ((_a = this.observers) === null || _a === void 0 ? void 0 : _a.length) > 0;
+    },
+    enumerable: false,
+    configurable: true
+  });
+  Subject2.prototype._trySubscribe = function(subscriber) {
+    this._throwIfClosed();
+    return _super.prototype._trySubscribe.call(this, subscriber);
+  };
+  Subject2.prototype._subscribe = function(subscriber) {
+    this._throwIfClosed();
+    this._checkFinalizedStatuses(subscriber);
+    return this._innerSubscribe(subscriber);
+  };
+  Subject2.prototype._innerSubscribe = function(subscriber) {
+    var _this = this;
+    var _a = this, hasError = _a.hasError, isStopped = _a.isStopped, observers = _a.observers;
+    if (hasError || isStopped) {
+      return EMPTY_SUBSCRIPTION;
+    }
+    this.currentObservers = null;
+    observers.push(subscriber);
+    return new Subscription(function() {
+      _this.currentObservers = null;
+      arrRemove(observers, subscriber);
+    });
+  };
+  Subject2.prototype._checkFinalizedStatuses = function(subscriber) {
+    var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, isStopped = _a.isStopped;
+    if (hasError) {
+      subscriber.error(thrownError);
+    } else if (isStopped) {
+      subscriber.complete();
+    }
+  };
+  Subject2.prototype.asObservable = function() {
+    var observable2 = new Observable();
+    observable2.source = this;
+    return observable2;
+  };
+  Subject2.create = function(destination, source) {
+    return new AnonymousSubject(destination, source);
+  };
+  return Subject2;
+}(Observable);
+var AnonymousSubject = function(_super) {
+  __extends(AnonymousSubject2, _super);
+  function AnonymousSubject2(destination, source) {
+    var _this = _super.call(this) || this;
+    _this.destination = destination;
+    _this.source = source;
+    return _this;
+  }
+  AnonymousSubject2.prototype.next = function(value) {
+    var _a, _b;
+    (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.next) === null || _b === void 0 ? void 0 : _b.call(_a, value);
+  };
+  AnonymousSubject2.prototype.error = function(err) {
+    var _a, _b;
+    (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.error) === null || _b === void 0 ? void 0 : _b.call(_a, err);
+  };
+  AnonymousSubject2.prototype.complete = function() {
+    var _a, _b;
+    (_b = (_a = this.destination) === null || _a === void 0 ? void 0 : _a.complete) === null || _b === void 0 ? void 0 : _b.call(_a);
+  };
+  AnonymousSubject2.prototype._subscribe = function(subscriber) {
+    var _a, _b;
+    return (_b = (_a = this.source) === null || _a === void 0 ? void 0 : _a.subscribe(subscriber)) !== null && _b !== void 0 ? _b : EMPTY_SUBSCRIPTION;
+  };
+  return AnonymousSubject2;
+}(Subject);
+
+// node_modules/rxjs/dist/esm5/internal/BehaviorSubject.js
+var BehaviorSubject = function(_super) {
+  __extends(BehaviorSubject2, _super);
+  function BehaviorSubject2(_value) {
+    var _this = _super.call(this) || this;
+    _this._value = _value;
+    return _this;
+  }
+  Object.defineProperty(BehaviorSubject2.prototype, "value", {
+    get: function() {
+      return this.getValue();
+    },
+    enumerable: false,
+    configurable: true
+  });
+  BehaviorSubject2.prototype._subscribe = function(subscriber) {
+    var subscription = _super.prototype._subscribe.call(this, subscriber);
+    !subscription.closed && subscriber.next(this._value);
+    return subscription;
+  };
+  BehaviorSubject2.prototype.getValue = function() {
+    var _a = this, hasError = _a.hasError, thrownError = _a.thrownError, _value = _a._value;
+    if (hasError) {
+      throw thrownError;
+    }
+    this._throwIfClosed();
+    return _value;
+  };
+  BehaviorSubject2.prototype.next = function(value) {
+    _super.prototype.next.call(this, this._value = value);
+  };
+  return BehaviorSubject2;
+}(Subject);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/dateTimestampProvider.js
+var dateTimestampProvider = {
+  now: function() {
+    return (dateTimestampProvider.delegate || Date).now();
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/ReplaySubject.js
+var ReplaySubject = function(_super) {
+  __extends(ReplaySubject2, _super);
+  function ReplaySubject2(_bufferSize, _windowTime, _timestampProvider) {
+    if (_bufferSize === void 0) {
+      _bufferSize = Infinity;
+    }
+    if (_windowTime === void 0) {
+      _windowTime = Infinity;
+    }
+    if (_timestampProvider === void 0) {
+      _timestampProvider = dateTimestampProvider;
+    }
+    var _this = _super.call(this) || this;
+    _this._bufferSize = _bufferSize;
+    _this._windowTime = _windowTime;
+    _this._timestampProvider = _timestampProvider;
+    _this._buffer = [];
+    _this._infiniteTimeWindow = true;
+    _this._infiniteTimeWindow = _windowTime === Infinity;
+    _this._bufferSize = Math.max(1, _bufferSize);
+    _this._windowTime = Math.max(1, _windowTime);
+    return _this;
+  }
+  ReplaySubject2.prototype.next = function(value) {
+    var _a = this, isStopped = _a.isStopped, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow, _timestampProvider = _a._timestampProvider, _windowTime = _a._windowTime;
+    if (!isStopped) {
+      _buffer.push(value);
+      !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
+    }
+    this._trimBuffer();
+    _super.prototype.next.call(this, value);
+  };
+  ReplaySubject2.prototype._subscribe = function(subscriber) {
+    this._throwIfClosed();
+    this._trimBuffer();
+    var subscription = this._innerSubscribe(subscriber);
+    var _a = this, _infiniteTimeWindow = _a._infiniteTimeWindow, _buffer = _a._buffer;
+    var copy = _buffer.slice();
+    for (var i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
+      subscriber.next(copy[i]);
+    }
+    this._checkFinalizedStatuses(subscriber);
+    return subscription;
+  };
+  ReplaySubject2.prototype._trimBuffer = function() {
+    var _a = this, _bufferSize = _a._bufferSize, _timestampProvider = _a._timestampProvider, _buffer = _a._buffer, _infiniteTimeWindow = _a._infiniteTimeWindow;
+    var adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
+    _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
+    if (!_infiniteTimeWindow) {
+      var now = _timestampProvider.now();
+      var last3 = 0;
+      for (var i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
+        last3 = i;
+      }
+      last3 && _buffer.splice(0, last3 + 1);
+    }
+  };
+  return ReplaySubject2;
+}(Subject);
+
+// node_modules/rxjs/dist/esm5/internal/AsyncSubject.js
+var AsyncSubject = function(_super) {
+  __extends(AsyncSubject2, _super);
+  function AsyncSubject2() {
+    var _this = _super !== null && _super.apply(this, arguments) || this;
+    _this._value = null;
+    _this._hasValue = false;
+    _this._isComplete = false;
+    return _this;
+  }
+  AsyncSubject2.prototype._checkFinalizedStatuses = function(subscriber) {
+    var _a = this, hasError = _a.hasError, _hasValue = _a._hasValue, _value = _a._value, thrownError = _a.thrownError, isStopped = _a.isStopped, _isComplete = _a._isComplete;
+    if (hasError) {
+      subscriber.error(thrownError);
+    } else if (isStopped || _isComplete) {
+      _hasValue && subscriber.next(_value);
+      subscriber.complete();
+    }
+  };
+  AsyncSubject2.prototype.next = function(value) {
+    if (!this.isStopped) {
+      this._value = value;
+      this._hasValue = true;
+    }
+  };
+  AsyncSubject2.prototype.complete = function() {
+    var _a = this, _hasValue = _a._hasValue, _value = _a._value, _isComplete = _a._isComplete;
+    if (!_isComplete) {
+      this._isComplete = true;
+      _hasValue && _super.prototype.next.call(this, _value);
+      _super.prototype.complete.call(this);
+    }
+  };
+  return AsyncSubject2;
+}(Subject);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/Action.js
+var Action = function(_super) {
+  __extends(Action2, _super);
+  function Action2(scheduler, work) {
+    return _super.call(this) || this;
+  }
+  Action2.prototype.schedule = function(state, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    return this;
+  };
+  return Action2;
+}(Subscription);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/intervalProvider.js
+var intervalProvider = {
+  setInterval: function(handler, timeout2) {
+    var args = [];
+    for (var _i = 2; _i < arguments.length; _i++) {
+      args[_i - 2] = arguments[_i];
+    }
+    var delegate = intervalProvider.delegate;
+    if (delegate === null || delegate === void 0 ? void 0 : delegate.setInterval) {
+      return delegate.setInterval.apply(delegate, __spreadArray([handler, timeout2], __read(args)));
+    }
+    return setInterval.apply(void 0, __spreadArray([handler, timeout2], __read(args)));
+  },
+  clearInterval: function(handle) {
+    var delegate = intervalProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearInterval) || clearInterval)(handle);
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AsyncAction.js
+var AsyncAction = function(_super) {
+  __extends(AsyncAction2, _super);
+  function AsyncAction2(scheduler, work) {
+    var _this = _super.call(this, scheduler, work) || this;
+    _this.scheduler = scheduler;
+    _this.work = work;
+    _this.pending = false;
+    return _this;
+  }
+  AsyncAction2.prototype.schedule = function(state, delay2) {
+    var _a;
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (this.closed) {
+      return this;
+    }
+    this.state = state;
+    var id = this.id;
+    var scheduler = this.scheduler;
+    if (id != null) {
+      this.id = this.recycleAsyncId(scheduler, id, delay2);
+    }
+    this.pending = true;
+    this.delay = delay2;
+    this.id = (_a = this.id) !== null && _a !== void 0 ? _a : this.requestAsyncId(scheduler, this.id, delay2);
+    return this;
+  };
+  AsyncAction2.prototype.requestAsyncId = function(scheduler, _id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay2);
+  };
+  AsyncAction2.prototype.recycleAsyncId = function(_scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 != null && this.delay === delay2 && this.pending === false) {
+      return id;
+    }
+    if (id != null) {
+      intervalProvider.clearInterval(id);
+    }
+    return void 0;
+  };
+  AsyncAction2.prototype.execute = function(state, delay2) {
+    if (this.closed) {
+      return new Error("executing a cancelled action");
+    }
+    this.pending = false;
+    var error = this._execute(state, delay2);
+    if (error) {
+      return error;
+    } else if (this.pending === false && this.id != null) {
+      this.id = this.recycleAsyncId(this.scheduler, this.id, null);
+    }
+  };
+  AsyncAction2.prototype._execute = function(state, _delay) {
+    var errored = false;
+    var errorValue;
+    try {
+      this.work(state);
+    } catch (e) {
+      errored = true;
+      errorValue = e ? e : new Error("Scheduled action threw falsy error");
+    }
+    if (errored) {
+      this.unsubscribe();
+      return errorValue;
+    }
+  };
+  AsyncAction2.prototype.unsubscribe = function() {
+    if (!this.closed) {
+      var _a = this, id = _a.id, scheduler = _a.scheduler;
+      var actions = scheduler.actions;
+      this.work = this.state = this.scheduler = null;
+      this.pending = false;
+      arrRemove(actions, this);
+      if (id != null) {
+        this.id = this.recycleAsyncId(scheduler, id, null);
+      }
+      this.delay = null;
+      _super.prototype.unsubscribe.call(this);
+    }
+  };
+  return AsyncAction2;
+}(Action);
+
+// node_modules/rxjs/dist/esm5/internal/util/Immediate.js
+var nextHandle = 1;
+var resolved;
+var activeHandles = {};
+function findAndClearHandle(handle) {
+  if (handle in activeHandles) {
+    delete activeHandles[handle];
+    return true;
+  }
+  return false;
+}
+var Immediate = {
+  setImmediate: function(cb) {
+    var handle = nextHandle++;
+    activeHandles[handle] = true;
+    if (!resolved) {
+      resolved = Promise.resolve();
+    }
+    resolved.then(function() {
+      return findAndClearHandle(handle) && cb();
+    });
+    return handle;
+  },
+  clearImmediate: function(handle) {
+    findAndClearHandle(handle);
+  }
+};
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/immediateProvider.js
+var setImmediate = Immediate.setImmediate;
+var clearImmediate = Immediate.clearImmediate;
+var immediateProvider = {
+  setImmediate: function() {
+    var args = [];
+    for (var _i = 0; _i < arguments.length; _i++) {
+      args[_i] = arguments[_i];
+    }
+    var delegate = immediateProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.setImmediate) || setImmediate).apply(void 0, __spreadArray([], __read(args)));
+  },
+  clearImmediate: function(handle) {
+    var delegate = immediateProvider.delegate;
+    return ((delegate === null || delegate === void 0 ? void 0 : delegate.clearImmediate) || clearImmediate)(handle);
+  },
+  delegate: void 0
+};
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AsapAction.js
+var AsapAction = function(_super) {
+  __extends(AsapAction2, _super);
+  function AsapAction2(scheduler, work) {
+    var _this = _super.call(this, scheduler, work) || this;
+    _this.scheduler = scheduler;
+    _this.work = work;
+    return _this;
+  }
+  AsapAction2.prototype.requestAsyncId = function(scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 !== null && delay2 > 0) {
+      return _super.prototype.requestAsyncId.call(this, scheduler, id, delay2);
+    }
+    scheduler.actions.push(this);
+    return scheduler._scheduled || (scheduler._scheduled = immediateProvider.setImmediate(scheduler.flush.bind(scheduler, void 0)));
+  };
+  AsapAction2.prototype.recycleAsyncId = function(scheduler, id, delay2) {
+    var _a;
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 != null ? delay2 > 0 : this.delay > 0) {
+      return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay2);
+    }
+    var actions = scheduler.actions;
+    if (id != null && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {
+      immediateProvider.clearImmediate(id);
+      if (scheduler._scheduled === id) {
+        scheduler._scheduled = void 0;
+      }
+    }
+    return void 0;
+  };
+  return AsapAction2;
+}(AsyncAction);
+
+// node_modules/rxjs/dist/esm5/internal/Scheduler.js
+var Scheduler = function() {
+  function Scheduler2(schedulerActionCtor, now) {
+    if (now === void 0) {
+      now = Scheduler2.now;
+    }
+    this.schedulerActionCtor = schedulerActionCtor;
+    this.now = now;
+  }
+  Scheduler2.prototype.schedule = function(work, delay2, state) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    return new this.schedulerActionCtor(this, work).schedule(state, delay2);
+  };
+  Scheduler2.now = dateTimestampProvider.now;
+  return Scheduler2;
+}();
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AsyncScheduler.js
+var AsyncScheduler = function(_super) {
+  __extends(AsyncScheduler2, _super);
+  function AsyncScheduler2(SchedulerAction, now) {
+    if (now === void 0) {
+      now = Scheduler.now;
+    }
+    var _this = _super.call(this, SchedulerAction, now) || this;
+    _this.actions = [];
+    _this._active = false;
+    return _this;
+  }
+  AsyncScheduler2.prototype.flush = function(action) {
+    var actions = this.actions;
+    if (this._active) {
+      actions.push(action);
+      return;
+    }
+    var error;
+    this._active = true;
+    do {
+      if (error = action.execute(action.state, action.delay)) {
+        break;
+      }
+    } while (action = actions.shift());
+    this._active = false;
+    if (error) {
+      while (action = actions.shift()) {
+        action.unsubscribe();
+      }
+      throw error;
+    }
+  };
+  return AsyncScheduler2;
+}(Scheduler);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AsapScheduler.js
+var AsapScheduler = function(_super) {
+  __extends(AsapScheduler2, _super);
+  function AsapScheduler2() {
+    return _super !== null && _super.apply(this, arguments) || this;
+  }
+  AsapScheduler2.prototype.flush = function(action) {
+    this._active = true;
+    var flushId = this._scheduled;
+    this._scheduled = void 0;
+    var actions = this.actions;
+    var error;
+    action = action || actions.shift();
+    do {
+      if (error = action.execute(action.state, action.delay)) {
+        break;
+      }
+    } while ((action = actions[0]) && action.id === flushId && actions.shift());
+    this._active = false;
+    if (error) {
+      while ((action = actions[0]) && action.id === flushId && actions.shift()) {
+        action.unsubscribe();
+      }
+      throw error;
+    }
+  };
+  return AsapScheduler2;
+}(AsyncScheduler);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/asap.js
+var asapScheduler = new AsapScheduler(AsapAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/async.js
+var asyncScheduler = new AsyncScheduler(AsyncAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/QueueAction.js
+var QueueAction = function(_super) {
+  __extends(QueueAction2, _super);
+  function QueueAction2(scheduler, work) {
+    var _this = _super.call(this, scheduler, work) || this;
+    _this.scheduler = scheduler;
+    _this.work = work;
+    return _this;
+  }
+  QueueAction2.prototype.schedule = function(state, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 > 0) {
+      return _super.prototype.schedule.call(this, state, delay2);
+    }
+    this.delay = delay2;
+    this.state = state;
+    this.scheduler.flush(this);
+    return this;
+  };
+  QueueAction2.prototype.execute = function(state, delay2) {
+    return delay2 > 0 || this.closed ? _super.prototype.execute.call(this, state, delay2) : this._execute(state, delay2);
+  };
+  QueueAction2.prototype.requestAsyncId = function(scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 != null && delay2 > 0 || delay2 == null && this.delay > 0) {
+      return _super.prototype.requestAsyncId.call(this, scheduler, id, delay2);
+    }
+    scheduler.flush(this);
+    return 0;
+  };
+  return QueueAction2;
+}(AsyncAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/QueueScheduler.js
+var QueueScheduler = function(_super) {
+  __extends(QueueScheduler2, _super);
+  function QueueScheduler2() {
+    return _super !== null && _super.apply(this, arguments) || this;
+  }
+  return QueueScheduler2;
+}(AsyncScheduler);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/queue.js
+var queueScheduler = new QueueScheduler(QueueAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AnimationFrameAction.js
+var AnimationFrameAction = function(_super) {
+  __extends(AnimationFrameAction2, _super);
+  function AnimationFrameAction2(scheduler, work) {
+    var _this = _super.call(this, scheduler, work) || this;
+    _this.scheduler = scheduler;
+    _this.work = work;
+    return _this;
+  }
+  AnimationFrameAction2.prototype.requestAsyncId = function(scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 !== null && delay2 > 0) {
+      return _super.prototype.requestAsyncId.call(this, scheduler, id, delay2);
+    }
+    scheduler.actions.push(this);
+    return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(function() {
+      return scheduler.flush(void 0);
+    }));
+  };
+  AnimationFrameAction2.prototype.recycleAsyncId = function(scheduler, id, delay2) {
+    var _a;
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (delay2 != null ? delay2 > 0 : this.delay > 0) {
+      return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay2);
+    }
+    var actions = scheduler.actions;
+    if (id != null && id === scheduler._scheduled && ((_a = actions[actions.length - 1]) === null || _a === void 0 ? void 0 : _a.id) !== id) {
+      animationFrameProvider.cancelAnimationFrame(id);
+      scheduler._scheduled = void 0;
+    }
+    return void 0;
+  };
+  return AnimationFrameAction2;
+}(AsyncAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/AnimationFrameScheduler.js
+var AnimationFrameScheduler = function(_super) {
+  __extends(AnimationFrameScheduler2, _super);
+  function AnimationFrameScheduler2() {
+    return _super !== null && _super.apply(this, arguments) || this;
+  }
+  AnimationFrameScheduler2.prototype.flush = function(action) {
+    this._active = true;
+    var flushId;
+    if (action) {
+      flushId = action.id;
+    } else {
+      flushId = this._scheduled;
+      this._scheduled = void 0;
+    }
+    var actions = this.actions;
+    var error;
+    action = action || actions.shift();
+    do {
+      if (error = action.execute(action.state, action.delay)) {
+        break;
+      }
+    } while ((action = actions[0]) && action.id === flushId && actions.shift());
+    this._active = false;
+    if (error) {
+      while ((action = actions[0]) && action.id === flushId && actions.shift()) {
+        action.unsubscribe();
+      }
+      throw error;
+    }
+  };
+  return AnimationFrameScheduler2;
+}(AsyncScheduler);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/animationFrame.js
+var animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);
+
+// node_modules/rxjs/dist/esm5/internal/scheduler/VirtualTimeScheduler.js
+var VirtualTimeScheduler = function(_super) {
+  __extends(VirtualTimeScheduler2, _super);
+  function VirtualTimeScheduler2(schedulerActionCtor, maxFrames) {
+    if (schedulerActionCtor === void 0) {
+      schedulerActionCtor = VirtualAction;
+    }
+    if (maxFrames === void 0) {
+      maxFrames = Infinity;
+    }
+    var _this = _super.call(this, schedulerActionCtor, function() {
+      return _this.frame;
+    }) || this;
+    _this.maxFrames = maxFrames;
+    _this.frame = 0;
+    _this.index = -1;
+    return _this;
+  }
+  VirtualTimeScheduler2.prototype.flush = function() {
+    var _a = this, actions = _a.actions, maxFrames = _a.maxFrames;
+    var error;
+    var action;
+    while ((action = actions[0]) && action.delay <= maxFrames) {
+      actions.shift();
+      this.frame = action.delay;
+      if (error = action.execute(action.state, action.delay)) {
+        break;
+      }
+    }
+    if (error) {
+      while (action = actions.shift()) {
+        action.unsubscribe();
+      }
+      throw error;
+    }
+  };
+  VirtualTimeScheduler2.frameTimeFactor = 10;
+  return VirtualTimeScheduler2;
+}(AsyncScheduler);
+var VirtualAction = function(_super) {
+  __extends(VirtualAction2, _super);
+  function VirtualAction2(scheduler, work, index) {
+    if (index === void 0) {
+      index = scheduler.index += 1;
+    }
+    var _this = _super.call(this, scheduler, work) || this;
+    _this.scheduler = scheduler;
+    _this.work = work;
+    _this.index = index;
+    _this.active = true;
+    _this.index = scheduler.index = index;
+    return _this;
+  }
+  VirtualAction2.prototype.schedule = function(state, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    if (Number.isFinite(delay2)) {
+      if (!this.id) {
+        return _super.prototype.schedule.call(this, state, delay2);
+      }
+      this.active = false;
+      var action = new VirtualAction2(this.scheduler, this.work);
+      this.add(action);
+      return action.schedule(state, delay2);
+    } else {
+      return Subscription.EMPTY;
+    }
+  };
+  VirtualAction2.prototype.requestAsyncId = function(scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    this.delay = scheduler.frame + delay2;
+    var actions = scheduler.actions;
+    actions.push(this);
+    actions.sort(VirtualAction2.sortActions);
+    return 1;
+  };
+  VirtualAction2.prototype.recycleAsyncId = function(scheduler, id, delay2) {
+    if (delay2 === void 0) {
+      delay2 = 0;
+    }
+    return void 0;
+  };
+  VirtualAction2.prototype._execute = function(state, delay2) {
+    if (this.active === true) {
+      return _super.prototype._execute.call(this, state, delay2);
+    }
+  };
+  VirtualAction2.sortActions = function(a, b) {
+    if (a.delay === b.delay) {
+      if (a.index === b.index) {
+        return 0;
+      } else if (a.index > b.index) {
+        return 1;
+      } else {
+        return -1;
+      }
+    } else if (a.delay > b.delay) {
+      return 1;
+    } else {
+      return -1;
+    }
+  };
+  return VirtualAction2;
+}(AsyncAction);
+
+// node_modules/rxjs/dist/esm5/internal/observable/empty.js
+var EMPTY = new Observable(function(subscriber) {
+  return subscriber.complete();
+});
+
+// node_modules/rxjs/dist/esm5/internal/util/isScheduler.js
+function isScheduler(value) {
+  return value && isFunction(value.schedule);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/args.js
+function last(arr) {
+  return arr[arr.length - 1];
+}
+function popResultSelector(args) {
+  return isFunction(last(args)) ? args.pop() : void 0;
+}
+function popScheduler(args) {
+  return isScheduler(last(args)) ? args.pop() : void 0;
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isArrayLike.js
+var isArrayLike = function(x) {
+  return x && typeof x.length === "number" && typeof x !== "function";
+};
+
+// node_modules/rxjs/dist/esm5/internal/util/isPromise.js
+function isPromise(value) {
+  return isFunction(value === null || value === void 0 ? void 0 : value.then);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isInteropObservable.js
+function isInteropObservable(input2) {
+  return isFunction(input2[observable]);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isAsyncIterable.js
+function isAsyncIterable(obj) {
+  return Symbol.asyncIterator && isFunction(obj === null || obj === void 0 ? void 0 : obj[Symbol.asyncIterator]);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/throwUnobservableError.js
+function createInvalidObservableTypeError(input2) {
+  return new TypeError("You provided " + (input2 !== null && typeof input2 === "object" ? "an invalid object" : "'" + input2 + "'") + " where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.");
+}
+
+// node_modules/rxjs/dist/esm5/internal/symbol/iterator.js
+function getSymbolIterator() {
+  if (typeof Symbol !== "function" || !Symbol.iterator) {
+    return "@@iterator";
+  }
+  return Symbol.iterator;
+}
+var iterator = getSymbolIterator();
+
+// node_modules/rxjs/dist/esm5/internal/util/isIterable.js
+function isIterable(input2) {
+  return isFunction(input2 === null || input2 === void 0 ? void 0 : input2[iterator]);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isReadableStreamLike.js
+function readableStreamLikeToAsyncGenerator(readableStream) {
+  return __asyncGenerator(this, arguments, function readableStreamLikeToAsyncGenerator_1() {
+    var reader, _a, value, done;
+    return __generator(this, function(_b) {
+      switch (_b.label) {
+        case 0:
+          reader = readableStream.getReader();
+          _b.label = 1;
+        case 1:
+          _b.trys.push([1, , 9, 10]);
+          _b.label = 2;
+        case 2:
+          if (false) return [3, 8];
+          return [4, __await(reader.read())];
+        case 3:
+          _a = _b.sent(), value = _a.value, done = _a.done;
+          if (!done) return [3, 5];
+          return [4, __await(void 0)];
+        case 4:
+          return [2, _b.sent()];
+        case 5:
+          return [4, __await(value)];
+        case 6:
+          return [4, _b.sent()];
+        case 7:
+          _b.sent();
+          return [3, 2];
+        case 8:
+          return [3, 10];
+        case 9:
+          reader.releaseLock();
+          return [7];
+        case 10:
+          return [2];
+      }
+    });
+  });
+}
+function isReadableStreamLike(obj) {
+  return isFunction(obj === null || obj === void 0 ? void 0 : obj.getReader);
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/innerFrom.js
+function innerFrom(input2) {
+  if (input2 instanceof Observable) {
+    return input2;
+  }
+  if (input2 != null) {
+    if (isInteropObservable(input2)) {
+      return fromInteropObservable(input2);
+    }
+    if (isArrayLike(input2)) {
+      return fromArrayLike(input2);
+    }
+    if (isPromise(input2)) {
+      return fromPromise(input2);
+    }
+    if (isAsyncIterable(input2)) {
+      return fromAsyncIterable(input2);
+    }
+    if (isIterable(input2)) {
+      return fromIterable(input2);
+    }
+    if (isReadableStreamLike(input2)) {
+      return fromReadableStreamLike(input2);
+    }
+  }
+  throw createInvalidObservableTypeError(input2);
+}
+function fromInteropObservable(obj) {
+  return new Observable(function(subscriber) {
+    var obs = obj[observable]();
+    if (isFunction(obs.subscribe)) {
+      return obs.subscribe(subscriber);
+    }
+    throw new TypeError("Provided object does not correctly implement Symbol.observable");
+  });
+}
+function fromArrayLike(array) {
+  return new Observable(function(subscriber) {
+    for (var i = 0; i < array.length && !subscriber.closed; i++) {
+      subscriber.next(array[i]);
+    }
+    subscriber.complete();
+  });
+}
+function fromPromise(promise) {
+  return new Observable(function(subscriber) {
+    promise.then(function(value) {
+      if (!subscriber.closed) {
+        subscriber.next(value);
+        subscriber.complete();
+      }
+    }, function(err) {
+      return subscriber.error(err);
+    }).then(null, reportUnhandledError);
+  });
+}
+function fromIterable(iterable) {
+  return new Observable(function(subscriber) {
+    var e_1, _a;
+    try {
+      for (var iterable_1 = __values(iterable), iterable_1_1 = iterable_1.next(); !iterable_1_1.done; iterable_1_1 = iterable_1.next()) {
+        var value = iterable_1_1.value;
+        subscriber.next(value);
+        if (subscriber.closed) {
+          return;
+        }
+      }
+    } catch (e_1_1) {
+      e_1 = { error: e_1_1 };
+    } finally {
+      try {
+        if (iterable_1_1 && !iterable_1_1.done && (_a = iterable_1.return)) _a.call(iterable_1);
+      } finally {
+        if (e_1) throw e_1.error;
+      }
+    }
+    subscriber.complete();
+  });
+}
+function fromAsyncIterable(asyncIterable) {
+  return new Observable(function(subscriber) {
+    process(asyncIterable, subscriber).catch(function(err) {
+      return subscriber.error(err);
+    });
+  });
+}
+function fromReadableStreamLike(readableStream) {
+  return fromAsyncIterable(readableStreamLikeToAsyncGenerator(readableStream));
+}
+function process(asyncIterable, subscriber) {
+  var asyncIterable_1, asyncIterable_1_1;
+  var e_2, _a;
+  return __awaiter(this, void 0, void 0, function() {
+    var value, e_2_1;
+    return __generator(this, function(_b) {
+      switch (_b.label) {
+        case 0:
+          _b.trys.push([0, 5, 6, 11]);
+          asyncIterable_1 = __asyncValues(asyncIterable);
+          _b.label = 1;
+        case 1:
+          return [4, asyncIterable_1.next()];
+        case 2:
+          if (!(asyncIterable_1_1 = _b.sent(), !asyncIterable_1_1.done)) return [3, 4];
+          value = asyncIterable_1_1.value;
+          subscriber.next(value);
+          if (subscriber.closed) {
+            return [2];
+          }
+          _b.label = 3;
+        case 3:
+          return [3, 1];
+        case 4:
+          return [3, 11];
+        case 5:
+          e_2_1 = _b.sent();
+          e_2 = { error: e_2_1 };
+          return [3, 11];
+        case 6:
+          _b.trys.push([6, , 9, 10]);
+          if (!(asyncIterable_1_1 && !asyncIterable_1_1.done && (_a = asyncIterable_1.return))) return [3, 8];
+          return [4, _a.call(asyncIterable_1)];
+        case 7:
+          _b.sent();
+          _b.label = 8;
+        case 8:
+          return [3, 10];
+        case 9:
+          if (e_2) throw e_2.error;
+          return [7];
+        case 10:
+          return [7];
+        case 11:
+          subscriber.complete();
+          return [2];
+      }
+    });
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/executeSchedule.js
+function executeSchedule(parentSubscription, scheduler, work, delay2, repeat2) {
+  if (delay2 === void 0) {
+    delay2 = 0;
+  }
+  if (repeat2 === void 0) {
+    repeat2 = false;
+  }
+  var scheduleSubscription = scheduler.schedule(function() {
+    work();
+    if (repeat2) {
+      parentSubscription.add(this.schedule(null, delay2));
+    } else {
+      this.unsubscribe();
+    }
+  }, delay2);
+  parentSubscription.add(scheduleSubscription);
+  if (!repeat2) {
+    return scheduleSubscription;
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/observeOn.js
+function observeOn(scheduler, delay2) {
+  if (delay2 === void 0) {
+    delay2 = 0;
+  }
+  return operate(function(source, subscriber) {
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      return executeSchedule(subscriber, scheduler, function() {
+        return subscriber.next(value);
+      }, delay2);
+    }, function() {
+      return executeSchedule(subscriber, scheduler, function() {
+        return subscriber.complete();
+      }, delay2);
+    }, function(err) {
+      return executeSchedule(subscriber, scheduler, function() {
+        return subscriber.error(err);
+      }, delay2);
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/subscribeOn.js
+function subscribeOn(scheduler, delay2) {
+  if (delay2 === void 0) {
+    delay2 = 0;
+  }
+  return operate(function(source, subscriber) {
+    subscriber.add(scheduler.schedule(function() {
+      return source.subscribe(subscriber);
+    }, delay2));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduleObservable.js
+function scheduleObservable(input2, scheduler) {
+  return innerFrom(input2).pipe(subscribeOn(scheduler), observeOn(scheduler));
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/schedulePromise.js
+function schedulePromise(input2, scheduler) {
+  return innerFrom(input2).pipe(subscribeOn(scheduler), observeOn(scheduler));
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduleArray.js
+function scheduleArray(input2, scheduler) {
+  return new Observable(function(subscriber) {
+    var i = 0;
+    return scheduler.schedule(function() {
+      if (i === input2.length) {
+        subscriber.complete();
+      } else {
+        subscriber.next(input2[i++]);
+        if (!subscriber.closed) {
+          this.schedule();
+        }
+      }
+    });
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduleIterable.js
+function scheduleIterable(input2, scheduler) {
+  return new Observable(function(subscriber) {
+    var iterator2;
+    executeSchedule(subscriber, scheduler, function() {
+      iterator2 = input2[iterator]();
+      executeSchedule(subscriber, scheduler, function() {
+        var _a;
+        var value;
+        var done;
+        try {
+          _a = iterator2.next(), value = _a.value, done = _a.done;
+        } catch (err) {
+          subscriber.error(err);
+          return;
+        }
+        if (done) {
+          subscriber.complete();
+        } else {
+          subscriber.next(value);
+        }
+      }, 0, true);
+    });
+    return function() {
+      return isFunction(iterator2 === null || iterator2 === void 0 ? void 0 : iterator2.return) && iterator2.return();
+    };
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduleAsyncIterable.js
+function scheduleAsyncIterable(input2, scheduler) {
+  if (!input2) {
+    throw new Error("Iterable cannot be null");
+  }
+  return new Observable(function(subscriber) {
+    executeSchedule(subscriber, scheduler, function() {
+      var iterator2 = input2[Symbol.asyncIterator]();
+      executeSchedule(subscriber, scheduler, function() {
+        iterator2.next().then(function(result) {
+          if (result.done) {
+            subscriber.complete();
+          } else {
+            subscriber.next(result.value);
+          }
+        });
+      }, 0, true);
+    });
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduleReadableStreamLike.js
+function scheduleReadableStreamLike(input2, scheduler) {
+  return scheduleAsyncIterable(readableStreamLikeToAsyncGenerator(input2), scheduler);
+}
+
+// node_modules/rxjs/dist/esm5/internal/scheduled/scheduled.js
+function scheduled(input2, scheduler) {
+  if (input2 != null) {
+    if (isInteropObservable(input2)) {
+      return scheduleObservable(input2, scheduler);
+    }
+    if (isArrayLike(input2)) {
+      return scheduleArray(input2, scheduler);
+    }
+    if (isPromise(input2)) {
+      return schedulePromise(input2, scheduler);
+    }
+    if (isAsyncIterable(input2)) {
+      return scheduleAsyncIterable(input2, scheduler);
+    }
+    if (isIterable(input2)) {
+      return scheduleIterable(input2, scheduler);
+    }
+    if (isReadableStreamLike(input2)) {
+      return scheduleReadableStreamLike(input2, scheduler);
+    }
+  }
+  throw createInvalidObservableTypeError(input2);
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/from.js
+function from(input2, scheduler) {
+  return scheduler ? scheduled(input2, scheduler) : innerFrom(input2);
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/of.js
+function of() {
+  var args = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    args[_i] = arguments[_i];
+  }
+  var scheduler = popScheduler(args);
+  return from(args, scheduler);
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/throwError.js
+function throwError(errorOrErrorFactory, scheduler) {
+  var errorFactory = isFunction(errorOrErrorFactory) ? errorOrErrorFactory : function() {
+    return errorOrErrorFactory;
+  };
+  var init = function(subscriber) {
+    return subscriber.error(errorFactory());
+  };
+  return new Observable(scheduler ? function(subscriber) {
+    return scheduler.schedule(init, 0, subscriber);
+  } : init);
+}
+
+// node_modules/rxjs/dist/esm5/internal/Notification.js
+var NotificationKind;
+(function(NotificationKind2) {
+  NotificationKind2["NEXT"] = "N";
+  NotificationKind2["ERROR"] = "E";
+  NotificationKind2["COMPLETE"] = "C";
+})(NotificationKind || (NotificationKind = {}));
+var Notification = function() {
+  function Notification2(kind, value, error) {
+    this.kind = kind;
+    this.value = value;
+    this.error = error;
+    this.hasValue = kind === "N";
+  }
+  Notification2.prototype.observe = function(observer) {
+    return observeNotification(this, observer);
+  };
+  Notification2.prototype.do = function(nextHandler, errorHandler, completeHandler) {
+    var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
+    return kind === "N" ? nextHandler === null || nextHandler === void 0 ? void 0 : nextHandler(value) : kind === "E" ? errorHandler === null || errorHandler === void 0 ? void 0 : errorHandler(error) : completeHandler === null || completeHandler === void 0 ? void 0 : completeHandler();
+  };
+  Notification2.prototype.accept = function(nextOrObserver, error, complete) {
+    var _a;
+    return isFunction((_a = nextOrObserver) === null || _a === void 0 ? void 0 : _a.next) ? this.observe(nextOrObserver) : this.do(nextOrObserver, error, complete);
+  };
+  Notification2.prototype.toObservable = function() {
+    var _a = this, kind = _a.kind, value = _a.value, error = _a.error;
+    var result = kind === "N" ? of(value) : kind === "E" ? throwError(function() {
+      return error;
+    }) : kind === "C" ? EMPTY : 0;
+    if (!result) {
+      throw new TypeError("Unexpected notification kind " + kind);
+    }
+    return result;
+  };
+  Notification2.createNext = function(value) {
+    return new Notification2("N", value);
+  };
+  Notification2.createError = function(err) {
+    return new Notification2("E", void 0, err);
+  };
+  Notification2.createComplete = function() {
+    return Notification2.completeNotification;
+  };
+  Notification2.completeNotification = new Notification2("C");
+  return Notification2;
+}();
+function observeNotification(notification, observer) {
+  var _a, _b, _c;
+  var _d = notification, kind = _d.kind, value = _d.value, error = _d.error;
+  if (typeof kind !== "string") {
+    throw new TypeError('Invalid notification, missing "kind"');
+  }
+  kind === "N" ? (_a = observer.next) === null || _a === void 0 ? void 0 : _a.call(observer, value) : kind === "E" ? (_b = observer.error) === null || _b === void 0 ? void 0 : _b.call(observer, error) : (_c = observer.complete) === null || _c === void 0 ? void 0 : _c.call(observer);
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/isObservable.js
+function isObservable(obj) {
+  return !!obj && (obj instanceof Observable || isFunction(obj.lift) && isFunction(obj.subscribe));
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/EmptyError.js
+var EmptyError = createErrorClass(function(_super) {
+  return function EmptyErrorImpl() {
+    _super(this);
+    this.name = "EmptyError";
+    this.message = "no elements in sequence";
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/util/ArgumentOutOfRangeError.js
+var ArgumentOutOfRangeError = createErrorClass(function(_super) {
+  return function ArgumentOutOfRangeErrorImpl() {
+    _super(this);
+    this.name = "ArgumentOutOfRangeError";
+    this.message = "argument out of range";
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/util/NotFoundError.js
+var NotFoundError2 = createErrorClass(function(_super) {
+  return function NotFoundErrorImpl(message) {
+    _super(this);
+    this.name = "NotFoundError";
+    this.message = message;
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/util/SequenceError.js
+var SequenceError = createErrorClass(function(_super) {
+  return function SequenceErrorImpl(message) {
+    _super(this);
+    this.name = "SequenceError";
+    this.message = message;
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/operators/timeout.js
+var TimeoutError = createErrorClass(function(_super) {
+  return function TimeoutErrorImpl(info) {
+    if (info === void 0) {
+      info = null;
+    }
+    _super(this);
+    this.message = "Timeout has occurred";
+    this.name = "TimeoutError";
+    this.info = info;
+  };
+});
+
+// node_modules/rxjs/dist/esm5/internal/operators/map.js
+function map(project, thisArg) {
+  return operate(function(source, subscriber) {
+    var index = 0;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      subscriber.next(project.call(thisArg, value, index++));
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/mapOneOrManyArgs.js
+var isArray = Array.isArray;
+function callOrApply(fn, args) {
+  return isArray(args) ? fn.apply(void 0, __spreadArray([], __read(args))) : fn(args);
+}
+function mapOneOrManyArgs(fn) {
+  return map(function(args) {
+    return callOrApply(fn, args);
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/argsArgArrayOrObject.js
+var isArray2 = Array.isArray;
+var getPrototypeOf = Object.getPrototypeOf;
+var objectProto = Object.prototype;
+var getKeys = Object.keys;
+function argsArgArrayOrObject(args) {
+  if (args.length === 1) {
+    var first_1 = args[0];
+    if (isArray2(first_1)) {
+      return { args: first_1, keys: null };
+    }
+    if (isPOJO(first_1)) {
+      var keys = getKeys(first_1);
+      return {
+        args: keys.map(function(key) {
+          return first_1[key];
+        }),
+        keys
+      };
+    }
+  }
+  return { args, keys: null };
+}
+function isPOJO(obj) {
+  return obj && typeof obj === "object" && getPrototypeOf(obj) === objectProto;
+}
+
+// node_modules/rxjs/dist/esm5/internal/util/createObject.js
+function createObject(keys, values) {
+  return keys.reduce(function(result, key, i) {
+    return result[key] = values[i], result;
+  }, {});
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/combineLatest.js
+function combineLatest() {
+  var args = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    args[_i] = arguments[_i];
+  }
+  var scheduler = popScheduler(args);
+  var resultSelector = popResultSelector(args);
+  var _a = argsArgArrayOrObject(args), observables = _a.args, keys = _a.keys;
+  if (observables.length === 0) {
+    return from([], scheduler);
+  }
+  var result = new Observable(combineLatestInit(observables, scheduler, keys ? function(values) {
+    return createObject(keys, values);
+  } : identity));
+  return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
+}
+function combineLatestInit(observables, scheduler, valueTransform) {
+  if (valueTransform === void 0) {
+    valueTransform = identity;
+  }
+  return function(subscriber) {
+    maybeSchedule(scheduler, function() {
+      var length = observables.length;
+      var values = new Array(length);
+      var active = length;
+      var remainingFirstValues = length;
+      var _loop_1 = function(i2) {
+        maybeSchedule(scheduler, function() {
+          var source = from(observables[i2], scheduler);
+          var hasFirstValue = false;
+          source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+            values[i2] = value;
+            if (!hasFirstValue) {
+              hasFirstValue = true;
+              remainingFirstValues--;
+            }
+            if (!remainingFirstValues) {
+              subscriber.next(valueTransform(values.slice()));
+            }
+          }, function() {
+            if (!--active) {
+              subscriber.complete();
+            }
+          }));
+        }, subscriber);
+      };
+      for (var i = 0; i < length; i++) {
+        _loop_1(i);
+      }
+    }, subscriber);
+  };
+}
+function maybeSchedule(scheduler, execute, subscription) {
+  if (scheduler) {
+    executeSchedule(subscription, scheduler, execute);
+  } else {
+    execute();
+  }
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/mergeInternals.js
+function mergeInternals(source, subscriber, project, concurrent, onBeforeNext, expand2, innerSubScheduler, additionalFinalizer) {
+  var buffer2 = [];
+  var active = 0;
+  var index = 0;
+  var isComplete = false;
+  var checkComplete = function() {
+    if (isComplete && !buffer2.length && !active) {
+      subscriber.complete();
+    }
+  };
+  var outerNext = function(value) {
+    return active < concurrent ? doInnerSub(value) : buffer2.push(value);
+  };
+  var doInnerSub = function(value) {
+    expand2 && subscriber.next(value);
+    active++;
+    var innerComplete = false;
+    innerFrom(project(value, index++)).subscribe(createOperatorSubscriber(subscriber, function(innerValue) {
+      onBeforeNext === null || onBeforeNext === void 0 ? void 0 : onBeforeNext(innerValue);
+      if (expand2) {
+        outerNext(innerValue);
+      } else {
+        subscriber.next(innerValue);
+      }
+    }, function() {
+      innerComplete = true;
+    }, void 0, function() {
+      if (innerComplete) {
+        try {
+          active--;
+          var _loop_1 = function() {
+            var bufferedValue = buffer2.shift();
+            if (innerSubScheduler) {
+              executeSchedule(subscriber, innerSubScheduler, function() {
+                return doInnerSub(bufferedValue);
+              });
+            } else {
+              doInnerSub(bufferedValue);
+            }
+          };
+          while (buffer2.length && active < concurrent) {
+            _loop_1();
+          }
+          checkComplete();
+        } catch (err) {
+          subscriber.error(err);
+        }
+      }
+    }));
+  };
+  source.subscribe(createOperatorSubscriber(subscriber, outerNext, function() {
+    isComplete = true;
+    checkComplete();
+  }));
+  return function() {
+    additionalFinalizer === null || additionalFinalizer === void 0 ? void 0 : additionalFinalizer();
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/mergeMap.js
+function mergeMap(project, resultSelector, concurrent) {
+  if (concurrent === void 0) {
+    concurrent = Infinity;
+  }
+  if (isFunction(resultSelector)) {
+    return mergeMap(function(a, i) {
+      return map(function(b, ii) {
+        return resultSelector(a, b, i, ii);
+      })(innerFrom(project(a, i)));
+    }, concurrent);
+  } else if (typeof resultSelector === "number") {
+    concurrent = resultSelector;
+  }
+  return operate(function(source, subscriber) {
+    return mergeInternals(source, subscriber, project, concurrent);
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/mergeAll.js
+function mergeAll(concurrent) {
+  if (concurrent === void 0) {
+    concurrent = Infinity;
+  }
+  return mergeMap(identity, concurrent);
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/concatAll.js
+function concatAll() {
+  return mergeAll(1);
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/concat.js
+function concat() {
+  var args = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    args[_i] = arguments[_i];
+  }
+  return concatAll()(from(args, popScheduler(args)));
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/defer.js
+function defer(observableFactory) {
+  return new Observable(function(subscriber) {
+    innerFrom(observableFactory()).subscribe(subscriber);
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/forkJoin.js
+function forkJoin() {
+  var args = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    args[_i] = arguments[_i];
+  }
+  var resultSelector = popResultSelector(args);
+  var _a = argsArgArrayOrObject(args), sources = _a.args, keys = _a.keys;
+  var result = new Observable(function(subscriber) {
+    var length = sources.length;
+    if (!length) {
+      subscriber.complete();
+      return;
+    }
+    var values = new Array(length);
+    var remainingCompletions = length;
+    var remainingEmissions = length;
+    var _loop_1 = function(sourceIndex2) {
+      var hasValue = false;
+      innerFrom(sources[sourceIndex2]).subscribe(createOperatorSubscriber(subscriber, function(value) {
+        if (!hasValue) {
+          hasValue = true;
+          remainingEmissions--;
+        }
+        values[sourceIndex2] = value;
+      }, function() {
+        return remainingCompletions--;
+      }, void 0, function() {
+        if (!remainingCompletions || !hasValue) {
+          if (!remainingEmissions) {
+            subscriber.next(keys ? createObject(keys, values) : values);
+          }
+          subscriber.complete();
+        }
+      }));
+    };
+    for (var sourceIndex = 0; sourceIndex < length; sourceIndex++) {
+      _loop_1(sourceIndex);
+    }
+  });
+  return resultSelector ? result.pipe(mapOneOrManyArgs(resultSelector)) : result;
+}
+
+// node_modules/rxjs/dist/esm5/internal/observable/never.js
+var NEVER = new Observable(noop);
+
+// node_modules/rxjs/dist/esm5/internal/util/argsOrArgArray.js
+var isArray3 = Array.isArray;
+
+// node_modules/rxjs/dist/esm5/internal/operators/filter.js
+function filter(predicate, thisArg) {
+  return operate(function(source, subscriber) {
+    var index = 0;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      return predicate.call(thisArg, value, index++) && subscriber.next(value);
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/catchError.js
+function catchError(selector) {
+  return operate(function(source, subscriber) {
+    var innerSub = null;
+    var syncUnsub = false;
+    var handledResult;
+    innerSub = source.subscribe(createOperatorSubscriber(subscriber, void 0, void 0, function(err) {
+      handledResult = innerFrom(selector(err, catchError(selector)(source)));
+      if (innerSub) {
+        innerSub.unsubscribe();
+        innerSub = null;
+        handledResult.subscribe(subscriber);
+      } else {
+        syncUnsub = true;
+      }
+    }));
+    if (syncUnsub) {
+      innerSub.unsubscribe();
+      innerSub = null;
+      handledResult.subscribe(subscriber);
+    }
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/scanInternals.js
+function scanInternals(accumulator, seed, hasSeed, emitOnNext, emitBeforeComplete) {
+  return function(source, subscriber) {
+    var hasState = hasSeed;
+    var state = seed;
+    var index = 0;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      var i = index++;
+      state = hasState ? accumulator(state, value, i) : (hasState = true, value);
+      emitOnNext && subscriber.next(state);
+    }, emitBeforeComplete && function() {
+      hasState && subscriber.next(state);
+      subscriber.complete();
+    }));
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/concatMap.js
+function concatMap(project, resultSelector) {
+  return isFunction(resultSelector) ? mergeMap(project, resultSelector, 1) : mergeMap(project, 1);
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/defaultIfEmpty.js
+function defaultIfEmpty(defaultValue) {
+  return operate(function(source, subscriber) {
+    var hasValue = false;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      hasValue = true;
+      subscriber.next(value);
+    }, function() {
+      if (!hasValue) {
+        subscriber.next(defaultValue);
+      }
+      subscriber.complete();
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/take.js
+function take(count2) {
+  return count2 <= 0 ? function() {
+    return EMPTY;
+  } : operate(function(source, subscriber) {
+    var seen = 0;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      if (++seen <= count2) {
+        subscriber.next(value);
+        if (count2 <= seen) {
+          subscriber.complete();
+        }
+      }
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/throwIfEmpty.js
+function throwIfEmpty(errorFactory) {
+  if (errorFactory === void 0) {
+    errorFactory = defaultErrorFactory;
+  }
+  return operate(function(source, subscriber) {
+    var hasValue = false;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      hasValue = true;
+      subscriber.next(value);
+    }, function() {
+      return hasValue ? subscriber.complete() : subscriber.error(errorFactory());
+    }));
+  });
+}
+function defaultErrorFactory() {
+  return new EmptyError();
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/finalize.js
+function finalize(callback) {
+  return operate(function(source, subscriber) {
+    try {
+      source.subscribe(subscriber);
+    } finally {
+      subscriber.add(callback);
+    }
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/first.js
+function first(predicate, defaultValue) {
+  var hasDefaultValue = arguments.length >= 2;
+  return function(source) {
+    return source.pipe(predicate ? filter(function(v, i) {
+      return predicate(v, i, source);
+    }) : identity, take(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function() {
+      return new EmptyError();
+    }));
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/takeLast.js
+function takeLast(count2) {
+  return count2 <= 0 ? function() {
+    return EMPTY;
+  } : operate(function(source, subscriber) {
+    var buffer2 = [];
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      buffer2.push(value);
+      count2 < buffer2.length && buffer2.shift();
+    }, function() {
+      var e_1, _a;
+      try {
+        for (var buffer_1 = __values(buffer2), buffer_1_1 = buffer_1.next(); !buffer_1_1.done; buffer_1_1 = buffer_1.next()) {
+          var value = buffer_1_1.value;
+          subscriber.next(value);
+        }
+      } catch (e_1_1) {
+        e_1 = { error: e_1_1 };
+      } finally {
+        try {
+          if (buffer_1_1 && !buffer_1_1.done && (_a = buffer_1.return)) _a.call(buffer_1);
+        } finally {
+          if (e_1) throw e_1.error;
+        }
+      }
+      subscriber.complete();
+    }, void 0, function() {
+      buffer2 = null;
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/last.js
+function last2(predicate, defaultValue) {
+  var hasDefaultValue = arguments.length >= 2;
+  return function(source) {
+    return source.pipe(predicate ? filter(function(v, i) {
+      return predicate(v, i, source);
+    }) : identity, takeLast(1), hasDefaultValue ? defaultIfEmpty(defaultValue) : throwIfEmpty(function() {
+      return new EmptyError();
+    }));
+  };
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/scan.js
+function scan(accumulator, seed) {
+  return operate(scanInternals(accumulator, seed, arguments.length >= 2, true));
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/startWith.js
+function startWith() {
+  var values = [];
+  for (var _i = 0; _i < arguments.length; _i++) {
+    values[_i] = arguments[_i];
+  }
+  var scheduler = popScheduler(values);
+  return operate(function(source, subscriber) {
+    (scheduler ? concat(values, source, scheduler) : concat(values, source)).subscribe(subscriber);
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/switchMap.js
+function switchMap(project, resultSelector) {
+  return operate(function(source, subscriber) {
+    var innerSubscriber = null;
+    var index = 0;
+    var isComplete = false;
+    var checkComplete = function() {
+      return isComplete && !innerSubscriber && subscriber.complete();
+    };
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      innerSubscriber === null || innerSubscriber === void 0 ? void 0 : innerSubscriber.unsubscribe();
+      var innerIndex = 0;
+      var outerIndex = index++;
+      innerFrom(project(value, outerIndex)).subscribe(innerSubscriber = createOperatorSubscriber(subscriber, function(innerValue) {
+        return subscriber.next(resultSelector ? resultSelector(value, innerValue, outerIndex, innerIndex++) : innerValue);
+      }, function() {
+        innerSubscriber = null;
+        checkComplete();
+      }));
+    }, function() {
+      isComplete = true;
+      checkComplete();
+    }));
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/takeUntil.js
+function takeUntil(notifier) {
+  return operate(function(source, subscriber) {
+    innerFrom(notifier).subscribe(createOperatorSubscriber(subscriber, function() {
+      return subscriber.complete();
+    }, noop));
+    !subscriber.closed && source.subscribe(subscriber);
+  });
+}
+
+// node_modules/rxjs/dist/esm5/internal/operators/tap.js
+function tap(observerOrNext, error, complete) {
+  var tapObserver = isFunction(observerOrNext) || error || complete ? { next: observerOrNext, error, complete } : observerOrNext;
+  return tapObserver ? operate(function(source, subscriber) {
+    var _a;
+    (_a = tapObserver.subscribe) === null || _a === void 0 ? void 0 : _a.call(tapObserver);
+    var isUnsub = true;
+    source.subscribe(createOperatorSubscriber(subscriber, function(value) {
+      var _a2;
+      (_a2 = tapObserver.next) === null || _a2 === void 0 ? void 0 : _a2.call(tapObserver, value);
+      subscriber.next(value);
+    }, function() {
+      var _a2;
+      isUnsub = false;
+      (_a2 = tapObserver.complete) === null || _a2 === void 0 ? void 0 : _a2.call(tapObserver);
+      subscriber.complete();
+    }, function(err) {
+      var _a2;
+      isUnsub = false;
+      (_a2 = tapObserver.error) === null || _a2 === void 0 ? void 0 : _a2.call(tapObserver, err);
+      subscriber.error(err);
+    }, function() {
+      var _a2, _b;
+      if (isUnsub) {
+        (_a2 = tapObserver.unsubscribe) === null || _a2 === void 0 ? void 0 : _a2.call(tapObserver);
+      }
+      (_b = tapObserver.finalize) === null || _b === void 0 ? void 0 : _b.call(tapObserver);
+    }));
+  }) : identity;
+}
+
+// node_modules/@angular/core/fesm2022/untracked.mjs
+function createLinkedSignal(sourceFn, computationFn, equalityFn) {
+  const node = Object.create(LINKED_SIGNAL_NODE);
+  node.source = sourceFn;
+  node.computation = computationFn;
+  if (equalityFn != void 0) {
+    node.equal = equalityFn;
+  }
+  const linkedSignalGetter = () => {
+    producerUpdateValueVersion(node);
+    producerAccessed(node);
+    if (node.value === ERRORED) {
+      throw node.error;
+    }
+    return node.value;
+  };
+  const getter = linkedSignalGetter;
+  getter[SIGNAL] = node;
+  if (typeof ngDevMode !== "undefined" && ngDevMode) {
+    const debugName = node.debugName ? " (" + node.debugName + ")" : "";
+    getter.toString = () => `[LinkedSignal${debugName}: ${node.value}]`;
+  }
+  runPostProducerCreatedFn(node);
+  return getter;
+}
+function linkedSignalSetFn(node, newValue) {
+  producerUpdateValueVersion(node);
+  signalSetFn(node, newValue);
+  producerMarkClean(node);
+}
+function linkedSignalUpdateFn(node, updater) {
+  producerUpdateValueVersion(node);
+  signalUpdateFn(node, updater);
+  producerMarkClean(node);
+}
+var LINKED_SIGNAL_NODE = (() => {
+  return __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+    value: UNSET,
+    dirty: true,
+    error: null,
+    equal: defaultEquals,
+    kind: "linkedSignal",
+    producerMustRecompute(node) {
+      return node.value === UNSET || node.value === COMPUTING;
+    },
+    producerRecomputeValue(node) {
+      if (node.value === COMPUTING) {
+        throw new Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Detected cycle in computations." : "");
+      }
+      const oldValue = node.value;
+      node.value = COMPUTING;
+      const prevConsumer = consumerBeforeComputation(node);
+      let newValue;
+      try {
+        const newSourceValue = node.source();
+        const prev = oldValue === UNSET || oldValue === ERRORED ? void 0 : {
+          source: node.sourceValue,
+          value: oldValue
+        };
+        newValue = node.computation(newSourceValue, prev);
+        node.sourceValue = newSourceValue;
+      } catch (err) {
+        newValue = ERRORED;
+        node.error = err;
+      } finally {
+        consumerAfterComputation(node, prevConsumer);
+      }
+      if (oldValue !== UNSET && newValue !== ERRORED && node.equal(oldValue, newValue)) {
+        node.value = oldValue;
+        return;
+      }
+      node.value = newValue;
+      node.version++;
+    }
+  });
+})();
+function untracked(nonReactiveReadsFn) {
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    return nonReactiveReadsFn();
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+
+// node_modules/@angular/core/fesm2022/weak_ref.mjs
+function setAlternateWeakRefImpl(impl) {
+}
+
+// node_modules/@angular/core/fesm2022/primitives/signals.mjs
+var NOOP_CLEANUP_FN = () => {
+};
+var WATCH_NODE = (() => {
+  return __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+    consumerIsAlwaysLive: true,
+    consumerAllowSignalWrites: false,
+    consumerMarkedDirty: (node) => {
+      if (node.schedule !== null) {
+        node.schedule(node.ref);
+      }
+    },
+    hasRun: false,
+    cleanupFn: NOOP_CLEANUP_FN
+  });
+})();
+
+// node_modules/@angular/core/fesm2022/root_effect_scheduler.mjs
+var ERROR_DETAILS_PAGE_BASE_URL = "https://angular.dev/errors";
+var XSS_SECURITY_URL = "https://angular.dev/best-practices/security#preventing-cross-site-scripting-xss";
+var RuntimeError = class extends Error {
+  code;
+  constructor(code, message) {
+    super(formatRuntimeError(code, message));
+    this.code = code;
+  }
+};
+function formatRuntimeErrorCode(code) {
+  return `NG0${Math.abs(code)}`;
+}
+function formatRuntimeError(code, message) {
+  const fullCode = formatRuntimeErrorCode(code);
+  let errorMessage = `${fullCode}${message ? ": " + message : ""}`;
+  if (ngDevMode && code < 0) {
+    const addPeriodSeparator = !errorMessage.match(/[.,;!?\n]$/);
+    const separator = addPeriodSeparator ? "." : "";
+    errorMessage = `${errorMessage}${separator} Find more at ${ERROR_DETAILS_PAGE_BASE_URL}/${fullCode}`;
+  }
+  return errorMessage;
+}
+var _global = globalThis;
+function ngDevModeResetPerfCounters() {
+  const locationString = typeof location !== "undefined" ? location.toString() : "";
+  const newCounters = {
+    hydratedNodes: 0,
+    hydratedComponents: 0,
+    dehydratedViewsRemoved: 0,
+    dehydratedViewsCleanupRuns: 0,
+    componentsSkippedHydration: 0,
+    deferBlocksWithIncrementalHydration: 0
+  };
+  const allowNgDevModeTrue = locationString.indexOf("ngDevMode=false") === -1;
+  if (!allowNgDevModeTrue) {
+    _global["ngDevMode"] = false;
+  } else {
+    if (typeof _global["ngDevMode"] !== "object") {
+      _global["ngDevMode"] = {};
+    }
+    Object.assign(_global["ngDevMode"], newCounters);
+  }
+  return newCounters;
+}
+function initNgDevMode() {
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    if (typeof ngDevMode !== "object" || Object.keys(ngDevMode).length === 0) {
+      ngDevModeResetPerfCounters();
+    }
+    return typeof ngDevMode !== "undefined" && !!ngDevMode;
+  }
+  return false;
+}
+function getClosureSafeProperty(objWithPropertyToExtract) {
+  for (let key in objWithPropertyToExtract) {
+    if (objWithPropertyToExtract[key] === getClosureSafeProperty) {
+      return key;
+    }
+  }
+  throw Error(typeof ngDevMode !== "undefined" && ngDevMode ? "Could not find renamed property on target object." : "");
+}
+function fillProperties(target, source) {
+  for (const key in source) {
+    if (source.hasOwnProperty(key) && !target.hasOwnProperty(key)) {
+      target[key] = source[key];
+    }
+  }
+}
+function stringify(token) {
+  if (typeof token === "string") {
+    return token;
+  }
+  if (Array.isArray(token)) {
+    return `[${token.map(stringify).join(", ")}]`;
+  }
+  if (token == null) {
+    return "" + token;
+  }
+  const name = token.overriddenName || token.name;
+  if (name) {
+    return `${name}`;
+  }
+  const result = token.toString();
+  if (result == null) {
+    return "" + result;
+  }
+  const newLineIndex = result.indexOf("\n");
+  return newLineIndex >= 0 ? result.slice(0, newLineIndex) : result;
+}
+function concatStringsWithSpace(before, after) {
+  if (!before)
+    return after || "";
+  if (!after)
+    return before;
+  return `${before} ${after}`;
+}
+function truncateMiddle(str, maxLength = 100) {
+  if (!str || maxLength < 1 || str.length <= maxLength)
+    return str;
+  if (maxLength == 1)
+    return str.substring(0, 1) + "...";
+  const halfLimit = Math.round(maxLength / 2);
+  return str.substring(0, halfLimit) + "..." + str.substring(str.length - halfLimit);
+}
+var __forward_ref__ = getClosureSafeProperty({ __forward_ref__: getClosureSafeProperty });
+function forwardRef(forwardRefFn) {
+  forwardRefFn.__forward_ref__ = forwardRef;
+  forwardRefFn.toString = function() {
+    return stringify(this());
+  };
+  return forwardRefFn;
+}
+function resolveForwardRef(type) {
+  return isForwardRef(type) ? type() : type;
+}
+function isForwardRef(fn) {
+  return typeof fn === "function" && fn.hasOwnProperty(__forward_ref__) && fn.__forward_ref__ === forwardRef;
+}
+function assertNumber(actual, msg) {
+  if (!(typeof actual === "number")) {
+    throwError2(msg, typeof actual, "number", "===");
+  }
+}
+function assertNumberInRange(actual, minInclusive, maxInclusive) {
+  assertNumber(actual, "Expected a number");
+  assertLessThanOrEqual(actual, maxInclusive, "Expected number to be less than or equal to");
+  assertGreaterThanOrEqual(actual, minInclusive, "Expected number to be greater than or equal to");
+}
+function assertString(actual, msg) {
+  if (!(typeof actual === "string")) {
+    throwError2(msg, actual === null ? "null" : typeof actual, "string", "===");
+  }
+}
+function assertFunction(actual, msg) {
+  if (!(typeof actual === "function")) {
+    throwError2(msg, actual === null ? "null" : typeof actual, "function", "===");
+  }
+}
+function assertEqual(actual, expected, msg) {
+  if (!(actual == expected)) {
+    throwError2(msg, actual, expected, "==");
+  }
+}
+function assertNotEqual(actual, expected, msg) {
+  if (!(actual != expected)) {
+    throwError2(msg, actual, expected, "!=");
+  }
+}
+function assertSame(actual, expected, msg) {
+  if (!(actual === expected)) {
+    throwError2(msg, actual, expected, "===");
+  }
+}
+function assertNotSame(actual, expected, msg) {
+  if (!(actual !== expected)) {
+    throwError2(msg, actual, expected, "!==");
+  }
+}
+function assertLessThan(actual, expected, msg) {
+  if (!(actual < expected)) {
+    throwError2(msg, actual, expected, "<");
+  }
+}
+function assertLessThanOrEqual(actual, expected, msg) {
+  if (!(actual <= expected)) {
+    throwError2(msg, actual, expected, "<=");
+  }
+}
+function assertGreaterThan(actual, expected, msg) {
+  if (!(actual > expected)) {
+    throwError2(msg, actual, expected, ">");
+  }
+}
+function assertGreaterThanOrEqual(actual, expected, msg) {
+  if (!(actual >= expected)) {
+    throwError2(msg, actual, expected, ">=");
+  }
+}
+function assertNotDefined(actual, msg) {
+  if (actual != null) {
+    throwError2(msg, actual, null, "==");
+  }
+}
+function assertDefined(actual, msg) {
+  if (actual == null) {
+    throwError2(msg, actual, null, "!=");
+  }
+}
+function throwError2(msg, actual, expected, comparison) {
+  throw new Error(`ASSERTION ERROR: ${msg}` + (comparison == null ? "" : ` [Expected=> ${expected} ${comparison} ${actual} <=Actual]`));
+}
+function assertDomNode(node) {
+  if (!(node instanceof Node)) {
+    throwError2(`The provided value must be an instance of a DOM Node but got ${stringify(node)}`);
+  }
+}
+function assertElement(node) {
+  if (!(node instanceof Element)) {
+    throwError2(`The provided value must be an element but got ${stringify(node)}`);
+  }
+}
+function assertIndexInRange(arr, index) {
+  assertDefined(arr, "Array must be defined.");
+  const maxLen = arr.length;
+  if (index < 0 || index >= maxLen) {
+    throwError2(`Index expected to be less than ${maxLen} but got ${index}`);
+  }
+}
+function assertOneOf(value, ...validValues) {
+  if (validValues.indexOf(value) !== -1)
+    return true;
+  throwError2(`Expected value to be one of ${JSON.stringify(validValues)} but was ${JSON.stringify(value)}.`);
+}
+function assertNotReactive(fn) {
+  if (getActiveConsumer() !== null) {
+    throwError2(`${fn}() should never be called in a reactive context.`);
+  }
+}
+function ɵɵdefineInjectable(opts) {
+  return {
+    token: opts.token,
+    providedIn: opts.providedIn || null,
+    factory: opts.factory,
+    value: void 0
+  };
+}
+var defineInjectable = ɵɵdefineInjectable;
+function ɵɵdefineInjector(options) {
+  return { providers: options.providers || [], imports: options.imports || [] };
+}
+function getInjectableDef(type) {
+  return getOwnDefinition(type, NG_PROV_DEF);
+}
+function isInjectable(type) {
+  return getInjectableDef(type) !== null;
+}
+function getOwnDefinition(type, field) {
+  return type.hasOwnProperty(field) && type[field] || null;
+}
+function getInheritedInjectableDef(type) {
+  const def = type?.[NG_PROV_DEF] ?? null;
+  if (def) {
+    ngDevMode && console.warn(`DEPRECATED: DI is instantiating a token "${type.name}" that inherits its @Injectable decorator but does not provide one itself.
+This will become an error in a future version of Angular. Please add @Injectable() to the "${type.name}" class.`);
+    return def;
+  } else {
+    return null;
+  }
+}
+function getInjectorDef(type) {
+  return type && type.hasOwnProperty(NG_INJ_DEF) ? type[NG_INJ_DEF] : null;
+}
+var NG_PROV_DEF = getClosureSafeProperty({ ɵprov: getClosureSafeProperty });
+var NG_INJ_DEF = getClosureSafeProperty({ ɵinj: getClosureSafeProperty });
+var InjectionToken = class {
+  _desc;
+  /** @internal */
+  ngMetadataName = "InjectionToken";
+  ɵprov;
+  /**
+   * @param _desc   Description for the token,
+   *                used only for debugging purposes,
+   *                it should but does not need to be unique
+   * @param options Options for the token's usage, as described above
+   */
+  constructor(_desc, options) {
+    this._desc = _desc;
+    this.ɵprov = void 0;
+    if (typeof options == "number") {
+      (typeof ngDevMode === "undefined" || ngDevMode) && assertLessThan(options, 0, "Only negative numbers are supported here");
+      this.__NG_ELEMENT_ID__ = options;
+    } else if (options !== void 0) {
+      this.ɵprov = ɵɵdefineInjectable({
+        token: this,
+        providedIn: options.providedIn || "root",
+        factory: options.factory
+      });
+    }
+  }
+  /**
+   * @internal
+   */
+  get multi() {
+    return this;
+  }
+  toString() {
+    return `InjectionToken ${this._desc}`;
+  }
+};
+var _injectorProfilerContext;
+function getInjectorProfilerContext() {
+  !ngDevMode && throwError2("getInjectorProfilerContext should never be called in production mode");
+  return _injectorProfilerContext;
+}
+function setInjectorProfilerContext(context2) {
+  !ngDevMode && throwError2("setInjectorProfilerContext should never be called in production mode");
+  const previous = _injectorProfilerContext;
+  _injectorProfilerContext = context2;
+  return previous;
+}
+var injectorProfilerCallbacks = [];
+var NOOP_PROFILER_REMOVAL = () => {
+};
+function removeProfiler(profiler2) {
+  const profilerIdx = injectorProfilerCallbacks.indexOf(profiler2);
+  if (profilerIdx !== -1) {
+    injectorProfilerCallbacks.splice(profilerIdx, 1);
+  }
+}
+function setInjectorProfiler(injectorProfiler2) {
+  !ngDevMode && throwError2("setInjectorProfiler should never be called in production mode");
+  if (injectorProfiler2 !== null) {
+    if (!injectorProfilerCallbacks.includes(injectorProfiler2)) {
+      injectorProfilerCallbacks.push(injectorProfiler2);
+    }
+    return () => removeProfiler(injectorProfiler2);
+  } else {
+    injectorProfilerCallbacks.length = 0;
+    return NOOP_PROFILER_REMOVAL;
+  }
+}
+function injectorProfiler(event) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  for (let i = 0; i < injectorProfilerCallbacks.length; i++) {
+    const injectorProfilerCallback = injectorProfilerCallbacks[i];
+    injectorProfilerCallback(event);
+  }
+}
+function emitProviderConfiguredEvent(eventProvider, isViewProvider = false) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  let token;
+  if (typeof eventProvider === "function") {
+    token = eventProvider;
+  } else if (eventProvider instanceof InjectionToken) {
+    token = eventProvider;
+  } else {
+    token = resolveForwardRef(eventProvider.provide);
+  }
+  let provider = eventProvider;
+  if (eventProvider instanceof InjectionToken) {
+    provider = eventProvider.ɵprov || eventProvider;
+  }
+  injectorProfiler({
+    type: 2,
+    context: getInjectorProfilerContext(),
+    providerRecord: { token, provider, isViewProvider }
+  });
+}
+function emitInjectorToCreateInstanceEvent(token) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  injectorProfiler({
+    type: 4,
+    context: getInjectorProfilerContext(),
+    token
+  });
+}
+function emitInstanceCreatedByInjectorEvent(instance) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  injectorProfiler({
+    type: 1,
+    context: getInjectorProfilerContext(),
+    instance: { value: instance }
+  });
+}
+function emitInjectEvent(token, value, flags) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  injectorProfiler({
+    type: 0,
+    context: getInjectorProfilerContext(),
+    service: { token, value, flags }
+  });
+}
+function emitEffectCreatedEvent(effect2) {
+  !ngDevMode && throwError2("Injector profiler should never be called in production mode");
+  injectorProfiler({
+    type: 3,
+    context: getInjectorProfilerContext(),
+    effect: effect2
+  });
+}
+function runInInjectorProfilerContext(injector, token, callback) {
+  !ngDevMode && throwError2("runInInjectorProfilerContext should never be called in production mode");
+  const prevInjectContext = setInjectorProfilerContext({ injector, token });
+  try {
+    callback();
+  } finally {
+    setInjectorProfilerContext(prevInjectContext);
+  }
+}
+function isEnvironmentProviders(value) {
+  return value && !!value.ɵproviders;
+}
+var NG_COMP_DEF = getClosureSafeProperty({ ɵcmp: getClosureSafeProperty });
+var NG_DIR_DEF = getClosureSafeProperty({ ɵdir: getClosureSafeProperty });
+var NG_PIPE_DEF = getClosureSafeProperty({ ɵpipe: getClosureSafeProperty });
+var NG_MOD_DEF = getClosureSafeProperty({ ɵmod: getClosureSafeProperty });
+var NG_FACTORY_DEF = getClosureSafeProperty({ ɵfac: getClosureSafeProperty });
+var NG_ELEMENT_ID = getClosureSafeProperty({
+  __NG_ELEMENT_ID__: getClosureSafeProperty
+});
+var NG_ENV_ID = getClosureSafeProperty({ __NG_ENV_ID__: getClosureSafeProperty });
+function renderStringify(value) {
+  if (typeof value === "string")
+    return value;
+  if (value == null)
+    return "";
+  return String(value);
+}
+function stringifyForError(value) {
+  if (typeof value === "function")
+    return value.name || value.toString();
+  if (typeof value === "object" && value != null && typeof value.type === "function") {
+    return value.type.name || value.type.toString();
+  }
+  return renderStringify(value);
+}
+function debugStringifyTypeForError(type) {
+  let componentDef = type[NG_COMP_DEF] || null;
+  if (componentDef !== null && componentDef.debugInfo) {
+    return stringifyTypeFromDebugInfo(componentDef.debugInfo);
+  }
+  return stringifyForError(type);
+}
+function stringifyTypeFromDebugInfo(debugInfo) {
+  if (!debugInfo.filePath || !debugInfo.lineNumber) {
+    return debugInfo.className;
+  } else {
+    return `${debugInfo.className} (at ${debugInfo.filePath}:${debugInfo.lineNumber})`;
+  }
+}
+function throwCyclicDependencyError(token, path) {
+  throw new RuntimeError(-200, ngDevMode ? `Circular dependency in DI detected for ${token}${path ? `. Dependency path: ${path.join(" > ")} > ${token}` : ""}` : token);
+}
+function throwMixedMultiProviderError() {
+  throw new Error(`Cannot mix multi providers and regular providers`);
+}
+function throwInvalidProviderError(ngModuleType, providers, provider) {
+  if (ngModuleType && providers) {
+    const providerDetail = providers.map((v) => v == provider ? "?" + provider + "?" : "...");
+    throw new Error(`Invalid provider for the NgModule '${stringify(ngModuleType)}' - only instances of Provider and Type are allowed, got: [${providerDetail.join(", ")}]`);
+  } else if (isEnvironmentProviders(provider)) {
+    if (provider.ɵfromNgModule) {
+      throw new RuntimeError(207, `Invalid providers from 'importProvidersFrom' present in a non-environment injector. 'importProvidersFrom' can't be used for component providers.`);
+    } else {
+      throw new RuntimeError(207, `Invalid providers present in a non-environment injector. 'EnvironmentProviders' can't be used for component providers.`);
+    }
+  } else {
+    throw new Error("Invalid provider");
+  }
+}
+function throwProviderNotFoundError(token, injectorName) {
+  const errorMessage = ngDevMode && `No provider for ${stringifyForError(token)} found${injectorName ? ` in ${injectorName}` : ""}`;
+  throw new RuntimeError(-201, errorMessage);
+}
+var _injectImplementation;
+function getInjectImplementation() {
+  return _injectImplementation;
+}
+function setInjectImplementation(impl) {
+  const previous = _injectImplementation;
+  _injectImplementation = impl;
+  return previous;
+}
+function injectRootLimpMode(token, notFoundValue, flags) {
+  const injectableDef = getInjectableDef(token);
+  if (injectableDef && injectableDef.providedIn == "root") {
+    return injectableDef.value === void 0 ? injectableDef.value = injectableDef.factory() : injectableDef.value;
+  }
+  if (flags & 8)
+    return null;
+  if (notFoundValue !== void 0)
+    return notFoundValue;
+  throwProviderNotFoundError(token, "Injector");
+}
+function assertInjectImplementationNotEqual(fn) {
+  ngDevMode && assertNotEqual(_injectImplementation, fn, "Calling ɵɵinject would cause infinite recursion");
+}
+var _THROW_IF_NOT_FOUND = {};
+var THROW_IF_NOT_FOUND = _THROW_IF_NOT_FOUND;
+var DI_DECORATOR_FLAG = "__NG_DI_FLAG__";
+var RetrievingInjector = class {
+  injector;
+  constructor(injector) {
+    this.injector = injector;
+  }
+  retrieve(token, options) {
+    const flags = convertToBitFlags(options) || 0;
+    try {
+      return this.injector.get(
+        token,
+        // When a dependency is requested with an optional flag, DI returns null as the default value.
+        flags & 8 ? null : THROW_IF_NOT_FOUND,
+        flags
+      );
+    } catch (e) {
+      if (isNotFound(e)) {
+        return e;
+      }
+      throw e;
+    }
+  }
+};
+var NG_TEMP_TOKEN_PATH = "ngTempTokenPath";
+var NG_TOKEN_PATH = "ngTokenPath";
+var NEW_LINE = /\n/gm;
+var NO_NEW_LINE = "ɵ";
+var SOURCE = "__source";
+function injectInjectorOnly(token, flags = 0) {
+  const currentInjector = getCurrentInjector();
+  if (currentInjector === void 0) {
+    throw new RuntimeError(-203, ngDevMode && `The \`${stringify(token)}\` token injection failed. \`inject()\` function must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with \`runInInjectionContext\`.`);
+  } else if (currentInjector === null) {
+    return injectRootLimpMode(token, void 0, flags);
+  } else {
+    const options = convertToInjectOptions(flags);
+    const value = currentInjector.retrieve(token, options);
+    ngDevMode && emitInjectEvent(token, value, flags);
+    if (isNotFound(value)) {
+      if (options.optional) {
+        return null;
+      }
+      throw value;
+    }
+    return value;
+  }
+}
+function ɵɵinject(token, flags = 0) {
+  return (getInjectImplementation() || injectInjectorOnly)(resolveForwardRef(token), flags);
+}
+function ɵɵinvalidFactoryDep(index) {
+  throw new RuntimeError(202, ngDevMode && `This constructor is not compatible with Angular Dependency Injection because its dependency at index ${index} of the parameter list is invalid.
+This can happen if the dependency type is a primitive like a string or if an ancestor of this class is missing an Angular decorator.
+
+Please check that 1) the type for the parameter at index ${index} is correct and 2) the correct Angular decorators are defined for this class and its ancestors.`);
+}
+function inject(token, options) {
+  return ɵɵinject(token, convertToBitFlags(options));
+}
+function convertToBitFlags(flags) {
+  if (typeof flags === "undefined" || typeof flags === "number") {
+    return flags;
+  }
+  return 0 | // comment to force a line break in the formatter
+  (flags.optional && 8) | (flags.host && 1) | (flags.self && 2) | (flags.skipSelf && 4);
+}
+function convertToInjectOptions(flags) {
+  return {
+    optional: !!(flags & 8),
+    host: !!(flags & 1),
+    self: !!(flags & 2),
+    skipSelf: !!(flags & 4)
+  };
+}
+function injectArgs(types) {
+  const args = [];
+  for (let i = 0; i < types.length; i++) {
+    const arg = resolveForwardRef(types[i]);
+    if (Array.isArray(arg)) {
+      if (arg.length === 0) {
+        throw new RuntimeError(900, ngDevMode && "Arguments array must have arguments.");
+      }
+      let type = void 0;
+      let flags = 0;
+      for (let j = 0; j < arg.length; j++) {
+        const meta = arg[j];
+        const flag = getInjectFlag(meta);
+        if (typeof flag === "number") {
+          if (flag === -1) {
+            type = meta.token;
+          } else {
+            flags |= flag;
+          }
+        } else {
+          type = meta;
+        }
+      }
+      args.push(ɵɵinject(type, flags));
+    } else {
+      args.push(ɵɵinject(arg));
+    }
+  }
+  return args;
+}
+function attachInjectFlag(decorator, flag) {
+  decorator[DI_DECORATOR_FLAG] = flag;
+  decorator.prototype[DI_DECORATOR_FLAG] = flag;
+  return decorator;
+}
+function getInjectFlag(token) {
+  return token[DI_DECORATOR_FLAG];
+}
+function catchInjectorError(e, token, injectorErrorName, source) {
+  const tokenPath = e[NG_TEMP_TOKEN_PATH];
+  if (token[SOURCE]) {
+    tokenPath.unshift(token[SOURCE]);
+  }
+  e.message = formatError("\n" + e.message, tokenPath, injectorErrorName, source);
+  e[NG_TOKEN_PATH] = tokenPath;
+  e[NG_TEMP_TOKEN_PATH] = null;
+  throw e;
+}
+function formatError(text, obj, injectorErrorName, source = null) {
+  text = text && text.charAt(0) === "\n" && text.charAt(1) == NO_NEW_LINE ? text.slice(2) : text;
+  let context2 = stringify(obj);
+  if (Array.isArray(obj)) {
+    context2 = obj.map(stringify).join(" -> ");
+  } else if (typeof obj === "object") {
+    let parts = [];
+    for (let key in obj) {
+      if (obj.hasOwnProperty(key)) {
+        let value = obj[key];
+        parts.push(key + ":" + (typeof value === "string" ? JSON.stringify(value) : stringify(value)));
+      }
+    }
+    context2 = `{${parts.join(", ")}}`;
+  }
+  return `${injectorErrorName}${source ? "(" + source + ")" : ""}[${context2}]: ${text.replace(NEW_LINE, "\n  ")}`;
+}
+function getFactoryDef(type, throwNotFound) {
+  const hasFactoryDef = type.hasOwnProperty(NG_FACTORY_DEF);
+  if (!hasFactoryDef && throwNotFound === true && ngDevMode) {
+    throw new Error(`Type ${stringify(type)} does not have 'ɵfac' property.`);
+  }
+  return hasFactoryDef ? type[NG_FACTORY_DEF] : null;
+}
+function arrayEquals(a, b, identityAccessor) {
+  if (a.length !== b.length)
+    return false;
+  for (let i = 0; i < a.length; i++) {
+    let valueA = a[i];
+    let valueB = b[i];
+    if (identityAccessor) {
+      valueA = identityAccessor(valueA);
+      valueB = identityAccessor(valueB);
+    }
+    if (valueB !== valueA) {
+      return false;
+    }
+  }
+  return true;
+}
+function flatten(list) {
+  return list.flat(Number.POSITIVE_INFINITY);
+}
+function deepForEach(input2, fn) {
+  input2.forEach((value) => Array.isArray(value) ? deepForEach(value, fn) : fn(value));
+}
+function addToArray(arr, index, value) {
+  if (index >= arr.length) {
+    arr.push(value);
+  } else {
+    arr.splice(index, 0, value);
+  }
+}
+function removeFromArray(arr, index) {
+  if (index >= arr.length - 1) {
+    return arr.pop();
+  } else {
+    return arr.splice(index, 1)[0];
+  }
+}
+function newArray(size, value) {
+  const list = [];
+  for (let i = 0; i < size; i++) {
+    list.push(value);
+  }
+  return list;
+}
+function arraySplice(array, index, count2) {
+  const length = array.length - count2;
+  while (index < length) {
+    array[index] = array[index + count2];
+    index++;
+  }
+  while (count2--) {
+    array.pop();
+  }
+}
+function arrayInsert2(array, index, value1, value2) {
+  ngDevMode && assertLessThanOrEqual(index, array.length, "Can't insert past array end.");
+  let end = array.length;
+  if (end == index) {
+    array.push(value1, value2);
+  } else if (end === 1) {
+    array.push(value2, array[0]);
+    array[0] = value1;
+  } else {
+    end--;
+    array.push(array[end - 1], array[end]);
+    while (end > index) {
+      const previousEnd = end - 2;
+      array[end] = array[previousEnd];
+      end--;
+    }
+    array[index] = value1;
+    array[index + 1] = value2;
+  }
+}
+function keyValueArraySet(keyValueArray, key, value) {
+  let index = keyValueArrayIndexOf(keyValueArray, key);
+  if (index >= 0) {
+    keyValueArray[index | 1] = value;
+  } else {
+    index = ~index;
+    arrayInsert2(keyValueArray, index, key, value);
+  }
+  return index;
+}
+function keyValueArrayGet(keyValueArray, key) {
+  const index = keyValueArrayIndexOf(keyValueArray, key);
+  if (index >= 0) {
+    return keyValueArray[index | 1];
+  }
+  return void 0;
+}
+function keyValueArrayIndexOf(keyValueArray, key) {
+  return _arrayIndexOfSorted(keyValueArray, key, 1);
+}
+function _arrayIndexOfSorted(array, value, shift) {
+  ngDevMode && assertEqual(Array.isArray(array), true, "Expecting an array");
+  let start = 0;
+  let end = array.length >> shift;
+  while (end !== start) {
+    const middle = start + (end - start >> 1);
+    const current = array[middle << shift];
+    if (value === current) {
+      return middle << shift;
+    } else if (current > value) {
+      end = middle;
+    } else {
+      start = middle + 1;
+    }
+  }
+  return ~(end << shift);
+}
+var EMPTY_OBJ = {};
+var EMPTY_ARRAY = [];
+if ((typeof ngDevMode === "undefined" || ngDevMode) && initNgDevMode()) {
+  Object.freeze(EMPTY_OBJ);
+  Object.freeze(EMPTY_ARRAY);
+}
+var ENVIRONMENT_INITIALIZER = new InjectionToken(ngDevMode ? "ENVIRONMENT_INITIALIZER" : "");
+var INJECTOR$1 = new InjectionToken(
+  ngDevMode ? "INJECTOR" : "",
+  // Disable tslint because this is const enum which gets inlined not top level prop access.
+  // tslint:disable-next-line: no-toplevel-property-access
+  -1
+  /* InjectorMarkers.Injector */
+);
+var INJECTOR_DEF_TYPES = new InjectionToken(ngDevMode ? "INJECTOR_DEF_TYPES" : "");
+var NullInjector = class {
+  get(token, notFoundValue = THROW_IF_NOT_FOUND) {
+    if (notFoundValue === THROW_IF_NOT_FOUND) {
+      const error = new NotFoundError(`NullInjectorError: No provider for ${stringify(token)}!`);
+      throw error;
+    }
+    return notFoundValue;
+  }
+};
+function getNgModuleDef(type) {
+  return type[NG_MOD_DEF] || null;
+}
+function getNgModuleDefOrThrow(type) {
+  const ngModuleDef = getNgModuleDef(type);
+  if (!ngModuleDef) {
+    throw new RuntimeError(915, (typeof ngDevMode === "undefined" || ngDevMode) && `Type ${stringify(type)} does not have 'ɵmod' property.`);
+  }
+  return ngModuleDef;
+}
+function getComponentDef(type) {
+  return type[NG_COMP_DEF] || null;
+}
+function getDirectiveDefOrThrow(type) {
+  const def = getDirectiveDef(type);
+  if (!def) {
+    throw new RuntimeError(916, (typeof ngDevMode === "undefined" || ngDevMode) && `Type ${stringify(type)} does not have 'ɵdir' property.`);
+  }
+  return def;
+}
+function getDirectiveDef(type) {
+  return type[NG_DIR_DEF] || null;
+}
+function getPipeDef(type) {
+  return type[NG_PIPE_DEF] || null;
+}
+function isStandalone(type) {
+  const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);
+  return def !== null && def.standalone;
+}
+function makeEnvironmentProviders(providers) {
+  return {
+    ɵproviders: providers
+  };
+}
+function provideEnvironmentInitializer(initializerFn) {
+  return makeEnvironmentProviders([
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      multi: true,
+      useValue: initializerFn
+    }
+  ]);
+}
+function importProvidersFrom(...sources) {
+  return {
+    ɵproviders: internalImportProvidersFrom(true, sources),
+    ɵfromNgModule: true
+  };
+}
+function internalImportProvidersFrom(checkForStandaloneCmp, ...sources) {
+  const providersOut = [];
+  const dedup = /* @__PURE__ */ new Set();
+  let injectorTypesWithProviders;
+  const collectProviders = (provider) => {
+    providersOut.push(provider);
+  };
+  deepForEach(sources, (source) => {
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && checkForStandaloneCmp) {
+      const cmpDef = getComponentDef(source);
+      if (cmpDef?.standalone) {
+        throw new RuntimeError(800, `Importing providers supports NgModule or ModuleWithProviders but got a standalone component "${stringifyForError(source)}"`);
+      }
+    }
+    const internalSource = source;
+    if (walkProviderTree(internalSource, collectProviders, [], dedup)) {
+      injectorTypesWithProviders ||= [];
+      injectorTypesWithProviders.push(internalSource);
+    }
+  });
+  if (injectorTypesWithProviders !== void 0) {
+    processInjectorTypesWithProviders(injectorTypesWithProviders, collectProviders);
+  }
+  return providersOut;
+}
+function processInjectorTypesWithProviders(typesWithProviders, visitor) {
+  for (let i = 0; i < typesWithProviders.length; i++) {
+    const { ngModule, providers } = typesWithProviders[i];
+    deepForEachProvider(providers, (provider) => {
+      ngDevMode && validateProvider(provider, providers || EMPTY_ARRAY, ngModule);
+      visitor(provider, ngModule);
+    });
+  }
+}
+function walkProviderTree(container, visitor, parents, dedup) {
+  container = resolveForwardRef(container);
+  if (!container)
+    return false;
+  let defType = null;
+  let injDef = getInjectorDef(container);
+  const cmpDef = !injDef && getComponentDef(container);
+  if (!injDef && !cmpDef) {
+    const ngModule = container.ngModule;
+    injDef = getInjectorDef(ngModule);
+    if (injDef) {
+      defType = ngModule;
+    } else {
+      return false;
+    }
+  } else if (cmpDef && !cmpDef.standalone) {
+    return false;
+  } else {
+    defType = container;
+  }
+  if (ngDevMode && parents.indexOf(defType) !== -1) {
+    const defName = stringify(defType);
+    const path = parents.map(stringify);
+    throwCyclicDependencyError(defName, path);
+  }
+  const isDuplicate = dedup.has(defType);
+  if (cmpDef) {
+    if (isDuplicate) {
+      return false;
+    }
+    dedup.add(defType);
+    if (cmpDef.dependencies) {
+      const deps = typeof cmpDef.dependencies === "function" ? cmpDef.dependencies() : cmpDef.dependencies;
+      for (const dep of deps) {
+        walkProviderTree(dep, visitor, parents, dedup);
+      }
+    }
+  } else if (injDef) {
+    if (injDef.imports != null && !isDuplicate) {
+      ngDevMode && parents.push(defType);
+      dedup.add(defType);
+      let importTypesWithProviders;
+      try {
+        deepForEach(injDef.imports, (imported) => {
+          if (walkProviderTree(imported, visitor, parents, dedup)) {
+            importTypesWithProviders ||= [];
+            importTypesWithProviders.push(imported);
+          }
+        });
+      } finally {
+        ngDevMode && parents.pop();
+      }
+      if (importTypesWithProviders !== void 0) {
+        processInjectorTypesWithProviders(importTypesWithProviders, visitor);
+      }
+    }
+    if (!isDuplicate) {
+      const factory = getFactoryDef(defType) || (() => new defType());
+      visitor({ provide: defType, useFactory: factory, deps: EMPTY_ARRAY }, defType);
+      visitor({ provide: INJECTOR_DEF_TYPES, useValue: defType, multi: true }, defType);
+      visitor({ provide: ENVIRONMENT_INITIALIZER, useValue: () => ɵɵinject(defType), multi: true }, defType);
+    }
+    const defProviders = injDef.providers;
+    if (defProviders != null && !isDuplicate) {
+      const injectorType = container;
+      deepForEachProvider(defProviders, (provider) => {
+        ngDevMode && validateProvider(provider, defProviders, injectorType);
+        visitor(provider, injectorType);
+      });
+    }
+  } else {
+    return false;
+  }
+  return defType !== container && container.providers !== void 0;
+}
+function validateProvider(provider, providers, containerType) {
+  if (isTypeProvider(provider) || isValueProvider(provider) || isFactoryProvider(provider) || isExistingProvider(provider)) {
+    return;
+  }
+  const classRef = resolveForwardRef(provider && (provider.useClass || provider.provide));
+  if (!classRef) {
+    throwInvalidProviderError(containerType, providers, provider);
+  }
+}
+function deepForEachProvider(providers, fn) {
+  for (let provider of providers) {
+    if (isEnvironmentProviders(provider)) {
+      provider = provider.ɵproviders;
+    }
+    if (Array.isArray(provider)) {
+      deepForEachProvider(provider, fn);
+    } else {
+      fn(provider);
+    }
+  }
+}
+var USE_VALUE = getClosureSafeProperty({
+  provide: String,
+  useValue: getClosureSafeProperty
+});
+function isValueProvider(value) {
+  return value !== null && typeof value == "object" && USE_VALUE in value;
+}
+function isExistingProvider(value) {
+  return !!(value && value.useExisting);
+}
+function isFactoryProvider(value) {
+  return !!(value && value.useFactory);
+}
+function isTypeProvider(value) {
+  return typeof value === "function";
+}
+function isClassProvider(value) {
+  return !!value.useClass;
+}
+var INJECTOR_SCOPE = new InjectionToken(ngDevMode ? "Set Injector scope." : "");
+var NOT_YET = {};
+var CIRCULAR = {};
+var NULL_INJECTOR = void 0;
+function getNullInjector() {
+  if (NULL_INJECTOR === void 0) {
+    NULL_INJECTOR = new NullInjector();
+  }
+  return NULL_INJECTOR;
+}
+var EnvironmentInjector = class {
+};
+var R3Injector = class extends EnvironmentInjector {
+  parent;
+  source;
+  scopes;
+  /**
+   * Map of tokens to records which contain the instances of those tokens.
+   * - `null` value implies that we don't have the record. Used by tree-shakable injectors
+   * to prevent further searches.
+   */
+  records = /* @__PURE__ */ new Map();
+  /**
+   * Set of values instantiated by this injector which contain `ngOnDestroy` lifecycle hooks.
+   */
+  _ngOnDestroyHooks = /* @__PURE__ */ new Set();
+  _onDestroyHooks = [];
+  /**
+   * Flag indicating that this injector was previously destroyed.
+   */
+  get destroyed() {
+    return this._destroyed;
+  }
+  _destroyed = false;
+  injectorDefTypes;
+  constructor(providers, parent, source, scopes) {
+    super();
+    this.parent = parent;
+    this.source = source;
+    this.scopes = scopes;
+    forEachSingleProvider(providers, (provider) => this.processProvider(provider));
+    this.records.set(INJECTOR$1, makeRecord(void 0, this));
+    if (scopes.has("environment")) {
+      this.records.set(EnvironmentInjector, makeRecord(void 0, this));
+    }
+    const record = this.records.get(INJECTOR_SCOPE);
+    if (record != null && typeof record.value === "string") {
+      this.scopes.add(record.value);
+    }
+    this.injectorDefTypes = new Set(this.get(INJECTOR_DEF_TYPES, EMPTY_ARRAY, { self: true }));
+  }
+  retrieve(token, options) {
+    const flags = convertToBitFlags(options) || 0;
+    try {
+      return this.get(
+        token,
+        // When a dependency is requested with an optional flag, DI returns null as the default value.
+        THROW_IF_NOT_FOUND,
+        flags
+      );
+    } catch (e) {
+      if (isNotFound(e)) {
+        return e;
+      }
+      throw e;
+    }
+  }
+  /**
+   * Destroy the injector and release references to every instance or provider associated with it.
+   *
+   * Also calls the `OnDestroy` lifecycle hooks of every instance that was created for which a
+   * hook was found.
+   */
+  destroy() {
+    assertNotDestroyed(this);
+    this._destroyed = true;
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      for (const service of this._ngOnDestroyHooks) {
+        service.ngOnDestroy();
+      }
+      const onDestroyHooks = this._onDestroyHooks;
+      this._onDestroyHooks = [];
+      for (const hook of onDestroyHooks) {
+        hook();
+      }
+    } finally {
+      this.records.clear();
+      this._ngOnDestroyHooks.clear();
+      this.injectorDefTypes.clear();
+      setActiveConsumer(prevConsumer);
+    }
+  }
+  onDestroy(callback) {
+    assertNotDestroyed(this);
+    this._onDestroyHooks.push(callback);
+    return () => this.removeOnDestroy(callback);
+  }
+  runInContext(fn) {
+    assertNotDestroyed(this);
+    const previousInjector = setCurrentInjector(this);
+    const previousInjectImplementation = setInjectImplementation(void 0);
+    let prevInjectContext;
+    if (ngDevMode) {
+      prevInjectContext = setInjectorProfilerContext({ injector: this, token: null });
+    }
+    try {
+      return fn();
+    } finally {
+      setCurrentInjector(previousInjector);
+      setInjectImplementation(previousInjectImplementation);
+      ngDevMode && setInjectorProfilerContext(prevInjectContext);
+    }
+  }
+  get(token, notFoundValue = THROW_IF_NOT_FOUND, options) {
+    assertNotDestroyed(this);
+    if (token.hasOwnProperty(NG_ENV_ID)) {
+      return token[NG_ENV_ID](this);
+    }
+    const flags = convertToBitFlags(options);
+    let prevInjectContext;
+    if (ngDevMode) {
+      prevInjectContext = setInjectorProfilerContext({ injector: this, token });
+    }
+    const previousInjector = setCurrentInjector(this);
+    const previousInjectImplementation = setInjectImplementation(void 0);
+    try {
+      if (!(flags & 4)) {
+        let record = this.records.get(token);
+        if (record === void 0) {
+          const def = couldBeInjectableType(token) && getInjectableDef(token);
+          if (def && this.injectableDefInScope(def)) {
+            if (ngDevMode) {
+              runInInjectorProfilerContext(this, token, () => {
+                emitProviderConfiguredEvent(token);
+              });
+            }
+            record = makeRecord(injectableDefOrInjectorDefFactory(token), NOT_YET);
+          } else {
+            record = null;
+          }
+          this.records.set(token, record);
+        }
+        if (record != null) {
+          return this.hydrate(token, record);
+        }
+      }
+      const nextInjector = !(flags & 2) ? this.parent : getNullInjector();
+      notFoundValue = flags & 8 && notFoundValue === THROW_IF_NOT_FOUND ? null : notFoundValue;
+      return nextInjector.get(token, notFoundValue);
+    } catch (e) {
+      if (isNotFound(e)) {
+        const path = e[NG_TEMP_TOKEN_PATH] = e[NG_TEMP_TOKEN_PATH] || [];
+        path.unshift(stringify(token));
+        if (previousInjector) {
+          throw e;
+        } else {
+          return catchInjectorError(e, token, "R3InjectorError", this.source);
+        }
+      } else {
+        throw e;
+      }
+    } finally {
+      setInjectImplementation(previousInjectImplementation);
+      setCurrentInjector(previousInjector);
+      ngDevMode && setInjectorProfilerContext(prevInjectContext);
+    }
+  }
+  /** @internal */
+  resolveInjectorInitializers() {
+    const prevConsumer = setActiveConsumer(null);
+    const previousInjector = setCurrentInjector(this);
+    const previousInjectImplementation = setInjectImplementation(void 0);
+    let prevInjectContext;
+    if (ngDevMode) {
+      prevInjectContext = setInjectorProfilerContext({ injector: this, token: null });
+    }
+    try {
+      const initializers = this.get(ENVIRONMENT_INITIALIZER, EMPTY_ARRAY, { self: true });
+      if (ngDevMode && !Array.isArray(initializers)) {
+        throw new RuntimeError(-209, `Unexpected type of the \`ENVIRONMENT_INITIALIZER\` token value (expected an array, but got ${typeof initializers}). Please check that the \`ENVIRONMENT_INITIALIZER\` token is configured as a \`multi: true\` provider.`);
+      }
+      for (const initializer of initializers) {
+        initializer();
+      }
+    } finally {
+      setCurrentInjector(previousInjector);
+      setInjectImplementation(previousInjectImplementation);
+      ngDevMode && setInjectorProfilerContext(prevInjectContext);
+      setActiveConsumer(prevConsumer);
+    }
+  }
+  toString() {
+    const tokens = [];
+    const records = this.records;
+    for (const token of records.keys()) {
+      tokens.push(stringify(token));
+    }
+    return `R3Injector[${tokens.join(", ")}]`;
+  }
+  /**
+   * Process a `SingleProvider` and add it.
+   */
+  processProvider(provider) {
+    provider = resolveForwardRef(provider);
+    let token = isTypeProvider(provider) ? provider : resolveForwardRef(provider && provider.provide);
+    const record = providerToRecord(provider);
+    if (ngDevMode) {
+      runInInjectorProfilerContext(this, token, () => {
+        if (isValueProvider(provider)) {
+          emitInjectorToCreateInstanceEvent(token);
+          emitInstanceCreatedByInjectorEvent(provider.useValue);
+        }
+        emitProviderConfiguredEvent(provider);
+      });
+    }
+    if (!isTypeProvider(provider) && provider.multi === true) {
+      let multiRecord = this.records.get(token);
+      if (multiRecord) {
+        if (ngDevMode && multiRecord.multi === void 0) {
+          throwMixedMultiProviderError();
+        }
+      } else {
+        multiRecord = makeRecord(void 0, NOT_YET, true);
+        multiRecord.factory = () => injectArgs(multiRecord.multi);
+        this.records.set(token, multiRecord);
+      }
+      token = provider;
+      multiRecord.multi.push(provider);
+    } else {
+      if (ngDevMode) {
+        const existing = this.records.get(token);
+        if (existing && existing.multi !== void 0) {
+          throwMixedMultiProviderError();
+        }
+      }
+    }
+    this.records.set(token, record);
+  }
+  hydrate(token, record) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      if (record.value === CIRCULAR) {
+        throwCyclicDependencyError(stringify(token));
+      } else if (record.value === NOT_YET) {
+        record.value = CIRCULAR;
+        if (ngDevMode) {
+          runInInjectorProfilerContext(this, token, () => {
+            emitInjectorToCreateInstanceEvent(token);
+            record.value = record.factory();
+            emitInstanceCreatedByInjectorEvent(record.value);
+          });
+        } else {
+          record.value = record.factory();
+        }
+      }
+      if (typeof record.value === "object" && record.value && hasOnDestroy(record.value)) {
+        this._ngOnDestroyHooks.add(record.value);
+      }
+      return record.value;
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+  injectableDefInScope(def) {
+    if (!def.providedIn) {
+      return false;
+    }
+    const providedIn = resolveForwardRef(def.providedIn);
+    if (typeof providedIn === "string") {
+      return providedIn === "any" || this.scopes.has(providedIn);
+    } else {
+      return this.injectorDefTypes.has(providedIn);
+    }
+  }
+  removeOnDestroy(callback) {
+    const destroyCBIdx = this._onDestroyHooks.indexOf(callback);
+    if (destroyCBIdx !== -1) {
+      this._onDestroyHooks.splice(destroyCBIdx, 1);
+    }
+  }
+};
+function injectableDefOrInjectorDefFactory(token) {
+  const injectableDef = getInjectableDef(token);
+  const factory = injectableDef !== null ? injectableDef.factory : getFactoryDef(token);
+  if (factory !== null) {
+    return factory;
+  }
+  if (token instanceof InjectionToken) {
+    throw new RuntimeError(204, ngDevMode && `Token ${stringify(token)} is missing a ɵprov definition.`);
+  }
+  if (token instanceof Function) {
+    return getUndecoratedInjectableFactory(token);
+  }
+  throw new RuntimeError(204, ngDevMode && "unreachable");
+}
+function getUndecoratedInjectableFactory(token) {
+  const paramLength = token.length;
+  if (paramLength > 0) {
+    throw new RuntimeError(204, ngDevMode && `Can't resolve all parameters for ${stringify(token)}: (${newArray(paramLength, "?").join(", ")}).`);
+  }
+  const inheritedInjectableDef = getInheritedInjectableDef(token);
+  if (inheritedInjectableDef !== null) {
+    return () => inheritedInjectableDef.factory(token);
+  } else {
+    return () => new token();
+  }
+}
+function providerToRecord(provider) {
+  if (isValueProvider(provider)) {
+    return makeRecord(void 0, provider.useValue);
+  } else {
+    const factory = providerToFactory(provider);
+    return makeRecord(factory, NOT_YET);
+  }
+}
+function providerToFactory(provider, ngModuleType, providers) {
+  let factory = void 0;
+  if (ngDevMode && isEnvironmentProviders(provider)) {
+    throwInvalidProviderError(void 0, providers, provider);
+  }
+  if (isTypeProvider(provider)) {
+    const unwrappedProvider = resolveForwardRef(provider);
+    return getFactoryDef(unwrappedProvider) || injectableDefOrInjectorDefFactory(unwrappedProvider);
+  } else {
+    if (isValueProvider(provider)) {
+      factory = () => resolveForwardRef(provider.useValue);
+    } else if (isFactoryProvider(provider)) {
+      factory = () => provider.useFactory(...injectArgs(provider.deps || []));
+    } else if (isExistingProvider(provider)) {
+      factory = () => ɵɵinject(resolveForwardRef(provider.useExisting));
+    } else {
+      const classRef = resolveForwardRef(provider && (provider.useClass || provider.provide));
+      if (ngDevMode && !classRef) {
+        throwInvalidProviderError(ngModuleType, providers, provider);
+      }
+      if (hasDeps(provider)) {
+        factory = () => new classRef(...injectArgs(provider.deps));
+      } else {
+        return getFactoryDef(classRef) || injectableDefOrInjectorDefFactory(classRef);
+      }
+    }
+  }
+  return factory;
+}
+function assertNotDestroyed(injector) {
+  if (injector.destroyed) {
+    throw new RuntimeError(205, ngDevMode && "Injector has already been destroyed.");
+  }
+}
+function makeRecord(factory, value, multi = false) {
+  return {
+    factory,
+    value,
+    multi: multi ? [] : void 0
+  };
+}
+function hasDeps(value) {
+  return !!value.deps;
+}
+function hasOnDestroy(value) {
+  return value !== null && typeof value === "object" && typeof value.ngOnDestroy === "function";
+}
+function couldBeInjectableType(value) {
+  return typeof value === "function" || typeof value === "object" && value.ngMetadataName === "InjectionToken";
+}
+function forEachSingleProvider(providers, fn) {
+  for (const provider of providers) {
+    if (Array.isArray(provider)) {
+      forEachSingleProvider(provider, fn);
+    } else if (provider && isEnvironmentProviders(provider)) {
+      forEachSingleProvider(provider.ɵproviders, fn);
+    } else {
+      fn(provider);
+    }
+  }
+}
+function runInInjectionContext(injector, fn) {
+  let internalInjector;
+  if (injector instanceof R3Injector) {
+    assertNotDestroyed(injector);
+    internalInjector = injector;
+  } else {
+    internalInjector = new RetrievingInjector(injector);
+  }
+  let prevInjectorProfilerContext;
+  if (ngDevMode) {
+    prevInjectorProfilerContext = setInjectorProfilerContext({ injector, token: null });
+  }
+  const prevInjector = setCurrentInjector(internalInjector);
+  const previousInjectImplementation = setInjectImplementation(void 0);
+  try {
+    return fn();
+  } finally {
+    setCurrentInjector(prevInjector);
+    ngDevMode && setInjectorProfilerContext(prevInjectorProfilerContext);
+    setInjectImplementation(previousInjectImplementation);
+  }
+}
+function isInInjectionContext() {
+  return getInjectImplementation() !== void 0 || getCurrentInjector() != null;
+}
+function assertInInjectionContext(debugFn) {
+  if (!isInInjectionContext()) {
+    throw new RuntimeError(-203, ngDevMode && debugFn.name + "() can only be used within an injection context such as a constructor, a factory function, a field initializer, or a function used with `runInInjectionContext`");
+  }
+}
+var HOST = 0;
+var TVIEW = 1;
+var FLAGS = 2;
+var PARENT = 3;
+var NEXT = 4;
+var T_HOST = 5;
+var HYDRATION = 6;
+var CLEANUP = 7;
+var CONTEXT = 8;
+var INJECTOR = 9;
+var ENVIRONMENT = 10;
+var RENDERER = 11;
+var CHILD_HEAD = 12;
+var CHILD_TAIL = 13;
+var DECLARATION_VIEW = 14;
+var DECLARATION_COMPONENT_VIEW = 15;
+var DECLARATION_LCONTAINER = 16;
+var PREORDER_HOOK_FLAGS = 17;
+var QUERIES = 18;
+var ID = 19;
+var EMBEDDED_VIEW_INJECTOR = 20;
+var ON_DESTROY_HOOKS = 21;
+var EFFECTS_TO_SCHEDULE = 22;
+var EFFECTS = 23;
+var REACTIVE_TEMPLATE_CONSUMER = 24;
+var AFTER_RENDER_SEQUENCES_TO_ADD = 25;
+var HEADER_OFFSET = 26;
+var TYPE = 1;
+var DEHYDRATED_VIEWS = 6;
+var NATIVE = 7;
+var VIEW_REFS = 8;
+var MOVED_VIEWS = 9;
+var CONTAINER_HEADER_OFFSET = 10;
+function isLView(value) {
+  return Array.isArray(value) && typeof value[TYPE] === "object";
+}
+function isLContainer(value) {
+  return Array.isArray(value) && value[TYPE] === true;
+}
+function isContentQueryHost(tNode) {
+  return (tNode.flags & 4) !== 0;
+}
+function isComponentHost(tNode) {
+  return tNode.componentOffset > -1;
+}
+function isDirectiveHost(tNode) {
+  return (tNode.flags & 1) === 1;
+}
+function isComponentDef(def) {
+  return !!def.template;
+}
+function isRootView(target) {
+  return (target[FLAGS] & 512) !== 0;
+}
+function isProjectionTNode(tNode) {
+  return (tNode.type & 16) === 16;
+}
+function hasI18n(lView) {
+  return (lView[FLAGS] & 32) === 32;
+}
+function isDestroyed(lView) {
+  return (lView[FLAGS] & 256) === 256;
+}
+function assertTNodeForLView(tNode, lView) {
+  assertTNodeForTView(tNode, lView[TVIEW]);
+}
+function assertTNodeForTView(tNode, tView) {
+  assertTNode(tNode);
+  const tData = tView.data;
+  for (let i = HEADER_OFFSET; i < tData.length; i++) {
+    if (tData[i] === tNode) {
+      return;
+    }
+  }
+  throwError2("This TNode does not belong to this TView.");
+}
+function assertTNode(tNode) {
+  assertDefined(tNode, "TNode must be defined");
+  if (!(tNode && typeof tNode === "object" && tNode.hasOwnProperty("directiveStylingLast"))) {
+    throwError2("Not of type TNode, got: " + tNode);
+  }
+}
+function assertTIcu(tIcu) {
+  assertDefined(tIcu, "Expected TIcu to be defined");
+  if (!(typeof tIcu.currentCaseLViewIndex === "number")) {
+    throwError2("Object is not of TIcu type.");
+  }
+}
+function assertComponentType(actual, msg = "Type passed in is not ComponentType, it does not have 'ɵcmp' property.") {
+  if (!getComponentDef(actual)) {
+    throwError2(msg);
+  }
+}
+function assertNgModuleType(actual, msg = "Type passed in is not NgModuleType, it does not have 'ɵmod' property.") {
+  if (!getNgModuleDef(actual)) {
+    throwError2(msg);
+  }
+}
+function assertHasParent(tNode) {
+  assertDefined(tNode, "currentTNode should exist!");
+  assertDefined(tNode.parent, "currentTNode should have a parent");
+}
+function assertLContainer(value) {
+  assertDefined(value, "LContainer must be defined");
+  assertEqual(isLContainer(value), true, "Expecting LContainer");
+}
+function assertLViewOrUndefined(value) {
+  value && assertEqual(isLView(value), true, "Expecting LView or undefined or null");
+}
+function assertLView(value) {
+  assertDefined(value, "LView must be defined");
+  assertEqual(isLView(value), true, "Expecting LView");
+}
+function assertFirstCreatePass(tView, errMessage) {
+  assertEqual(tView.firstCreatePass, true, errMessage || "Should only be called in first create pass.");
+}
+function assertFirstUpdatePass(tView, errMessage) {
+  assertEqual(tView.firstUpdatePass, true, "Should only be called in first update pass.");
+}
+function assertDirectiveDef(obj) {
+  if (obj.type === void 0 || obj.selectors == void 0 || obj.inputs === void 0) {
+    throwError2(`Expected a DirectiveDef/ComponentDef and this object does not seem to have the expected shape.`);
+  }
+}
+function assertIndexInDeclRange(tView, index) {
+  assertBetween(HEADER_OFFSET, tView.bindingStartIndex, index);
+}
+function assertIndexInExpandoRange(lView, index) {
+  const tView = lView[1];
+  assertBetween(tView.expandoStartIndex, lView.length, index);
+}
+function assertBetween(lower, upper, index) {
+  if (!(lower <= index && index < upper)) {
+    throwError2(`Index out of range (expecting ${lower} <= ${index} < ${upper})`);
+  }
+}
+function assertProjectionSlots(lView, errMessage) {
+  assertDefined(lView[DECLARATION_COMPONENT_VIEW], "Component views should exist.");
+  assertDefined(lView[DECLARATION_COMPONENT_VIEW][T_HOST].projection, "Components with projection nodes (<ng-content>) must have projection slots defined.");
+}
+function assertParentView(lView, errMessage) {
+  assertDefined(lView, "Component views should always have a parent view (component's host view)");
+}
+function assertNodeInjector(lView, injectorIndex) {
+  assertIndexInExpandoRange(lView, injectorIndex);
+  assertIndexInExpandoRange(
+    lView,
+    injectorIndex + 8
+    /* NodeInjectorOffset.PARENT */
+  );
+  assertNumber(lView[injectorIndex + 0], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 1], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 2], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 3], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 4], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 5], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 6], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[injectorIndex + 7], "injectorIndex should point to a bloom filter");
+  assertNumber(lView[
+    injectorIndex + 8
+    /* NodeInjectorOffset.PARENT */
+  ], "injectorIndex should point to parent injector");
+}
+var SVG_NAMESPACE = "svg";
+var MATH_ML_NAMESPACE = "math";
+function unwrapRNode(value) {
+  while (Array.isArray(value)) {
+    value = value[HOST];
+  }
+  return value;
+}
+function unwrapLView(value) {
+  while (Array.isArray(value)) {
+    if (typeof value[TYPE] === "object")
+      return value;
+    value = value[HOST];
+  }
+  return null;
+}
+function getNativeByIndex(index, lView) {
+  ngDevMode && assertIndexInRange(lView, index);
+  ngDevMode && assertGreaterThanOrEqual(index, HEADER_OFFSET, "Expected to be past HEADER_OFFSET");
+  return unwrapRNode(lView[index]);
+}
+function getNativeByTNode(tNode, lView) {
+  ngDevMode && assertTNodeForLView(tNode, lView);
+  ngDevMode && assertIndexInRange(lView, tNode.index);
+  const node = unwrapRNode(lView[tNode.index]);
+  return node;
+}
+function getNativeByTNodeOrNull(tNode, lView) {
+  const index = tNode === null ? -1 : tNode.index;
+  if (index !== -1) {
+    ngDevMode && assertTNodeForLView(tNode, lView);
+    const node = unwrapRNode(lView[index]);
+    return node;
+  }
+  return null;
+}
+function getTNode(tView, index) {
+  ngDevMode && assertGreaterThan(index, -1, "wrong index for TNode");
+  ngDevMode && assertLessThan(index, tView.data.length, "wrong index for TNode");
+  const tNode = tView.data[index];
+  ngDevMode && tNode !== null && assertTNode(tNode);
+  return tNode;
+}
+function load(view, index) {
+  ngDevMode && assertIndexInRange(view, index);
+  return view[index];
+}
+function store(tView, lView, index, value) {
+  if (index >= tView.data.length) {
+    tView.data[index] = null;
+    tView.blueprint[index] = null;
+  }
+  lView[index] = value;
+}
+function getComponentLViewByIndex(nodeIndex, hostView) {
+  ngDevMode && assertIndexInRange(hostView, nodeIndex);
+  const slotValue = hostView[nodeIndex];
+  const lView = isLView(slotValue) ? slotValue : slotValue[HOST];
+  return lView;
+}
+function isCreationMode(view) {
+  return (view[FLAGS] & 4) === 4;
+}
+function viewAttachedToChangeDetector(view) {
+  return (view[FLAGS] & 128) === 128;
+}
+function viewAttachedToContainer(view) {
+  return isLContainer(view[PARENT]);
+}
+function getConstant(consts, index) {
+  if (index === null || index === void 0)
+    return null;
+  ngDevMode && assertIndexInRange(consts, index);
+  return consts[index];
+}
+function resetPreOrderHookFlags(lView) {
+  lView[PREORDER_HOOK_FLAGS] = 0;
+}
+function markViewForRefresh(lView) {
+  if (lView[FLAGS] & 1024) {
+    return;
+  }
+  lView[FLAGS] |= 1024;
+  if (viewAttachedToChangeDetector(lView)) {
+    markAncestorsForTraversal(lView);
+  }
+}
+function walkUpViews(nestingLevel, currentView) {
+  while (nestingLevel > 0) {
+    ngDevMode && assertDefined(currentView[DECLARATION_VIEW], "Declaration view should be defined if nesting level is greater than 0.");
+    currentView = currentView[DECLARATION_VIEW];
+    nestingLevel--;
+  }
+  return currentView;
+}
+function requiresRefreshOrTraversal(lView) {
+  return !!(lView[FLAGS] & (1024 | 8192) || lView[REACTIVE_TEMPLATE_CONSUMER]?.dirty);
+}
+function updateAncestorTraversalFlagsOnAttach(lView) {
+  lView[ENVIRONMENT].changeDetectionScheduler?.notify(
+    8
+    /* NotificationSource.ViewAttached */
+  );
+  if (lView[FLAGS] & 64) {
+    lView[FLAGS] |= 1024;
+  }
+  if (requiresRefreshOrTraversal(lView)) {
+    markAncestorsForTraversal(lView);
+  }
+}
+function markAncestorsForTraversal(lView) {
+  lView[ENVIRONMENT].changeDetectionScheduler?.notify(
+    0
+    /* NotificationSource.MarkAncestorsForTraversal */
+  );
+  let parent = getLViewParent(lView);
+  while (parent !== null) {
+    if (parent[FLAGS] & 8192) {
+      break;
+    }
+    parent[FLAGS] |= 8192;
+    if (!viewAttachedToChangeDetector(parent)) {
+      break;
+    }
+    parent = getLViewParent(parent);
+  }
+}
+function storeLViewOnDestroy(lView, onDestroyCallback) {
+  if (isDestroyed(lView)) {
+    throw new RuntimeError(911, ngDevMode && "View has already been destroyed.");
+  }
+  if (lView[ON_DESTROY_HOOKS] === null) {
+    lView[ON_DESTROY_HOOKS] = [];
+  }
+  lView[ON_DESTROY_HOOKS].push(onDestroyCallback);
+}
+function removeLViewOnDestroy(lView, onDestroyCallback) {
+  if (lView[ON_DESTROY_HOOKS] === null)
+    return;
+  const destroyCBIdx = lView[ON_DESTROY_HOOKS].indexOf(onDestroyCallback);
+  if (destroyCBIdx !== -1) {
+    lView[ON_DESTROY_HOOKS].splice(destroyCBIdx, 1);
+  }
+}
+function getLViewParent(lView) {
+  ngDevMode && assertLView(lView);
+  const parent = lView[PARENT];
+  return isLContainer(parent) ? parent[PARENT] : parent;
+}
+function getOrCreateLViewCleanup(view) {
+  return view[CLEANUP] ??= [];
+}
+function getOrCreateTViewCleanup(tView) {
+  return tView.cleanup ??= [];
+}
+function storeCleanupWithContext(tView, lView, context2, cleanupFn) {
+  const lCleanup = getOrCreateLViewCleanup(lView);
+  ngDevMode && assertDefined(context2, "Cleanup context is mandatory when registering framework-level destroy hooks");
+  lCleanup.push(context2);
+  if (tView.firstCreatePass) {
+    getOrCreateTViewCleanup(tView).push(cleanupFn, lCleanup.length - 1);
+  } else {
+    if (ngDevMode) {
+      Object.freeze(getOrCreateTViewCleanup(tView));
+    }
+  }
+}
+var instructionState = {
+  lFrame: createLFrame(null),
+  bindingsEnabled: true,
+  skipHydrationRootTNode: null
+};
+var CheckNoChangesMode;
+(function(CheckNoChangesMode2) {
+  CheckNoChangesMode2[CheckNoChangesMode2["Off"] = 0] = "Off";
+  CheckNoChangesMode2[CheckNoChangesMode2["Exhaustive"] = 1] = "Exhaustive";
+  CheckNoChangesMode2[CheckNoChangesMode2["OnlyDirtyViews"] = 2] = "OnlyDirtyViews";
+})(CheckNoChangesMode || (CheckNoChangesMode = {}));
+var _checkNoChangesMode = 0;
+var _isRefreshingViews = false;
+function getElementDepthCount() {
+  return instructionState.lFrame.elementDepthCount;
+}
+function increaseElementDepthCount() {
+  instructionState.lFrame.elementDepthCount++;
+}
+function decreaseElementDepthCount() {
+  instructionState.lFrame.elementDepthCount--;
+}
+function getBindingsEnabled() {
+  return instructionState.bindingsEnabled;
+}
+function isInSkipHydrationBlock() {
+  return instructionState.skipHydrationRootTNode !== null;
+}
+function isSkipHydrationRootTNode(tNode) {
+  return instructionState.skipHydrationRootTNode === tNode;
+}
+function ɵɵenableBindings() {
+  instructionState.bindingsEnabled = true;
+}
+function enterSkipHydrationBlock(tNode) {
+  instructionState.skipHydrationRootTNode = tNode;
+}
+function ɵɵdisableBindings() {
+  instructionState.bindingsEnabled = false;
+}
+function leaveSkipHydrationBlock() {
+  instructionState.skipHydrationRootTNode = null;
+}
+function getLView() {
+  return instructionState.lFrame.lView;
+}
+function getTView() {
+  return instructionState.lFrame.tView;
+}
+function ɵɵrestoreView(viewToRestore) {
+  instructionState.lFrame.contextLView = viewToRestore;
+  return viewToRestore[CONTEXT];
+}
+function ɵɵresetView(value) {
+  instructionState.lFrame.contextLView = null;
+  return value;
+}
+function getCurrentTNode() {
+  let currentTNode = getCurrentTNodePlaceholderOk();
+  while (currentTNode !== null && currentTNode.type === 64) {
+    currentTNode = currentTNode.parent;
+  }
+  return currentTNode;
+}
+function getCurrentTNodePlaceholderOk() {
+  return instructionState.lFrame.currentTNode;
+}
+function getCurrentParentTNode() {
+  const lFrame = instructionState.lFrame;
+  const currentTNode = lFrame.currentTNode;
+  return lFrame.isParent ? currentTNode : currentTNode.parent;
+}
+function setCurrentTNode(tNode, isParent) {
+  ngDevMode && tNode && assertTNodeForTView(tNode, instructionState.lFrame.tView);
+  const lFrame = instructionState.lFrame;
+  lFrame.currentTNode = tNode;
+  lFrame.isParent = isParent;
+}
+function isCurrentTNodeParent() {
+  return instructionState.lFrame.isParent;
+}
+function setCurrentTNodeAsNotParent() {
+  instructionState.lFrame.isParent = false;
+}
+function getContextLView() {
+  const contextLView = instructionState.lFrame.contextLView;
+  ngDevMode && assertDefined(contextLView, "contextLView must be defined.");
+  return contextLView;
+}
+function isInCheckNoChangesMode() {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  return _checkNoChangesMode !== CheckNoChangesMode.Off;
+}
+function isExhaustiveCheckNoChanges() {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  return _checkNoChangesMode === CheckNoChangesMode.Exhaustive;
+}
+function setIsInCheckNoChangesMode(mode) {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  _checkNoChangesMode = mode;
+}
+function isRefreshingViews() {
+  return _isRefreshingViews;
+}
+function setIsRefreshingViews(mode) {
+  const prev = _isRefreshingViews;
+  _isRefreshingViews = mode;
+  return prev;
+}
+function getBindingRoot() {
+  const lFrame = instructionState.lFrame;
+  let index = lFrame.bindingRootIndex;
+  if (index === -1) {
+    index = lFrame.bindingRootIndex = lFrame.tView.bindingStartIndex;
+  }
+  return index;
+}
+function getBindingIndex() {
+  return instructionState.lFrame.bindingIndex;
+}
+function setBindingIndex(value) {
+  return instructionState.lFrame.bindingIndex = value;
+}
+function nextBindingIndex() {
+  return instructionState.lFrame.bindingIndex++;
+}
+function incrementBindingIndex(count2) {
+  const lFrame = instructionState.lFrame;
+  const index = lFrame.bindingIndex;
+  lFrame.bindingIndex = lFrame.bindingIndex + count2;
+  return index;
+}
+function isInI18nBlock() {
+  return instructionState.lFrame.inI18n;
+}
+function setInI18nBlock(isInI18nBlock2) {
+  instructionState.lFrame.inI18n = isInI18nBlock2;
+}
+function setBindingRootForHostBindings(bindingRootIndex, currentDirectiveIndex) {
+  const lFrame = instructionState.lFrame;
+  lFrame.bindingIndex = lFrame.bindingRootIndex = bindingRootIndex;
+  setCurrentDirectiveIndex(currentDirectiveIndex);
+}
+function getCurrentDirectiveIndex() {
+  return instructionState.lFrame.currentDirectiveIndex;
+}
+function setCurrentDirectiveIndex(currentDirectiveIndex) {
+  instructionState.lFrame.currentDirectiveIndex = currentDirectiveIndex;
+}
+function getCurrentDirectiveDef(tData) {
+  const currentDirectiveIndex = instructionState.lFrame.currentDirectiveIndex;
+  return currentDirectiveIndex === -1 ? null : tData[currentDirectiveIndex];
+}
+function getCurrentQueryIndex() {
+  return instructionState.lFrame.currentQueryIndex;
+}
+function setCurrentQueryIndex(value) {
+  instructionState.lFrame.currentQueryIndex = value;
+}
+function getDeclarationTNode(lView) {
+  const tView = lView[TVIEW];
+  if (tView.type === 2) {
+    ngDevMode && assertDefined(tView.declTNode, "Embedded TNodes should have declaration parents.");
+    return tView.declTNode;
+  }
+  if (tView.type === 1) {
+    return lView[T_HOST];
+  }
+  return null;
+}
+function enterDI(lView, tNode, flags) {
+  ngDevMode && assertLViewOrUndefined(lView);
+  if (flags & 4) {
+    ngDevMode && assertTNodeForTView(tNode, lView[TVIEW]);
+    let parentTNode = tNode;
+    let parentLView = lView;
+    while (true) {
+      ngDevMode && assertDefined(parentTNode, "Parent TNode should be defined");
+      parentTNode = parentTNode.parent;
+      if (parentTNode === null && !(flags & 1)) {
+        parentTNode = getDeclarationTNode(parentLView);
+        if (parentTNode === null)
+          break;
+        ngDevMode && assertDefined(parentLView, "Parent LView should be defined");
+        parentLView = parentLView[DECLARATION_VIEW];
+        if (parentTNode.type & (2 | 8)) {
+          break;
+        }
+      } else {
+        break;
+      }
+    }
+    if (parentTNode === null) {
+      return false;
+    } else {
+      tNode = parentTNode;
+      lView = parentLView;
+    }
+  }
+  ngDevMode && assertTNodeForLView(tNode, lView);
+  const lFrame = instructionState.lFrame = allocLFrame();
+  lFrame.currentTNode = tNode;
+  lFrame.lView = lView;
+  return true;
+}
+function enterView(newView) {
+  ngDevMode && assertNotEqual(newView[0], newView[1], "????");
+  ngDevMode && assertLViewOrUndefined(newView);
+  const newLFrame = allocLFrame();
+  if (ngDevMode) {
+    assertEqual(newLFrame.isParent, true, "Expected clean LFrame");
+    assertEqual(newLFrame.lView, null, "Expected clean LFrame");
+    assertEqual(newLFrame.tView, null, "Expected clean LFrame");
+    assertEqual(newLFrame.selectedIndex, -1, "Expected clean LFrame");
+    assertEqual(newLFrame.elementDepthCount, 0, "Expected clean LFrame");
+    assertEqual(newLFrame.currentDirectiveIndex, -1, "Expected clean LFrame");
+    assertEqual(newLFrame.currentNamespace, null, "Expected clean LFrame");
+    assertEqual(newLFrame.bindingRootIndex, -1, "Expected clean LFrame");
+    assertEqual(newLFrame.currentQueryIndex, 0, "Expected clean LFrame");
+  }
+  const tView = newView[TVIEW];
+  instructionState.lFrame = newLFrame;
+  ngDevMode && tView.firstChild && assertTNodeForTView(tView.firstChild, tView);
+  newLFrame.currentTNode = tView.firstChild;
+  newLFrame.lView = newView;
+  newLFrame.tView = tView;
+  newLFrame.contextLView = newView;
+  newLFrame.bindingIndex = tView.bindingStartIndex;
+  newLFrame.inI18n = false;
+}
+function allocLFrame() {
+  const currentLFrame = instructionState.lFrame;
+  const childLFrame = currentLFrame === null ? null : currentLFrame.child;
+  const newLFrame = childLFrame === null ? createLFrame(currentLFrame) : childLFrame;
+  return newLFrame;
+}
+function createLFrame(parent) {
+  const lFrame = {
+    currentTNode: null,
+    isParent: true,
+    lView: null,
+    tView: null,
+    selectedIndex: -1,
+    contextLView: null,
+    elementDepthCount: 0,
+    currentNamespace: null,
+    currentDirectiveIndex: -1,
+    bindingRootIndex: -1,
+    bindingIndex: -1,
+    currentQueryIndex: 0,
+    parent,
+    child: null,
+    inI18n: false
+  };
+  parent !== null && (parent.child = lFrame);
+  return lFrame;
+}
+function leaveViewLight() {
+  const oldLFrame = instructionState.lFrame;
+  instructionState.lFrame = oldLFrame.parent;
+  oldLFrame.currentTNode = null;
+  oldLFrame.lView = null;
+  return oldLFrame;
+}
+var leaveDI = leaveViewLight;
+function leaveView() {
+  const oldLFrame = leaveViewLight();
+  oldLFrame.isParent = true;
+  oldLFrame.tView = null;
+  oldLFrame.selectedIndex = -1;
+  oldLFrame.contextLView = null;
+  oldLFrame.elementDepthCount = 0;
+  oldLFrame.currentDirectiveIndex = -1;
+  oldLFrame.currentNamespace = null;
+  oldLFrame.bindingRootIndex = -1;
+  oldLFrame.bindingIndex = -1;
+  oldLFrame.currentQueryIndex = 0;
+}
+function nextContextImpl(level) {
+  const contextLView = instructionState.lFrame.contextLView = walkUpViews(level, instructionState.lFrame.contextLView);
+  return contextLView[CONTEXT];
+}
+function getSelectedIndex() {
+  return instructionState.lFrame.selectedIndex;
+}
+function setSelectedIndex(index) {
+  ngDevMode && index !== -1 && assertGreaterThanOrEqual(index, HEADER_OFFSET, "Index must be past HEADER_OFFSET (or -1).");
+  ngDevMode && assertLessThan(index, instructionState.lFrame.lView.length, "Can't set index passed end of LView");
+  instructionState.lFrame.selectedIndex = index;
+}
+function getSelectedTNode() {
+  const lFrame = instructionState.lFrame;
+  return getTNode(lFrame.tView, lFrame.selectedIndex);
+}
+function ɵɵnamespaceSVG() {
+  instructionState.lFrame.currentNamespace = SVG_NAMESPACE;
+}
+function ɵɵnamespaceMathML() {
+  instructionState.lFrame.currentNamespace = MATH_ML_NAMESPACE;
+}
+function ɵɵnamespaceHTML() {
+  namespaceHTMLInternal();
+}
+function namespaceHTMLInternal() {
+  instructionState.lFrame.currentNamespace = null;
+}
+function getNamespace() {
+  return instructionState.lFrame.currentNamespace;
+}
+var _wasLastNodeCreated = true;
+function wasLastNodeCreated() {
+  return _wasLastNodeCreated;
+}
+function lastNodeWasCreated(flag) {
+  _wasLastNodeCreated = flag;
+}
+function createInjector(defType, parent = null, additionalProviders = null, name) {
+  const injector = createInjectorWithoutInjectorInstances(defType, parent, additionalProviders, name);
+  injector.resolveInjectorInitializers();
+  return injector;
+}
+function createInjectorWithoutInjectorInstances(defType, parent = null, additionalProviders = null, name, scopes = /* @__PURE__ */ new Set()) {
+  const providers = [additionalProviders || EMPTY_ARRAY, importProvidersFrom(defType)];
+  name = name || (typeof defType === "object" ? void 0 : stringify(defType));
+  return new R3Injector(providers, parent || getNullInjector(), name || null, scopes);
+}
+var Injector = class _Injector {
+  static THROW_IF_NOT_FOUND = THROW_IF_NOT_FOUND;
+  static NULL = new NullInjector();
+  static create(options, parent) {
+    if (Array.isArray(options)) {
+      return createInjector({ name: "" }, parent, options, "");
+    } else {
+      const name = options.name ?? "";
+      return createInjector({ name }, options.parent, options.providers, name);
+    }
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _Injector,
+      providedIn: "any",
+      factory: () => ɵɵinject(INJECTOR$1)
+    })
+  );
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = -1;
+};
+var DOCUMENT = new InjectionToken(ngDevMode ? "DocumentToken" : "");
+var DestroyRef = class {
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectDestroyRef;
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ENV_ID__ = (injector) => injector;
+};
+var NodeInjectorDestroyRef = class extends DestroyRef {
+  _lView;
+  constructor(_lView) {
+    super();
+    this._lView = _lView;
+  }
+  get destroyed() {
+    return isDestroyed(this._lView);
+  }
+  onDestroy(callback) {
+    const lView = this._lView;
+    storeLViewOnDestroy(lView, callback);
+    return () => removeLViewOnDestroy(lView, callback);
+  }
+};
+function injectDestroyRef() {
+  return new NodeInjectorDestroyRef(getLView());
+}
+var ErrorHandler = class {
+  /**
+   * @internal
+   */
+  _console = console;
+  handleError(error) {
+    this._console.error("ERROR", error);
+  }
+};
+var INTERNAL_APPLICATION_ERROR_HANDLER = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "internal error handler" : "", {
+  providedIn: "root",
+  factory: () => {
+    const injector = inject(EnvironmentInjector);
+    let userErrorHandler;
+    return (e) => {
+      if (injector.destroyed && !userErrorHandler) {
+        setTimeout(() => {
+          throw e;
+        });
+      } else {
+        userErrorHandler ??= injector.get(ErrorHandler);
+        userErrorHandler.handleError(e);
+      }
+    };
+  }
+});
+var errorHandlerEnvironmentInitializer = {
+  provide: ENVIRONMENT_INITIALIZER,
+  useValue: () => void inject(ErrorHandler),
+  multi: true
+};
+var globalErrorListeners = new InjectionToken(ngDevMode ? "GlobalErrorListeners" : "", {
+  providedIn: "root",
+  factory: () => {
+    if (false) {
+      return;
+    }
+    const window3 = inject(DOCUMENT).defaultView;
+    if (!window3) {
+      return;
+    }
+    const errorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+    const rejectionListener = (e) => {
+      errorHandler(e.reason);
+      e.preventDefault();
+    };
+    const errorListener = (e) => {
+      if (e.error) {
+        errorHandler(e.error);
+      } else {
+        errorHandler(new Error(ngDevMode ? `An ErrorEvent with no error occurred. See Error.cause for details: ${e.message}` : e.message, { cause: e }));
+      }
+      e.preventDefault();
+    };
+    const setupEventListeners = () => {
+      window3.addEventListener("unhandledrejection", rejectionListener);
+      window3.addEventListener("error", errorListener);
+    };
+    if (typeof Zone !== "undefined") {
+      Zone.root.run(setupEventListeners);
+    } else {
+      setupEventListeners();
+    }
+    inject(DestroyRef).onDestroy(() => {
+      window3.removeEventListener("error", errorListener);
+      window3.removeEventListener("unhandledrejection", rejectionListener);
+    });
+  }
+});
+function provideBrowserGlobalErrorListeners() {
+  return makeEnvironmentProviders([
+    provideEnvironmentInitializer(() => void inject(globalErrorListeners))
+  ]);
+}
+function isSignal(value) {
+  return typeof value === "function" && value[SIGNAL] !== void 0;
+}
+function ɵunwrapWritableSignal(value) {
+  return null;
+}
+function signal(initialValue, options) {
+  const [get2, set2, update] = createSignal(initialValue, options?.equal);
+  const signalFn = get2;
+  const node = signalFn[SIGNAL];
+  signalFn.set = set2;
+  signalFn.update = update;
+  signalFn.asReadonly = signalAsReadonlyFn.bind(signalFn);
+  if (ngDevMode) {
+    signalFn.toString = () => `[Signal: ${signalFn()}]`;
+    node.debugName = options?.debugName;
+  }
+  return signalFn;
+}
+function signalAsReadonlyFn() {
+  const node = this[SIGNAL];
+  if (node.readonlyFn === void 0) {
+    const readonlyFn = () => this();
+    readonlyFn[SIGNAL] = node;
+    node.readonlyFn = readonlyFn;
+  }
+  return node.readonlyFn;
+}
+function isWritableSignal(value) {
+  return isSignal(value) && typeof value.set === "function";
+}
+var ChangeDetectionScheduler = class {
+};
+var ZONELESS_ENABLED = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "Zoneless enabled" : "", { providedIn: "root", factory: () => false });
+var PROVIDED_ZONELESS = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "Zoneless provided" : "", { providedIn: "root", factory: () => false });
+var ZONELESS_SCHEDULER_DISABLED = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "scheduler disabled" : "");
+var SCHEDULE_IN_ROOT_ZONE = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "run changes outside zone in root" : "");
+function assertNotInReactiveContext(debugFn, extraContext) {
+  if (getActiveConsumer() !== null) {
+    throw new RuntimeError(-602, ngDevMode && `${debugFn.name}() cannot be called from within a reactive context.${extraContext ? ` ${extraContext}` : ""}`);
+  }
+}
+var ViewContext = class {
+  view;
+  node;
+  constructor(view, node) {
+    this.view = view;
+    this.node = node;
+  }
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectViewContext;
+};
+function injectViewContext() {
+  return new ViewContext(getLView(), getCurrentTNode());
+}
+var PendingTasksInternal = class _PendingTasksInternal {
+  taskId = 0;
+  pendingTasks = /* @__PURE__ */ new Set();
+  destroyed = false;
+  pendingTask = new BehaviorSubject(false);
+  get hasPendingTasks() {
+    return this.destroyed ? false : this.pendingTask.value;
+  }
+  /**
+   * In case the service is about to be destroyed, return a self-completing observable.
+   * Otherwise, return the observable that emits the current state of pending tasks.
+   */
+  get hasPendingTasksObservable() {
+    if (this.destroyed) {
+      return new Observable((subscriber) => {
+        subscriber.next(false);
+        subscriber.complete();
+      });
+    }
+    return this.pendingTask;
+  }
+  add() {
+    if (!this.hasPendingTasks && !this.destroyed) {
+      this.pendingTask.next(true);
+    }
+    const taskId = this.taskId++;
+    this.pendingTasks.add(taskId);
+    return taskId;
+  }
+  has(taskId) {
+    return this.pendingTasks.has(taskId);
+  }
+  remove(taskId) {
+    this.pendingTasks.delete(taskId);
+    if (this.pendingTasks.size === 0 && this.hasPendingTasks) {
+      this.pendingTask.next(false);
+    }
+  }
+  ngOnDestroy() {
+    this.pendingTasks.clear();
+    if (this.hasPendingTasks) {
+      this.pendingTask.next(false);
+    }
+    this.destroyed = true;
+    this.pendingTask.unsubscribe();
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _PendingTasksInternal,
+      providedIn: "root",
+      factory: () => new _PendingTasksInternal()
+    })
+  );
+};
+var PendingTasks = class _PendingTasks {
+  internalPendingTasks = inject(PendingTasksInternal);
+  scheduler = inject(ChangeDetectionScheduler);
+  errorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+  /**
+   * Adds a new task that should block application's stability.
+   * @returns A cleanup function that removes a task when called.
+   */
+  add() {
+    const taskId = this.internalPendingTasks.add();
+    return () => {
+      if (!this.internalPendingTasks.has(taskId)) {
+        return;
+      }
+      this.scheduler.notify(
+        11
+        /* NotificationSource.PendingTaskRemoved */
+      );
+      this.internalPendingTasks.remove(taskId);
+    };
+  }
+  /**
+   * Runs an asynchronous function and blocks the application's stability until the function completes.
+   *
+   * ```ts
+   * pendingTasks.run(async () => {
+   *   const userData = await fetch('/api/user');
+   *   this.userData.set(userData);
+   * });
+   * ```
+   *
+   * @param fn The asynchronous function to execute
+   * @developerPreview 19.0
+   */
+  run(fn) {
+    const removeTask = this.add();
+    fn().catch(this.errorHandler).finally(removeTask);
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _PendingTasks,
+      providedIn: "root",
+      factory: () => new _PendingTasks()
+    })
+  );
+};
+function noop2(...args) {
+}
+var EffectScheduler = class _EffectScheduler {
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _EffectScheduler,
+      providedIn: "root",
+      factory: () => new ZoneAwareEffectScheduler()
+    })
+  );
+};
+var ZoneAwareEffectScheduler = class {
+  dirtyEffectCount = 0;
+  queues = /* @__PURE__ */ new Map();
+  add(handle) {
+    this.enqueue(handle);
+    this.schedule(handle);
+  }
+  schedule(handle) {
+    if (!handle.dirty) {
+      return;
+    }
+    this.dirtyEffectCount++;
+  }
+  remove(handle) {
+    const zone = handle.zone;
+    const queue2 = this.queues.get(zone);
+    if (!queue2.has(handle)) {
+      return;
+    }
+    queue2.delete(handle);
+    if (handle.dirty) {
+      this.dirtyEffectCount--;
+    }
+  }
+  enqueue(handle) {
+    const zone = handle.zone;
+    if (!this.queues.has(zone)) {
+      this.queues.set(zone, /* @__PURE__ */ new Set());
+    }
+    const queue2 = this.queues.get(zone);
+    if (queue2.has(handle)) {
+      return;
+    }
+    queue2.add(handle);
+  }
+  /**
+   * Run all scheduled effects.
+   *
+   * Execution order of effects within the same zone is guaranteed to be FIFO, but there is no
+   * ordering guarantee between effects scheduled in different zones.
+   */
+  flush() {
+    while (this.dirtyEffectCount > 0) {
+      let ranOneEffect = false;
+      for (const [zone, queue2] of this.queues) {
+        if (zone === null) {
+          ranOneEffect ||= this.flushQueue(queue2);
+        } else {
+          ranOneEffect ||= zone.run(() => this.flushQueue(queue2));
+        }
+      }
+      if (!ranOneEffect) {
+        this.dirtyEffectCount = 0;
+      }
+    }
+  }
+  flushQueue(queue2) {
+    let ranOneEffect = false;
+    for (const handle of queue2) {
+      if (!handle.dirty) {
+        continue;
+      }
+      this.dirtyEffectCount--;
+      ranOneEffect = true;
+      handle.run();
+    }
+    return ranOneEffect;
+  }
+};
+
+// node_modules/@angular/core/fesm2022/attribute.mjs
+var Attribute = {
+  /**
+   * The jsaction attribute defines a mapping of a DOM event to a
+   * generic event (aka jsaction), to which the actual event handlers
+   * that implement the behavior of the application are bound. The
+   * value is a semicolon separated list of colon separated pairs of
+   * an optional DOM event name and a jsaction name. If the optional
+   * DOM event name is omitted, 'click' is assumed. The jsaction names
+   * are dot separated pairs of a namespace and a simple jsaction
+   * name.
+   *
+   * See grammar in README.md for expected syntax in the attribute value.
+   */
+  JSACTION: "jsaction"
+};
+
+// node_modules/@angular/core/fesm2022/debug_node.mjs
+function noSideEffects(fn) {
+  return { toString: fn }.toString();
+}
+var ANNOTATIONS = "__annotations__";
+var PARAMETERS = "__parameters__";
+var PROP_METADATA = "__prop__metadata__";
+function makeDecorator(name, props, parentClass, additionalProcessing, typeFn) {
+  return noSideEffects(() => {
+    const metaCtor = makeMetadataCtor(props);
+    function DecoratorFactory(...args) {
+      if (this instanceof DecoratorFactory) {
+        metaCtor.call(this, ...args);
+        return this;
+      }
+      const annotationInstance = new DecoratorFactory(...args);
+      return function TypeDecorator(cls) {
+        if (typeFn)
+          typeFn(cls, ...args);
+        const annotations = cls.hasOwnProperty(ANNOTATIONS) ? cls[ANNOTATIONS] : Object.defineProperty(cls, ANNOTATIONS, { value: [] })[ANNOTATIONS];
+        annotations.push(annotationInstance);
+        return cls;
+      };
+    }
+    if (parentClass) {
+      DecoratorFactory.prototype = Object.create(parentClass.prototype);
+    }
+    DecoratorFactory.prototype.ngMetadataName = name;
+    DecoratorFactory.annotationCls = DecoratorFactory;
+    return DecoratorFactory;
+  });
+}
+function makeMetadataCtor(props) {
+  return function ctor(...args) {
+    if (props) {
+      const values = props(...args);
+      for (const propName in values) {
+        this[propName] = values[propName];
+      }
+    }
+  };
+}
+function makeParamDecorator(name, props, parentClass) {
+  return noSideEffects(() => {
+    const metaCtor = makeMetadataCtor(props);
+    function ParamDecoratorFactory(...args) {
+      if (this instanceof ParamDecoratorFactory) {
+        metaCtor.apply(this, args);
+        return this;
+      }
+      const annotationInstance = new ParamDecoratorFactory(...args);
+      ParamDecorator.annotation = annotationInstance;
+      return ParamDecorator;
+      function ParamDecorator(cls, unusedKey, index) {
+        const parameters = cls.hasOwnProperty(PARAMETERS) ? cls[PARAMETERS] : Object.defineProperty(cls, PARAMETERS, { value: [] })[PARAMETERS];
+        while (parameters.length <= index) {
+          parameters.push(null);
+        }
+        (parameters[index] = parameters[index] || []).push(annotationInstance);
+        return cls;
+      }
+    }
+    ParamDecoratorFactory.prototype.ngMetadataName = name;
+    ParamDecoratorFactory.annotationCls = ParamDecoratorFactory;
+    return ParamDecoratorFactory;
+  });
+}
+function makePropDecorator(name, props, parentClass, additionalProcessing) {
+  return noSideEffects(() => {
+    const metaCtor = makeMetadataCtor(props);
+    function PropDecoratorFactory(...args) {
+      if (this instanceof PropDecoratorFactory) {
+        metaCtor.apply(this, args);
+        return this;
+      }
+      const decoratorInstance = new PropDecoratorFactory(...args);
+      function PropDecorator(target, name2) {
+        if (target === void 0) {
+          throw new Error("Standard Angular field decorators are not supported in JIT mode.");
+        }
+        const constructor = target.constructor;
+        const meta = constructor.hasOwnProperty(PROP_METADATA) ? constructor[PROP_METADATA] : Object.defineProperty(constructor, PROP_METADATA, { value: {} })[PROP_METADATA];
+        meta[name2] = meta.hasOwnProperty(name2) && meta[name2] || [];
+        meta[name2].unshift(decoratorInstance);
+      }
+      return PropDecorator;
+    }
+    if (parentClass) {
+      PropDecoratorFactory.prototype = Object.create(parentClass.prototype);
+    }
+    PropDecoratorFactory.prototype.ngMetadataName = name;
+    PropDecoratorFactory.annotationCls = PropDecoratorFactory;
+    return PropDecoratorFactory;
+  });
+}
+var Inject = attachInjectFlag(
+  // Disable tslint because `DecoratorFlags` is a const enum which gets inlined.
+  makeParamDecorator("Inject", (token) => ({ token })),
+  -1
+  /* DecoratorFlags.Inject */
+);
+var Optional = (
+  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+  // tslint:disable-next-line: no-toplevel-property-access
+  attachInjectFlag(
+    makeParamDecorator("Optional"),
+    8
+    /* InternalInjectFlags.Optional */
+  )
+);
+var Self = (
+  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+  // tslint:disable-next-line: no-toplevel-property-access
+  attachInjectFlag(
+    makeParamDecorator("Self"),
+    2
+    /* InternalInjectFlags.Self */
+  )
+);
+var SkipSelf = (
+  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+  // tslint:disable-next-line: no-toplevel-property-access
+  attachInjectFlag(
+    makeParamDecorator("SkipSelf"),
+    4
+    /* InternalInjectFlags.SkipSelf */
+  )
+);
+var Host = (
+  // Disable tslint because `InternalInjectFlags` is a const enum which gets inlined.
+  // tslint:disable-next-line: no-toplevel-property-access
+  attachInjectFlag(
+    makeParamDecorator("Host"),
+    1
+    /* InternalInjectFlags.Host */
+  )
+);
+function getCompilerFacade(request) {
+  const globalNg = _global["ng"];
+  if (globalNg && globalNg.ɵcompilerFacade) {
+    return globalNg.ɵcompilerFacade;
+  }
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    console.error(`JIT compilation failed for ${request.kind}`, request.type);
+    let message = `The ${request.kind} '${request.type.name}' needs to be compiled using the JIT compiler, but '@angular/compiler' is not available.
+
+`;
+    if (request.usage === 1) {
+      message += `The ${request.kind} is part of a library that has been partially compiled.
+`;
+      message += `However, the Angular Linker has not processed the library such that JIT compilation is used as fallback.
+`;
+      message += "\n";
+      message += `Ideally, the library is processed using the Angular Linker to become fully AOT compiled.
+`;
+    } else {
+      message += `JIT compilation is discouraged for production use-cases! Consider using AOT mode instead.
+`;
+    }
+    message += `Alternatively, the JIT compiler should be loaded by bootstrapping using '@angular/platform-browser-dynamic' or '@angular/platform-server',
+`;
+    message += `or manually provide the compiler with 'import "@angular/compiler";' before bootstrapping.`;
+    throw new Error(message);
+  } else {
+    throw new Error("JIT compiler unavailable");
+  }
+}
+var angularCoreDiEnv = {
+  "ɵɵdefineInjectable": ɵɵdefineInjectable,
+  "ɵɵdefineInjector": ɵɵdefineInjector,
+  "ɵɵinject": ɵɵinject,
+  "ɵɵinvalidFactoryDep": ɵɵinvalidFactoryDep,
+  "resolveForwardRef": resolveForwardRef
+};
+var Type = Function;
+function isType(v) {
+  return typeof v === "function";
+}
+var ES5_DELEGATE_CTOR = /^function\s+\S+\(\)\s*{[\s\S]+\.apply\(this,\s*(arguments|(?:[^()]+\(\[\],)?[^()]+\(arguments\).*)\)/;
+var ES2015_INHERITED_CLASS = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{/;
+var ES2015_INHERITED_CLASS_WITH_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(/;
+var ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR = /^class\s+[A-Za-z\d$_]*\s*extends\s+[^{]+{[\s\S]*constructor\s*\(\)\s*{[^}]*super\(\.\.\.arguments\)/;
+function isDelegateCtor(typeStr) {
+  return ES5_DELEGATE_CTOR.test(typeStr) || ES2015_INHERITED_CLASS_WITH_DELEGATE_CTOR.test(typeStr) || ES2015_INHERITED_CLASS.test(typeStr) && !ES2015_INHERITED_CLASS_WITH_CTOR.test(typeStr);
+}
+var ReflectionCapabilities = class {
+  _reflect;
+  constructor(reflect) {
+    this._reflect = reflect || _global["Reflect"];
+  }
+  factory(t) {
+    return (...args) => new t(...args);
+  }
+  /** @internal */
+  _zipTypesAndAnnotations(paramTypes, paramAnnotations) {
+    let result;
+    if (typeof paramTypes === "undefined") {
+      result = newArray(paramAnnotations.length);
+    } else {
+      result = newArray(paramTypes.length);
+    }
+    for (let i = 0; i < result.length; i++) {
+      if (typeof paramTypes === "undefined") {
+        result[i] = [];
+      } else if (paramTypes[i] && paramTypes[i] != Object) {
+        result[i] = [paramTypes[i]];
+      } else {
+        result[i] = [];
+      }
+      if (paramAnnotations && paramAnnotations[i] != null) {
+        result[i] = result[i].concat(paramAnnotations[i]);
+      }
+    }
+    return result;
+  }
+  _ownParameters(type, parentCtor) {
+    const typeStr = type.toString();
+    if (isDelegateCtor(typeStr)) {
+      return null;
+    }
+    if (type.parameters && type.parameters !== parentCtor.parameters) {
+      return type.parameters;
+    }
+    const tsickleCtorParams = type.ctorParameters;
+    if (tsickleCtorParams && tsickleCtorParams !== parentCtor.ctorParameters) {
+      const ctorParameters = typeof tsickleCtorParams === "function" ? tsickleCtorParams() : tsickleCtorParams;
+      const paramTypes2 = ctorParameters.map((ctorParam) => ctorParam && ctorParam.type);
+      const paramAnnotations2 = ctorParameters.map((ctorParam) => ctorParam && convertTsickleDecoratorIntoMetadata(ctorParam.decorators));
+      return this._zipTypesAndAnnotations(paramTypes2, paramAnnotations2);
+    }
+    const paramAnnotations = type.hasOwnProperty(PARAMETERS) && type[PARAMETERS];
+    const paramTypes = this._reflect && this._reflect.getOwnMetadata && this._reflect.getOwnMetadata("design:paramtypes", type);
+    if (paramTypes || paramAnnotations) {
+      return this._zipTypesAndAnnotations(paramTypes, paramAnnotations);
+    }
+    return newArray(type.length);
+  }
+  parameters(type) {
+    if (!isType(type)) {
+      return [];
+    }
+    const parentCtor = getParentCtor(type);
+    let parameters = this._ownParameters(type, parentCtor);
+    if (!parameters && parentCtor !== Object) {
+      parameters = this.parameters(parentCtor);
+    }
+    return parameters || [];
+  }
+  _ownAnnotations(typeOrFunc, parentCtor) {
+    if (typeOrFunc.annotations && typeOrFunc.annotations !== parentCtor.annotations) {
+      let annotations = typeOrFunc.annotations;
+      if (typeof annotations === "function" && annotations.annotations) {
+        annotations = annotations.annotations;
+      }
+      return annotations;
+    }
+    if (typeOrFunc.decorators && typeOrFunc.decorators !== parentCtor.decorators) {
+      return convertTsickleDecoratorIntoMetadata(typeOrFunc.decorators);
+    }
+    if (typeOrFunc.hasOwnProperty(ANNOTATIONS)) {
+      return typeOrFunc[ANNOTATIONS];
+    }
+    return null;
+  }
+  annotations(typeOrFunc) {
+    if (!isType(typeOrFunc)) {
+      return [];
+    }
+    const parentCtor = getParentCtor(typeOrFunc);
+    const ownAnnotations = this._ownAnnotations(typeOrFunc, parentCtor) || [];
+    const parentAnnotations = parentCtor !== Object ? this.annotations(parentCtor) : [];
+    return parentAnnotations.concat(ownAnnotations);
+  }
+  _ownPropMetadata(typeOrFunc, parentCtor) {
+    if (typeOrFunc.propMetadata && typeOrFunc.propMetadata !== parentCtor.propMetadata) {
+      let propMetadata = typeOrFunc.propMetadata;
+      if (typeof propMetadata === "function" && propMetadata.propMetadata) {
+        propMetadata = propMetadata.propMetadata;
+      }
+      return propMetadata;
+    }
+    if (typeOrFunc.propDecorators && typeOrFunc.propDecorators !== parentCtor.propDecorators) {
+      const propDecorators = typeOrFunc.propDecorators;
+      const propMetadata = {};
+      Object.keys(propDecorators).forEach((prop) => {
+        propMetadata[prop] = convertTsickleDecoratorIntoMetadata(propDecorators[prop]);
+      });
+      return propMetadata;
+    }
+    if (typeOrFunc.hasOwnProperty(PROP_METADATA)) {
+      return typeOrFunc[PROP_METADATA];
+    }
+    return null;
+  }
+  propMetadata(typeOrFunc) {
+    if (!isType(typeOrFunc)) {
+      return {};
+    }
+    const parentCtor = getParentCtor(typeOrFunc);
+    const propMetadata = {};
+    if (parentCtor !== Object) {
+      const parentPropMetadata = this.propMetadata(parentCtor);
+      Object.keys(parentPropMetadata).forEach((propName) => {
+        propMetadata[propName] = parentPropMetadata[propName];
+      });
+    }
+    const ownPropMetadata = this._ownPropMetadata(typeOrFunc, parentCtor);
+    if (ownPropMetadata) {
+      Object.keys(ownPropMetadata).forEach((propName) => {
+        const decorators = [];
+        if (propMetadata.hasOwnProperty(propName)) {
+          decorators.push(...propMetadata[propName]);
+        }
+        decorators.push(...ownPropMetadata[propName]);
+        propMetadata[propName] = decorators;
+      });
+    }
+    return propMetadata;
+  }
+  ownPropMetadata(typeOrFunc) {
+    if (!isType(typeOrFunc)) {
+      return {};
+    }
+    return this._ownPropMetadata(typeOrFunc, getParentCtor(typeOrFunc)) || {};
+  }
+  hasLifecycleHook(type, lcProperty) {
+    return type instanceof Type && lcProperty in type.prototype;
+  }
+};
+function convertTsickleDecoratorIntoMetadata(decoratorInvocations) {
+  if (!decoratorInvocations) {
+    return [];
+  }
+  return decoratorInvocations.map((decoratorInvocation) => {
+    const decoratorType = decoratorInvocation.type;
+    const annotationCls = decoratorType.annotationCls;
+    const annotationArgs = decoratorInvocation.args ? decoratorInvocation.args : [];
+    return new annotationCls(...annotationArgs);
+  });
+}
+function getParentCtor(ctor) {
+  const parentProto = ctor.prototype ? Object.getPrototypeOf(ctor.prototype) : null;
+  const parentCtor = parentProto ? parentProto.constructor : null;
+  return parentCtor || Object;
+}
+var SimpleChange = class {
+  previousValue;
+  currentValue;
+  firstChange;
+  constructor(previousValue, currentValue, firstChange) {
+    this.previousValue = previousValue;
+    this.currentValue = currentValue;
+    this.firstChange = firstChange;
+  }
+  /**
+   * Check whether the new value is the first value assigned.
+   */
+  isFirstChange() {
+    return this.firstChange;
+  }
+};
+function applyValueToInputField(instance, inputSignalNode, privateName, value) {
+  if (inputSignalNode !== null) {
+    inputSignalNode.applyValueToInputSignal(inputSignalNode, value);
+  } else {
+    instance[privateName] = value;
+  }
+}
+var ɵɵNgOnChangesFeature = (() => {
+  const ɵɵNgOnChangesFeatureImpl = () => NgOnChangesFeatureImpl;
+  ɵɵNgOnChangesFeatureImpl.ngInherit = true;
+  return ɵɵNgOnChangesFeatureImpl;
+})();
+function NgOnChangesFeatureImpl(definition) {
+  if (definition.type.prototype.ngOnChanges) {
+    definition.setInput = ngOnChangesSetInput;
+  }
+  return rememberChangeHistoryAndInvokeOnChangesHook;
+}
+function rememberChangeHistoryAndInvokeOnChangesHook() {
+  const simpleChangesStore = getSimpleChangesStore(this);
+  const current = simpleChangesStore?.current;
+  if (current) {
+    const previous = simpleChangesStore.previous;
+    if (previous === EMPTY_OBJ) {
+      simpleChangesStore.previous = current;
+    } else {
+      for (let key in current) {
+        previous[key] = current[key];
+      }
+    }
+    simpleChangesStore.current = null;
+    this.ngOnChanges(current);
+  }
+}
+function ngOnChangesSetInput(instance, inputSignalNode, value, publicName, privateName) {
+  const declaredName = this.declaredInputs[publicName];
+  ngDevMode && assertString(declaredName, "Name of input in ngOnChanges has to be a string");
+  const simpleChangesStore = getSimpleChangesStore(instance) || setSimpleChangesStore(instance, { previous: EMPTY_OBJ, current: null });
+  const current = simpleChangesStore.current || (simpleChangesStore.current = {});
+  const previous = simpleChangesStore.previous;
+  const previousChange = previous[declaredName];
+  current[declaredName] = new SimpleChange(previousChange && previousChange.currentValue, value, previous === EMPTY_OBJ);
+  applyValueToInputField(instance, inputSignalNode, privateName, value);
+}
+var SIMPLE_CHANGES_STORE = "__ngSimpleChanges__";
+function getSimpleChangesStore(instance) {
+  return instance[SIMPLE_CHANGES_STORE] || null;
+}
+function setSimpleChangesStore(instance, store2) {
+  return instance[SIMPLE_CHANGES_STORE] = store2;
+}
+var profilerCallbacks = [];
+var NOOP_PROFILER_REMOVAL2 = () => {
+};
+function removeProfiler2(profiler2) {
+  const profilerIdx = profilerCallbacks.indexOf(profiler2);
+  if (profilerIdx !== -1) {
+    profilerCallbacks.splice(profilerIdx, 1);
+  }
+}
+function setProfiler(profiler2) {
+  if (profiler2 !== null) {
+    if (!profilerCallbacks.includes(profiler2)) {
+      profilerCallbacks.push(profiler2);
+    }
+    return () => removeProfiler2(profiler2);
+  } else {
+    profilerCallbacks.length = 0;
+    return NOOP_PROFILER_REMOVAL2;
+  }
+}
+var profiler = function(event, instance = null, eventFn) {
+  for (let i = 0; i < profilerCallbacks.length; i++) {
+    const profilerCallback = profilerCallbacks[i];
+    profilerCallback(event, instance, eventFn);
+  }
+};
+function registerPreOrderHooks(directiveIndex, directiveDef, tView) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const { ngOnChanges, ngOnInit, ngDoCheck } = directiveDef.type.prototype;
+  if (ngOnChanges) {
+    const wrappedOnChanges = NgOnChangesFeatureImpl(directiveDef);
+    (tView.preOrderHooks ??= []).push(directiveIndex, wrappedOnChanges);
+    (tView.preOrderCheckHooks ??= []).push(directiveIndex, wrappedOnChanges);
+  }
+  if (ngOnInit) {
+    (tView.preOrderHooks ??= []).push(0 - directiveIndex, ngOnInit);
+  }
+  if (ngDoCheck) {
+    (tView.preOrderHooks ??= []).push(directiveIndex, ngDoCheck);
+    (tView.preOrderCheckHooks ??= []).push(directiveIndex, ngDoCheck);
+  }
+}
+function registerPostOrderHooks(tView, tNode) {
+  ngDevMode && assertFirstCreatePass(tView);
+  for (let i = tNode.directiveStart, end = tNode.directiveEnd; i < end; i++) {
+    const directiveDef = tView.data[i];
+    ngDevMode && assertDefined(directiveDef, "Expecting DirectiveDef");
+    const lifecycleHooks = directiveDef.type.prototype;
+    const { ngAfterContentInit, ngAfterContentChecked, ngAfterViewInit, ngAfterViewChecked, ngOnDestroy } = lifecycleHooks;
+    if (ngAfterContentInit) {
+      (tView.contentHooks ??= []).push(-i, ngAfterContentInit);
+    }
+    if (ngAfterContentChecked) {
+      (tView.contentHooks ??= []).push(i, ngAfterContentChecked);
+      (tView.contentCheckHooks ??= []).push(i, ngAfterContentChecked);
+    }
+    if (ngAfterViewInit) {
+      (tView.viewHooks ??= []).push(-i, ngAfterViewInit);
+    }
+    if (ngAfterViewChecked) {
+      (tView.viewHooks ??= []).push(i, ngAfterViewChecked);
+      (tView.viewCheckHooks ??= []).push(i, ngAfterViewChecked);
+    }
+    if (ngOnDestroy != null) {
+      (tView.destroyHooks ??= []).push(i, ngOnDestroy);
+    }
+  }
+}
+function executeCheckHooks(lView, hooks, nodeIndex) {
+  callHooks(lView, hooks, 3, nodeIndex);
+}
+function executeInitAndCheckHooks(lView, hooks, initPhase, nodeIndex) {
+  ngDevMode && assertNotEqual(initPhase, 3, "Init pre-order hooks should not be called more than once");
+  if ((lView[FLAGS] & 3) === initPhase) {
+    callHooks(lView, hooks, initPhase, nodeIndex);
+  }
+}
+function incrementInitPhaseFlags(lView, initPhase) {
+  ngDevMode && assertNotEqual(initPhase, 3, "Init hooks phase should not be incremented after all init hooks have been run.");
+  let flags = lView[FLAGS];
+  if ((flags & 3) === initPhase) {
+    flags &= 16383;
+    flags += 1;
+    lView[FLAGS] = flags;
+  }
+}
+function callHooks(currentView, arr, initPhase, currentNodeIndex) {
+  ngDevMode && assertEqual(isInCheckNoChangesMode(), false, "Hooks should never be run when in check no changes mode.");
+  const startIndex = currentNodeIndex !== void 0 ? currentView[PREORDER_HOOK_FLAGS] & 65535 : 0;
+  const nodeIndexLimit = currentNodeIndex != null ? currentNodeIndex : -1;
+  const max2 = arr.length - 1;
+  let lastNodeIndexFound = 0;
+  for (let i = startIndex; i < max2; i++) {
+    const hook = arr[i + 1];
+    if (typeof hook === "number") {
+      lastNodeIndexFound = arr[i];
+      if (currentNodeIndex != null && lastNodeIndexFound >= currentNodeIndex) {
+        break;
+      }
+    } else {
+      const isInitHook = arr[i] < 0;
+      if (isInitHook) {
+        currentView[PREORDER_HOOK_FLAGS] += 65536;
+      }
+      if (lastNodeIndexFound < nodeIndexLimit || nodeIndexLimit == -1) {
+        callHook(currentView, initPhase, arr, i);
+        currentView[PREORDER_HOOK_FLAGS] = (currentView[PREORDER_HOOK_FLAGS] & 4294901760) + i + 2;
+      }
+      i++;
+    }
+  }
+}
+function callHookInternal(directive, hook) {
+  profiler(4, directive, hook);
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    hook.call(directive);
+  } finally {
+    setActiveConsumer(prevConsumer);
+    profiler(5, directive, hook);
+  }
+}
+function callHook(currentView, initPhase, arr, i) {
+  const isInitHook = arr[i] < 0;
+  const hook = arr[i + 1];
+  const directiveIndex = isInitHook ? -arr[i] : arr[i];
+  const directive = currentView[directiveIndex];
+  if (isInitHook) {
+    const indexWithintInitPhase = currentView[FLAGS] >> 14;
+    if (indexWithintInitPhase < currentView[PREORDER_HOOK_FLAGS] >> 16 && (currentView[FLAGS] & 3) === initPhase) {
+      currentView[FLAGS] += 16384;
+      callHookInternal(directive, hook);
+    }
+  } else {
+    callHookInternal(directive, hook);
+  }
+}
+var NO_PARENT_INJECTOR = -1;
+var NodeInjectorFactory = class {
+  factory;
+  /**
+   * The inject implementation to be activated when using the factory.
+   */
+  injectImpl;
+  /**
+   * Marker set to true during factory invocation to see if we get into recursive loop.
+   * Recursive loop causes an error to be displayed.
+   */
+  resolving = false;
+  /**
+   * Marks that the token can see other Tokens declared in `viewProviders` on the same node.
+   */
+  canSeeViewProviders;
+  /**
+   * An array of factories to use in case of `multi` provider.
+   */
+  multi;
+  /**
+   * Number of `multi`-providers which belong to the component.
+   *
+   * This is needed because when multiple components and directives declare the `multi` provider
+   * they have to be concatenated in the correct order.
+   *
+   * Example:
+   *
+   * If we have a component and directive active an a single element as declared here
+   * ```ts
+   * component:
+   *   providers: [ {provide: String, useValue: 'component', multi: true} ],
+   *   viewProviders: [ {provide: String, useValue: 'componentView', multi: true} ],
+   *
+   * directive:
+   *   providers: [ {provide: String, useValue: 'directive', multi: true} ],
+   * ```
+   *
+   * Then the expected results are:
+   *
+   * ```ts
+   * providers: ['component', 'directive']
+   * viewProviders: ['component', 'componentView', 'directive']
+   * ```
+   *
+   * The way to think about it is that the `viewProviders` have been inserted after the component
+   * but before the directives, which is why we need to know how many `multi`s have been declared by
+   * the component.
+   */
+  componentProviders;
+  /**
+   * Current index of the Factory in the `data`. Needed for `viewProviders` and `providers` merging.
+   * See `providerFactory`.
+   */
+  index;
+  /**
+   * Because the same `multi` provider can be declared in `providers` and `viewProviders` it is
+   * possible for `viewProviders` to shadow the `providers`. For this reason we store the
+   * `provideFactory` of the `providers` so that `providers` can be extended with `viewProviders`.
+   *
+   * Example:
+   *
+   * Given:
+   * ```ts
+   * providers: [ {provide: String, useValue: 'all', multi: true} ],
+   * viewProviders: [ {provide: String, useValue: 'viewOnly', multi: true} ],
+   * ```
+   *
+   * We have to return `['all']` in case of content injection, but `['all', 'viewOnly']` in case
+   * of view injection. We further have to make sure that the shared instances (in our case
+   * `all`) are the exact same instance in both the content as well as the view injection. (We
+   * have to make sure that we don't double instantiate.) For this reason the `viewProviders`
+   * `Factory` has a pointer to the shadowed `providers` factory so that it can instantiate the
+   * `providers` (`['all']`) and then extend it with `viewProviders` (`['all'] + ['viewOnly'] =
+   * ['all', 'viewOnly']`).
+   */
+  providerFactory;
+  constructor(factory, isViewProvider, injectImplementation) {
+    this.factory = factory;
+    ngDevMode && assertDefined(factory, "Factory not specified");
+    ngDevMode && assertEqual(typeof factory, "function", "Expected factory function.");
+    this.canSeeViewProviders = isViewProvider;
+    this.injectImpl = injectImplementation;
+  }
+};
+function toTNodeTypeAsString(tNodeType) {
+  let text = "";
+  tNodeType & 1 && (text += "|Text");
+  tNodeType & 2 && (text += "|Element");
+  tNodeType & 4 && (text += "|Container");
+  tNodeType & 8 && (text += "|ElementContainer");
+  tNodeType & 16 && (text += "|Projection");
+  tNodeType & 32 && (text += "|IcuContainer");
+  tNodeType & 64 && (text += "|Placeholder");
+  tNodeType & 128 && (text += "|LetDeclaration");
+  return text.length > 0 ? text.substring(1) : text;
+}
+function isTNodeShape(value) {
+  return value != null && typeof value === "object" && (value.insertBeforeIndex === null || typeof value.insertBeforeIndex === "number" || Array.isArray(value.insertBeforeIndex));
+}
+function isLetDeclaration(tNode) {
+  return !!(tNode.type & 128);
+}
+function hasClassInput(tNode) {
+  return (tNode.flags & 8) !== 0;
+}
+function hasStyleInput(tNode) {
+  return (tNode.flags & 16) !== 0;
+}
+function assertTNodeType(tNode, expectedTypes, message) {
+  assertDefined(tNode, "should be called with a TNode");
+  if ((tNode.type & expectedTypes) === 0) {
+    throwError2(message || `Expected [${toTNodeTypeAsString(expectedTypes)}] but got ${toTNodeTypeAsString(tNode.type)}.`);
+  }
+}
+function assertPureTNodeType(type) {
+  if (!(type === 2 || type === 1 || type === 4 || type === 8 || type === 32 || type === 16 || type === 64 || type === 128)) {
+    throwError2(`Expected TNodeType to have only a single type selected, but got ${toTNodeTypeAsString(type)}.`);
+  }
+}
+function setUpAttributes(renderer, native, attrs) {
+  let i = 0;
+  while (i < attrs.length) {
+    const value = attrs[i];
+    if (typeof value === "number") {
+      if (value !== 0) {
+        break;
+      }
+      i++;
+      const namespaceURI = attrs[i++];
+      const attrName = attrs[i++];
+      const attrVal = attrs[i++];
+      renderer.setAttribute(native, attrName, attrVal, namespaceURI);
+    } else {
+      const attrName = value;
+      const attrVal = attrs[++i];
+      if (isAnimationProp(attrName)) {
+        renderer.setProperty(native, attrName, attrVal);
+      } else {
+        renderer.setAttribute(native, attrName, attrVal);
+      }
+      i++;
+    }
+  }
+  return i;
+}
+function isNameOnlyAttributeMarker(marker) {
+  return marker === 3 || marker === 4 || marker === 6;
+}
+function isAnimationProp(name) {
+  return name.charCodeAt(0) === 64;
+}
+function mergeHostAttrs(dst, src) {
+  if (src === null || src.length === 0) ;
+  else if (dst === null || dst.length === 0) {
+    dst = src.slice();
+  } else {
+    let srcMarker = -1;
+    for (let i = 0; i < src.length; i++) {
+      const item = src[i];
+      if (typeof item === "number") {
+        srcMarker = item;
+      } else {
+        if (srcMarker === 0) ;
+        else if (srcMarker === -1 || srcMarker === 2) {
+          mergeHostAttribute(dst, srcMarker, item, null, src[++i]);
+        } else {
+          mergeHostAttribute(dst, srcMarker, item, null, null);
+        }
+      }
+    }
+  }
+  return dst;
+}
+function mergeHostAttribute(dst, marker, key1, key2, value) {
+  let i = 0;
+  let markerInsertPosition = dst.length;
+  if (marker === -1) {
+    markerInsertPosition = -1;
+  } else {
+    while (i < dst.length) {
+      const dstValue = dst[i++];
+      if (typeof dstValue === "number") {
+        if (dstValue === marker) {
+          markerInsertPosition = -1;
+          break;
+        } else if (dstValue > marker) {
+          markerInsertPosition = i - 1;
+          break;
+        }
+      }
+    }
+  }
+  while (i < dst.length) {
+    const item = dst[i];
+    if (typeof item === "number") {
+      break;
+    } else if (item === key1) {
+      {
+        if (value !== null) {
+          dst[i + 1] = value;
+        }
+        return;
+      }
+    }
+    i++;
+    if (value !== null)
+      i++;
+  }
+  if (markerInsertPosition !== -1) {
+    dst.splice(markerInsertPosition, 0, marker);
+    i = markerInsertPosition + 1;
+  }
+  dst.splice(i++, 0, key1);
+  if (value !== null) {
+    dst.splice(i++, 0, value);
+  }
+}
+function hasParentInjector(parentLocation) {
+  return parentLocation !== NO_PARENT_INJECTOR;
+}
+function getParentInjectorIndex(parentLocation) {
+  if (ngDevMode) {
+    assertNumber(parentLocation, "Number expected");
+    assertNotEqual(parentLocation, -1, "Not a valid state.");
+    const parentInjectorIndex = parentLocation & 32767;
+    assertGreaterThan(parentInjectorIndex, HEADER_OFFSET, "Parent injector must be pointing past HEADER_OFFSET.");
+  }
+  return parentLocation & 32767;
+}
+function getParentInjectorViewOffset(parentLocation) {
+  return parentLocation >> 16;
+}
+function getParentInjectorView(location2, startView) {
+  let viewOffset = getParentInjectorViewOffset(location2);
+  let parentView = startView;
+  while (viewOffset > 0) {
+    parentView = parentView[DECLARATION_VIEW];
+    viewOffset--;
+  }
+  return parentView;
+}
+var includeViewProviders = true;
+function setIncludeViewProviders(v) {
+  const oldValue = includeViewProviders;
+  includeViewProviders = v;
+  return oldValue;
+}
+var BLOOM_SIZE = 256;
+var BLOOM_MASK = BLOOM_SIZE - 1;
+var BLOOM_BUCKET_BITS = 5;
+var nextNgElementId = 0;
+var NOT_FOUND2 = {};
+function bloomAdd(injectorIndex, tView, type) {
+  ngDevMode && assertEqual(tView.firstCreatePass, true, "expected firstCreatePass to be true");
+  let id;
+  if (typeof type === "string") {
+    id = type.charCodeAt(0) || 0;
+  } else if (type.hasOwnProperty(NG_ELEMENT_ID)) {
+    id = type[NG_ELEMENT_ID];
+  }
+  if (id == null) {
+    id = type[NG_ELEMENT_ID] = nextNgElementId++;
+  }
+  const bloomHash = id & BLOOM_MASK;
+  const mask = 1 << bloomHash;
+  tView.data[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)] |= mask;
+}
+function getOrCreateNodeInjectorForNode(tNode, lView) {
+  const existingInjectorIndex = getInjectorIndex(tNode, lView);
+  if (existingInjectorIndex !== -1) {
+    return existingInjectorIndex;
+  }
+  const tView = lView[TVIEW];
+  if (tView.firstCreatePass) {
+    tNode.injectorIndex = lView.length;
+    insertBloom(tView.data, tNode);
+    insertBloom(lView, null);
+    insertBloom(tView.blueprint, null);
+  }
+  const parentLoc = getParentInjectorLocation(tNode, lView);
+  const injectorIndex = tNode.injectorIndex;
+  if (hasParentInjector(parentLoc)) {
+    const parentIndex = getParentInjectorIndex(parentLoc);
+    const parentLView = getParentInjectorView(parentLoc, lView);
+    const parentData = parentLView[TVIEW].data;
+    for (let i = 0; i < 8; i++) {
+      lView[injectorIndex + i] = parentLView[parentIndex + i] | parentData[parentIndex + i];
+    }
+  }
+  lView[
+    injectorIndex + 8
+    /* NodeInjectorOffset.PARENT */
+  ] = parentLoc;
+  return injectorIndex;
+}
+function insertBloom(arr, footer) {
+  arr.push(0, 0, 0, 0, 0, 0, 0, 0, footer);
+}
+function getInjectorIndex(tNode, lView) {
+  if (tNode.injectorIndex === -1 || // If the injector index is the same as its parent's injector index, then the index has been
+  // copied down from the parent node. No injector has been created yet on this node.
+  tNode.parent && tNode.parent.injectorIndex === tNode.injectorIndex || // After the first template pass, the injector index might exist but the parent values
+  // might not have been calculated yet for this instance
+  lView[
+    tNode.injectorIndex + 8
+    /* NodeInjectorOffset.PARENT */
+  ] === null) {
+    return -1;
+  } else {
+    ngDevMode && assertIndexInRange(lView, tNode.injectorIndex);
+    return tNode.injectorIndex;
+  }
+}
+function getParentInjectorLocation(tNode, lView) {
+  if (tNode.parent && tNode.parent.injectorIndex !== -1) {
+    return tNode.parent.injectorIndex;
+  }
+  let declarationViewOffset = 0;
+  let parentTNode = null;
+  let lViewCursor = lView;
+  while (lViewCursor !== null) {
+    parentTNode = getTNodeFromLView(lViewCursor);
+    if (parentTNode === null) {
+      return NO_PARENT_INJECTOR;
+    }
+    ngDevMode && parentTNode && assertTNodeForLView(parentTNode, lViewCursor[DECLARATION_VIEW]);
+    declarationViewOffset++;
+    lViewCursor = lViewCursor[DECLARATION_VIEW];
+    if (parentTNode.injectorIndex !== -1) {
+      return parentTNode.injectorIndex | declarationViewOffset << 16;
+    }
+  }
+  return NO_PARENT_INJECTOR;
+}
+function diPublicInInjector(injectorIndex, tView, token) {
+  bloomAdd(injectorIndex, tView, token);
+}
+function injectAttributeImpl(tNode, attrNameToInject) {
+  ngDevMode && assertTNodeType(
+    tNode,
+    12 | 3
+    /* TNodeType.AnyRNode */
+  );
+  ngDevMode && assertDefined(tNode, "expecting tNode");
+  if (attrNameToInject === "class") {
+    return tNode.classes;
+  }
+  if (attrNameToInject === "style") {
+    return tNode.styles;
+  }
+  const attrs = tNode.attrs;
+  if (attrs) {
+    const attrsLength = attrs.length;
+    let i = 0;
+    while (i < attrsLength) {
+      const value = attrs[i];
+      if (isNameOnlyAttributeMarker(value))
+        break;
+      if (value === 0) {
+        i = i + 2;
+      } else if (typeof value === "number") {
+        i++;
+        while (i < attrsLength && typeof attrs[i] === "string") {
+          i++;
+        }
+      } else if (value === attrNameToInject) {
+        return attrs[i + 1];
+      } else {
+        i = i + 2;
+      }
+    }
+  }
+  return null;
+}
+function notFoundValueOrThrow(notFoundValue, token, flags) {
+  if (flags & 8 || notFoundValue !== void 0) {
+    return notFoundValue;
+  } else {
+    throwProviderNotFoundError(token, "NodeInjector");
+  }
+}
+function lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue) {
+  if (flags & 8 && notFoundValue === void 0) {
+    notFoundValue = null;
+  }
+  if ((flags & (2 | 1)) === 0) {
+    const moduleInjector = lView[INJECTOR];
+    const previousInjectImplementation = setInjectImplementation(void 0);
+    try {
+      if (moduleInjector) {
+        return moduleInjector.get(
+          token,
+          notFoundValue,
+          flags & 8
+          /* InternalInjectFlags.Optional */
+        );
+      } else {
+        return injectRootLimpMode(
+          token,
+          notFoundValue,
+          flags & 8
+          /* InternalInjectFlags.Optional */
+        );
+      }
+    } finally {
+      setInjectImplementation(previousInjectImplementation);
+    }
+  }
+  return notFoundValueOrThrow(notFoundValue, token, flags);
+}
+function getOrCreateInjectable(tNode, lView, token, flags = 0, notFoundValue) {
+  if (tNode !== null) {
+    if (lView[FLAGS] & 2048 && // The token must be present on the current node injector when the `Self`
+    // flag is set, so the lookup on embedded view injector(s) can be skipped.
+    !(flags & 2)) {
+      const embeddedInjectorValue = lookupTokenUsingEmbeddedInjector(tNode, lView, token, flags, NOT_FOUND2);
+      if (embeddedInjectorValue !== NOT_FOUND2) {
+        return embeddedInjectorValue;
+      }
+    }
+    const value = lookupTokenUsingNodeInjector(tNode, lView, token, flags, NOT_FOUND2);
+    if (value !== NOT_FOUND2) {
+      return value;
+    }
+  }
+  return lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
+}
+function lookupTokenUsingNodeInjector(tNode, lView, token, flags, notFoundValue) {
+  const bloomHash = bloomHashBitOrFactory(token);
+  if (typeof bloomHash === "function") {
+    if (!enterDI(lView, tNode, flags)) {
+      return flags & 1 ? notFoundValueOrThrow(notFoundValue, token, flags) : lookupTokenUsingModuleInjector(lView, token, flags, notFoundValue);
+    }
+    try {
+      let value;
+      if (ngDevMode) {
+        runInInjectorProfilerContext(new NodeInjector(getCurrentTNode(), getLView()), token, () => {
+          emitInjectorToCreateInstanceEvent(token);
+          value = bloomHash(flags);
+          emitInstanceCreatedByInjectorEvent(value);
+        });
+      } else {
+        value = bloomHash(flags);
+      }
+      if (value == null && !(flags & 8)) {
+        throwProviderNotFoundError(token);
+      } else {
+        return value;
+      }
+    } finally {
+      leaveDI();
+    }
+  } else if (typeof bloomHash === "number") {
+    let previousTView = null;
+    let injectorIndex = getInjectorIndex(tNode, lView);
+    let parentLocation = NO_PARENT_INJECTOR;
+    let hostTElementNode = flags & 1 ? lView[DECLARATION_COMPONENT_VIEW][T_HOST] : null;
+    if (injectorIndex === -1 || flags & 4) {
+      parentLocation = injectorIndex === -1 ? getParentInjectorLocation(tNode, lView) : lView[
+        injectorIndex + 8
+        /* NodeInjectorOffset.PARENT */
+      ];
+      if (parentLocation === NO_PARENT_INJECTOR || !shouldSearchParent(flags, false)) {
+        injectorIndex = -1;
+      } else {
+        previousTView = lView[TVIEW];
+        injectorIndex = getParentInjectorIndex(parentLocation);
+        lView = getParentInjectorView(parentLocation, lView);
+      }
+    }
+    while (injectorIndex !== -1) {
+      ngDevMode && assertNodeInjector(lView, injectorIndex);
+      const tView = lView[TVIEW];
+      ngDevMode && assertTNodeForLView(tView.data[
+        injectorIndex + 8
+        /* NodeInjectorOffset.TNODE */
+      ], lView);
+      if (bloomHasToken(bloomHash, injectorIndex, tView.data)) {
+        const instance = searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode);
+        if (instance !== NOT_FOUND2) {
+          return instance;
+        }
+      }
+      parentLocation = lView[
+        injectorIndex + 8
+        /* NodeInjectorOffset.PARENT */
+      ];
+      if (parentLocation !== NO_PARENT_INJECTOR && shouldSearchParent(flags, lView[TVIEW].data[
+        injectorIndex + 8
+        /* NodeInjectorOffset.TNODE */
+      ] === hostTElementNode) && bloomHasToken(bloomHash, injectorIndex, lView)) {
+        previousTView = tView;
+        injectorIndex = getParentInjectorIndex(parentLocation);
+        lView = getParentInjectorView(parentLocation, lView);
+      } else {
+        injectorIndex = -1;
+      }
+    }
+  }
+  return notFoundValue;
+}
+function searchTokensOnInjector(injectorIndex, lView, token, previousTView, flags, hostTElementNode) {
+  const currentTView = lView[TVIEW];
+  const tNode = currentTView.data[
+    injectorIndex + 8
+    /* NodeInjectorOffset.TNODE */
+  ];
+  const canAccessViewProviders = previousTView == null ? (
+    // 1) This is the first invocation `previousTView == null` which means that we are at the
+    // `TNode` of where injector is starting to look. In such a case the only time we are allowed
+    // to look into the ViewProviders is if:
+    // - we are on a component
+    // - AND the injector set `includeViewProviders` to true (implying that the token can see
+    // ViewProviders because it is the Component or a Service which itself was declared in
+    // ViewProviders)
+    isComponentHost(tNode) && includeViewProviders
+  ) : (
+    // 2) `previousTView != null` which means that we are now walking across the parent nodes.
+    // In such a case we are only allowed to look into the ViewProviders if:
+    // - We just crossed from child View to Parent View `previousTView != currentTView`
+    // - AND the parent TNode is an Element.
+    // This means that we just came from the Component's View and therefore are allowed to see
+    // into the ViewProviders.
+    previousTView != currentTView && (tNode.type & 3) !== 0
+  );
+  const isHostSpecialCase = flags & 1 && hostTElementNode === tNode;
+  const injectableIdx = locateDirectiveOrProvider(tNode, currentTView, token, canAccessViewProviders, isHostSpecialCase);
+  if (injectableIdx !== null) {
+    return getNodeInjectable(lView, currentTView, injectableIdx, tNode);
+  } else {
+    return NOT_FOUND2;
+  }
+}
+function locateDirectiveOrProvider(tNode, tView, token, canAccessViewProviders, isHostSpecialCase) {
+  const nodeProviderIndexes = tNode.providerIndexes;
+  const tInjectables = tView.data;
+  const injectablesStart = nodeProviderIndexes & 1048575;
+  const directivesStart = tNode.directiveStart;
+  const directiveEnd = tNode.directiveEnd;
+  const cptViewProvidersCount = nodeProviderIndexes >> 20;
+  const startingIndex = canAccessViewProviders ? injectablesStart : injectablesStart + cptViewProvidersCount;
+  const endIndex = isHostSpecialCase ? injectablesStart + cptViewProvidersCount : directiveEnd;
+  for (let i = startingIndex; i < endIndex; i++) {
+    const providerTokenOrDef = tInjectables[i];
+    if (i < directivesStart && token === providerTokenOrDef || i >= directivesStart && providerTokenOrDef.type === token) {
+      return i;
+    }
+  }
+  if (isHostSpecialCase) {
+    const dirDef = tInjectables[directivesStart];
+    if (dirDef && isComponentDef(dirDef) && dirDef.type === token) {
+      return directivesStart;
+    }
+  }
+  return null;
+}
+function getNodeInjectable(lView, tView, index, tNode) {
+  let value = lView[index];
+  const tData = tView.data;
+  if (value instanceof NodeInjectorFactory) {
+    const factory = value;
+    if (factory.resolving) {
+      throwCyclicDependencyError(stringifyForError(tData[index]));
+    }
+    const previousIncludeViewProviders = setIncludeViewProviders(factory.canSeeViewProviders);
+    factory.resolving = true;
+    const token = tData[index].type || tData[index];
+    let prevInjectContext;
+    if (ngDevMode) {
+      const injector = new NodeInjector(tNode, lView);
+      prevInjectContext = setInjectorProfilerContext({ injector, token });
+    }
+    const previousInjectImplementation = factory.injectImpl ? setInjectImplementation(factory.injectImpl) : null;
+    const success = enterDI(
+      lView,
+      tNode,
+      0
+      /* InternalInjectFlags.Default */
+    );
+    ngDevMode && assertEqual(success, true, "Because flags do not contain `SkipSelf' we expect this to always succeed.");
+    try {
+      ngDevMode && emitInjectorToCreateInstanceEvent(token);
+      value = lView[index] = factory.factory(void 0, tData, lView, tNode);
+      ngDevMode && emitInstanceCreatedByInjectorEvent(value);
+      if (tView.firstCreatePass && index >= tNode.directiveStart) {
+        ngDevMode && assertDirectiveDef(tData[index]);
+        registerPreOrderHooks(index, tData[index], tView);
+      }
+    } finally {
+      ngDevMode && setInjectorProfilerContext(prevInjectContext);
+      previousInjectImplementation !== null && setInjectImplementation(previousInjectImplementation);
+      setIncludeViewProviders(previousIncludeViewProviders);
+      factory.resolving = false;
+      leaveDI();
+    }
+  }
+  return value;
+}
+function bloomHashBitOrFactory(token) {
+  ngDevMode && assertDefined(token, "token must be defined");
+  if (typeof token === "string") {
+    return token.charCodeAt(0) || 0;
+  }
+  const tokenId = (
+    // First check with `hasOwnProperty` so we don't get an inherited ID.
+    token.hasOwnProperty(NG_ELEMENT_ID) ? token[NG_ELEMENT_ID] : void 0
+  );
+  if (typeof tokenId === "number") {
+    if (tokenId >= 0) {
+      return tokenId & BLOOM_MASK;
+    } else {
+      ngDevMode && assertEqual(tokenId, -1, "Expecting to get Special Injector Id");
+      return createNodeInjector;
+    }
+  } else {
+    return tokenId;
+  }
+}
+function bloomHasToken(bloomHash, injectorIndex, injectorView) {
+  const mask = 1 << bloomHash;
+  const value = injectorView[injectorIndex + (bloomHash >> BLOOM_BUCKET_BITS)];
+  return !!(value & mask);
+}
+function shouldSearchParent(flags, isFirstHostTNode) {
+  return !(flags & 2) && !(flags & 1 && isFirstHostTNode);
+}
+function getNodeInjectorLView(nodeInjector) {
+  return nodeInjector._lView;
+}
+function getNodeInjectorTNode(nodeInjector) {
+  return nodeInjector._tNode;
+}
+var NodeInjector = class {
+  _tNode;
+  _lView;
+  constructor(_tNode, _lView) {
+    this._tNode = _tNode;
+    this._lView = _lView;
+  }
+  get(token, notFoundValue, flags) {
+    return getOrCreateInjectable(this._tNode, this._lView, token, convertToBitFlags(flags), notFoundValue);
+  }
+};
+function createNodeInjector() {
+  return new NodeInjector(getCurrentTNode(), getLView());
+}
+function ɵɵgetInheritedFactory(type) {
+  return noSideEffects(() => {
+    const ownConstructor = type.prototype.constructor;
+    const ownFactory = ownConstructor[NG_FACTORY_DEF] || getFactoryOf(ownConstructor);
+    const objectPrototype = Object.prototype;
+    let parent = Object.getPrototypeOf(type.prototype).constructor;
+    while (parent && parent !== objectPrototype) {
+      const factory = parent[NG_FACTORY_DEF] || getFactoryOf(parent);
+      if (factory && factory !== ownFactory) {
+        return factory;
+      }
+      parent = Object.getPrototypeOf(parent);
+    }
+    return (t) => new t();
+  });
+}
+function getFactoryOf(type) {
+  if (isForwardRef(type)) {
+    return () => {
+      const factory = getFactoryOf(resolveForwardRef(type));
+      return factory && factory();
+    };
+  }
+  return getFactoryDef(type);
+}
+function lookupTokenUsingEmbeddedInjector(tNode, lView, token, flags, notFoundValue) {
+  let currentTNode = tNode;
+  let currentLView = lView;
+  while (currentTNode !== null && currentLView !== null && currentLView[FLAGS] & 2048 && !isRootView(currentLView)) {
+    ngDevMode && assertTNodeForLView(currentTNode, currentLView);
+    const nodeInjectorValue = lookupTokenUsingNodeInjector(currentTNode, currentLView, token, flags | 2, NOT_FOUND2);
+    if (nodeInjectorValue !== NOT_FOUND2) {
+      return nodeInjectorValue;
+    }
+    let parentTNode = currentTNode.parent;
+    if (!parentTNode) {
+      const embeddedViewInjector = currentLView[EMBEDDED_VIEW_INJECTOR];
+      if (embeddedViewInjector) {
+        const embeddedViewInjectorValue = embeddedViewInjector.get(token, NOT_FOUND2, flags);
+        if (embeddedViewInjectorValue !== NOT_FOUND2) {
+          return embeddedViewInjectorValue;
+        }
+      }
+      parentTNode = getTNodeFromLView(currentLView);
+      currentLView = currentLView[DECLARATION_VIEW];
+    }
+    currentTNode = parentTNode;
+  }
+  return notFoundValue;
+}
+function getTNodeFromLView(lView) {
+  const tView = lView[TVIEW];
+  const tViewType = tView.type;
+  if (tViewType === 2) {
+    ngDevMode && assertDefined(tView.declTNode, "Embedded TNodes should have declaration parents.");
+    return tView.declTNode;
+  } else if (tViewType === 1) {
+    return lView[T_HOST];
+  }
+  return null;
+}
+function ɵɵinjectAttribute(attrNameToInject) {
+  return injectAttributeImpl(getCurrentTNode(), attrNameToInject);
+}
+var Attribute2 = makeParamDecorator("Attribute", (attributeName) => ({
+  attributeName,
+  __NG_ELEMENT_ID__: () => ɵɵinjectAttribute(attributeName)
+}));
+var _reflect = null;
+function getReflect() {
+  return _reflect = _reflect || new ReflectionCapabilities();
+}
+function reflectDependencies(type) {
+  return convertDependencies(getReflect().parameters(type));
+}
+function convertDependencies(deps) {
+  return deps.map((dep) => reflectDependency(dep));
+}
+function reflectDependency(dep) {
+  const meta = {
+    token: null,
+    attribute: null,
+    host: false,
+    optional: false,
+    self: false,
+    skipSelf: false
+  };
+  if (Array.isArray(dep) && dep.length > 0) {
+    for (let j = 0; j < dep.length; j++) {
+      const param = dep[j];
+      if (param === void 0) {
+        continue;
+      }
+      const proto = Object.getPrototypeOf(param);
+      if (param instanceof Optional || proto.ngMetadataName === "Optional") {
+        meta.optional = true;
+      } else if (param instanceof SkipSelf || proto.ngMetadataName === "SkipSelf") {
+        meta.skipSelf = true;
+      } else if (param instanceof Self || proto.ngMetadataName === "Self") {
+        meta.self = true;
+      } else if (param instanceof Host || proto.ngMetadataName === "Host") {
+        meta.host = true;
+      } else if (param instanceof Inject) {
+        meta.token = param.token;
+      } else if (param instanceof Attribute2) {
+        if (param.attributeName === void 0) {
+          throw new RuntimeError(204, ngDevMode && `Attribute name must be defined.`);
+        }
+        meta.attribute = param.attributeName;
+      } else {
+        meta.token = param;
+      }
+    }
+  } else if (dep === void 0 || Array.isArray(dep) && dep.length === 0) {
+    meta.token = null;
+  } else {
+    meta.token = dep;
+  }
+  return meta;
+}
+function compileInjectable(type, meta) {
+  let ngInjectableDef = null;
+  let ngFactoryDef = null;
+  if (!type.hasOwnProperty(NG_PROV_DEF)) {
+    Object.defineProperty(type, NG_PROV_DEF, {
+      get: () => {
+        if (ngInjectableDef === null) {
+          const compiler = getCompilerFacade({
+            usage: 0,
+            kind: "injectable",
+            type
+          });
+          ngInjectableDef = compiler.compileInjectable(angularCoreDiEnv, `ng:///${type.name}/ɵprov.js`, getInjectableMetadata(type, meta));
+        }
+        return ngInjectableDef;
+      }
+    });
+  }
+  if (!type.hasOwnProperty(NG_FACTORY_DEF)) {
+    Object.defineProperty(type, NG_FACTORY_DEF, {
+      get: () => {
+        if (ngFactoryDef === null) {
+          const compiler = getCompilerFacade({
+            usage: 0,
+            kind: "injectable",
+            type
+          });
+          ngFactoryDef = compiler.compileFactory(angularCoreDiEnv, `ng:///${type.name}/ɵfac.js`, {
+            name: type.name,
+            type,
+            typeArgumentCount: 0,
+            // In JIT mode types are not available nor used.
+            deps: reflectDependencies(type),
+            target: compiler.FactoryTarget.Injectable
+          });
+        }
+        return ngFactoryDef;
+      },
+      // Leave this configurable so that the factories from directives or pipes can take precedence.
+      configurable: true
+    });
+  }
+}
+var USE_VALUE2 = getClosureSafeProperty({
+  provide: String,
+  useValue: getClosureSafeProperty
+});
+function isUseClassProvider(meta) {
+  return meta.useClass !== void 0;
+}
+function isUseValueProvider(meta) {
+  return USE_VALUE2 in meta;
+}
+function isUseFactoryProvider(meta) {
+  return meta.useFactory !== void 0;
+}
+function isUseExistingProvider(meta) {
+  return meta.useExisting !== void 0;
+}
+function getInjectableMetadata(type, srcMeta) {
+  const meta = srcMeta || { providedIn: null };
+  const compilerMeta = {
+    name: type.name,
+    type,
+    typeArgumentCount: 0,
+    providedIn: meta.providedIn
+  };
+  if ((isUseClassProvider(meta) || isUseFactoryProvider(meta)) && meta.deps !== void 0) {
+    compilerMeta.deps = convertDependencies(meta.deps);
+  }
+  if (isUseClassProvider(meta)) {
+    compilerMeta.useClass = meta.useClass;
+  } else if (isUseValueProvider(meta)) {
+    compilerMeta.useValue = meta.useValue;
+  } else if (isUseFactoryProvider(meta)) {
+    compilerMeta.useFactory = meta.useFactory;
+  } else if (isUseExistingProvider(meta)) {
+    compilerMeta.useExisting = meta.useExisting;
+  }
+  return compilerMeta;
+}
+var Injectable = makeDecorator("Injectable", void 0, void 0, void 0, (type, meta) => compileInjectable(type, meta));
+function injectElementRef() {
+  return createElementRef(getCurrentTNode(), getLView());
+}
+function createElementRef(tNode, lView) {
+  return new ElementRef(getNativeByTNode(tNode, lView));
+}
+var ElementRef = class {
+  /**
+   * <div class="docs-alert docs-alert-important">
+   *   <header>Use with caution</header>
+   *   <p>
+   *    Use this API as the last resort when direct access to DOM is needed. Use templating and
+   *    data-binding provided by Angular instead. If used, it is recommended in combination with
+   *    {@link /best-practices/security#direct-use-of-the-dom-apis-and-explicit-sanitization-calls DomSanitizer}
+   *    for maxiumum security;
+   *   </p>
+   * </div>
+   */
+  nativeElement;
+  constructor(nativeElement) {
+    this.nativeElement = nativeElement;
+  }
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectElementRef;
+};
+function unwrapElementRef(value) {
+  return value instanceof ElementRef ? value.nativeElement : value;
+}
+function symbolIterator() {
+  return this._results[Symbol.iterator]();
+}
+var QueryList = class {
+  _emitDistinctChangesOnly;
+  dirty = true;
+  _onDirty = void 0;
+  _results = [];
+  _changesDetected = false;
+  _changes = void 0;
+  length = 0;
+  first = void 0;
+  last = void 0;
+  /**
+   * Returns `Observable` of `QueryList` notifying the subscriber of changes.
+   */
+  get changes() {
+    return this._changes ??= new Subject();
+  }
+  /**
+   * @param emitDistinctChangesOnly Whether `QueryList.changes` should fire only when actual change
+   *     has occurred. Or if it should fire when query is recomputed. (recomputing could resolve in
+   *     the same result)
+   */
+  constructor(_emitDistinctChangesOnly = false) {
+    this._emitDistinctChangesOnly = _emitDistinctChangesOnly;
+  }
+  /**
+   * Returns the QueryList entry at `index`.
+   */
+  get(index) {
+    return this._results[index];
+  }
+  /**
+   * See
+   * [Array.map](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)
+   */
+  map(fn) {
+    return this._results.map(fn);
+  }
+  filter(fn) {
+    return this._results.filter(fn);
+  }
+  /**
+   * See
+   * [Array.find](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/find)
+   */
+  find(fn) {
+    return this._results.find(fn);
+  }
+  /**
+   * See
+   * [Array.reduce](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce)
+   */
+  reduce(fn, init) {
+    return this._results.reduce(fn, init);
+  }
+  /**
+   * See
+   * [Array.forEach](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach)
+   */
+  forEach(fn) {
+    this._results.forEach(fn);
+  }
+  /**
+   * See
+   * [Array.some](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/some)
+   */
+  some(fn) {
+    return this._results.some(fn);
+  }
+  /**
+   * Returns a copy of the internal results list as an Array.
+   */
+  toArray() {
+    return this._results.slice();
+  }
+  toString() {
+    return this._results.toString();
+  }
+  /**
+   * Updates the stored data of the query list, and resets the `dirty` flag to `false`, so that
+   * on change detection, it will not notify of changes to the queries, unless a new change
+   * occurs.
+   *
+   * @param resultsTree The query results to store
+   * @param identityAccessor Optional function for extracting stable object identity from a value
+   *    in the array. This function is executed for each element of the query result list while
+   *    comparing current query list with the new one (provided as a first argument of the `reset`
+   *    function) to detect if the lists are different. If the function is not provided, elements
+   *    are compared as is (without any pre-processing).
+   */
+  reset(resultsTree, identityAccessor) {
+    this.dirty = false;
+    const newResultFlat = flatten(resultsTree);
+    if (this._changesDetected = !arrayEquals(this._results, newResultFlat, identityAccessor)) {
+      this._results = newResultFlat;
+      this.length = newResultFlat.length;
+      this.last = newResultFlat[this.length - 1];
+      this.first = newResultFlat[0];
+    }
+  }
+  /**
+   * Triggers a change event by emitting on the `changes` {@link EventEmitter}.
+   */
+  notifyOnChanges() {
+    if (this._changes !== void 0 && (this._changesDetected || !this._emitDistinctChangesOnly))
+      this._changes.next(this);
+  }
+  /** @internal */
+  onDirty(cb) {
+    this._onDirty = cb;
+  }
+  /** internal */
+  setDirty() {
+    this.dirty = true;
+    this._onDirty?.();
+  }
+  /** internal */
+  destroy() {
+    if (this._changes !== void 0) {
+      this._changes.complete();
+      this._changes.unsubscribe();
+    }
+  }
+  [Symbol.iterator] = /* @__PURE__ */ (() => symbolIterator)();
+};
+var SKIP_HYDRATION_ATTR_NAME = "ngSkipHydration";
+var SKIP_HYDRATION_ATTR_NAME_LOWER_CASE = "ngskiphydration";
+function hasSkipHydrationAttrOnTNode(tNode) {
+  const attrs = tNode.mergedAttrs;
+  if (attrs === null)
+    return false;
+  for (let i = 0; i < attrs.length; i += 2) {
+    const value = attrs[i];
+    if (typeof value === "number")
+      return false;
+    if (typeof value === "string" && value.toLowerCase() === SKIP_HYDRATION_ATTR_NAME_LOWER_CASE) {
+      return true;
+    }
+  }
+  return false;
+}
+function hasSkipHydrationAttrOnRElement(rNode) {
+  return rNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME);
+}
+function hasInSkipHydrationBlockFlag(tNode) {
+  return (tNode.flags & 128) === 128;
+}
+function isInSkipHydrationBlock2(tNode) {
+  if (hasInSkipHydrationBlockFlag(tNode)) {
+    return true;
+  }
+  let currentTNode = tNode.parent;
+  while (currentTNode) {
+    if (hasInSkipHydrationBlockFlag(tNode) || hasSkipHydrationAttrOnTNode(currentTNode)) {
+      return true;
+    }
+    currentTNode = currentTNode.parent;
+  }
+  return false;
+}
+function isI18nInSkipHydrationBlock(parentTNode) {
+  return hasInSkipHydrationBlockFlag(parentTNode) || hasSkipHydrationAttrOnTNode(parentTNode) || isInSkipHydrationBlock2(parentTNode);
+}
+var ChangeDetectionStrategy;
+(function(ChangeDetectionStrategy2) {
+  ChangeDetectionStrategy2[ChangeDetectionStrategy2["OnPush"] = 0] = "OnPush";
+  ChangeDetectionStrategy2[ChangeDetectionStrategy2["Default"] = 1] = "Default";
+})(ChangeDetectionStrategy || (ChangeDetectionStrategy = {}));
+var TRACKED_LVIEWS = /* @__PURE__ */ new Map();
+var uniqueIdCounter = 0;
+function getUniqueLViewId() {
+  return uniqueIdCounter++;
+}
+function registerLView(lView) {
+  ngDevMode && assertNumber(lView[ID], "LView must have an ID in order to be registered");
+  TRACKED_LVIEWS.set(lView[ID], lView);
+}
+function getLViewById(id) {
+  ngDevMode && assertNumber(id, "ID used for LView lookup must be a number");
+  return TRACKED_LVIEWS.get(id) || null;
+}
+function unregisterLView(lView) {
+  ngDevMode && assertNumber(lView[ID], "Cannot stop tracking an LView that does not have an ID");
+  TRACKED_LVIEWS.delete(lView[ID]);
+}
+function getTrackedLViews() {
+  return TRACKED_LVIEWS;
+}
+var LContext = class {
+  lViewId;
+  nodeIndex;
+  native;
+  /**
+   * The instance of the Component node.
+   */
+  component;
+  /**
+   * The list of active directives that exist on this element.
+   */
+  directives;
+  /**
+   * The map of local references (local reference name => element or directive instance) that
+   * exist on this element.
+   */
+  localRefs;
+  /** Component's parent view data. */
+  get lView() {
+    return getLViewById(this.lViewId);
+  }
+  constructor(lViewId, nodeIndex, native) {
+    this.lViewId = lViewId;
+    this.nodeIndex = nodeIndex;
+    this.native = native;
+  }
+};
+function getLContext(target) {
+  let mpValue = readPatchedData(target);
+  if (mpValue) {
+    if (isLView(mpValue)) {
+      const lView = mpValue;
+      let nodeIndex;
+      let component = void 0;
+      let directives = void 0;
+      if (isComponentInstance(target)) {
+        nodeIndex = findViaComponent(lView, target);
+        if (nodeIndex == -1) {
+          throw new Error("The provided component was not found in the application");
+        }
+        component = target;
+      } else if (isDirectiveInstance(target)) {
+        nodeIndex = findViaDirective(lView, target);
+        if (nodeIndex == -1) {
+          throw new Error("The provided directive was not found in the application");
+        }
+        directives = getDirectivesAtNodeIndex(nodeIndex, lView);
+      } else {
+        nodeIndex = findViaNativeElement(lView, target);
+        if (nodeIndex == -1) {
+          return null;
+        }
+      }
+      const native = unwrapRNode(lView[nodeIndex]);
+      const existingCtx = readPatchedData(native);
+      const context2 = existingCtx && !Array.isArray(existingCtx) ? existingCtx : createLContext(lView, nodeIndex, native);
+      if (component && context2.component === void 0) {
+        context2.component = component;
+        attachPatchData(context2.component, context2);
+      }
+      if (directives && context2.directives === void 0) {
+        context2.directives = directives;
+        for (let i = 0; i < directives.length; i++) {
+          attachPatchData(directives[i], context2);
+        }
+      }
+      attachPatchData(context2.native, context2);
+      mpValue = context2;
+    }
+  } else {
+    const rElement = target;
+    ngDevMode && assertDomNode(rElement);
+    let parent = rElement;
+    while (parent = parent.parentNode) {
+      const parentContext = readPatchedData(parent);
+      if (parentContext) {
+        const lView = Array.isArray(parentContext) ? parentContext : parentContext.lView;
+        if (!lView) {
+          return null;
+        }
+        const index = findViaNativeElement(lView, rElement);
+        if (index >= 0) {
+          const native = unwrapRNode(lView[index]);
+          const context2 = createLContext(lView, index, native);
+          attachPatchData(native, context2);
+          mpValue = context2;
+          break;
+        }
+      }
+    }
+  }
+  return mpValue || null;
+}
+function createLContext(lView, nodeIndex, native) {
+  return new LContext(lView[ID], nodeIndex, native);
+}
+function getComponentViewByInstance(componentInstance) {
+  let patchedData = readPatchedData(componentInstance);
+  let lView;
+  if (isLView(patchedData)) {
+    const contextLView = patchedData;
+    const nodeIndex = findViaComponent(contextLView, componentInstance);
+    lView = getComponentLViewByIndex(nodeIndex, contextLView);
+    const context2 = createLContext(contextLView, nodeIndex, lView[HOST]);
+    context2.component = componentInstance;
+    attachPatchData(componentInstance, context2);
+    attachPatchData(context2.native, context2);
+  } else {
+    const context2 = patchedData;
+    const contextLView = context2.lView;
+    ngDevMode && assertLView(contextLView);
+    lView = getComponentLViewByIndex(context2.nodeIndex, contextLView);
+  }
+  return lView;
+}
+var MONKEY_PATCH_KEY_NAME = "__ngContext__";
+function attachPatchData(target, data) {
+  ngDevMode && assertDefined(target, "Target expected");
+  if (isLView(data)) {
+    target[MONKEY_PATCH_KEY_NAME] = data[ID];
+    registerLView(data);
+  } else {
+    target[MONKEY_PATCH_KEY_NAME] = data;
+  }
+}
+function readPatchedData(target) {
+  ngDevMode && assertDefined(target, "Target expected");
+  const data = target[MONKEY_PATCH_KEY_NAME];
+  return typeof data === "number" ? getLViewById(data) : data || null;
+}
+function readPatchedLView(target) {
+  const value = readPatchedData(target);
+  if (value) {
+    return isLView(value) ? value : value.lView;
+  }
+  return null;
+}
+function isComponentInstance(instance) {
+  return instance && instance.constructor && instance.constructor.ɵcmp;
+}
+function isDirectiveInstance(instance) {
+  return instance && instance.constructor && instance.constructor.ɵdir;
+}
+function findViaNativeElement(lView, target) {
+  const tView = lView[TVIEW];
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    if (unwrapRNode(lView[i]) === target) {
+      return i;
+    }
+  }
+  return -1;
+}
+function traverseNextElement(tNode) {
+  if (tNode.child) {
+    return tNode.child;
+  } else if (tNode.next) {
+    return tNode.next;
+  } else {
+    while (tNode.parent && !tNode.parent.next) {
+      tNode = tNode.parent;
+    }
+    return tNode.parent && tNode.parent.next;
+  }
+}
+function findViaComponent(lView, componentInstance) {
+  const componentIndices = lView[TVIEW].components;
+  if (componentIndices) {
+    for (let i = 0; i < componentIndices.length; i++) {
+      const elementComponentIndex = componentIndices[i];
+      const componentView = getComponentLViewByIndex(elementComponentIndex, lView);
+      if (componentView[CONTEXT] === componentInstance) {
+        return elementComponentIndex;
+      }
+    }
+  } else {
+    const rootComponentView = getComponentLViewByIndex(HEADER_OFFSET, lView);
+    const rootComponent = rootComponentView[CONTEXT];
+    if (rootComponent === componentInstance) {
+      return HEADER_OFFSET;
+    }
+  }
+  return -1;
+}
+function findViaDirective(lView, directiveInstance) {
+  let tNode = lView[TVIEW].firstChild;
+  while (tNode) {
+    const directiveIndexStart = tNode.directiveStart;
+    const directiveIndexEnd = tNode.directiveEnd;
+    for (let i = directiveIndexStart; i < directiveIndexEnd; i++) {
+      if (lView[i] === directiveInstance) {
+        return tNode.index;
+      }
+    }
+    tNode = traverseNextElement(tNode);
+  }
+  return -1;
+}
+function getDirectivesAtNodeIndex(nodeIndex, lView) {
+  const tNode = lView[TVIEW].data[nodeIndex];
+  if (tNode.directiveStart === 0)
+    return EMPTY_ARRAY;
+  const results = [];
+  for (let i = tNode.directiveStart; i < tNode.directiveEnd; i++) {
+    const directiveInstance = lView[i];
+    if (!isComponentInstance(directiveInstance)) {
+      results.push(directiveInstance);
+    }
+  }
+  return results;
+}
+function getComponentAtNodeIndex(nodeIndex, lView) {
+  const tNode = lView[TVIEW].data[nodeIndex];
+  return isComponentHost(tNode) ? lView[tNode.directiveStart + tNode.componentOffset] : null;
+}
+function discoverLocalRefs(lView, nodeIndex) {
+  const tNode = lView[TVIEW].data[nodeIndex];
+  if (tNode && tNode.localNames) {
+    const result = {};
+    let localIndex = tNode.index + 1;
+    for (let i = 0; i < tNode.localNames.length; i += 2) {
+      result[tNode.localNames[i]] = lView[localIndex];
+      localIndex++;
+    }
+    return result;
+  }
+  return null;
+}
+function getRootView(componentOrLView) {
+  ngDevMode && assertDefined(componentOrLView, "component");
+  let lView = isLView(componentOrLView) ? componentOrLView : readPatchedLView(componentOrLView);
+  while (lView && !isRootView(lView)) {
+    lView = getLViewParent(lView);
+  }
+  ngDevMode && assertLView(lView);
+  return lView;
+}
+function getRootContext(viewOrComponent) {
+  const rootView = getRootView(viewOrComponent);
+  ngDevMode && assertDefined(rootView[CONTEXT], "Root view has no context. Perhaps it is disconnected?");
+  return rootView[CONTEXT];
+}
+function getFirstLContainer(lView) {
+  return getNearestLContainer(lView[CHILD_HEAD]);
+}
+function getNextLContainer(container) {
+  return getNearestLContainer(container[NEXT]);
+}
+function getNearestLContainer(viewOrContainer) {
+  while (viewOrContainer !== null && !isLContainer(viewOrContainer)) {
+    viewOrContainer = viewOrContainer[NEXT];
+  }
+  return viewOrContainer;
+}
+function getComponent(element) {
+  ngDevMode && assertDomElement(element);
+  const context2 = getLContext(element);
+  if (context2 === null)
+    return null;
+  if (context2.component === void 0) {
+    const lView = context2.lView;
+    if (lView === null) {
+      return null;
+    }
+    context2.component = getComponentAtNodeIndex(context2.nodeIndex, lView);
+  }
+  return context2.component;
+}
+function getContext(element) {
+  assertDomElement(element);
+  const context2 = getLContext(element);
+  const lView = context2 ? context2.lView : null;
+  return lView === null ? null : lView[CONTEXT];
+}
+function getOwningComponent(elementOrDir) {
+  const context2 = getLContext(elementOrDir);
+  let lView = context2 ? context2.lView : null;
+  if (lView === null)
+    return null;
+  let parent;
+  while (lView[TVIEW].type === 2 && (parent = getLViewParent(lView))) {
+    lView = parent;
+  }
+  return isRootView(lView) ? null : lView[CONTEXT];
+}
+function getRootComponents(elementOrDir) {
+  const lView = readPatchedLView(elementOrDir);
+  return lView !== null ? [getRootContext(lView)] : [];
+}
+function getInjector(elementOrDir) {
+  const context2 = getLContext(elementOrDir);
+  const lView = context2 ? context2.lView : null;
+  if (lView === null)
+    return Injector.NULL;
+  const tNode = lView[TVIEW].data[context2.nodeIndex];
+  return new NodeInjector(tNode, lView);
+}
+function getInjectionTokens(element) {
+  const context2 = getLContext(element);
+  const lView = context2 ? context2.lView : null;
+  if (lView === null)
+    return [];
+  const tView = lView[TVIEW];
+  const tNode = tView.data[context2.nodeIndex];
+  const providerTokens = [];
+  const startIndex = tNode.providerIndexes & 1048575;
+  const endIndex = tNode.directiveEnd;
+  for (let i = startIndex; i < endIndex; i++) {
+    let value = tView.data[i];
+    if (isDirectiveDefHack(value)) {
+      value = value.type;
+    }
+    providerTokens.push(value);
+  }
+  return providerTokens;
+}
+function getDirectives(node) {
+  if (node instanceof Text) {
+    return [];
+  }
+  const context2 = getLContext(node);
+  const lView = context2 ? context2.lView : null;
+  if (lView === null) {
+    return [];
+  }
+  const tView = lView[TVIEW];
+  const nodeIndex = context2.nodeIndex;
+  if (!tView?.data[nodeIndex]) {
+    return [];
+  }
+  if (context2.directives === void 0) {
+    context2.directives = getDirectivesAtNodeIndex(nodeIndex, lView);
+  }
+  return context2.directives === null ? [] : [...context2.directives];
+}
+var Framework;
+(function(Framework2) {
+  Framework2["Angular"] = "angular";
+  Framework2["ACX"] = "acx";
+  Framework2["Wiz"] = "wiz";
+})(Framework || (Framework = {}));
+var AcxChangeDetectionStrategy;
+(function(AcxChangeDetectionStrategy2) {
+  AcxChangeDetectionStrategy2[AcxChangeDetectionStrategy2["Default"] = 0] = "Default";
+  AcxChangeDetectionStrategy2[AcxChangeDetectionStrategy2["OnPush"] = 1] = "OnPush";
+})(AcxChangeDetectionStrategy || (AcxChangeDetectionStrategy = {}));
+var AcxViewEncapsulation;
+(function(AcxViewEncapsulation2) {
+  AcxViewEncapsulation2[AcxViewEncapsulation2["Emulated"] = 0] = "Emulated";
+  AcxViewEncapsulation2[AcxViewEncapsulation2["None"] = 1] = "None";
+})(AcxViewEncapsulation || (AcxViewEncapsulation = {}));
+function getDirectiveMetadata$1(directiveOrComponentInstance) {
+  const { constructor } = directiveOrComponentInstance;
+  if (!constructor) {
+    throw new Error("Unable to find the instance constructor");
+  }
+  const componentDef = getComponentDef(constructor);
+  if (componentDef) {
+    const inputs = extractInputDebugMetadata(componentDef.inputs);
+    return {
+      inputs,
+      outputs: componentDef.outputs,
+      encapsulation: componentDef.encapsulation,
+      changeDetection: componentDef.onPush ? ChangeDetectionStrategy.OnPush : ChangeDetectionStrategy.Default
+    };
+  }
+  const directiveDef = getDirectiveDef(constructor);
+  if (directiveDef) {
+    const inputs = extractInputDebugMetadata(directiveDef.inputs);
+    return { inputs, outputs: directiveDef.outputs };
+  }
+  return null;
+}
+function getLocalRefs(target) {
+  const context2 = getLContext(target);
+  if (context2 === null)
+    return {};
+  if (context2.localRefs === void 0) {
+    const lView = context2.lView;
+    if (lView === null) {
+      return {};
+    }
+    context2.localRefs = discoverLocalRefs(lView, context2.nodeIndex);
+  }
+  return context2.localRefs || {};
+}
+function getHostElement(componentOrDirective) {
+  return getLContext(componentOrDirective).native;
+}
+function getListeners(element) {
+  ngDevMode && assertDomElement(element);
+  const lContext = getLContext(element);
+  const lView = lContext === null ? null : lContext.lView;
+  if (lView === null)
+    return [];
+  const tView = lView[TVIEW];
+  const lCleanup = lView[CLEANUP];
+  const tCleanup = tView.cleanup;
+  const listeners = [];
+  if (tCleanup && lCleanup) {
+    for (let i = 0; i < tCleanup.length; ) {
+      const firstParam = tCleanup[i++];
+      const secondParam = tCleanup[i++];
+      if (typeof firstParam === "string") {
+        const name = firstParam;
+        const listenerElement = unwrapRNode(lView[secondParam]);
+        const callback = lCleanup[tCleanup[i++]];
+        const useCaptureOrIndx = tCleanup[i++];
+        const type = typeof useCaptureOrIndx === "boolean" || useCaptureOrIndx >= 0 ? "dom" : "output";
+        const useCapture = typeof useCaptureOrIndx === "boolean" ? useCaptureOrIndx : false;
+        if (element == listenerElement) {
+          listeners.push({ element, name, callback, useCapture, type });
+        }
+      }
+    }
+  }
+  listeners.sort(sortListeners);
+  return listeners;
+}
+function sortListeners(a, b) {
+  if (a.name == b.name)
+    return 0;
+  return a.name < b.name ? -1 : 1;
+}
+function isDirectiveDefHack(obj) {
+  return obj.type !== void 0 && obj.declaredInputs !== void 0 && obj.resolveHostDirectives !== void 0;
+}
+function assertDomElement(value) {
+  if (typeof Element !== "undefined" && !(value instanceof Element)) {
+    throw new Error("Expecting instance of DOM Element");
+  }
+}
+function extractInputDebugMetadata(inputs) {
+  const res = {};
+  for (const key in inputs) {
+    if (inputs.hasOwnProperty(key)) {
+      const value = inputs[key];
+      if (value !== void 0) {
+        res[key] = value[0];
+      }
+    }
+  }
+  return res;
+}
+var DOCUMENT2 = void 0;
+function setDocument(document2) {
+  DOCUMENT2 = document2;
+}
+function getDocument() {
+  if (DOCUMENT2 !== void 0) {
+    return DOCUMENT2;
+  } else if (typeof document !== "undefined") {
+    return document;
+  }
+  throw new RuntimeError(210, (typeof ngDevMode === "undefined" || ngDevMode) && `The document object is not available in this context. Make sure the DOCUMENT injection token is provided.`);
+}
+var APP_ID = new InjectionToken(ngDevMode ? "AppId" : "", {
+  providedIn: "root",
+  factory: () => DEFAULT_APP_ID
+});
+var DEFAULT_APP_ID = "ng";
+var PLATFORM_INITIALIZER = new InjectionToken(ngDevMode ? "Platform Initializer" : "");
+var PLATFORM_ID = new InjectionToken(ngDevMode ? "Platform ID" : "", {
+  providedIn: "platform",
+  factory: () => "unknown"
+  // set a default platform name, when none set explicitly
+});
+var PACKAGE_ROOT_URL = new InjectionToken(ngDevMode ? "Application Packages Root URL" : "");
+var ANIMATION_MODULE_TYPE = new InjectionToken(ngDevMode ? "AnimationModuleType" : "");
+var CSP_NONCE = new InjectionToken(ngDevMode ? "CSP nonce" : "", {
+  providedIn: "root",
+  factory: () => {
+    return getDocument().body?.querySelector("[ngCspNonce]")?.getAttribute("ngCspNonce") || null;
+  }
+});
+var IMAGE_CONFIG_DEFAULTS = {
+  breakpoints: [16, 32, 48, 64, 96, 128, 256, 384, 640, 750, 828, 1080, 1200, 1920, 2048, 3840],
+  placeholderResolution: 30,
+  disableImageSizeWarning: false,
+  disableImageLazyLoadWarning: false
+};
+var IMAGE_CONFIG = new InjectionToken(ngDevMode ? "ImageConfig" : "", {
+  providedIn: "root",
+  factory: () => IMAGE_CONFIG_DEFAULTS
+});
+function makeStateKey(key) {
+  return key;
+}
+function initTransferState() {
+  const transferState = new TransferState();
+  if (true) {
+    transferState.store = retrieveTransferredState(getDocument(), inject(APP_ID));
+  }
+  return transferState;
+}
+var TransferState = class _TransferState {
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _TransferState,
+      providedIn: "root",
+      factory: initTransferState
+    })
+  );
+  /** @internal */
+  store = {};
+  onSerializeCallbacks = {};
+  /**
+   * Get the value corresponding to a key. Return `defaultValue` if key is not found.
+   */
+  get(key, defaultValue) {
+    return this.store[key] !== void 0 ? this.store[key] : defaultValue;
+  }
+  /**
+   * Set the value corresponding to a key.
+   */
+  set(key, value) {
+    this.store[key] = value;
+  }
+  /**
+   * Remove a key from the store.
+   */
+  remove(key) {
+    delete this.store[key];
+  }
+  /**
+   * Test whether a key exists in the store.
+   */
+  hasKey(key) {
+    return this.store.hasOwnProperty(key);
+  }
+  /**
+   * Indicates whether the state is empty.
+   */
+  get isEmpty() {
+    return Object.keys(this.store).length === 0;
+  }
+  /**
+   * Register a callback to provide the value for a key when `toJson` is called.
+   */
+  onSerialize(key, callback) {
+    this.onSerializeCallbacks[key] = callback;
+  }
+  /**
+   * Serialize the current state of the store to JSON.
+   */
+  toJson() {
+    for (const key in this.onSerializeCallbacks) {
+      if (this.onSerializeCallbacks.hasOwnProperty(key)) {
+        try {
+          this.store[key] = this.onSerializeCallbacks[key]();
+        } catch (e) {
+          console.warn("Exception in onSerialize callback: ", e);
+        }
+      }
+    }
+    return JSON.stringify(this.store).replace(/</g, "\\u003C");
+  }
+};
+function retrieveTransferredState(doc, appId) {
+  const script = doc.getElementById(appId + "-state");
+  if (script?.textContent) {
+    try {
+      return JSON.parse(script.textContent);
+    } catch (e) {
+      console.warn("Exception while restoring TransferState for app " + appId, e);
+    }
+  }
+  return {};
+}
+var REFERENCE_NODE_HOST = "h";
+var REFERENCE_NODE_BODY = "b";
+var NODE_NAVIGATION_STEP_FIRST_CHILD = "f";
+var NODE_NAVIGATION_STEP_NEXT_SIBLING = "n";
+var ELEMENT_CONTAINERS = "e";
+var TEMPLATES = "t";
+var CONTAINERS = "c";
+var MULTIPLIER = "x";
+var NUM_ROOT_NODES = "r";
+var TEMPLATE_ID = "i";
+var NODES = "n";
+var DISCONNECTED_NODES = "d";
+var I18N_DATA = "l";
+var DEFER_BLOCK_ID = "di";
+var DEFER_BLOCK_STATE$1 = "s";
+var DEFER_PARENT_BLOCK_ID = "p";
+var DEFER_HYDRATE_TRIGGERS = "t";
+var IS_HYDRATION_DOM_REUSE_ENABLED = new InjectionToken(typeof ngDevMode === "undefined" || !!ngDevMode ? "IS_HYDRATION_DOM_REUSE_ENABLED" : "");
+var PRESERVE_HOST_CONTENT_DEFAULT = false;
+var PRESERVE_HOST_CONTENT = new InjectionToken(typeof ngDevMode === "undefined" || !!ngDevMode ? "PRESERVE_HOST_CONTENT" : "", {
+  providedIn: "root",
+  factory: () => PRESERVE_HOST_CONTENT_DEFAULT
+});
+var IS_I18N_HYDRATION_ENABLED = new InjectionToken(typeof ngDevMode === "undefined" || !!ngDevMode ? "IS_I18N_HYDRATION_ENABLED" : "");
+var IS_EVENT_REPLAY_ENABLED = new InjectionToken(typeof ngDevMode === "undefined" || !!ngDevMode ? "IS_EVENT_REPLAY_ENABLED" : "");
+var EVENT_REPLAY_ENABLED_DEFAULT = false;
+var IS_INCREMENTAL_HYDRATION_ENABLED = new InjectionToken(typeof ngDevMode === "undefined" || !!ngDevMode ? "IS_INCREMENTAL_HYDRATION_ENABLED" : "");
+var JSACTION_BLOCK_ELEMENT_MAP = new InjectionToken(ngDevMode ? "JSACTION_BLOCK_ELEMENT_MAP" : "", {
+  providedIn: "root",
+  factory: () => /* @__PURE__ */ new Map()
+});
+var eventListenerOptions = {
+  passive: true,
+  capture: true
+};
+var hoverTriggers = /* @__PURE__ */ new WeakMap();
+var interactionTriggers = /* @__PURE__ */ new WeakMap();
+var viewportTriggers = /* @__PURE__ */ new WeakMap();
+var interactionEventNames = ["click", "keydown"];
+var hoverEventNames = ["mouseenter", "mouseover", "focusin"];
+var intersectionObserver = null;
+var observedViewportElements = 0;
+var DeferEventEntry = class {
+  callbacks = /* @__PURE__ */ new Set();
+  listener = () => {
+    for (const callback of this.callbacks) {
+      callback();
+    }
+  };
+};
+function onInteraction(trigger, callback) {
+  let entry = interactionTriggers.get(trigger);
+  if (!entry) {
+    entry = new DeferEventEntry();
+    interactionTriggers.set(trigger, entry);
+    for (const name of interactionEventNames) {
+      trigger.addEventListener(name, entry.listener, eventListenerOptions);
+    }
+  }
+  entry.callbacks.add(callback);
+  return () => {
+    const { callbacks, listener } = entry;
+    callbacks.delete(callback);
+    if (callbacks.size === 0) {
+      interactionTriggers.delete(trigger);
+      for (const name of interactionEventNames) {
+        trigger.removeEventListener(name, listener, eventListenerOptions);
+      }
+    }
+  };
+}
+function onHover(trigger, callback) {
+  let entry = hoverTriggers.get(trigger);
+  if (!entry) {
+    entry = new DeferEventEntry();
+    hoverTriggers.set(trigger, entry);
+    for (const name of hoverEventNames) {
+      trigger.addEventListener(name, entry.listener, eventListenerOptions);
+    }
+  }
+  entry.callbacks.add(callback);
+  return () => {
+    const { callbacks, listener } = entry;
+    callbacks.delete(callback);
+    if (callbacks.size === 0) {
+      for (const name of hoverEventNames) {
+        trigger.removeEventListener(name, listener, eventListenerOptions);
+      }
+      hoverTriggers.delete(trigger);
+    }
+  };
+}
+function createIntersectionObserver() {
+  return new IntersectionObserver((entries) => {
+    for (const current of entries) {
+      if (current.isIntersecting && viewportTriggers.has(current.target)) {
+        viewportTriggers.get(current.target).listener();
+      }
+    }
+  });
+}
+function onViewport(trigger, callback, observerFactoryFn) {
+  let entry = viewportTriggers.get(trigger);
+  intersectionObserver = intersectionObserver || observerFactoryFn();
+  if (!entry) {
+    entry = new DeferEventEntry();
+    intersectionObserver.observe(trigger);
+    viewportTriggers.set(trigger, entry);
+    observedViewportElements++;
+  }
+  entry.callbacks.add(callback);
+  return () => {
+    if (!viewportTriggers.has(trigger)) {
+      return;
+    }
+    entry.callbacks.delete(callback);
+    if (entry.callbacks.size === 0) {
+      intersectionObserver?.unobserve(trigger);
+      viewportTriggers.delete(trigger);
+      observedViewportElements--;
+    }
+    if (observedViewportElements === 0) {
+      intersectionObserver?.disconnect();
+      intersectionObserver = null;
+    }
+  };
+}
+var DEFER_BLOCK_SSR_ID_ATTRIBUTE = "ngb";
+function setJSActionAttributes(nativeElement, eventTypes, parentDeferBlockId = null) {
+  if (eventTypes.length === 0 || nativeElement.nodeType !== Node.ELEMENT_NODE) {
+    return;
+  }
+  const existingAttr = nativeElement.getAttribute(Attribute.JSACTION);
+  const parts = eventTypes.reduce((prev, curr) => {
+    return (existingAttr?.indexOf(curr) ?? -1) === -1 ? prev + curr + ":;" : prev;
+  }, "");
+  nativeElement.setAttribute(Attribute.JSACTION, `${existingAttr ?? ""}${parts}`);
+  const blockName = parentDeferBlockId ?? "";
+  if (blockName !== "" && parts.length > 0) {
+    nativeElement.setAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE, blockName);
+  }
+}
+var sharedStashFunction = (rEl, eventType, listenerFn) => {
+  const el = rEl;
+  const eventListenerMap = el.__jsaction_fns ?? /* @__PURE__ */ new Map();
+  const eventListeners = eventListenerMap.get(eventType) ?? [];
+  eventListeners.push(listenerFn);
+  eventListenerMap.set(eventType, eventListeners);
+  el.__jsaction_fns = eventListenerMap;
+};
+var sharedMapFunction = (rEl, jsActionMap) => {
+  const el = rEl;
+  let blockName = el.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE) ?? "";
+  const blockSet = jsActionMap.get(blockName) ?? /* @__PURE__ */ new Set();
+  if (!blockSet.has(el)) {
+    blockSet.add(el);
+  }
+  jsActionMap.set(blockName, blockSet);
+};
+function removeListenersFromBlocks(blockNames, jsActionMap) {
+  if (blockNames.length > 0) {
+    let blockList = [];
+    for (let blockName of blockNames) {
+      if (jsActionMap.has(blockName)) {
+        blockList = [...blockList, ...jsActionMap.get(blockName)];
+      }
+    }
+    const replayList = new Set(blockList);
+    replayList.forEach(removeListeners);
+  }
+}
+var removeListeners = (el) => {
+  el.removeAttribute(Attribute.JSACTION);
+  el.removeAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);
+  el.__jsaction_fns = void 0;
+};
+var JSACTION_EVENT_CONTRACT = new InjectionToken(ngDevMode ? "EVENT_CONTRACT_DETAILS" : "", {
+  providedIn: "root",
+  factory: () => ({})
+});
+function invokeListeners(event, currentTarget) {
+  const handlerFns = currentTarget?.__jsaction_fns?.get(event.type);
+  if (!handlerFns || !currentTarget?.isConnected) {
+    return;
+  }
+  for (const handler of handlerFns) {
+    handler(event);
+  }
+}
+var stashEventListeners = /* @__PURE__ */ new Map();
+function setStashFn(appId, fn) {
+  stashEventListeners.set(appId, fn);
+  return () => stashEventListeners.delete(appId);
+}
+var isStashEventListenerImplEnabled = false;
+var _stashEventListenerImpl = (lView, target, eventName, wrappedListener) => {
+};
+function stashEventListenerImpl(lView, target, eventName, wrappedListener) {
+  _stashEventListenerImpl(lView, target, eventName, wrappedListener);
+}
+function enableStashEventListenerImpl() {
+  if (!isStashEventListenerImplEnabled) {
+    _stashEventListenerImpl = (lView, target, eventName, wrappedListener) => {
+      const appId = lView[INJECTOR].get(APP_ID);
+      const stashEventListener = stashEventListeners.get(appId);
+      stashEventListener?.(target, eventName, wrappedListener);
+    };
+    isStashEventListenerImplEnabled = true;
+  }
+}
+var DEHYDRATED_BLOCK_REGISTRY = new InjectionToken(ngDevMode ? "DEHYDRATED_BLOCK_REGISTRY" : "");
+var DehydratedBlockRegistry = class _DehydratedBlockRegistry {
+  registry = /* @__PURE__ */ new Map();
+  cleanupFns = /* @__PURE__ */ new Map();
+  jsActionMap = inject(JSACTION_BLOCK_ELEMENT_MAP);
+  contract = inject(JSACTION_EVENT_CONTRACT);
+  add(blockId, info) {
+    this.registry.set(blockId, info);
+    if (this.awaitingCallbacks.has(blockId)) {
+      const awaitingCallbacks = this.awaitingCallbacks.get(blockId);
+      for (const cb of awaitingCallbacks) {
+        cb();
+      }
+    }
+  }
+  get(blockId) {
+    return this.registry.get(blockId) ?? null;
+  }
+  has(blockId) {
+    return this.registry.has(blockId);
+  }
+  cleanup(hydratedBlocks) {
+    removeListenersFromBlocks(hydratedBlocks, this.jsActionMap);
+    for (let blockId of hydratedBlocks) {
+      this.registry.delete(blockId);
+      this.jsActionMap.delete(blockId);
+      this.invokeTriggerCleanupFns(blockId);
+      this.hydrating.delete(blockId);
+      this.awaitingCallbacks.delete(blockId);
+    }
+    if (this.size === 0) {
+      this.contract.instance?.cleanUp();
+    }
+  }
+  get size() {
+    return this.registry.size;
+  }
+  // we have to leave the lowest block Id in the registry
+  // unless that block has no children
+  addCleanupFn(blockId, fn) {
+    let cleanupFunctions = [];
+    if (this.cleanupFns.has(blockId)) {
+      cleanupFunctions = this.cleanupFns.get(blockId);
+    }
+    cleanupFunctions.push(fn);
+    this.cleanupFns.set(blockId, cleanupFunctions);
+  }
+  invokeTriggerCleanupFns(blockId) {
+    const fns = this.cleanupFns.get(blockId) ?? [];
+    for (let fn of fns) {
+      fn();
+    }
+    this.cleanupFns.delete(blockId);
+  }
+  // Blocks that are being hydrated.
+  hydrating = /* @__PURE__ */ new Map();
+  // Blocks that are awaiting a defer instruction finish.
+  awaitingCallbacks = /* @__PURE__ */ new Map();
+  awaitParentBlock(topmostParentBlock, callback) {
+    const parentBlockAwaitCallbacks = this.awaitingCallbacks.get(topmostParentBlock) ?? [];
+    parentBlockAwaitCallbacks.push(callback);
+    this.awaitingCallbacks.set(topmostParentBlock, parentBlockAwaitCallbacks);
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _DehydratedBlockRegistry,
+      providedIn: null,
+      factory: () => new _DehydratedBlockRegistry()
+    })
+  );
+};
+var TRANSFER_STATE_TOKEN_ID = "__nghData__";
+var NGH_DATA_KEY = makeStateKey(TRANSFER_STATE_TOKEN_ID);
+var TRANSFER_STATE_DEFER_BLOCKS_INFO = "__nghDeferData__";
+var NGH_DEFER_BLOCKS_KEY = makeStateKey(TRANSFER_STATE_DEFER_BLOCKS_INFO);
+var NGH_ATTR_NAME = "ngh";
+var SSR_CONTENT_INTEGRITY_MARKER = "nghm";
+var _retrieveHydrationInfoImpl = () => null;
+function retrieveHydrationInfoImpl(rNode, injector, isRootView2 = false) {
+  let nghAttrValue = rNode.getAttribute(NGH_ATTR_NAME);
+  if (nghAttrValue == null)
+    return null;
+  const [componentViewNgh, rootViewNgh] = nghAttrValue.split("|");
+  nghAttrValue = isRootView2 ? rootViewNgh : componentViewNgh;
+  if (!nghAttrValue)
+    return null;
+  const rootNgh = rootViewNgh ? `|${rootViewNgh}` : "";
+  const remainingNgh = isRootView2 ? componentViewNgh : rootNgh;
+  let data = {};
+  if (nghAttrValue !== "") {
+    const transferState = injector.get(TransferState, null, { optional: true });
+    if (transferState !== null) {
+      const nghData = transferState.get(NGH_DATA_KEY, []);
+      data = nghData[Number(nghAttrValue)];
+      ngDevMode && assertDefined(data, "Unable to retrieve hydration info from the TransferState.");
+    }
+  }
+  const dehydratedView = {
+    data,
+    firstChild: rNode.firstChild ?? null
+  };
+  if (isRootView2) {
+    dehydratedView.firstChild = rNode;
+    setSegmentHead(dehydratedView, 0, rNode.nextSibling);
+  }
+  if (remainingNgh) {
+    rNode.setAttribute(NGH_ATTR_NAME, remainingNgh);
+  } else {
+    rNode.removeAttribute(NGH_ATTR_NAME);
+  }
+  ngDevMode && markRNodeAsClaimedByHydration(
+    rNode,
+    /* checkIfAlreadyClaimed */
+    false
+  );
+  ngDevMode && ngDevMode.hydratedComponents++;
+  return dehydratedView;
+}
+function enableRetrieveHydrationInfoImpl() {
+  _retrieveHydrationInfoImpl = retrieveHydrationInfoImpl;
+}
+function retrieveHydrationInfo(rNode, injector, isRootView2 = false) {
+  return _retrieveHydrationInfoImpl(rNode, injector, isRootView2);
+}
+function getLNodeForHydration(viewRef) {
+  let lView = viewRef._lView;
+  const tView = lView[TVIEW];
+  if (tView.type === 2) {
+    return null;
+  }
+  if (isRootView(lView)) {
+    lView = lView[HEADER_OFFSET];
+  }
+  return lView;
+}
+function getTextNodeContent(node) {
+  return node.textContent?.replace(/\s/gm, "");
+}
+function processTextNodeMarkersBeforeHydration(node) {
+  const doc = getDocument();
+  const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, {
+    acceptNode(node2) {
+      const content = getTextNodeContent(node2);
+      const isTextNodeMarker = content === "ngetn" || content === "ngtns";
+      return isTextNodeMarker ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
+    }
+  });
+  let currentNode;
+  const nodes = [];
+  while (currentNode = commentNodesIterator.nextNode()) {
+    nodes.push(currentNode);
+  }
+  for (const node2 of nodes) {
+    if (node2.textContent === "ngetn") {
+      node2.replaceWith(doc.createTextNode(""));
+    } else {
+      node2.remove();
+    }
+  }
+}
+var HydrationStatus;
+(function(HydrationStatus2) {
+  HydrationStatus2["Hydrated"] = "hydrated";
+  HydrationStatus2["Skipped"] = "skipped";
+  HydrationStatus2["Mismatched"] = "mismatched";
+})(HydrationStatus || (HydrationStatus = {}));
+var HYDRATION_INFO_KEY = "__ngDebugHydrationInfo__";
+function patchHydrationInfo(node, info) {
+  node[HYDRATION_INFO_KEY] = info;
+}
+function readHydrationInfo(node) {
+  return node[HYDRATION_INFO_KEY] ?? null;
+}
+function markRNodeAsClaimedByHydration(node, checkIfAlreadyClaimed = true) {
+  if (!ngDevMode) {
+    throw new Error("Calling `markRNodeAsClaimedByHydration` in prod mode is not supported and likely a mistake.");
+  }
+  if (checkIfAlreadyClaimed && isRNodeClaimedForHydration(node)) {
+    throw new Error("Trying to claim a node, which was claimed already.");
+  }
+  patchHydrationInfo(node, { status: HydrationStatus.Hydrated });
+  ngDevMode.hydratedNodes++;
+}
+function markRNodeAsSkippedByHydration(node) {
+  if (!ngDevMode) {
+    throw new Error("Calling `markRNodeAsSkippedByHydration` in prod mode is not supported and likely a mistake.");
+  }
+  patchHydrationInfo(node, { status: HydrationStatus.Skipped });
+  ngDevMode.componentsSkippedHydration++;
+}
+function countBlocksSkippedByHydration(injector) {
+  const transferState = injector.get(TransferState);
+  const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
+  if (ngDevMode) {
+    ngDevMode.deferBlocksWithIncrementalHydration = Object.keys(nghDeferData).length;
+  }
+}
+function markRNodeAsHavingHydrationMismatch(node, expectedNodeDetails = null, actualNodeDetails = null) {
+  if (!ngDevMode) {
+    throw new Error("Calling `markRNodeAsMismatchedByHydration` in prod mode is not supported and likely a mistake.");
+  }
+  while (node && !getComponent(node)) {
+    node = node?.parentNode;
+  }
+  if (node) {
+    patchHydrationInfo(node, {
+      status: HydrationStatus.Mismatched,
+      expectedNodeDetails,
+      actualNodeDetails
+    });
+  }
+}
+function isRNodeClaimedForHydration(node) {
+  return readHydrationInfo(node)?.status === HydrationStatus.Hydrated;
+}
+function setSegmentHead(hydrationInfo, index, node) {
+  hydrationInfo.segmentHeads ??= {};
+  hydrationInfo.segmentHeads[index] = node;
+}
+function getSegmentHead(hydrationInfo, index) {
+  return hydrationInfo.segmentHeads?.[index] ?? null;
+}
+function isIncrementalHydrationEnabled(injector) {
+  return injector.get(IS_INCREMENTAL_HYDRATION_ENABLED, false, {
+    optional: true
+  });
+}
+function assertIncrementalHydrationIsConfigured(injector) {
+  if (!isIncrementalHydrationEnabled(injector)) {
+    throw new RuntimeError(508, "Angular has detected that some `@defer` blocks use `hydrate` triggers, but incremental hydration was not enabled. Please ensure that the `withIncrementalHydration()` call is added as an argument for the `provideClientHydration()` function call in your application config.");
+  }
+}
+function assertSsrIdDefined(ssrUniqueId) {
+  assertDefined(ssrUniqueId, "Internal error: expecting an SSR id for a defer block that should be hydrated, but the id is not present");
+}
+function getNgContainerSize(hydrationInfo, index) {
+  const data = hydrationInfo.data;
+  let size = data[ELEMENT_CONTAINERS]?.[index] ?? null;
+  if (size === null && data[CONTAINERS]?.[index]) {
+    size = calcSerializedContainerSize(hydrationInfo, index);
+  }
+  return size;
+}
+function isSerializedElementContainer(hydrationInfo, index) {
+  return hydrationInfo.data[ELEMENT_CONTAINERS]?.[index] !== void 0;
+}
+function getSerializedContainerViews(hydrationInfo, index) {
+  return hydrationInfo.data[CONTAINERS]?.[index] ?? null;
+}
+function calcSerializedContainerSize(hydrationInfo, index) {
+  const views = getSerializedContainerViews(hydrationInfo, index) ?? [];
+  let numNodes = 0;
+  for (let view of views) {
+    numNodes += view[NUM_ROOT_NODES] * (view[MULTIPLIER] ?? 1);
+  }
+  return numNodes;
+}
+function initDisconnectedNodes(hydrationInfo) {
+  if (typeof hydrationInfo.disconnectedNodes === "undefined") {
+    const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];
+    hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;
+  }
+  return hydrationInfo.disconnectedNodes;
+}
+function isDisconnectedNode$1(hydrationInfo, index) {
+  if (typeof hydrationInfo.disconnectedNodes === "undefined") {
+    const nodeIds = hydrationInfo.data[DISCONNECTED_NODES];
+    hydrationInfo.disconnectedNodes = nodeIds ? new Set(nodeIds) : null;
+  }
+  return !!initDisconnectedNodes(hydrationInfo)?.has(index);
+}
+function processTextNodeBeforeSerialization(context2, node) {
+  const el = node;
+  const corruptedTextNodes = context2.corruptedTextNodes;
+  if (el.textContent === "") {
+    corruptedTextNodes.set(
+      el,
+      "ngetn"
+      /* TextNodeMarker.EmptyNode */
+    );
+  } else if (el.nextSibling?.nodeType === Node.TEXT_NODE) {
+    corruptedTextNodes.set(
+      el,
+      "ngtns"
+      /* TextNodeMarker.Separator */
+    );
+  }
+}
+function convertHydrateTriggersToJsAction(triggers) {
+  let actionList = [];
+  if (triggers !== null) {
+    if (triggers.has(
+      4
+      /* DeferBlockTrigger.Hover */
+    )) {
+      actionList.push(...hoverEventNames);
+    }
+    if (triggers.has(
+      3
+      /* DeferBlockTrigger.Interaction */
+    )) {
+      actionList.push(...interactionEventNames);
+    }
+  }
+  return actionList;
+}
+function getParentBlockHydrationQueue(deferBlockId, injector) {
+  const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+  const transferState = injector.get(TransferState);
+  const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
+  let isTopMostDeferBlock = false;
+  let currentBlockId = deferBlockId;
+  let parentBlockPromise = null;
+  const hydrationQueue = [];
+  while (!isTopMostDeferBlock && currentBlockId) {
+    ngDevMode && assertEqual(hydrationQueue.indexOf(currentBlockId), -1, "Internal error: defer block hierarchy has a cycle.");
+    isTopMostDeferBlock = dehydratedBlockRegistry.has(currentBlockId);
+    const hydratingParentBlock = dehydratedBlockRegistry.hydrating.get(currentBlockId);
+    if (parentBlockPromise === null && hydratingParentBlock != null) {
+      parentBlockPromise = hydratingParentBlock.promise;
+      break;
+    }
+    hydrationQueue.unshift(currentBlockId);
+    currentBlockId = deferBlockParents[currentBlockId][DEFER_PARENT_BLOCK_ID];
+  }
+  return { parentBlockPromise, hydrationQueue };
+}
+function gatherDeferBlocksByJSActionAttribute(doc) {
+  const jsactionNodes = doc.body.querySelectorAll("[jsaction]");
+  const blockMap = /* @__PURE__ */ new Set();
+  const eventTypes = [hoverEventNames.join(":;"), interactionEventNames.join(":;")].join("|");
+  for (let node of jsactionNodes) {
+    const attr = node.getAttribute("jsaction");
+    const blockId = node.getAttribute("ngb");
+    if (attr?.match(eventTypes) && blockId !== null) {
+      blockMap.add(node);
+    }
+  }
+  return blockMap;
+}
+function appendDeferBlocksToJSActionMap(doc, injector) {
+  const blockMap = gatherDeferBlocksByJSActionAttribute(doc);
+  const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);
+  for (let rNode of blockMap) {
+    sharedMapFunction(rNode, jsActionMap);
+  }
+}
+var _retrieveDeferBlockDataImpl = () => {
+  return {};
+};
+function retrieveDeferBlockDataImpl(injector) {
+  const transferState = injector.get(TransferState, null, { optional: true });
+  if (transferState !== null) {
+    const nghDeferData = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
+    ngDevMode && assertDefined(nghDeferData, "Unable to retrieve defer block info from the TransferState.");
+    return nghDeferData;
+  }
+  return {};
+}
+function enableRetrieveDeferBlockDataImpl() {
+  _retrieveDeferBlockDataImpl = retrieveDeferBlockDataImpl;
+}
+function retrieveDeferBlockData(injector) {
+  return _retrieveDeferBlockDataImpl(injector);
+}
+function isTimerTrigger(triggerInfo) {
+  return typeof triggerInfo === "object" && triggerInfo.trigger === 5;
+}
+function getHydrateTimerTrigger(blockData) {
+  const trigger = blockData[DEFER_HYDRATE_TRIGGERS]?.find((t) => isTimerTrigger(t));
+  return trigger?.delay ?? null;
+}
+function hasHydrateTrigger(blockData, trigger) {
+  return blockData[DEFER_HYDRATE_TRIGGERS]?.includes(trigger) ?? false;
+}
+function createBlockSummary(blockInfo) {
+  return {
+    data: blockInfo,
+    hydrate: {
+      idle: hasHydrateTrigger(
+        blockInfo,
+        0
+        /* DeferBlockTrigger.Idle */
+      ),
+      immediate: hasHydrateTrigger(
+        blockInfo,
+        1
+        /* DeferBlockTrigger.Immediate */
+      ),
+      timer: getHydrateTimerTrigger(blockInfo),
+      viewport: hasHydrateTrigger(
+        blockInfo,
+        2
+        /* DeferBlockTrigger.Viewport */
+      )
+    }
+  };
+}
+function processBlockData(injector) {
+  const blockData = retrieveDeferBlockData(injector);
+  let blockDetails = /* @__PURE__ */ new Map();
+  for (let blockId in blockData) {
+    blockDetails.set(blockId, createBlockSummary(blockData[blockId]));
+  }
+  return blockDetails;
+}
+function isSsrContentsIntegrity(node) {
+  return !!node && node.nodeType === Node.COMMENT_NODE && node.textContent?.trim() === SSR_CONTENT_INTEGRITY_MARKER;
+}
+function skipTextNodes(node) {
+  while (node && node.nodeType === Node.TEXT_NODE) {
+    node = node.previousSibling;
+  }
+  return node;
+}
+function verifySsrContentsIntegrity(doc) {
+  for (const node of doc.body.childNodes) {
+    if (isSsrContentsIntegrity(node)) {
+      return;
+    }
+  }
+  const beforeBody = skipTextNodes(doc.body.previousSibling);
+  if (isSsrContentsIntegrity(beforeBody)) {
+    return;
+  }
+  let endOfHead = skipTextNodes(doc.head.lastChild);
+  if (isSsrContentsIntegrity(endOfHead)) {
+    return;
+  }
+  throw new RuntimeError(-507, typeof ngDevMode !== "undefined" && ngDevMode && "Angular hydration logic detected that HTML content of this page was modified after it was produced during server side rendering. Make sure that there are no optimizations that remove comment nodes from HTML enabled on your CDN. Angular hydration relies on HTML produced by the server, including whitespaces and comment nodes.");
+}
+function refreshContentQueries(tView, lView) {
+  const contentQueries = tView.contentQueries;
+  if (contentQueries !== null) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      for (let i = 0; i < contentQueries.length; i += 2) {
+        const queryStartIdx = contentQueries[i];
+        const directiveDefIdx = contentQueries[i + 1];
+        if (directiveDefIdx !== -1) {
+          const directiveDef = tView.data[directiveDefIdx];
+          ngDevMode && assertDefined(directiveDef, "DirectiveDef not found.");
+          ngDevMode && assertDefined(directiveDef.contentQueries, "contentQueries function should be defined");
+          setCurrentQueryIndex(queryStartIdx);
+          directiveDef.contentQueries(2, lView[directiveDefIdx], directiveDefIdx);
+        }
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}
+function executeViewQueryFn(flags, viewQueryFn, component) {
+  ngDevMode && assertDefined(viewQueryFn, "View queries function to execute must be defined.");
+  setCurrentQueryIndex(0);
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    viewQueryFn(flags, component);
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+function executeContentQueries(tView, tNode, lView) {
+  if (isContentQueryHost(tNode)) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      const start = tNode.directiveStart;
+      const end = tNode.directiveEnd;
+      for (let directiveIndex = start; directiveIndex < end; directiveIndex++) {
+        const def = tView.data[directiveIndex];
+        if (def.contentQueries) {
+          const directiveInstance = lView[directiveIndex];
+          ngDevMode && assertDefined(directiveIndex, "Incorrect reference to a directive defining a content query");
+          def.contentQueries(1, directiveInstance, directiveIndex);
+        }
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}
+var ViewEncapsulation;
+(function(ViewEncapsulation3) {
+  ViewEncapsulation3[ViewEncapsulation3["Emulated"] = 0] = "Emulated";
+  ViewEncapsulation3[ViewEncapsulation3["None"] = 2] = "None";
+  ViewEncapsulation3[ViewEncapsulation3["ShadowDom"] = 3] = "ShadowDom";
+})(ViewEncapsulation || (ViewEncapsulation = {}));
+var policy$1;
+function getPolicy$1() {
+  if (policy$1 === void 0) {
+    policy$1 = null;
+    if (_global.trustedTypes) {
+      try {
+        policy$1 = _global.trustedTypes.createPolicy("angular", {
+          createHTML: (s) => s,
+          createScript: (s) => s,
+          createScriptURL: (s) => s
+        });
+      } catch {
+      }
+    }
+  }
+  return policy$1;
+}
+function trustedHTMLFromString(html) {
+  return getPolicy$1()?.createHTML(html) || html;
+}
+function trustedScriptURLFromString(url) {
+  return getPolicy$1()?.createScriptURL(url) || url;
+}
+var policy;
+function getPolicy() {
+  if (policy === void 0) {
+    policy = null;
+    if (_global.trustedTypes) {
+      try {
+        policy = _global.trustedTypes.createPolicy("angular#unsafe-bypass", {
+          createHTML: (s) => s,
+          createScript: (s) => s,
+          createScriptURL: (s) => s
+        });
+      } catch {
+      }
+    }
+  }
+  return policy;
+}
+function trustedHTMLFromStringBypass(html) {
+  return getPolicy()?.createHTML(html) || html;
+}
+function trustedScriptFromStringBypass(script) {
+  return getPolicy()?.createScript(script) || script;
+}
+function trustedScriptURLFromStringBypass(url) {
+  return getPolicy()?.createScriptURL(url) || url;
+}
+var SafeValueImpl = class {
+  changingThisBreaksApplicationSecurity;
+  constructor(changingThisBreaksApplicationSecurity) {
+    this.changingThisBreaksApplicationSecurity = changingThisBreaksApplicationSecurity;
+  }
+  toString() {
+    return `SafeValue must use [property]=binding: ${this.changingThisBreaksApplicationSecurity} (see ${XSS_SECURITY_URL})`;
+  }
+};
+var SafeHtmlImpl = class extends SafeValueImpl {
+  getTypeName() {
+    return "HTML";
+  }
+};
+var SafeStyleImpl = class extends SafeValueImpl {
+  getTypeName() {
+    return "Style";
+  }
+};
+var SafeScriptImpl = class extends SafeValueImpl {
+  getTypeName() {
+    return "Script";
+  }
+};
+var SafeUrlImpl = class extends SafeValueImpl {
+  getTypeName() {
+    return "URL";
+  }
+};
+var SafeResourceUrlImpl = class extends SafeValueImpl {
+  getTypeName() {
+    return "ResourceURL";
+  }
+};
+function unwrapSafeValue(value) {
+  return value instanceof SafeValueImpl ? value.changingThisBreaksApplicationSecurity : value;
+}
+function allowSanitizationBypassAndThrow(value, type) {
+  const actualType = getSanitizationBypassType(value);
+  if (actualType != null && actualType !== type) {
+    if (actualType === "ResourceURL" && type === "URL")
+      return true;
+    throw new Error(`Required a safe ${type}, got a ${actualType} (see ${XSS_SECURITY_URL})`);
+  }
+  return actualType === type;
+}
+function getSanitizationBypassType(value) {
+  return value instanceof SafeValueImpl && value.getTypeName() || null;
+}
+function bypassSanitizationTrustHtml(trustedHtml) {
+  return new SafeHtmlImpl(trustedHtml);
+}
+function bypassSanitizationTrustStyle(trustedStyle) {
+  return new SafeStyleImpl(trustedStyle);
+}
+function bypassSanitizationTrustScript(trustedScript) {
+  return new SafeScriptImpl(trustedScript);
+}
+function bypassSanitizationTrustUrl(trustedUrl) {
+  return new SafeUrlImpl(trustedUrl);
+}
+function bypassSanitizationTrustResourceUrl(trustedResourceUrl) {
+  return new SafeResourceUrlImpl(trustedResourceUrl);
+}
+function getInertBodyHelper(defaultDoc) {
+  const inertDocumentHelper = new InertDocumentHelper(defaultDoc);
+  return isDOMParserAvailable() ? new DOMParserHelper(inertDocumentHelper) : inertDocumentHelper;
+}
+var DOMParserHelper = class {
+  inertDocumentHelper;
+  constructor(inertDocumentHelper) {
+    this.inertDocumentHelper = inertDocumentHelper;
+  }
+  getInertBodyElement(html) {
+    html = "<body><remove></remove>" + html;
+    try {
+      const body = new window.DOMParser().parseFromString(trustedHTMLFromString(html), "text/html").body;
+      if (body === null) {
+        return this.inertDocumentHelper.getInertBodyElement(html);
+      }
+      body.firstChild?.remove();
+      return body;
+    } catch {
+      return null;
+    }
+  }
+};
+var InertDocumentHelper = class {
+  defaultDoc;
+  inertDocument;
+  constructor(defaultDoc) {
+    this.defaultDoc = defaultDoc;
+    this.inertDocument = this.defaultDoc.implementation.createHTMLDocument("sanitization-inert");
+  }
+  getInertBodyElement(html) {
+    const templateEl = this.inertDocument.createElement("template");
+    templateEl.innerHTML = trustedHTMLFromString(html);
+    return templateEl;
+  }
+};
+function isDOMParserAvailable() {
+  try {
+    return !!new window.DOMParser().parseFromString(trustedHTMLFromString(""), "text/html");
+  } catch {
+    return false;
+  }
+}
+var SAFE_URL_PATTERN = /^(?!javascript:)(?:[a-z0-9+.-]+:|[^&:\/?#]*(?:[\/?#]|$))/i;
+function _sanitizeUrl(url) {
+  url = String(url);
+  if (url.match(SAFE_URL_PATTERN))
+    return url;
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    console.warn(`WARNING: sanitizing unsafe URL value ${url} (see ${XSS_SECURITY_URL})`);
+  }
+  return "unsafe:" + url;
+}
+function tagSet(tags) {
+  const res = {};
+  for (const t of tags.split(","))
+    res[t] = true;
+  return res;
+}
+function merge3(...sets) {
+  const res = {};
+  for (const s of sets) {
+    for (const v in s) {
+      if (s.hasOwnProperty(v))
+        res[v] = true;
+    }
+  }
+  return res;
+}
+var VOID_ELEMENTS = tagSet("area,br,col,hr,img,wbr");
+var OPTIONAL_END_TAG_BLOCK_ELEMENTS = tagSet("colgroup,dd,dt,li,p,tbody,td,tfoot,th,thead,tr");
+var OPTIONAL_END_TAG_INLINE_ELEMENTS = tagSet("rp,rt");
+var OPTIONAL_END_TAG_ELEMENTS = merge3(OPTIONAL_END_TAG_INLINE_ELEMENTS, OPTIONAL_END_TAG_BLOCK_ELEMENTS);
+var BLOCK_ELEMENTS = merge3(OPTIONAL_END_TAG_BLOCK_ELEMENTS, tagSet("address,article,aside,blockquote,caption,center,del,details,dialog,dir,div,dl,figure,figcaption,footer,h1,h2,h3,h4,h5,h6,header,hgroup,hr,ins,main,map,menu,nav,ol,pre,section,summary,table,ul"));
+var INLINE_ELEMENTS = merge3(OPTIONAL_END_TAG_INLINE_ELEMENTS, tagSet("a,abbr,acronym,audio,b,bdi,bdo,big,br,cite,code,del,dfn,em,font,i,img,ins,kbd,label,map,mark,picture,q,ruby,rp,rt,s,samp,small,source,span,strike,strong,sub,sup,time,track,tt,u,var,video"));
+var VALID_ELEMENTS = merge3(VOID_ELEMENTS, BLOCK_ELEMENTS, INLINE_ELEMENTS, OPTIONAL_END_TAG_ELEMENTS);
+var URI_ATTRS = tagSet("background,cite,href,itemtype,longdesc,poster,src,xlink:href");
+var HTML_ATTRS = tagSet("abbr,accesskey,align,alt,autoplay,axis,bgcolor,border,cellpadding,cellspacing,class,clear,color,cols,colspan,compact,controls,coords,datetime,default,dir,download,face,headers,height,hidden,hreflang,hspace,ismap,itemscope,itemprop,kind,label,lang,language,loop,media,muted,nohref,nowrap,open,preload,rel,rev,role,rows,rowspan,rules,scope,scrolling,shape,size,sizes,span,srclang,srcset,start,summary,tabindex,target,title,translate,type,usemap,valign,value,vspace,width");
+var ARIA_ATTRS = tagSet("aria-activedescendant,aria-atomic,aria-autocomplete,aria-busy,aria-checked,aria-colcount,aria-colindex,aria-colspan,aria-controls,aria-current,aria-describedby,aria-details,aria-disabled,aria-dropeffect,aria-errormessage,aria-expanded,aria-flowto,aria-grabbed,aria-haspopup,aria-hidden,aria-invalid,aria-keyshortcuts,aria-label,aria-labelledby,aria-level,aria-live,aria-modal,aria-multiline,aria-multiselectable,aria-orientation,aria-owns,aria-placeholder,aria-posinset,aria-pressed,aria-readonly,aria-relevant,aria-required,aria-roledescription,aria-rowcount,aria-rowindex,aria-rowspan,aria-selected,aria-setsize,aria-sort,aria-valuemax,aria-valuemin,aria-valuenow,aria-valuetext");
+var VALID_ATTRS = merge3(URI_ATTRS, HTML_ATTRS, ARIA_ATTRS);
+var SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS = tagSet("script,style,template");
+var SanitizingHtmlSerializer = class {
+  // Explicitly track if something was stripped, to avoid accidentally warning of sanitization just
+  // because characters were re-encoded.
+  sanitizedSomething = false;
+  buf = [];
+  sanitizeChildren(el) {
+    let current = el.firstChild;
+    let traverseContent = true;
+    let parentNodes = [];
+    while (current) {
+      if (current.nodeType === Node.ELEMENT_NODE) {
+        traverseContent = this.startElement(current);
+      } else if (current.nodeType === Node.TEXT_NODE) {
+        this.chars(current.nodeValue);
+      } else {
+        this.sanitizedSomething = true;
+      }
+      if (traverseContent && current.firstChild) {
+        parentNodes.push(current);
+        current = getFirstChild(current);
+        continue;
+      }
+      while (current) {
+        if (current.nodeType === Node.ELEMENT_NODE) {
+          this.endElement(current);
+        }
+        let next = getNextSibling(current);
+        if (next) {
+          current = next;
+          break;
+        }
+        current = parentNodes.pop();
+      }
+    }
+    return this.buf.join("");
+  }
+  /**
+   * Sanitizes an opening element tag (if valid) and returns whether the element's contents should
+   * be traversed. Element content must always be traversed (even if the element itself is not
+   * valid/safe), unless the element is one of `SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS`.
+   *
+   * @param element The element to sanitize.
+   * @return True if the element's contents should be traversed.
+   */
+  startElement(element) {
+    const tagName = getNodeName(element).toLowerCase();
+    if (!VALID_ELEMENTS.hasOwnProperty(tagName)) {
+      this.sanitizedSomething = true;
+      return !SKIP_TRAVERSING_CONTENT_IF_INVALID_ELEMENTS.hasOwnProperty(tagName);
+    }
+    this.buf.push("<");
+    this.buf.push(tagName);
+    const elAttrs = element.attributes;
+    for (let i = 0; i < elAttrs.length; i++) {
+      const elAttr = elAttrs.item(i);
+      const attrName = elAttr.name;
+      const lower = attrName.toLowerCase();
+      if (!VALID_ATTRS.hasOwnProperty(lower)) {
+        this.sanitizedSomething = true;
+        continue;
+      }
+      let value = elAttr.value;
+      if (URI_ATTRS[lower])
+        value = _sanitizeUrl(value);
+      this.buf.push(" ", attrName, '="', encodeEntities(value), '"');
+    }
+    this.buf.push(">");
+    return true;
+  }
+  endElement(current) {
+    const tagName = getNodeName(current).toLowerCase();
+    if (VALID_ELEMENTS.hasOwnProperty(tagName) && !VOID_ELEMENTS.hasOwnProperty(tagName)) {
+      this.buf.push("</");
+      this.buf.push(tagName);
+      this.buf.push(">");
+    }
+  }
+  chars(chars) {
+    this.buf.push(encodeEntities(chars));
+  }
+};
+function isClobberedElement(parentNode, childNode) {
+  return (parentNode.compareDocumentPosition(childNode) & Node.DOCUMENT_POSITION_CONTAINED_BY) !== Node.DOCUMENT_POSITION_CONTAINED_BY;
+}
+function getNextSibling(node) {
+  const nextSibling = node.nextSibling;
+  if (nextSibling && node !== nextSibling.previousSibling) {
+    throw clobberedElementError(nextSibling);
+  }
+  return nextSibling;
+}
+function getFirstChild(node) {
+  const firstChild = node.firstChild;
+  if (firstChild && isClobberedElement(node, firstChild)) {
+    throw clobberedElementError(firstChild);
+  }
+  return firstChild;
+}
+function getNodeName(node) {
+  const nodeName = node.nodeName;
+  return typeof nodeName === "string" ? nodeName : "FORM";
+}
+function clobberedElementError(node) {
+  return new Error(`Failed to sanitize html because the element is clobbered: ${node.outerHTML}`);
+}
+var SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g;
+var NON_ALPHANUMERIC_REGEXP = /([^\#-~ |!])/g;
+function encodeEntities(value) {
+  return value.replace(/&/g, "&amp;").replace(SURROGATE_PAIR_REGEXP, function(match) {
+    const hi = match.charCodeAt(0);
+    const low = match.charCodeAt(1);
+    return "&#" + ((hi - 55296) * 1024 + (low - 56320) + 65536) + ";";
+  }).replace(NON_ALPHANUMERIC_REGEXP, function(match) {
+    return "&#" + match.charCodeAt(0) + ";";
+  }).replace(/</g, "&lt;").replace(/>/g, "&gt;");
+}
+var inertBodyHelper;
+function _sanitizeHtml(defaultDoc, unsafeHtmlInput) {
+  let inertBodyElement = null;
+  try {
+    inertBodyHelper = inertBodyHelper || getInertBodyHelper(defaultDoc);
+    let unsafeHtml = unsafeHtmlInput ? String(unsafeHtmlInput) : "";
+    inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);
+    let mXSSAttempts = 5;
+    let parsedHtml = unsafeHtml;
+    do {
+      if (mXSSAttempts === 0) {
+        throw new Error("Failed to sanitize html because the input is unstable");
+      }
+      mXSSAttempts--;
+      unsafeHtml = parsedHtml;
+      parsedHtml = inertBodyElement.innerHTML;
+      inertBodyElement = inertBodyHelper.getInertBodyElement(unsafeHtml);
+    } while (unsafeHtml !== parsedHtml);
+    const sanitizer = new SanitizingHtmlSerializer();
+    const safeHtml = sanitizer.sanitizeChildren(getTemplateContent(inertBodyElement) || inertBodyElement);
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && sanitizer.sanitizedSomething) {
+      console.warn(`WARNING: sanitizing HTML stripped some content, see ${XSS_SECURITY_URL}`);
+    }
+    return trustedHTMLFromString(safeHtml);
+  } finally {
+    if (inertBodyElement) {
+      const parent = getTemplateContent(inertBodyElement) || inertBodyElement;
+      while (parent.firstChild) {
+        parent.firstChild.remove();
+      }
+    }
+  }
+}
+function getTemplateContent(el) {
+  return "content" in el && isTemplateElement(el) ? el.content : null;
+}
+function isTemplateElement(el) {
+  return el.nodeType === Node.ELEMENT_NODE && el.nodeName === "TEMPLATE";
+}
+var SecurityContext;
+(function(SecurityContext2) {
+  SecurityContext2[SecurityContext2["NONE"] = 0] = "NONE";
+  SecurityContext2[SecurityContext2["HTML"] = 1] = "HTML";
+  SecurityContext2[SecurityContext2["STYLE"] = 2] = "STYLE";
+  SecurityContext2[SecurityContext2["SCRIPT"] = 3] = "SCRIPT";
+  SecurityContext2[SecurityContext2["URL"] = 4] = "URL";
+  SecurityContext2[SecurityContext2["RESOURCE_URL"] = 5] = "RESOURCE_URL";
+})(SecurityContext || (SecurityContext = {}));
+function ɵɵsanitizeHtml(unsafeHtml) {
+  const sanitizer = getSanitizer();
+  if (sanitizer) {
+    return trustedHTMLFromStringBypass(sanitizer.sanitize(SecurityContext.HTML, unsafeHtml) || "");
+  }
+  if (allowSanitizationBypassAndThrow(
+    unsafeHtml,
+    "HTML"
+    /* BypassType.Html */
+  )) {
+    return trustedHTMLFromStringBypass(unwrapSafeValue(unsafeHtml));
+  }
+  return _sanitizeHtml(getDocument(), renderStringify(unsafeHtml));
+}
+function ɵɵsanitizeStyle(unsafeStyle) {
+  const sanitizer = getSanitizer();
+  if (sanitizer) {
+    return sanitizer.sanitize(SecurityContext.STYLE, unsafeStyle) || "";
+  }
+  if (allowSanitizationBypassAndThrow(
+    unsafeStyle,
+    "Style"
+    /* BypassType.Style */
+  )) {
+    return unwrapSafeValue(unsafeStyle);
+  }
+  return renderStringify(unsafeStyle);
+}
+function ɵɵsanitizeUrl(unsafeUrl) {
+  const sanitizer = getSanitizer();
+  if (sanitizer) {
+    return sanitizer.sanitize(SecurityContext.URL, unsafeUrl) || "";
+  }
+  if (allowSanitizationBypassAndThrow(
+    unsafeUrl,
+    "URL"
+    /* BypassType.Url */
+  )) {
+    return unwrapSafeValue(unsafeUrl);
+  }
+  return _sanitizeUrl(renderStringify(unsafeUrl));
+}
+function ɵɵsanitizeResourceUrl(unsafeResourceUrl) {
+  const sanitizer = getSanitizer();
+  if (sanitizer) {
+    return trustedScriptURLFromStringBypass(sanitizer.sanitize(SecurityContext.RESOURCE_URL, unsafeResourceUrl) || "");
+  }
+  if (allowSanitizationBypassAndThrow(
+    unsafeResourceUrl,
+    "ResourceURL"
+    /* BypassType.ResourceUrl */
+  )) {
+    return trustedScriptURLFromStringBypass(unwrapSafeValue(unsafeResourceUrl));
+  }
+  throw new RuntimeError(904, ngDevMode && `unsafe value used in a resource URL context (see ${XSS_SECURITY_URL})`);
+}
+function ɵɵsanitizeScript(unsafeScript) {
+  const sanitizer = getSanitizer();
+  if (sanitizer) {
+    return trustedScriptFromStringBypass(sanitizer.sanitize(SecurityContext.SCRIPT, unsafeScript) || "");
+  }
+  if (allowSanitizationBypassAndThrow(
+    unsafeScript,
+    "Script"
+    /* BypassType.Script */
+  )) {
+    return trustedScriptFromStringBypass(unwrapSafeValue(unsafeScript));
+  }
+  throw new RuntimeError(905, ngDevMode && "unsafe value used in a script context");
+}
+function ɵɵtrustConstantHtml(html) {
+  if (ngDevMode && (!Array.isArray(html) || !Array.isArray(html.raw) || html.length !== 1)) {
+    throw new Error(`Unexpected interpolation in trusted HTML constant: ${html.join("?")}`);
+  }
+  return trustedHTMLFromString(html[0]);
+}
+function ɵɵtrustConstantResourceUrl(url) {
+  if (ngDevMode && (!Array.isArray(url) || !Array.isArray(url.raw) || url.length !== 1)) {
+    throw new Error(`Unexpected interpolation in trusted URL constant: ${url.join("?")}`);
+  }
+  return trustedScriptURLFromString(url[0]);
+}
+function getUrlSanitizer(tag, prop) {
+  if (prop === "src" && (tag === "embed" || tag === "frame" || tag === "iframe" || tag === "media" || tag === "script") || prop === "href" && (tag === "base" || tag === "link")) {
+    return ɵɵsanitizeResourceUrl;
+  }
+  return ɵɵsanitizeUrl;
+}
+function ɵɵsanitizeUrlOrResourceUrl(unsafeUrl, tag, prop) {
+  return getUrlSanitizer(tag, prop)(unsafeUrl);
+}
+function validateAgainstEventProperties(name) {
+  if (name.toLowerCase().startsWith("on")) {
+    const errorMessage = `Binding to event property '${name}' is disallowed for security reasons, please use (${name.slice(2)})=...
+If '${name}' is a directive input, make sure the directive is imported by the current module.`;
+    throw new RuntimeError(306, errorMessage);
+  }
+}
+function validateAgainstEventAttributes(name) {
+  if (name.toLowerCase().startsWith("on")) {
+    const errorMessage = `Binding to event attribute '${name}' is disallowed for security reasons, please use (${name.slice(2)})=...`;
+    throw new RuntimeError(306, errorMessage);
+  }
+}
+function getSanitizer() {
+  const lView = getLView();
+  return lView && lView[ENVIRONMENT].sanitizer;
+}
+var COMMENT_DISALLOWED = /^>|^->|<!--|-->|--!>|<!-$/g;
+var COMMENT_DELIMITER = /(<|>)/g;
+var COMMENT_DELIMITER_ESCAPED = "​$1​";
+function escapeCommentText(value) {
+  return value.replace(COMMENT_DISALLOWED, (text) => text.replace(COMMENT_DELIMITER, COMMENT_DELIMITER_ESCAPED));
+}
+var NG_REFLECT_ATTRS_FLAG_DEFAULT = false;
+var NG_REFLECT_ATTRS_FLAG = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "NG_REFLECT_FLAG" : "", {
+  providedIn: "root",
+  factory: () => NG_REFLECT_ATTRS_FLAG_DEFAULT
+});
+function provideNgReflectAttributes() {
+  const providers = typeof ngDevMode === "undefined" || ngDevMode ? [
+    {
+      provide: NG_REFLECT_ATTRS_FLAG,
+      useValue: true
+    }
+  ] : [];
+  return makeEnvironmentProviders(providers);
+}
+function normalizeDebugBindingName(name) {
+  name = camelCaseToDashCase(name.replace(/[$@]/g, "_"));
+  return `ng-reflect-${name}`;
+}
+var CAMEL_CASE_REGEXP = /([A-Z])/g;
+function camelCaseToDashCase(input2) {
+  return input2.replace(CAMEL_CASE_REGEXP, (...m) => "-" + m[1].toLowerCase());
+}
+function normalizeDebugBindingValue(value) {
+  try {
+    return value != null ? value.toString().slice(0, 30) : value;
+  } catch (e) {
+    return "[ERROR] Exception while trying to serialize the value";
+  }
+}
+var CUSTOM_ELEMENTS_SCHEMA = {
+  name: "custom-elements"
+};
+var NO_ERRORS_SCHEMA = {
+  name: "no-errors-schema"
+};
+var shouldThrowErrorOnUnknownElement = false;
+function ɵsetUnknownElementStrictMode(shouldThrow) {
+  shouldThrowErrorOnUnknownElement = shouldThrow;
+}
+function ɵgetUnknownElementStrictMode() {
+  return shouldThrowErrorOnUnknownElement;
+}
+var shouldThrowErrorOnUnknownProperty = false;
+function ɵsetUnknownPropertyStrictMode(shouldThrow) {
+  shouldThrowErrorOnUnknownProperty = shouldThrow;
+}
+function ɵgetUnknownPropertyStrictMode() {
+  return shouldThrowErrorOnUnknownProperty;
+}
+function validateElementIsKnown(element, lView, tagName, schemas, hasDirectives) {
+  if (schemas === null)
+    return;
+  if (!hasDirectives && tagName !== null) {
+    const isUnknown = (
+      // Note that we can't check for `typeof HTMLUnknownElement === 'function'` because
+      // Domino doesn't expose HTMLUnknownElement globally.
+      typeof HTMLUnknownElement !== "undefined" && HTMLUnknownElement && element instanceof HTMLUnknownElement || typeof customElements !== "undefined" && tagName.indexOf("-") > -1 && !customElements.get(tagName)
+    );
+    if (isUnknown && !matchingSchemas(schemas, tagName)) {
+      const isHostStandalone = isHostComponentStandalone(lView);
+      const templateLocation = getTemplateLocationDetails(lView);
+      const schemas2 = `'${isHostStandalone ? "@Component" : "@NgModule"}.schemas'`;
+      let message = `'${tagName}' is not a known element${templateLocation}:
+`;
+      message += `1. If '${tagName}' is an Angular component, then verify that it is ${isHostStandalone ? "included in the '@Component.imports' of this component" : "a part of an @NgModule where this component is declared"}.
+`;
+      if (tagName && tagName.indexOf("-") > -1) {
+        message += `2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas2} of this component to suppress this message.`;
+      } else {
+        message += `2. To allow any element add 'NO_ERRORS_SCHEMA' to the ${schemas2} of this component.`;
+      }
+      if (shouldThrowErrorOnUnknownElement) {
+        throw new RuntimeError(304, message);
+      } else {
+        console.error(formatRuntimeError(304, message));
+      }
+    }
+  }
+}
+function isPropertyValid(element, propName, tagName, schemas) {
+  if (schemas === null)
+    return true;
+  if (matchingSchemas(schemas, tagName) || propName in element || isAnimationProp(propName)) {
+    return true;
+  }
+  return typeof Node === "undefined" || Node === null || !(element instanceof Node);
+}
+function handleUnknownPropertyError(propName, tagName, nodeType, lView) {
+  if (!tagName && nodeType === 4) {
+    tagName = "ng-template";
+  }
+  const isHostStandalone = isHostComponentStandalone(lView);
+  const templateLocation = getTemplateLocationDetails(lView);
+  let message = `Can't bind to '${propName}' since it isn't a known property of '${tagName}'${templateLocation}.`;
+  const schemas = `'${isHostStandalone ? "@Component" : "@NgModule"}.schemas'`;
+  const importLocation = isHostStandalone ? "included in the '@Component.imports' of this component" : "a part of an @NgModule where this component is declared";
+  if (KNOWN_CONTROL_FLOW_DIRECTIVES.has(propName)) {
+    const correspondingImport = KNOWN_CONTROL_FLOW_DIRECTIVES.get(propName);
+    message += `
+If the '${propName}' is an Angular control flow directive, please make sure that either the '${correspondingImport}' directive or the 'CommonModule' is ${importLocation}.`;
+  } else {
+    message += `
+1. If '${tagName}' is an Angular component and it has the '${propName}' input, then verify that it is ${importLocation}.`;
+    if (tagName && tagName.indexOf("-") > -1) {
+      message += `
+2. If '${tagName}' is a Web Component then add 'CUSTOM_ELEMENTS_SCHEMA' to the ${schemas} of this component to suppress this message.`;
+      message += `
+3. To allow any property add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
+    } else {
+      message += `
+2. To allow any property add 'NO_ERRORS_SCHEMA' to the ${schemas} of this component.`;
+    }
+  }
+  reportUnknownPropertyError(message);
+}
+function reportUnknownPropertyError(message) {
+  if (shouldThrowErrorOnUnknownProperty) {
+    throw new RuntimeError(303, message);
+  } else {
+    console.error(formatRuntimeError(303, message));
+  }
+}
+function getDeclarationComponentDef(lView) {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
+  const context2 = declarationLView[CONTEXT];
+  if (!context2)
+    return null;
+  return context2.constructor ? getComponentDef(context2.constructor) : null;
+}
+function isHostComponentStandalone(lView) {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  const componentDef = getDeclarationComponentDef(lView);
+  return !!componentDef?.standalone;
+}
+function getTemplateLocationDetails(lView) {
+  !ngDevMode && throwError2("Must never be called in production mode");
+  const hostComponentDef = getDeclarationComponentDef(lView);
+  const componentClassName = hostComponentDef?.type?.name;
+  return componentClassName ? ` (used in the '${componentClassName}' component template)` : "";
+}
+var KNOWN_CONTROL_FLOW_DIRECTIVES = /* @__PURE__ */ new Map([
+  ["ngIf", "NgIf"],
+  ["ngFor", "NgFor"],
+  ["ngSwitchCase", "NgSwitchCase"],
+  ["ngSwitchDefault", "NgSwitchDefault"]
+]);
+function matchingSchemas(schemas, tagName) {
+  if (schemas !== null) {
+    for (let i = 0; i < schemas.length; i++) {
+      const schema = schemas[i];
+      if (schema === NO_ERRORS_SCHEMA || schema === CUSTOM_ELEMENTS_SCHEMA && tagName && tagName.indexOf("-") > -1) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+function ɵɵresolveWindow(element) {
+  return element.ownerDocument.defaultView;
+}
+function ɵɵresolveDocument(element) {
+  return element.ownerDocument;
+}
+function ɵɵresolveBody(element) {
+  return element.ownerDocument.body;
+}
+var INTERPOLATION_DELIMITER = `�`;
+function maybeUnwrapFn(value) {
+  if (value instanceof Function) {
+    return value();
+  } else {
+    return value;
+  }
+}
+var VALUE_STRING_LENGTH_LIMIT = 200;
+function assertStandaloneComponentType(type) {
+  assertComponentDef(type);
+  const componentDef = getComponentDef(type);
+  if (!componentDef.standalone) {
+    throw new RuntimeError(907, `The ${stringifyForError(type)} component is not marked as standalone, but Angular expects to have a standalone component here. Please make sure the ${stringifyForError(type)} component has the \`standalone: true\` flag in the decorator.`);
+  }
+}
+function assertComponentDef(type) {
+  if (!getComponentDef(type)) {
+    throw new RuntimeError(906, `The ${stringifyForError(type)} is not an Angular component, make sure it has the \`@Component\` decorator.`);
+  }
+}
+function throwMultipleComponentError(tNode, first2, second) {
+  throw new RuntimeError(-300, `Multiple components match node with tagname ${tNode.value}: ${stringifyForError(first2)} and ${stringifyForError(second)}`);
+}
+function throwErrorIfNoChangesMode(creationMode, oldValue, currValue, propName, lView) {
+  const hostComponentDef = getDeclarationComponentDef(lView);
+  const componentClassName = hostComponentDef?.type?.name;
+  const field = propName ? ` for '${propName}'` : "";
+  let msg = `ExpressionChangedAfterItHasBeenCheckedError: Expression has changed after it was checked. Previous value${field}: '${formatValue(oldValue)}'. Current value: '${formatValue(currValue)}'.${componentClassName ? ` Expression location: ${componentClassName} component` : ""}`;
+  if (creationMode) {
+    msg += ` It seems like the view has been created after its parent and its children have been dirty checked. Has it been created in a change detection hook?`;
+  }
+  throw new RuntimeError(-100, msg);
+}
+function formatValue(value) {
+  let strValue = String(value);
+  try {
+    if (Array.isArray(value) || strValue === "[object Object]") {
+      strValue = JSON.stringify(value);
+    }
+  } catch (error) {
+  }
+  return strValue.length > VALUE_STRING_LENGTH_LIMIT ? strValue.substring(0, VALUE_STRING_LENGTH_LIMIT) + "…" : strValue;
+}
+function constructDetailsForInterpolation(lView, rootIndex, expressionIndex, meta, changedValue) {
+  const [propName, prefix, ...chunks] = meta.split(INTERPOLATION_DELIMITER);
+  let oldValue = prefix, newValue = prefix;
+  for (let i = 0; i < chunks.length; i++) {
+    const slotIdx = rootIndex + i;
+    oldValue += `${lView[slotIdx]}${chunks[i]}`;
+    newValue += `${slotIdx === expressionIndex ? changedValue : lView[slotIdx]}${chunks[i]}`;
+  }
+  return { propName, oldValue, newValue };
+}
+function getExpressionChangedErrorDetails(lView, bindingIndex, oldValue, newValue) {
+  const tData = lView[TVIEW].data;
+  const metadata = tData[bindingIndex];
+  if (typeof metadata === "string") {
+    if (metadata.indexOf(INTERPOLATION_DELIMITER) > -1) {
+      return constructDetailsForInterpolation(lView, bindingIndex, bindingIndex, metadata, newValue);
+    }
+    return { propName: metadata, oldValue, newValue };
+  }
+  if (metadata === null) {
+    let idx = bindingIndex - 1;
+    while (typeof tData[idx] !== "string" && tData[idx + 1] === null) {
+      idx--;
+    }
+    const meta = tData[idx];
+    if (typeof meta === "string") {
+      const matches = meta.match(new RegExp(INTERPOLATION_DELIMITER, "g"));
+      if (matches && matches.length - 1 > bindingIndex - idx) {
+        return constructDetailsForInterpolation(lView, idx, bindingIndex, meta, newValue);
+      }
+    }
+  }
+  return { propName: void 0, oldValue, newValue };
+}
+function classIndexOf(className, classToSearch, startingIndex) {
+  ngDevMode && assertNotEqual(classToSearch, "", 'can not look for "" string.');
+  let end = className.length;
+  while (true) {
+    const foundIndex = className.indexOf(classToSearch, startingIndex);
+    if (foundIndex === -1)
+      return foundIndex;
+    if (foundIndex === 0 || className.charCodeAt(foundIndex - 1) <= 32) {
+      const length = classToSearch.length;
+      if (foundIndex + length === end || className.charCodeAt(foundIndex + length) <= 32) {
+        return foundIndex;
+      }
+    }
+    startingIndex = foundIndex + 1;
+  }
+}
+var NG_TEMPLATE_SELECTOR = "ng-template";
+function isCssClassMatching(tNode, attrs, cssClassToMatch, isProjectionMode) {
+  ngDevMode && assertEqual(cssClassToMatch, cssClassToMatch.toLowerCase(), "Class name expected to be lowercase.");
+  let i = 0;
+  if (isProjectionMode) {
+    for (; i < attrs.length && typeof attrs[i] === "string"; i += 2) {
+      if (attrs[i] === "class" && classIndexOf(attrs[i + 1].toLowerCase(), cssClassToMatch, 0) !== -1) {
+        return true;
+      }
+    }
+  } else if (isInlineTemplate(tNode)) {
+    return false;
+  }
+  i = attrs.indexOf(1, i);
+  if (i > -1) {
+    let item;
+    while (++i < attrs.length && typeof (item = attrs[i]) === "string") {
+      if (item.toLowerCase() === cssClassToMatch) {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+function isInlineTemplate(tNode) {
+  return tNode.type === 4 && tNode.value !== NG_TEMPLATE_SELECTOR;
+}
+function hasTagAndTypeMatch(tNode, currentSelector, isProjectionMode) {
+  const tagNameToCompare = tNode.type === 4 && !isProjectionMode ? NG_TEMPLATE_SELECTOR : tNode.value;
+  return currentSelector === tagNameToCompare;
+}
+function isNodeMatchingSelector(tNode, selector, isProjectionMode) {
+  ngDevMode && assertDefined(selector[0], "Selector should have a tag name");
+  let mode = 4;
+  const nodeAttrs = tNode.attrs;
+  const nameOnlyMarkerIdx = nodeAttrs !== null ? getNameOnlyMarkerIndex(nodeAttrs) : 0;
+  let skipToNextSelector = false;
+  for (let i = 0; i < selector.length; i++) {
+    const current = selector[i];
+    if (typeof current === "number") {
+      if (!skipToNextSelector && !isPositive(mode) && !isPositive(current)) {
+        return false;
+      }
+      if (skipToNextSelector && isPositive(current))
+        continue;
+      skipToNextSelector = false;
+      mode = current | mode & 1;
+      continue;
+    }
+    if (skipToNextSelector)
+      continue;
+    if (mode & 4) {
+      mode = 2 | mode & 1;
+      if (current !== "" && !hasTagAndTypeMatch(tNode, current, isProjectionMode) || current === "" && selector.length === 1) {
+        if (isPositive(mode))
+          return false;
+        skipToNextSelector = true;
+      }
+    } else if (mode & 8) {
+      if (nodeAttrs === null || !isCssClassMatching(tNode, nodeAttrs, current, isProjectionMode)) {
+        if (isPositive(mode))
+          return false;
+        skipToNextSelector = true;
+      }
+    } else {
+      const selectorAttrValue = selector[++i];
+      const attrIndexInNode = findAttrIndexInNode(current, nodeAttrs, isInlineTemplate(tNode), isProjectionMode);
+      if (attrIndexInNode === -1) {
+        if (isPositive(mode))
+          return false;
+        skipToNextSelector = true;
+        continue;
+      }
+      if (selectorAttrValue !== "") {
+        let nodeAttrValue;
+        if (attrIndexInNode > nameOnlyMarkerIdx) {
+          nodeAttrValue = "";
+        } else {
+          ngDevMode && assertNotEqual(nodeAttrs[attrIndexInNode], 0, "We do not match directives on namespaced attributes");
+          nodeAttrValue = nodeAttrs[attrIndexInNode + 1].toLowerCase();
+        }
+        if (mode & 2 && selectorAttrValue !== nodeAttrValue) {
+          if (isPositive(mode))
+            return false;
+          skipToNextSelector = true;
+        }
+      }
+    }
+  }
+  return isPositive(mode) || skipToNextSelector;
+}
+function isPositive(mode) {
+  return (mode & 1) === 0;
+}
+function findAttrIndexInNode(name, attrs, isInlineTemplate2, isProjectionMode) {
+  if (attrs === null)
+    return -1;
+  let i = 0;
+  if (isProjectionMode || !isInlineTemplate2) {
+    let bindingsMode = false;
+    while (i < attrs.length) {
+      const maybeAttrName = attrs[i];
+      if (maybeAttrName === name) {
+        return i;
+      } else if (maybeAttrName === 3 || maybeAttrName === 6) {
+        bindingsMode = true;
+      } else if (maybeAttrName === 1 || maybeAttrName === 2) {
+        let value = attrs[++i];
+        while (typeof value === "string") {
+          value = attrs[++i];
+        }
+        continue;
+      } else if (maybeAttrName === 4) {
+        break;
+      } else if (maybeAttrName === 0) {
+        i += 4;
+        continue;
+      }
+      i += bindingsMode ? 1 : 2;
+    }
+    return -1;
+  } else {
+    return matchTemplateAttribute(attrs, name);
+  }
+}
+function isNodeMatchingSelectorList(tNode, selector, isProjectionMode = false) {
+  for (let i = 0; i < selector.length; i++) {
+    if (isNodeMatchingSelector(tNode, selector[i], isProjectionMode)) {
+      return true;
+    }
+  }
+  return false;
+}
+function getProjectAsAttrValue(tNode) {
+  const nodeAttrs = tNode.attrs;
+  if (nodeAttrs != null) {
+    const ngProjectAsAttrIdx = nodeAttrs.indexOf(
+      5
+      /* AttributeMarker.ProjectAs */
+    );
+    if ((ngProjectAsAttrIdx & 1) === 0) {
+      return nodeAttrs[ngProjectAsAttrIdx + 1];
+    }
+  }
+  return null;
+}
+function getNameOnlyMarkerIndex(nodeAttrs) {
+  for (let i = 0; i < nodeAttrs.length; i++) {
+    const nodeAttr = nodeAttrs[i];
+    if (isNameOnlyAttributeMarker(nodeAttr)) {
+      return i;
+    }
+  }
+  return nodeAttrs.length;
+}
+function matchTemplateAttribute(attrs, name) {
+  let i = attrs.indexOf(
+    4
+    /* AttributeMarker.Template */
+  );
+  if (i > -1) {
+    i++;
+    while (i < attrs.length) {
+      const attr = attrs[i];
+      if (typeof attr === "number")
+        return -1;
+      if (attr === name)
+        return i;
+      i++;
+    }
+  }
+  return -1;
+}
+function isSelectorInSelectorList(selector, list) {
+  selectorListLoop: for (let i = 0; i < list.length; i++) {
+    const currentSelectorInList = list[i];
+    if (selector.length !== currentSelectorInList.length) {
+      continue;
+    }
+    for (let j = 0; j < selector.length; j++) {
+      if (selector[j] !== currentSelectorInList[j]) {
+        continue selectorListLoop;
+      }
+    }
+    return true;
+  }
+  return false;
+}
+function maybeWrapInNotSelector(isNegativeMode, chunk) {
+  return isNegativeMode ? ":not(" + chunk.trim() + ")" : chunk;
+}
+function stringifyCSSSelector(selector) {
+  let result = selector[0];
+  let i = 1;
+  let mode = 2;
+  let currentChunk = "";
+  let isNegativeMode = false;
+  while (i < selector.length) {
+    let valueOrMarker = selector[i];
+    if (typeof valueOrMarker === "string") {
+      if (mode & 2) {
+        const attrValue = selector[++i];
+        currentChunk += "[" + valueOrMarker + (attrValue.length > 0 ? '="' + attrValue + '"' : "") + "]";
+      } else if (mode & 8) {
+        currentChunk += "." + valueOrMarker;
+      } else if (mode & 4) {
+        currentChunk += " " + valueOrMarker;
+      }
+    } else {
+      if (currentChunk !== "" && !isPositive(valueOrMarker)) {
+        result += maybeWrapInNotSelector(isNegativeMode, currentChunk);
+        currentChunk = "";
+      }
+      mode = valueOrMarker;
+      isNegativeMode = isNegativeMode || !isPositive(mode);
+    }
+    i++;
+  }
+  if (currentChunk !== "") {
+    result += maybeWrapInNotSelector(isNegativeMode, currentChunk);
+  }
+  return result;
+}
+function stringifyCSSSelectorList(selectorList) {
+  return selectorList.map(stringifyCSSSelector).join(",");
+}
+function extractAttrsAndClassesFromSelector(selector) {
+  const attrs = [];
+  const classes = [];
+  let i = 1;
+  let mode = 2;
+  while (i < selector.length) {
+    let valueOrMarker = selector[i];
+    if (typeof valueOrMarker === "string") {
+      if (mode === 2) {
+        if (valueOrMarker !== "") {
+          attrs.push(valueOrMarker, selector[++i]);
+        }
+      } else if (mode === 8) {
+        classes.push(valueOrMarker);
+      }
+    } else {
+      if (!isPositive(mode))
+        break;
+      mode = valueOrMarker;
+    }
+    i++;
+  }
+  if (classes.length) {
+    attrs.push(1, ...classes);
+  }
+  return attrs;
+}
+var NO_CHANGE = typeof ngDevMode === "undefined" || ngDevMode ? { __brand__: "NO_CHANGE" } : {};
+function createTextNode(renderer, value) {
+  return renderer.createText(value);
+}
+function updateTextNode(renderer, rNode, value) {
+  renderer.setValue(rNode, value);
+}
+function createCommentNode(renderer, value) {
+  return renderer.createComment(escapeCommentText(value));
+}
+function createElementNode(renderer, name, namespace) {
+  return renderer.createElement(name, namespace);
+}
+function nativeInsertBefore(renderer, parent, child, beforeNode, isMove) {
+  renderer.insertBefore(parent, child, beforeNode, isMove);
+}
+function nativeAppendChild(renderer, parent, child) {
+  ngDevMode && assertDefined(parent, "parent node must be defined");
+  renderer.appendChild(parent, child);
+}
+function nativeAppendOrInsertBefore(renderer, parent, child, beforeNode, isMove) {
+  if (beforeNode !== null) {
+    nativeInsertBefore(renderer, parent, child, beforeNode, isMove);
+  } else {
+    nativeAppendChild(renderer, parent, child);
+  }
+}
+function nativeRemoveNode(renderer, rNode, isHostElement) {
+  renderer.removeChild(null, rNode, isHostElement);
+}
+function clearElementContents(rElement) {
+  rElement.textContent = "";
+}
+function writeDirectStyle(renderer, element, newValue) {
+  ngDevMode && assertString(newValue, "'newValue' should be a string");
+  renderer.setAttribute(element, "style", newValue);
+}
+function writeDirectClass(renderer, element, newValue) {
+  ngDevMode && assertString(newValue, "'newValue' should be a string");
+  if (newValue === "") {
+    renderer.removeAttribute(element, "class");
+  } else {
+    renderer.setAttribute(element, "class", newValue);
+  }
+}
+function setupStaticAttributes(renderer, element, tNode) {
+  const { mergedAttrs, classes, styles } = tNode;
+  if (mergedAttrs !== null) {
+    setUpAttributes(renderer, element, mergedAttrs);
+  }
+  if (classes !== null) {
+    writeDirectClass(renderer, element, classes);
+  }
+  if (styles !== null) {
+    writeDirectStyle(renderer, element, styles);
+  }
+}
+function createTView(type, declTNode, templateFn, decls, vars, directives, pipes, viewQuery, schemas, constsOrFactory, ssrId) {
+  const bindingStartIndex = HEADER_OFFSET + decls;
+  const initialViewLength = bindingStartIndex + vars;
+  const blueprint = createViewBlueprint(bindingStartIndex, initialViewLength);
+  const consts = typeof constsOrFactory === "function" ? constsOrFactory() : constsOrFactory;
+  const tView = blueprint[TVIEW] = {
+    type,
+    blueprint,
+    template: templateFn,
+    queries: null,
+    viewQuery,
+    declTNode,
+    data: blueprint.slice().fill(null, bindingStartIndex),
+    bindingStartIndex,
+    expandoStartIndex: initialViewLength,
+    hostBindingOpCodes: null,
+    firstCreatePass: true,
+    firstUpdatePass: true,
+    staticViewQueries: false,
+    staticContentQueries: false,
+    preOrderHooks: null,
+    preOrderCheckHooks: null,
+    contentHooks: null,
+    contentCheckHooks: null,
+    viewHooks: null,
+    viewCheckHooks: null,
+    destroyHooks: null,
+    cleanup: null,
+    contentQueries: null,
+    components: null,
+    directiveRegistry: typeof directives === "function" ? directives() : directives,
+    pipeRegistry: typeof pipes === "function" ? pipes() : pipes,
+    firstChild: null,
+    schemas,
+    consts,
+    incompleteFirstPass: false,
+    ssrId
+  };
+  if (ngDevMode) {
+    Object.seal(tView);
+  }
+  return tView;
+}
+function createViewBlueprint(bindingStartIndex, initialViewLength) {
+  const blueprint = [];
+  for (let i = 0; i < initialViewLength; i++) {
+    blueprint.push(i < bindingStartIndex ? null : NO_CHANGE);
+  }
+  return blueprint;
+}
+function getOrCreateComponentTView(def) {
+  const tView = def.tView;
+  if (tView === null || tView.incompleteFirstPass) {
+    const declTNode = null;
+    return def.tView = createTView(1, declTNode, def.template, def.decls, def.vars, def.directiveDefs, def.pipeDefs, def.viewQuery, def.schemas, def.consts, def.id);
+  }
+  return tView;
+}
+function createLView(parentLView, tView, context2, flags, host, tHostNode, environment, renderer, injector, embeddedViewInjector, hydrationInfo) {
+  const lView = tView.blueprint.slice();
+  lView[HOST] = host;
+  lView[FLAGS] = flags | 4 | 128 | 8 | 64 | 1024;
+  if (embeddedViewInjector !== null || parentLView && parentLView[FLAGS] & 2048) {
+    lView[FLAGS] |= 2048;
+  }
+  resetPreOrderHookFlags(lView);
+  ngDevMode && tView.declTNode && parentLView && assertTNodeForLView(tView.declTNode, parentLView);
+  lView[PARENT] = lView[DECLARATION_VIEW] = parentLView;
+  lView[CONTEXT] = context2;
+  lView[ENVIRONMENT] = environment || parentLView && parentLView[ENVIRONMENT];
+  ngDevMode && assertDefined(lView[ENVIRONMENT], "LViewEnvironment is required");
+  lView[RENDERER] = renderer || parentLView && parentLView[RENDERER];
+  ngDevMode && assertDefined(lView[RENDERER], "Renderer is required");
+  lView[INJECTOR] = injector || parentLView && parentLView[INJECTOR] || null;
+  lView[T_HOST] = tHostNode;
+  lView[ID] = getUniqueLViewId();
+  lView[HYDRATION] = hydrationInfo;
+  lView[EMBEDDED_VIEW_INJECTOR] = embeddedViewInjector;
+  ngDevMode && assertEqual(tView.type == 2 ? parentLView !== null : true, true, "Embedded views must have parentLView");
+  lView[DECLARATION_COMPONENT_VIEW] = tView.type == 2 ? parentLView[DECLARATION_COMPONENT_VIEW] : lView;
+  return lView;
+}
+function createComponentLView(lView, hostTNode, def) {
+  const native = getNativeByTNode(hostTNode, lView);
+  const tView = getOrCreateComponentTView(def);
+  const rendererFactory = lView[ENVIRONMENT].rendererFactory;
+  const componentView = addToEndOfViewTree(lView, createLView(lView, tView, null, getInitialLViewFlagsFromDef(def), native, hostTNode, null, rendererFactory.createRenderer(native, def), null, null, null));
+  return lView[hostTNode.index] = componentView;
+}
+function getInitialLViewFlagsFromDef(def) {
+  let flags = 16;
+  if (def.signals) {
+    flags = 4096;
+  } else if (def.onPush) {
+    flags = 64;
+  }
+  return flags;
+}
+function allocExpando(tView, lView, numSlotsToAlloc, initialValue) {
+  if (numSlotsToAlloc === 0)
+    return -1;
+  if (ngDevMode) {
+    assertFirstCreatePass(tView);
+    assertSame(tView, lView[TVIEW], "`LView` must be associated with `TView`!");
+    assertEqual(tView.data.length, lView.length, "Expecting LView to be same size as TView");
+    assertEqual(tView.data.length, tView.blueprint.length, "Expecting Blueprint to be same size as TView");
+    assertFirstUpdatePass(tView);
+  }
+  const allocIdx = lView.length;
+  for (let i = 0; i < numSlotsToAlloc; i++) {
+    lView.push(initialValue);
+    tView.blueprint.push(initialValue);
+    tView.data.push(null);
+  }
+  return allocIdx;
+}
+function addToEndOfViewTree(lView, lViewOrLContainer) {
+  if (lView[CHILD_HEAD]) {
+    lView[CHILD_TAIL][NEXT] = lViewOrLContainer;
+  } else {
+    lView[CHILD_HEAD] = lViewOrLContainer;
+  }
+  lView[CHILD_TAIL] = lViewOrLContainer;
+  return lViewOrLContainer;
+}
+function ɵɵadvance(delta = 1) {
+  ngDevMode && assertGreaterThan(delta, 0, "Can only advance forward");
+  selectIndexInternal(getTView(), getLView(), getSelectedIndex() + delta, !!ngDevMode && isInCheckNoChangesMode());
+}
+function selectIndexInternal(tView, lView, index, checkNoChangesMode) {
+  ngDevMode && assertIndexInDeclRange(lView[TVIEW], index);
+  if (!checkNoChangesMode) {
+    const hooksInitPhaseCompleted = (lView[FLAGS] & 3) === 3;
+    if (hooksInitPhaseCompleted) {
+      const preOrderCheckHooks = tView.preOrderCheckHooks;
+      if (preOrderCheckHooks !== null) {
+        executeCheckHooks(lView, preOrderCheckHooks, index);
+      }
+    } else {
+      const preOrderHooks = tView.preOrderHooks;
+      if (preOrderHooks !== null) {
+        executeInitAndCheckHooks(lView, preOrderHooks, 0, index);
+      }
+    }
+  }
+  setSelectedIndex(index);
+}
+var InputFlags;
+(function(InputFlags2) {
+  InputFlags2[InputFlags2["None"] = 0] = "None";
+  InputFlags2[InputFlags2["SignalBased"] = 1] = "SignalBased";
+  InputFlags2[InputFlags2["HasDecoratorInputTransform"] = 2] = "HasDecoratorInputTransform";
+})(InputFlags || (InputFlags = {}));
+function writeToDirectiveInput(def, instance, publicName, value) {
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    if (ngDevMode) {
+      if (!def.inputs.hasOwnProperty(publicName)) {
+        throw new Error(`ASSERTION ERROR: Directive ${def.type.name} does not have an input with a public name of "${publicName}"`);
+      }
+      if (instance instanceof NodeInjectorFactory) {
+        throw new Error(`ASSERTION ERROR: Cannot write input to factory for type ${def.type.name}. Directive has not been created yet.`);
+      }
+    }
+    const [privateName, flags, transform] = def.inputs[publicName];
+    let inputSignalNode = null;
+    if ((flags & InputFlags.SignalBased) !== 0) {
+      const field = instance[privateName];
+      inputSignalNode = field[SIGNAL];
+    }
+    if (inputSignalNode !== null && inputSignalNode.transformFn !== void 0) {
+      value = inputSignalNode.transformFn(value);
+    } else if (transform !== null) {
+      value = transform.call(instance, value);
+    }
+    if (def.setInput !== null) {
+      def.setInput(instance, inputSignalNode, value, publicName, privateName);
+    } else {
+      applyValueToInputField(instance, inputSignalNode, privateName, value);
+    }
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+function executeTemplate(tView, lView, templateFn, rf, context2) {
+  const prevSelectedIndex = getSelectedIndex();
+  const isUpdatePhase = rf & 2;
+  try {
+    setSelectedIndex(-1);
+    if (isUpdatePhase && lView.length > HEADER_OFFSET) {
+      selectIndexInternal(tView, lView, HEADER_OFFSET, !!ngDevMode && isInCheckNoChangesMode());
+    }
+    const preHookType = isUpdatePhase ? 2 : 0;
+    profiler(preHookType, context2, templateFn);
+    templateFn(rf, context2);
+  } finally {
+    setSelectedIndex(prevSelectedIndex);
+    const postHookType = isUpdatePhase ? 3 : 1;
+    profiler(postHookType, context2, templateFn);
+  }
+}
+function createDirectivesInstances(tView, lView, tNode) {
+  instantiateAllDirectives(tView, lView, tNode);
+  if ((tNode.flags & 64) === 64) {
+    invokeDirectivesHostBindings(tView, lView, tNode);
+  }
+}
+function saveResolvedLocalsInData(viewData, tNode, localRefExtractor = getNativeByTNode) {
+  const localNames = tNode.localNames;
+  if (localNames !== null) {
+    let localIndex = tNode.index + 1;
+    for (let i = 0; i < localNames.length; i += 2) {
+      const index = localNames[i + 1];
+      const value = index === -1 ? localRefExtractor(tNode, viewData) : viewData[index];
+      viewData[localIndex++] = value;
+    }
+  }
+}
+function locateHostElement(renderer, elementOrSelector, encapsulation, injector) {
+  const preserveHostContent = injector.get(PRESERVE_HOST_CONTENT, PRESERVE_HOST_CONTENT_DEFAULT);
+  const preserveContent = preserveHostContent || encapsulation === ViewEncapsulation.ShadowDom;
+  const rootElement = renderer.selectRootElement(elementOrSelector, preserveContent);
+  applyRootElementTransform(rootElement);
+  return rootElement;
+}
+function applyRootElementTransform(rootElement) {
+  _applyRootElementTransformImpl(rootElement);
+}
+var _applyRootElementTransformImpl = () => null;
+function applyRootElementTransformImpl(rootElement) {
+  if (hasSkipHydrationAttrOnRElement(rootElement)) {
+    clearElementContents(rootElement);
+  } else {
+    processTextNodeMarkersBeforeHydration(rootElement);
+  }
+}
+function enableApplyRootElementTransformImpl() {
+  _applyRootElementTransformImpl = applyRootElementTransformImpl;
+}
+function mapPropName(name) {
+  if (name === "class")
+    return "className";
+  if (name === "for")
+    return "htmlFor";
+  if (name === "formaction")
+    return "formAction";
+  if (name === "innerHtml")
+    return "innerHTML";
+  if (name === "readonly")
+    return "readOnly";
+  if (name === "tabindex")
+    return "tabIndex";
+  return name;
+}
+function setPropertyAndInputs(tNode, lView, propName, value, renderer, sanitizer) {
+  ngDevMode && assertNotSame(value, NO_CHANGE, "Incoming value should never be NO_CHANGE.");
+  const tView = lView[TVIEW];
+  const hasSetInput = setAllInputsForProperty(tNode, tView, lView, propName, value);
+  if (hasSetInput) {
+    isComponentHost(tNode) && markDirtyIfOnPush(lView, tNode.index);
+    ngDevMode && setNgReflectProperties(lView, tView, tNode, propName, value);
+    return;
+  }
+  setDomProperty(tNode, lView, propName, value, renderer, sanitizer);
+}
+function setDomProperty(tNode, lView, propName, value, renderer, sanitizer) {
+  if (tNode.type & 3) {
+    const element = getNativeByTNode(tNode, lView);
+    propName = mapPropName(propName);
+    if (ngDevMode) {
+      validateAgainstEventProperties(propName);
+      if (!isPropertyValid(element, propName, tNode.value, lView[TVIEW].schemas)) {
+        handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);
+      }
+    }
+    value = sanitizer != null ? sanitizer(value, tNode.value || "", propName) : value;
+    renderer.setProperty(element, propName, value);
+  } else if (tNode.type & 12) {
+    if (ngDevMode && !matchingSchemas(lView[TVIEW].schemas, tNode.value)) {
+      handleUnknownPropertyError(propName, tNode.value, tNode.type, lView);
+    }
+  }
+}
+function markDirtyIfOnPush(lView, viewIndex) {
+  ngDevMode && assertLView(lView);
+  const childComponentLView = getComponentLViewByIndex(viewIndex, lView);
+  if (!(childComponentLView[FLAGS] & 16)) {
+    childComponentLView[FLAGS] |= 64;
+  }
+}
+function setNgReflectProperty(lView, tNode, attrName, value) {
+  const environment = lView[ENVIRONMENT];
+  if (!environment.ngReflect) {
+    return;
+  }
+  const element = getNativeByTNode(tNode, lView);
+  const renderer = lView[RENDERER];
+  attrName = normalizeDebugBindingName(attrName);
+  const debugValue = normalizeDebugBindingValue(value);
+  if (tNode.type & 3) {
+    if (value == null) {
+      renderer.removeAttribute(element, attrName);
+    } else {
+      renderer.setAttribute(element, attrName, debugValue);
+    }
+  } else {
+    const textContent = escapeCommentText(`bindings=${JSON.stringify({ [attrName]: debugValue }, null, 2)}`);
+    renderer.setValue(element, textContent);
+  }
+}
+function setNgReflectProperties(lView, tView, tNode, publicName, value) {
+  const environment = lView[ENVIRONMENT];
+  if (!environment.ngReflect || !(tNode.type & (3 | 4))) {
+    return;
+  }
+  const inputConfig = tNode.inputs?.[publicName];
+  const hostInputConfig = tNode.hostDirectiveInputs?.[publicName];
+  if (hostInputConfig) {
+    for (let i = 0; i < hostInputConfig.length; i += 2) {
+      const index = hostInputConfig[i];
+      const publicName2 = hostInputConfig[i + 1];
+      const def = tView.data[index];
+      setNgReflectProperty(lView, tNode, def.inputs[publicName2][0], value);
+    }
+  }
+  if (inputConfig) {
+    for (const index of inputConfig) {
+      const def = tView.data[index];
+      setNgReflectProperty(lView, tNode, def.inputs[publicName][0], value);
+    }
+  }
+}
+function instantiateAllDirectives(tView, lView, tNode) {
+  const start = tNode.directiveStart;
+  const end = tNode.directiveEnd;
+  if (isComponentHost(tNode)) {
+    ngDevMode && assertTNodeType(
+      tNode,
+      3
+      /* TNodeType.AnyRNode */
+    );
+    createComponentLView(lView, tNode, tView.data[start + tNode.componentOffset]);
+  }
+  if (!tView.firstCreatePass) {
+    getOrCreateNodeInjectorForNode(tNode, lView);
+  }
+  const initialInputs = tNode.initialInputs;
+  for (let i = start; i < end; i++) {
+    const def = tView.data[i];
+    const directive = getNodeInjectable(lView, tView, i, tNode);
+    attachPatchData(directive, lView);
+    if (initialInputs !== null) {
+      setInputsFromAttrs(lView, i - start, directive, def, tNode, initialInputs);
+    }
+    if (isComponentDef(def)) {
+      const componentView = getComponentLViewByIndex(tNode.index, lView);
+      componentView[CONTEXT] = getNodeInjectable(lView, tView, i, tNode);
+    }
+  }
+}
+function invokeDirectivesHostBindings(tView, lView, tNode) {
+  const start = tNode.directiveStart;
+  const end = tNode.directiveEnd;
+  const elementIndex = tNode.index;
+  const currentDirectiveIndex = getCurrentDirectiveIndex();
+  try {
+    setSelectedIndex(elementIndex);
+    for (let dirIndex = start; dirIndex < end; dirIndex++) {
+      const def = tView.data[dirIndex];
+      const directive = lView[dirIndex];
+      setCurrentDirectiveIndex(dirIndex);
+      if (def.hostBindings !== null || def.hostVars !== 0 || def.hostAttrs !== null) {
+        invokeHostBindingsInCreationMode(def, directive);
+      }
+    }
+  } finally {
+    setSelectedIndex(-1);
+    setCurrentDirectiveIndex(currentDirectiveIndex);
+  }
+}
+function invokeHostBindingsInCreationMode(def, directive) {
+  if (def.hostBindings !== null) {
+    def.hostBindings(1, directive);
+  }
+}
+function findDirectiveDefMatches(tView, tNode) {
+  ngDevMode && assertFirstCreatePass(tView);
+  ngDevMode && assertTNodeType(
+    tNode,
+    3 | 12
+    /* TNodeType.AnyContainer */
+  );
+  const registry = tView.directiveRegistry;
+  let matches = null;
+  if (registry) {
+    for (let i = 0; i < registry.length; i++) {
+      const def = registry[i];
+      if (isNodeMatchingSelectorList(
+        tNode,
+        def.selectors,
+        /* isProjectionMode */
+        false
+      )) {
+        matches ??= [];
+        if (isComponentDef(def)) {
+          if (ngDevMode) {
+            assertTNodeType(tNode, 2, `"${tNode.value}" tags cannot be used as component hosts. Please use a different tag to activate the ${stringify(def.type)} component.`);
+            if (matches.length && isComponentDef(matches[0])) {
+              throwMultipleComponentError(tNode, matches.find(isComponentDef).type, def.type);
+            }
+          }
+          matches.unshift(def);
+        } else {
+          matches.push(def);
+        }
+      }
+    }
+  }
+  return matches;
+}
+function elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace) {
+  if (ngDevMode) {
+    assertNotSame(value, NO_CHANGE, "Incoming value should never be NO_CHANGE.");
+    validateAgainstEventAttributes(name);
+    assertTNodeType(tNode, 2, `Attempted to set attribute \`${name}\` on a container node. Host bindings are not valid on ng-container or ng-template.`);
+  }
+  const element = getNativeByTNode(tNode, lView);
+  setElementAttribute(lView[RENDERER], element, namespace, tNode.value, name, value, sanitizer);
+}
+function setElementAttribute(renderer, element, namespace, tagName, name, value, sanitizer) {
+  if (value == null) {
+    renderer.removeAttribute(element, name, namespace);
+  } else {
+    const strValue = sanitizer == null ? renderStringify(value) : sanitizer(value, tagName || "", name);
+    renderer.setAttribute(element, name, strValue, namespace);
+  }
+}
+function setInputsFromAttrs(lView, directiveIndex, instance, def, tNode, initialInputData) {
+  const initialInputs = initialInputData[directiveIndex];
+  if (initialInputs !== null) {
+    for (let i = 0; i < initialInputs.length; i += 2) {
+      const lookupName = initialInputs[i];
+      const value = initialInputs[i + 1];
+      writeToDirectiveInput(def, instance, lookupName, value);
+      if (ngDevMode) {
+        setNgReflectProperty(lView, tNode, def.inputs[lookupName][0], value);
+      }
+    }
+  }
+}
+function storePropertyBindingMetadata(tData, tNode, propertyName, bindingIndex, ...interpolationParts) {
+  if (tData[bindingIndex] === null) {
+    if (!tNode.inputs?.[propertyName] && !tNode.hostDirectiveInputs?.[propertyName]) {
+      const propBindingIdxs = tNode.propertyBindings || (tNode.propertyBindings = []);
+      propBindingIdxs.push(bindingIndex);
+      let bindingMetadata = propertyName;
+      if (interpolationParts.length > 0) {
+        bindingMetadata += INTERPOLATION_DELIMITER + interpolationParts.join(INTERPOLATION_DELIMITER);
+      }
+      tData[bindingIndex] = bindingMetadata;
+    }
+  }
+}
+function loadComponentRenderer(currentDef, tNode, lView) {
+  if (currentDef === null || isComponentDef(currentDef)) {
+    lView = unwrapLView(lView[tNode.index]);
+  }
+  return lView[RENDERER];
+}
+function handleUncaughtError(lView, error) {
+  const injector = lView[INJECTOR];
+  if (!injector) {
+    return;
+  }
+  const errorHandler = injector.get(INTERNAL_APPLICATION_ERROR_HANDLER, null);
+  errorHandler?.(error);
+}
+function setAllInputsForProperty(tNode, tView, lView, publicName, value) {
+  const inputs = tNode.inputs?.[publicName];
+  const hostDirectiveInputs = tNode.hostDirectiveInputs?.[publicName];
+  let hasMatch = false;
+  if (hostDirectiveInputs) {
+    for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
+      const index = hostDirectiveInputs[i];
+      ngDevMode && assertIndexInRange(lView, index);
+      const publicName2 = hostDirectiveInputs[i + 1];
+      const def = tView.data[index];
+      writeToDirectiveInput(def, lView[index], publicName2, value);
+      hasMatch = true;
+    }
+  }
+  if (inputs) {
+    for (const index of inputs) {
+      ngDevMode && assertIndexInRange(lView, index);
+      const instance = lView[index];
+      const def = tView.data[index];
+      writeToDirectiveInput(def, instance, publicName, value);
+      hasMatch = true;
+    }
+  }
+  return hasMatch;
+}
+function setDirectiveInput(tNode, tView, lView, target, publicName, value) {
+  let hostIndex = null;
+  let hostDirectivesStart = null;
+  let hostDirectivesEnd = null;
+  let hasSet = false;
+  if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {
+    throw new Error(`Node does not have a directive with type ${target.type.name}`);
+  }
+  const data = tNode.directiveToIndex.get(target.type);
+  if (typeof data === "number") {
+    hostIndex = data;
+  } else {
+    [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;
+  }
+  if (hostDirectivesStart !== null && hostDirectivesEnd !== null && tNode.hostDirectiveInputs?.hasOwnProperty(publicName)) {
+    const hostDirectiveInputs = tNode.hostDirectiveInputs[publicName];
+    for (let i = 0; i < hostDirectiveInputs.length; i += 2) {
+      const index = hostDirectiveInputs[i];
+      if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {
+        ngDevMode && assertIndexInRange(lView, index);
+        const def = tView.data[index];
+        const hostDirectivePublicName = hostDirectiveInputs[i + 1];
+        writeToDirectiveInput(def, lView[index], hostDirectivePublicName, value);
+        hasSet = true;
+      } else if (index > hostDirectivesEnd) {
+        break;
+      }
+    }
+  }
+  if (hostIndex !== null && target.inputs.hasOwnProperty(publicName)) {
+    ngDevMode && assertIndexInRange(lView, hostIndex);
+    writeToDirectiveInput(target, lView[hostIndex], publicName, value);
+    hasSet = true;
+  }
+  return hasSet;
+}
+function renderComponent(hostLView, componentHostIdx) {
+  ngDevMode && assertEqual(isCreationMode(hostLView), true, "Should be run in creation mode");
+  const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);
+  const componentTView = componentView[TVIEW];
+  syncViewWithBlueprint(componentTView, componentView);
+  const hostRNode = componentView[HOST];
+  if (hostRNode !== null && componentView[HYDRATION] === null) {
+    componentView[HYDRATION] = retrieveHydrationInfo(hostRNode, componentView[INJECTOR]);
+  }
+  profiler(
+    18
+    /* ProfilerEvent.ComponentStart */
+  );
+  renderView(componentTView, componentView, componentView[CONTEXT]);
+  profiler(19, componentView[CONTEXT]);
+}
+function syncViewWithBlueprint(tView, lView) {
+  for (let i = lView.length; i < tView.blueprint.length; i++) {
+    lView.push(tView.blueprint[i]);
+  }
+}
+function renderView(tView, lView, context2) {
+  ngDevMode && assertEqual(isCreationMode(lView), true, "Should be run in creation mode");
+  ngDevMode && assertNotReactive(renderView.name);
+  enterView(lView);
+  try {
+    const viewQuery = tView.viewQuery;
+    if (viewQuery !== null) {
+      executeViewQueryFn(1, viewQuery, context2);
+    }
+    const templateFn = tView.template;
+    if (templateFn !== null) {
+      executeTemplate(tView, lView, templateFn, 1, context2);
+    }
+    if (tView.firstCreatePass) {
+      tView.firstCreatePass = false;
+    }
+    lView[QUERIES]?.finishViewCreation(tView);
+    if (tView.staticContentQueries) {
+      refreshContentQueries(tView, lView);
+    }
+    if (tView.staticViewQueries) {
+      executeViewQueryFn(2, tView.viewQuery, context2);
+    }
+    const components = tView.components;
+    if (components !== null) {
+      renderChildComponents(lView, components);
+    }
+  } catch (error) {
+    if (tView.firstCreatePass) {
+      tView.incompleteFirstPass = true;
+      tView.firstCreatePass = false;
+    }
+    throw error;
+  } finally {
+    lView[FLAGS] &= ~4;
+    leaveView();
+  }
+}
+function renderChildComponents(hostLView, components) {
+  for (let i = 0; i < components.length; i++) {
+    renderComponent(hostLView, components[i]);
+  }
+}
+function createAndRenderEmbeddedLView(declarationLView, templateTNode, context2, options) {
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    const embeddedTView = templateTNode.tView;
+    ngDevMode && assertDefined(embeddedTView, "TView must be defined for a template node.");
+    ngDevMode && assertTNodeForLView(templateTNode, declarationLView);
+    const isSignalView = declarationLView[FLAGS] & 4096;
+    const viewFlags = isSignalView ? 4096 : 16;
+    const embeddedLView = createLView(declarationLView, embeddedTView, context2, viewFlags, null, templateTNode, null, null, options?.injector ?? null, options?.embeddedViewInjector ?? null, options?.dehydratedView ?? null);
+    const declarationLContainer = declarationLView[templateTNode.index];
+    ngDevMode && assertLContainer(declarationLContainer);
+    embeddedLView[DECLARATION_LCONTAINER] = declarationLContainer;
+    const declarationViewLQueries = declarationLView[QUERIES];
+    if (declarationViewLQueries !== null) {
+      embeddedLView[QUERIES] = declarationViewLQueries.createEmbeddedView(embeddedTView);
+    }
+    renderView(embeddedTView, embeddedLView, context2);
+    return embeddedLView;
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+function shouldAddViewToDom(tNode, dehydratedView) {
+  return !dehydratedView || dehydratedView.firstChild === null || hasInSkipHydrationBlockFlag(tNode);
+}
+var USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT = false;
+var UseExhaustiveCheckNoChanges = new InjectionToken(ngDevMode ? "exhaustive checkNoChanges" : "");
+var _icuContainerIterate;
+function icuContainerIterate(tIcuContainerNode, lView) {
+  return _icuContainerIterate(tIcuContainerNode, lView);
+}
+function ensureIcuContainerVisitorLoaded(loader) {
+  if (_icuContainerIterate === void 0) {
+    _icuContainerIterate = loader();
+  }
+}
+var RendererStyleFlags2;
+(function(RendererStyleFlags22) {
+  RendererStyleFlags22[RendererStyleFlags22["Important"] = 1] = "Important";
+  RendererStyleFlags22[RendererStyleFlags22["DashCase"] = 2] = "DashCase";
+})(RendererStyleFlags2 || (RendererStyleFlags2 = {}));
+function isDetachedByI18n(tNode) {
+  return (tNode.flags & 32) === 32;
+}
+function applyToElementOrContainer(action, renderer, parent, lNodeToHandle, beforeNode) {
+  if (lNodeToHandle != null) {
+    let lContainer;
+    let isComponent2 = false;
+    if (isLContainer(lNodeToHandle)) {
+      lContainer = lNodeToHandle;
+    } else if (isLView(lNodeToHandle)) {
+      isComponent2 = true;
+      ngDevMode && assertDefined(lNodeToHandle[HOST], "HOST must be defined for a component LView");
+      lNodeToHandle = lNodeToHandle[HOST];
+    }
+    const rNode = unwrapRNode(lNodeToHandle);
+    if (action === 0 && parent !== null) {
+      if (beforeNode == null) {
+        nativeAppendChild(renderer, parent, rNode);
+      } else {
+        nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
+      }
+    } else if (action === 1 && parent !== null) {
+      nativeInsertBefore(renderer, parent, rNode, beforeNode || null, true);
+    } else if (action === 2) {
+      nativeRemoveNode(renderer, rNode, isComponent2);
+    } else if (action === 3) {
+      renderer.destroyNode(rNode);
+    }
+    if (lContainer != null) {
+      applyContainer(renderer, action, lContainer, parent, beforeNode);
+    }
+  }
+}
+function removeViewFromDOM(tView, lView) {
+  detachViewFromDOM(tView, lView);
+  lView[HOST] = null;
+  lView[T_HOST] = null;
+}
+function addViewToDOM(tView, parentTNode, renderer, lView, parentNativeNode, beforeNode) {
+  lView[HOST] = parentNativeNode;
+  lView[T_HOST] = parentTNode;
+  applyView(tView, lView, renderer, 1, parentNativeNode, beforeNode);
+}
+function detachViewFromDOM(tView, lView) {
+  lView[ENVIRONMENT].changeDetectionScheduler?.notify(
+    9
+    /* NotificationSource.ViewDetachedFromDOM */
+  );
+  applyView(tView, lView, lView[RENDERER], 2, null, null);
+}
+function destroyViewTree(rootView) {
+  let lViewOrLContainer = rootView[CHILD_HEAD];
+  if (!lViewOrLContainer) {
+    return cleanUpView(rootView[TVIEW], rootView);
+  }
+  while (lViewOrLContainer) {
+    let next = null;
+    if (isLView(lViewOrLContainer)) {
+      next = lViewOrLContainer[CHILD_HEAD];
+    } else {
+      ngDevMode && assertLContainer(lViewOrLContainer);
+      const firstView = lViewOrLContainer[CONTAINER_HEADER_OFFSET];
+      if (firstView)
+        next = firstView;
+    }
+    if (!next) {
+      while (lViewOrLContainer && !lViewOrLContainer[NEXT] && lViewOrLContainer !== rootView) {
+        if (isLView(lViewOrLContainer)) {
+          cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);
+        }
+        lViewOrLContainer = lViewOrLContainer[PARENT];
+      }
+      if (lViewOrLContainer === null)
+        lViewOrLContainer = rootView;
+      if (isLView(lViewOrLContainer)) {
+        cleanUpView(lViewOrLContainer[TVIEW], lViewOrLContainer);
+      }
+      next = lViewOrLContainer && lViewOrLContainer[NEXT];
+    }
+    lViewOrLContainer = next;
+  }
+}
+function detachMovedView(declarationContainer, lView) {
+  ngDevMode && assertLContainer(declarationContainer);
+  ngDevMode && assertDefined(declarationContainer[MOVED_VIEWS], "A projected view should belong to a non-empty projected views collection");
+  const movedViews = declarationContainer[MOVED_VIEWS];
+  const declarationViewIndex = movedViews.indexOf(lView);
+  movedViews.splice(declarationViewIndex, 1);
+}
+function destroyLView(tView, lView) {
+  if (isDestroyed(lView)) {
+    return;
+  }
+  const renderer = lView[RENDERER];
+  if (renderer.destroyNode) {
+    applyView(tView, lView, renderer, 3, null, null);
+  }
+  destroyViewTree(lView);
+}
+function cleanUpView(tView, lView) {
+  if (isDestroyed(lView)) {
+    return;
+  }
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    lView[FLAGS] &= ~128;
+    lView[FLAGS] |= 256;
+    lView[REACTIVE_TEMPLATE_CONSUMER] && consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);
+    executeOnDestroys(tView, lView);
+    processCleanups(tView, lView);
+    if (lView[TVIEW].type === 1) {
+      lView[RENDERER].destroy();
+    }
+    const declarationContainer = lView[DECLARATION_LCONTAINER];
+    if (declarationContainer !== null && isLContainer(lView[PARENT])) {
+      if (declarationContainer !== lView[PARENT]) {
+        detachMovedView(declarationContainer, lView);
+      }
+      const lQueries = lView[QUERIES];
+      if (lQueries !== null) {
+        lQueries.detachView(tView);
+      }
+    }
+    unregisterLView(lView);
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+function processCleanups(tView, lView) {
+  ngDevMode && assertNotReactive(processCleanups.name);
+  const tCleanup = tView.cleanup;
+  const lCleanup = lView[CLEANUP];
+  if (tCleanup !== null) {
+    for (let i = 0; i < tCleanup.length - 1; i += 2) {
+      if (typeof tCleanup[i] === "string") {
+        const targetIdx = tCleanup[i + 3];
+        ngDevMode && assertNumber(targetIdx, "cleanup target must be a number");
+        if (targetIdx >= 0) {
+          lCleanup[targetIdx]();
+        } else {
+          lCleanup[-targetIdx].unsubscribe();
+        }
+        i += 2;
+      } else {
+        const context2 = lCleanup[tCleanup[i + 1]];
+        tCleanup[i].call(context2);
+      }
+    }
+  }
+  if (lCleanup !== null) {
+    lView[CLEANUP] = null;
+  }
+  const destroyHooks = lView[ON_DESTROY_HOOKS];
+  if (destroyHooks !== null) {
+    lView[ON_DESTROY_HOOKS] = null;
+    for (let i = 0; i < destroyHooks.length; i++) {
+      const destroyHooksFn = destroyHooks[i];
+      ngDevMode && assertFunction(destroyHooksFn, "Expecting destroy hook to be a function.");
+      destroyHooksFn();
+    }
+  }
+  const effects = lView[EFFECTS];
+  if (effects !== null) {
+    lView[EFFECTS] = null;
+    for (const effect2 of effects) {
+      effect2.destroy();
+    }
+  }
+}
+function executeOnDestroys(tView, lView) {
+  ngDevMode && assertNotReactive(executeOnDestroys.name);
+  let destroyHooks;
+  if (tView != null && (destroyHooks = tView.destroyHooks) != null) {
+    for (let i = 0; i < destroyHooks.length; i += 2) {
+      const context2 = lView[destroyHooks[i]];
+      if (!(context2 instanceof NodeInjectorFactory)) {
+        const toCall = destroyHooks[i + 1];
+        if (Array.isArray(toCall)) {
+          for (let j = 0; j < toCall.length; j += 2) {
+            const callContext = context2[toCall[j]];
+            const hook = toCall[j + 1];
+            profiler(4, callContext, hook);
+            try {
+              hook.call(callContext);
+            } finally {
+              profiler(5, callContext, hook);
+            }
+          }
+        } else {
+          profiler(4, context2, toCall);
+          try {
+            toCall.call(context2);
+          } finally {
+            profiler(5, context2, toCall);
+          }
+        }
+      }
+    }
+  }
+}
+function getParentRElement(tView, tNode, lView) {
+  return getClosestRElement(tView, tNode.parent, lView);
+}
+function getClosestRElement(tView, tNode, lView) {
+  let parentTNode = tNode;
+  while (parentTNode !== null && parentTNode.type & (8 | 32 | 128)) {
+    tNode = parentTNode;
+    parentTNode = tNode.parent;
+  }
+  if (parentTNode === null) {
+    return lView[HOST];
+  } else {
+    ngDevMode && assertTNodeType(
+      parentTNode,
+      3 | 4
+      /* TNodeType.Container */
+    );
+    if (isComponentHost(parentTNode)) {
+      ngDevMode && assertTNodeForLView(parentTNode, lView);
+      const { encapsulation } = tView.data[parentTNode.directiveStart + parentTNode.componentOffset];
+      if (encapsulation === ViewEncapsulation.None || encapsulation === ViewEncapsulation.Emulated) {
+        return null;
+      }
+    }
+    return getNativeByTNode(parentTNode, lView);
+  }
+}
+function getInsertInFrontOfRNode(parentTNode, currentTNode, lView) {
+  return _getInsertInFrontOfRNodeWithI18n(parentTNode, currentTNode, lView);
+}
+function getInsertInFrontOfRNodeWithNoI18n(parentTNode, currentTNode, lView) {
+  if (parentTNode.type & (8 | 32)) {
+    return getNativeByTNode(parentTNode, lView);
+  }
+  return null;
+}
+var _getInsertInFrontOfRNodeWithI18n = getInsertInFrontOfRNodeWithNoI18n;
+var _processI18nInsertBefore;
+function setI18nHandling(getInsertInFrontOfRNodeWithI18n2, processI18nInsertBefore2) {
+  _getInsertInFrontOfRNodeWithI18n = getInsertInFrontOfRNodeWithI18n2;
+  _processI18nInsertBefore = processI18nInsertBefore2;
+}
+function appendChild(tView, lView, childRNode, childTNode) {
+  const parentRNode = getParentRElement(tView, childTNode, lView);
+  const renderer = lView[RENDERER];
+  const parentTNode = childTNode.parent || lView[T_HOST];
+  const anchorNode = getInsertInFrontOfRNode(parentTNode, childTNode, lView);
+  if (parentRNode != null) {
+    if (Array.isArray(childRNode)) {
+      for (let i = 0; i < childRNode.length; i++) {
+        nativeAppendOrInsertBefore(renderer, parentRNode, childRNode[i], anchorNode, false);
+      }
+    } else {
+      nativeAppendOrInsertBefore(renderer, parentRNode, childRNode, anchorNode, false);
+    }
+  }
+  _processI18nInsertBefore !== void 0 && _processI18nInsertBefore(renderer, childTNode, lView, childRNode, parentRNode);
+}
+function getFirstNativeNode(lView, tNode) {
+  if (tNode !== null) {
+    ngDevMode && assertTNodeType(
+      tNode,
+      3 | 12 | 32 | 16 | 128
+      /* TNodeType.LetDeclaration */
+    );
+    const tNodeType = tNode.type;
+    if (tNodeType & 3) {
+      return getNativeByTNode(tNode, lView);
+    } else if (tNodeType & 4) {
+      return getBeforeNodeForView(-1, lView[tNode.index]);
+    } else if (tNodeType & 8) {
+      const elIcuContainerChild = tNode.child;
+      if (elIcuContainerChild !== null) {
+        return getFirstNativeNode(lView, elIcuContainerChild);
+      } else {
+        const rNodeOrLContainer = lView[tNode.index];
+        if (isLContainer(rNodeOrLContainer)) {
+          return getBeforeNodeForView(-1, rNodeOrLContainer);
+        } else {
+          return unwrapRNode(rNodeOrLContainer);
+        }
+      }
+    } else if (tNodeType & 128) {
+      return getFirstNativeNode(lView, tNode.next);
+    } else if (tNodeType & 32) {
+      let nextRNode = icuContainerIterate(tNode, lView);
+      let rNode = nextRNode();
+      return rNode || unwrapRNode(lView[tNode.index]);
+    } else {
+      const projectionNodes = getProjectionNodes(lView, tNode);
+      if (projectionNodes !== null) {
+        if (Array.isArray(projectionNodes)) {
+          return projectionNodes[0];
+        }
+        const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW]);
+        ngDevMode && assertParentView(parentView);
+        return getFirstNativeNode(parentView, projectionNodes);
+      } else {
+        return getFirstNativeNode(lView, tNode.next);
+      }
+    }
+  }
+  return null;
+}
+function getProjectionNodes(lView, tNode) {
+  if (tNode !== null) {
+    const componentView = lView[DECLARATION_COMPONENT_VIEW];
+    const componentHost = componentView[T_HOST];
+    const slotIdx = tNode.projection;
+    ngDevMode && assertProjectionSlots(lView);
+    return componentHost.projection[slotIdx];
+  }
+  return null;
+}
+function getBeforeNodeForView(viewIndexInContainer, lContainer) {
+  const nextViewIndex = CONTAINER_HEADER_OFFSET + viewIndexInContainer + 1;
+  if (nextViewIndex < lContainer.length) {
+    const lView = lContainer[nextViewIndex];
+    const firstTNodeOfView = lView[TVIEW].firstChild;
+    if (firstTNodeOfView !== null) {
+      return getFirstNativeNode(lView, firstTNodeOfView);
+    }
+  }
+  return lContainer[NATIVE];
+}
+function applyNodes(renderer, action, tNode, lView, parentRElement, beforeNode, isProjection) {
+  while (tNode != null) {
+    ngDevMode && assertTNodeForLView(tNode, lView);
+    if (tNode.type === 128) {
+      tNode = tNode.next;
+      continue;
+    }
+    ngDevMode && assertTNodeType(
+      tNode,
+      3 | 12 | 16 | 32
+      /* TNodeType.Icu */
+    );
+    const rawSlotValue = lView[tNode.index];
+    const tNodeType = tNode.type;
+    if (isProjection) {
+      if (action === 0) {
+        rawSlotValue && attachPatchData(unwrapRNode(rawSlotValue), lView);
+        tNode.flags |= 2;
+      }
+    }
+    if (!isDetachedByI18n(tNode)) {
+      if (tNodeType & 8) {
+        applyNodes(renderer, action, tNode.child, lView, parentRElement, beforeNode, false);
+        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
+      } else if (tNodeType & 32) {
+        const nextRNode = icuContainerIterate(tNode, lView);
+        let rNode;
+        while (rNode = nextRNode()) {
+          applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
+        }
+        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
+      } else if (tNodeType & 16) {
+        applyProjectionRecursive(renderer, action, lView, tNode, parentRElement, beforeNode);
+      } else {
+        ngDevMode && assertTNodeType(
+          tNode,
+          3 | 4
+          /* TNodeType.Container */
+        );
+        applyToElementOrContainer(action, renderer, parentRElement, rawSlotValue, beforeNode);
+      }
+    }
+    tNode = isProjection ? tNode.projectionNext : tNode.next;
+  }
+}
+function applyView(tView, lView, renderer, action, parentRElement, beforeNode) {
+  applyNodes(renderer, action, tView.firstChild, lView, parentRElement, beforeNode, false);
+}
+function applyProjection(tView, lView, tProjectionNode) {
+  const renderer = lView[RENDERER];
+  const parentRNode = getParentRElement(tView, tProjectionNode, lView);
+  const parentTNode = tProjectionNode.parent || lView[T_HOST];
+  let beforeNode = getInsertInFrontOfRNode(parentTNode, tProjectionNode, lView);
+  applyProjectionRecursive(renderer, 0, lView, tProjectionNode, parentRNode, beforeNode);
+}
+function applyProjectionRecursive(renderer, action, lView, tProjectionNode, parentRElement, beforeNode) {
+  const componentLView = lView[DECLARATION_COMPONENT_VIEW];
+  const componentNode = componentLView[T_HOST];
+  ngDevMode && assertEqual(typeof tProjectionNode.projection, "number", "expecting projection index");
+  const nodeToProjectOrRNodes = componentNode.projection[tProjectionNode.projection];
+  if (Array.isArray(nodeToProjectOrRNodes)) {
+    for (let i = 0; i < nodeToProjectOrRNodes.length; i++) {
+      const rNode = nodeToProjectOrRNodes[i];
+      applyToElementOrContainer(action, renderer, parentRElement, rNode, beforeNode);
+    }
+  } else {
+    let nodeToProject = nodeToProjectOrRNodes;
+    const projectedComponentLView = componentLView[PARENT];
+    if (hasInSkipHydrationBlockFlag(tProjectionNode)) {
+      nodeToProject.flags |= 128;
+    }
+    applyNodes(renderer, action, nodeToProject, projectedComponentLView, parentRElement, beforeNode, true);
+  }
+}
+function applyContainer(renderer, action, lContainer, parentRElement, beforeNode) {
+  ngDevMode && assertLContainer(lContainer);
+  const anchor = lContainer[NATIVE];
+  const native = unwrapRNode(lContainer);
+  if (anchor !== native) {
+    applyToElementOrContainer(action, renderer, parentRElement, anchor, beforeNode);
+  }
+  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+    const lView = lContainer[i];
+    applyView(lView[TVIEW], lView, renderer, action, parentRElement, anchor);
+  }
+}
+function applyStyling(renderer, isClassBased, rNode, prop, value) {
+  if (isClassBased) {
+    if (!value) {
+      renderer.removeClass(rNode, prop);
+    } else {
+      renderer.addClass(rNode, prop);
+    }
+  } else {
+    let flags = prop.indexOf("-") === -1 ? void 0 : RendererStyleFlags2.DashCase;
+    if (value == null) {
+      renderer.removeStyle(rNode, prop, flags);
+    } else {
+      const isImportant = typeof value === "string" ? value.endsWith("!important") : false;
+      if (isImportant) {
+        value = value.slice(0, -10);
+        flags |= RendererStyleFlags2.Important;
+      }
+      renderer.setStyle(rNode, prop, value, flags);
+    }
+  }
+}
+function collectNativeNodes(tView, lView, tNode, result, isProjection = false) {
+  while (tNode !== null) {
+    if (tNode.type === 128) {
+      tNode = isProjection ? tNode.projectionNext : tNode.next;
+      continue;
+    }
+    ngDevMode && assertTNodeType(
+      tNode,
+      3 | 12 | 16 | 32
+      /* TNodeType.Icu */
+    );
+    const lNode = lView[tNode.index];
+    if (lNode !== null) {
+      result.push(unwrapRNode(lNode));
+    }
+    if (isLContainer(lNode)) {
+      collectNativeNodesInLContainer(lNode, result);
+    }
+    const tNodeType = tNode.type;
+    if (tNodeType & 8) {
+      collectNativeNodes(tView, lView, tNode.child, result);
+    } else if (tNodeType & 32) {
+      const nextRNode = icuContainerIterate(tNode, lView);
+      let rNode;
+      while (rNode = nextRNode()) {
+        result.push(rNode);
+      }
+    } else if (tNodeType & 16) {
+      const nodesInSlot = getProjectionNodes(lView, tNode);
+      if (Array.isArray(nodesInSlot)) {
+        result.push(...nodesInSlot);
+      } else {
+        const parentView = getLViewParent(lView[DECLARATION_COMPONENT_VIEW]);
+        ngDevMode && assertParentView(parentView);
+        collectNativeNodes(parentView[TVIEW], parentView, nodesInSlot, result, true);
+      }
+    }
+    tNode = isProjection ? tNode.projectionNext : tNode.next;
+  }
+  return result;
+}
+function collectNativeNodesInLContainer(lContainer, result) {
+  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+    const lViewInAContainer = lContainer[i];
+    const lViewFirstChildTNode = lViewInAContainer[TVIEW].firstChild;
+    if (lViewFirstChildTNode !== null) {
+      collectNativeNodes(lViewInAContainer[TVIEW], lViewInAContainer, lViewFirstChildTNode, result);
+    }
+  }
+  if (lContainer[NATIVE] !== lContainer[HOST]) {
+    result.push(lContainer[NATIVE]);
+  }
+}
+function addAfterRenderSequencesForView(lView) {
+  if (lView[AFTER_RENDER_SEQUENCES_TO_ADD] !== null) {
+    for (const sequence of lView[AFTER_RENDER_SEQUENCES_TO_ADD]) {
+      sequence.impl.addSequence(sequence);
+    }
+    lView[AFTER_RENDER_SEQUENCES_TO_ADD].length = 0;
+  }
+}
+var freeConsumers = [];
+function getOrBorrowReactiveLViewConsumer(lView) {
+  return lView[REACTIVE_TEMPLATE_CONSUMER] ?? borrowReactiveLViewConsumer(lView);
+}
+function borrowReactiveLViewConsumer(lView) {
+  const consumer = freeConsumers.pop() ?? Object.create(REACTIVE_LVIEW_CONSUMER_NODE);
+  consumer.lView = lView;
+  return consumer;
+}
+function maybeReturnReactiveLViewConsumer(consumer) {
+  if (consumer.lView[REACTIVE_TEMPLATE_CONSUMER] === consumer) {
+    return;
+  }
+  consumer.lView = null;
+  freeConsumers.push(consumer);
+}
+var REACTIVE_LVIEW_CONSUMER_NODE = __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+  consumerIsAlwaysLive: true,
+  kind: "template",
+  consumerMarkedDirty: (node) => {
+    markAncestorsForTraversal(node.lView);
+  },
+  consumerOnSignalRead() {
+    this.lView[REACTIVE_TEMPLATE_CONSUMER] = this;
+  }
+});
+function getOrCreateTemporaryConsumer(lView) {
+  const consumer = lView[REACTIVE_TEMPLATE_CONSUMER] ?? Object.create(TEMPORARY_CONSUMER_NODE);
+  consumer.lView = lView;
+  return consumer;
+}
+var TEMPORARY_CONSUMER_NODE = __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+  consumerIsAlwaysLive: true,
+  kind: "template",
+  consumerMarkedDirty: (node) => {
+    let parent = getLViewParent(node.lView);
+    while (parent && !viewShouldHaveReactiveConsumer(parent[TVIEW])) {
+      parent = getLViewParent(parent);
+    }
+    if (!parent) {
+      return;
+    }
+    markViewForRefresh(parent);
+  },
+  consumerOnSignalRead() {
+    this.lView[REACTIVE_TEMPLATE_CONSUMER] = this;
+  }
+});
+function viewShouldHaveReactiveConsumer(tView) {
+  return tView.type !== 2;
+}
+function isReactiveLViewConsumer(node) {
+  return node.kind === "template";
+}
+function runEffectsInView(view) {
+  if (view[EFFECTS] === null) {
+    return;
+  }
+  let tryFlushEffects = true;
+  while (tryFlushEffects) {
+    let foundDirtyEffect = false;
+    for (const effect2 of view[EFFECTS]) {
+      if (!effect2.dirty) {
+        continue;
+      }
+      foundDirtyEffect = true;
+      if (effect2.zone === null || Zone.current === effect2.zone) {
+        effect2.run();
+      } else {
+        effect2.zone.run(() => effect2.run());
+      }
+    }
+    tryFlushEffects = foundDirtyEffect && !!(view[FLAGS] & 8192);
+  }
+}
+var MAXIMUM_REFRESH_RERUNS$1 = 100;
+function detectChangesInternal(lView, mode = 0) {
+  const environment = lView[ENVIRONMENT];
+  const rendererFactory = environment.rendererFactory;
+  const checkNoChangesMode = !!ngDevMode && isInCheckNoChangesMode();
+  if (!checkNoChangesMode) {
+    rendererFactory.begin?.();
+  }
+  try {
+    detectChangesInViewWhileDirty(lView, mode);
+  } finally {
+    if (!checkNoChangesMode) {
+      rendererFactory.end?.();
+    }
+  }
+}
+function detectChangesInViewWhileDirty(lView, mode) {
+  const lastIsRefreshingViewsValue = isRefreshingViews();
+  try {
+    setIsRefreshingViews(true);
+    detectChangesInView(lView, mode);
+    if (ngDevMode && isExhaustiveCheckNoChanges()) {
+      return;
+    }
+    let retries = 0;
+    while (requiresRefreshOrTraversal(lView)) {
+      if (retries === MAXIMUM_REFRESH_RERUNS$1) {
+        throw new RuntimeError(103, ngDevMode && "Infinite change detection while trying to refresh views. There may be components which each cause the other to require a refresh, causing an infinite loop.");
+      }
+      retries++;
+      detectChangesInView(
+        lView,
+        1
+        /* ChangeDetectionMode.Targeted */
+      );
+    }
+  } finally {
+    setIsRefreshingViews(lastIsRefreshingViewsValue);
+  }
+}
+function checkNoChangesInternal(lView, exhaustive) {
+  setIsInCheckNoChangesMode(exhaustive ? CheckNoChangesMode.Exhaustive : CheckNoChangesMode.OnlyDirtyViews);
+  try {
+    detectChangesInternal(lView);
+  } finally {
+    setIsInCheckNoChangesMode(CheckNoChangesMode.Off);
+  }
+}
+function refreshView(tView, lView, templateFn, context2) {
+  ngDevMode && assertEqual(isCreationMode(lView), false, "Should be run in update mode");
+  if (isDestroyed(lView))
+    return;
+  const flags = lView[FLAGS];
+  const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();
+  const isInExhaustiveCheckNoChangesPass = ngDevMode && isExhaustiveCheckNoChanges();
+  enterView(lView);
+  let returnConsumerToPool = true;
+  let prevConsumer = null;
+  let currentConsumer = null;
+  if (!isInCheckNoChangesPass) {
+    if (viewShouldHaveReactiveConsumer(tView)) {
+      currentConsumer = getOrBorrowReactiveLViewConsumer(lView);
+      prevConsumer = consumerBeforeComputation(currentConsumer);
+    } else if (getActiveConsumer() === null) {
+      returnConsumerToPool = false;
+      currentConsumer = getOrCreateTemporaryConsumer(lView);
+      prevConsumer = consumerBeforeComputation(currentConsumer);
+    } else if (lView[REACTIVE_TEMPLATE_CONSUMER]) {
+      consumerDestroy(lView[REACTIVE_TEMPLATE_CONSUMER]);
+      lView[REACTIVE_TEMPLATE_CONSUMER] = null;
+    }
+  }
+  try {
+    resetPreOrderHookFlags(lView);
+    setBindingIndex(tView.bindingStartIndex);
+    if (templateFn !== null) {
+      executeTemplate(tView, lView, templateFn, 2, context2);
+    }
+    const hooksInitPhaseCompleted = (flags & 3) === 3;
+    if (!isInCheckNoChangesPass) {
+      if (hooksInitPhaseCompleted) {
+        const preOrderCheckHooks = tView.preOrderCheckHooks;
+        if (preOrderCheckHooks !== null) {
+          executeCheckHooks(lView, preOrderCheckHooks, null);
+        }
+      } else {
+        const preOrderHooks = tView.preOrderHooks;
+        if (preOrderHooks !== null) {
+          executeInitAndCheckHooks(lView, preOrderHooks, 0, null);
+        }
+        incrementInitPhaseFlags(
+          lView,
+          0
+          /* InitPhaseState.OnInitHooksToBeRun */
+        );
+      }
+    }
+    if (!isInExhaustiveCheckNoChangesPass) {
+      markTransplantedViewsForRefresh(lView);
+    }
+    runEffectsInView(lView);
+    detectChangesInEmbeddedViews(
+      lView,
+      0
+      /* ChangeDetectionMode.Global */
+    );
+    if (tView.contentQueries !== null) {
+      refreshContentQueries(tView, lView);
+    }
+    if (!isInCheckNoChangesPass) {
+      if (hooksInitPhaseCompleted) {
+        const contentCheckHooks = tView.contentCheckHooks;
+        if (contentCheckHooks !== null) {
+          executeCheckHooks(lView, contentCheckHooks);
+        }
+      } else {
+        const contentHooks = tView.contentHooks;
+        if (contentHooks !== null) {
+          executeInitAndCheckHooks(
+            lView,
+            contentHooks,
+            1
+            /* InitPhaseState.AfterContentInitHooksToBeRun */
+          );
+        }
+        incrementInitPhaseFlags(
+          lView,
+          1
+          /* InitPhaseState.AfterContentInitHooksToBeRun */
+        );
+      }
+    }
+    processHostBindingOpCodes(tView, lView);
+    const components = tView.components;
+    if (components !== null) {
+      detectChangesInChildComponents(
+        lView,
+        components,
+        0
+        /* ChangeDetectionMode.Global */
+      );
+    }
+    const viewQuery = tView.viewQuery;
+    if (viewQuery !== null) {
+      executeViewQueryFn(2, viewQuery, context2);
+    }
+    if (!isInCheckNoChangesPass) {
+      if (hooksInitPhaseCompleted) {
+        const viewCheckHooks = tView.viewCheckHooks;
+        if (viewCheckHooks !== null) {
+          executeCheckHooks(lView, viewCheckHooks);
+        }
+      } else {
+        const viewHooks = tView.viewHooks;
+        if (viewHooks !== null) {
+          executeInitAndCheckHooks(
+            lView,
+            viewHooks,
+            2
+            /* InitPhaseState.AfterViewInitHooksToBeRun */
+          );
+        }
+        incrementInitPhaseFlags(
+          lView,
+          2
+          /* InitPhaseState.AfterViewInitHooksToBeRun */
+        );
+      }
+    }
+    if (tView.firstUpdatePass === true) {
+      tView.firstUpdatePass = false;
+    }
+    if (lView[EFFECTS_TO_SCHEDULE]) {
+      for (const notifyEffect of lView[EFFECTS_TO_SCHEDULE]) {
+        notifyEffect();
+      }
+      lView[EFFECTS_TO_SCHEDULE] = null;
+    }
+    if (!isInCheckNoChangesPass) {
+      addAfterRenderSequencesForView(lView);
+      lView[FLAGS] &= ~(64 | 8);
+    }
+  } catch (e) {
+    if (!isInCheckNoChangesPass) {
+      markAncestorsForTraversal(lView);
+    }
+    throw e;
+  } finally {
+    if (currentConsumer !== null) {
+      consumerAfterComputation(currentConsumer, prevConsumer);
+      if (returnConsumerToPool) {
+        maybeReturnReactiveLViewConsumer(currentConsumer);
+      }
+    }
+    leaveView();
+  }
+}
+function detectChangesInEmbeddedViews(lView, mode) {
+  for (let lContainer = getFirstLContainer(lView); lContainer !== null; lContainer = getNextLContainer(lContainer)) {
+    for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+      const embeddedLView = lContainer[i];
+      detectChangesInViewIfAttached(embeddedLView, mode);
+    }
+  }
+}
+function markTransplantedViewsForRefresh(lView) {
+  for (let lContainer = getFirstLContainer(lView); lContainer !== null; lContainer = getNextLContainer(lContainer)) {
+    if (!(lContainer[FLAGS] & 2))
+      continue;
+    const movedViews = lContainer[MOVED_VIEWS];
+    ngDevMode && assertDefined(movedViews, "Transplanted View flags set but missing MOVED_VIEWS");
+    for (let i = 0; i < movedViews.length; i++) {
+      const movedLView = movedViews[i];
+      markViewForRefresh(movedLView);
+    }
+  }
+}
+function detectChangesInComponent(hostLView, componentHostIdx, mode) {
+  ngDevMode && assertEqual(isCreationMode(hostLView), false, "Should be run in update mode");
+  profiler(
+    18
+    /* ProfilerEvent.ComponentStart */
+  );
+  const componentView = getComponentLViewByIndex(componentHostIdx, hostLView);
+  detectChangesInViewIfAttached(componentView, mode);
+  profiler(19, componentView[CONTEXT]);
+}
+function detectChangesInViewIfAttached(lView, mode) {
+  if (!viewAttachedToChangeDetector(lView)) {
+    return;
+  }
+  detectChangesInView(lView, mode);
+}
+function detectChangesInView(lView, mode) {
+  const isInCheckNoChangesPass = ngDevMode && isInCheckNoChangesMode();
+  const tView = lView[TVIEW];
+  const flags = lView[FLAGS];
+  const consumer = lView[REACTIVE_TEMPLATE_CONSUMER];
+  let shouldRefreshView = !!(mode === 0 && flags & 16);
+  shouldRefreshView ||= !!(flags & 64 && mode === 0 && !isInCheckNoChangesPass);
+  shouldRefreshView ||= !!(flags & 1024);
+  shouldRefreshView ||= !!(consumer?.dirty && consumerPollProducersForChange(consumer));
+  shouldRefreshView ||= !!(ngDevMode && isExhaustiveCheckNoChanges());
+  if (consumer) {
+    consumer.dirty = false;
+  }
+  lView[FLAGS] &= ~(8192 | 1024);
+  if (shouldRefreshView) {
+    refreshView(tView, lView, tView.template, lView[CONTEXT]);
+  } else if (flags & 8192) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      if (!isInCheckNoChangesPass) {
+        runEffectsInView(lView);
+      }
+      detectChangesInEmbeddedViews(
+        lView,
+        1
+        /* ChangeDetectionMode.Targeted */
+      );
+      const components = tView.components;
+      if (components !== null) {
+        detectChangesInChildComponents(
+          lView,
+          components,
+          1
+          /* ChangeDetectionMode.Targeted */
+        );
+      }
+      if (!isInCheckNoChangesPass) {
+        addAfterRenderSequencesForView(lView);
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}
+function detectChangesInChildComponents(hostLView, components, mode) {
+  for (let i = 0; i < components.length; i++) {
+    detectChangesInComponent(hostLView, components[i], mode);
+  }
+}
+function processHostBindingOpCodes(tView, lView) {
+  const hostBindingOpCodes = tView.hostBindingOpCodes;
+  if (hostBindingOpCodes === null)
+    return;
+  try {
+    for (let i = 0; i < hostBindingOpCodes.length; i++) {
+      const opCode = hostBindingOpCodes[i];
+      if (opCode < 0) {
+        setSelectedIndex(~opCode);
+      } else {
+        const directiveIdx = opCode;
+        const bindingRootIndx = hostBindingOpCodes[++i];
+        const hostBindingFn = hostBindingOpCodes[++i];
+        setBindingRootForHostBindings(bindingRootIndx, directiveIdx);
+        const context2 = lView[directiveIdx];
+        profiler(24, context2);
+        hostBindingFn(2, context2);
+        profiler(25, context2);
+      }
+    }
+  } finally {
+    setSelectedIndex(-1);
+  }
+}
+function markViewDirty(lView, source) {
+  const dirtyBitsToUse = isRefreshingViews() ? (
+    // When we are actively refreshing views, we only use the `Dirty` bit to mark a view
+    64
+  ) : (
+    // When we are not actively refreshing a view tree, it is absolutely
+    // valid to update state and mark views dirty. We use the `RefreshView` flag in this
+    // case to allow synchronously rerunning change detection. This applies today to
+    // afterRender hooks as well as animation listeners which execute after detecting
+    // changes in a view when the render factory flushes.
+    1024 | 64
+  );
+  lView[ENVIRONMENT].changeDetectionScheduler?.notify(source);
+  while (lView) {
+    lView[FLAGS] |= dirtyBitsToUse;
+    const parent = getLViewParent(lView);
+    if (isRootView(lView) && !parent) {
+      return lView;
+    }
+    lView = parent;
+  }
+  return null;
+}
+function createLContainer(hostNative, currentView, native, tNode) {
+  ngDevMode && assertLView(currentView);
+  const lContainer = [
+    hostNative,
+    // host native
+    true,
+    // Boolean `true` in this position signifies that this is an `LContainer`
+    0,
+    // flags
+    currentView,
+    // parent
+    null,
+    // next
+    tNode,
+    // t_host
+    null,
+    // dehydrated views
+    native,
+    // native,
+    null,
+    // view refs
+    null
+    // moved views
+  ];
+  ngDevMode && assertEqual(lContainer.length, CONTAINER_HEADER_OFFSET, "Should allocate correct number of slots for LContainer header.");
+  return lContainer;
+}
+function getLViewFromLContainer(lContainer, index) {
+  const adjustedIndex = CONTAINER_HEADER_OFFSET + index;
+  if (adjustedIndex < lContainer.length) {
+    const lView = lContainer[adjustedIndex];
+    ngDevMode && assertLView(lView);
+    return lView;
+  }
+  return void 0;
+}
+function addLViewToLContainer(lContainer, lView, index, addToDOM = true) {
+  const tView = lView[TVIEW];
+  insertView(tView, lView, lContainer, index);
+  if (addToDOM) {
+    const beforeNode = getBeforeNodeForView(index, lContainer);
+    const renderer = lView[RENDERER];
+    const parentRNode = renderer.parentNode(lContainer[NATIVE]);
+    if (parentRNode !== null) {
+      addViewToDOM(tView, lContainer[T_HOST], renderer, lView, parentRNode, beforeNode);
+    }
+  }
+  const hydrationInfo = lView[HYDRATION];
+  if (hydrationInfo !== null && hydrationInfo.firstChild !== null) {
+    hydrationInfo.firstChild = null;
+  }
+}
+function removeLViewFromLContainer(lContainer, index) {
+  const lView = detachView(lContainer, index);
+  if (lView !== void 0) {
+    destroyLView(lView[TVIEW], lView);
+  }
+  return lView;
+}
+function detachView(lContainer, removeIndex) {
+  if (lContainer.length <= CONTAINER_HEADER_OFFSET)
+    return;
+  const indexInContainer = CONTAINER_HEADER_OFFSET + removeIndex;
+  const viewToDetach = lContainer[indexInContainer];
+  if (viewToDetach) {
+    const declarationLContainer = viewToDetach[DECLARATION_LCONTAINER];
+    if (declarationLContainer !== null && declarationLContainer !== lContainer) {
+      detachMovedView(declarationLContainer, viewToDetach);
+    }
+    if (removeIndex > 0) {
+      lContainer[indexInContainer - 1][NEXT] = viewToDetach[NEXT];
+    }
+    const removedLView = removeFromArray(lContainer, CONTAINER_HEADER_OFFSET + removeIndex);
+    removeViewFromDOM(viewToDetach[TVIEW], viewToDetach);
+    const lQueries = removedLView[QUERIES];
+    if (lQueries !== null) {
+      lQueries.detachView(removedLView[TVIEW]);
+    }
+    viewToDetach[PARENT] = null;
+    viewToDetach[NEXT] = null;
+    viewToDetach[FLAGS] &= ~128;
+  }
+  return viewToDetach;
+}
+function insertView(tView, lView, lContainer, index) {
+  ngDevMode && assertLView(lView);
+  ngDevMode && assertLContainer(lContainer);
+  const indexInContainer = CONTAINER_HEADER_OFFSET + index;
+  const containerLength = lContainer.length;
+  if (index > 0) {
+    lContainer[indexInContainer - 1][NEXT] = lView;
+  }
+  if (index < containerLength - CONTAINER_HEADER_OFFSET) {
+    lView[NEXT] = lContainer[indexInContainer];
+    addToArray(lContainer, CONTAINER_HEADER_OFFSET + index, lView);
+  } else {
+    lContainer.push(lView);
+    lView[NEXT] = null;
+  }
+  lView[PARENT] = lContainer;
+  const declarationLContainer = lView[DECLARATION_LCONTAINER];
+  if (declarationLContainer !== null && lContainer !== declarationLContainer) {
+    trackMovedView(declarationLContainer, lView);
+  }
+  const lQueries = lView[QUERIES];
+  if (lQueries !== null) {
+    lQueries.insertView(tView);
+  }
+  updateAncestorTraversalFlagsOnAttach(lView);
+  lView[FLAGS] |= 128;
+}
+function trackMovedView(declarationContainer, lView) {
+  ngDevMode && assertDefined(lView, "LView required");
+  ngDevMode && assertLContainer(declarationContainer);
+  const movedViews = declarationContainer[MOVED_VIEWS];
+  const parent = lView[PARENT];
+  ngDevMode && assertDefined(parent, "missing parent");
+  if (isLView(parent)) {
+    declarationContainer[FLAGS] |= 2;
+  } else {
+    const insertedComponentLView = parent[PARENT][DECLARATION_COMPONENT_VIEW];
+    ngDevMode && assertDefined(insertedComponentLView, "Missing insertedComponentLView");
+    const declaredComponentLView = lView[DECLARATION_COMPONENT_VIEW];
+    ngDevMode && assertDefined(declaredComponentLView, "Missing declaredComponentLView");
+    if (declaredComponentLView !== insertedComponentLView) {
+      declarationContainer[FLAGS] |= 2;
+    }
+  }
+  if (movedViews === null) {
+    declarationContainer[MOVED_VIEWS] = [lView];
+  } else {
+    movedViews.push(lView);
+  }
+}
+var ViewRef = class {
+  _lView;
+  _cdRefInjectingView;
+  _appRef = null;
+  _attachedToViewContainer = false;
+  exhaustive;
+  get rootNodes() {
+    const lView = this._lView;
+    const tView = lView[TVIEW];
+    return collectNativeNodes(tView, lView, tView.firstChild, []);
+  }
+  constructor(_lView, _cdRefInjectingView) {
+    this._lView = _lView;
+    this._cdRefInjectingView = _cdRefInjectingView;
+  }
+  get context() {
+    return this._lView[CONTEXT];
+  }
+  /**
+   * @deprecated Replacing the full context object is not supported. Modify the context
+   *   directly, or consider using a `Proxy` if you need to replace the full object.
+   * // TODO(devversion): Remove this.
+   */
+  set context(value) {
+    if (ngDevMode) {
+      console.warn("Angular: Replacing the `context` object of an `EmbeddedViewRef` is deprecated.");
+    }
+    this._lView[CONTEXT] = value;
+  }
+  get destroyed() {
+    return isDestroyed(this._lView);
+  }
+  destroy() {
+    if (this._appRef) {
+      this._appRef.detachView(this);
+    } else if (this._attachedToViewContainer) {
+      const parent = this._lView[PARENT];
+      if (isLContainer(parent)) {
+        const viewRefs = parent[VIEW_REFS];
+        const index = viewRefs ? viewRefs.indexOf(this) : -1;
+        if (index > -1) {
+          ngDevMode && assertEqual(index, parent.indexOf(this._lView) - CONTAINER_HEADER_OFFSET, "An attached view should be in the same position within its container as its ViewRef in the VIEW_REFS array.");
+          detachView(parent, index);
+          removeFromArray(viewRefs, index);
+        }
+      }
+      this._attachedToViewContainer = false;
+    }
+    destroyLView(this._lView[TVIEW], this._lView);
+  }
+  onDestroy(callback) {
+    storeLViewOnDestroy(this._lView, callback);
+  }
+  /**
+   * Marks a view and all of its ancestors dirty.
+   *
+   * This can be used to ensure an {@link ChangeDetectionStrategy#OnPush} component is
+   * checked when it needs to be re-rendered but the two normal triggers haven't marked it
+   * dirty (i.e. inputs haven't changed and events haven't fired in the view).
+   *
+   * <!-- TODO: Add a link to a chapter on OnPush components -->
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * ```ts
+   * @Component({
+   *   selector: 'app-root',
+   *   template: `Number of ticks: {{numberOfTicks}}`
+   *   changeDetection: ChangeDetectionStrategy.OnPush,
+   * })
+   * class AppComponent {
+   *   numberOfTicks = 0;
+   *
+   *   constructor(private ref: ChangeDetectorRef) {
+   *     setInterval(() => {
+   *       this.numberOfTicks++;
+   *       // the following is required, otherwise the view will not be updated
+   *       this.ref.markForCheck();
+   *     }, 1000);
+   *   }
+   * }
+   * ```
+   */
+  markForCheck() {
+    markViewDirty(
+      this._cdRefInjectingView || this._lView,
+      4
+      /* NotificationSource.MarkForCheck */
+    );
+  }
+  /**
+   * Detaches the view from the change detection tree.
+   *
+   * Detached views will not be checked during change detection runs until they are
+   * re-attached, even if they are dirty. `detach` can be used in combination with
+   * {@link ChangeDetectorRef#detectChanges} to implement local change
+   * detection checks.
+   *
+   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
+   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * The following example defines a component with a large list of readonly data.
+   * Imagine the data changes constantly, many times per second. For performance reasons,
+   * we want to check and update the list every five seconds. We can do that by detaching
+   * the component's change detector and doing a local check every five seconds.
+   *
+   * ```ts
+   * class DataProvider {
+   *   // in a real application the returned data will be different every time
+   *   get data() {
+   *     return [1,2,3,4,5];
+   *   }
+   * }
+   *
+   * @Component({
+   *   selector: 'giant-list',
+   *   template: `
+   *     @for(d of dataProvider.data; track $index) {
+   *        <li>Data {{d}}</li>
+   *     }
+   *   `,
+   * })
+   * class GiantList {
+   *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {
+   *     ref.detach();
+   *     setInterval(() => {
+   *       this.ref.detectChanges();
+   *     }, 5000);
+   *   }
+   * }
+   *
+   * @Component({
+   *   selector: 'app',
+   *   providers: [DataProvider],
+   *   template: `
+   *     <giant-list><giant-list>
+   *   `,
+   * })
+   * class App {
+   * }
+   * ```
+   */
+  detach() {
+    this._lView[FLAGS] &= ~128;
+  }
+  /**
+   * Re-attaches a view to the change detection tree.
+   *
+   * This can be used to re-attach views that were previously detached from the tree
+   * using {@link ChangeDetectorRef#detach}. Views are attached to the tree by default.
+   *
+   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * The following example creates a component displaying `live` data. The component will detach
+   * its change detector from the main change detector tree when the component's live property
+   * is set to false.
+   *
+   * ```ts
+   * class DataProvider {
+   *   data = 1;
+   *
+   *   constructor() {
+   *     setInterval(() => {
+   *       this.data = this.data * 2;
+   *     }, 500);
+   *   }
+   * }
+   *
+   * @Component({
+   *   selector: 'live-data',
+   *   inputs: ['live'],
+   *   template: 'Data: {{dataProvider.data}}'
+   * })
+   * class LiveData {
+   *   constructor(private ref: ChangeDetectorRef, private dataProvider: DataProvider) {}
+   *
+   *   set live(value) {
+   *     if (value) {
+   *       this.ref.reattach();
+   *     } else {
+   *       this.ref.detach();
+   *     }
+   *   }
+   * }
+   *
+   * @Component({
+   *   selector: 'app-root',
+   *   providers: [DataProvider],
+   *   template: `
+   *     Live Update: <input type="checkbox" [(ngModel)]="live">
+   *     <live-data [live]="live"><live-data>
+   *   `,
+   * })
+   * class AppComponent {
+   *   live = true;
+   * }
+   * ```
+   */
+  reattach() {
+    updateAncestorTraversalFlagsOnAttach(this._lView);
+    this._lView[FLAGS] |= 128;
+  }
+  /**
+   * Checks the view and its children.
+   *
+   * This can also be used in combination with {@link ChangeDetectorRef#detach} to implement
+   * local change detection checks.
+   *
+   * <!-- TODO: Add a link to a chapter on detach/reattach/local digest -->
+   * <!-- TODO: Add a live demo once ref.detectChanges is merged into master -->
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * The following example defines a component with a large list of readonly data.
+   * Imagine, the data changes constantly, many times per second. For performance reasons,
+   * we want to check and update the list every five seconds.
+   *
+   * We can do that by detaching the component's change detector and doing a local change detection
+   * check every five seconds.
+   *
+   * See {@link ChangeDetectorRef#detach} for more information.
+   */
+  detectChanges() {
+    this._lView[FLAGS] |= 1024;
+    detectChangesInternal(this._lView);
+  }
+  /**
+   * Checks the change detector and its children, and throws if any changes are detected.
+   *
+   * This is used in development mode to verify that running change detection doesn't
+   * introduce other changes.
+   */
+  checkNoChanges() {
+    if (!ngDevMode)
+      return;
+    try {
+      this.exhaustive ??= this._lView[INJECTOR].get(UseExhaustiveCheckNoChanges, USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT);
+    } catch {
+      this.exhaustive = USE_EXHAUSTIVE_CHECK_NO_CHANGES_DEFAULT;
+    }
+    checkNoChangesInternal(this._lView, this.exhaustive);
+  }
+  attachToViewContainerRef() {
+    if (this._appRef) {
+      throw new RuntimeError(902, ngDevMode && "This view is already attached directly to the ApplicationRef!");
+    }
+    this._attachedToViewContainer = true;
+  }
+  detachFromAppRef() {
+    this._appRef = null;
+    const isRoot = isRootView(this._lView);
+    const declarationContainer = this._lView[DECLARATION_LCONTAINER];
+    if (declarationContainer !== null && !isRoot) {
+      detachMovedView(declarationContainer, this._lView);
+    }
+    detachViewFromDOM(this._lView[TVIEW], this._lView);
+  }
+  attachToAppRef(appRef) {
+    if (this._attachedToViewContainer) {
+      throw new RuntimeError(902, ngDevMode && "This view is already attached to a ViewContainer!");
+    }
+    this._appRef = appRef;
+    const isRoot = isRootView(this._lView);
+    const declarationContainer = this._lView[DECLARATION_LCONTAINER];
+    if (declarationContainer !== null && !isRoot) {
+      trackMovedView(declarationContainer, this._lView);
+    }
+    updateAncestorTraversalFlagsOnAttach(this._lView);
+  }
+};
+function isViewDirty(view) {
+  return requiresRefreshOrTraversal(view._lView) || !!(view._lView[FLAGS] & 64);
+}
+function markForRefresh(view) {
+  markViewForRefresh(view._lView);
+}
+var TemplateRef = class {
+  _declarationLView;
+  _declarationTContainer;
+  /**
+   * The anchor element in the parent view for this embedded view.
+   *
+   * The data-binding and [injection contexts](guide/di/dependency-injection-context) of embedded
+   * views created from this `TemplateRef` inherit from the contexts of this location.
+   *
+   * Typically new embedded views are attached to the view container of this location, but in
+   * advanced use-cases, the view can be attached to a different container while keeping the
+   * data-binding and injection context from the original location.
+   *
+   */
+  elementRef;
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectTemplateRef;
+  /** @internal */
+  constructor(_declarationLView, _declarationTContainer, elementRef) {
+    this._declarationLView = _declarationLView;
+    this._declarationTContainer = _declarationTContainer;
+    this.elementRef = elementRef;
+  }
+  /**
+   * Returns an `ssrId` associated with a TView, which was used to
+   * create this instance of the `TemplateRef`.
+   *
+   * @internal
+   */
+  get ssrId() {
+    return this._declarationTContainer.tView?.ssrId || null;
+  }
+  /**
+   * Instantiates an unattached embedded view based on this template.
+   * @param context The data-binding context of the embedded view, as declared
+   * in the `<ng-template>` usage.
+   * @param injector Injector to be used within the embedded view.
+   * @returns The new embedded view object.
+   */
+  createEmbeddedView(context2, injector) {
+    return this.createEmbeddedViewImpl(context2, injector);
+  }
+  /**
+   * Implementation of the `createEmbeddedView` function.
+   *
+   * This implementation is internal and allows framework code
+   * to invoke it with extra parameters (e.g. for hydration) without
+   * affecting public API.
+   *
+   * @internal
+   */
+  createEmbeddedViewImpl(context2, injector, dehydratedView) {
+    const embeddedLView = createAndRenderEmbeddedLView(this._declarationLView, this._declarationTContainer, context2, { embeddedViewInjector: injector, dehydratedView });
+    return new ViewRef(embeddedLView);
+  }
+};
+function injectTemplateRef() {
+  return createTemplateRef(getCurrentTNode(), getLView());
+}
+function createTemplateRef(hostTNode, hostLView) {
+  if (hostTNode.type & 4) {
+    ngDevMode && assertDefined(hostTNode.tView, "TView must be allocated");
+    return new TemplateRef(hostLView, hostTNode, createElementRef(hostTNode, hostLView));
+  }
+  return null;
+}
+var AT_THIS_LOCATION = "<-- AT THIS LOCATION";
+function getFriendlyStringFromTNodeType(tNodeType) {
+  switch (tNodeType) {
+    case 4:
+      return "view container";
+    case 2:
+      return "element";
+    case 8:
+      return "ng-container";
+    case 32:
+      return "icu";
+    case 64:
+      return "i18n";
+    case 16:
+      return "projection";
+    case 1:
+      return "text";
+    case 128:
+      return "@let";
+    default:
+      return "<unknown>";
+  }
+}
+function validateMatchingNode(node, nodeType, tagName, lView, tNode, isViewContainerAnchor = false) {
+  if (!node || node.nodeType !== nodeType || node.nodeType === Node.ELEMENT_NODE && node.tagName.toLowerCase() !== tagName?.toLowerCase()) {
+    const expectedNode = shortRNodeDescription(nodeType, tagName, null);
+    let header = `During hydration Angular expected ${expectedNode} but `;
+    const hostComponentDef = getDeclarationComponentDef(lView);
+    const componentClassName = hostComponentDef?.type?.name;
+    const expectedDom = describeExpectedDom(lView, tNode, isViewContainerAnchor);
+    const expected = `Angular expected this DOM:
+
+${expectedDom}
+
+`;
+    let actual = "";
+    const componentHostElement = unwrapRNode(lView[HOST]);
+    if (!node) {
+      header += `the node was not found.
+
+`;
+      markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom);
+    } else {
+      const actualNode = shortRNodeDescription(node.nodeType, node.tagName ?? null, node.textContent ?? null);
+      header += `found ${actualNode}.
+
+`;
+      const actualDom = describeDomFromNode(node);
+      actual = `Actual DOM is:
+
+${actualDom}
+
+`;
+      markRNodeAsHavingHydrationMismatch(componentHostElement, expectedDom, actualDom);
+    }
+    const footer = getHydrationErrorFooter(componentClassName);
+    const message = header + expected + actual + getHydrationAttributeNote() + footer;
+    throw new RuntimeError(-500, message);
+  }
+}
+function validateSiblingNodeExists(node) {
+  validateNodeExists(node);
+  if (!node.nextSibling) {
+    const header = "During hydration Angular expected more sibling nodes to be present.\n\n";
+    const actual = `Actual DOM is:
+
+${describeDomFromNode(node)}
+
+`;
+    const footer = getHydrationErrorFooter();
+    const message = header + actual + footer;
+    markRNodeAsHavingHydrationMismatch(node, "", actual);
+    throw new RuntimeError(-501, message);
+  }
+}
+function validateNodeExists(node, lView = null, tNode = null) {
+  if (!node) {
+    const header = "During hydration, Angular expected an element to be present at this location.\n\n";
+    let expected = "";
+    let footer = "";
+    if (lView !== null && tNode !== null) {
+      expected = describeExpectedDom(lView, tNode, false);
+      footer = getHydrationErrorFooter();
+      markRNodeAsHavingHydrationMismatch(unwrapRNode(lView[HOST]), expected, "");
+    }
+    throw new RuntimeError(-502, `${header}${expected}
+
+${footer}`);
+  }
+}
+function nodeNotFoundError(lView, tNode) {
+  const header = "During serialization, Angular was unable to find an element in the DOM:\n\n";
+  const expected = `${describeExpectedDom(lView, tNode, false)}
+
+`;
+  const footer = getHydrationErrorFooter();
+  throw new RuntimeError(-502, header + expected + footer);
+}
+function nodeNotFoundAtPathError(host, path) {
+  const header = `During hydration Angular was unable to locate a node using the "${path}" path, starting from the ${describeRNode(host)} node.
+
+`;
+  const footer = getHydrationErrorFooter();
+  markRNodeAsHavingHydrationMismatch(host);
+  throw new RuntimeError(-502, header + footer);
+}
+function unsupportedProjectionOfDomNodes(rNode) {
+  const header = "During serialization, Angular detected DOM nodes that were created outside of Angular context and provided as projectable nodes (likely via `ViewContainerRef.createComponent` or `createComponent` APIs). Hydration is not supported for such cases, consider refactoring the code to avoid this pattern or using `ngSkipHydration` on the host element of the component.\n\n";
+  const actual = `${describeDomFromNode(rNode)}
+
+`;
+  const message = header + actual + getHydrationAttributeNote();
+  return new RuntimeError(-503, message);
+}
+function invalidSkipHydrationHost(rNode) {
+  const header = "The `ngSkipHydration` flag is applied on a node that doesn't act as a component host. Hydration can be skipped only on per-component basis.\n\n";
+  const actual = `${describeDomFromNode(rNode)}
+
+`;
+  const footer = "Please move the `ngSkipHydration` attribute to the component host element.\n\n";
+  const message = header + actual + footer;
+  return new RuntimeError(-504, message);
+}
+function stringifyTNodeAttrs(tNode) {
+  const results = [];
+  if (tNode.attrs) {
+    for (let i = 0; i < tNode.attrs.length; ) {
+      const attrName = tNode.attrs[i++];
+      if (typeof attrName == "number") {
+        break;
+      }
+      const attrValue = tNode.attrs[i++];
+      results.push(`${attrName}="${shorten(attrValue)}"`);
+    }
+  }
+  return results.join(" ");
+}
+var internalAttrs = /* @__PURE__ */ new Set(["ngh", "ng-version", "ng-server-context"]);
+function stringifyRNodeAttrs(rNode) {
+  const results = [];
+  for (let i = 0; i < rNode.attributes.length; i++) {
+    const attr = rNode.attributes[i];
+    if (internalAttrs.has(attr.name))
+      continue;
+    results.push(`${attr.name}="${shorten(attr.value)}"`);
+  }
+  return results.join(" ");
+}
+function describeTNode(tNode, innerContent = "…") {
+  switch (tNode.type) {
+    case 1:
+      const content = tNode.value ? `(${tNode.value})` : "";
+      return `#text${content}`;
+    case 2:
+      const attrs = stringifyTNodeAttrs(tNode);
+      const tag = tNode.value.toLowerCase();
+      return `<${tag}${attrs ? " " + attrs : ""}>${innerContent}</${tag}>`;
+    case 8:
+      return "<!-- ng-container -->";
+    case 4:
+      return "<!-- container -->";
+    default:
+      const typeAsString = getFriendlyStringFromTNodeType(tNode.type);
+      return `#node(${typeAsString})`;
+  }
+}
+function describeRNode(rNode, innerContent = "…") {
+  const node = rNode;
+  switch (node.nodeType) {
+    case Node.ELEMENT_NODE:
+      const tag = node.tagName.toLowerCase();
+      const attrs = stringifyRNodeAttrs(node);
+      return `<${tag}${attrs ? " " + attrs : ""}>${innerContent}</${tag}>`;
+    case Node.TEXT_NODE:
+      const content = node.textContent ? shorten(node.textContent) : "";
+      return `#text${content ? `(${content})` : ""}`;
+    case Node.COMMENT_NODE:
+      return `<!-- ${shorten(node.textContent ?? "")} -->`;
+    default:
+      return `#node(${node.nodeType})`;
+  }
+}
+function describeExpectedDom(lView, tNode, isViewContainerAnchor) {
+  const spacer = "  ";
+  let content = "";
+  if (tNode.prev) {
+    content += spacer + "…\n";
+    content += spacer + describeTNode(tNode.prev) + "\n";
+  } else if (tNode.type && tNode.type & 12) {
+    content += spacer + "…\n";
+  }
+  if (isViewContainerAnchor) {
+    content += spacer + describeTNode(tNode) + "\n";
+    content += spacer + `<!-- container -->  ${AT_THIS_LOCATION}
+`;
+  } else {
+    content += spacer + describeTNode(tNode) + `  ${AT_THIS_LOCATION}
+`;
+  }
+  content += spacer + "…\n";
+  const parentRNode = tNode.type ? getParentRElement(lView[TVIEW], tNode, lView) : null;
+  if (parentRNode) {
+    content = describeRNode(parentRNode, "\n" + content);
+  }
+  return content;
+}
+function describeDomFromNode(node) {
+  const spacer = "  ";
+  let content = "";
+  const currentNode = node;
+  if (currentNode.previousSibling) {
+    content += spacer + "…\n";
+    content += spacer + describeRNode(currentNode.previousSibling) + "\n";
+  }
+  content += spacer + describeRNode(currentNode) + `  ${AT_THIS_LOCATION}
+`;
+  if (node.nextSibling) {
+    content += spacer + "…\n";
+  }
+  if (node.parentNode) {
+    content = describeRNode(currentNode.parentNode, "\n" + content);
+  }
+  return content;
+}
+function shortRNodeDescription(nodeType, tagName, textContent) {
+  switch (nodeType) {
+    case Node.ELEMENT_NODE:
+      return `<${tagName.toLowerCase()}>`;
+    case Node.TEXT_NODE:
+      const content = textContent ? ` (with the "${shorten(textContent)}" content)` : "";
+      return `a text node${content}`;
+    case Node.COMMENT_NODE:
+      return "a comment node";
+    default:
+      return `#node(nodeType=${nodeType})`;
+  }
+}
+function getHydrationErrorFooter(componentClassName) {
+  const componentInfo = componentClassName ? `the "${componentClassName}"` : "corresponding";
+  return `To fix this problem:
+  * check ${componentInfo} component for hydration-related issues
+  * check to see if your template has valid HTML structure
+  * or skip hydration by adding the \`ngSkipHydration\` attribute to its host node in a template
+
+`;
+}
+function getHydrationAttributeNote() {
+  return "Note: attributes are only displayed to better represent the DOM but have no effect on hydration mismatches.\n\n";
+}
+function stripNewlines(input2) {
+  return input2.replace(/\s+/gm, "");
+}
+function shorten(input2, maxLength = 50) {
+  if (!input2) {
+    return "";
+  }
+  input2 = stripNewlines(input2);
+  return input2.length > maxLength ? `${input2.substring(0, maxLength - 1)}…` : input2;
+}
+function getInsertInFrontOfRNodeWithI18n(parentTNode, currentTNode, lView) {
+  const tNodeInsertBeforeIndex = currentTNode.insertBeforeIndex;
+  const insertBeforeIndex = Array.isArray(tNodeInsertBeforeIndex) ? tNodeInsertBeforeIndex[0] : tNodeInsertBeforeIndex;
+  if (insertBeforeIndex === null) {
+    return getInsertInFrontOfRNodeWithNoI18n(parentTNode, currentTNode, lView);
+  } else {
+    ngDevMode && assertIndexInRange(lView, insertBeforeIndex);
+    return unwrapRNode(lView[insertBeforeIndex]);
+  }
+}
+function processI18nInsertBefore(renderer, childTNode, lView, childRNode, parentRElement) {
+  const tNodeInsertBeforeIndex = childTNode.insertBeforeIndex;
+  if (Array.isArray(tNodeInsertBeforeIndex)) {
+    ngDevMode && assertDomNode(childRNode);
+    let i18nParent = childRNode;
+    let anchorRNode = null;
+    if (!(childTNode.type & 3)) {
+      anchorRNode = i18nParent;
+      i18nParent = parentRElement;
+    }
+    if (i18nParent !== null && childTNode.componentOffset === -1) {
+      for (let i = 1; i < tNodeInsertBeforeIndex.length; i++) {
+        const i18nChild = lView[tNodeInsertBeforeIndex[i]];
+        nativeInsertBefore(renderer, i18nParent, i18nChild, anchorRNode, false);
+      }
+    }
+  }
+}
+function getOrCreateTNode(tView, index, type, name, attrs) {
+  ngDevMode && index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in
+  // `view_engine_compatibility` for additional context.
+  assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header.");
+  ngDevMode && assertPureTNodeType(type);
+  let tNode = tView.data[index];
+  if (tNode === null) {
+    tNode = createTNodeAtIndex(tView, index, type, name, attrs);
+    if (isInI18nBlock()) {
+      tNode.flags |= 32;
+    }
+  } else if (tNode.type & 64) {
+    tNode.type = type;
+    tNode.value = name;
+    tNode.attrs = attrs;
+    const parent = getCurrentParentTNode();
+    tNode.injectorIndex = parent === null ? -1 : parent.injectorIndex;
+    ngDevMode && assertTNodeForTView(tNode, tView);
+    ngDevMode && assertEqual(index, tNode.index, "Expecting same index");
+  }
+  setCurrentTNode(tNode, true);
+  return tNode;
+}
+function createTNodeAtIndex(tView, index, type, name, attrs) {
+  const currentTNode = getCurrentTNodePlaceholderOk();
+  const isParent = isCurrentTNodeParent();
+  const parent = isParent ? currentTNode : currentTNode && currentTNode.parent;
+  const tNode = tView.data[index] = createTNode(tView, parent, type, index, name, attrs);
+  linkTNodeInTView(tView, tNode, currentTNode, isParent);
+  return tNode;
+}
+function linkTNodeInTView(tView, tNode, currentTNode, isParent) {
+  if (tView.firstChild === null) {
+    tView.firstChild = tNode;
+  }
+  if (currentTNode !== null) {
+    if (isParent) {
+      if (currentTNode.child == null && tNode.parent !== null) {
+        currentTNode.child = tNode;
+      }
+    } else {
+      if (currentTNode.next === null) {
+        currentTNode.next = tNode;
+        tNode.prev = currentTNode;
+      }
+    }
+  }
+}
+function createTNode(tView, tParent, type, index, value, attrs) {
+  ngDevMode && index !== 0 && // 0 are bogus nodes and they are OK. See `createContainerRef` in
+  // `view_engine_compatibility` for additional context.
+  assertGreaterThanOrEqual(index, HEADER_OFFSET, "TNodes can't be in the LView header.");
+  ngDevMode && assertNotSame(attrs, void 0, "'undefined' is not valid value for 'attrs'");
+  ngDevMode && tParent && assertTNodeForTView(tParent, tView);
+  let injectorIndex = tParent ? tParent.injectorIndex : -1;
+  let flags = 0;
+  if (isInSkipHydrationBlock()) {
+    flags |= 128;
+  }
+  const tNode = {
+    type,
+    index,
+    insertBeforeIndex: null,
+    injectorIndex,
+    directiveStart: -1,
+    directiveEnd: -1,
+    directiveStylingLast: -1,
+    componentOffset: -1,
+    propertyBindings: null,
+    flags,
+    providerIndexes: 0,
+    value,
+    attrs,
+    mergedAttrs: null,
+    localNames: null,
+    initialInputs: null,
+    inputs: null,
+    hostDirectiveInputs: null,
+    outputs: null,
+    hostDirectiveOutputs: null,
+    directiveToIndex: null,
+    tView: null,
+    next: null,
+    prev: null,
+    projectionNext: null,
+    child: null,
+    parent: tParent,
+    projection: null,
+    styles: null,
+    stylesWithoutHost: null,
+    residualStyles: void 0,
+    classes: null,
+    classesWithoutHost: null,
+    residualClasses: void 0,
+    classBindings: 0,
+    styleBindings: 0
+  };
+  if (ngDevMode) {
+    Object.seal(tNode);
+  }
+  return tNode;
+}
+function addTNodeAndUpdateInsertBeforeIndex(previousTNodes, newTNode) {
+  ngDevMode && assertEqual(newTNode.insertBeforeIndex, null, "We expect that insertBeforeIndex is not set");
+  previousTNodes.push(newTNode);
+  if (previousTNodes.length > 1) {
+    for (let i = previousTNodes.length - 2; i >= 0; i--) {
+      const existingTNode = previousTNodes[i];
+      if (!isI18nText(existingTNode)) {
+        if (isNewTNodeCreatedBefore(existingTNode, newTNode) && getInsertBeforeIndex(existingTNode) === null) {
+          setInsertBeforeIndex(existingTNode, newTNode.index);
+        }
+      }
+    }
+  }
+}
+function isI18nText(tNode) {
+  return !(tNode.type & 64);
+}
+function isNewTNodeCreatedBefore(existingTNode, newTNode) {
+  return isI18nText(newTNode) || existingTNode.index > newTNode.index;
+}
+function getInsertBeforeIndex(tNode) {
+  const index = tNode.insertBeforeIndex;
+  return Array.isArray(index) ? index[0] : index;
+}
+function setInsertBeforeIndex(tNode, value) {
+  const index = tNode.insertBeforeIndex;
+  if (Array.isArray(index)) {
+    index[0] = value;
+  } else {
+    setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);
+    tNode.insertBeforeIndex = value;
+  }
+}
+function getTIcu(tView, index) {
+  const value = tView.data[index];
+  if (value === null || typeof value === "string")
+    return null;
+  if (ngDevMode && !(value.hasOwnProperty("tView") || value.hasOwnProperty("currentCaseLViewIndex"))) {
+    throwError2("We expect to get 'null'|'TIcu'|'TIcuContainer', but got: " + value);
+  }
+  const tIcu = value.hasOwnProperty("currentCaseLViewIndex") ? value : value.value;
+  ngDevMode && assertTIcu(tIcu);
+  return tIcu;
+}
+function setTIcu(tView, index, tIcu) {
+  const tNode = tView.data[index];
+  ngDevMode && assertEqual(tNode === null || tNode.hasOwnProperty("tView"), true, "We expect to get 'null'|'TIcuContainer'");
+  if (tNode === null) {
+    tView.data[index] = tIcu;
+  } else {
+    ngDevMode && assertTNodeType(
+      tNode,
+      32
+      /* TNodeType.Icu */
+    );
+    tNode.value = tIcu;
+  }
+}
+function setTNodeInsertBeforeIndex(tNode, index) {
+  ngDevMode && assertTNode(tNode);
+  let insertBeforeIndex = tNode.insertBeforeIndex;
+  if (insertBeforeIndex === null) {
+    setI18nHandling(getInsertInFrontOfRNodeWithI18n, processI18nInsertBefore);
+    insertBeforeIndex = tNode.insertBeforeIndex = [
+      null,
+      index
+    ];
+  } else {
+    assertEqual(Array.isArray(insertBeforeIndex), true, "Expecting array here");
+    insertBeforeIndex.push(index);
+  }
+}
+function createTNodePlaceholder(tView, previousTNodes, index) {
+  const tNode = createTNodeAtIndex(tView, index, 64, null, null);
+  addTNodeAndUpdateInsertBeforeIndex(previousTNodes, tNode);
+  return tNode;
+}
+function getCurrentICUCaseIndex(tIcu, lView) {
+  const currentCase = lView[tIcu.currentCaseLViewIndex];
+  return currentCase === null ? currentCase : currentCase < 0 ? ~currentCase : currentCase;
+}
+function getParentFromIcuCreateOpCode(mergedCode) {
+  return mergedCode >>> 17;
+}
+function getRefFromIcuCreateOpCode(mergedCode) {
+  return (mergedCode & 131070) >>> 1;
+}
+function getInstructionFromIcuCreateOpCode(mergedCode) {
+  return mergedCode & 1;
+}
+function icuCreateOpCode(opCode, parentIdx, refIdx) {
+  ngDevMode && assertGreaterThanOrEqual(parentIdx, 0, "Missing parent index");
+  ngDevMode && assertGreaterThan(refIdx, 0, "Missing ref index");
+  return opCode | parentIdx << 17 | refIdx << 1;
+}
+function isRootTemplateMessage(subTemplateIndex) {
+  return subTemplateIndex === -1;
+}
+function enterIcu(state, tIcu, lView) {
+  state.index = 0;
+  const currentCase = getCurrentICUCaseIndex(tIcu, lView);
+  if (currentCase !== null) {
+    ngDevMode && assertNumberInRange(currentCase, 0, tIcu.cases.length - 1);
+    state.removes = tIcu.remove[currentCase];
+  } else {
+    state.removes = EMPTY_ARRAY;
+  }
+}
+function icuContainerIteratorNext(state) {
+  if (state.index < state.removes.length) {
+    const removeOpCode = state.removes[state.index++];
+    ngDevMode && assertNumber(removeOpCode, "Expecting OpCode number");
+    if (removeOpCode > 0) {
+      const rNode = state.lView[removeOpCode];
+      ngDevMode && assertDomNode(rNode);
+      return rNode;
+    } else {
+      state.stack.push(state.index, state.removes);
+      const tIcuIndex = ~removeOpCode;
+      const tIcu = state.lView[TVIEW].data[tIcuIndex];
+      ngDevMode && assertTIcu(tIcu);
+      enterIcu(state, tIcu, state.lView);
+      return icuContainerIteratorNext(state);
+    }
+  } else {
+    if (state.stack.length === 0) {
+      return null;
+    } else {
+      state.removes = state.stack.pop();
+      state.index = state.stack.pop();
+      return icuContainerIteratorNext(state);
+    }
+  }
+}
+function loadIcuContainerVisitor() {
+  const _state = {
+    stack: [],
+    index: -1
+  };
+  function icuContainerIteratorStart(tIcuContainerNode, lView) {
+    _state.lView = lView;
+    while (_state.stack.length)
+      _state.stack.pop();
+    ngDevMode && assertTNodeForLView(tIcuContainerNode, lView);
+    enterIcu(_state, tIcuContainerNode.value, lView);
+    return icuContainerIteratorNext.bind(null, _state);
+  }
+  return icuContainerIteratorStart;
+}
+function createIcuIterator(tIcu, lView) {
+  const state = {
+    stack: [],
+    index: -1,
+    lView
+  };
+  ngDevMode && assertTIcu(tIcu);
+  enterIcu(state, tIcu, lView);
+  return icuContainerIteratorNext.bind(null, state);
+}
+var REF_EXTRACTOR_REGEXP = new RegExp(`^(\\d+)*(${REFERENCE_NODE_BODY}|${REFERENCE_NODE_HOST})*(.*)`);
+function compressNodeLocation(referenceNode, path) {
+  const result = [referenceNode];
+  for (const segment of path) {
+    const lastIdx = result.length - 1;
+    if (lastIdx > 0 && result[lastIdx - 1] === segment) {
+      const value = result[lastIdx] || 1;
+      result[lastIdx] = value + 1;
+    } else {
+      result.push(segment, "");
+    }
+  }
+  return result.join("");
+}
+function decompressNodeLocation(path) {
+  const matches = path.match(REF_EXTRACTOR_REGEXP);
+  const [_, refNodeId, refNodeName, rest] = matches;
+  const ref = refNodeId ? parseInt(refNodeId, 10) : refNodeName;
+  const steps = [];
+  for (const [_2, step, count2] of rest.matchAll(/(f|n)(\d*)/g)) {
+    const repeat2 = parseInt(count2, 10) || 1;
+    steps.push(step, repeat2);
+  }
+  return [ref, ...steps];
+}
+function isFirstElementInNgContainer(tNode) {
+  return !tNode.prev && tNode.parent?.type === 8;
+}
+function getNoOffsetIndex(tNode) {
+  return tNode.index - HEADER_OFFSET;
+}
+function isDisconnectedNode(tNode, lView) {
+  return !(tNode.type & (16 | 128)) && !!lView[tNode.index] && isDisconnectedRNode(unwrapRNode(lView[tNode.index]));
+}
+function isDisconnectedRNode(rNode) {
+  return !!rNode && !rNode.isConnected;
+}
+function locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex) {
+  const i18nNodes = hydrationInfo.i18nNodes;
+  if (i18nNodes) {
+    return i18nNodes.get(noOffsetIndex);
+  }
+  return void 0;
+}
+function tryLocateRNodeByPath(hydrationInfo, lView, noOffsetIndex) {
+  const nodes = hydrationInfo.data[NODES];
+  const path = nodes?.[noOffsetIndex];
+  return path ? locateRNodeByPath(path, lView) : null;
+}
+function locateNextRNode(hydrationInfo, tView, lView, tNode) {
+  const noOffsetIndex = getNoOffsetIndex(tNode);
+  let native = locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex);
+  if (native === void 0) {
+    const nodes = hydrationInfo.data[NODES];
+    if (nodes?.[noOffsetIndex]) {
+      native = locateRNodeByPath(nodes[noOffsetIndex], lView);
+    } else if (tView.firstChild === tNode) {
+      native = hydrationInfo.firstChild;
+    } else {
+      const previousTNodeParent = tNode.prev === null;
+      const previousTNode = tNode.prev ?? tNode.parent;
+      ngDevMode && assertDefined(previousTNode, "Unexpected state: current TNode does not have a connection to the previous node or a parent node.");
+      if (isFirstElementInNgContainer(tNode)) {
+        const noOffsetParentIndex = getNoOffsetIndex(tNode.parent);
+        native = getSegmentHead(hydrationInfo, noOffsetParentIndex);
+      } else {
+        let previousRElement = getNativeByTNode(previousTNode, lView);
+        if (previousTNodeParent) {
+          native = previousRElement.firstChild;
+        } else {
+          const noOffsetPrevSiblingIndex = getNoOffsetIndex(previousTNode);
+          const segmentHead = getSegmentHead(hydrationInfo, noOffsetPrevSiblingIndex);
+          if (previousTNode.type === 2 && segmentHead) {
+            const numRootNodesToSkip = calcSerializedContainerSize(hydrationInfo, noOffsetPrevSiblingIndex);
+            const nodesToSkip = numRootNodesToSkip + 1;
+            native = siblingAfter(nodesToSkip, segmentHead);
+          } else {
+            native = previousRElement.nextSibling;
+          }
+        }
+      }
+    }
+  }
+  return native;
+}
+function siblingAfter(skip2, from2) {
+  let currentNode = from2;
+  for (let i = 0; i < skip2; i++) {
+    ngDevMode && validateSiblingNodeExists(currentNode);
+    currentNode = currentNode.nextSibling;
+  }
+  return currentNode;
+}
+function stringifyNavigationInstructions(instructions) {
+  const container = [];
+  for (let i = 0; i < instructions.length; i += 2) {
+    const step = instructions[i];
+    const repeat2 = instructions[i + 1];
+    for (let r = 0; r < repeat2; r++) {
+      container.push(step === NODE_NAVIGATION_STEP_FIRST_CHILD ? "firstChild" : "nextSibling");
+    }
+  }
+  return container.join(".");
+}
+function navigateToNode(from2, instructions) {
+  let node = from2;
+  for (let i = 0; i < instructions.length; i += 2) {
+    const step = instructions[i];
+    const repeat2 = instructions[i + 1];
+    for (let r = 0; r < repeat2; r++) {
+      if (ngDevMode && !node) {
+        throw nodeNotFoundAtPathError(from2, stringifyNavigationInstructions(instructions));
+      }
+      switch (step) {
+        case NODE_NAVIGATION_STEP_FIRST_CHILD:
+          node = node.firstChild;
+          break;
+        case NODE_NAVIGATION_STEP_NEXT_SIBLING:
+          node = node.nextSibling;
+          break;
+      }
+    }
+  }
+  if (ngDevMode && !node) {
+    throw nodeNotFoundAtPathError(from2, stringifyNavigationInstructions(instructions));
+  }
+  return node;
+}
+function locateRNodeByPath(path, lView) {
+  const [referenceNode, ...navigationInstructions] = decompressNodeLocation(path);
+  let ref;
+  if (referenceNode === REFERENCE_NODE_HOST) {
+    ref = lView[DECLARATION_COMPONENT_VIEW][HOST];
+  } else if (referenceNode === REFERENCE_NODE_BODY) {
+    ref = ɵɵresolveBody(lView[DECLARATION_COMPONENT_VIEW][HOST]);
+  } else {
+    const parentElementId = Number(referenceNode);
+    ref = unwrapRNode(lView[parentElementId + HEADER_OFFSET]);
+  }
+  return navigateToNode(ref, navigationInstructions);
+}
+function navigateBetween(start, finish) {
+  if (start === finish) {
+    return [];
+  } else if (start.parentElement == null || finish.parentElement == null) {
+    return null;
+  } else if (start.parentElement === finish.parentElement) {
+    return navigateBetweenSiblings(start, finish);
+  } else {
+    const parent = finish.parentElement;
+    const parentPath = navigateBetween(start, parent);
+    const childPath = navigateBetween(parent.firstChild, finish);
+    if (!parentPath || !childPath)
+      return null;
+    return [
+      // First navigate to `finish`'s parent
+      ...parentPath,
+      // Then to its first child.
+      NODE_NAVIGATION_STEP_FIRST_CHILD,
+      // And finally from that node to `finish` (maybe a no-op if we're already there).
+      ...childPath
+    ];
+  }
+}
+function navigateBetweenSiblings(start, finish) {
+  const nav = [];
+  let node = null;
+  for (node = start; node != null && node !== finish; node = node.nextSibling) {
+    nav.push(NODE_NAVIGATION_STEP_NEXT_SIBLING);
+  }
+  return node == null ? null : nav;
+}
+function calcPathBetween(from2, to, fromNodeName) {
+  const path = navigateBetween(from2, to);
+  return path === null ? null : compressNodeLocation(fromNodeName, path);
+}
+function calcPathForNode(tNode, lView, excludedParentNodes) {
+  let parentTNode = tNode.parent;
+  let parentIndex;
+  let parentRNode;
+  let referenceNodeName;
+  while (parentTNode !== null && (isDisconnectedNode(parentTNode, lView) || excludedParentNodes?.has(parentTNode.index))) {
+    parentTNode = parentTNode.parent;
+  }
+  if (parentTNode === null || !(parentTNode.type & 3)) {
+    parentIndex = referenceNodeName = REFERENCE_NODE_HOST;
+    parentRNode = lView[DECLARATION_COMPONENT_VIEW][HOST];
+  } else {
+    parentIndex = parentTNode.index;
+    parentRNode = unwrapRNode(lView[parentIndex]);
+    referenceNodeName = renderStringify(parentIndex - HEADER_OFFSET);
+  }
+  let rNode = unwrapRNode(lView[tNode.index]);
+  if (tNode.type & (12 | 32)) {
+    const firstRNode = getFirstNativeNode(lView, tNode);
+    if (firstRNode) {
+      rNode = firstRNode;
+    }
+  }
+  let path = calcPathBetween(parentRNode, rNode, referenceNodeName);
+  if (path === null && parentRNode !== rNode) {
+    const body = parentRNode.ownerDocument.body;
+    path = calcPathBetween(body, rNode, REFERENCE_NODE_BODY);
+    if (path === null) {
+      throw nodeNotFoundError(lView, tNode);
+    }
+  }
+  return path;
+}
+function gatherDeferBlocksCommentNodes(doc, node) {
+  const commentNodesIterator = doc.createNodeIterator(node, NodeFilter.SHOW_COMMENT, { acceptNode });
+  let currentNode;
+  const nodesByBlockId = /* @__PURE__ */ new Map();
+  while (currentNode = commentNodesIterator.nextNode()) {
+    const nghPattern = "ngh=";
+    const content = currentNode?.textContent;
+    const nghIdx = content?.indexOf(nghPattern) ?? -1;
+    if (nghIdx > -1) {
+      const nghValue = content.substring(nghIdx + nghPattern.length).trim();
+      ngDevMode && assertEqual(nghValue.startsWith("d"), true, "Invalid defer block id found in a comment node.");
+      nodesByBlockId.set(nghValue, currentNode);
+    }
+  }
+  return nodesByBlockId;
+}
+function acceptNode(node) {
+  return node.textContent?.trimStart().startsWith("ngh=") ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;
+}
+var _isI18nHydrationSupportEnabled = false;
+var _prepareI18nBlockForHydrationImpl = () => {
+};
+function setIsI18nHydrationSupportEnabled(enabled) {
+  _isI18nHydrationSupportEnabled = enabled;
+}
+function isI18nHydrationSupportEnabled() {
+  return _isI18nHydrationSupportEnabled;
+}
+function prepareI18nBlockForHydration(lView, index, parentTNode, subTemplateIndex) {
+  _prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex);
+}
+function enablePrepareI18nBlockForHydrationImpl() {
+  _prepareI18nBlockForHydrationImpl = prepareI18nBlockForHydrationImpl;
+}
+function isI18nHydrationEnabled(injector) {
+  injector = injector ?? inject(Injector);
+  return injector.get(IS_I18N_HYDRATION_ENABLED, false);
+}
+function getOrComputeI18nChildren(tView, context2) {
+  let i18nChildren = context2.i18nChildren.get(tView);
+  if (i18nChildren === void 0) {
+    i18nChildren = collectI18nChildren(tView);
+    context2.i18nChildren.set(tView, i18nChildren);
+  }
+  return i18nChildren;
+}
+function collectI18nChildren(tView) {
+  const children = /* @__PURE__ */ new Set();
+  function collectI18nViews(node) {
+    children.add(node.index);
+    switch (node.kind) {
+      case 1:
+      case 2: {
+        for (const childNode of node.children) {
+          collectI18nViews(childNode);
+        }
+        break;
+      }
+      case 3: {
+        for (const caseNodes of node.cases) {
+          for (const caseNode of caseNodes) {
+            collectI18nViews(caseNode);
+          }
+        }
+        break;
+      }
+    }
+  }
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    const tI18n = tView.data[i];
+    if (!tI18n || !tI18n.ast) {
+      continue;
+    }
+    for (const node of tI18n.ast) {
+      collectI18nViews(node);
+    }
+  }
+  return children.size === 0 ? null : children;
+}
+function trySerializeI18nBlock(lView, index, context2) {
+  if (!context2.isI18nHydrationEnabled) {
+    return null;
+  }
+  const tView = lView[TVIEW];
+  const tI18n = tView.data[index];
+  if (!tI18n || !tI18n.ast) {
+    return null;
+  }
+  const parentTNode = tView.data[tI18n.parentTNodeIndex];
+  if (parentTNode && isI18nInSkipHydrationBlock(parentTNode)) {
+    return null;
+  }
+  const serializedI18nBlock = {
+    caseQueue: [],
+    disconnectedNodes: /* @__PURE__ */ new Set(),
+    disjointNodes: /* @__PURE__ */ new Set()
+  };
+  serializeI18nBlock(lView, serializedI18nBlock, context2, tI18n.ast);
+  return serializedI18nBlock.caseQueue.length === 0 && serializedI18nBlock.disconnectedNodes.size === 0 && serializedI18nBlock.disjointNodes.size === 0 ? null : serializedI18nBlock;
+}
+function serializeI18nBlock(lView, serializedI18nBlock, context2, nodes) {
+  let prevRNode = null;
+  for (const node of nodes) {
+    const nextRNode = serializeI18nNode(lView, serializedI18nBlock, context2, node);
+    if (nextRNode) {
+      if (isDisjointNode(prevRNode, nextRNode)) {
+        serializedI18nBlock.disjointNodes.add(node.index - HEADER_OFFSET);
+      }
+      prevRNode = nextRNode;
+    }
+  }
+  return prevRNode;
+}
+function isDisjointNode(prevNode, nextNode) {
+  return prevNode && prevNode.nextSibling !== nextNode;
+}
+function serializeI18nNode(lView, serializedI18nBlock, context2, node) {
+  const maybeRNode = unwrapRNode(lView[node.index]);
+  if (!maybeRNode || isDisconnectedRNode(maybeRNode)) {
+    serializedI18nBlock.disconnectedNodes.add(node.index - HEADER_OFFSET);
+    return null;
+  }
+  const rNode = maybeRNode;
+  switch (node.kind) {
+    case 0: {
+      processTextNodeBeforeSerialization(context2, rNode);
+      break;
+    }
+    case 1:
+    case 2: {
+      serializeI18nBlock(lView, serializedI18nBlock, context2, node.children);
+      break;
+    }
+    case 3: {
+      const currentCase = lView[node.currentCaseLViewIndex];
+      if (currentCase != null) {
+        const caseIdx = currentCase < 0 ? ~currentCase : currentCase;
+        serializedI18nBlock.caseQueue.push(caseIdx);
+        serializeI18nBlock(lView, serializedI18nBlock, context2, node.cases[caseIdx]);
+      }
+      break;
+    }
+  }
+  return getFirstNativeNodeForI18nNode(lView, node);
+}
+function getFirstNativeNodeForI18nNode(lView, node) {
+  const tView = lView[TVIEW];
+  const maybeTNode = tView.data[node.index];
+  if (isTNodeShape(maybeTNode)) {
+    return getFirstNativeNode(lView, maybeTNode);
+  } else if (node.kind === 3) {
+    const icuIterator = createIcuIterator(maybeTNode, lView);
+    let rNode = icuIterator();
+    return rNode ?? unwrapRNode(lView[node.index]);
+  } else {
+    return unwrapRNode(lView[node.index]) ?? null;
+  }
+}
+function setCurrentNode(state, node) {
+  state.currentNode = node;
+}
+function appendI18nNodeToCollection(context2, state, astNode) {
+  const noOffsetIndex = astNode.index - HEADER_OFFSET;
+  const { disconnectedNodes } = context2;
+  const currentNode = state.currentNode;
+  if (state.isConnected) {
+    context2.i18nNodes.set(noOffsetIndex, currentNode);
+    disconnectedNodes.delete(noOffsetIndex);
+  } else {
+    disconnectedNodes.add(noOffsetIndex);
+  }
+  return currentNode;
+}
+function skipSiblingNodes(state, skip2) {
+  let currentNode = state.currentNode;
+  for (let i = 0; i < skip2; i++) {
+    if (!currentNode) {
+      break;
+    }
+    currentNode = currentNode?.nextSibling ?? null;
+  }
+  return currentNode;
+}
+function forkHydrationState(state, nextNode) {
+  return { currentNode: nextNode, isConnected: state.isConnected };
+}
+function prepareI18nBlockForHydrationImpl(lView, index, parentTNode, subTemplateIndex) {
+  const hydrationInfo = lView[HYDRATION];
+  if (!hydrationInfo) {
+    return;
+  }
+  if (!isI18nHydrationSupportEnabled() || parentTNode && (isI18nInSkipHydrationBlock(parentTNode) || isDisconnectedNode$1(hydrationInfo, parentTNode.index - HEADER_OFFSET))) {
+    return;
+  }
+  const tView = lView[TVIEW];
+  const tI18n = tView.data[index];
+  ngDevMode && assertDefined(tI18n, "Expected i18n data to be present in a given TView slot during hydration");
+  function findHydrationRoot() {
+    if (isRootTemplateMessage(subTemplateIndex)) {
+      ngDevMode && assertDefined(parentTNode, "Expected parent TNode while hydrating i18n root");
+      const rootNode = locateNextRNode(hydrationInfo, tView, lView, parentTNode);
+      return parentTNode.type & 8 ? rootNode : rootNode.firstChild;
+    }
+    return hydrationInfo?.firstChild;
+  }
+  const currentNode = findHydrationRoot();
+  ngDevMode && assertDefined(currentNode, "Expected root i18n node during hydration");
+  const disconnectedNodes = initDisconnectedNodes(hydrationInfo) ?? /* @__PURE__ */ new Set();
+  const i18nNodes = hydrationInfo.i18nNodes ??= /* @__PURE__ */ new Map();
+  const caseQueue = hydrationInfo.data[I18N_DATA]?.[index - HEADER_OFFSET] ?? [];
+  const dehydratedIcuData = hydrationInfo.dehydratedIcuData ??= /* @__PURE__ */ new Map();
+  collectI18nNodesFromDom({ hydrationInfo, lView, i18nNodes, disconnectedNodes, caseQueue, dehydratedIcuData }, { currentNode, isConnected: true }, tI18n.ast);
+  hydrationInfo.disconnectedNodes = disconnectedNodes.size === 0 ? null : disconnectedNodes;
+}
+function collectI18nNodesFromDom(context2, state, nodeOrNodes) {
+  if (Array.isArray(nodeOrNodes)) {
+    let nextState = state;
+    for (const node of nodeOrNodes) {
+      const targetNode = tryLocateRNodeByPath(context2.hydrationInfo, context2.lView, node.index - HEADER_OFFSET);
+      if (targetNode) {
+        nextState = forkHydrationState(state, targetNode);
+      }
+      collectI18nNodesFromDom(context2, nextState, node);
+    }
+  } else {
+    if (context2.disconnectedNodes.has(nodeOrNodes.index - HEADER_OFFSET)) {
+      return;
+    }
+    switch (nodeOrNodes.kind) {
+      case 0: {
+        const currentNode = appendI18nNodeToCollection(context2, state, nodeOrNodes);
+        setCurrentNode(state, currentNode?.nextSibling ?? null);
+        break;
+      }
+      case 1: {
+        collectI18nNodesFromDom(context2, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
+        const currentNode = appendI18nNodeToCollection(context2, state, nodeOrNodes);
+        setCurrentNode(state, currentNode?.nextSibling ?? null);
+        break;
+      }
+      case 2: {
+        const noOffsetIndex = nodeOrNodes.index - HEADER_OFFSET;
+        const { hydrationInfo } = context2;
+        const containerSize = getNgContainerSize(hydrationInfo, noOffsetIndex);
+        switch (nodeOrNodes.type) {
+          case 0: {
+            const currentNode = appendI18nNodeToCollection(context2, state, nodeOrNodes);
+            if (isSerializedElementContainer(hydrationInfo, noOffsetIndex)) {
+              collectI18nNodesFromDom(context2, state, nodeOrNodes.children);
+              const nextNode = skipSiblingNodes(state, 1);
+              setCurrentNode(state, nextNode);
+            } else {
+              collectI18nNodesFromDom(context2, forkHydrationState(state, state.currentNode?.firstChild ?? null), nodeOrNodes.children);
+              setCurrentNode(state, currentNode?.nextSibling ?? null);
+              if (containerSize !== null) {
+                const nextNode = skipSiblingNodes(state, containerSize + 1);
+                setCurrentNode(state, nextNode);
+              }
+            }
+            break;
+          }
+          case 1: {
+            ngDevMode && assertNotEqual(containerSize, null, "Expected a container size while hydrating i18n subtemplate");
+            appendI18nNodeToCollection(context2, state, nodeOrNodes);
+            const nextNode = skipSiblingNodes(state, containerSize + 1);
+            setCurrentNode(state, nextNode);
+            break;
+          }
+        }
+        break;
+      }
+      case 3: {
+        const selectedCase = state.isConnected ? context2.caseQueue.shift() : null;
+        const childState = { currentNode: null, isConnected: false };
+        for (let i = 0; i < nodeOrNodes.cases.length; i++) {
+          collectI18nNodesFromDom(context2, i === selectedCase ? state : childState, nodeOrNodes.cases[i]);
+        }
+        if (selectedCase !== null) {
+          context2.dehydratedIcuData.set(nodeOrNodes.index, { case: selectedCase, node: nodeOrNodes });
+        }
+        const currentNode = appendI18nNodeToCollection(context2, state, nodeOrNodes);
+        setCurrentNode(state, currentNode?.nextSibling ?? null);
+        break;
+      }
+    }
+  }
+}
+var _claimDehydratedIcuCaseImpl = () => {
+};
+function claimDehydratedIcuCase(lView, icuIndex, caseIndex) {
+  _claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex);
+}
+function enableClaimDehydratedIcuCaseImpl() {
+  _claimDehydratedIcuCaseImpl = claimDehydratedIcuCaseImpl;
+}
+function claimDehydratedIcuCaseImpl(lView, icuIndex, caseIndex) {
+  const dehydratedIcuDataMap = lView[HYDRATION]?.dehydratedIcuData;
+  if (dehydratedIcuDataMap) {
+    const dehydratedIcuData = dehydratedIcuDataMap.get(icuIndex);
+    if (dehydratedIcuData?.case === caseIndex) {
+      dehydratedIcuDataMap.delete(icuIndex);
+    }
+  }
+}
+function cleanupI18nHydrationData(lView) {
+  const hydrationInfo = lView[HYDRATION];
+  if (hydrationInfo) {
+    const { i18nNodes, dehydratedIcuData: dehydratedIcuDataMap } = hydrationInfo;
+    if (i18nNodes && dehydratedIcuDataMap) {
+      const renderer = lView[RENDERER];
+      for (const dehydratedIcuData of dehydratedIcuDataMap.values()) {
+        cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData);
+      }
+    }
+    hydrationInfo.i18nNodes = void 0;
+    hydrationInfo.dehydratedIcuData = void 0;
+  }
+}
+function cleanupDehydratedIcuData(renderer, i18nNodes, dehydratedIcuData) {
+  for (const node of dehydratedIcuData.node.cases[dehydratedIcuData.case]) {
+    const rNode = i18nNodes.get(node.index - HEADER_OFFSET);
+    if (rNode) {
+      nativeRemoveNode(renderer, rNode, false);
+    }
+  }
+}
+function removeDehydratedViews(lContainer) {
+  const views = lContainer[DEHYDRATED_VIEWS] ?? [];
+  const parentLView = lContainer[PARENT];
+  const renderer = parentLView[RENDERER];
+  const retainedViews = [];
+  for (const view of views) {
+    if (view.data[DEFER_BLOCK_ID] !== void 0) {
+      retainedViews.push(view);
+    } else {
+      removeDehydratedView(view, renderer);
+      ngDevMode && ngDevMode.dehydratedViewsRemoved++;
+    }
+  }
+  lContainer[DEHYDRATED_VIEWS] = retainedViews;
+}
+function removeDehydratedViewList(deferBlock) {
+  const { lContainer } = deferBlock;
+  const dehydratedViews = lContainer[DEHYDRATED_VIEWS];
+  if (dehydratedViews === null)
+    return;
+  const parentLView = lContainer[PARENT];
+  const renderer = parentLView[RENDERER];
+  for (const view of dehydratedViews) {
+    removeDehydratedView(view, renderer);
+    ngDevMode && ngDevMode.dehydratedViewsRemoved++;
+  }
+}
+function removeDehydratedView(dehydratedView, renderer) {
+  let nodesRemoved = 0;
+  let currentRNode = dehydratedView.firstChild;
+  if (currentRNode) {
+    const numNodes = dehydratedView.data[NUM_ROOT_NODES];
+    while (nodesRemoved < numNodes) {
+      ngDevMode && validateSiblingNodeExists(currentRNode);
+      const nextSibling = currentRNode.nextSibling;
+      nativeRemoveNode(renderer, currentRNode, false);
+      currentRNode = nextSibling;
+      nodesRemoved++;
+    }
+  }
+}
+function cleanupLContainer(lContainer) {
+  removeDehydratedViews(lContainer);
+  const hostLView = lContainer[HOST];
+  if (isLView(hostLView)) {
+    cleanupLView(hostLView);
+  }
+  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+    cleanupLView(lContainer[i]);
+  }
+}
+function cleanupLView(lView) {
+  cleanupI18nHydrationData(lView);
+  const tView = lView[TVIEW];
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    if (isLContainer(lView[i])) {
+      const lContainer = lView[i];
+      cleanupLContainer(lContainer);
+    } else if (isLView(lView[i])) {
+      cleanupLView(lView[i]);
+    }
+  }
+}
+function cleanupDehydratedViews(appRef) {
+  const viewRefs = appRef._views;
+  for (const viewRef of viewRefs) {
+    const lNode = getLNodeForHydration(viewRef);
+    if (lNode !== null && lNode[HOST] !== null) {
+      if (isLView(lNode)) {
+        cleanupLView(lNode);
+      } else {
+        cleanupLContainer(lNode);
+      }
+      ngDevMode && ngDevMode.dehydratedViewsCleanupRuns++;
+    }
+  }
+}
+function cleanupHydratedDeferBlocks(deferBlock, hydratedBlocks, registry, appRef) {
+  if (deferBlock !== null) {
+    registry.cleanup(hydratedBlocks);
+    cleanupLContainer(deferBlock.lContainer);
+    cleanupDehydratedViews(appRef);
+  }
+}
+function locateDehydratedViewsInContainer(currentRNode, serializedViews) {
+  const dehydratedViews = [];
+  for (const serializedView of serializedViews) {
+    for (let i = 0; i < (serializedView[MULTIPLIER] ?? 1); i++) {
+      const view = {
+        data: serializedView,
+        firstChild: null
+      };
+      if (serializedView[NUM_ROOT_NODES] > 0) {
+        view.firstChild = currentRNode;
+        currentRNode = siblingAfter(serializedView[NUM_ROOT_NODES], currentRNode);
+      }
+      dehydratedViews.push(view);
+    }
+  }
+  return [currentRNode, dehydratedViews];
+}
+var _findMatchingDehydratedViewImpl = () => null;
+var _findAndReconcileMatchingDehydratedViewsImpl = () => null;
+function enableFindMatchingDehydratedViewImpl() {
+  _findMatchingDehydratedViewImpl = findMatchingDehydratedViewImpl;
+  _findAndReconcileMatchingDehydratedViewsImpl = findAndReconcileMatchingDehydratedViewsImpl;
+}
+function findMatchingDehydratedViewImpl(lContainer, template) {
+  if (hasMatchingDehydratedView(lContainer, template)) {
+    return lContainer[DEHYDRATED_VIEWS].shift();
+  } else {
+    removeDehydratedViews(lContainer);
+    return null;
+  }
+}
+function findMatchingDehydratedView(lContainer, template) {
+  return _findMatchingDehydratedViewImpl(lContainer, template);
+}
+function findAndReconcileMatchingDehydratedViewsImpl(lContainer, templateTNode, hostLView) {
+  if (templateTNode.tView.ssrId === null)
+    return null;
+  const dehydratedView = findMatchingDehydratedView(lContainer, templateTNode.tView.ssrId);
+  if (hostLView[TVIEW].firstUpdatePass && dehydratedView === null) {
+    removeStaleDehydratedBranch(hostLView, templateTNode);
+  }
+  return dehydratedView;
+}
+function findAndReconcileMatchingDehydratedViews(lContainer, templateTNode, hostLView) {
+  return _findAndReconcileMatchingDehydratedViewsImpl(lContainer, templateTNode, hostLView);
+}
+function removeStaleDehydratedBranch(hostLView, tNode) {
+  let currentTNode = tNode;
+  while (currentTNode) {
+    if (cleanupMatchingDehydratedViews(hostLView, currentTNode))
+      return;
+    if ((currentTNode.flags & 256) === 256) {
+      break;
+    }
+    currentTNode = currentTNode.prev;
+  }
+  currentTNode = tNode.next;
+  while (currentTNode) {
+    if ((currentTNode.flags & 512) !== 512) {
+      break;
+    }
+    if (cleanupMatchingDehydratedViews(hostLView, currentTNode))
+      return;
+    currentTNode = currentTNode.next;
+  }
+}
+function hasMatchingDehydratedView(lContainer, template) {
+  const views = lContainer[DEHYDRATED_VIEWS];
+  if (!template || views === null || views.length === 0) {
+    return false;
+  }
+  return views[0].data[TEMPLATE_ID] === template;
+}
+function cleanupMatchingDehydratedViews(hostLView, currentTNode) {
+  const ssrId = currentTNode.tView?.ssrId;
+  if (ssrId == null)
+    return false;
+  const container = hostLView[currentTNode.index];
+  if (isLContainer(container) && hasMatchingDehydratedView(container, ssrId)) {
+    removeDehydratedViews(container);
+    return true;
+  }
+  return false;
+}
+var ComponentRef$1 = class ComponentRef {
+};
+var ComponentFactory$1 = class ComponentFactory {
+};
+var _NullComponentFactoryResolver = class {
+  resolveComponentFactory(component) {
+    throw new RuntimeError(917, typeof ngDevMode !== "undefined" && ngDevMode && `No component factory found for ${stringify(component)}.`);
+  }
+};
+var ComponentFactoryResolver$1 = class ComponentFactoryResolver {
+  static NULL = new _NullComponentFactoryResolver();
+};
+var RendererFactory2 = class {
+};
+var Renderer2 = class {
+  /**
+   * If null or undefined, the view engine won't call it.
+   * This is used as a performance optimization for production mode.
+   */
+  destroyNode = null;
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = () => injectRenderer2();
+};
+function injectRenderer2() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  const nodeAtIndex = getComponentLViewByIndex(tNode.index, lView);
+  return (isLView(nodeAtIndex) ? nodeAtIndex : lView)[RENDERER];
+}
+var Sanitizer = class _Sanitizer {
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _Sanitizer,
+      providedIn: "root",
+      factory: () => null
+    })
+  );
+};
+function isModuleWithProviders(value) {
+  return value.ngModule !== void 0;
+}
+function isNgModule(value) {
+  return !!getNgModuleDef(value);
+}
+function isPipe(value) {
+  return !!getPipeDef(value);
+}
+function isDirective(value) {
+  return !!getDirectiveDef(value);
+}
+function isComponent(value) {
+  return !!getComponentDef(value);
+}
+function getDependencyTypeForError(type) {
+  if (getComponentDef(type))
+    return "component";
+  if (getDirectiveDef(type))
+    return "directive";
+  if (getPipeDef(type))
+    return "pipe";
+  return "type";
+}
+function verifyStandaloneImport(depType, importingType) {
+  if (isForwardRef(depType)) {
+    depType = resolveForwardRef(depType);
+    if (!depType) {
+      throw new Error(`Expected forwardRef function, imported from "${stringifyForError(importingType)}", to return a standalone entity or NgModule but got "${stringifyForError(depType) || depType}".`);
+    }
+  }
+  if (getNgModuleDef(depType) == null) {
+    const def = getComponentDef(depType) || getDirectiveDef(depType) || getPipeDef(depType);
+    if (def != null) {
+      if (!def.standalone) {
+        throw new Error(`The "${stringifyForError(depType)}" ${getDependencyTypeForError(depType)}, imported from "${stringifyForError(importingType)}", is not standalone. Did you forget to add the standalone: true flag?`);
+      }
+    } else {
+      if (isModuleWithProviders(depType)) {
+        throw new Error(`A module with providers was imported from "${stringifyForError(importingType)}". Modules with providers are not supported in standalone components imports.`);
+      } else {
+        throw new Error(`The "${stringifyForError(depType)}" type, imported from "${stringifyForError(importingType)}", must be a standalone component / directive / pipe or an NgModule. Did you forget to add the required @Component / @Directive / @Pipe or @NgModule annotation?`);
+      }
+    }
+  }
+}
+var DepsTracker = class {
+  ownerNgModule = /* @__PURE__ */ new Map();
+  ngModulesWithSomeUnresolvedDecls = /* @__PURE__ */ new Set();
+  ngModulesScopeCache = /* @__PURE__ */ new Map();
+  standaloneComponentsScopeCache = /* @__PURE__ */ new Map();
+  /**
+   * Attempts to resolve ng module's forward ref declarations as much as possible and add them to
+   * the `ownerNgModule` map. This method normally should be called after the initial parsing when
+   * all the forward refs are resolved (e.g., when trying to render a component)
+   */
+  resolveNgModulesDecls() {
+    if (this.ngModulesWithSomeUnresolvedDecls.size === 0) {
+      return;
+    }
+    for (const moduleType of this.ngModulesWithSomeUnresolvedDecls) {
+      const def = getNgModuleDef(moduleType);
+      if (def?.declarations) {
+        for (const decl of maybeUnwrapFn(def.declarations)) {
+          if (isComponent(decl)) {
+            this.ownerNgModule.set(decl, moduleType);
+          }
+        }
+      }
+    }
+    this.ngModulesWithSomeUnresolvedDecls.clear();
+  }
+  /** @override */
+  getComponentDependencies(type, rawImports) {
+    this.resolveNgModulesDecls();
+    const def = getComponentDef(type);
+    if (def === null) {
+      throw new Error(`Attempting to get component dependencies for a type that is not a component: ${type}`);
+    }
+    if (def.standalone) {
+      const scope = this.getStandaloneComponentScope(type, rawImports);
+      if (scope.compilation.isPoisoned) {
+        return { dependencies: [] };
+      }
+      return {
+        dependencies: [
+          ...scope.compilation.directives,
+          ...scope.compilation.pipes,
+          ...scope.compilation.ngModules
+        ]
+      };
+    } else {
+      if (!this.ownerNgModule.has(type)) {
+        return { dependencies: [] };
+      }
+      const scope = this.getNgModuleScope(this.ownerNgModule.get(type));
+      if (scope.compilation.isPoisoned) {
+        return { dependencies: [] };
+      }
+      return {
+        dependencies: [...scope.compilation.directives, ...scope.compilation.pipes]
+      };
+    }
+  }
+  /**
+   * @override
+   * This implementation does not make use of param scopeInfo since it assumes the scope info is
+   * already added to the type itself through methods like {@link ɵɵsetNgModuleScope}
+   */
+  registerNgModule(type, scopeInfo) {
+    if (!isNgModule(type)) {
+      throw new Error(`Attempting to register a Type which is not NgModule as NgModule: ${type}`);
+    }
+    this.ngModulesWithSomeUnresolvedDecls.add(type);
+  }
+  /** @override */
+  clearScopeCacheFor(type) {
+    this.ngModulesScopeCache.delete(type);
+    this.standaloneComponentsScopeCache.delete(type);
+  }
+  /** @override */
+  getNgModuleScope(type) {
+    if (this.ngModulesScopeCache.has(type)) {
+      return this.ngModulesScopeCache.get(type);
+    }
+    const scope = this.computeNgModuleScope(type);
+    this.ngModulesScopeCache.set(type, scope);
+    return scope;
+  }
+  /** Compute NgModule scope afresh. */
+  computeNgModuleScope(type) {
+    const def = getNgModuleDefOrThrow(type);
+    const scope = {
+      exported: { directives: /* @__PURE__ */ new Set(), pipes: /* @__PURE__ */ new Set() },
+      compilation: { directives: /* @__PURE__ */ new Set(), pipes: /* @__PURE__ */ new Set() }
+    };
+    for (const imported of maybeUnwrapFn(def.imports)) {
+      if (isNgModule(imported)) {
+        const importedScope = this.getNgModuleScope(imported);
+        addSet(importedScope.exported.directives, scope.compilation.directives);
+        addSet(importedScope.exported.pipes, scope.compilation.pipes);
+      } else if (isStandalone(imported)) {
+        if (isDirective(imported) || isComponent(imported)) {
+          scope.compilation.directives.add(imported);
+        } else if (isPipe(imported)) {
+          scope.compilation.pipes.add(imported);
+        } else {
+          throw new RuntimeError(980, "The standalone imported type is neither a component nor a directive nor a pipe");
+        }
+      } else {
+        scope.compilation.isPoisoned = true;
+        break;
+      }
+    }
+    if (!scope.compilation.isPoisoned) {
+      for (const decl of maybeUnwrapFn(def.declarations)) {
+        if (isNgModule(decl) || isStandalone(decl)) {
+          scope.compilation.isPoisoned = true;
+          break;
+        }
+        if (isPipe(decl)) {
+          scope.compilation.pipes.add(decl);
+        } else {
+          scope.compilation.directives.add(decl);
+        }
+      }
+    }
+    for (const exported of maybeUnwrapFn(def.exports)) {
+      if (isNgModule(exported)) {
+        const exportedScope = this.getNgModuleScope(exported);
+        addSet(exportedScope.exported.directives, scope.exported.directives);
+        addSet(exportedScope.exported.pipes, scope.exported.pipes);
+        addSet(exportedScope.exported.directives, scope.compilation.directives);
+        addSet(exportedScope.exported.pipes, scope.compilation.pipes);
+      } else if (isPipe(exported)) {
+        scope.exported.pipes.add(exported);
+      } else {
+        scope.exported.directives.add(exported);
+      }
+    }
+    return scope;
+  }
+  /** @override */
+  getStandaloneComponentScope(type, rawImports) {
+    if (this.standaloneComponentsScopeCache.has(type)) {
+      return this.standaloneComponentsScopeCache.get(type);
+    }
+    const ans = this.computeStandaloneComponentScope(type, rawImports);
+    this.standaloneComponentsScopeCache.set(type, ans);
+    return ans;
+  }
+  computeStandaloneComponentScope(type, rawImports) {
+    const ans = {
+      compilation: {
+        // Standalone components are always able to self-reference.
+        directives: /* @__PURE__ */ new Set([type]),
+        pipes: /* @__PURE__ */ new Set(),
+        ngModules: /* @__PURE__ */ new Set()
+      }
+    };
+    for (const rawImport of flatten(rawImports ?? [])) {
+      const imported = resolveForwardRef(rawImport);
+      try {
+        verifyStandaloneImport(imported, type);
+      } catch (e) {
+        ans.compilation.isPoisoned = true;
+        return ans;
+      }
+      if (isNgModule(imported)) {
+        ans.compilation.ngModules.add(imported);
+        const importedScope = this.getNgModuleScope(imported);
+        if (importedScope.exported.isPoisoned) {
+          ans.compilation.isPoisoned = true;
+          return ans;
+        }
+        addSet(importedScope.exported.directives, ans.compilation.directives);
+        addSet(importedScope.exported.pipes, ans.compilation.pipes);
+      } else if (isPipe(imported)) {
+        ans.compilation.pipes.add(imported);
+      } else if (isDirective(imported) || isComponent(imported)) {
+        ans.compilation.directives.add(imported);
+      } else {
+        ans.compilation.isPoisoned = true;
+        return ans;
+      }
+    }
+    return ans;
+  }
+  /** @override */
+  isOrphanComponent(cmp) {
+    const def = getComponentDef(cmp);
+    if (!def || def.standalone) {
+      return false;
+    }
+    this.resolveNgModulesDecls();
+    return !this.ownerNgModule.has(cmp);
+  }
+};
+function addSet(sourceSet, targetSet) {
+  for (const m of sourceSet) {
+    targetSet.add(m);
+  }
+}
+var depsTracker = new DepsTracker();
+var NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR = {};
+var ChainedInjector = class {
+  injector;
+  parentInjector;
+  constructor(injector, parentInjector) {
+    this.injector = injector;
+    this.parentInjector = parentInjector;
+  }
+  get(token, notFoundValue, options) {
+    const value = this.injector.get(token, NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR, options);
+    if (value !== NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR || notFoundValue === NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR) {
+      return value;
+    }
+    return this.parentInjector.get(token, notFoundValue, options);
+  }
+};
+function computeStaticStyling(tNode, attrs, writeToHost) {
+  ngDevMode && assertFirstCreatePass(getTView(), "Expecting to be called in first template pass only");
+  let styles = writeToHost ? tNode.styles : null;
+  let classes = writeToHost ? tNode.classes : null;
+  let mode = 0;
+  if (attrs !== null) {
+    for (let i = 0; i < attrs.length; i++) {
+      const value = attrs[i];
+      if (typeof value === "number") {
+        mode = value;
+      } else if (mode == 1) {
+        classes = concatStringsWithSpace(classes, value);
+      } else if (mode == 2) {
+        const style = value;
+        const styleValue = attrs[++i];
+        styles = concatStringsWithSpace(styles, style + ": " + styleValue + ";");
+      }
+    }
+  }
+  writeToHost ? tNode.styles = styles : tNode.stylesWithoutHost = styles;
+  writeToHost ? tNode.classes = classes : tNode.classesWithoutHost = classes;
+}
+function ɵɵdirectiveInject(token, flags = 0) {
+  const lView = getLView();
+  if (lView === null) {
+    ngDevMode && assertInjectImplementationNotEqual(ɵɵdirectiveInject);
+    return ɵɵinject(token, flags);
+  }
+  const tNode = getCurrentTNode();
+  const value = getOrCreateInjectable(tNode, lView, resolveForwardRef(token), flags);
+  ngDevMode && emitInjectEvent(token, value, flags);
+  return value;
+}
+function ɵɵinvalidFactory() {
+  const msg = ngDevMode ? `This constructor was not compatible with Dependency Injection.` : "invalid";
+  throw new Error(msg);
+}
+function resolveDirectives(tView, lView, tNode, localRefs, directiveMatcher) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const exportsMap = localRefs === null ? null : { "": -1 };
+  const matchedDirectiveDefs = directiveMatcher(tView, tNode);
+  if (matchedDirectiveDefs !== null) {
+    let directiveDefs = matchedDirectiveDefs;
+    let hostDirectiveDefs = null;
+    let hostDirectiveRanges = null;
+    for (const def of matchedDirectiveDefs) {
+      if (def.resolveHostDirectives !== null) {
+        [directiveDefs, hostDirectiveDefs, hostDirectiveRanges] = def.resolveHostDirectives(matchedDirectiveDefs);
+        break;
+      }
+    }
+    ngDevMode && assertNoDuplicateDirectives(directiveDefs);
+    initializeDirectives(tView, lView, tNode, directiveDefs, exportsMap, hostDirectiveDefs, hostDirectiveRanges);
+  }
+  if (exportsMap !== null && localRefs !== null) {
+    cacheMatchingLocalNames(tNode, localRefs, exportsMap);
+  }
+}
+function cacheMatchingLocalNames(tNode, localRefs, exportsMap) {
+  const localNames = tNode.localNames = [];
+  for (let i = 0; i < localRefs.length; i += 2) {
+    const index = exportsMap[localRefs[i + 1]];
+    if (index == null)
+      throw new RuntimeError(-301, ngDevMode && `Export of name '${localRefs[i + 1]}' not found!`);
+    localNames.push(localRefs[i], index);
+  }
+}
+function markAsComponentHost(tView, hostTNode, componentOffset) {
+  ngDevMode && assertFirstCreatePass(tView);
+  ngDevMode && assertGreaterThan(componentOffset, -1, "componentOffset must be great than -1");
+  hostTNode.componentOffset = componentOffset;
+  (tView.components ??= []).push(hostTNode.index);
+}
+function initializeDirectives(tView, lView, tNode, directives, exportsMap, hostDirectiveDefs, hostDirectiveRanges) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const directivesLength = directives.length;
+  let hasSeenComponent = false;
+  for (let i = 0; i < directivesLength; i++) {
+    const def = directives[i];
+    if (!hasSeenComponent && isComponentDef(def)) {
+      hasSeenComponent = true;
+      markAsComponentHost(tView, tNode, i);
+    }
+    diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, def.type);
+  }
+  initTNodeFlags(tNode, tView.data.length, directivesLength);
+  for (let i = 0; i < directivesLength; i++) {
+    const def = directives[i];
+    if (def.providersResolver)
+      def.providersResolver(def);
+  }
+  let preOrderHooksFound = false;
+  let preOrderCheckHooksFound = false;
+  let directiveIdx = allocExpando(tView, lView, directivesLength, null);
+  ngDevMode && assertSame(directiveIdx, tNode.directiveStart, "TNode.directiveStart should point to just allocated space");
+  if (directivesLength > 0) {
+    tNode.directiveToIndex = /* @__PURE__ */ new Map();
+  }
+  for (let i = 0; i < directivesLength; i++) {
+    const def = directives[i];
+    tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, def.hostAttrs);
+    configureViewWithDirective(tView, tNode, lView, directiveIdx, def);
+    saveNameToExportMap(directiveIdx, def, exportsMap);
+    if (hostDirectiveRanges !== null && hostDirectiveRanges.has(def)) {
+      const [start, end] = hostDirectiveRanges.get(def);
+      tNode.directiveToIndex.set(def.type, [
+        directiveIdx,
+        start + tNode.directiveStart,
+        end + tNode.directiveStart
+      ]);
+    } else if (hostDirectiveDefs === null || !hostDirectiveDefs.has(def)) {
+      tNode.directiveToIndex.set(def.type, directiveIdx);
+    }
+    if (def.contentQueries !== null)
+      tNode.flags |= 4;
+    if (def.hostBindings !== null || def.hostAttrs !== null || def.hostVars !== 0)
+      tNode.flags |= 64;
+    const lifeCycleHooks = def.type.prototype;
+    if (!preOrderHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngOnInit || lifeCycleHooks.ngDoCheck)) {
+      (tView.preOrderHooks ??= []).push(tNode.index);
+      preOrderHooksFound = true;
+    }
+    if (!preOrderCheckHooksFound && (lifeCycleHooks.ngOnChanges || lifeCycleHooks.ngDoCheck)) {
+      (tView.preOrderCheckHooks ??= []).push(tNode.index);
+      preOrderCheckHooksFound = true;
+    }
+    directiveIdx++;
+  }
+  initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs);
+}
+function initializeInputAndOutputAliases(tView, tNode, hostDirectiveDefs) {
+  ngDevMode && assertFirstCreatePass(tView);
+  for (let index = tNode.directiveStart; index < tNode.directiveEnd; index++) {
+    const directiveDef = tView.data[index];
+    if (hostDirectiveDefs === null || !hostDirectiveDefs.has(directiveDef)) {
+      setupSelectorMatchedInputsOrOutputs(0, tNode, directiveDef, index);
+      setupSelectorMatchedInputsOrOutputs(1, tNode, directiveDef, index);
+      setupInitialInputs(tNode, index, false);
+    } else {
+      const hostDirectiveDef = hostDirectiveDefs.get(directiveDef);
+      setupHostDirectiveInputsOrOutputs(0, tNode, hostDirectiveDef, index);
+      setupHostDirectiveInputsOrOutputs(1, tNode, hostDirectiveDef, index);
+      setupInitialInputs(tNode, index, true);
+    }
+  }
+}
+function setupSelectorMatchedInputsOrOutputs(mode, tNode, def, directiveIndex) {
+  const aliasMap = mode === 0 ? def.inputs : def.outputs;
+  for (const publicName in aliasMap) {
+    if (aliasMap.hasOwnProperty(publicName)) {
+      let bindings;
+      if (mode === 0) {
+        bindings = tNode.inputs ??= {};
+      } else {
+        bindings = tNode.outputs ??= {};
+      }
+      bindings[publicName] ??= [];
+      bindings[publicName].push(directiveIndex);
+      setShadowStylingInputFlags(tNode, publicName);
+    }
+  }
+}
+function setupHostDirectiveInputsOrOutputs(mode, tNode, config2, directiveIndex) {
+  const aliasMap = mode === 0 ? config2.inputs : config2.outputs;
+  for (const initialName in aliasMap) {
+    if (aliasMap.hasOwnProperty(initialName)) {
+      const publicName = aliasMap[initialName];
+      let bindings;
+      if (mode === 0) {
+        bindings = tNode.hostDirectiveInputs ??= {};
+      } else {
+        bindings = tNode.hostDirectiveOutputs ??= {};
+      }
+      bindings[publicName] ??= [];
+      bindings[publicName].push(directiveIndex, initialName);
+      setShadowStylingInputFlags(tNode, publicName);
+    }
+  }
+}
+function setShadowStylingInputFlags(tNode, publicName) {
+  if (publicName === "class") {
+    tNode.flags |= 8;
+  } else if (publicName === "style") {
+    tNode.flags |= 16;
+  }
+}
+function setupInitialInputs(tNode, directiveIndex, isHostDirective) {
+  const { attrs, inputs, hostDirectiveInputs } = tNode;
+  if (attrs === null || !isHostDirective && inputs === null || isHostDirective && hostDirectiveInputs === null || // Do not use unbound attributes as inputs to structural directives, since structural
+  // directive inputs can only be set using microsyntax (e.g. `<div *dir="exp">`).
+  isInlineTemplate(tNode)) {
+    tNode.initialInputs ??= [];
+    tNode.initialInputs.push(null);
+    return;
+  }
+  let inputsToStore = null;
+  let i = 0;
+  while (i < attrs.length) {
+    const attrName = attrs[i];
+    if (attrName === 0) {
+      i += 4;
+      continue;
+    } else if (attrName === 5) {
+      i += 2;
+      continue;
+    } else if (typeof attrName === "number") {
+      break;
+    }
+    if (!isHostDirective && inputs.hasOwnProperty(attrName)) {
+      const inputConfig = inputs[attrName];
+      for (const index of inputConfig) {
+        if (index === directiveIndex) {
+          inputsToStore ??= [];
+          inputsToStore.push(attrName, attrs[i + 1]);
+          break;
+        }
+      }
+    } else if (isHostDirective && hostDirectiveInputs.hasOwnProperty(attrName)) {
+      const config2 = hostDirectiveInputs[attrName];
+      for (let j = 0; j < config2.length; j += 2) {
+        if (config2[j] === directiveIndex) {
+          inputsToStore ??= [];
+          inputsToStore.push(config2[j + 1], attrs[i + 1]);
+          break;
+        }
+      }
+    }
+    i += 2;
+  }
+  tNode.initialInputs ??= [];
+  tNode.initialInputs.push(inputsToStore);
+}
+function configureViewWithDirective(tView, tNode, lView, directiveIndex, def) {
+  ngDevMode && assertGreaterThanOrEqual(directiveIndex, HEADER_OFFSET, "Must be in Expando section");
+  tView.data[directiveIndex] = def;
+  const directiveFactory = def.factory || (def.factory = getFactoryDef(def.type, true));
+  const nodeInjectorFactory = new NodeInjectorFactory(directiveFactory, isComponentDef(def), ɵɵdirectiveInject);
+  tView.blueprint[directiveIndex] = nodeInjectorFactory;
+  lView[directiveIndex] = nodeInjectorFactory;
+  registerHostBindingOpCodes(tView, tNode, directiveIndex, allocExpando(tView, lView, def.hostVars, NO_CHANGE), def);
+}
+function registerHostBindingOpCodes(tView, tNode, directiveIdx, directiveVarsIdx, def) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const hostBindings = def.hostBindings;
+  if (hostBindings) {
+    let hostBindingOpCodes = tView.hostBindingOpCodes;
+    if (hostBindingOpCodes === null) {
+      hostBindingOpCodes = tView.hostBindingOpCodes = [];
+    }
+    const elementIndx = ~tNode.index;
+    if (lastSelectedElementIdx(hostBindingOpCodes) != elementIndx) {
+      hostBindingOpCodes.push(elementIndx);
+    }
+    hostBindingOpCodes.push(directiveIdx, directiveVarsIdx, hostBindings);
+  }
+}
+function lastSelectedElementIdx(hostBindingOpCodes) {
+  let i = hostBindingOpCodes.length;
+  while (i > 0) {
+    const value = hostBindingOpCodes[--i];
+    if (typeof value === "number" && value < 0) {
+      return value;
+    }
+  }
+  return 0;
+}
+function saveNameToExportMap(directiveIdx, def, exportsMap) {
+  if (exportsMap) {
+    if (def.exportAs) {
+      for (let i = 0; i < def.exportAs.length; i++) {
+        exportsMap[def.exportAs[i]] = directiveIdx;
+      }
+    }
+    if (isComponentDef(def))
+      exportsMap[""] = directiveIdx;
+  }
+}
+function initTNodeFlags(tNode, index, numberOfDirectives) {
+  ngDevMode && assertNotEqual(numberOfDirectives, tNode.directiveEnd - tNode.directiveStart, "Reached the max number of directives");
+  tNode.flags |= 1;
+  tNode.directiveStart = index;
+  tNode.directiveEnd = index + numberOfDirectives;
+  tNode.providerIndexes = index;
+}
+function assertNoDuplicateDirectives(directives) {
+  if (directives.length < 2) {
+    return;
+  }
+  const seenDirectives = /* @__PURE__ */ new Set();
+  for (const current of directives) {
+    if (seenDirectives.has(current)) {
+      throw new RuntimeError(309, `Directive ${current.type.name} matches multiple times on the same element. Directives can only match an element once.`);
+    }
+    seenDirectives.add(current);
+  }
+}
+function elementStartFirstCreatePass(index, tView, lView, name, directiveMatcher, bindingsEnabled, attrsIndex, localRefsIndex) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const tViewConsts = tView.consts;
+  const attrs = getConstant(tViewConsts, attrsIndex);
+  const tNode = getOrCreateTNode(tView, index, 2, name, attrs);
+  if (bindingsEnabled) {
+    resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex), directiveMatcher);
+  }
+  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
+  if (tNode.attrs !== null) {
+    computeStaticStyling(tNode, tNode.attrs, false);
+  }
+  if (tNode.mergedAttrs !== null) {
+    computeStaticStyling(tNode, tNode.mergedAttrs, true);
+  }
+  if (tView.queries !== null) {
+    tView.queries.elementStart(tView, tNode);
+  }
+  return tNode;
+}
+function elementEndFirstCreatePass(tView, tNode) {
+  ngDevMode && assertFirstCreatePass(tView);
+  registerPostOrderHooks(tView, tNode);
+  if (isContentQueryHost(tNode)) {
+    tView.queries.elementEnd(tNode);
+  }
+}
+function isListLikeIterable(obj) {
+  if (!isJsObject(obj))
+    return false;
+  return Array.isArray(obj) || !(obj instanceof Map) && // JS Map are iterables but return entries as [k, v]
+  Symbol.iterator in obj;
+}
+function areIterablesEqual(a, b, comparator) {
+  const iterator1 = a[Symbol.iterator]();
+  const iterator2 = b[Symbol.iterator]();
+  while (true) {
+    const item1 = iterator1.next();
+    const item2 = iterator2.next();
+    if (item1.done && item2.done)
+      return true;
+    if (item1.done || item2.done)
+      return false;
+    if (!comparator(item1.value, item2.value))
+      return false;
+  }
+}
+function iterateListLike(obj, fn) {
+  if (Array.isArray(obj)) {
+    for (let i = 0; i < obj.length; i++) {
+      fn(obj[i]);
+    }
+  } else {
+    const iterator2 = obj[Symbol.iterator]();
+    let item;
+    while (!(item = iterator2.next()).done) {
+      fn(item.value);
+    }
+  }
+}
+function isJsObject(o) {
+  return o !== null && (typeof o === "function" || typeof o === "object");
+}
+function devModeEqual(a, b) {
+  const isListLikeIterableA = isListLikeIterable(a);
+  const isListLikeIterableB = isListLikeIterable(b);
+  if (isListLikeIterableA && isListLikeIterableB) {
+    return areIterablesEqual(a, b, devModeEqual);
+  } else {
+    const isAObject = a && (typeof a === "object" || typeof a === "function");
+    const isBObject = b && (typeof b === "object" || typeof b === "function");
+    if (!isListLikeIterableA && isAObject && !isListLikeIterableB && isBObject) {
+      return true;
+    } else {
+      return Object.is(a, b);
+    }
+  }
+}
+function updateBinding(lView, bindingIndex, value) {
+  return lView[bindingIndex] = value;
+}
+function getBinding(lView, bindingIndex) {
+  ngDevMode && assertIndexInRange(lView, bindingIndex);
+  ngDevMode && assertNotSame(lView[bindingIndex], NO_CHANGE, "Stored value should never be NO_CHANGE.");
+  return lView[bindingIndex];
+}
+function bindingUpdated(lView, bindingIndex, value) {
+  ngDevMode && assertLessThan(bindingIndex, lView.length, `Slot should have been initialized to NO_CHANGE`);
+  if (value === NO_CHANGE) {
+    return false;
+  }
+  const oldValue = lView[bindingIndex];
+  if (Object.is(oldValue, value)) {
+    return false;
+  } else {
+    if (ngDevMode && isInCheckNoChangesMode()) {
+      const oldValueToCompare = oldValue !== NO_CHANGE ? oldValue : void 0;
+      if (!devModeEqual(oldValueToCompare, value)) {
+        const details = getExpressionChangedErrorDetails(lView, bindingIndex, oldValueToCompare, value);
+        throwErrorIfNoChangesMode(oldValue === NO_CHANGE, details.oldValue, details.newValue, details.propName, lView);
+      }
+      return false;
+    }
+    lView[bindingIndex] = value;
+    return true;
+  }
+}
+function bindingUpdated2(lView, bindingIndex, exp1, exp2) {
+  const different = bindingUpdated(lView, bindingIndex, exp1);
+  return bindingUpdated(lView, bindingIndex + 1, exp2) || different;
+}
+function bindingUpdated3(lView, bindingIndex, exp1, exp2, exp3) {
+  const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);
+  return bindingUpdated(lView, bindingIndex + 2, exp3) || different;
+}
+function bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4) {
+  const different = bindingUpdated2(lView, bindingIndex, exp1, exp2);
+  return bindingUpdated2(lView, bindingIndex + 2, exp3, exp4) || different;
+}
+function wrapListener(tNode, lView, listenerFn) {
+  return function wrapListenerIn_markDirtyAndPreventDefault(event) {
+    const startView = isComponentHost(tNode) ? getComponentLViewByIndex(tNode.index, lView) : lView;
+    markViewDirty(
+      startView,
+      5
+      /* NotificationSource.Listener */
+    );
+    const context2 = lView[CONTEXT];
+    let result = executeListenerWithErrorHandling(lView, context2, listenerFn, event);
+    let nextListenerFn = wrapListenerIn_markDirtyAndPreventDefault.__ngNextListenerFn__;
+    while (nextListenerFn) {
+      result = executeListenerWithErrorHandling(lView, context2, nextListenerFn, event) && result;
+      nextListenerFn = nextListenerFn.__ngNextListenerFn__;
+    }
+    return result;
+  };
+}
+function executeListenerWithErrorHandling(lView, context2, listenerFn, e) {
+  const prevConsumer = setActiveConsumer(null);
+  try {
+    profiler(6, context2, listenerFn);
+    return listenerFn(e) !== false;
+  } catch (error) {
+    handleUncaughtError(lView, error);
+    return false;
+  } finally {
+    profiler(7, context2, listenerFn);
+    setActiveConsumer(prevConsumer);
+  }
+}
+function listenToDomEvent(tNode, tView, lView, eventTargetResolver, renderer, eventName, originalListener, wrappedListener) {
+  ngDevMode && assertNotSame(wrappedListener, originalListener, "Expected wrapped and original listeners to be different.");
+  const isTNodeDirectiveHost = isDirectiveHost(tNode);
+  let hasCoalesced = false;
+  let existingListener = null;
+  if (!eventTargetResolver && isTNodeDirectiveHost) {
+    existingListener = findExistingListener(tView, lView, eventName, tNode.index);
+  }
+  if (existingListener !== null) {
+    const lastListenerFn = existingListener.__ngLastListenerFn__ || existingListener;
+    lastListenerFn.__ngNextListenerFn__ = originalListener;
+    existingListener.__ngLastListenerFn__ = originalListener;
+    hasCoalesced = true;
+  } else {
+    const native = getNativeByTNode(tNode, lView);
+    const target = eventTargetResolver ? eventTargetResolver(native) : native;
+    stashEventListenerImpl(lView, target, eventName, wrappedListener);
+    const cleanupFn = renderer.listen(target, eventName, wrappedListener);
+    const idxOrTargetGetter = eventTargetResolver ? (_lView) => eventTargetResolver(unwrapRNode(_lView[tNode.index])) : tNode.index;
+    storeListenerCleanup(idxOrTargetGetter, tView, lView, eventName, wrappedListener, cleanupFn, false);
+  }
+  return hasCoalesced;
+}
+function findExistingListener(tView, lView, eventName, tNodeIndex) {
+  const tCleanup = tView.cleanup;
+  if (tCleanup != null) {
+    for (let i = 0; i < tCleanup.length - 1; i += 2) {
+      const cleanupEventName = tCleanup[i];
+      if (cleanupEventName === eventName && tCleanup[i + 1] === tNodeIndex) {
+        const lCleanup = lView[CLEANUP];
+        const listenerIdxInLCleanup = tCleanup[i + 2];
+        return lCleanup && lCleanup.length > listenerIdxInLCleanup ? lCleanup[listenerIdxInLCleanup] : null;
+      }
+      if (typeof cleanupEventName === "string") {
+        i += 2;
+      }
+    }
+  }
+  return null;
+}
+function storeListenerCleanup(indexOrTargetGetter, tView, lView, eventName, listenerFn, cleanup, isOutput) {
+  const tCleanup = tView.firstCreatePass ? getOrCreateTViewCleanup(tView) : null;
+  const lCleanup = getOrCreateLViewCleanup(lView);
+  const index = lCleanup.length;
+  lCleanup.push(listenerFn, cleanup);
+  tCleanup && tCleanup.push(eventName, indexOrTargetGetter, index, (index + 1) * (isOutput ? -1 : 1));
+}
+function createOutputListener(tNode, lView, listenerFn, targetDef, eventName) {
+  const wrappedListener = wrapListener(tNode, lView, listenerFn);
+  const hasBound = listenToDirectiveOutput(tNode, lView, targetDef, eventName, wrappedListener);
+  if (!hasBound && ngDevMode) {
+    throw new RuntimeError(316, `${stringifyForError(targetDef.type)} does not have an output with a public name of "${eventName}".`);
+  }
+}
+function listenToDirectiveOutput(tNode, lView, target, eventName, listenerFn) {
+  let hostIndex = null;
+  let hostDirectivesStart = null;
+  let hostDirectivesEnd = null;
+  let hasOutput = false;
+  if (ngDevMode && !tNode.directiveToIndex?.has(target.type)) {
+    throw new Error(`Node does not have a directive with type ${target.type.name}`);
+  }
+  const data = tNode.directiveToIndex.get(target.type);
+  if (typeof data === "number") {
+    hostIndex = data;
+  } else {
+    [hostIndex, hostDirectivesStart, hostDirectivesEnd] = data;
+  }
+  if (hostDirectivesStart !== null && hostDirectivesEnd !== null && tNode.hostDirectiveOutputs?.hasOwnProperty(eventName)) {
+    const hostDirectiveOutputs = tNode.hostDirectiveOutputs[eventName];
+    for (let i = 0; i < hostDirectiveOutputs.length; i += 2) {
+      const index = hostDirectiveOutputs[i];
+      if (index >= hostDirectivesStart && index <= hostDirectivesEnd) {
+        ngDevMode && assertIndexInRange(lView, index);
+        hasOutput = true;
+        listenToOutput(tNode, lView, index, hostDirectiveOutputs[i + 1], eventName, listenerFn);
+      } else if (index > hostDirectivesEnd) {
+        break;
+      }
+    }
+  }
+  if (target.outputs.hasOwnProperty(eventName)) {
+    ngDevMode && assertIndexInRange(lView, hostIndex);
+    hasOutput = true;
+    listenToOutput(tNode, lView, hostIndex, eventName, eventName, listenerFn);
+  }
+  return hasOutput;
+}
+function listenToOutput(tNode, lView, directiveIndex, lookupName, eventName, listenerFn) {
+  ngDevMode && assertIndexInRange(lView, directiveIndex);
+  const instance = lView[directiveIndex];
+  const tView = lView[TVIEW];
+  const def = tView.data[directiveIndex];
+  const propertyName = def.outputs[lookupName];
+  const output2 = instance[propertyName];
+  if (ngDevMode && !isOutputSubscribable(output2)) {
+    throw new Error(`@Output ${propertyName} not initialized in '${instance.constructor.name}'.`);
+  }
+  const subscription = output2.subscribe(listenerFn);
+  storeListenerCleanup(tNode.index, tView, lView, eventName, listenerFn, subscription, true);
+}
+function isOutputSubscribable(value) {
+  return value != null && typeof value.subscribe === "function";
+}
+var BINDING = Symbol("BINDING");
+var INPUT_BINDING_METADATA = { kind: "input", requiredVars: 1 };
+var OUTPUT_BINDING_METADATA = { kind: "output", requiredVars: 0 };
+function inputBindingUpdate(targetDirectiveIdx, publicName, value) {
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = lView[TVIEW];
+    const tNode = getSelectedTNode();
+    const targetDef = tView.directiveRegistry[targetDirectiveIdx];
+    if (ngDevMode && !targetDef) {
+      throw new RuntimeError(315, `Input binding to property "${publicName}" does not have a target.`);
+    }
+    const hasSet = setDirectiveInput(tNode, tView, lView, targetDef, publicName, value);
+    if (ngDevMode) {
+      if (!hasSet) {
+        throw new RuntimeError(315, `${stringifyForError(targetDef.type)} does not have an input with a public name of "${publicName}".`);
+      }
+      storePropertyBindingMetadata(tView.data, tNode, publicName, bindingIndex);
+    }
+  }
+}
+function inputBinding(publicName, value) {
+  const binding = {
+    [BINDING]: INPUT_BINDING_METADATA,
+    update: () => inputBindingUpdate(binding.targetIdx, publicName, value())
+  };
+  return binding;
+}
+function outputBinding(eventName, listener) {
+  const binding = {
+    [BINDING]: OUTPUT_BINDING_METADATA,
+    create: () => {
+      const lView = getLView();
+      const tNode = getCurrentTNode();
+      const tView = lView[TVIEW];
+      const targetDef = tView.directiveRegistry[binding.targetIdx];
+      createOutputListener(tNode, lView, listener, targetDef, eventName);
+    }
+  };
+  return binding;
+}
+function twoWayBinding(publicName, value) {
+  const input2 = inputBinding(publicName, value);
+  const output2 = outputBinding(publicName + "Change", (eventValue) => value.set(eventValue));
+  ngDevMode && assertNotDefined(input2.create, "Unexpected `create` callback in inputBinding");
+  ngDevMode && assertNotDefined(output2.update, "Unexpected `update` callback in outputBinding");
+  const binding = {
+    [BINDING]: {
+      kind: "twoWay",
+      requiredVars: input2[BINDING].requiredVars + output2[BINDING].requiredVars
+    },
+    set targetIdx(idx) {
+      input2.targetIdx = idx;
+      output2.targetIdx = idx;
+    },
+    create: output2.create,
+    update: input2.update
+  };
+  return binding;
+}
+var ComponentFactoryResolver2 = class extends ComponentFactoryResolver$1 {
+  ngModule;
+  /**
+   * @param ngModule The NgModuleRef to which all resolved factories are bound.
+   */
+  constructor(ngModule) {
+    super();
+    this.ngModule = ngModule;
+  }
+  resolveComponentFactory(component) {
+    ngDevMode && assertComponentType(component);
+    const componentDef = getComponentDef(component);
+    return new ComponentFactory2(componentDef, this.ngModule);
+  }
+};
+function toInputRefArray(map2) {
+  return Object.keys(map2).map((name) => {
+    const [propName, flags, transform] = map2[name];
+    const inputData = {
+      propName,
+      templateName: name,
+      isSignal: (flags & InputFlags.SignalBased) !== 0
+    };
+    if (transform) {
+      inputData.transform = transform;
+    }
+    return inputData;
+  });
+}
+function toOutputRefArray(map2) {
+  return Object.keys(map2).map((name) => ({ propName: map2[name], templateName: name }));
+}
+function verifyNotAnOrphanComponent(componentDef) {
+  if ((typeof ngJitMode === "undefined" || ngJitMode) && componentDef.debugInfo?.forbidOrphanRendering) {
+    if (depsTracker.isOrphanComponent(componentDef.type)) {
+      throw new RuntimeError(981, `Orphan component found! Trying to render the component ${debugStringifyTypeForError(componentDef.type)} without first loading the NgModule that declares it. It is recommended to make this component standalone in order to avoid this error. If this is not possible now, import the component's NgModule in the appropriate NgModule, or the standalone component in which you are trying to render this component. If this is a lazy import, load the NgModule lazily as well and use its module injector.`);
+    }
+  }
+}
+function createRootViewInjector(componentDef, environmentInjector, injector) {
+  let realEnvironmentInjector = environmentInjector instanceof EnvironmentInjector ? environmentInjector : environmentInjector?.injector;
+  if (realEnvironmentInjector && componentDef.getStandaloneInjector !== null) {
+    realEnvironmentInjector = componentDef.getStandaloneInjector(realEnvironmentInjector) || realEnvironmentInjector;
+  }
+  const rootViewInjector = realEnvironmentInjector ? new ChainedInjector(injector, realEnvironmentInjector) : injector;
+  return rootViewInjector;
+}
+function createRootLViewEnvironment(rootLViewInjector) {
+  const rendererFactory = rootLViewInjector.get(RendererFactory2, null);
+  if (rendererFactory === null) {
+    throw new RuntimeError(407, ngDevMode && "Angular was not able to inject a renderer (RendererFactory2). Likely this is due to a broken DI hierarchy. Make sure that any injector used to create this component has a correct parent.");
+  }
+  const sanitizer = rootLViewInjector.get(Sanitizer, null);
+  const changeDetectionScheduler = rootLViewInjector.get(ChangeDetectionScheduler, null);
+  let ngReflect = false;
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    ngReflect = rootLViewInjector.get(NG_REFLECT_ATTRS_FLAG, NG_REFLECT_ATTRS_FLAG_DEFAULT);
+  }
+  return {
+    rendererFactory,
+    sanitizer,
+    changeDetectionScheduler,
+    ngReflect
+  };
+}
+function createHostElement(componentDef, render) {
+  const tagName = (componentDef.selectors[0][0] || "div").toLowerCase();
+  const namespace = tagName === "svg" ? SVG_NAMESPACE : tagName === "math" ? MATH_ML_NAMESPACE : null;
+  return createElementNode(render, tagName, namespace);
+}
+var ComponentFactory2 = class extends ComponentFactory$1 {
+  componentDef;
+  ngModule;
+  selector;
+  componentType;
+  ngContentSelectors;
+  isBoundToModule;
+  cachedInputs = null;
+  cachedOutputs = null;
+  get inputs() {
+    this.cachedInputs ??= toInputRefArray(this.componentDef.inputs);
+    return this.cachedInputs;
+  }
+  get outputs() {
+    this.cachedOutputs ??= toOutputRefArray(this.componentDef.outputs);
+    return this.cachedOutputs;
+  }
+  /**
+   * @param componentDef The component definition.
+   * @param ngModule The NgModuleRef to which the factory is bound.
+   */
+  constructor(componentDef, ngModule) {
+    super();
+    this.componentDef = componentDef;
+    this.ngModule = ngModule;
+    this.componentType = componentDef.type;
+    this.selector = stringifyCSSSelectorList(componentDef.selectors);
+    this.ngContentSelectors = componentDef.ngContentSelectors ?? [];
+    this.isBoundToModule = !!ngModule;
+  }
+  create(injector, projectableNodes, rootSelectorOrNode, environmentInjector, directives, componentBindings) {
+    profiler(
+      22
+      /* ProfilerEvent.DynamicComponentStart */
+    );
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      const cmpDef = this.componentDef;
+      ngDevMode && verifyNotAnOrphanComponent(cmpDef);
+      const rootTView = createRootTView(rootSelectorOrNode, cmpDef, componentBindings, directives);
+      const rootViewInjector = createRootViewInjector(cmpDef, environmentInjector || this.ngModule, injector);
+      const environment = createRootLViewEnvironment(rootViewInjector);
+      const hostRenderer = environment.rendererFactory.createRenderer(null, cmpDef);
+      const hostElement = rootSelectorOrNode ? locateHostElement(hostRenderer, rootSelectorOrNode, cmpDef.encapsulation, rootViewInjector) : createHostElement(cmpDef, hostRenderer);
+      const hasInputBindings = componentBindings?.some(isInputBinding) || directives?.some((d) => typeof d !== "function" && d.bindings.some(isInputBinding));
+      const rootLView = createLView(null, rootTView, null, 512 | getInitialLViewFlagsFromDef(cmpDef), null, null, environment, hostRenderer, rootViewInjector, null, retrieveHydrationInfo(
+        hostElement,
+        rootViewInjector,
+        true
+        /* isRootView */
+      ));
+      rootLView[HEADER_OFFSET] = hostElement;
+      enterView(rootLView);
+      let componentView = null;
+      try {
+        const hostTNode = elementStartFirstCreatePass(HEADER_OFFSET, rootTView, rootLView, "#host", () => rootTView.directiveRegistry, true, 0);
+        if (hostElement) {
+          setupStaticAttributes(hostRenderer, hostElement, hostTNode);
+          attachPatchData(hostElement, rootLView);
+        }
+        createDirectivesInstances(rootTView, rootLView, hostTNode);
+        executeContentQueries(rootTView, hostTNode, rootLView);
+        elementEndFirstCreatePass(rootTView, hostTNode);
+        if (projectableNodes !== void 0) {
+          projectNodes(hostTNode, this.ngContentSelectors, projectableNodes);
+        }
+        componentView = getComponentLViewByIndex(hostTNode.index, rootLView);
+        rootLView[CONTEXT] = componentView[CONTEXT];
+        renderView(rootTView, rootLView, null);
+      } catch (e) {
+        if (componentView !== null) {
+          unregisterLView(componentView);
+        }
+        unregisterLView(rootLView);
+        throw e;
+      } finally {
+        profiler(
+          23
+          /* ProfilerEvent.DynamicComponentEnd */
+        );
+        leaveView();
+      }
+      return new ComponentRef2(this.componentType, rootLView, !!hasInputBindings);
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+};
+function createRootTView(rootSelectorOrNode, componentDef, componentBindings, directives) {
+  const tAttributes = rootSelectorOrNode ? ["ng-version", "20.0.5"] : (
+    // Extract attributes and classes from the first selector only to match VE behavior.
+    extractAttrsAndClassesFromSelector(componentDef.selectors[0])
+  );
+  let creationBindings = null;
+  let updateBindings = null;
+  let varsToAllocate = 0;
+  if (componentBindings) {
+    for (const binding of componentBindings) {
+      varsToAllocate += binding[BINDING].requiredVars;
+      if (binding.create) {
+        binding.targetIdx = 0;
+        (creationBindings ??= []).push(binding);
+      }
+      if (binding.update) {
+        binding.targetIdx = 0;
+        (updateBindings ??= []).push(binding);
+      }
+    }
+  }
+  if (directives) {
+    for (let i = 0; i < directives.length; i++) {
+      const directive = directives[i];
+      if (typeof directive !== "function") {
+        for (const binding of directive.bindings) {
+          varsToAllocate += binding[BINDING].requiredVars;
+          const targetDirectiveIdx = i + 1;
+          if (binding.create) {
+            binding.targetIdx = targetDirectiveIdx;
+            (creationBindings ??= []).push(binding);
+          }
+          if (binding.update) {
+            binding.targetIdx = targetDirectiveIdx;
+            (updateBindings ??= []).push(binding);
+          }
+        }
+      }
+    }
+  }
+  const directivesToApply = [componentDef];
+  if (directives) {
+    for (const directive of directives) {
+      const directiveType = typeof directive === "function" ? directive : directive.type;
+      const directiveDef = ngDevMode ? getDirectiveDefOrThrow(directiveType) : getDirectiveDef(directiveType);
+      if (ngDevMode && !directiveDef.standalone) {
+        throw new RuntimeError(907, `The ${stringifyForError(directiveType)} directive must be standalone in order to be applied to a dynamically-created component.`);
+      }
+      directivesToApply.push(directiveDef);
+    }
+  }
+  const rootTView = createTView(0, null, getRootTViewTemplate(creationBindings, updateBindings), 1, varsToAllocate, directivesToApply, null, null, null, [tAttributes], null);
+  return rootTView;
+}
+function getRootTViewTemplate(creationBindings, updateBindings) {
+  if (!creationBindings && !updateBindings) {
+    return null;
+  }
+  return (flags) => {
+    if (flags & 1 && creationBindings) {
+      for (const binding of creationBindings) {
+        binding.create();
+      }
+    }
+    if (flags & 2 && updateBindings) {
+      for (const binding of updateBindings) {
+        binding.update();
+      }
+    }
+  };
+}
+function isInputBinding(binding) {
+  const kind = binding[BINDING].kind;
+  return kind === "input" || kind === "twoWay";
+}
+var ComponentRef2 = class extends ComponentRef$1 {
+  _rootLView;
+  _hasInputBindings;
+  instance;
+  hostView;
+  changeDetectorRef;
+  componentType;
+  location;
+  previousInputValues = null;
+  _tNode;
+  constructor(componentType, _rootLView, _hasInputBindings) {
+    super();
+    this._rootLView = _rootLView;
+    this._hasInputBindings = _hasInputBindings;
+    this._tNode = getTNode(_rootLView[TVIEW], HEADER_OFFSET);
+    this.location = createElementRef(this._tNode, _rootLView);
+    this.instance = getComponentLViewByIndex(this._tNode.index, _rootLView)[CONTEXT];
+    this.hostView = this.changeDetectorRef = new ViewRef(
+      _rootLView,
+      void 0
+      /* _cdRefInjectingView */
+    );
+    this.componentType = componentType;
+  }
+  setInput(name, value) {
+    if (this._hasInputBindings && ngDevMode) {
+      throw new RuntimeError(317, "Cannot call `setInput` on a component that is using the `inputBinding` or `twoWayBinding` functions.");
+    }
+    const tNode = this._tNode;
+    this.previousInputValues ??= /* @__PURE__ */ new Map();
+    if (this.previousInputValues.has(name) && Object.is(this.previousInputValues.get(name), value)) {
+      return;
+    }
+    const lView = this._rootLView;
+    const hasSetInput = setAllInputsForProperty(tNode, lView[TVIEW], lView, name, value);
+    this.previousInputValues.set(name, value);
+    const childComponentLView = getComponentLViewByIndex(tNode.index, lView);
+    markViewDirty(
+      childComponentLView,
+      1
+      /* NotificationSource.SetInput */
+    );
+    if (ngDevMode && !hasSetInput) {
+      const cmpNameForError = stringifyForError(this.componentType);
+      let message = `Can't set value of the '${name}' input on the '${cmpNameForError}' component. `;
+      message += `Make sure that the '${name}' property is annotated with @Input() or a mapped @Input('${name}') exists.`;
+      reportUnknownPropertyError(message);
+    }
+  }
+  get injector() {
+    return new NodeInjector(this._tNode, this._rootLView);
+  }
+  destroy() {
+    this.hostView.destroy();
+  }
+  onDestroy(callback) {
+    this.hostView.onDestroy(callback);
+  }
+};
+function projectNodes(tNode, ngContentSelectors, projectableNodes) {
+  const projection = tNode.projection = [];
+  for (let i = 0; i < ngContentSelectors.length; i++) {
+    const nodesforSlot = projectableNodes[i];
+    projection.push(nodesforSlot != null && nodesforSlot.length ? Array.from(nodesforSlot) : null);
+  }
+}
+var ViewContainerRef = class {
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectViewContainerRef;
+};
+function injectViewContainerRef() {
+  const previousTNode = getCurrentTNode();
+  return createContainerRef(previousTNode, getLView());
+}
+var VE_ViewContainerRef = ViewContainerRef;
+var R3ViewContainerRef = class ViewContainerRef2 extends VE_ViewContainerRef {
+  _lContainer;
+  _hostTNode;
+  _hostLView;
+  constructor(_lContainer, _hostTNode, _hostLView) {
+    super();
+    this._lContainer = _lContainer;
+    this._hostTNode = _hostTNode;
+    this._hostLView = _hostLView;
+  }
+  get element() {
+    return createElementRef(this._hostTNode, this._hostLView);
+  }
+  get injector() {
+    return new NodeInjector(this._hostTNode, this._hostLView);
+  }
+  /** @deprecated No replacement */
+  get parentInjector() {
+    const parentLocation = getParentInjectorLocation(this._hostTNode, this._hostLView);
+    if (hasParentInjector(parentLocation)) {
+      const parentView = getParentInjectorView(parentLocation, this._hostLView);
+      const injectorIndex = getParentInjectorIndex(parentLocation);
+      ngDevMode && assertNodeInjector(parentView, injectorIndex);
+      const parentTNode = parentView[TVIEW].data[
+        injectorIndex + 8
+        /* NodeInjectorOffset.TNODE */
+      ];
+      return new NodeInjector(parentTNode, parentView);
+    } else {
+      return new NodeInjector(null, this._hostLView);
+    }
+  }
+  clear() {
+    while (this.length > 0) {
+      this.remove(this.length - 1);
+    }
+  }
+  get(index) {
+    const viewRefs = getViewRefs(this._lContainer);
+    return viewRefs !== null && viewRefs[index] || null;
+  }
+  get length() {
+    return this._lContainer.length - CONTAINER_HEADER_OFFSET;
+  }
+  createEmbeddedView(templateRef, context2, indexOrOptions) {
+    let index;
+    let injector;
+    if (typeof indexOrOptions === "number") {
+      index = indexOrOptions;
+    } else if (indexOrOptions != null) {
+      index = indexOrOptions.index;
+      injector = indexOrOptions.injector;
+    }
+    const dehydratedView = findMatchingDehydratedView(this._lContainer, templateRef.ssrId);
+    const viewRef = templateRef.createEmbeddedViewImpl(context2 || {}, injector, dehydratedView);
+    this.insertImpl(viewRef, index, shouldAddViewToDom(this._hostTNode, dehydratedView));
+    return viewRef;
+  }
+  createComponent(componentFactoryOrType, indexOrOptions, injector, projectableNodes, environmentInjector, directives, bindings) {
+    const isComponentFactory = componentFactoryOrType && !isType(componentFactoryOrType);
+    let index;
+    if (isComponentFactory) {
+      if (ngDevMode) {
+        assertEqual(typeof indexOrOptions !== "object", true, "It looks like Component factory was provided as the first argument and an options object as the second argument. This combination of arguments is incompatible. You can either change the first argument to provide Component type or change the second argument to be a number (representing an index at which to insert the new component's host view into this container)");
+      }
+      index = indexOrOptions;
+    } else {
+      if (ngDevMode) {
+        assertDefined(getComponentDef(componentFactoryOrType), `Provided Component class doesn't contain Component definition. Please check whether provided class has @Component decorator.`);
+        assertEqual(typeof indexOrOptions !== "number", true, "It looks like Component type was provided as the first argument and a number (representing an index at which to insert the new component's host view into this container as the second argument. This combination of arguments is incompatible. Please use an object as the second argument instead.");
+      }
+      const options = indexOrOptions || {};
+      if (ngDevMode && options.environmentInjector && options.ngModuleRef) {
+        throwError2(`Cannot pass both environmentInjector and ngModuleRef options to createComponent().`);
+      }
+      index = options.index;
+      injector = options.injector;
+      projectableNodes = options.projectableNodes;
+      environmentInjector = options.environmentInjector || options.ngModuleRef;
+      directives = options.directives;
+      bindings = options.bindings;
+    }
+    const componentFactory = isComponentFactory ? componentFactoryOrType : new ComponentFactory2(getComponentDef(componentFactoryOrType));
+    const contextInjector = injector || this.parentInjector;
+    if (!environmentInjector && componentFactory.ngModule == null) {
+      const _injector = isComponentFactory ? contextInjector : this.parentInjector;
+      const result = _injector.get(EnvironmentInjector, null);
+      if (result) {
+        environmentInjector = result;
+      }
+    }
+    const componentDef = getComponentDef(componentFactory.componentType ?? {});
+    const dehydratedView = findMatchingDehydratedView(this._lContainer, componentDef?.id ?? null);
+    const rNode = dehydratedView?.firstChild ?? null;
+    const componentRef = componentFactory.create(contextInjector, projectableNodes, rNode, environmentInjector, directives, bindings);
+    this.insertImpl(componentRef.hostView, index, shouldAddViewToDom(this._hostTNode, dehydratedView));
+    return componentRef;
+  }
+  insert(viewRef, index) {
+    return this.insertImpl(viewRef, index, true);
+  }
+  insertImpl(viewRef, index, addToDOM) {
+    const lView = viewRef._lView;
+    if (ngDevMode && viewRef.destroyed) {
+      throw new Error("Cannot insert a destroyed View in a ViewContainer!");
+    }
+    if (viewAttachedToContainer(lView)) {
+      const prevIdx = this.indexOf(viewRef);
+      if (prevIdx !== -1) {
+        this.detach(prevIdx);
+      } else {
+        const prevLContainer = lView[PARENT];
+        ngDevMode && assertEqual(isLContainer(prevLContainer), true, "An attached view should have its PARENT point to a container.");
+        const prevVCRef = new R3ViewContainerRef(prevLContainer, prevLContainer[T_HOST], prevLContainer[PARENT]);
+        prevVCRef.detach(prevVCRef.indexOf(viewRef));
+      }
+    }
+    const adjustedIdx = this._adjustIndex(index);
+    const lContainer = this._lContainer;
+    addLViewToLContainer(lContainer, lView, adjustedIdx, addToDOM);
+    viewRef.attachToViewContainerRef();
+    addToArray(getOrCreateViewRefs(lContainer), adjustedIdx, viewRef);
+    return viewRef;
+  }
+  move(viewRef, newIndex) {
+    if (ngDevMode && viewRef.destroyed) {
+      throw new Error("Cannot move a destroyed View in a ViewContainer!");
+    }
+    return this.insert(viewRef, newIndex);
+  }
+  indexOf(viewRef) {
+    const viewRefsArr = getViewRefs(this._lContainer);
+    return viewRefsArr !== null ? viewRefsArr.indexOf(viewRef) : -1;
+  }
+  remove(index) {
+    const adjustedIdx = this._adjustIndex(index, -1);
+    const detachedView = detachView(this._lContainer, adjustedIdx);
+    if (detachedView) {
+      removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx);
+      destroyLView(detachedView[TVIEW], detachedView);
+    }
+  }
+  detach(index) {
+    const adjustedIdx = this._adjustIndex(index, -1);
+    const view = detachView(this._lContainer, adjustedIdx);
+    const wasDetached = view && removeFromArray(getOrCreateViewRefs(this._lContainer), adjustedIdx) != null;
+    return wasDetached ? new ViewRef(view) : null;
+  }
+  _adjustIndex(index, shift = 0) {
+    if (index == null) {
+      return this.length + shift;
+    }
+    if (ngDevMode) {
+      assertGreaterThan(index, -1, `ViewRef index must be positive, got ${index}`);
+      assertLessThan(index, this.length + 1 + shift, "index");
+    }
+    return index;
+  }
+};
+function getViewRefs(lContainer) {
+  return lContainer[VIEW_REFS];
+}
+function getOrCreateViewRefs(lContainer) {
+  return lContainer[VIEW_REFS] || (lContainer[VIEW_REFS] = []);
+}
+function createContainerRef(hostTNode, hostLView) {
+  ngDevMode && assertTNodeType(
+    hostTNode,
+    12 | 3
+    /* TNodeType.AnyRNode */
+  );
+  let lContainer;
+  const slotValue = hostLView[hostTNode.index];
+  if (isLContainer(slotValue)) {
+    lContainer = slotValue;
+  } else {
+    lContainer = createLContainer(slotValue, hostLView, null, hostTNode);
+    hostLView[hostTNode.index] = lContainer;
+    addToEndOfViewTree(hostLView, lContainer);
+  }
+  _locateOrCreateAnchorNode(lContainer, hostLView, hostTNode, slotValue);
+  return new R3ViewContainerRef(lContainer, hostTNode, hostLView);
+}
+function insertAnchorNode(hostLView, hostTNode) {
+  const renderer = hostLView[RENDERER];
+  const commentNode = renderer.createComment(ngDevMode ? "container" : "");
+  const hostNative = getNativeByTNode(hostTNode, hostLView);
+  const parentOfHostNative = renderer.parentNode(hostNative);
+  nativeInsertBefore(renderer, parentOfHostNative, commentNode, renderer.nextSibling(hostNative), false);
+  return commentNode;
+}
+var _locateOrCreateAnchorNode = createAnchorNode;
+var _populateDehydratedViewsInLContainer = () => false;
+function populateDehydratedViewsInLContainer(lContainer, tNode, hostLView) {
+  return _populateDehydratedViewsInLContainer(lContainer, tNode, hostLView);
+}
+function createAnchorNode(lContainer, hostLView, hostTNode, slotValue) {
+  if (lContainer[NATIVE])
+    return;
+  let commentNode;
+  if (hostTNode.type & 8) {
+    commentNode = unwrapRNode(slotValue);
+  } else {
+    commentNode = insertAnchorNode(hostLView, hostTNode);
+  }
+  lContainer[NATIVE] = commentNode;
+}
+function populateDehydratedViewsInLContainerImpl(lContainer, tNode, hostLView) {
+  if (lContainer[NATIVE] && lContainer[DEHYDRATED_VIEWS]) {
+    return true;
+  }
+  const hydrationInfo = hostLView[HYDRATION];
+  const noOffsetIndex = tNode.index - HEADER_OFFSET;
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock2(tNode) || isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
+  if (isNodeCreationMode) {
+    return false;
+  }
+  const currentRNode = getSegmentHead(hydrationInfo, noOffsetIndex);
+  const serializedViews = hydrationInfo.data[CONTAINERS]?.[noOffsetIndex];
+  ngDevMode && assertDefined(serializedViews, "Unexpected state: no hydration info available for a given TNode, which represents a view container.");
+  const [commentNode, dehydratedViews] = locateDehydratedViewsInContainer(currentRNode, serializedViews);
+  if (ngDevMode) {
+    validateMatchingNode(commentNode, Node.COMMENT_NODE, null, hostLView, tNode, true);
+    markRNodeAsClaimedByHydration(commentNode, false);
+  }
+  lContainer[NATIVE] = commentNode;
+  lContainer[DEHYDRATED_VIEWS] = dehydratedViews;
+  return true;
+}
+function locateOrCreateAnchorNode(lContainer, hostLView, hostTNode, slotValue) {
+  if (!_populateDehydratedViewsInLContainer(lContainer, hostTNode, hostLView)) {
+    createAnchorNode(lContainer, hostLView, hostTNode, slotValue);
+  }
+}
+function enableLocateOrCreateContainerRefImpl() {
+  _locateOrCreateAnchorNode = locateOrCreateAnchorNode;
+  _populateDehydratedViewsInLContainer = populateDehydratedViewsInLContainerImpl;
+}
+var LQuery_ = class _LQuery_ {
+  queryList;
+  matches = null;
+  constructor(queryList) {
+    this.queryList = queryList;
+  }
+  clone() {
+    return new _LQuery_(this.queryList);
+  }
+  setDirty() {
+    this.queryList.setDirty();
+  }
+};
+var LQueries_ = class _LQueries_ {
+  queries;
+  constructor(queries = []) {
+    this.queries = queries;
+  }
+  createEmbeddedView(tView) {
+    const tQueries = tView.queries;
+    if (tQueries !== null) {
+      const noOfInheritedQueries = tView.contentQueries !== null ? tView.contentQueries[0] : tQueries.length;
+      const viewLQueries = [];
+      for (let i = 0; i < noOfInheritedQueries; i++) {
+        const tQuery = tQueries.getByIndex(i);
+        const parentLQuery = this.queries[tQuery.indexInDeclarationView];
+        viewLQueries.push(parentLQuery.clone());
+      }
+      return new _LQueries_(viewLQueries);
+    }
+    return null;
+  }
+  insertView(tView) {
+    this.dirtyQueriesWithMatches(tView);
+  }
+  detachView(tView) {
+    this.dirtyQueriesWithMatches(tView);
+  }
+  finishViewCreation(tView) {
+    this.dirtyQueriesWithMatches(tView);
+  }
+  dirtyQueriesWithMatches(tView) {
+    for (let i = 0; i < this.queries.length; i++) {
+      if (getTQuery(tView, i).matches !== null) {
+        this.queries[i].setDirty();
+      }
+    }
+  }
+};
+var TQueryMetadata_ = class {
+  flags;
+  read;
+  predicate;
+  constructor(predicate, flags, read = null) {
+    this.flags = flags;
+    this.read = read;
+    if (typeof predicate === "string") {
+      this.predicate = splitQueryMultiSelectors(predicate);
+    } else {
+      this.predicate = predicate;
+    }
+  }
+};
+var TQueries_ = class _TQueries_ {
+  queries;
+  constructor(queries = []) {
+    this.queries = queries;
+  }
+  elementStart(tView, tNode) {
+    ngDevMode && assertFirstCreatePass(tView, "Queries should collect results on the first template pass only");
+    for (let i = 0; i < this.queries.length; i++) {
+      this.queries[i].elementStart(tView, tNode);
+    }
+  }
+  elementEnd(tNode) {
+    for (let i = 0; i < this.queries.length; i++) {
+      this.queries[i].elementEnd(tNode);
+    }
+  }
+  embeddedTView(tNode) {
+    let queriesForTemplateRef = null;
+    for (let i = 0; i < this.length; i++) {
+      const childQueryIndex = queriesForTemplateRef !== null ? queriesForTemplateRef.length : 0;
+      const tqueryClone = this.getByIndex(i).embeddedTView(tNode, childQueryIndex);
+      if (tqueryClone) {
+        tqueryClone.indexInDeclarationView = i;
+        if (queriesForTemplateRef !== null) {
+          queriesForTemplateRef.push(tqueryClone);
+        } else {
+          queriesForTemplateRef = [tqueryClone];
+        }
+      }
+    }
+    return queriesForTemplateRef !== null ? new _TQueries_(queriesForTemplateRef) : null;
+  }
+  template(tView, tNode) {
+    ngDevMode && assertFirstCreatePass(tView, "Queries should collect results on the first template pass only");
+    for (let i = 0; i < this.queries.length; i++) {
+      this.queries[i].template(tView, tNode);
+    }
+  }
+  getByIndex(index) {
+    ngDevMode && assertIndexInRange(this.queries, index);
+    return this.queries[index];
+  }
+  get length() {
+    return this.queries.length;
+  }
+  track(tquery) {
+    this.queries.push(tquery);
+  }
+};
+var TQuery_ = class _TQuery_ {
+  metadata;
+  matches = null;
+  indexInDeclarationView = -1;
+  crossesNgTemplate = false;
+  /**
+   * A node index on which a query was declared (-1 for view queries and ones inherited from the
+   * declaration template). We use this index (alongside with _appliesToNextNode flag) to know
+   * when to apply content queries to elements in a template.
+   */
+  _declarationNodeIndex;
+  /**
+   * A flag indicating if a given query still applies to nodes it is crossing. We use this flag
+   * (alongside with _declarationNodeIndex) to know when to stop applying content queries to
+   * elements in a template.
+   */
+  _appliesToNextNode = true;
+  constructor(metadata, nodeIndex = -1) {
+    this.metadata = metadata;
+    this._declarationNodeIndex = nodeIndex;
+  }
+  elementStart(tView, tNode) {
+    if (this.isApplyingToNode(tNode)) {
+      this.matchTNode(tView, tNode);
+    }
+  }
+  elementEnd(tNode) {
+    if (this._declarationNodeIndex === tNode.index) {
+      this._appliesToNextNode = false;
+    }
+  }
+  template(tView, tNode) {
+    this.elementStart(tView, tNode);
+  }
+  embeddedTView(tNode, childQueryIndex) {
+    if (this.isApplyingToNode(tNode)) {
+      this.crossesNgTemplate = true;
+      this.addMatch(-tNode.index, childQueryIndex);
+      return new _TQuery_(this.metadata);
+    }
+    return null;
+  }
+  isApplyingToNode(tNode) {
+    if (this._appliesToNextNode && (this.metadata.flags & 1) !== 1) {
+      const declarationNodeIdx = this._declarationNodeIndex;
+      let parent = tNode.parent;
+      while (parent !== null && parent.type & 8 && parent.index !== declarationNodeIdx) {
+        parent = parent.parent;
+      }
+      return declarationNodeIdx === (parent !== null ? parent.index : -1);
+    }
+    return this._appliesToNextNode;
+  }
+  matchTNode(tView, tNode) {
+    const predicate = this.metadata.predicate;
+    if (Array.isArray(predicate)) {
+      for (let i = 0; i < predicate.length; i++) {
+        const name = predicate[i];
+        this.matchTNodeWithReadOption(tView, tNode, getIdxOfMatchingSelector(tNode, name));
+        this.matchTNodeWithReadOption(tView, tNode, locateDirectiveOrProvider(tNode, tView, name, false, false));
+      }
+    } else {
+      if (predicate === TemplateRef) {
+        if (tNode.type & 4) {
+          this.matchTNodeWithReadOption(tView, tNode, -1);
+        }
+      } else {
+        this.matchTNodeWithReadOption(tView, tNode, locateDirectiveOrProvider(tNode, tView, predicate, false, false));
+      }
+    }
+  }
+  matchTNodeWithReadOption(tView, tNode, nodeMatchIdx) {
+    if (nodeMatchIdx !== null) {
+      const read = this.metadata.read;
+      if (read !== null) {
+        if (read === ElementRef || read === ViewContainerRef || read === TemplateRef && tNode.type & 4) {
+          this.addMatch(tNode.index, -2);
+        } else {
+          const directiveOrProviderIdx = locateDirectiveOrProvider(tNode, tView, read, false, false);
+          if (directiveOrProviderIdx !== null) {
+            this.addMatch(tNode.index, directiveOrProviderIdx);
+          }
+        }
+      } else {
+        this.addMatch(tNode.index, nodeMatchIdx);
+      }
+    }
+  }
+  addMatch(tNodeIdx, matchIdx) {
+    if (this.matches === null) {
+      this.matches = [tNodeIdx, matchIdx];
+    } else {
+      this.matches.push(tNodeIdx, matchIdx);
+    }
+  }
+};
+function getIdxOfMatchingSelector(tNode, selector) {
+  const localNames = tNode.localNames;
+  if (localNames !== null) {
+    for (let i = 0; i < localNames.length; i += 2) {
+      if (localNames[i] === selector) {
+        return localNames[i + 1];
+      }
+    }
+  }
+  return null;
+}
+function createResultByTNodeType(tNode, currentView) {
+  if (tNode.type & (3 | 8)) {
+    return createElementRef(tNode, currentView);
+  } else if (tNode.type & 4) {
+    return createTemplateRef(tNode, currentView);
+  }
+  return null;
+}
+function createResultForNode(lView, tNode, matchingIdx, read) {
+  if (matchingIdx === -1) {
+    return createResultByTNodeType(tNode, lView);
+  } else if (matchingIdx === -2) {
+    return createSpecialToken(lView, tNode, read);
+  } else {
+    return getNodeInjectable(lView, lView[TVIEW], matchingIdx, tNode);
+  }
+}
+function createSpecialToken(lView, tNode, read) {
+  if (read === ElementRef) {
+    return createElementRef(tNode, lView);
+  } else if (read === TemplateRef) {
+    return createTemplateRef(tNode, lView);
+  } else if (read === ViewContainerRef) {
+    ngDevMode && assertTNodeType(
+      tNode,
+      3 | 12
+      /* TNodeType.AnyContainer */
+    );
+    return createContainerRef(tNode, lView);
+  } else {
+    ngDevMode && throwError2(`Special token to read should be one of ElementRef, TemplateRef or ViewContainerRef but got ${stringify(read)}.`);
+  }
+}
+function materializeViewResults(tView, lView, tQuery, queryIndex) {
+  const lQuery = lView[QUERIES].queries[queryIndex];
+  if (lQuery.matches === null) {
+    const tViewData = tView.data;
+    const tQueryMatches = tQuery.matches;
+    const result = [];
+    for (let i = 0; tQueryMatches !== null && i < tQueryMatches.length; i += 2) {
+      const matchedNodeIdx = tQueryMatches[i];
+      if (matchedNodeIdx < 0) {
+        result.push(null);
+      } else {
+        ngDevMode && assertIndexInRange(tViewData, matchedNodeIdx);
+        const tNode = tViewData[matchedNodeIdx];
+        result.push(createResultForNode(lView, tNode, tQueryMatches[i + 1], tQuery.metadata.read));
+      }
+    }
+    lQuery.matches = result;
+  }
+  return lQuery.matches;
+}
+function collectQueryResults(tView, lView, queryIndex, result) {
+  const tQuery = tView.queries.getByIndex(queryIndex);
+  const tQueryMatches = tQuery.matches;
+  if (tQueryMatches !== null) {
+    const lViewResults = materializeViewResults(tView, lView, tQuery, queryIndex);
+    for (let i = 0; i < tQueryMatches.length; i += 2) {
+      const tNodeIdx = tQueryMatches[i];
+      if (tNodeIdx > 0) {
+        result.push(lViewResults[i / 2]);
+      } else {
+        const childQueryIndex = tQueryMatches[i + 1];
+        const declarationLContainer = lView[-tNodeIdx];
+        ngDevMode && assertLContainer(declarationLContainer);
+        for (let i2 = CONTAINER_HEADER_OFFSET; i2 < declarationLContainer.length; i2++) {
+          const embeddedLView = declarationLContainer[i2];
+          if (embeddedLView[DECLARATION_LCONTAINER] === embeddedLView[PARENT]) {
+            collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);
+          }
+        }
+        if (declarationLContainer[MOVED_VIEWS] !== null) {
+          const embeddedLViews = declarationLContainer[MOVED_VIEWS];
+          for (let i2 = 0; i2 < embeddedLViews.length; i2++) {
+            const embeddedLView = embeddedLViews[i2];
+            collectQueryResults(embeddedLView[TVIEW], embeddedLView, childQueryIndex, result);
+          }
+        }
+      }
+    }
+  }
+  return result;
+}
+function loadQueryInternal(lView, queryIndex) {
+  ngDevMode && assertDefined(lView[QUERIES], "LQueries should be defined when trying to load a query");
+  ngDevMode && assertIndexInRange(lView[QUERIES].queries, queryIndex);
+  return lView[QUERIES].queries[queryIndex].queryList;
+}
+function createLQuery(tView, lView, flags) {
+  const queryList = new QueryList(
+    (flags & 4) === 4
+    /* QueryFlags.emitDistinctChangesOnly */
+  );
+  storeCleanupWithContext(tView, lView, queryList, queryList.destroy);
+  const lQueries = (lView[QUERIES] ??= new LQueries_()).queries;
+  return lQueries.push(new LQuery_(queryList)) - 1;
+}
+function createViewQuery(predicate, flags, read) {
+  ngDevMode && assertNumber(flags, "Expecting flags");
+  const tView = getTView();
+  if (tView.firstCreatePass) {
+    createTQuery(tView, new TQueryMetadata_(predicate, flags, read), -1);
+    if ((flags & 2) === 2) {
+      tView.staticViewQueries = true;
+    }
+  }
+  return createLQuery(tView, getLView(), flags);
+}
+function createContentQuery(directiveIndex, predicate, flags, read) {
+  ngDevMode && assertNumber(flags, "Expecting flags");
+  const tView = getTView();
+  if (tView.firstCreatePass) {
+    const tNode = getCurrentTNode();
+    createTQuery(tView, new TQueryMetadata_(predicate, flags, read), tNode.index);
+    saveContentQueryAndDirectiveIndex(tView, directiveIndex);
+    if ((flags & 2) === 2) {
+      tView.staticContentQueries = true;
+    }
+  }
+  return createLQuery(tView, getLView(), flags);
+}
+function splitQueryMultiSelectors(locator) {
+  return locator.split(",").map((s) => s.trim());
+}
+function createTQuery(tView, metadata, nodeIndex) {
+  if (tView.queries === null)
+    tView.queries = new TQueries_();
+  tView.queries.track(new TQuery_(metadata, nodeIndex));
+}
+function saveContentQueryAndDirectiveIndex(tView, directiveIndex) {
+  const tViewContentQueries = tView.contentQueries || (tView.contentQueries = []);
+  const lastSavedDirectiveIndex = tViewContentQueries.length ? tViewContentQueries[tViewContentQueries.length - 1] : -1;
+  if (directiveIndex !== lastSavedDirectiveIndex) {
+    tViewContentQueries.push(tView.queries.length - 1, directiveIndex);
+  }
+}
+function getTQuery(tView, index) {
+  ngDevMode && assertDefined(tView.queries, "TQueries must be defined to retrieve a TQuery");
+  return tView.queries.getByIndex(index);
+}
+function getQueryResults(lView, queryIndex) {
+  const tView = lView[TVIEW];
+  const tQuery = getTQuery(tView, queryIndex);
+  return tQuery.crossesNgTemplate ? collectQueryResults(tView, lView, queryIndex, []) : materializeViewResults(tView, lView, tQuery, queryIndex);
+}
+function createQuerySignalFn(firstOnly, required, opts) {
+  let node;
+  const signalFn = createComputed(() => {
+    node._dirtyCounter();
+    const value = refreshSignalQuery(node, firstOnly);
+    if (required && value === void 0) {
+      throw new RuntimeError(-951, ngDevMode && "Child query result is required but no value is available.");
+    }
+    return value;
+  });
+  node = signalFn[SIGNAL];
+  node._dirtyCounter = signal(0);
+  node._flatValue = void 0;
+  if (ngDevMode) {
+    signalFn.toString = () => `[Query Signal]`;
+    node.debugName = opts?.debugName;
+  }
+  return signalFn;
+}
+function createSingleResultOptionalQuerySignalFn(opts) {
+  return createQuerySignalFn(
+    /* firstOnly */
+    true,
+    /* required */
+    false,
+    opts
+  );
+}
+function createSingleResultRequiredQuerySignalFn(opts) {
+  return createQuerySignalFn(
+    /* firstOnly */
+    true,
+    /* required */
+    true,
+    opts
+  );
+}
+function createMultiResultQuerySignalFn(opts) {
+  return createQuerySignalFn(
+    /* firstOnly */
+    false,
+    /* required */
+    false,
+    opts
+  );
+}
+function bindQueryToSignal(target, queryIndex) {
+  const node = target[SIGNAL];
+  node._lView = getLView();
+  node._queryIndex = queryIndex;
+  node._queryList = loadQueryInternal(node._lView, queryIndex);
+  node._queryList.onDirty(() => node._dirtyCounter.update((v) => v + 1));
+}
+function refreshSignalQuery(node, firstOnly) {
+  const lView = node._lView;
+  const queryIndex = node._queryIndex;
+  if (lView === void 0 || queryIndex === void 0 || lView[FLAGS] & 4) {
+    return firstOnly ? void 0 : EMPTY_ARRAY;
+  }
+  const queryList = loadQueryInternal(lView, queryIndex);
+  const results = getQueryResults(lView, queryIndex);
+  queryList.reset(results, unwrapElementRef);
+  if (firstOnly) {
+    return queryList.first;
+  } else {
+    const resultChanged = queryList._changesDetected;
+    if (resultChanged || node._flatValue === void 0) {
+      return node._flatValue = queryList.toArray();
+    }
+    return node._flatValue;
+  }
+}
+function resolveComponentResources(resourceResolver) {
+  const componentResolved = [];
+  const urlMap = /* @__PURE__ */ new Map();
+  function cachedResourceResolve(url) {
+    let promise = urlMap.get(url);
+    if (!promise) {
+      const resp = resourceResolver(url);
+      urlMap.set(url, promise = resp.then(unwrapResponse));
+    }
+    return promise;
+  }
+  componentResourceResolutionQueue.forEach((component, type) => {
+    const promises = [];
+    if (component.templateUrl) {
+      promises.push(cachedResourceResolve(component.templateUrl).then((template) => {
+        component.template = template;
+      }));
+    }
+    const styles = typeof component.styles === "string" ? [component.styles] : component.styles || [];
+    component.styles = styles;
+    if (component.styleUrl && component.styleUrls?.length) {
+      throw new Error("@Component cannot define both `styleUrl` and `styleUrls`. Use `styleUrl` if the component has one stylesheet, or `styleUrls` if it has multiple");
+    } else if (component.styleUrls?.length) {
+      const styleOffset = component.styles.length;
+      const styleUrls = component.styleUrls;
+      component.styleUrls.forEach((styleUrl, index) => {
+        styles.push("");
+        promises.push(cachedResourceResolve(styleUrl).then((style) => {
+          styles[styleOffset + index] = style;
+          styleUrls.splice(styleUrls.indexOf(styleUrl), 1);
+          if (styleUrls.length == 0) {
+            component.styleUrls = void 0;
+          }
+        }));
+      });
+    } else if (component.styleUrl) {
+      promises.push(cachedResourceResolve(component.styleUrl).then((style) => {
+        styles.push(style);
+        component.styleUrl = void 0;
+      }));
+    }
+    const fullyResolved = Promise.all(promises).then(() => componentDefResolved(type));
+    componentResolved.push(fullyResolved);
+  });
+  clearResolutionOfComponentResourcesQueue();
+  return Promise.all(componentResolved).then(() => void 0);
+}
+var componentResourceResolutionQueue = /* @__PURE__ */ new Map();
+var componentDefPendingResolution = /* @__PURE__ */ new Set();
+function maybeQueueResolutionOfComponentResources(type, metadata) {
+  if (componentNeedsResolution(metadata)) {
+    componentResourceResolutionQueue.set(type, metadata);
+    componentDefPendingResolution.add(type);
+  }
+}
+function isComponentDefPendingResolution(type) {
+  return componentDefPendingResolution.has(type);
+}
+function componentNeedsResolution(component) {
+  return !!(component.templateUrl && !component.hasOwnProperty("template") || component.styleUrls && component.styleUrls.length || component.styleUrl);
+}
+function clearResolutionOfComponentResourcesQueue() {
+  const old = componentResourceResolutionQueue;
+  componentResourceResolutionQueue = /* @__PURE__ */ new Map();
+  return old;
+}
+function restoreComponentResolutionQueue(queue2) {
+  componentDefPendingResolution.clear();
+  queue2.forEach((_, type) => componentDefPendingResolution.add(type));
+  componentResourceResolutionQueue = queue2;
+}
+function isComponentResourceResolutionQueueEmpty() {
+  return componentResourceResolutionQueue.size === 0;
+}
+function unwrapResponse(response) {
+  return typeof response == "string" ? response : response.text();
+}
+function componentDefResolved(type) {
+  componentDefPendingResolution.delete(type);
+}
+var modules = /* @__PURE__ */ new Map();
+var checkForDuplicateNgModules = true;
+function assertSameOrNotExisting(id, type, incoming) {
+  if (type && type !== incoming && checkForDuplicateNgModules) {
+    throw new Error(`Duplicate module registered for ${id} - ${stringify(type)} vs ${stringify(type.name)}`);
+  }
+}
+function registerNgModuleType(ngModuleType, id) {
+  const existing = modules.get(id) || null;
+  assertSameOrNotExisting(id, existing, ngModuleType);
+  modules.set(id, ngModuleType);
+}
+function getRegisteredNgModuleType(id) {
+  return modules.get(id);
+}
+function setAllowDuplicateNgModuleIdsForTest(allowDuplicates) {
+  checkForDuplicateNgModules = !allowDuplicates;
+}
+function ɵɵvalidateIframeAttribute(attrValue, tagName, attrName) {
+  const lView = getLView();
+  const tNode = getSelectedTNode();
+  const element = getNativeByTNode(tNode, lView);
+  if (tNode.type === 2 && tagName.toLowerCase() === "iframe") {
+    const iframe = element;
+    iframe.src = "";
+    iframe.srcdoc = trustedHTMLFromString("");
+    nativeRemoveNode(lView[RENDERER], iframe);
+    const errorMessage = ngDevMode && `Angular has detected that the \`${attrName}\` was applied as a binding to an <iframe>${getTemplateLocationDetails(lView)}. For security reasons, the \`${attrName}\` can be set on an <iframe> as a static attribute only. 
+To fix this, switch the \`${attrName}\` binding to a static attribute in a template or in host bindings section.`;
+    throw new RuntimeError(-910, errorMessage);
+  }
+  return attrValue;
+}
+var markedFeatures = /* @__PURE__ */ new Set();
+function performanceMarkFeature(feature) {
+  if (markedFeatures.has(feature)) {
+    return;
+  }
+  markedFeatures.add(feature);
+  performance?.mark?.("mark_feature_usage", { detail: { feature } });
+}
+var NgModuleRef$1 = class NgModuleRef {
+};
+var NgModuleFactory$1 = class NgModuleFactory {
+};
+function createNgModule(ngModule, parentInjector) {
+  return new NgModuleRef2(ngModule, parentInjector ?? null, []);
+}
+var createNgModuleRef = createNgModule;
+var NgModuleRef2 = class extends NgModuleRef$1 {
+  ngModuleType;
+  _parent;
+  // tslint:disable-next-line:require-internal-with-underscore
+  _bootstrapComponents = [];
+  _r3Injector;
+  instance;
+  destroyCbs = [];
+  // When bootstrapping a module we have a dependency graph that looks like this:
+  // ApplicationRef -> ComponentFactoryResolver -> NgModuleRef. The problem is that if the
+  // module being resolved tries to inject the ComponentFactoryResolver, it'll create a
+  // circular dependency which will result in a runtime error, because the injector doesn't
+  // exist yet. We work around the issue by creating the ComponentFactoryResolver ourselves
+  // and providing it, rather than letting the injector resolve it.
+  componentFactoryResolver = new ComponentFactoryResolver2(this);
+  constructor(ngModuleType, _parent, additionalProviders, runInjectorInitializers = true) {
+    super();
+    this.ngModuleType = ngModuleType;
+    this._parent = _parent;
+    const ngModuleDef = getNgModuleDef(ngModuleType);
+    ngDevMode && assertDefined(ngModuleDef, `NgModule '${stringify(ngModuleType)}' is not a subtype of 'NgModuleType'.`);
+    this._bootstrapComponents = maybeUnwrapFn(ngModuleDef.bootstrap);
+    this._r3Injector = createInjectorWithoutInjectorInstances(ngModuleType, _parent, [
+      { provide: NgModuleRef$1, useValue: this },
+      {
+        provide: ComponentFactoryResolver$1,
+        useValue: this.componentFactoryResolver
+      },
+      ...additionalProviders
+    ], stringify(ngModuleType), /* @__PURE__ */ new Set(["environment"]));
+    if (runInjectorInitializers) {
+      this.resolveInjectorInitializers();
+    }
+  }
+  resolveInjectorInitializers() {
+    this._r3Injector.resolveInjectorInitializers();
+    this.instance = this._r3Injector.get(this.ngModuleType);
+  }
+  get injector() {
+    return this._r3Injector;
+  }
+  destroy() {
+    ngDevMode && assertDefined(this.destroyCbs, "NgModule already destroyed");
+    const injector = this._r3Injector;
+    !injector.destroyed && injector.destroy();
+    this.destroyCbs.forEach((fn) => fn());
+    this.destroyCbs = null;
+  }
+  onDestroy(callback) {
+    ngDevMode && assertDefined(this.destroyCbs, "NgModule already destroyed");
+    this.destroyCbs.push(callback);
+  }
+};
+var NgModuleFactory2 = class extends NgModuleFactory$1 {
+  moduleType;
+  constructor(moduleType) {
+    super();
+    this.moduleType = moduleType;
+  }
+  create(parentInjector) {
+    return new NgModuleRef2(this.moduleType, parentInjector, []);
+  }
+};
+function createNgModuleRefWithProviders(moduleType, parentInjector, additionalProviders) {
+  return new NgModuleRef2(moduleType, parentInjector, additionalProviders, false);
+}
+var EnvironmentNgModuleRefAdapter = class extends NgModuleRef$1 {
+  injector;
+  componentFactoryResolver = new ComponentFactoryResolver2(this);
+  instance = null;
+  constructor(config2) {
+    super();
+    const injector = new R3Injector([
+      ...config2.providers,
+      { provide: NgModuleRef$1, useValue: this },
+      { provide: ComponentFactoryResolver$1, useValue: this.componentFactoryResolver }
+    ], config2.parent || getNullInjector(), config2.debugName, /* @__PURE__ */ new Set(["environment"]));
+    this.injector = injector;
+    if (config2.runEnvironmentInitializers) {
+      injector.resolveInjectorInitializers();
+    }
+  }
+  destroy() {
+    this.injector.destroy();
+  }
+  onDestroy(callback) {
+    this.injector.onDestroy(callback);
+  }
+};
+function createEnvironmentInjector(providers, parent, debugName = null) {
+  const adapter = new EnvironmentNgModuleRefAdapter({
+    providers,
+    parent,
+    debugName,
+    runEnvironmentInitializers: true
+  });
+  return adapter.injector;
+}
+var StandaloneService = class _StandaloneService {
+  _injector;
+  cachedInjectors = /* @__PURE__ */ new Map();
+  constructor(_injector) {
+    this._injector = _injector;
+  }
+  getOrCreateStandaloneInjector(componentDef) {
+    if (!componentDef.standalone) {
+      return null;
+    }
+    if (!this.cachedInjectors.has(componentDef)) {
+      const providers = internalImportProvidersFrom(false, componentDef.type);
+      const standaloneInjector = providers.length > 0 ? createEnvironmentInjector([providers], this._injector, `Standalone[${componentDef.type.name}]`) : null;
+      this.cachedInjectors.set(componentDef, standaloneInjector);
+    }
+    return this.cachedInjectors.get(componentDef);
+  }
+  ngOnDestroy() {
+    try {
+      for (const injector of this.cachedInjectors.values()) {
+        if (injector !== null) {
+          injector.destroy();
+        }
+      }
+    } finally {
+      this.cachedInjectors.clear();
+    }
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _StandaloneService,
+      providedIn: "environment",
+      factory: () => new _StandaloneService(ɵɵinject(EnvironmentInjector))
+    })
+  );
+};
+function ɵɵdefineComponent(componentDefinition) {
+  return noSideEffects(() => {
+    (typeof ngDevMode === "undefined" || ngDevMode) && initNgDevMode();
+    const baseDef = getNgDirectiveDef(componentDefinition);
+    const def = __spreadProps(__spreadValues({}, baseDef), {
+      decls: componentDefinition.decls,
+      vars: componentDefinition.vars,
+      template: componentDefinition.template,
+      consts: componentDefinition.consts || null,
+      ngContentSelectors: componentDefinition.ngContentSelectors,
+      onPush: componentDefinition.changeDetection === ChangeDetectionStrategy.OnPush,
+      directiveDefs: null,
+      // assigned in noSideEffects
+      pipeDefs: null,
+      // assigned in noSideEffects
+      dependencies: baseDef.standalone && componentDefinition.dependencies || null,
+      getStandaloneInjector: baseDef.standalone ? (parentInjector) => {
+        return parentInjector.get(StandaloneService).getOrCreateStandaloneInjector(def);
+      } : null,
+      getExternalStyles: null,
+      signals: componentDefinition.signals ?? false,
+      data: componentDefinition.data || {},
+      encapsulation: componentDefinition.encapsulation || ViewEncapsulation.Emulated,
+      styles: componentDefinition.styles || EMPTY_ARRAY,
+      _: null,
+      schemas: componentDefinition.schemas || null,
+      tView: null,
+      id: ""
+    });
+    if (baseDef.standalone) {
+      performanceMarkFeature("NgStandalone");
+    }
+    initFeatures(def);
+    const dependencies = componentDefinition.dependencies;
+    def.directiveDefs = extractDefListOrFactory(
+      dependencies,
+      /* pipeDef */
+      false
+    );
+    def.pipeDefs = extractDefListOrFactory(
+      dependencies,
+      /* pipeDef */
+      true
+    );
+    def.id = getComponentId(def);
+    return def;
+  });
+}
+function extractDirectiveDef(type) {
+  return getComponentDef(type) || getDirectiveDef(type);
+}
+function nonNull(value) {
+  return value !== null;
+}
+function ɵɵdefineNgModule(def) {
+  return noSideEffects(() => {
+    const res = {
+      type: def.type,
+      bootstrap: def.bootstrap || EMPTY_ARRAY,
+      declarations: def.declarations || EMPTY_ARRAY,
+      imports: def.imports || EMPTY_ARRAY,
+      exports: def.exports || EMPTY_ARRAY,
+      transitiveCompileScopes: null,
+      schemas: def.schemas || null,
+      id: def.id || null
+    };
+    return res;
+  });
+}
+function parseAndConvertInputsForDefinition(obj, declaredInputs) {
+  if (obj == null)
+    return EMPTY_OBJ;
+  const newLookup = {};
+  for (const minifiedKey in obj) {
+    if (obj.hasOwnProperty(minifiedKey)) {
+      const value = obj[minifiedKey];
+      let publicName;
+      let declaredName;
+      let inputFlags;
+      let transform;
+      if (Array.isArray(value)) {
+        inputFlags = value[0];
+        publicName = value[1];
+        declaredName = value[2] ?? publicName;
+        transform = value[3] || null;
+      } else {
+        publicName = value;
+        declaredName = value;
+        inputFlags = InputFlags.None;
+        transform = null;
+      }
+      newLookup[publicName] = [minifiedKey, inputFlags, transform];
+      declaredInputs[publicName] = declaredName;
+    }
+  }
+  return newLookup;
+}
+function parseAndConvertOutputsForDefinition(obj) {
+  if (obj == null)
+    return EMPTY_OBJ;
+  const newLookup = {};
+  for (const minifiedKey in obj) {
+    if (obj.hasOwnProperty(minifiedKey)) {
+      newLookup[obj[minifiedKey]] = minifiedKey;
+    }
+  }
+  return newLookup;
+}
+function ɵɵdefineDirective(directiveDefinition) {
+  return noSideEffects(() => {
+    const def = getNgDirectiveDef(directiveDefinition);
+    initFeatures(def);
+    return def;
+  });
+}
+function ɵɵdefinePipe(pipeDef) {
+  return {
+    type: pipeDef.type,
+    name: pipeDef.name,
+    factory: null,
+    pure: pipeDef.pure !== false,
+    standalone: pipeDef.standalone ?? true,
+    onDestroy: pipeDef.type.prototype.ngOnDestroy || null
+  };
+}
+function getNgDirectiveDef(directiveDefinition) {
+  const declaredInputs = {};
+  return {
+    type: directiveDefinition.type,
+    providersResolver: null,
+    factory: null,
+    hostBindings: directiveDefinition.hostBindings || null,
+    hostVars: directiveDefinition.hostVars || 0,
+    hostAttrs: directiveDefinition.hostAttrs || null,
+    contentQueries: directiveDefinition.contentQueries || null,
+    declaredInputs,
+    inputConfig: directiveDefinition.inputs || EMPTY_OBJ,
+    exportAs: directiveDefinition.exportAs || null,
+    standalone: directiveDefinition.standalone ?? true,
+    signals: directiveDefinition.signals === true,
+    selectors: directiveDefinition.selectors || EMPTY_ARRAY,
+    viewQuery: directiveDefinition.viewQuery || null,
+    features: directiveDefinition.features || null,
+    setInput: null,
+    resolveHostDirectives: null,
+    hostDirectives: null,
+    inputs: parseAndConvertInputsForDefinition(directiveDefinition.inputs, declaredInputs),
+    outputs: parseAndConvertOutputsForDefinition(directiveDefinition.outputs),
+    debugInfo: null
+  };
+}
+function initFeatures(definition) {
+  definition.features?.forEach((fn) => fn(definition));
+}
+function extractDefListOrFactory(dependencies, pipeDef) {
+  if (!dependencies) {
+    return null;
+  }
+  const defExtractor = pipeDef ? getPipeDef : extractDirectiveDef;
+  return () => (typeof dependencies === "function" ? dependencies() : dependencies).map((dep) => defExtractor(dep)).filter(nonNull);
+}
+var GENERATED_COMP_IDS = /* @__PURE__ */ new Map();
+function getComponentId(componentDef) {
+  let hash = 0;
+  const componentDefConsts = typeof componentDef.consts === "function" ? "" : componentDef.consts;
+  const hashSelectors = [
+    componentDef.selectors,
+    componentDef.ngContentSelectors,
+    componentDef.hostVars,
+    componentDef.hostAttrs,
+    componentDefConsts,
+    componentDef.vars,
+    componentDef.decls,
+    componentDef.encapsulation,
+    componentDef.standalone,
+    componentDef.signals,
+    componentDef.exportAs,
+    JSON.stringify(componentDef.inputs),
+    JSON.stringify(componentDef.outputs),
+    // We cannot use 'componentDef.type.name' as the name of the symbol will change and will not
+    // match in the server and browser bundles.
+    Object.getOwnPropertyNames(componentDef.type.prototype),
+    !!componentDef.contentQueries,
+    !!componentDef.viewQuery
+  ];
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    for (const item of hashSelectors) {
+      assertNotEqual(typeof item, "function", "Internal error: attempting to use a function in component id computation logic.");
+    }
+  }
+  for (const char of hashSelectors.join("|")) {
+    hash = Math.imul(31, hash) + char.charCodeAt(0) << 0;
+  }
+  hash += 2147483647 + 1;
+  const compId = "c" + hash;
+  if ((typeof ngDevMode === "undefined" || ngDevMode) && true) {
+    if (GENERATED_COMP_IDS.has(compId)) {
+      const previousCompDefType = GENERATED_COMP_IDS.get(compId);
+      if (previousCompDefType !== componentDef.type) {
+        console.warn(formatRuntimeError(-912, `Component ID generation collision detected. Components '${previousCompDefType.name}' and '${componentDef.type.name}' with selector '${stringifyCSSSelectorList(componentDef.selectors)}' generated the same component ID. To fix this, you can change the selector of one of those components or add an extra host attribute to force a different ID.`));
+      }
+    } else {
+      GENERATED_COMP_IDS.set(compId, componentDef.type);
+    }
+  }
+  return compId;
+}
+function getSuperType(type) {
+  return Object.getPrototypeOf(type.prototype).constructor;
+}
+function ɵɵInheritDefinitionFeature(definition) {
+  let superType = getSuperType(definition.type);
+  let shouldInheritFields = true;
+  const inheritanceChain = [definition];
+  while (superType) {
+    let superDef = void 0;
+    if (isComponentDef(definition)) {
+      superDef = superType.ɵcmp || superType.ɵdir;
+    } else {
+      if (superType.ɵcmp) {
+        throw new RuntimeError(903, ngDevMode && `Directives cannot inherit Components. Directive ${stringifyForError(definition.type)} is attempting to extend component ${stringifyForError(superType)}`);
+      }
+      superDef = superType.ɵdir;
+    }
+    if (superDef) {
+      if (shouldInheritFields) {
+        inheritanceChain.push(superDef);
+        const writeableDef = definition;
+        writeableDef.inputs = maybeUnwrapEmpty(definition.inputs);
+        writeableDef.declaredInputs = maybeUnwrapEmpty(definition.declaredInputs);
+        writeableDef.outputs = maybeUnwrapEmpty(definition.outputs);
+        const superHostBindings = superDef.hostBindings;
+        superHostBindings && inheritHostBindings(definition, superHostBindings);
+        const superViewQuery = superDef.viewQuery;
+        const superContentQueries = superDef.contentQueries;
+        superViewQuery && inheritViewQuery(definition, superViewQuery);
+        superContentQueries && inheritContentQueries(definition, superContentQueries);
+        mergeInputsWithTransforms(definition, superDef);
+        fillProperties(definition.outputs, superDef.outputs);
+        if (isComponentDef(superDef) && superDef.data.animation) {
+          const defData = definition.data;
+          defData.animation = (defData.animation || []).concat(superDef.data.animation);
+        }
+      }
+      const features = superDef.features;
+      if (features) {
+        for (let i = 0; i < features.length; i++) {
+          const feature = features[i];
+          if (feature && feature.ngInherit) {
+            feature(definition);
+          }
+          if (feature === ɵɵInheritDefinitionFeature) {
+            shouldInheritFields = false;
+          }
+        }
+      }
+    }
+    superType = Object.getPrototypeOf(superType);
+  }
+  mergeHostAttrsAcrossInheritance(inheritanceChain);
+}
+function mergeInputsWithTransforms(target, source) {
+  for (const key in source.inputs) {
+    if (!source.inputs.hasOwnProperty(key)) {
+      continue;
+    }
+    if (target.inputs.hasOwnProperty(key)) {
+      continue;
+    }
+    const value = source.inputs[key];
+    if (value !== void 0) {
+      target.inputs[key] = value;
+      target.declaredInputs[key] = source.declaredInputs[key];
+    }
+  }
+}
+function mergeHostAttrsAcrossInheritance(inheritanceChain) {
+  let hostVars = 0;
+  let hostAttrs = null;
+  for (let i = inheritanceChain.length - 1; i >= 0; i--) {
+    const def = inheritanceChain[i];
+    def.hostVars = hostVars += def.hostVars;
+    def.hostAttrs = mergeHostAttrs(def.hostAttrs, hostAttrs = mergeHostAttrs(hostAttrs, def.hostAttrs));
+  }
+}
+function maybeUnwrapEmpty(value) {
+  if (value === EMPTY_OBJ) {
+    return {};
+  } else if (value === EMPTY_ARRAY) {
+    return [];
+  } else {
+    return value;
+  }
+}
+function inheritViewQuery(definition, superViewQuery) {
+  const prevViewQuery = definition.viewQuery;
+  if (prevViewQuery) {
+    definition.viewQuery = (rf, ctx) => {
+      superViewQuery(rf, ctx);
+      prevViewQuery(rf, ctx);
+    };
+  } else {
+    definition.viewQuery = superViewQuery;
+  }
+}
+function inheritContentQueries(definition, superContentQueries) {
+  const prevContentQueries = definition.contentQueries;
+  if (prevContentQueries) {
+    definition.contentQueries = (rf, ctx, directiveIndex) => {
+      superContentQueries(rf, ctx, directiveIndex);
+      prevContentQueries(rf, ctx, directiveIndex);
+    };
+  } else {
+    definition.contentQueries = superContentQueries;
+  }
+}
+function inheritHostBindings(definition, superHostBindings) {
+  const prevHostBindings = definition.hostBindings;
+  if (prevHostBindings) {
+    definition.hostBindings = (rf, ctx) => {
+      superHostBindings(rf, ctx);
+      prevHostBindings(rf, ctx);
+    };
+  } else {
+    definition.hostBindings = superHostBindings;
+  }
+}
+var COPY_DIRECTIVE_FIELDS = [
+  // The child class should use the providers of its parent.
+  "providersResolver"
+  // Not listed here are any fields which are handled by the `ɵɵInheritDefinitionFeature`, such
+  // as inputs, outputs, and host binding functions.
+];
+var COPY_COMPONENT_FIELDS = [
+  // The child class should use the template function of its parent, including all template
+  // semantics.
+  "template",
+  "decls",
+  "consts",
+  "vars",
+  "onPush",
+  "ngContentSelectors",
+  // The child class should use the CSS styles of its parent, including all styling semantics.
+  "styles",
+  "encapsulation",
+  // The child class should be checked by the runtime in the same way as its parent.
+  "schemas"
+];
+function ɵɵCopyDefinitionFeature(definition) {
+  let superType = getSuperType(definition.type);
+  let superDef = void 0;
+  if (isComponentDef(definition)) {
+    superDef = superType.ɵcmp;
+  } else {
+    superDef = superType.ɵdir;
+  }
+  const defAny = definition;
+  for (const field of COPY_DIRECTIVE_FIELDS) {
+    defAny[field] = superDef[field];
+  }
+  if (isComponentDef(superDef)) {
+    for (const field of COPY_COMPONENT_FIELDS) {
+      defAny[field] = superDef[field];
+    }
+  }
+}
+function ɵɵHostDirectivesFeature(rawHostDirectives) {
+  const feature = (definition) => {
+    const isEager = Array.isArray(rawHostDirectives);
+    if (definition.hostDirectives === null) {
+      definition.resolveHostDirectives = resolveHostDirectives;
+      definition.hostDirectives = isEager ? rawHostDirectives.map(createHostDirectiveDef) : [rawHostDirectives];
+    } else if (isEager) {
+      definition.hostDirectives.unshift(...rawHostDirectives.map(createHostDirectiveDef));
+    } else {
+      definition.hostDirectives.unshift(rawHostDirectives);
+    }
+  };
+  feature.ngInherit = true;
+  return feature;
+}
+function resolveHostDirectives(matches) {
+  const allDirectiveDefs = [];
+  let hasComponent = false;
+  let hostDirectiveDefs = null;
+  let hostDirectiveRanges = null;
+  for (let i = 0; i < matches.length; i++) {
+    const def = matches[i];
+    if (def.hostDirectives !== null) {
+      const start = allDirectiveDefs.length;
+      hostDirectiveDefs ??= /* @__PURE__ */ new Map();
+      hostDirectiveRanges ??= /* @__PURE__ */ new Map();
+      findHostDirectiveDefs(def, allDirectiveDefs, hostDirectiveDefs);
+      hostDirectiveRanges.set(def, [start, allDirectiveDefs.length - 1]);
+    }
+    if (i === 0 && isComponentDef(def)) {
+      hasComponent = true;
+      allDirectiveDefs.push(def);
+    }
+  }
+  for (let i = hasComponent ? 1 : 0; i < matches.length; i++) {
+    allDirectiveDefs.push(matches[i]);
+  }
+  return [allDirectiveDefs, hostDirectiveDefs, hostDirectiveRanges];
+}
+function findHostDirectiveDefs(currentDef, matchedDefs, hostDirectiveDefs) {
+  if (currentDef.hostDirectives !== null) {
+    for (const configOrFn of currentDef.hostDirectives) {
+      if (typeof configOrFn === "function") {
+        const resolved2 = configOrFn();
+        for (const config2 of resolved2) {
+          trackHostDirectiveDef(createHostDirectiveDef(config2), matchedDefs, hostDirectiveDefs);
+        }
+      } else {
+        trackHostDirectiveDef(configOrFn, matchedDefs, hostDirectiveDefs);
+      }
+    }
+  }
+}
+function trackHostDirectiveDef(def, matchedDefs, hostDirectiveDefs) {
+  const hostDirectiveDef = getDirectiveDef(def.directive);
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    validateHostDirective(def, hostDirectiveDef);
+  }
+  patchDeclaredInputs(hostDirectiveDef.declaredInputs, def.inputs);
+  findHostDirectiveDefs(hostDirectiveDef, matchedDefs, hostDirectiveDefs);
+  hostDirectiveDefs.set(hostDirectiveDef, def);
+  matchedDefs.push(hostDirectiveDef);
+}
+function createHostDirectiveDef(config2) {
+  return typeof config2 === "function" ? { directive: resolveForwardRef(config2), inputs: EMPTY_OBJ, outputs: EMPTY_OBJ } : {
+    directive: resolveForwardRef(config2.directive),
+    inputs: bindingArrayToMap(config2.inputs),
+    outputs: bindingArrayToMap(config2.outputs)
+  };
+}
+function bindingArrayToMap(bindings) {
+  if (bindings === void 0 || bindings.length === 0) {
+    return EMPTY_OBJ;
+  }
+  const result = {};
+  for (let i = 0; i < bindings.length; i += 2) {
+    result[bindings[i]] = bindings[i + 1];
+  }
+  return result;
+}
+function patchDeclaredInputs(declaredInputs, exposedInputs) {
+  for (const publicName in exposedInputs) {
+    if (exposedInputs.hasOwnProperty(publicName)) {
+      const remappedPublicName = exposedInputs[publicName];
+      const privateName = declaredInputs[publicName];
+      if ((typeof ngDevMode === "undefined" || ngDevMode) && declaredInputs.hasOwnProperty(remappedPublicName)) {
+        assertEqual(declaredInputs[remappedPublicName], declaredInputs[publicName], `Conflicting host directive input alias ${publicName}.`);
+      }
+      declaredInputs[remappedPublicName] = privateName;
+    }
+  }
+}
+function validateHostDirective(hostDirectiveConfig, directiveDef) {
+  const type = hostDirectiveConfig.directive;
+  if (directiveDef === null) {
+    if (getComponentDef(type) !== null) {
+      throw new RuntimeError(310, `Host directive ${type.name} cannot be a component.`);
+    }
+    throw new RuntimeError(307, `Could not resolve metadata for host directive ${type.name}. Make sure that the ${type.name} class is annotated with an @Directive decorator.`);
+  }
+  if (!directiveDef.standalone) {
+    throw new RuntimeError(308, `Host directive ${directiveDef.type.name} must be standalone.`);
+  }
+  validateMappings("input", directiveDef, hostDirectiveConfig.inputs);
+  validateMappings("output", directiveDef, hostDirectiveConfig.outputs);
+}
+function validateMappings(bindingType, def, hostDirectiveBindings) {
+  const className = def.type.name;
+  const bindings = bindingType === "input" ? def.inputs : def.outputs;
+  for (const publicName in hostDirectiveBindings) {
+    if (hostDirectiveBindings.hasOwnProperty(publicName)) {
+      if (!bindings.hasOwnProperty(publicName)) {
+        throw new RuntimeError(311, `Directive ${className} does not have an ${bindingType} with a public name of ${publicName}.`);
+      }
+      const remappedPublicName = hostDirectiveBindings[publicName];
+      if (bindings.hasOwnProperty(remappedPublicName) && remappedPublicName !== publicName) {
+        throw new RuntimeError(312, `Cannot alias ${bindingType} ${publicName} of host directive ${className} to ${remappedPublicName}, because it already has a different ${bindingType} with the same public name.`);
+      }
+    }
+  }
+}
+function templateFirstCreatePass(index, tView, lView, templateFn, decls, vars, tagName, attrs, localRefsIndex) {
+  ngDevMode && assertFirstCreatePass(tView);
+  const tViewConsts = tView.consts;
+  const tNode = getOrCreateTNode(tView, index, 4, tagName || null, attrs || null);
+  if (getBindingsEnabled()) {
+    resolveDirectives(tView, lView, tNode, getConstant(tViewConsts, localRefsIndex), findDirectiveDefMatches);
+  }
+  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
+  registerPostOrderHooks(tView, tNode);
+  const embeddedTView = tNode.tView = createTView(
+    2,
+    tNode,
+    templateFn,
+    decls,
+    vars,
+    tView.directiveRegistry,
+    tView.pipeRegistry,
+    null,
+    tView.schemas,
+    tViewConsts,
+    null
+    /* ssrId */
+  );
+  if (tView.queries !== null) {
+    tView.queries.template(tView, tNode);
+    embeddedTView.queries = tView.queries.embeddedTView(tNode);
+  }
+  return tNode;
+}
+function declareTemplate(declarationLView, declarationTView, index, templateFn, decls, vars, tagName, attrs, flags, localRefsIndex, localRefExtractor) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const tNode = declarationTView.firstCreatePass ? templateFirstCreatePass(adjustedIndex, declarationTView, declarationLView, templateFn, decls, vars, tagName, attrs, localRefsIndex) : declarationTView.data[adjustedIndex];
+  if (flags) {
+    tNode.flags |= flags;
+  }
+  setCurrentTNode(tNode, false);
+  const comment = _locateOrCreateContainerAnchor(declarationTView, declarationLView, tNode, index);
+  if (wasLastNodeCreated()) {
+    appendChild(declarationTView, declarationLView, comment, tNode);
+  }
+  attachPatchData(comment, declarationLView);
+  const lContainer = createLContainer(comment, declarationLView, comment, tNode);
+  declarationLView[adjustedIndex] = lContainer;
+  addToEndOfViewTree(declarationLView, lContainer);
+  populateDehydratedViewsInLContainer(lContainer, tNode, declarationLView);
+  if (isDirectiveHost(tNode)) {
+    createDirectivesInstances(declarationTView, declarationLView, tNode);
+  }
+  if (localRefsIndex != null) {
+    saveResolvedLocalsInData(declarationLView, tNode, localRefExtractor);
+  }
+  return tNode;
+}
+function ɵɵtemplate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
+  const lView = getLView();
+  const tView = getTView();
+  const attrs = getConstant(tView.consts, attrsIndex);
+  declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, void 0, localRefsIndex, localRefExtractor);
+  return ɵɵtemplate;
+}
+var _locateOrCreateContainerAnchor = createContainerAnchorImpl;
+function createContainerAnchorImpl(tView, lView, tNode, index) {
+  lastNodeWasCreated(true);
+  return lView[RENDERER].createComment(ngDevMode ? "container" : "");
+}
+function locateOrCreateContainerAnchorImpl(tView, lView, tNode, index) {
+  const hydrationInfo = lView[HYDRATION];
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock() || isDetachedByI18n(tNode) || isDisconnectedNode$1(hydrationInfo, index);
+  lastNodeWasCreated(isNodeCreationMode);
+  const ssrId = hydrationInfo?.data[TEMPLATES]?.[index] ?? null;
+  if (ssrId !== null && tNode.tView !== null) {
+    if (tNode.tView.ssrId === null) {
+      tNode.tView.ssrId = ssrId;
+    } else {
+      ngDevMode && assertEqual(tNode.tView.ssrId, ssrId, "Unexpected value of the `ssrId` for this TView");
+    }
+  }
+  if (isNodeCreationMode) {
+    return createContainerAnchorImpl(tView, lView);
+  }
+  const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode);
+  ngDevMode && validateNodeExists(currentRNode, lView, tNode);
+  setSegmentHead(hydrationInfo, index, currentRNode);
+  const viewContainerSize = calcSerializedContainerSize(hydrationInfo, index);
+  const comment = siblingAfter(viewContainerSize, currentRNode);
+  if (ngDevMode) {
+    validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);
+    markRNodeAsClaimedByHydration(comment);
+  }
+  return comment;
+}
+function enableLocateOrCreateContainerAnchorImpl() {
+  _locateOrCreateContainerAnchor = locateOrCreateContainerAnchorImpl;
+}
+var DeferDependenciesLoadingState;
+(function(DeferDependenciesLoadingState2) {
+  DeferDependenciesLoadingState2[DeferDependenciesLoadingState2["NOT_STARTED"] = 0] = "NOT_STARTED";
+  DeferDependenciesLoadingState2[DeferDependenciesLoadingState2["IN_PROGRESS"] = 1] = "IN_PROGRESS";
+  DeferDependenciesLoadingState2[DeferDependenciesLoadingState2["COMPLETE"] = 2] = "COMPLETE";
+  DeferDependenciesLoadingState2[DeferDependenciesLoadingState2["FAILED"] = 3] = "FAILED";
+})(DeferDependenciesLoadingState || (DeferDependenciesLoadingState = {}));
+var MINIMUM_SLOT = 0;
+var LOADING_AFTER_SLOT = 1;
+var DeferBlockState;
+(function(DeferBlockState2) {
+  DeferBlockState2[DeferBlockState2["Placeholder"] = 0] = "Placeholder";
+  DeferBlockState2[DeferBlockState2["Loading"] = 1] = "Loading";
+  DeferBlockState2[DeferBlockState2["Complete"] = 2] = "Complete";
+  DeferBlockState2[DeferBlockState2["Error"] = 3] = "Error";
+})(DeferBlockState || (DeferBlockState = {}));
+var DeferBlockInternalState;
+(function(DeferBlockInternalState2) {
+  DeferBlockInternalState2[DeferBlockInternalState2["Initial"] = -1] = "Initial";
+})(DeferBlockInternalState || (DeferBlockInternalState = {}));
+var NEXT_DEFER_BLOCK_STATE = 0;
+var DEFER_BLOCK_STATE = 1;
+var STATE_IS_FROZEN_UNTIL = 2;
+var LOADING_AFTER_CLEANUP_FN = 3;
+var TRIGGER_CLEANUP_FNS = 4;
+var PREFETCH_TRIGGER_CLEANUP_FNS = 5;
+var SSR_UNIQUE_ID = 6;
+var SSR_BLOCK_STATE = 7;
+var ON_COMPLETE_FNS = 8;
+var HYDRATE_TRIGGER_CLEANUP_FNS = 9;
+var DeferBlockBehavior;
+(function(DeferBlockBehavior2) {
+  DeferBlockBehavior2[DeferBlockBehavior2["Manual"] = 0] = "Manual";
+  DeferBlockBehavior2[DeferBlockBehavior2["Playthrough"] = 1] = "Playthrough";
+})(DeferBlockBehavior || (DeferBlockBehavior = {}));
+function storeTriggerCleanupFn(type, lDetails, cleanupFn) {
+  const key = getCleanupFnKeyByType(type);
+  if (lDetails[key] === null) {
+    lDetails[key] = [];
+  }
+  lDetails[key].push(cleanupFn);
+}
+function invokeTriggerCleanupFns(type, lDetails) {
+  const key = getCleanupFnKeyByType(type);
+  const cleanupFns = lDetails[key];
+  if (cleanupFns !== null) {
+    for (const cleanupFn of cleanupFns) {
+      cleanupFn();
+    }
+    lDetails[key] = null;
+  }
+}
+function invokeAllTriggerCleanupFns(lDetails) {
+  invokeTriggerCleanupFns(1, lDetails);
+  invokeTriggerCleanupFns(0, lDetails);
+  invokeTriggerCleanupFns(2, lDetails);
+}
+function getCleanupFnKeyByType(type) {
+  let key = TRIGGER_CLEANUP_FNS;
+  if (type === 1) {
+    key = PREFETCH_TRIGGER_CLEANUP_FNS;
+  } else if (type === 2) {
+    key = HYDRATE_TRIGGER_CLEANUP_FNS;
+  }
+  return key;
+}
+var TracingAction;
+(function(TracingAction2) {
+  TracingAction2[TracingAction2["CHANGE_DETECTION"] = 0] = "CHANGE_DETECTION";
+  TracingAction2[TracingAction2["AFTER_NEXT_RENDER"] = 1] = "AFTER_NEXT_RENDER";
+})(TracingAction || (TracingAction = {}));
+var TracingService = new InjectionToken(ngDevMode ? "TracingService" : "");
+var SCHEDULE_IN_ROOT_ZONE_DEFAULT = false;
+var EventEmitter_ = class extends Subject {
+  // tslint:disable-next-line:require-internal-with-underscore
+  __isAsync;
+  destroyRef = void 0;
+  pendingTasks = void 0;
+  constructor(isAsync = false) {
+    super();
+    this.__isAsync = isAsync;
+    if (isInInjectionContext()) {
+      this.destroyRef = inject(DestroyRef, { optional: true }) ?? void 0;
+      this.pendingTasks = inject(PendingTasksInternal, { optional: true }) ?? void 0;
+    }
+  }
+  emit(value) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      super.next(value);
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+  subscribe(observerOrNext, error, complete) {
+    let nextFn = observerOrNext;
+    let errorFn = error || (() => null);
+    let completeFn = complete;
+    if (observerOrNext && typeof observerOrNext === "object") {
+      const observer = observerOrNext;
+      nextFn = observer.next?.bind(observer);
+      errorFn = observer.error?.bind(observer);
+      completeFn = observer.complete?.bind(observer);
+    }
+    if (this.__isAsync) {
+      errorFn = this.wrapInTimeout(errorFn);
+      if (nextFn) {
+        nextFn = this.wrapInTimeout(nextFn);
+      }
+      if (completeFn) {
+        completeFn = this.wrapInTimeout(completeFn);
+      }
+    }
+    const sink = super.subscribe({ next: nextFn, error: errorFn, complete: completeFn });
+    if (observerOrNext instanceof Subscription) {
+      observerOrNext.add(sink);
+    }
+    return sink;
+  }
+  wrapInTimeout(fn) {
+    return (value) => {
+      const taskId = this.pendingTasks?.add();
+      setTimeout(() => {
+        try {
+          fn(value);
+        } finally {
+          if (taskId !== void 0) {
+            this.pendingTasks?.remove(taskId);
+          }
+        }
+      });
+    };
+  }
+};
+var EventEmitter = EventEmitter_;
+function scheduleCallbackWithRafRace(callback) {
+  let timeoutId;
+  let animationFrameId;
+  function cleanup() {
+    callback = noop2;
+    try {
+      if (animationFrameId !== void 0 && typeof cancelAnimationFrame === "function") {
+        cancelAnimationFrame(animationFrameId);
+      }
+      if (timeoutId !== void 0) {
+        clearTimeout(timeoutId);
+      }
+    } catch {
+    }
+  }
+  timeoutId = setTimeout(() => {
+    callback();
+    cleanup();
+  });
+  if (typeof requestAnimationFrame === "function") {
+    animationFrameId = requestAnimationFrame(() => {
+      callback();
+      cleanup();
+    });
+  }
+  return () => cleanup();
+}
+function scheduleCallbackWithMicrotask(callback) {
+  queueMicrotask(() => callback());
+  return () => {
+    callback = noop2;
+  };
+}
+var AsyncStackTaggingZoneSpec = class {
+  createTask;
+  constructor(namePrefix, consoleAsyncStackTaggingImpl = console) {
+    this.name = "asyncStackTagging for " + namePrefix;
+    this.createTask = consoleAsyncStackTaggingImpl?.createTask ?? (() => null);
+  }
+  // ZoneSpec implementation below.
+  name;
+  onScheduleTask(delegate, _current, target, task) {
+    task.consoleTask = this.createTask(`Zone - ${task.source || task.type}`);
+    return delegate.scheduleTask(target, task);
+  }
+  onInvokeTask(delegate, _currentZone, targetZone, task, applyThis, applyArgs) {
+    let ret;
+    if (task.consoleTask) {
+      ret = task.consoleTask.run(() => delegate.invokeTask(targetZone, task, applyThis, applyArgs));
+    } else {
+      ret = delegate.invokeTask(targetZone, task, applyThis, applyArgs);
+    }
+    return ret;
+  }
+};
+var isAngularZoneProperty = "isAngularZone";
+var angularZoneInstanceIdProperty = isAngularZoneProperty + "_ID";
+var ngZoneInstanceId = 0;
+var NgZone = class _NgZone {
+  hasPendingMacrotasks = false;
+  hasPendingMicrotasks = false;
+  /**
+   * Whether there are no outstanding microtasks or macrotasks.
+   */
+  isStable = true;
+  /**
+   * Notifies when code enters Angular Zone. This gets fired first on VM Turn.
+   */
+  onUnstable = new EventEmitter(false);
+  /**
+   * Notifies when there is no more microtasks enqueued in the current VM Turn.
+   * This is a hint for Angular to do change detection, which may enqueue more microtasks.
+   * For this reason this event can fire multiple times per VM Turn.
+   */
+  onMicrotaskEmpty = new EventEmitter(false);
+  /**
+   * Notifies when the last `onMicrotaskEmpty` has run and there are no more microtasks, which
+   * implies we are about to relinquish VM turn.
+   * This event gets called just once.
+   */
+  onStable = new EventEmitter(false);
+  /**
+   * Notifies that an error has been delivered.
+   */
+  onError = new EventEmitter(false);
+  constructor(options) {
+    const { enableLongStackTrace = false, shouldCoalesceEventChangeDetection = false, shouldCoalesceRunChangeDetection = false, scheduleInRootZone = SCHEDULE_IN_ROOT_ZONE_DEFAULT } = options;
+    if (typeof Zone == "undefined") {
+      throw new RuntimeError(908, ngDevMode && `In this configuration Angular requires Zone.js`);
+    }
+    Zone.assertZonePatched();
+    const self = this;
+    self._nesting = 0;
+    self._outer = self._inner = Zone.current;
+    if (ngDevMode) {
+      self._inner = self._inner.fork(new AsyncStackTaggingZoneSpec("Angular"));
+    }
+    if (Zone["TaskTrackingZoneSpec"]) {
+      self._inner = self._inner.fork(new Zone["TaskTrackingZoneSpec"]());
+    }
+    if (enableLongStackTrace && Zone["longStackTraceZoneSpec"]) {
+      self._inner = self._inner.fork(Zone["longStackTraceZoneSpec"]);
+    }
+    self.shouldCoalesceEventChangeDetection = !shouldCoalesceRunChangeDetection && shouldCoalesceEventChangeDetection;
+    self.shouldCoalesceRunChangeDetection = shouldCoalesceRunChangeDetection;
+    self.callbackScheduled = false;
+    self.scheduleInRootZone = scheduleInRootZone;
+    forkInnerZoneWithAngularBehavior(self);
+  }
+  /**
+    This method checks whether the method call happens within an Angular Zone instance.
+  */
+  static isInAngularZone() {
+    return typeof Zone !== "undefined" && Zone.current.get(isAngularZoneProperty) === true;
+  }
+  /**
+    Assures that the method is called within the Angular Zone, otherwise throws an error.
+  */
+  static assertInAngularZone() {
+    if (!_NgZone.isInAngularZone()) {
+      throw new RuntimeError(909, ngDevMode && "Expected to be in Angular Zone, but it is not!");
+    }
+  }
+  /**
+    Assures that the method is called outside of the Angular Zone, otherwise throws an error.
+  */
+  static assertNotInAngularZone() {
+    if (_NgZone.isInAngularZone()) {
+      throw new RuntimeError(909, ngDevMode && "Expected to not be in Angular Zone, but it is!");
+    }
+  }
+  /**
+   * Executes the `fn` function synchronously within the Angular zone and returns value returned by
+   * the function.
+   *
+   * Running functions via `run` allows you to reenter Angular zone from a task that was executed
+   * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
+   *
+   * Any future tasks or microtasks scheduled from within this function will continue executing from
+   * within the Angular zone.
+   *
+   * If a synchronous error happens it will be rethrown and not reported via `onError`.
+   */
+  run(fn, applyThis, applyArgs) {
+    return this._inner.run(fn, applyThis, applyArgs);
+  }
+  /**
+   * Executes the `fn` function synchronously within the Angular zone as a task and returns value
+   * returned by the function.
+   *
+   * Running functions via `runTask` allows you to reenter Angular zone from a task that was executed
+   * outside of the Angular zone (typically started via {@link #runOutsideAngular}).
+   *
+   * Any future tasks or microtasks scheduled from within this function will continue executing from
+   * within the Angular zone.
+   *
+   * If a synchronous error happens it will be rethrown and not reported via `onError`.
+   */
+  runTask(fn, applyThis, applyArgs, name) {
+    const zone = this._inner;
+    const task = zone.scheduleEventTask("NgZoneEvent: " + name, fn, EMPTY_PAYLOAD, noop2, noop2);
+    try {
+      return zone.runTask(task, applyThis, applyArgs);
+    } finally {
+      zone.cancelTask(task);
+    }
+  }
+  /**
+   * Same as `run`, except that synchronous errors are caught and forwarded via `onError` and not
+   * rethrown.
+   */
+  runGuarded(fn, applyThis, applyArgs) {
+    return this._inner.runGuarded(fn, applyThis, applyArgs);
+  }
+  /**
+   * Executes the `fn` function synchronously in Angular's parent zone and returns value returned by
+   * the function.
+   *
+   * Running functions via {@link #runOutsideAngular} allows you to escape Angular's zone and do
+   * work that
+   * doesn't trigger Angular change-detection or is subject to Angular's error handling.
+   *
+   * Any future tasks or microtasks scheduled from within this function will continue executing from
+   * outside of the Angular zone.
+   *
+   * Use {@link #run} to reenter the Angular zone and do work that updates the application model.
+   */
+  runOutsideAngular(fn) {
+    return this._outer.run(fn);
+  }
+};
+var EMPTY_PAYLOAD = {};
+function checkStable(zone) {
+  if (zone._nesting == 0 && !zone.hasPendingMicrotasks && !zone.isStable) {
+    try {
+      zone._nesting++;
+      zone.onMicrotaskEmpty.emit(null);
+    } finally {
+      zone._nesting--;
+      if (!zone.hasPendingMicrotasks) {
+        try {
+          zone.runOutsideAngular(() => zone.onStable.emit(null));
+        } finally {
+          zone.isStable = true;
+        }
+      }
+    }
+  }
+}
+function delayChangeDetectionForEvents(zone) {
+  if (zone.isCheckStableRunning || zone.callbackScheduled) {
+    return;
+  }
+  zone.callbackScheduled = true;
+  function scheduleCheckStable() {
+    scheduleCallbackWithRafRace(() => {
+      zone.callbackScheduled = false;
+      updateMicroTaskStatus(zone);
+      zone.isCheckStableRunning = true;
+      checkStable(zone);
+      zone.isCheckStableRunning = false;
+    });
+  }
+  if (zone.scheduleInRootZone) {
+    Zone.root.run(() => {
+      scheduleCheckStable();
+    });
+  } else {
+    zone._outer.run(() => {
+      scheduleCheckStable();
+    });
+  }
+  updateMicroTaskStatus(zone);
+}
+function forkInnerZoneWithAngularBehavior(zone) {
+  const delayChangeDetectionForEventsDelegate = () => {
+    delayChangeDetectionForEvents(zone);
+  };
+  const instanceId = ngZoneInstanceId++;
+  zone._inner = zone._inner.fork({
+    name: "angular",
+    properties: {
+      [isAngularZoneProperty]: true,
+      [angularZoneInstanceIdProperty]: instanceId,
+      [angularZoneInstanceIdProperty + instanceId]: true
+    },
+    onInvokeTask: (delegate, current, target, task, applyThis, applyArgs) => {
+      if (shouldBeIgnoredByZone(applyArgs)) {
+        return delegate.invokeTask(target, task, applyThis, applyArgs);
+      }
+      try {
+        onEnter(zone);
+        return delegate.invokeTask(target, task, applyThis, applyArgs);
+      } finally {
+        if (zone.shouldCoalesceEventChangeDetection && task.type === "eventTask" || zone.shouldCoalesceRunChangeDetection) {
+          delayChangeDetectionForEventsDelegate();
+        }
+        onLeave(zone);
+      }
+    },
+    onInvoke: (delegate, current, target, callback, applyThis, applyArgs, source) => {
+      try {
+        onEnter(zone);
+        return delegate.invoke(target, callback, applyThis, applyArgs, source);
+      } finally {
+        if (zone.shouldCoalesceRunChangeDetection && // Do not delay change detection when the task is the scheduler's tick.
+        // We need to synchronously trigger the stability logic so that the
+        // zone-based scheduler can prevent a duplicate ApplicationRef.tick
+        // by first checking if the scheduler tick is running. This does seem a bit roundabout,
+        // but we _do_ still want to trigger all the correct events when we exit the zone.run
+        // (`onMicrotaskEmpty` and `onStable` _should_ emit; developers can have code which
+        // relies on these events happening after change detection runs).
+        // Note: `zone.callbackScheduled` is already in delayChangeDetectionForEventsDelegate
+        // but is added here as well to prevent reads of applyArgs when not necessary
+        !zone.callbackScheduled && !isSchedulerTick(applyArgs)) {
+          delayChangeDetectionForEventsDelegate();
+        }
+        onLeave(zone);
+      }
+    },
+    onHasTask: (delegate, current, target, hasTaskState) => {
+      delegate.hasTask(target, hasTaskState);
+      if (current === target) {
+        if (hasTaskState.change == "microTask") {
+          zone._hasPendingMicrotasks = hasTaskState.microTask;
+          updateMicroTaskStatus(zone);
+          checkStable(zone);
+        } else if (hasTaskState.change == "macroTask") {
+          zone.hasPendingMacrotasks = hasTaskState.macroTask;
+        }
+      }
+    },
+    onHandleError: (delegate, current, target, error) => {
+      delegate.handleError(target, error);
+      zone.runOutsideAngular(() => zone.onError.emit(error));
+      return false;
+    }
+  });
+}
+function updateMicroTaskStatus(zone) {
+  if (zone._hasPendingMicrotasks || (zone.shouldCoalesceEventChangeDetection || zone.shouldCoalesceRunChangeDetection) && zone.callbackScheduled === true) {
+    zone.hasPendingMicrotasks = true;
+  } else {
+    zone.hasPendingMicrotasks = false;
+  }
+}
+function onEnter(zone) {
+  zone._nesting++;
+  if (zone.isStable) {
+    zone.isStable = false;
+    zone.onUnstable.emit(null);
+  }
+}
+function onLeave(zone) {
+  zone._nesting--;
+  checkStable(zone);
+}
+var NoopNgZone = class {
+  hasPendingMicrotasks = false;
+  hasPendingMacrotasks = false;
+  isStable = true;
+  onUnstable = new EventEmitter();
+  onMicrotaskEmpty = new EventEmitter();
+  onStable = new EventEmitter();
+  onError = new EventEmitter();
+  run(fn, applyThis, applyArgs) {
+    return fn.apply(applyThis, applyArgs);
+  }
+  runGuarded(fn, applyThis, applyArgs) {
+    return fn.apply(applyThis, applyArgs);
+  }
+  runOutsideAngular(fn) {
+    return fn();
+  }
+  runTask(fn, applyThis, applyArgs, name) {
+    return fn.apply(applyThis, applyArgs);
+  }
+};
+function shouldBeIgnoredByZone(applyArgs) {
+  return hasApplyArgsData(applyArgs, "__ignore_ng_zone__");
+}
+function isSchedulerTick(applyArgs) {
+  return hasApplyArgsData(applyArgs, "__scheduler_tick__");
+}
+function hasApplyArgsData(applyArgs, key) {
+  if (!Array.isArray(applyArgs)) {
+    return false;
+  }
+  if (applyArgs.length !== 1) {
+    return false;
+  }
+  return applyArgs[0]?.data?.[key] === true;
+}
+function getNgZone(ngZoneToUse = "zone.js", options) {
+  if (ngZoneToUse === "noop") {
+    return new NoopNgZone();
+  }
+  if (ngZoneToUse === "zone.js") {
+    return new NgZone(options);
+  }
+  return ngZoneToUse;
+}
+var AfterRenderManager = class _AfterRenderManager {
+  impl = null;
+  execute() {
+    this.impl?.execute();
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _AfterRenderManager,
+      providedIn: "root",
+      factory: () => new _AfterRenderManager()
+    })
+  );
+};
+var AFTER_RENDER_PHASES = /* @__PURE__ */ (() => [
+  0,
+  1,
+  2,
+  3
+])();
+var AfterRenderImpl = class _AfterRenderImpl {
+  ngZone = inject(NgZone);
+  scheduler = inject(ChangeDetectionScheduler);
+  errorHandler = inject(ErrorHandler, { optional: true });
+  /** Current set of active sequences. */
+  sequences = /* @__PURE__ */ new Set();
+  /** Tracks registrations made during the current set of executions. */
+  deferredRegistrations = /* @__PURE__ */ new Set();
+  /** Whether the `AfterRenderManager` is currently executing hooks. */
+  executing = false;
+  constructor() {
+    inject(TracingService, { optional: true });
+  }
+  /**
+   * Run the sequence of phases of hooks, once through. As a result of executing some hooks, more
+   * might be scheduled.
+   */
+  execute() {
+    const hasSequencesToExecute = this.sequences.size > 0;
+    if (hasSequencesToExecute) {
+      profiler(
+        16
+        /* ProfilerEvent.AfterRenderHooksStart */
+      );
+    }
+    this.executing = true;
+    for (const phase of AFTER_RENDER_PHASES) {
+      for (const sequence of this.sequences) {
+        if (sequence.erroredOrDestroyed || !sequence.hooks[phase]) {
+          continue;
+        }
+        try {
+          sequence.pipelinedValue = this.ngZone.runOutsideAngular(() => this.maybeTrace(() => {
+            const hookFn = sequence.hooks[phase];
+            const value = hookFn(sequence.pipelinedValue);
+            return value;
+          }, sequence.snapshot));
+        } catch (err) {
+          sequence.erroredOrDestroyed = true;
+          this.errorHandler?.handleError(err);
+        }
+      }
+    }
+    this.executing = false;
+    for (const sequence of this.sequences) {
+      sequence.afterRun();
+      if (sequence.once) {
+        this.sequences.delete(sequence);
+        sequence.destroy();
+      }
+    }
+    for (const sequence of this.deferredRegistrations) {
+      this.sequences.add(sequence);
+    }
+    if (this.deferredRegistrations.size > 0) {
+      this.scheduler.notify(
+        7
+        /* NotificationSource.RenderHook */
+      );
+    }
+    this.deferredRegistrations.clear();
+    if (hasSequencesToExecute) {
+      profiler(
+        17
+        /* ProfilerEvent.AfterRenderHooksEnd */
+      );
+    }
+  }
+  register(sequence) {
+    const { view } = sequence;
+    if (view !== void 0) {
+      (view[AFTER_RENDER_SEQUENCES_TO_ADD] ??= []).push(sequence);
+      markAncestorsForTraversal(view);
+      view[FLAGS] |= 8192;
+    } else if (!this.executing) {
+      this.addSequence(sequence);
+    } else {
+      this.deferredRegistrations.add(sequence);
+    }
+  }
+  addSequence(sequence) {
+    this.sequences.add(sequence);
+    this.scheduler.notify(
+      7
+      /* NotificationSource.RenderHook */
+    );
+  }
+  unregister(sequence) {
+    if (this.executing && this.sequences.has(sequence)) {
+      sequence.erroredOrDestroyed = true;
+      sequence.pipelinedValue = void 0;
+      sequence.once = true;
+    } else {
+      this.sequences.delete(sequence);
+      this.deferredRegistrations.delete(sequence);
+    }
+  }
+  maybeTrace(fn, snapshot) {
+    return snapshot ? snapshot.run(TracingAction.AFTER_NEXT_RENDER, fn) : fn();
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _AfterRenderImpl,
+      providedIn: "root",
+      factory: () => new _AfterRenderImpl()
+    })
+  );
+};
+var AfterRenderSequence = class {
+  impl;
+  hooks;
+  view;
+  once;
+  snapshot;
+  /**
+   * Whether this sequence errored or was destroyed during this execution, and hooks should no
+   * longer run for it.
+   */
+  erroredOrDestroyed = false;
+  /**
+   * The value returned by the last hook execution (if any), ready to be pipelined into the next
+   * one.
+   */
+  pipelinedValue = void 0;
+  unregisterOnDestroy;
+  constructor(impl, hooks, view, once, destroyRef, snapshot = null) {
+    this.impl = impl;
+    this.hooks = hooks;
+    this.view = view;
+    this.once = once;
+    this.snapshot = snapshot;
+    this.unregisterOnDestroy = destroyRef?.onDestroy(() => this.destroy());
+  }
+  afterRun() {
+    this.erroredOrDestroyed = false;
+    this.pipelinedValue = void 0;
+    this.snapshot?.dispose();
+    this.snapshot = null;
+  }
+  destroy() {
+    this.impl.unregister(this);
+    this.unregisterOnDestroy?.();
+    const scheduled2 = this.view?.[AFTER_RENDER_SEQUENCES_TO_ADD];
+    if (scheduled2) {
+      this.view[AFTER_RENDER_SEQUENCES_TO_ADD] = scheduled2.filter((s) => s !== this);
+    }
+  }
+};
+function afterEveryRender(callbackOrSpec, options) {
+  ngDevMode && assertNotInReactiveContext(afterEveryRender, "Call `afterEveryRender` outside of a reactive context. For example, schedule the render callback inside the component constructor`.");
+  if (ngDevMode && !options?.injector) {
+    assertInInjectionContext(afterEveryRender);
+  }
+  const injector = options?.injector ?? inject(Injector);
+  if (false) {
+    return NOOP_AFTER_RENDER_REF;
+  }
+  performanceMarkFeature("NgAfterRender");
+  return afterEveryRenderImpl(
+    callbackOrSpec,
+    injector,
+    options,
+    /* once */
+    false
+  );
+}
+function afterNextRender(callbackOrSpec, options) {
+  if (ngDevMode && !options?.injector) {
+    assertInInjectionContext(afterNextRender);
+  }
+  const injector = options?.injector ?? inject(Injector);
+  if (false) {
+    return NOOP_AFTER_RENDER_REF;
+  }
+  performanceMarkFeature("NgAfterNextRender");
+  return afterEveryRenderImpl(
+    callbackOrSpec,
+    injector,
+    options,
+    /* once */
+    true
+  );
+}
+function getHooks(callbackOrSpec) {
+  if (callbackOrSpec instanceof Function) {
+    return [
+      void 0,
+      void 0,
+      /* MixedReadWrite */
+      callbackOrSpec,
+      void 0
+    ];
+  } else {
+    return [
+      callbackOrSpec.earlyRead,
+      callbackOrSpec.write,
+      callbackOrSpec.mixedReadWrite,
+      callbackOrSpec.read
+    ];
+  }
+}
+function afterEveryRenderImpl(callbackOrSpec, injector, options, once) {
+  const manager = injector.get(AfterRenderManager);
+  manager.impl ??= injector.get(AfterRenderImpl);
+  const tracing = injector.get(TracingService, null, { optional: true });
+  const destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
+  const viewContext = injector.get(ViewContext, null, { optional: true });
+  const sequence = new AfterRenderSequence(manager.impl, getHooks(callbackOrSpec), viewContext?.view, once, destroyRef, tracing?.snapshot(null));
+  manager.impl.register(sequence);
+  return sequence;
+}
+function getDeferBlockDataIndex(deferBlockIndex) {
+  return deferBlockIndex + 1;
+}
+function getLDeferBlockDetails(lView, tNode) {
+  const tView = lView[TVIEW];
+  const slotIndex = getDeferBlockDataIndex(tNode.index);
+  ngDevMode && assertIndexInDeclRange(tView, slotIndex);
+  return lView[slotIndex];
+}
+function setLDeferBlockDetails(lView, deferBlockIndex, lDetails) {
+  const tView = lView[TVIEW];
+  const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
+  ngDevMode && assertIndexInDeclRange(tView, slotIndex);
+  lView[slotIndex] = lDetails;
+}
+function getTDeferBlockDetails(tView, tNode) {
+  const slotIndex = getDeferBlockDataIndex(tNode.index);
+  ngDevMode && assertIndexInDeclRange(tView, slotIndex);
+  return tView.data[slotIndex];
+}
+function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
+  const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
+  ngDevMode && assertIndexInDeclRange(tView, slotIndex);
+  tView.data[slotIndex] = deferBlockConfig;
+}
+function getTemplateIndexForState(newState, hostLView, tNode) {
+  const tView = hostLView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  switch (newState) {
+    case DeferBlockState.Complete:
+      return tDetails.primaryTmplIndex;
+    case DeferBlockState.Loading:
+      return tDetails.loadingTmplIndex;
+    case DeferBlockState.Error:
+      return tDetails.errorTmplIndex;
+    case DeferBlockState.Placeholder:
+      return tDetails.placeholderTmplIndex;
+    default:
+      ngDevMode && throwError2(`Unexpected defer block state: ${newState}`);
+      return null;
+  }
+}
+function getMinimumDurationForState(tDetails, currentState) {
+  if (currentState === DeferBlockState.Placeholder) {
+    return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;
+  } else if (currentState === DeferBlockState.Loading) {
+    return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;
+  }
+  return null;
+}
+function getLoadingBlockAfter(tDetails) {
+  return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;
+}
+function addDepsToRegistry(currentDeps, newDeps) {
+  if (!currentDeps || currentDeps.length === 0) {
+    return newDeps;
+  }
+  const currentDepSet = new Set(currentDeps);
+  for (const dep of newDeps) {
+    currentDepSet.add(dep);
+  }
+  return currentDeps.length === currentDepSet.size ? currentDeps : Array.from(currentDepSet);
+}
+function getPrimaryBlockTNode(tView, tDetails) {
+  const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;
+  return getTNode(tView, adjustedIndex);
+}
+function assertDeferredDependenciesLoaded(tDetails) {
+  assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, "Expecting all deferred dependencies to be loaded.");
+}
+function isTDeferBlockDetails(value) {
+  return value !== null && typeof value === "object" && typeof value.primaryTmplIndex === "number";
+}
+function isDeferBlock(tView, tNode) {
+  let tDetails = null;
+  const slotIndex = getDeferBlockDataIndex(tNode.index);
+  if (HEADER_OFFSET < slotIndex && slotIndex < tView.bindingStartIndex) {
+    tDetails = getTDeferBlockDetails(tView, tNode);
+  }
+  return !!tDetails && isTDeferBlockDetails(tDetails);
+}
+function trackTriggerForDebugging(tView, tNode, textRepresentation) {
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  tDetails.debug ??= {};
+  tDetails.debug.triggers ??= /* @__PURE__ */ new Set();
+  tDetails.debug.triggers.add(textRepresentation);
+}
+function onViewportWrapper(trigger, callback, injector) {
+  const ngZone = injector.get(NgZone);
+  return onViewport(trigger, () => ngZone.run(callback), () => ngZone.runOutsideAngular(() => createIntersectionObserver()));
+}
+function getTriggerLView(deferredHostLView, deferredTNode, walkUpTimes) {
+  if (walkUpTimes == null) {
+    return deferredHostLView;
+  }
+  if (walkUpTimes >= 0) {
+    return walkUpViews(walkUpTimes, deferredHostLView);
+  }
+  const deferredContainer = deferredHostLView[deferredTNode.index];
+  ngDevMode && assertLContainer(deferredContainer);
+  const triggerLView = deferredContainer[CONTAINER_HEADER_OFFSET] ?? null;
+  if (ngDevMode && triggerLView !== null) {
+    const lDetails = getLDeferBlockDetails(deferredHostLView, deferredTNode);
+    const renderedState = lDetails[DEFER_BLOCK_STATE];
+    assertEqual(renderedState, DeferBlockState.Placeholder, "Expected a placeholder to be rendered in this defer block.");
+    assertLView(triggerLView);
+  }
+  return triggerLView;
+}
+function getTriggerElement(triggerLView, triggerIndex) {
+  const element = getNativeByIndex(HEADER_OFFSET + triggerIndex, triggerLView);
+  ngDevMode && assertElement(element);
+  return element;
+}
+function registerDomTrigger(initialLView, tNode, triggerIndex, walkUpTimes, registerFn, callback, type) {
+  const injector = initialLView[INJECTOR];
+  const zone = injector.get(NgZone);
+  let poll;
+  function pollDomTrigger() {
+    if (isDestroyed(initialLView)) {
+      poll.destroy();
+      return;
+    }
+    const lDetails = getLDeferBlockDetails(initialLView, tNode);
+    const renderedState = lDetails[DEFER_BLOCK_STATE];
+    if (renderedState !== DeferBlockInternalState.Initial && renderedState !== DeferBlockState.Placeholder) {
+      poll.destroy();
+      return;
+    }
+    const triggerLView = getTriggerLView(initialLView, tNode, walkUpTimes);
+    if (!triggerLView) {
+      return;
+    }
+    poll.destroy();
+    if (isDestroyed(triggerLView)) {
+      return;
+    }
+    const element = getTriggerElement(triggerLView, triggerIndex);
+    const cleanup = registerFn(element, () => {
+      zone.run(() => {
+        if (initialLView !== triggerLView) {
+          removeLViewOnDestroy(triggerLView, cleanup);
+        }
+        callback();
+      });
+    }, injector);
+    if (initialLView !== triggerLView) {
+      storeLViewOnDestroy(triggerLView, cleanup);
+    }
+    storeTriggerCleanupFn(type, lDetails, cleanup);
+  }
+  poll = afterEveryRender({ read: pollDomTrigger }, { injector });
+}
+function onIdle(callback, injector) {
+  const scheduler = injector.get(IdleScheduler);
+  const cleanupFn = () => scheduler.remove(callback);
+  scheduler.add(callback);
+  return cleanupFn;
+}
+var _requestIdleCallback = () => typeof requestIdleCallback !== "undefined" ? requestIdleCallback : setTimeout;
+var _cancelIdleCallback = () => typeof requestIdleCallback !== "undefined" ? cancelIdleCallback : clearTimeout;
+var IdleScheduler = class _IdleScheduler {
+  // Indicates whether current callbacks are being invoked.
+  executingCallbacks = false;
+  // Currently scheduled idle callback id.
+  idleId = null;
+  // Set of callbacks to be invoked next.
+  current = /* @__PURE__ */ new Set();
+  // Set of callbacks collected while invoking current set of callbacks.
+  // Those callbacks are scheduled for the next idle period.
+  deferred = /* @__PURE__ */ new Set();
+  ngZone = inject(NgZone);
+  requestIdleCallbackFn = _requestIdleCallback().bind(globalThis);
+  cancelIdleCallbackFn = _cancelIdleCallback().bind(globalThis);
+  add(callback) {
+    const target = this.executingCallbacks ? this.deferred : this.current;
+    target.add(callback);
+    if (this.idleId === null) {
+      this.scheduleIdleCallback();
+    }
+  }
+  remove(callback) {
+    const { current, deferred } = this;
+    current.delete(callback);
+    deferred.delete(callback);
+    if (current.size === 0 && deferred.size === 0) {
+      this.cancelIdleCallback();
+    }
+  }
+  scheduleIdleCallback() {
+    const callback = () => {
+      this.cancelIdleCallback();
+      this.executingCallbacks = true;
+      for (const callback2 of this.current) {
+        callback2();
+      }
+      this.current.clear();
+      this.executingCallbacks = false;
+      if (this.deferred.size > 0) {
+        for (const callback2 of this.deferred) {
+          this.current.add(callback2);
+        }
+        this.deferred.clear();
+        this.scheduleIdleCallback();
+      }
+    };
+    this.idleId = this.requestIdleCallbackFn(() => this.ngZone.run(callback));
+  }
+  cancelIdleCallback() {
+    if (this.idleId !== null) {
+      this.cancelIdleCallbackFn(this.idleId);
+      this.idleId = null;
+    }
+  }
+  ngOnDestroy() {
+    this.cancelIdleCallback();
+    this.current.clear();
+    this.deferred.clear();
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _IdleScheduler,
+      providedIn: "root",
+      factory: () => new _IdleScheduler()
+    })
+  );
+};
+function onTimer(delay2) {
+  return (callback, injector) => scheduleTimerTrigger(delay2, callback, injector);
+}
+function scheduleTimerTrigger(delay2, callback, injector) {
+  const scheduler = injector.get(TimerScheduler);
+  const ngZone = injector.get(NgZone);
+  const cleanupFn = () => scheduler.remove(callback);
+  scheduler.add(delay2, callback, ngZone);
+  return cleanupFn;
+}
+var TimerScheduler = class _TimerScheduler {
+  // Indicates whether current callbacks are being invoked.
+  executingCallbacks = false;
+  // Currently scheduled `setTimeout` id.
+  timeoutId = null;
+  // When currently scheduled timer would fire.
+  invokeTimerAt = null;
+  // List of callbacks to be invoked.
+  // For each callback we also store a timestamp on when the callback
+  // should be invoked. We store timestamps and callback functions
+  // in a flat array to avoid creating new objects for each entry.
+  // [timestamp1, callback1, timestamp2, callback2, ...]
+  current = [];
+  // List of callbacks collected while invoking current set of callbacks.
+  // Those callbacks are added to the "current" queue at the end of
+  // the current callback invocation. The shape of this list is the same
+  // as the shape of the `current` list.
+  deferred = [];
+  add(delay2, callback, ngZone) {
+    const target = this.executingCallbacks ? this.deferred : this.current;
+    this.addToQueue(target, Date.now() + delay2, callback);
+    this.scheduleTimer(ngZone);
+  }
+  remove(callback) {
+    const { current, deferred } = this;
+    const callbackIndex = this.removeFromQueue(current, callback);
+    if (callbackIndex === -1) {
+      this.removeFromQueue(deferred, callback);
+    }
+    if (current.length === 0 && deferred.length === 0) {
+      this.clearTimeout();
+    }
+  }
+  addToQueue(target, invokeAt, callback) {
+    let insertAtIndex = target.length;
+    for (let i = 0; i < target.length; i += 2) {
+      const invokeQueuedCallbackAt = target[i];
+      if (invokeQueuedCallbackAt > invokeAt) {
+        insertAtIndex = i;
+        break;
+      }
+    }
+    arrayInsert2(target, insertAtIndex, invokeAt, callback);
+  }
+  removeFromQueue(target, callback) {
+    let index = -1;
+    for (let i = 0; i < target.length; i += 2) {
+      const queuedCallback = target[i + 1];
+      if (queuedCallback === callback) {
+        index = i;
+        break;
+      }
+    }
+    if (index > -1) {
+      arraySplice(target, index, 2);
+    }
+    return index;
+  }
+  scheduleTimer(ngZone) {
+    const callback = () => {
+      this.clearTimeout();
+      this.executingCallbacks = true;
+      const current = [...this.current];
+      const now = Date.now();
+      for (let i = 0; i < current.length; i += 2) {
+        const invokeAt = current[i];
+        const callback2 = current[i + 1];
+        if (invokeAt <= now) {
+          callback2();
+        } else {
+          break;
+        }
+      }
+      let lastCallbackIndex = -1;
+      for (let i = 0; i < this.current.length; i += 2) {
+        const invokeAt = this.current[i];
+        if (invokeAt <= now) {
+          lastCallbackIndex = i + 1;
+        } else {
+          break;
+        }
+      }
+      if (lastCallbackIndex >= 0) {
+        arraySplice(this.current, 0, lastCallbackIndex + 1);
+      }
+      this.executingCallbacks = false;
+      if (this.deferred.length > 0) {
+        for (let i = 0; i < this.deferred.length; i += 2) {
+          const invokeAt = this.deferred[i];
+          const callback2 = this.deferred[i + 1];
+          this.addToQueue(this.current, invokeAt, callback2);
+        }
+        this.deferred.length = 0;
+      }
+      this.scheduleTimer(ngZone);
+    };
+    const FRAME_DURATION_MS = 16;
+    if (this.current.length > 0) {
+      const now = Date.now();
+      const invokeAt = this.current[0];
+      if (this.timeoutId === null || // Reschedule a timer in case a queue contains an item with
+      // an earlier timestamp and the delta is more than an average
+      // frame duration.
+      this.invokeTimerAt && this.invokeTimerAt - invokeAt > FRAME_DURATION_MS) {
+        this.clearTimeout();
+        const timeout2 = Math.max(invokeAt - now, FRAME_DURATION_MS);
+        this.invokeTimerAt = invokeAt;
+        this.timeoutId = ngZone.runOutsideAngular(() => {
+          return setTimeout(() => ngZone.run(callback), timeout2);
+        });
+      }
+    }
+  }
+  clearTimeout() {
+    if (this.timeoutId !== null) {
+      clearTimeout(this.timeoutId);
+      this.timeoutId = null;
+    }
+  }
+  ngOnDestroy() {
+    this.clearTimeout();
+    this.current.length = 0;
+    this.deferred.length = 0;
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _TimerScheduler,
+      providedIn: "root",
+      factory: () => new _TimerScheduler()
+    })
+  );
+};
+var CachedInjectorService = class _CachedInjectorService {
+  cachedInjectors = /* @__PURE__ */ new Map();
+  getOrCreateInjector(key, parentInjector, providers, debugName) {
+    if (!this.cachedInjectors.has(key)) {
+      const injector = providers.length > 0 ? createEnvironmentInjector(providers, parentInjector, debugName) : null;
+      this.cachedInjectors.set(key, injector);
+    }
+    return this.cachedInjectors.get(key);
+  }
+  ngOnDestroy() {
+    try {
+      for (const injector of this.cachedInjectors.values()) {
+        if (injector !== null) {
+          injector.destroy();
+        }
+      }
+    } finally {
+      this.cachedInjectors.clear();
+    }
+  }
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _CachedInjectorService,
+      providedIn: "environment",
+      factory: () => new _CachedInjectorService()
+    })
+  );
+};
+var DEFER_BLOCK_DEPENDENCY_INTERCEPTOR = new InjectionToken("DEFER_BLOCK_DEPENDENCY_INTERCEPTOR");
+var DEFER_BLOCK_CONFIG = new InjectionToken(ngDevMode ? "DEFER_BLOCK_CONFIG" : "");
+function getOrCreateEnvironmentInjector(parentInjector, tDetails, providers) {
+  return parentInjector.get(CachedInjectorService).getOrCreateInjector(tDetails, parentInjector, providers, ngDevMode ? "DeferBlock Injector" : "");
+}
+function createDeferBlockInjector(parentInjector, tDetails, providers) {
+  if (parentInjector instanceof ChainedInjector) {
+    const origInjector = parentInjector.injector;
+    const parentEnvInjector2 = parentInjector.parentInjector;
+    const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector2, tDetails, providers);
+    return new ChainedInjector(origInjector, envInjector);
+  }
+  const parentEnvInjector = parentInjector.get(EnvironmentInjector);
+  if (parentEnvInjector !== parentInjector) {
+    const envInjector = getOrCreateEnvironmentInjector(parentEnvInjector, tDetails, providers);
+    return new ChainedInjector(parentInjector, envInjector);
+  }
+  return getOrCreateEnvironmentInjector(parentInjector, tDetails, providers);
+}
+function renderDeferBlockState(newState, tNode, lContainer, skipTimerScheduling = false) {
+  const hostLView = lContainer[PARENT];
+  const hostTView = hostLView[TVIEW];
+  if (isDestroyed(hostLView))
+    return;
+  ngDevMode && assertTNodeForLView(tNode, hostLView);
+  const lDetails = getLDeferBlockDetails(hostLView, tNode);
+  ngDevMode && assertDefined(lDetails, "Expected a defer block state defined");
+  const currentState = lDetails[DEFER_BLOCK_STATE];
+  const ssrState = lDetails[SSR_BLOCK_STATE];
+  if (ssrState !== null && newState < ssrState) {
+    return;
+  }
+  if (isValidStateChange(currentState, newState) && isValidStateChange(lDetails[NEXT_DEFER_BLOCK_STATE] ?? -1, newState)) {
+    const tDetails = getTDeferBlockDetails(hostTView, tNode);
+    const needsScheduling = !skipTimerScheduling && true && (getLoadingBlockAfter(tDetails) !== null || getMinimumDurationForState(tDetails, DeferBlockState.Loading) !== null || getMinimumDurationForState(tDetails, DeferBlockState.Placeholder));
+    if (ngDevMode && needsScheduling) {
+      assertDefined(applyDeferBlockStateWithSchedulingImpl, "Expected scheduling function to be defined");
+    }
+    const applyStateFn = needsScheduling ? applyDeferBlockStateWithSchedulingImpl : applyDeferBlockState;
+    try {
+      applyStateFn(newState, lDetails, lContainer, tNode, hostLView);
+    } catch (error) {
+      handleUncaughtError(hostLView, error);
+    }
+  }
+}
+function findMatchingDehydratedViewForDeferBlock(lContainer, lDetails) {
+  const dehydratedViewIx = lContainer[DEHYDRATED_VIEWS]?.findIndex((view) => view.data[DEFER_BLOCK_STATE$1] === lDetails[DEFER_BLOCK_STATE]) ?? -1;
+  const dehydratedView = dehydratedViewIx > -1 ? lContainer[DEHYDRATED_VIEWS][dehydratedViewIx] : null;
+  return { dehydratedView, dehydratedViewIx };
+}
+function applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView) {
+  profiler(
+    20
+    /* ProfilerEvent.DeferBlockStateStart */
+  );
+  const stateTmplIndex = getTemplateIndexForState(newState, hostLView, tNode);
+  if (stateTmplIndex !== null) {
+    lDetails[DEFER_BLOCK_STATE] = newState;
+    const hostTView = hostLView[TVIEW];
+    const adjustedIndex = stateTmplIndex + HEADER_OFFSET;
+    const activeBlockTNode = getTNode(hostTView, adjustedIndex);
+    const viewIndex = 0;
+    removeLViewFromLContainer(lContainer, viewIndex);
+    let injector;
+    if (newState === DeferBlockState.Complete) {
+      const tDetails = getTDeferBlockDetails(hostTView, tNode);
+      const providers = tDetails.providers;
+      if (providers && providers.length > 0) {
+        injector = createDeferBlockInjector(hostLView[INJECTOR], tDetails, providers);
+      }
+    }
+    const { dehydratedView, dehydratedViewIx } = findMatchingDehydratedViewForDeferBlock(lContainer, lDetails);
+    const embeddedLView = createAndRenderEmbeddedLView(hostLView, activeBlockTNode, null, {
+      injector,
+      dehydratedView
+    });
+    addLViewToLContainer(lContainer, embeddedLView, viewIndex, shouldAddViewToDom(activeBlockTNode, dehydratedView));
+    markViewDirty(
+      embeddedLView,
+      2
+      /* NotificationSource.DeferBlockStateUpdate */
+    );
+    if (dehydratedViewIx > -1) {
+      lContainer[DEHYDRATED_VIEWS]?.splice(dehydratedViewIx, 1);
+    }
+    if ((newState === DeferBlockState.Complete || newState === DeferBlockState.Error) && Array.isArray(lDetails[ON_COMPLETE_FNS])) {
+      for (const callback of lDetails[ON_COMPLETE_FNS]) {
+        callback();
+      }
+      lDetails[ON_COMPLETE_FNS] = null;
+    }
+  }
+  profiler(
+    21
+    /* ProfilerEvent.DeferBlockStateEnd */
+  );
+}
+function applyDeferBlockStateWithScheduling(newState, lDetails, lContainer, tNode, hostLView) {
+  const now = Date.now();
+  const hostTView = hostLView[TVIEW];
+  const tDetails = getTDeferBlockDetails(hostTView, tNode);
+  if (lDetails[STATE_IS_FROZEN_UNTIL] === null || lDetails[STATE_IS_FROZEN_UNTIL] <= now) {
+    lDetails[STATE_IS_FROZEN_UNTIL] = null;
+    const loadingAfter = getLoadingBlockAfter(tDetails);
+    const inLoadingAfterPhase = lDetails[LOADING_AFTER_CLEANUP_FN] !== null;
+    if (newState === DeferBlockState.Loading && loadingAfter !== null && !inLoadingAfterPhase) {
+      lDetails[NEXT_DEFER_BLOCK_STATE] = newState;
+      const cleanupFn = scheduleDeferBlockUpdate(loadingAfter, lDetails, tNode, lContainer, hostLView);
+      lDetails[LOADING_AFTER_CLEANUP_FN] = cleanupFn;
+    } else {
+      if (newState > DeferBlockState.Loading && inLoadingAfterPhase) {
+        lDetails[LOADING_AFTER_CLEANUP_FN]();
+        lDetails[LOADING_AFTER_CLEANUP_FN] = null;
+        lDetails[NEXT_DEFER_BLOCK_STATE] = null;
+      }
+      applyDeferBlockState(newState, lDetails, lContainer, tNode, hostLView);
+      const duration = getMinimumDurationForState(tDetails, newState);
+      if (duration !== null) {
+        lDetails[STATE_IS_FROZEN_UNTIL] = now + duration;
+        scheduleDeferBlockUpdate(duration, lDetails, tNode, lContainer, hostLView);
+      }
+    }
+  } else {
+    lDetails[NEXT_DEFER_BLOCK_STATE] = newState;
+  }
+}
+function scheduleDeferBlockUpdate(timeout2, lDetails, tNode, lContainer, hostLView) {
+  const callback = () => {
+    const nextState = lDetails[NEXT_DEFER_BLOCK_STATE];
+    lDetails[STATE_IS_FROZEN_UNTIL] = null;
+    lDetails[NEXT_DEFER_BLOCK_STATE] = null;
+    if (nextState !== null) {
+      renderDeferBlockState(nextState, tNode, lContainer);
+    }
+  };
+  return scheduleTimerTrigger(timeout2, callback, hostLView[INJECTOR]);
+}
+function isValidStateChange(currentState, newState) {
+  return currentState < newState;
+}
+function renderPlaceholder(lView, tNode) {
+  const lContainer = lView[tNode.index];
+  ngDevMode && assertLContainer(lContainer);
+  renderDeferBlockState(DeferBlockState.Placeholder, tNode, lContainer);
+}
+function renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer) {
+  ngDevMode && assertDefined(tDetails.loadingPromise, "Expected loading Promise to exist on this defer block");
+  tDetails.loadingPromise.then(() => {
+    if (tDetails.loadingState === DeferDependenciesLoadingState.COMPLETE) {
+      ngDevMode && assertDeferredDependenciesLoaded(tDetails);
+      renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
+    } else if (tDetails.loadingState === DeferDependenciesLoadingState.FAILED) {
+      renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
+    }
+  });
+}
+var applyDeferBlockStateWithSchedulingImpl = null;
+function ɵɵdeferEnableTimerScheduling(tView, tDetails, placeholderConfigIndex, loadingConfigIndex) {
+  const tViewConsts = tView.consts;
+  if (placeholderConfigIndex != null) {
+    tDetails.placeholderBlockConfig = getConstant(tViewConsts, placeholderConfigIndex);
+  }
+  if (loadingConfigIndex != null) {
+    tDetails.loadingBlockConfig = getConstant(tViewConsts, loadingConfigIndex);
+  }
+  if (applyDeferBlockStateWithSchedulingImpl === null) {
+    applyDeferBlockStateWithSchedulingImpl = applyDeferBlockStateWithScheduling;
+  }
+}
+var ASYNC_COMPONENT_METADATA_FN = "__ngAsyncComponentMetadataFn__";
+function getAsyncClassMetadataFn(type) {
+  const componentClass = type;
+  return componentClass[ASYNC_COMPONENT_METADATA_FN] ?? null;
+}
+function setClassMetadataAsync(type, dependencyLoaderFn, metadataSetterFn) {
+  const componentClass = type;
+  componentClass[ASYNC_COMPONENT_METADATA_FN] = () => Promise.all(dependencyLoaderFn()).then((dependencies) => {
+    metadataSetterFn(...dependencies);
+    componentClass[ASYNC_COMPONENT_METADATA_FN] = null;
+    return dependencies;
+  });
+  return componentClass[ASYNC_COMPONENT_METADATA_FN];
+}
+function setClassMetadata(type, decorators, ctorParameters, propDecorators) {
+  return noSideEffects(() => {
+    const clazz = type;
+    if (decorators !== null) {
+      if (clazz.hasOwnProperty("decorators") && clazz.decorators !== void 0) {
+        clazz.decorators.push(...decorators);
+      } else {
+        clazz.decorators = decorators;
+      }
+    }
+    if (ctorParameters !== null) {
+      clazz.ctorParameters = ctorParameters;
+    }
+    if (propDecorators !== null) {
+      if (clazz.hasOwnProperty("propDecorators") && clazz.propDecorators !== void 0) {
+        clazz.propDecorators = __spreadValues(__spreadValues({}, clazz.propDecorators), propDecorators);
+      } else {
+        clazz.propDecorators = propDecorators;
+      }
+    }
+  });
+}
+var Console = class _Console {
+  log(message) {
+    console.log(message);
+  }
+  // Note: for reporting errors use `DOM.logError()` as it is platform specific
+  warn(message) {
+    console.warn(message);
+  }
+  static ɵfac = function Console_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Console)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _Console, factory: _Console.ɵfac, providedIn: "platform" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Console, [{
+    type: Injectable,
+    args: [{ providedIn: "platform" }]
+  }], null, null);
+})();
+var DIDebugData = class {
+  resolverToTokenToDependencies = /* @__PURE__ */ new WeakMap();
+  resolverToProviders = /* @__PURE__ */ new WeakMap();
+  resolverToEffects = /* @__PURE__ */ new WeakMap();
+  standaloneInjectorToComponent = /* @__PURE__ */ new WeakMap();
+  reset() {
+    this.resolverToTokenToDependencies = /* @__PURE__ */ new WeakMap();
+    this.resolverToProviders = /* @__PURE__ */ new WeakMap();
+    this.standaloneInjectorToComponent = /* @__PURE__ */ new WeakMap();
+  }
+};
+var frameworkDIDebugData = new DIDebugData();
+function getFrameworkDIDebugData() {
+  return frameworkDIDebugData;
+}
+function setupFrameworkInjectorProfiler() {
+  frameworkDIDebugData.reset();
+  setInjectorProfiler(injectorProfilerEventHandler);
+}
+function injectorProfilerEventHandler(injectorProfilerEvent) {
+  const { context: context2, type } = injectorProfilerEvent;
+  if (type === 0) {
+    handleInjectEvent(context2, injectorProfilerEvent.service);
+  } else if (type === 1) {
+    handleInstanceCreatedByInjectorEvent(context2, injectorProfilerEvent.instance);
+  } else if (type === 2) {
+    handleProviderConfiguredEvent(context2, injectorProfilerEvent.providerRecord);
+  } else if (type === 3) {
+    handleEffectCreatedEvent(context2, injectorProfilerEvent.effect);
+  }
+}
+function handleEffectCreatedEvent(context2, effect2) {
+  const diResolver = getDIResolver(context2.injector);
+  if (diResolver === null) {
+    throwError2("An EffectCreated event must be run within an injection context.");
+  }
+  const { resolverToEffects } = frameworkDIDebugData;
+  if (!resolverToEffects.has(diResolver)) {
+    resolverToEffects.set(diResolver, []);
+  }
+  resolverToEffects.get(diResolver).push(effect2);
+}
+function handleInjectEvent(context2, data) {
+  const diResolver = getDIResolver(context2.injector);
+  if (diResolver === null) {
+    throwError2("An Inject event must be run within an injection context.");
+  }
+  const diResolverToInstantiatedToken = frameworkDIDebugData.resolverToTokenToDependencies;
+  if (!diResolverToInstantiatedToken.has(diResolver)) {
+    diResolverToInstantiatedToken.set(diResolver, /* @__PURE__ */ new WeakMap());
+  }
+  if (!canBeHeldWeakly(context2.token)) {
+    return;
+  }
+  const instantiatedTokenToDependencies = diResolverToInstantiatedToken.get(diResolver);
+  if (!instantiatedTokenToDependencies.has(context2.token)) {
+    instantiatedTokenToDependencies.set(context2.token, []);
+  }
+  const { token, value, flags } = data;
+  assertDefined(context2.token, "Injector profiler context token is undefined.");
+  const dependencies = instantiatedTokenToDependencies.get(context2.token);
+  assertDefined(dependencies, "Could not resolve dependencies for token.");
+  if (context2.injector instanceof NodeInjector) {
+    dependencies.push({ token, value, flags, injectedIn: getNodeInjectorContext(context2.injector) });
+  } else {
+    dependencies.push({ token, value, flags });
+  }
+}
+function getNodeInjectorContext(injector) {
+  if (!(injector instanceof NodeInjector)) {
+    throwError2("getNodeInjectorContext must be called with a NodeInjector");
+  }
+  const lView = getNodeInjectorLView(injector);
+  const tNode = getNodeInjectorTNode(injector);
+  if (tNode === null) {
+    return;
+  }
+  assertTNodeForLView(tNode, lView);
+  return { lView, tNode };
+}
+function handleInstanceCreatedByInjectorEvent(context2, data) {
+  const { value } = data;
+  if (data.value == null) {
+    return;
+  }
+  if (getDIResolver(context2.injector) === null) {
+    throwError2("An InjectorCreatedInstance event must be run within an injection context.");
+  }
+  let standaloneComponent = void 0;
+  if (typeof value === "object") {
+    standaloneComponent = value?.constructor;
+  }
+  if (standaloneComponent == void 0 || !isStandaloneComponent(standaloneComponent)) {
+    return;
+  }
+  const environmentInjector = context2.injector.get(EnvironmentInjector, null, { optional: true });
+  if (environmentInjector === null) {
+    return;
+  }
+  const { standaloneInjectorToComponent } = frameworkDIDebugData;
+  if (standaloneInjectorToComponent.has(environmentInjector)) {
+    return;
+  }
+  standaloneInjectorToComponent.set(environmentInjector, standaloneComponent);
+}
+function isStandaloneComponent(value) {
+  const def = getComponentDef(value);
+  return !!def?.standalone;
+}
+function handleProviderConfiguredEvent(context2, data) {
+  const { resolverToProviders } = frameworkDIDebugData;
+  let diResolver;
+  if (context2?.injector instanceof NodeInjector) {
+    diResolver = getNodeInjectorTNode(context2.injector);
+  } else {
+    diResolver = context2.injector;
+  }
+  if (diResolver === null) {
+    throwError2("A ProviderConfigured event must be run within an injection context.");
+  }
+  if (!resolverToProviders.has(diResolver)) {
+    resolverToProviders.set(diResolver, []);
+  }
+  resolverToProviders.get(diResolver).push(data);
+}
+function getDIResolver(injector) {
+  let diResolver = null;
+  if (injector === void 0) {
+    return diResolver;
+  }
+  if (injector instanceof NodeInjector) {
+    diResolver = getNodeInjectorLView(injector);
+  } else {
+    diResolver = injector;
+  }
+  return diResolver;
+}
+function canBeHeldWeakly(value) {
+  return value !== null && (typeof value === "object" || typeof value === "function" || typeof value === "symbol");
+}
+function applyChanges(component) {
+  ngDevMode && assertDefined(component, "component");
+  markViewDirty(
+    getComponentViewByInstance(component),
+    3
+    /* NotificationSource.DebugApplyChanges */
+  );
+  getRootComponents(component).forEach((rootComponent) => detectChanges(rootComponent));
+}
+function detectChanges(component) {
+  const view = getComponentViewByInstance(component);
+  view[FLAGS] |= 1024;
+  detectChangesInternal(view);
+}
+function getDeferBlocks$1(lView, deferBlocks) {
+  const tView = lView[TVIEW];
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    if (isLContainer(lView[i])) {
+      const lContainer = lView[i];
+      const isLast = i === tView.bindingStartIndex - 1;
+      if (!isLast) {
+        const tNode = tView.data[i];
+        const tDetails = getTDeferBlockDetails(tView, tNode);
+        if (isTDeferBlockDetails(tDetails)) {
+          deferBlocks.push({ lContainer, lView, tNode, tDetails });
+          continue;
+        }
+      }
+      if (isLView(lContainer[HOST])) {
+        getDeferBlocks$1(lContainer[HOST], deferBlocks);
+      }
+      for (let j = CONTAINER_HEADER_OFFSET; j < lContainer.length; j++) {
+        getDeferBlocks$1(lContainer[j], deferBlocks);
+      }
+    } else if (isLView(lView[i])) {
+      getDeferBlocks$1(lView[i], deferBlocks);
+    }
+  }
+}
+function getDeferBlocks(node) {
+  const results = [];
+  const lView = getLContext(node)?.lView;
+  if (lView) {
+    findDeferBlocks(node, lView, results);
+  }
+  return results;
+}
+function findDeferBlocks(node, lView, results) {
+  const viewInjector = lView[INJECTOR];
+  const registry = viewInjector.get(DEHYDRATED_BLOCK_REGISTRY, null, { optional: true });
+  const blocks = [];
+  getDeferBlocks$1(lView, blocks);
+  const transferState = viewInjector.get(TransferState);
+  const deferBlockParents = transferState.get(NGH_DEFER_BLOCKS_KEY, {});
+  for (const details of blocks) {
+    const native = getNativeByTNode(details.tNode, details.lView);
+    const lDetails = getLDeferBlockDetails(details.lView, details.tNode);
+    if (!node.contains(native)) {
+      continue;
+    }
+    const tDetails = details.tDetails;
+    const renderedLView = getRendererLView(details);
+    const rootNodes = [];
+    const hydrationState = inferHydrationState(tDetails, lDetails, registry);
+    if (renderedLView !== null) {
+      collectNativeNodes(renderedLView[TVIEW], renderedLView, renderedLView[TVIEW].firstChild, rootNodes);
+    } else if (hydrationState === "dehydrated") {
+      const deferId = lDetails[SSR_UNIQUE_ID];
+      const deferData = deferBlockParents[deferId];
+      const numberOfRootNodes = deferData[NUM_ROOT_NODES];
+      let collectedNodeCount = 0;
+      const deferBlockCommentNode = details.lContainer[NATIVE];
+      let currentNode = deferBlockCommentNode.previousSibling;
+      while (collectedNodeCount < numberOfRootNodes && currentNode) {
+        rootNodes.unshift(currentNode);
+        currentNode = currentNode.previousSibling;
+        collectedNodeCount++;
+      }
+    }
+    const data = {
+      state: stringifyState(lDetails[DEFER_BLOCK_STATE]),
+      incrementalHydrationState: hydrationState,
+      hasErrorBlock: tDetails.errorTmplIndex !== null,
+      loadingBlock: {
+        exists: tDetails.loadingTmplIndex !== null,
+        minimumTime: tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null,
+        afterTime: tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null
+      },
+      placeholderBlock: {
+        exists: tDetails.placeholderTmplIndex !== null,
+        minimumTime: tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null
+      },
+      triggers: tDetails.debug?.triggers ? Array.from(tDetails.debug.triggers).sort() : [],
+      rootNodes
+    };
+    results.push(data);
+    if (renderedLView !== null) {
+      findDeferBlocks(node, renderedLView, results);
+    }
+  }
+}
+function stringifyState(state) {
+  switch (state) {
+    case DeferBlockState.Complete:
+      return "complete";
+    case DeferBlockState.Loading:
+      return "loading";
+    case DeferBlockState.Placeholder:
+      return "placeholder";
+    case DeferBlockState.Error:
+      return "error";
+    case DeferBlockInternalState.Initial:
+      return "initial";
+    default:
+      throw new Error(`Unrecognized state ${state}`);
+  }
+}
+function inferHydrationState(tDetails, lDetails, registry) {
+  if (registry === null || lDetails[SSR_UNIQUE_ID] === null || tDetails.hydrateTriggers === null || tDetails.hydrateTriggers.has(
+    7
+    /* DeferBlockTrigger.Never */
+  )) {
+    return "not-configured";
+  }
+  return registry.has(lDetails[SSR_UNIQUE_ID]) ? "dehydrated" : "hydrated";
+}
+function getRendererLView(details) {
+  if (details.lContainer.length <= CONTAINER_HEADER_OFFSET) {
+    return null;
+  }
+  const lView = details.lContainer[CONTAINER_HEADER_OFFSET];
+  ngDevMode && assertLView(lView);
+  return lView;
+}
+function getDependenciesFromInjectable(injector, token) {
+  const instance = injector.get(token, null, { self: true, optional: true });
+  if (instance === null) {
+    throw new Error(`Unable to determine instance of ${token} in given injector`);
+  }
+  const unformattedDependencies = getDependenciesForTokenInInjector(token, injector);
+  const resolutionPath = getInjectorResolutionPath(injector);
+  const dependencies = unformattedDependencies.map((dep) => {
+    const formattedDependency = {
+      value: dep.value
+    };
+    const flags = dep.flags;
+    formattedDependency.flags = {
+      optional: (8 & flags) === 8,
+      host: (1 & flags) === 1,
+      self: (2 & flags) === 2,
+      skipSelf: (4 & flags) === 4
+    };
+    for (let i = 0; i < resolutionPath.length; i++) {
+      const injectorToCheck = resolutionPath[i];
+      if (i === 0 && formattedDependency.flags.skipSelf) {
+        continue;
+      }
+      if (formattedDependency.flags.host && injectorToCheck instanceof EnvironmentInjector) {
+        break;
+      }
+      const instance2 = injectorToCheck.get(dep.token, null, {
+        self: true,
+        optional: true
+      });
+      if (instance2 !== null) {
+        if (formattedDependency.flags.host) {
+          const firstInjector = resolutionPath[0];
+          const lookupFromFirstInjector = firstInjector.get(dep.token, null, __spreadProps(__spreadValues({}, formattedDependency.flags), {
+            optional: true
+          }));
+          if (lookupFromFirstInjector !== null) {
+            formattedDependency.providedIn = injectorToCheck;
+          }
+          break;
+        }
+        formattedDependency.providedIn = injectorToCheck;
+        break;
+      }
+      if (i === 0 && formattedDependency.flags.self) {
+        break;
+      }
+    }
+    if (dep.token)
+      formattedDependency.token = dep.token;
+    return formattedDependency;
+  });
+  return { instance, dependencies };
+}
+function getDependenciesForTokenInInjector(token, injector) {
+  const { resolverToTokenToDependencies } = getFrameworkDIDebugData();
+  if (!(injector instanceof NodeInjector)) {
+    return resolverToTokenToDependencies.get(injector)?.get?.(token) ?? [];
+  }
+  const lView = getNodeInjectorLView(injector);
+  const tokenDependencyMap = resolverToTokenToDependencies.get(lView);
+  const dependencies = tokenDependencyMap?.get(token) ?? [];
+  return dependencies.filter((dependency) => {
+    const dependencyNode = dependency.injectedIn?.tNode;
+    if (dependencyNode === void 0) {
+      return false;
+    }
+    const instanceNode = getNodeInjectorTNode(injector);
+    assertTNode(dependencyNode);
+    assertTNode(instanceNode);
+    return dependencyNode === instanceNode;
+  });
+}
+function getProviderImportsContainer(injector) {
+  const { standaloneInjectorToComponent } = getFrameworkDIDebugData();
+  if (standaloneInjectorToComponent.has(injector)) {
+    return standaloneInjectorToComponent.get(injector);
+  }
+  const defTypeRef = injector.get(NgModuleRef$1, null, { self: true, optional: true });
+  if (defTypeRef === null) {
+    return null;
+  }
+  if (defTypeRef.instance === null) {
+    return null;
+  }
+  return defTypeRef.instance.constructor;
+}
+function getNodeInjectorProviders(injector) {
+  const diResolver = getNodeInjectorTNode(injector);
+  const { resolverToProviders } = getFrameworkDIDebugData();
+  return resolverToProviders.get(diResolver) ?? [];
+}
+function getProviderImportPaths(providerImportsContainer) {
+  const providerToPath = /* @__PURE__ */ new Map();
+  const visitedContainers = /* @__PURE__ */ new Set();
+  const visitor = walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers);
+  walkProviderTree(providerImportsContainer, visitor, [], /* @__PURE__ */ new Set());
+  return providerToPath;
+}
+function walkProviderTreeToDiscoverImportPaths(providerToPath, visitedContainers) {
+  return (provider, container) => {
+    if (!providerToPath.has(provider)) {
+      providerToPath.set(provider, [container]);
+    }
+    if (!visitedContainers.has(container)) {
+      for (const prov of providerToPath.keys()) {
+        const existingImportPath = providerToPath.get(prov);
+        let containerDef = getInjectorDef(container);
+        if (!containerDef) {
+          const ngModule = container.ngModule;
+          containerDef = getInjectorDef(ngModule);
+        }
+        if (!containerDef) {
+          return;
+        }
+        const lastContainerAddedToPath = existingImportPath[0];
+        let isNextStepInPath = false;
+        deepForEach(containerDef.imports, (moduleImport) => {
+          if (isNextStepInPath) {
+            return;
+          }
+          isNextStepInPath = moduleImport.ngModule === lastContainerAddedToPath || moduleImport === lastContainerAddedToPath;
+          if (isNextStepInPath) {
+            providerToPath.get(prov)?.unshift(container);
+          }
+        });
+      }
+    }
+    visitedContainers.add(container);
+  };
+}
+function getEnvironmentInjectorProviders(injector) {
+  const providerRecordsWithoutImportPaths = getFrameworkDIDebugData().resolverToProviders.get(injector) ?? [];
+  if (isPlatformInjector(injector)) {
+    return providerRecordsWithoutImportPaths;
+  }
+  const providerImportsContainer = getProviderImportsContainer(injector);
+  if (providerImportsContainer === null) {
+    return providerRecordsWithoutImportPaths;
+  }
+  const providerToPath = getProviderImportPaths(providerImportsContainer);
+  const providerRecords = [];
+  for (const providerRecord of providerRecordsWithoutImportPaths) {
+    const provider = providerRecord.provider;
+    const token = provider.provide;
+    if (token === ENVIRONMENT_INITIALIZER || token === INJECTOR_DEF_TYPES) {
+      continue;
+    }
+    let importPath = providerToPath.get(provider) ?? [];
+    const def = getComponentDef(providerImportsContainer);
+    const isStandaloneComponent2 = !!def?.standalone;
+    if (isStandaloneComponent2) {
+      importPath = [providerImportsContainer, ...importPath];
+    }
+    providerRecords.push(__spreadProps(__spreadValues({}, providerRecord), { importPath }));
+  }
+  return providerRecords;
+}
+function isPlatformInjector(injector) {
+  return injector instanceof R3Injector && injector.scopes.has("platform");
+}
+function getInjectorProviders(injector) {
+  if (injector instanceof NodeInjector) {
+    return getNodeInjectorProviders(injector);
+  } else if (injector instanceof EnvironmentInjector) {
+    return getEnvironmentInjectorProviders(injector);
+  }
+  throwError2("getInjectorProviders only supports NodeInjector and EnvironmentInjector");
+}
+function getInjectorMetadata(injector) {
+  if (injector instanceof NodeInjector) {
+    const lView = getNodeInjectorLView(injector);
+    const tNode = getNodeInjectorTNode(injector);
+    assertTNodeForLView(tNode, lView);
+    return { type: "element", source: getNativeByTNode(tNode, lView) };
+  }
+  if (injector instanceof R3Injector) {
+    return { type: "environment", source: injector.source ?? null };
+  }
+  if (injector instanceof NullInjector) {
+    return { type: "null", source: null };
+  }
+  return null;
+}
+function getInjectorResolutionPath(injector) {
+  const resolutionPath = [injector];
+  getInjectorResolutionPathHelper(injector, resolutionPath);
+  return resolutionPath;
+}
+function getInjectorResolutionPathHelper(injector, resolutionPath) {
+  const parent = getInjectorParent(injector);
+  if (parent === null) {
+    if (injector instanceof NodeInjector) {
+      const firstInjector = resolutionPath[0];
+      if (firstInjector instanceof NodeInjector) {
+        const moduleInjector = getModuleInjectorOfNodeInjector(firstInjector);
+        if (moduleInjector === null) {
+          throwError2("NodeInjector must have some connection to the module injector tree");
+        }
+        resolutionPath.push(moduleInjector);
+        getInjectorResolutionPathHelper(moduleInjector, resolutionPath);
+      }
+      return resolutionPath;
+    }
+  } else {
+    resolutionPath.push(parent);
+    getInjectorResolutionPathHelper(parent, resolutionPath);
+  }
+  return resolutionPath;
+}
+function getInjectorParent(injector) {
+  if (injector instanceof R3Injector) {
+    return injector.parent;
+  }
+  let tNode;
+  let lView;
+  if (injector instanceof NodeInjector) {
+    tNode = getNodeInjectorTNode(injector);
+    lView = getNodeInjectorLView(injector);
+  } else if (injector instanceof NullInjector) {
+    return null;
+  } else if (injector instanceof ChainedInjector) {
+    return injector.parentInjector;
+  } else {
+    throwError2("getInjectorParent only support injectors of type R3Injector, NodeInjector, NullInjector");
+  }
+  const parentLocation = getParentInjectorLocation(tNode, lView);
+  if (hasParentInjector(parentLocation)) {
+    const parentInjectorIndex = getParentInjectorIndex(parentLocation);
+    const parentLView = getParentInjectorView(parentLocation, lView);
+    const parentTView = parentLView[TVIEW];
+    const parentTNode = parentTView.data[
+      parentInjectorIndex + 8
+      /* NodeInjectorOffset.TNODE */
+    ];
+    return new NodeInjector(parentTNode, parentLView);
+  } else {
+    const chainedInjector = lView[INJECTOR];
+    const injectorParent = chainedInjector.injector?.parent;
+    if (injectorParent instanceof NodeInjector) {
+      return injectorParent;
+    }
+  }
+  return null;
+}
+function getModuleInjectorOfNodeInjector(injector) {
+  let lView;
+  if (injector instanceof NodeInjector) {
+    lView = getNodeInjectorLView(injector);
+  } else {
+    throwError2("getModuleInjectorOfNodeInjector must be called with a NodeInjector");
+  }
+  const inj = lView[INJECTOR];
+  const moduleInjector = inj instanceof ChainedInjector ? inj.parentInjector : inj.parent;
+  if (!moduleInjector) {
+    throwError2("NodeInjector must have some connection to the module injector tree");
+  }
+  return moduleInjector;
+}
+function isComputedNode(node) {
+  return node.kind === "computed";
+}
+function isTemplateEffectNode(node) {
+  return node.kind === "template";
+}
+function isEffectNode(node) {
+  return node.kind === "effect";
+}
+function isSignalNode(node) {
+  return node.kind === "signal";
+}
+function getTemplateConsumer(injector) {
+  const tNode = getNodeInjectorTNode(injector);
+  assertTNode(tNode);
+  const lView = getNodeInjectorLView(injector);
+  assertLView(lView);
+  const templateLView = lView[tNode.index];
+  if (isLView(templateLView)) {
+    return templateLView[REACTIVE_TEMPLATE_CONSUMER] ?? null;
+  }
+  return null;
+}
+function getNodesAndEdgesFromSignalMap(signalMap) {
+  const nodes = Array.from(signalMap.keys());
+  const debugSignalGraphNodes = [];
+  const edges = [];
+  for (const [consumer, producers] of signalMap.entries()) {
+    const consumerIndex = nodes.indexOf(consumer);
+    if (isComputedNode(consumer) || isSignalNode(consumer)) {
+      debugSignalGraphNodes.push({
+        label: consumer.debugName,
+        value: consumer.value,
+        kind: consumer.kind
+      });
+    } else if (isTemplateEffectNode(consumer)) {
+      debugSignalGraphNodes.push({
+        label: consumer.debugName ?? consumer.lView?.[HOST]?.tagName?.toLowerCase?.(),
+        kind: consumer.kind
+      });
+    } else if (isEffectNode(consumer)) {
+      debugSignalGraphNodes.push({
+        label: consumer.debugName,
+        kind: consumer.kind
+      });
+    } else {
+      debugSignalGraphNodes.push({
+        label: consumer.debugName,
+        kind: consumer.kind
+      });
+    }
+    for (const producer of producers) {
+      edges.push({ consumer: consumerIndex, producer: nodes.indexOf(producer) });
+    }
+  }
+  return { nodes: debugSignalGraphNodes, edges };
+}
+function extractEffectsFromInjector(injector) {
+  let diResolver = injector;
+  if (injector instanceof NodeInjector) {
+    const lView = getNodeInjectorLView(injector);
+    diResolver = lView;
+  }
+  const resolverToEffects = getFrameworkDIDebugData().resolverToEffects;
+  const effects = resolverToEffects.get(diResolver) ?? [];
+  return effects.map((effect2) => effect2[SIGNAL]);
+}
+function extractSignalNodesAndEdgesFromRoots(nodes, signalDependenciesMap = /* @__PURE__ */ new Map()) {
+  for (const node of nodes) {
+    if (signalDependenciesMap.has(node)) {
+      continue;
+    }
+    const producerNodes = node.producerNode ?? [];
+    signalDependenciesMap.set(node, producerNodes);
+    extractSignalNodesAndEdgesFromRoots(producerNodes, signalDependenciesMap);
+  }
+  return signalDependenciesMap;
+}
+function getSignalGraph(injector) {
+  let templateConsumer = null;
+  if (!(injector instanceof NodeInjector) && !(injector instanceof R3Injector)) {
+    return throwError2("getSignalGraph must be called with a NodeInjector or R3Injector");
+  }
+  if (injector instanceof NodeInjector) {
+    templateConsumer = getTemplateConsumer(injector);
+  }
+  const nonTemplateEffectNodes = extractEffectsFromInjector(injector);
+  const signalNodes = templateConsumer ? [templateConsumer, ...nonTemplateEffectNodes] : nonTemplateEffectNodes;
+  const signalDependenciesMap = extractSignalNodesAndEdgesFromRoots(signalNodes);
+  return getNodesAndEdgesFromSignalMap(signalDependenciesMap);
+}
+var changeDetectionRuns = 0;
+var changeDetectionSyncRuns = 0;
+var counter = 0;
+var eventsStack = [];
+function measureStart(startEvent) {
+  eventsStack.push([startEvent, counter]);
+  console.timeStamp("Event_" + startEvent + "_" + counter++);
+}
+function measureEnd(startEvent, entryName, color) {
+  const top = eventsStack.pop();
+  assertDefined(top, "Profiling error: could not find start event entry " + startEvent);
+  assertEqual(top[0], startEvent, `Profiling error: expected to see ${startEvent} event but got ${top[0]}`);
+  console.timeStamp(entryName, "Event_" + top[0] + "_" + top[1], void 0, "🅰️ Angular", void 0, color);
+}
+var chromeDevToolsInjectorProfiler = (event) => {
+  const eventType = event.type;
+  if (eventType === 4) {
+    measureStart(
+      100
+      /* ProfilerDIEvent.InjectorToCreateInstanceEvent */
+    );
+  } else if (eventType === 1) {
+    const token = event.context.token;
+    measureEnd(100, getProviderTokenMeasureName(token), "tertiary-dark");
+  }
+};
+var devToolsProfiler = (event, instance, eventFn) => {
+  switch (event) {
+    case 8:
+    case 10:
+    case 12:
+    case 14:
+    case 16:
+    case 18:
+    case 20:
+    case 22:
+    case 0:
+    case 4:
+    case 2:
+    case 24:
+    case 6: {
+      measureStart(event);
+      break;
+    }
+    case 9: {
+      measureEnd(8, "Bootstrap application", "primary-dark");
+      break;
+    }
+    case 11: {
+      measureEnd(10, "Bootstrap component", "primary-dark");
+      break;
+    }
+    case 13: {
+      changeDetectionSyncRuns = 0;
+      measureEnd(12, "Change detection " + changeDetectionRuns++, "primary-dark");
+      break;
+    }
+    case 15: {
+      measureEnd(14, "Synchronization " + changeDetectionSyncRuns++, "primary");
+      break;
+    }
+    case 17: {
+      measureEnd(16, "After render hooks", "primary");
+      break;
+    }
+    case 19: {
+      const typeName = getComponentMeasureName(instance);
+      measureEnd(18, typeName, "primary-light");
+      break;
+    }
+    case 21: {
+      measureEnd(20, "Defer block", "primary-dark");
+      break;
+    }
+    case 23: {
+      measureEnd(22, "Dynamic component creation", "primary-dark");
+      break;
+    }
+    case 3: {
+      measureEnd(2, stringifyForError(eventFn) + " (update)", "secondary-dark");
+      break;
+    }
+    case 1: {
+      measureEnd(0, stringifyForError(eventFn) + " (create)", "secondary");
+      break;
+    }
+    case 25: {
+      measureEnd(24, "HostBindings", "secondary-dark");
+      break;
+    }
+    case 5: {
+      const typeName = getComponentMeasureName(instance);
+      measureEnd(4, `${typeName}:${stringifyForError(eventFn)}`, "tertiary");
+      break;
+    }
+    case 7: {
+      measureEnd(6, stringifyForError(eventFn), "tertiary-light");
+      break;
+    }
+    default: {
+      throw new Error("Unexpected profiling event type: " + event);
+    }
+  }
+};
+function getComponentMeasureName(instance) {
+  return instance.constructor.name;
+}
+function getProviderTokenMeasureName(token) {
+  if (isTypeProvider(token)) {
+    return token.name;
+  } else if (token.provide != null) {
+    return getProviderTokenMeasureName(token.provide);
+  }
+  return token.toString();
+}
+function enableProfiling() {
+  performanceMarkFeature("Chrome DevTools profiling");
+  if (typeof ngDevMode !== "undefined" && ngDevMode) {
+    const removeInjectorProfiler = setInjectorProfiler(chromeDevToolsInjectorProfiler);
+    const removeProfiler3 = setProfiler(devToolsProfiler);
+    return () => {
+      removeInjectorProfiler();
+      removeProfiler3();
+    };
+  }
+  return () => {
+  };
+}
+var GLOBAL_PUBLISH_EXPANDO_KEY = "ng";
+var globalUtilsFunctions = {
+  /**
+   * Warning: functions that start with `ɵ` are considered *INTERNAL* and should not be relied upon
+   * in application's code. The contract of those functions might be changed in any release and/or a
+   * function can be removed completely.
+   */
+  "ɵgetDependenciesFromInjectable": getDependenciesFromInjectable,
+  "ɵgetInjectorProviders": getInjectorProviders,
+  "ɵgetInjectorResolutionPath": getInjectorResolutionPath,
+  "ɵgetInjectorMetadata": getInjectorMetadata,
+  "ɵsetProfiler": setProfiler,
+  "ɵgetSignalGraph": getSignalGraph,
+  "ɵgetDeferBlocks": getDeferBlocks,
+  "getDirectiveMetadata": getDirectiveMetadata$1,
+  "getComponent": getComponent,
+  "getContext": getContext,
+  "getListeners": getListeners,
+  "getOwningComponent": getOwningComponent,
+  "getHostElement": getHostElement,
+  "getInjector": getInjector,
+  "getRootComponents": getRootComponents,
+  "getDirectives": getDirectives,
+  "applyChanges": applyChanges,
+  "isSignal": isSignal,
+  "enableProfiling": enableProfiling
+};
+var _published = false;
+function publishDefaultGlobalUtils$1() {
+  if (!_published) {
+    _published = true;
+    if (typeof window !== "undefined") {
+      setupFrameworkInjectorProfiler();
+    }
+    for (const [methodName, method] of Object.entries(globalUtilsFunctions)) {
+      publishGlobalUtil(methodName, method);
+    }
+  }
+}
+function publishGlobalUtil(name, fn) {
+  publishUtil(name, fn);
+}
+function publishExternalGlobalUtil(name, fn) {
+  publishUtil(name, fn);
+}
+function publishUtil(name, fn) {
+  if (typeof COMPILED === "undefined" || !COMPILED) {
+    const w = _global;
+    ngDevMode && assertDefined(fn, "function not defined");
+    w[GLOBAL_PUBLISH_EXPANDO_KEY] ??= {};
+    w[GLOBAL_PUBLISH_EXPANDO_KEY][name] = fn;
+  }
+}
+var TESTABILITY = new InjectionToken("");
+var TESTABILITY_GETTER = new InjectionToken("");
+var Testability = class _Testability {
+  _ngZone;
+  registry;
+  _isZoneStable = true;
+  _callbacks = [];
+  _taskTrackingZone = null;
+  _destroyRef;
+  constructor(_ngZone, registry, testabilityGetter) {
+    this._ngZone = _ngZone;
+    this.registry = registry;
+    if (isInInjectionContext()) {
+      this._destroyRef = inject(DestroyRef, { optional: true }) ?? void 0;
+    }
+    if (!_testabilityGetter) {
+      setTestabilityGetter(testabilityGetter);
+      testabilityGetter.addToWindow(registry);
+    }
+    this._watchAngularEvents();
+    _ngZone.run(() => {
+      this._taskTrackingZone = typeof Zone == "undefined" ? null : Zone.current.get("TaskTrackingZone");
+    });
+  }
+  _watchAngularEvents() {
+    const onUnstableSubscription = this._ngZone.onUnstable.subscribe({
+      next: () => {
+        this._isZoneStable = false;
+      }
+    });
+    const onStableSubscription = this._ngZone.runOutsideAngular(() => this._ngZone.onStable.subscribe({
+      next: () => {
+        NgZone.assertNotInAngularZone();
+        queueMicrotask(() => {
+          this._isZoneStable = true;
+          this._runCallbacksIfReady();
+        });
+      }
+    }));
+    this._destroyRef?.onDestroy(() => {
+      onUnstableSubscription.unsubscribe();
+      onStableSubscription.unsubscribe();
+    });
+  }
+  /**
+   * Whether an associated application is stable
+   */
+  isStable() {
+    return this._isZoneStable && !this._ngZone.hasPendingMacrotasks;
+  }
+  _runCallbacksIfReady() {
+    if (this.isStable()) {
+      queueMicrotask(() => {
+        while (this._callbacks.length !== 0) {
+          let cb = this._callbacks.pop();
+          clearTimeout(cb.timeoutId);
+          cb.doneCb();
+        }
+      });
+    } else {
+      let pending = this.getPendingTasks();
+      this._callbacks = this._callbacks.filter((cb) => {
+        if (cb.updateCb && cb.updateCb(pending)) {
+          clearTimeout(cb.timeoutId);
+          return false;
+        }
+        return true;
+      });
+    }
+  }
+  getPendingTasks() {
+    if (!this._taskTrackingZone) {
+      return [];
+    }
+    return this._taskTrackingZone.macroTasks.map((t) => {
+      return {
+        source: t.source,
+        // From TaskTrackingZone:
+        // https://github.com/angular/zone.js/blob/master/lib/zone-spec/task-tracking.ts#L40
+        creationLocation: t.creationLocation,
+        data: t.data
+      };
+    });
+  }
+  addCallback(cb, timeout2, updateCb) {
+    let timeoutId = -1;
+    if (timeout2 && timeout2 > 0) {
+      timeoutId = setTimeout(() => {
+        this._callbacks = this._callbacks.filter((cb2) => cb2.timeoutId !== timeoutId);
+        cb();
+      }, timeout2);
+    }
+    this._callbacks.push({ doneCb: cb, timeoutId, updateCb });
+  }
+  /**
+   * Wait for the application to be stable with a timeout. If the timeout is reached before that
+   * happens, the callback receives a list of the macro tasks that were pending, otherwise null.
+   *
+   * @param doneCb The callback to invoke when Angular is stable or the timeout expires
+   *    whichever comes first.
+   * @param timeout Optional. The maximum time to wait for Angular to become stable. If not
+   *    specified, whenStable() will wait forever.
+   * @param updateCb Optional. If specified, this callback will be invoked whenever the set of
+   *    pending macrotasks changes. If this callback returns true doneCb will not be invoked
+   *    and no further updates will be issued.
+   */
+  whenStable(doneCb, timeout2, updateCb) {
+    if (updateCb && !this._taskTrackingZone) {
+      throw new Error('Task tracking zone is required when passing an update callback to whenStable(). Is "zone.js/plugins/task-tracking" loaded?');
+    }
+    this.addCallback(doneCb, timeout2, updateCb);
+    this._runCallbacksIfReady();
+  }
+  /**
+   * Registers an application with a testability hook so that it can be tracked.
+   * @param token token of application, root element
+   *
+   * @internal
+   */
+  registerApplication(token) {
+    this.registry.registerApplication(token, this);
+  }
+  /**
+   * Unregisters an application.
+   * @param token token of application, root element
+   *
+   * @internal
+   */
+  unregisterApplication(token) {
+    this.registry.unregisterApplication(token);
+  }
+  /**
+   * Find providers by name
+   * @param using The root element to search from
+   * @param provider The name of binding variable
+   * @param exactMatch Whether using exactMatch
+   */
+  findProviders(using2, provider, exactMatch) {
+    return [];
+  }
+  static ɵfac = function Testability_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Testability)(ɵɵinject(NgZone), ɵɵinject(TestabilityRegistry), ɵɵinject(TESTABILITY_GETTER));
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _Testability, factory: _Testability.ɵfac });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Testability, [{
+    type: Injectable
+  }], () => [{ type: NgZone }, { type: TestabilityRegistry }, { type: void 0, decorators: [{
+    type: Inject,
+    args: [TESTABILITY_GETTER]
+  }] }], null);
+})();
+var TestabilityRegistry = class _TestabilityRegistry {
+  /** @internal */
+  _applications = /* @__PURE__ */ new Map();
+  /**
+   * Registers an application with a testability hook so that it can be tracked
+   * @param token token of application, root element
+   * @param testability Testability hook
+   */
+  registerApplication(token, testability) {
+    this._applications.set(token, testability);
+  }
+  /**
+   * Unregisters an application.
+   * @param token token of application, root element
+   */
+  unregisterApplication(token) {
+    this._applications.delete(token);
+  }
+  /**
+   * Unregisters all applications
+   */
+  unregisterAllApplications() {
+    this._applications.clear();
+  }
+  /**
+   * Get a testability hook associated with the application
+   * @param elem root element
+   */
+  getTestability(elem) {
+    return this._applications.get(elem) || null;
+  }
+  /**
+   * Get all registered testabilities
+   */
+  getAllTestabilities() {
+    return Array.from(this._applications.values());
+  }
+  /**
+   * Get all registered applications(root elements)
+   */
+  getAllRootElements() {
+    return Array.from(this._applications.keys());
+  }
+  /**
+   * Find testability of a node in the Tree
+   * @param elem node
+   * @param findInAncestors whether finding testability in ancestors if testability was not found in
+   * current node
+   */
+  findTestabilityInTree(elem, findInAncestors = true) {
+    return _testabilityGetter?.findTestabilityInTree(this, elem, findInAncestors) ?? null;
+  }
+  static ɵfac = function TestabilityRegistry_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _TestabilityRegistry)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _TestabilityRegistry, factory: _TestabilityRegistry.ɵfac, providedIn: "platform" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(TestabilityRegistry, [{
+    type: Injectable,
+    args: [{ providedIn: "platform" }]
+  }], null, null);
+})();
+function setTestabilityGetter(getter) {
+  _testabilityGetter = getter;
+}
+var _testabilityGetter;
+function isPromise2(obj) {
+  return !!obj && typeof obj.then === "function";
+}
+function isSubscribable(obj) {
+  return !!obj && typeof obj.subscribe === "function";
+}
+var APP_INITIALIZER = new InjectionToken(ngDevMode ? "Application Initializer" : "");
+function provideAppInitializer(initializerFn) {
+  return makeEnvironmentProviders([
+    {
+      provide: APP_INITIALIZER,
+      multi: true,
+      useValue: initializerFn
+    }
+  ]);
+}
+var ApplicationInitStatus = class _ApplicationInitStatus {
+  // Using non null assertion, these fields are defined below
+  // within the `new Promise` callback (synchronously).
+  resolve;
+  reject;
+  initialized = false;
+  done = false;
+  donePromise = new Promise((res, rej) => {
+    this.resolve = res;
+    this.reject = rej;
+  });
+  appInits = inject(APP_INITIALIZER, { optional: true }) ?? [];
+  injector = inject(Injector);
+  constructor() {
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && !Array.isArray(this.appInits)) {
+      throw new RuntimeError(-209, `Unexpected type of the \`APP_INITIALIZER\` token value (expected an array, but got ${typeof this.appInits}). Please check that the \`APP_INITIALIZER\` token is configured as a \`multi: true\` provider.`);
+    }
+  }
+  /** @internal */
+  runInitializers() {
+    if (this.initialized) {
+      return;
+    }
+    const asyncInitPromises = [];
+    for (const appInits of this.appInits) {
+      const initResult = runInInjectionContext(this.injector, appInits);
+      if (isPromise2(initResult)) {
+        asyncInitPromises.push(initResult);
+      } else if (isSubscribable(initResult)) {
+        const observableAsPromise = new Promise((resolve, reject) => {
+          initResult.subscribe({ complete: resolve, error: reject });
+        });
+        asyncInitPromises.push(observableAsPromise);
+      }
+    }
+    const complete = () => {
+      this.done = true;
+      this.resolve();
+    };
+    Promise.all(asyncInitPromises).then(() => {
+      complete();
+    }).catch((e) => {
+      this.reject(e);
+    });
+    if (asyncInitPromises.length === 0) {
+      complete();
+    }
+    this.initialized = true;
+  }
+  static ɵfac = function ApplicationInitStatus_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ApplicationInitStatus)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _ApplicationInitStatus, factory: _ApplicationInitStatus.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationInitStatus, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], () => [], null);
+})();
+var APP_BOOTSTRAP_LISTENER = new InjectionToken(ngDevMode ? "appBootstrapListener" : "");
+function publishDefaultGlobalUtils() {
+  ngDevMode && publishDefaultGlobalUtils$1();
+}
+function publishSignalConfiguration() {
+  setThrowInvalidWriteToSignalError(() => {
+    let errorMessage = "";
+    if (ngDevMode) {
+      const activeConsumer2 = getActiveConsumer();
+      errorMessage = activeConsumer2 && isReactiveLViewConsumer(activeConsumer2) ? "Writing to signals is not allowed while Angular renders the template (eg. interpolations)" : "Writing to signals is not allowed in a `computed`";
+    }
+    throw new RuntimeError(600, errorMessage);
+  });
+}
+function isBoundToModule(cf) {
+  return cf.isBoundToModule;
+}
+var NgProbeToken = class {
+  name;
+  token;
+  constructor(name, token) {
+    this.name = name;
+    this.token = token;
+  }
+};
+var MAXIMUM_REFRESH_RERUNS = 10;
+function optionsReducer(dst, objs) {
+  if (Array.isArray(objs)) {
+    return objs.reduce(optionsReducer, dst);
+  }
+  return __spreadValues(__spreadValues({}, dst), objs);
+}
+var ApplicationRef = class _ApplicationRef {
+  /** @internal */
+  _runningTick = false;
+  _destroyed = false;
+  _destroyListeners = [];
+  /** @internal */
+  _views = [];
+  internalErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+  afterRenderManager = inject(AfterRenderManager);
+  zonelessEnabled = inject(ZONELESS_ENABLED);
+  rootEffectScheduler = inject(EffectScheduler);
+  /**
+   * Current dirty state of the application across a number of dimensions (views, afterRender hooks,
+   * etc).
+   *
+   * A flag set here means that `tick()` will attempt to resolve the dirtiness when executed.
+   *
+   * @internal
+   */
+  dirtyFlags = 0;
+  /**
+   * Most recent snapshot from the `TracingService`, if any.
+   *
+   * This snapshot attempts to capture the context when `tick()` was first
+   * scheduled. It then runs wrapped in this context.
+   *
+   * @internal
+   */
+  tracingSnapshot = null;
+  // Needed for ComponentFixture temporarily during migration of autoDetect behavior
+  // Eventually the hostView of the fixture should just attach to ApplicationRef.
+  allTestViews = /* @__PURE__ */ new Set();
+  autoDetectTestViews = /* @__PURE__ */ new Set();
+  includeAllTestViews = false;
+  /** @internal */
+  afterTick = new Subject();
+  /** @internal */
+  get allViews() {
+    return [
+      ...(this.includeAllTestViews ? this.allTestViews : this.autoDetectTestViews).keys(),
+      ...this._views
+    ];
+  }
+  /**
+   * Indicates whether this instance was destroyed.
+   */
+  get destroyed() {
+    return this._destroyed;
+  }
+  /**
+   * Get a list of component types registered to this application.
+   * This list is populated even before the component is created.
+   */
+  componentTypes = [];
+  /**
+   * Get a list of components registered to this application.
+   */
+  components = [];
+  internalPendingTask = inject(PendingTasksInternal);
+  /**
+   * Returns an Observable that indicates when the application is stable or unstable.
+   */
+  get isStable() {
+    return this.internalPendingTask.hasPendingTasksObservable.pipe(map((pending) => !pending));
+  }
+  constructor() {
+    inject(TracingService, { optional: true });
+  }
+  /**
+   * @returns A promise that resolves when the application becomes stable
+   */
+  whenStable() {
+    let subscription;
+    return new Promise((resolve) => {
+      subscription = this.isStable.subscribe({
+        next: (stable) => {
+          if (stable) {
+            resolve();
+          }
+        }
+      });
+    }).finally(() => {
+      subscription.unsubscribe();
+    });
+  }
+  _injector = inject(EnvironmentInjector);
+  _rendererFactory = null;
+  /**
+   * The `EnvironmentInjector` used to create this application.
+   */
+  get injector() {
+    return this._injector;
+  }
+  /**
+   * Bootstrap a component onto the element identified by its selector or, optionally, to a
+   * specified element.
+   *
+   * @usageNotes
+   * ### Bootstrap process
+   *
+   * When bootstrapping a component, Angular mounts it onto a target DOM element
+   * and kicks off automatic change detection. The target DOM element can be
+   * provided using the `rootSelectorOrNode` argument.
+   *
+   * If the target DOM element is not provided, Angular tries to find one on a page
+   * using the `selector` of the component that is being bootstrapped
+   * (first matched element is used).
+   *
+   * ### Example
+   *
+   * Generally, we define the component to bootstrap in the `bootstrap` array of `NgModule`,
+   * but it requires us to know the component while writing the application code.
+   *
+   * Imagine a situation where we have to wait for an API call to decide about the component to
+   * bootstrap. We can use the `ngDoBootstrap` hook of the `NgModule` and call this method to
+   * dynamically bootstrap a component.
+   *
+   * {@example core/ts/platform/platform.ts region='componentSelector'}
+   *
+   * Optionally, a component can be mounted onto a DOM element that does not match the
+   * selector of the bootstrapped component.
+   *
+   * In the following example, we are providing a CSS selector to match the target element.
+   *
+   * {@example core/ts/platform/platform.ts region='cssSelector'}
+   *
+   * While in this example, we are providing reference to a DOM node.
+   *
+   * {@example core/ts/platform/platform.ts region='domNode'}
+   */
+  bootstrap(componentOrFactory, rootSelectorOrNode) {
+    return this.bootstrapImpl(componentOrFactory, rootSelectorOrNode);
+  }
+  bootstrapImpl(componentOrFactory, rootSelectorOrNode, injector = Injector.NULL) {
+    const ngZone = this._injector.get(NgZone);
+    return ngZone.run(() => {
+      profiler(
+        10
+        /* ProfilerEvent.BootstrapComponentStart */
+      );
+      (typeof ngDevMode === "undefined" || ngDevMode) && warnIfDestroyed(this._destroyed);
+      const isComponentFactory = componentOrFactory instanceof ComponentFactory$1;
+      const initStatus = this._injector.get(ApplicationInitStatus);
+      if (!initStatus.done) {
+        let errorMessage = "";
+        if (typeof ngDevMode === "undefined" || ngDevMode) {
+          const standalone = !isComponentFactory && isStandalone(componentOrFactory);
+          errorMessage = "Cannot bootstrap as there are still asynchronous initializers running." + (standalone ? "" : " Bootstrap components in the `ngDoBootstrap` method of the root module.");
+        }
+        throw new RuntimeError(405, errorMessage);
+      }
+      let componentFactory;
+      if (isComponentFactory) {
+        componentFactory = componentOrFactory;
+      } else {
+        const resolver = this._injector.get(ComponentFactoryResolver$1);
+        componentFactory = resolver.resolveComponentFactory(componentOrFactory);
+      }
+      this.componentTypes.push(componentFactory.componentType);
+      const ngModule = isBoundToModule(componentFactory) ? void 0 : this._injector.get(NgModuleRef$1);
+      const selectorOrNode = rootSelectorOrNode || componentFactory.selector;
+      const compRef = componentFactory.create(injector, [], selectorOrNode, ngModule);
+      const nativeElement = compRef.location.nativeElement;
+      const testability = compRef.injector.get(TESTABILITY, null);
+      testability?.registerApplication(nativeElement);
+      compRef.onDestroy(() => {
+        this.detachView(compRef.hostView);
+        remove(this.components, compRef);
+        testability?.unregisterApplication(nativeElement);
+      });
+      this._loadComponent(compRef);
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        const _console = this._injector.get(Console);
+        _console.log(`Angular is running in development mode.`);
+      }
+      profiler(11, compRef);
+      return compRef;
+    });
+  }
+  /**
+   * Invoke this method to explicitly process change detection and its side-effects.
+   *
+   * In development mode, `tick()` also performs a second change detection cycle to ensure that no
+   * further changes are detected. If additional changes are picked up during this second cycle,
+   * bindings in the app have side-effects that cannot be resolved in a single change detection
+   * pass.
+   * In this case, Angular throws an error, since an Angular application can only have one change
+   * detection pass during which all change detection must complete.
+   */
+  tick() {
+    if (!this.zonelessEnabled) {
+      this.dirtyFlags |= 1;
+    }
+    this._tick();
+  }
+  /** @internal */
+  _tick() {
+    profiler(
+      12
+      /* ProfilerEvent.ChangeDetectionStart */
+    );
+    if (this.tracingSnapshot !== null) {
+      this.tracingSnapshot.run(TracingAction.CHANGE_DETECTION, this.tickImpl);
+    } else {
+      this.tickImpl();
+    }
+  }
+  tickImpl = () => {
+    (typeof ngDevMode === "undefined" || ngDevMode) && warnIfDestroyed(this._destroyed);
+    if (this._runningTick) {
+      throw new RuntimeError(101, ngDevMode && "ApplicationRef.tick is called recursively");
+    }
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      this._runningTick = true;
+      this.synchronize();
+      if (typeof ngDevMode === "undefined" || ngDevMode) {
+        for (let view of this.allViews) {
+          view.checkNoChanges();
+        }
+      }
+    } finally {
+      this._runningTick = false;
+      this.tracingSnapshot?.dispose();
+      this.tracingSnapshot = null;
+      setActiveConsumer(prevConsumer);
+      this.afterTick.next();
+      profiler(
+        13
+        /* ProfilerEvent.ChangeDetectionEnd */
+      );
+    }
+  };
+  /**
+   * Performs the core work of synchronizing the application state with the UI, resolving any
+   * pending dirtiness (potentially in a loop).
+   */
+  synchronize() {
+    if (this._rendererFactory === null && !this._injector.destroyed) {
+      this._rendererFactory = this._injector.get(RendererFactory2, null, { optional: true });
+    }
+    let runs = 0;
+    while (this.dirtyFlags !== 0 && runs++ < MAXIMUM_REFRESH_RERUNS) {
+      profiler(
+        14
+        /* ProfilerEvent.ChangeDetectionSyncStart */
+      );
+      this.synchronizeOnce();
+      profiler(
+        15
+        /* ProfilerEvent.ChangeDetectionSyncEnd */
+      );
+    }
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && runs >= MAXIMUM_REFRESH_RERUNS) {
+      throw new RuntimeError(103, ngDevMode && "Infinite change detection while refreshing application views. Ensure views are not calling `markForCheck` on every template execution or that afterRender hooks always mark views for check.");
+    }
+  }
+  /**
+   * Perform a single synchronization pass.
+   */
+  synchronizeOnce() {
+    if (this.dirtyFlags & 16) {
+      this.dirtyFlags &= ~16;
+      this.rootEffectScheduler.flush();
+    }
+    let ranDetectChanges = false;
+    if (this.dirtyFlags & 7) {
+      const useGlobalCheck = Boolean(
+        this.dirtyFlags & 1
+        /* ApplicationRefDirtyFlags.ViewTreeGlobal */
+      );
+      this.dirtyFlags &= ~7;
+      this.dirtyFlags |= 8;
+      for (let { _lView } of this.allViews) {
+        if (!useGlobalCheck && !requiresRefreshOrTraversal(_lView)) {
+          continue;
+        }
+        const mode = useGlobalCheck && !this.zonelessEnabled ? (
+          // Global mode includes `CheckAlways` views.
+          0
+        ) : (
+          // Only refresh views with the `RefreshView` flag or views is a changed signal
+          1
+        );
+        detectChangesInternal(_lView, mode);
+        ranDetectChanges = true;
+      }
+      this.dirtyFlags &= ~4;
+      this.syncDirtyFlagsWithViews();
+      if (this.dirtyFlags & (7 | 16)) {
+        return;
+      }
+    }
+    if (!ranDetectChanges) {
+      this._rendererFactory?.begin?.();
+      this._rendererFactory?.end?.();
+    }
+    if (this.dirtyFlags & 8) {
+      this.dirtyFlags &= ~8;
+      this.afterRenderManager.execute();
+    }
+    this.syncDirtyFlagsWithViews();
+  }
+  /**
+   * Checks `allViews` for views which require refresh/traversal, and updates `dirtyFlags`
+   * accordingly, with two potential behaviors:
+   *
+   * 1. If any of our views require updating, then this adds the `ViewTreeTraversal` dirty flag.
+   *    This _should_ be a no-op, since the scheduler should've added the flag at the same time the
+   *    view was marked as needing updating.
+   *
+   *    TODO(alxhub): figure out if this behavior is still needed for edge cases.
+   *
+   * 2. If none of our views require updating, then clear the view-related `dirtyFlag`s. This
+   *    happens when the scheduler is notified of a view becoming dirty, but the view itself isn't
+   *    reachable through traversal from our roots (e.g. it's detached from the CD tree).
+   */
+  syncDirtyFlagsWithViews() {
+    if (this.allViews.some(({ _lView }) => requiresRefreshOrTraversal(_lView))) {
+      this.dirtyFlags |= 2;
+      return;
+    } else {
+      this.dirtyFlags &= ~7;
+    }
+  }
+  /**
+   * Attaches a view so that it will be dirty checked.
+   * The view will be automatically detached when it is destroyed.
+   * This will throw if the view is already attached to a ViewContainer.
+   */
+  attachView(viewRef) {
+    (typeof ngDevMode === "undefined" || ngDevMode) && warnIfDestroyed(this._destroyed);
+    const view = viewRef;
+    this._views.push(view);
+    view.attachToAppRef(this);
+  }
+  /**
+   * Detaches a view from dirty checking again.
+   */
+  detachView(viewRef) {
+    (typeof ngDevMode === "undefined" || ngDevMode) && warnIfDestroyed(this._destroyed);
+    const view = viewRef;
+    remove(this._views, view);
+    view.detachFromAppRef();
+  }
+  _loadComponent(componentRef) {
+    this.attachView(componentRef.hostView);
+    try {
+      this.tick();
+    } catch (e) {
+      this.internalErrorHandler(e);
+    }
+    this.components.push(componentRef);
+    const listeners = this._injector.get(APP_BOOTSTRAP_LISTENER, []);
+    if (ngDevMode && !Array.isArray(listeners)) {
+      throw new RuntimeError(-209, `Unexpected type of the \`APP_BOOTSTRAP_LISTENER\` token value (expected an array, but got ${typeof listeners}). Please check that the \`APP_BOOTSTRAP_LISTENER\` token is configured as a \`multi: true\` provider.`);
+    }
+    listeners.forEach((listener) => listener(componentRef));
+  }
+  /** @internal */
+  ngOnDestroy() {
+    if (this._destroyed)
+      return;
+    try {
+      this._destroyListeners.forEach((listener) => listener());
+      this._views.slice().forEach((view) => view.destroy());
+    } finally {
+      this._destroyed = true;
+      this._views = [];
+      this._destroyListeners = [];
+    }
+  }
+  /**
+   * Registers a listener to be called when an instance is destroyed.
+   *
+   * @param callback A callback function to add as a listener.
+   * @returns A function which unregisters a listener.
+   */
+  onDestroy(callback) {
+    (typeof ngDevMode === "undefined" || ngDevMode) && warnIfDestroyed(this._destroyed);
+    this._destroyListeners.push(callback);
+    return () => remove(this._destroyListeners, callback);
+  }
+  /**
+   * Destroys an Angular application represented by this `ApplicationRef`. Calling this function
+   * will destroy the associated environment injectors as well as all the bootstrapped components
+   * with their views.
+   */
+  destroy() {
+    if (this._destroyed) {
+      throw new RuntimeError(406, ngDevMode && "This instance of the `ApplicationRef` has already been destroyed.");
+    }
+    const injector = this._injector;
+    if (injector.destroy && !injector.destroyed) {
+      injector.destroy();
+    }
+  }
+  /**
+   * Returns the number of attached views.
+   */
+  get viewCount() {
+    return this._views.length;
+  }
+  static ɵfac = function ApplicationRef_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ApplicationRef)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _ApplicationRef, factory: _ApplicationRef.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationRef, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], () => [], null);
+})();
+function warnIfDestroyed(destroyed) {
+  if (destroyed) {
+    console.warn(formatRuntimeError(406, "This instance of the `ApplicationRef` has already been destroyed."));
+  }
+}
+function remove(list, el) {
+  const index = list.indexOf(el);
+  if (index > -1) {
+    list.splice(index, 1);
+  }
+}
+function scheduleDelayedTrigger(scheduleFn) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  renderPlaceholder(lView, tNode);
+  if (!shouldTriggerDeferBlock(0, lView))
+    return;
+  const injector = lView[INJECTOR];
+  const lDetails = getLDeferBlockDetails(lView, tNode);
+  const cleanupFn = scheduleFn(() => triggerDeferBlock(0, lView, tNode), injector);
+  storeTriggerCleanupFn(0, lDetails, cleanupFn);
+}
+function scheduleDelayedPrefetching(scheduleFn, trigger) {
+  if (false)
+    return;
+  const lView = getLView();
+  const injector = lView[INJECTOR];
+  const tNode = getCurrentTNode();
+  const tView = lView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+    const lDetails = getLDeferBlockDetails(lView, tNode);
+    const prefetch = () => triggerPrefetching(tDetails, lView, tNode);
+    const cleanupFn = scheduleFn(prefetch, injector);
+    storeTriggerCleanupFn(1, lDetails, cleanupFn);
+  }
+}
+function scheduleDelayedHydrating(scheduleFn, lView, tNode) {
+  if (false)
+    return;
+  const injector = lView[INJECTOR];
+  const lDetails = getLDeferBlockDetails(lView, tNode);
+  const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
+  ngDevMode && assertSsrIdDefined(ssrUniqueId);
+  const cleanupFn = scheduleFn(() => triggerHydrationFromBlockName(injector, ssrUniqueId), injector);
+  storeTriggerCleanupFn(2, lDetails, cleanupFn);
+}
+function triggerPrefetching(tDetails, lView, tNode) {
+  triggerResourceLoading(tDetails, lView, tNode);
+}
+function triggerResourceLoading(tDetails, lView, tNode) {
+  const injector = lView[INJECTOR];
+  const tView = lView[TVIEW];
+  if (tDetails.loadingState !== DeferDependenciesLoadingState.NOT_STARTED) {
+    return tDetails.loadingPromise ?? Promise.resolve();
+  }
+  const lDetails = getLDeferBlockDetails(lView, tNode);
+  const primaryBlockTNode = getPrimaryBlockTNode(tView, tDetails);
+  tDetails.loadingState = DeferDependenciesLoadingState.IN_PROGRESS;
+  invokeTriggerCleanupFns(1, lDetails);
+  let dependenciesFn = tDetails.dependencyResolverFn;
+  if (ngDevMode) {
+    const deferDependencyInterceptor = injector.get(DEFER_BLOCK_DEPENDENCY_INTERCEPTOR, null, {
+      optional: true
+    });
+    if (deferDependencyInterceptor) {
+      dependenciesFn = deferDependencyInterceptor.intercept(dependenciesFn);
+    }
+  }
+  const removeTask = injector.get(PendingTasks).add();
+  if (!dependenciesFn) {
+    tDetails.loadingPromise = Promise.resolve().then(() => {
+      tDetails.loadingPromise = null;
+      tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
+      removeTask();
+    });
+    return tDetails.loadingPromise;
+  }
+  tDetails.loadingPromise = Promise.allSettled(dependenciesFn()).then((results) => {
+    let failed = false;
+    const directiveDefs = [];
+    const pipeDefs = [];
+    for (const result of results) {
+      if (result.status === "fulfilled") {
+        const dependency = result.value;
+        const directiveDef = getComponentDef(dependency) || getDirectiveDef(dependency);
+        if (directiveDef) {
+          directiveDefs.push(directiveDef);
+        } else {
+          const pipeDef = getPipeDef(dependency);
+          if (pipeDef) {
+            pipeDefs.push(pipeDef);
+          }
+        }
+      } else {
+        failed = true;
+        break;
+      }
+    }
+    if (failed) {
+      tDetails.loadingState = DeferDependenciesLoadingState.FAILED;
+      if (tDetails.errorTmplIndex === null) {
+        const templateLocation = ngDevMode ? getTemplateLocationDetails(lView) : "";
+        const error = new RuntimeError(-750, ngDevMode && `Loading dependencies for \`@defer\` block failed, but no \`@error\` block was configured${templateLocation}. Consider using the \`@error\` block to render an error state.`);
+        handleUncaughtError(lView, error);
+      }
+    } else {
+      tDetails.loadingState = DeferDependenciesLoadingState.COMPLETE;
+      const primaryBlockTView = primaryBlockTNode.tView;
+      if (directiveDefs.length > 0) {
+        primaryBlockTView.directiveRegistry = addDepsToRegistry(primaryBlockTView.directiveRegistry, directiveDefs);
+        const directiveTypes = directiveDefs.map((def) => def.type);
+        const providers = internalImportProvidersFrom(false, ...directiveTypes);
+        tDetails.providers = providers;
+      }
+      if (pipeDefs.length > 0) {
+        primaryBlockTView.pipeRegistry = addDepsToRegistry(primaryBlockTView.pipeRegistry, pipeDefs);
+      }
+    }
+  });
+  return tDetails.loadingPromise.finally(() => {
+    tDetails.loadingPromise = null;
+    removeTask();
+  });
+}
+function shouldTriggerDeferBlock(triggerType, lView) {
+  if (triggerType === 0 && true && false) {
+    return false;
+  }
+  const injector = lView[INJECTOR];
+  const config2 = injector.get(DEFER_BLOCK_CONFIG, null, { optional: true });
+  if (config2?.behavior === DeferBlockBehavior.Manual) {
+    return false;
+  }
+  return true;
+}
+function triggerDeferBlock(triggerType, lView, tNode) {
+  const tView = lView[TVIEW];
+  const lContainer = lView[tNode.index];
+  ngDevMode && assertLContainer(lContainer);
+  if (!shouldTriggerDeferBlock(triggerType, lView))
+    return;
+  const lDetails = getLDeferBlockDetails(lView, tNode);
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  invokeAllTriggerCleanupFns(lDetails);
+  switch (tDetails.loadingState) {
+    case DeferDependenciesLoadingState.NOT_STARTED:
+      renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
+      triggerResourceLoading(tDetails, lView, tNode);
+      if (tDetails.loadingState === DeferDependenciesLoadingState.IN_PROGRESS) {
+        renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
+      }
+      break;
+    case DeferDependenciesLoadingState.IN_PROGRESS:
+      renderDeferBlockState(DeferBlockState.Loading, tNode, lContainer);
+      renderDeferStateAfterResourceLoading(tDetails, tNode, lContainer);
+      break;
+    case DeferDependenciesLoadingState.COMPLETE:
+      ngDevMode && assertDeferredDependenciesLoaded(tDetails);
+      renderDeferBlockState(DeferBlockState.Complete, tNode, lContainer);
+      break;
+    case DeferDependenciesLoadingState.FAILED:
+      renderDeferBlockState(DeferBlockState.Error, tNode, lContainer);
+      break;
+    default:
+      if (ngDevMode) {
+        throwError2("Unknown defer block state");
+      }
+  }
+}
+function triggerHydrationFromBlockName(injector, blockName, replayQueuedEventsFn) {
+  return __async(this, null, function* () {
+    const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
+    if (blocksBeingHydrated.has(blockName)) {
+      return;
+    }
+    const { parentBlockPromise, hydrationQueue } = getParentBlockHydrationQueue(blockName, injector);
+    if (hydrationQueue.length === 0)
+      return;
+    if (parentBlockPromise !== null) {
+      hydrationQueue.shift();
+    }
+    populateHydratingStateForQueue(dehydratedBlockRegistry, hydrationQueue);
+    if (parentBlockPromise !== null) {
+      yield parentBlockPromise;
+    }
+    const topmostParentBlock = hydrationQueue[0];
+    if (dehydratedBlockRegistry.has(topmostParentBlock)) {
+      yield triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn);
+    } else {
+      dehydratedBlockRegistry.awaitParentBlock(topmostParentBlock, () => __async(null, null, function* () {
+        return yield triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn);
+      }));
+    }
+  });
+}
+function triggerHydrationForBlockQueue(injector, hydrationQueue, replayQueuedEventsFn) {
+  return __async(this, null, function* () {
+    const dehydratedBlockRegistry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
+    const pendingTasks = injector.get(PendingTasksInternal);
+    const taskId = pendingTasks.add();
+    for (let blockQueueIdx = 0; blockQueueIdx < hydrationQueue.length; blockQueueIdx++) {
+      const dehydratedBlockId = hydrationQueue[blockQueueIdx];
+      const dehydratedDeferBlock = dehydratedBlockRegistry.get(dehydratedBlockId);
+      if (dehydratedDeferBlock != null) {
+        yield triggerResourceLoadingForHydration(dehydratedDeferBlock);
+        yield nextRender(injector);
+        if (deferBlockHasErrored(dehydratedDeferBlock)) {
+          removeDehydratedViewList(dehydratedDeferBlock);
+          cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
+          break;
+        }
+        blocksBeingHydrated.get(dehydratedBlockId).resolve();
+      } else {
+        cleanupParentContainer(blockQueueIdx, hydrationQueue, dehydratedBlockRegistry);
+        cleanupRemainingHydrationQueue(hydrationQueue.slice(blockQueueIdx), dehydratedBlockRegistry);
+        break;
+      }
+    }
+    const lastBlockName = hydrationQueue[hydrationQueue.length - 1];
+    yield blocksBeingHydrated.get(lastBlockName)?.promise;
+    pendingTasks.remove(taskId);
+    if (replayQueuedEventsFn) {
+      replayQueuedEventsFn(hydrationQueue);
+    }
+    cleanupHydratedDeferBlocks(dehydratedBlockRegistry.get(lastBlockName), hydrationQueue, dehydratedBlockRegistry, injector.get(ApplicationRef));
+  });
+}
+function deferBlockHasErrored(deferBlock) {
+  return getLDeferBlockDetails(deferBlock.lView, deferBlock.tNode)[DEFER_BLOCK_STATE] === DeferBlockState.Error;
+}
+function cleanupParentContainer(currentBlockIdx, hydrationQueue, dehydratedBlockRegistry) {
+  const parentDeferBlockIdx = currentBlockIdx - 1;
+  const parentDeferBlock = parentDeferBlockIdx > -1 ? dehydratedBlockRegistry.get(hydrationQueue[parentDeferBlockIdx]) : null;
+  if (parentDeferBlock) {
+    cleanupLContainer(parentDeferBlock.lContainer);
+  }
+}
+function cleanupRemainingHydrationQueue(hydrationQueue, dehydratedBlockRegistry) {
+  const blocksBeingHydrated = dehydratedBlockRegistry.hydrating;
+  for (const dehydratedBlockId in hydrationQueue) {
+    blocksBeingHydrated.get(dehydratedBlockId)?.reject();
+  }
+  dehydratedBlockRegistry.cleanup(hydrationQueue);
+}
+function populateHydratingStateForQueue(registry, queue2) {
+  for (let blockId of queue2) {
+    registry.hydrating.set(blockId, Promise.withResolvers());
+  }
+}
+function nextRender(injector) {
+  return new Promise((resolveFn) => afterNextRender(resolveFn, { injector }));
+}
+function triggerResourceLoadingForHydration(dehydratedBlock) {
+  return __async(this, null, function* () {
+    const { tNode, lView } = dehydratedBlock;
+    const lDetails = getLDeferBlockDetails(lView, tNode);
+    return new Promise((resolve) => {
+      onDeferBlockCompletion(lDetails, resolve);
+      triggerDeferBlock(2, lView, tNode);
+    });
+  });
+}
+function onDeferBlockCompletion(lDetails, callback) {
+  if (!Array.isArray(lDetails[ON_COMPLETE_FNS])) {
+    lDetails[ON_COMPLETE_FNS] = [];
+  }
+  lDetails[ON_COMPLETE_FNS].push(callback);
+}
+function shouldAttachTrigger(triggerType, lView, tNode) {
+  if (triggerType === 0) {
+    return shouldAttachRegularTrigger(lView, tNode);
+  } else if (triggerType === 2) {
+    return !shouldAttachRegularTrigger(lView, tNode);
+  }
+  return true;
+}
+function hasHydrateTriggers(flags) {
+  return flags != null && (flags & 1) === 1;
+}
+function shouldAttachRegularTrigger(lView, tNode) {
+  const injector = lView[INJECTOR];
+  const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
+  const incrementalHydrationEnabled = isIncrementalHydrationEnabled(injector);
+  const _hasHydrateTriggers = hasHydrateTriggers(tDetails.flags);
+  if (false) {
+    return !incrementalHydrationEnabled || !_hasHydrateTriggers;
+  }
+  const lDetails = getLDeferBlockDetails(lView, tNode);
+  const wasServerSideRendered = lDetails[SSR_UNIQUE_ID] !== null;
+  if (_hasHydrateTriggers && wasServerSideRendered && incrementalHydrationEnabled) {
+    return false;
+  }
+  return true;
+}
+function getHydrateTriggers(tView, tNode) {
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  return tDetails.hydrateTriggers ??= /* @__PURE__ */ new Map();
+}
+function processAndInitTriggers(injector, blockData, nodes) {
+  const idleElements = [];
+  const timerElements = [];
+  const viewportElements = [];
+  const immediateElements = [];
+  for (let [blockId, blockSummary] of blockData) {
+    const commentNode = nodes.get(blockId);
+    if (commentNode !== void 0) {
+      const numRootNodes = blockSummary.data[NUM_ROOT_NODES];
+      let currentNode = commentNode;
+      for (let i = 0; i < numRootNodes; i++) {
+        currentNode = currentNode.previousSibling;
+        if (currentNode.nodeType !== Node.ELEMENT_NODE) {
+          continue;
+        }
+        const elementTrigger = { el: currentNode, blockName: blockId };
+        if (blockSummary.hydrate.idle) {
+          idleElements.push(elementTrigger);
+        }
+        if (blockSummary.hydrate.immediate) {
+          immediateElements.push(elementTrigger);
+        }
+        if (blockSummary.hydrate.timer !== null) {
+          elementTrigger.delay = blockSummary.hydrate.timer;
+          timerElements.push(elementTrigger);
+        }
+        if (blockSummary.hydrate.viewport) {
+          viewportElements.push(elementTrigger);
+        }
+      }
+    }
+  }
+  setIdleTriggers(injector, idleElements);
+  setImmediateTriggers(injector, immediateElements);
+  setViewportTriggers(injector, viewportElements);
+  setTimerTriggers(injector, timerElements);
+}
+function setIdleTriggers(injector, elementTriggers) {
+  for (const elementTrigger of elementTriggers) {
+    const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);
+    const cleanupFn = onIdle(onInvoke, injector);
+    registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
+  }
+}
+function setViewportTriggers(injector, elementTriggers) {
+  if (elementTriggers.length > 0) {
+    const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    for (let elementTrigger of elementTriggers) {
+      const cleanupFn = onViewportWrapper(elementTrigger.el, () => triggerHydrationFromBlockName(injector, elementTrigger.blockName), injector);
+      registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
+    }
+  }
+}
+function setTimerTriggers(injector, elementTriggers) {
+  for (const elementTrigger of elementTriggers) {
+    const registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    const onInvoke = () => triggerHydrationFromBlockName(injector, elementTrigger.blockName);
+    const timerFn = onTimer(elementTrigger.delay);
+    const cleanupFn = timerFn(onInvoke, injector);
+    registry.addCleanupFn(elementTrigger.blockName, cleanupFn);
+  }
+}
+function setImmediateTriggers(injector, elementTriggers) {
+  for (const elementTrigger of elementTriggers) {
+    triggerHydrationFromBlockName(injector, elementTrigger.blockName);
+  }
+}
+var _hmrWarningProduced = false;
+function logHmrWarning(injector) {
+  if (!_hmrWarningProduced) {
+    _hmrWarningProduced = true;
+    const console2 = injector.get(Console);
+    console2.log(formatRuntimeError(-751, "Angular has detected that this application contains `@defer` blocks and the hot module replacement (HMR) mode is enabled. All `@defer` block dependencies will be loaded eagerly."));
+  }
+}
+function ɵɵdefer(index, primaryTmplIndex, dependencyResolverFn, loadingTmplIndex, placeholderTmplIndex, errorTmplIndex, loadingConfigIndex, placeholderConfigIndex, enableTimerScheduling, flags) {
+  const lView = getLView();
+  const tView = getTView();
+  const adjustedIndex = index + HEADER_OFFSET;
+  const tNode = declareTemplate(lView, tView, index, null, 0, 0);
+  const injector = lView[INJECTOR];
+  if (tView.firstCreatePass) {
+    performanceMarkFeature("NgDefer");
+    if (ngDevMode) {
+      if (true) {
+        logHmrWarning(injector);
+      }
+      if (hasHydrateTriggers(flags)) {
+        assertIncrementalHydrationIsConfigured(injector);
+      }
+    }
+    const tDetails = {
+      primaryTmplIndex,
+      loadingTmplIndex: loadingTmplIndex ?? null,
+      placeholderTmplIndex: placeholderTmplIndex ?? null,
+      errorTmplIndex: errorTmplIndex ?? null,
+      placeholderBlockConfig: null,
+      loadingBlockConfig: null,
+      dependencyResolverFn: dependencyResolverFn ?? null,
+      loadingState: DeferDependenciesLoadingState.NOT_STARTED,
+      loadingPromise: null,
+      providers: null,
+      hydrateTriggers: null,
+      debug: null,
+      flags: flags ?? 0
+    };
+    enableTimerScheduling?.(tView, tDetails, placeholderConfigIndex, loadingConfigIndex);
+    setTDeferBlockDetails(tView, adjustedIndex, tDetails);
+  }
+  const lContainer = lView[adjustedIndex];
+  populateDehydratedViewsInLContainer(lContainer, tNode, lView);
+  let ssrBlockState = null;
+  let ssrUniqueId = null;
+  if (lContainer[DEHYDRATED_VIEWS]?.length > 0) {
+    const info = lContainer[DEHYDRATED_VIEWS][0].data;
+    ssrUniqueId = info[DEFER_BLOCK_ID] ?? null;
+    ssrBlockState = info[DEFER_BLOCK_STATE$1];
+  }
+  const lDetails = [
+    null,
+    // NEXT_DEFER_BLOCK_STATE
+    DeferBlockInternalState.Initial,
+    // DEFER_BLOCK_STATE
+    null,
+    // STATE_IS_FROZEN_UNTIL
+    null,
+    // LOADING_AFTER_CLEANUP_FN
+    null,
+    // TRIGGER_CLEANUP_FNS
+    null,
+    // PREFETCH_TRIGGER_CLEANUP_FNS
+    ssrUniqueId,
+    // SSR_UNIQUE_ID
+    ssrBlockState,
+    // SSR_BLOCK_STATE
+    null,
+    // ON_COMPLETE_FNS
+    null
+    // HYDRATE_TRIGGER_CLEANUP_FNS
+  ];
+  setLDeferBlockDetails(lView, adjustedIndex, lDetails);
+  let registry = null;
+  if (ssrUniqueId !== null) {
+    registry = injector.get(DEHYDRATED_BLOCK_REGISTRY);
+    registry.add(ssrUniqueId, { lView, tNode, lContainer });
+  }
+  const onLViewDestroy = () => {
+    invokeAllTriggerCleanupFns(lDetails);
+    if (ssrUniqueId !== null) {
+      registry?.cleanup([ssrUniqueId]);
+    }
+  };
+  storeTriggerCleanupFn(0, lDetails, () => removeLViewOnDestroy(lView, onLViewDestroy));
+  storeLViewOnDestroy(lView, onLViewDestroy);
+}
+function ɵɵdeferWhen(rawValue) {
+  const lView = getLView();
+  const tNode = getSelectedTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "when <expression>");
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, rawValue)) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      const value = Boolean(rawValue);
+      const lDetails = getLDeferBlockDetails(lView, tNode);
+      const renderedState = lDetails[DEFER_BLOCK_STATE];
+      if (value === false && renderedState === DeferBlockInternalState.Initial) {
+        renderPlaceholder(lView, tNode);
+      } else if (value === true && (renderedState === DeferBlockInternalState.Initial || renderedState === DeferBlockState.Placeholder)) {
+        triggerDeferBlock(0, lView, tNode);
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}
+function ɵɵdeferPrefetchWhen(rawValue) {
+  const lView = getLView();
+  const tNode = getSelectedTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "prefetch when <expression>");
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, rawValue)) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      const value = Boolean(rawValue);
+      const tView = lView[TVIEW];
+      const tNode2 = getSelectedTNode();
+      const tDetails = getTDeferBlockDetails(tView, tNode2);
+      if (value === true && tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+        triggerPrefetching(tDetails, lView, tNode2);
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}
+function ɵɵdeferHydrateWhen(rawValue) {
+  const lView = getLView();
+  const tNode = getSelectedTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate when <expression>");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const bindingIndex = nextBindingIndex();
+  const tView = getTView();
+  const hydrateTriggers = getHydrateTriggers(tView, tNode);
+  hydrateTriggers.set(6, null);
+  if (bindingUpdated(lView, bindingIndex, rawValue)) {
+    if (false) {
+      triggerDeferBlock(2, lView, tNode);
+    } else {
+      const injector = lView[INJECTOR];
+      const prevConsumer = setActiveConsumer(null);
+      try {
+        const value = Boolean(rawValue);
+        if (value === true) {
+          const lDetails = getLDeferBlockDetails(lView, tNode);
+          const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
+          ngDevMode && assertSsrIdDefined(ssrUniqueId);
+          triggerHydrationFromBlockName(injector, ssrUniqueId);
+        }
+      } finally {
+        setActiveConsumer(prevConsumer);
+      }
+    }
+  }
+}
+function ɵɵdeferHydrateNever() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate never");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(7, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  }
+}
+function ɵɵdeferOnIdle() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "on idle");
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  scheduleDelayedTrigger(onIdle);
+}
+function ɵɵdeferPrefetchOnIdle() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "prefetch on idle");
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  scheduleDelayedPrefetching(onIdle);
+}
+function ɵɵdeferHydrateOnIdle() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate on idle");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(0, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  } else {
+    scheduleDelayedHydrating(onIdle, lView, tNode);
+  }
+}
+function ɵɵdeferOnImmediate() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "on immediate");
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
+  if (tDetails.loadingTmplIndex === null) {
+    renderPlaceholder(lView, tNode);
+  }
+  triggerDeferBlock(0, lView, tNode);
+}
+function ɵɵdeferPrefetchOnImmediate() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "prefetch on immediate");
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  const tView = lView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+    triggerResourceLoading(tDetails, lView, tNode);
+  }
+}
+function ɵɵdeferHydrateOnImmediate() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate on immediate");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(1, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  } else {
+    const injector = lView[INJECTOR];
+    const lDetails = getLDeferBlockDetails(lView, tNode);
+    const ssrUniqueId = lDetails[SSR_UNIQUE_ID];
+    ngDevMode && assertSsrIdDefined(ssrUniqueId);
+    triggerHydrationFromBlockName(injector, ssrUniqueId);
+  }
+}
+function ɵɵdeferOnTimer(delay2) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `on timer(${delay2}ms)`);
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  scheduleDelayedTrigger(onTimer(delay2));
+}
+function ɵɵdeferPrefetchOnTimer(delay2) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on timer(${delay2}ms)`);
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  scheduleDelayedPrefetching(onTimer(delay2));
+}
+function ɵɵdeferHydrateOnTimer(delay2) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `hydrate on timer(${delay2}ms)`);
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(5, { delay: delay2 });
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  } else {
+    scheduleDelayedHydrating(onTimer(delay2), lView, tNode);
+  }
+}
+function ɵɵdeferOnHover(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `on hover${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  renderPlaceholder(lView, tNode);
+  if (true) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onHover,
+      () => triggerDeferBlock(0, lView, tNode),
+      0
+      /* TriggerType.Regular */
+    );
+  }
+}
+function ɵɵdeferPrefetchOnHover(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on hover${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  const tView = lView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onHover,
+      () => triggerPrefetching(tDetails, lView, tNode),
+      1
+      /* TriggerType.Prefetch */
+    );
+  }
+}
+function ɵɵdeferHydrateOnHover() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate on hover");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(4, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  }
+}
+function ɵɵdeferOnInteraction(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `on interaction${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  renderPlaceholder(lView, tNode);
+  if (true) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onInteraction,
+      () => triggerDeferBlock(0, lView, tNode),
+      0
+      /* TriggerType.Regular */
+    );
+  }
+}
+function ɵɵdeferPrefetchOnInteraction(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on interaction${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  const tView = lView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onInteraction,
+      () => triggerPrefetching(tDetails, lView, tNode),
+      1
+      /* TriggerType.Prefetch */
+    );
+  }
+}
+function ɵɵdeferHydrateOnInteraction() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate on interaction");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(3, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  }
+}
+function ɵɵdeferOnViewport(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `on viewport${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(0, lView, tNode))
+    return;
+  renderPlaceholder(lView, tNode);
+  if (true) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onViewportWrapper,
+      () => triggerDeferBlock(0, lView, tNode),
+      0
+      /* TriggerType.Regular */
+    );
+  }
+}
+function ɵɵdeferPrefetchOnViewport(triggerIndex, walkUpTimes) {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, `prefetch on viewport${walkUpTimes === -1 ? "" : "(<target>)"}`);
+  }
+  if (!shouldAttachTrigger(1, lView, tNode))
+    return;
+  const tView = lView[TVIEW];
+  const tDetails = getTDeferBlockDetails(tView, tNode);
+  if (tDetails.loadingState === DeferDependenciesLoadingState.NOT_STARTED) {
+    registerDomTrigger(
+      lView,
+      tNode,
+      triggerIndex,
+      walkUpTimes,
+      onViewportWrapper,
+      () => triggerPrefetching(tDetails, lView, tNode),
+      1
+      /* TriggerType.Prefetch */
+    );
+  }
+}
+function ɵɵdeferHydrateOnViewport() {
+  const lView = getLView();
+  const tNode = getCurrentTNode();
+  if (ngDevMode) {
+    trackTriggerForDebugging(lView[TVIEW], tNode, "hydrate on viewport");
+  }
+  if (!shouldAttachTrigger(2, lView, tNode))
+    return;
+  const hydrateTriggers = getHydrateTriggers(getTView(), tNode);
+  hydrateTriggers.set(2, null);
+  if (false) {
+    triggerDeferBlock(2, lView, tNode);
+  }
+}
+function ɵɵattribute(name, value, sanitizer, namespace) {
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = getTView();
+    const tNode = getSelectedTNode();
+    elementAttributeInternal(tNode, lView, name, value, sanitizer, namespace);
+    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, "attr." + name, bindingIndex);
+  }
+  return ɵɵattribute;
+}
+function ɵɵcomponentInstance() {
+  const instance = getLView()[DECLARATION_COMPONENT_VIEW][CONTEXT];
+  ngDevMode && assertDefined(instance, "Expected component instance to be defined");
+  return instance;
+}
+var LiveCollection = class {
+  destroy(item) {
+  }
+  updateValue(index, value) {
+  }
+  // operations below could be implemented on top of the operations defined so far, but having
+  // them explicitly allow clear expression of intent and potentially more performant
+  // implementations
+  swap(index1, index2) {
+    const startIdx = Math.min(index1, index2);
+    const endIdx = Math.max(index1, index2);
+    const endItem = this.detach(endIdx);
+    if (endIdx - startIdx > 1) {
+      const startItem = this.detach(startIdx);
+      this.attach(startIdx, endItem);
+      this.attach(endIdx, startItem);
+    } else {
+      this.attach(startIdx, endItem);
+    }
+  }
+  move(prevIndex, newIdx) {
+    this.attach(newIdx, this.detach(prevIndex));
+  }
+};
+function valuesMatching(liveIdx, liveValue, newIdx, newValue, trackBy) {
+  if (liveIdx === newIdx && Object.is(liveValue, newValue)) {
+    return 1;
+  } else if (Object.is(trackBy(liveIdx, liveValue), trackBy(newIdx, newValue))) {
+    return -1;
+  }
+  return 0;
+}
+function recordDuplicateKeys(keyToIdx, key, idx) {
+  const idxSoFar = keyToIdx.get(key);
+  if (idxSoFar !== void 0) {
+    idxSoFar.add(idx);
+  } else {
+    keyToIdx.set(key, /* @__PURE__ */ new Set([idx]));
+  }
+}
+function reconcile(liveCollection, newCollection, trackByFn) {
+  let detachedItems = void 0;
+  let liveKeysInTheFuture = void 0;
+  let liveStartIdx = 0;
+  let liveEndIdx = liveCollection.length - 1;
+  const duplicateKeys = ngDevMode ? /* @__PURE__ */ new Map() : void 0;
+  if (Array.isArray(newCollection)) {
+    let newEndIdx = newCollection.length - 1;
+    while (liveStartIdx <= liveEndIdx && liveStartIdx <= newEndIdx) {
+      const liveStartValue = liveCollection.at(liveStartIdx);
+      const newStartValue = newCollection[liveStartIdx];
+      if (ngDevMode) {
+        recordDuplicateKeys(duplicateKeys, trackByFn(liveStartIdx, newStartValue), liveStartIdx);
+      }
+      const isStartMatching = valuesMatching(liveStartIdx, liveStartValue, liveStartIdx, newStartValue, trackByFn);
+      if (isStartMatching !== 0) {
+        if (isStartMatching < 0) {
+          liveCollection.updateValue(liveStartIdx, newStartValue);
+        }
+        liveStartIdx++;
+        continue;
+      }
+      const liveEndValue = liveCollection.at(liveEndIdx);
+      const newEndValue = newCollection[newEndIdx];
+      if (ngDevMode) {
+        recordDuplicateKeys(duplicateKeys, trackByFn(newEndIdx, newEndValue), newEndIdx);
+      }
+      const isEndMatching = valuesMatching(liveEndIdx, liveEndValue, newEndIdx, newEndValue, trackByFn);
+      if (isEndMatching !== 0) {
+        if (isEndMatching < 0) {
+          liveCollection.updateValue(liveEndIdx, newEndValue);
+        }
+        liveEndIdx--;
+        newEndIdx--;
+        continue;
+      }
+      const liveStartKey = trackByFn(liveStartIdx, liveStartValue);
+      const liveEndKey = trackByFn(liveEndIdx, liveEndValue);
+      const newStartKey = trackByFn(liveStartIdx, newStartValue);
+      if (Object.is(newStartKey, liveEndKey)) {
+        const newEndKey = trackByFn(newEndIdx, newEndValue);
+        if (Object.is(newEndKey, liveStartKey)) {
+          liveCollection.swap(liveStartIdx, liveEndIdx);
+          liveCollection.updateValue(liveEndIdx, newEndValue);
+          newEndIdx--;
+          liveEndIdx--;
+        } else {
+          liveCollection.move(liveEndIdx, liveStartIdx);
+        }
+        liveCollection.updateValue(liveStartIdx, newStartValue);
+        liveStartIdx++;
+        continue;
+      }
+      detachedItems ??= new UniqueValueMultiKeyMap();
+      liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
+      if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newStartKey)) {
+        liveCollection.updateValue(liveStartIdx, newStartValue);
+        liveStartIdx++;
+        liveEndIdx++;
+      } else if (!liveKeysInTheFuture.has(newStartKey)) {
+        const newItem = liveCollection.create(liveStartIdx, newCollection[liveStartIdx]);
+        liveCollection.attach(liveStartIdx, newItem);
+        liveStartIdx++;
+        liveEndIdx++;
+      } else {
+        detachedItems.set(liveStartKey, liveCollection.detach(liveStartIdx));
+        liveEndIdx--;
+      }
+    }
+    while (liveStartIdx <= newEndIdx) {
+      createOrAttach(liveCollection, detachedItems, trackByFn, liveStartIdx, newCollection[liveStartIdx]);
+      liveStartIdx++;
+    }
+  } else if (newCollection != null) {
+    const newCollectionIterator = newCollection[Symbol.iterator]();
+    let newIterationResult = newCollectionIterator.next();
+    while (!newIterationResult.done && liveStartIdx <= liveEndIdx) {
+      const liveValue = liveCollection.at(liveStartIdx);
+      const newValue = newIterationResult.value;
+      if (ngDevMode) {
+        recordDuplicateKeys(duplicateKeys, trackByFn(liveStartIdx, newValue), liveStartIdx);
+      }
+      const isStartMatching = valuesMatching(liveStartIdx, liveValue, liveStartIdx, newValue, trackByFn);
+      if (isStartMatching !== 0) {
+        if (isStartMatching < 0) {
+          liveCollection.updateValue(liveStartIdx, newValue);
+        }
+        liveStartIdx++;
+        newIterationResult = newCollectionIterator.next();
+      } else {
+        detachedItems ??= new UniqueValueMultiKeyMap();
+        liveKeysInTheFuture ??= initLiveItemsInTheFuture(liveCollection, liveStartIdx, liveEndIdx, trackByFn);
+        const newKey = trackByFn(liveStartIdx, newValue);
+        if (attachPreviouslyDetached(liveCollection, detachedItems, liveStartIdx, newKey)) {
+          liveCollection.updateValue(liveStartIdx, newValue);
+          liveStartIdx++;
+          liveEndIdx++;
+          newIterationResult = newCollectionIterator.next();
+        } else if (!liveKeysInTheFuture.has(newKey)) {
+          liveCollection.attach(liveStartIdx, liveCollection.create(liveStartIdx, newValue));
+          liveStartIdx++;
+          liveEndIdx++;
+          newIterationResult = newCollectionIterator.next();
+        } else {
+          const liveKey = trackByFn(liveStartIdx, liveValue);
+          detachedItems.set(liveKey, liveCollection.detach(liveStartIdx));
+          liveEndIdx--;
+        }
+      }
+    }
+    while (!newIterationResult.done) {
+      createOrAttach(liveCollection, detachedItems, trackByFn, liveCollection.length, newIterationResult.value);
+      newIterationResult = newCollectionIterator.next();
+    }
+  }
+  while (liveStartIdx <= liveEndIdx) {
+    liveCollection.destroy(liveCollection.detach(liveEndIdx--));
+  }
+  detachedItems?.forEach((item) => {
+    liveCollection.destroy(item);
+  });
+  if (ngDevMode) {
+    let duplicatedKeysMsg = [];
+    for (const [key, idxSet] of duplicateKeys) {
+      if (idxSet.size > 1) {
+        const idx = [...idxSet].sort((a, b) => a - b);
+        for (let i = 1; i < idx.length; i++) {
+          duplicatedKeysMsg.push(`key "${stringifyForError(key)}" at index "${idx[i - 1]}" and "${idx[i]}"`);
+        }
+      }
+    }
+    if (duplicatedKeysMsg.length > 0) {
+      const message = formatRuntimeError(-955, "The provided track expression resulted in duplicated keys for a given collection. Adjust the tracking expression such that it uniquely identifies all the items in the collection. Duplicated keys were: \n" + duplicatedKeysMsg.join(", \n") + ".");
+      console.warn(message);
+    }
+  }
+}
+function attachPreviouslyDetached(prevCollection, detachedItems, index, key) {
+  if (detachedItems !== void 0 && detachedItems.has(key)) {
+    prevCollection.attach(index, detachedItems.get(key));
+    detachedItems.delete(key);
+    return true;
+  }
+  return false;
+}
+function createOrAttach(liveCollection, detachedItems, trackByFn, index, value) {
+  if (!attachPreviouslyDetached(liveCollection, detachedItems, index, trackByFn(index, value))) {
+    const newItem = liveCollection.create(index, value);
+    liveCollection.attach(index, newItem);
+  } else {
+    liveCollection.updateValue(index, value);
+  }
+}
+function initLiveItemsInTheFuture(liveCollection, start, end, trackByFn) {
+  const keys = /* @__PURE__ */ new Set();
+  for (let i = start; i <= end; i++) {
+    keys.add(trackByFn(i, liveCollection.at(i)));
+  }
+  return keys;
+}
+var UniqueValueMultiKeyMap = class {
+  // A map from a key to the first value corresponding to this key.
+  kvMap = /* @__PURE__ */ new Map();
+  // A map that acts as a linked list of values - each value maps to the next value in this "linked
+  // list" (this only works if values are unique). Allocated lazily to avoid memory consumption when
+  // there are no duplicated values.
+  _vMap = void 0;
+  has(key) {
+    return this.kvMap.has(key);
+  }
+  delete(key) {
+    if (!this.has(key))
+      return false;
+    const value = this.kvMap.get(key);
+    if (this._vMap !== void 0 && this._vMap.has(value)) {
+      this.kvMap.set(key, this._vMap.get(value));
+      this._vMap.delete(value);
+    } else {
+      this.kvMap.delete(key);
+    }
+    return true;
+  }
+  get(key) {
+    return this.kvMap.get(key);
+  }
+  set(key, value) {
+    if (this.kvMap.has(key)) {
+      let prevValue = this.kvMap.get(key);
+      if (ngDevMode && prevValue === value) {
+        throw new Error(`Detected a duplicated value ${value} for the key ${key}`);
+      }
+      if (this._vMap === void 0) {
+        this._vMap = /* @__PURE__ */ new Map();
+      }
+      const vMap = this._vMap;
+      while (vMap.has(prevValue)) {
+        prevValue = vMap.get(prevValue);
+      }
+      vMap.set(prevValue, value);
+    } else {
+      this.kvMap.set(key, value);
+    }
+  }
+  forEach(cb) {
+    for (let [key, value] of this.kvMap) {
+      cb(value, key);
+      if (this._vMap !== void 0) {
+        const vMap = this._vMap;
+        while (vMap.has(value)) {
+          value = vMap.get(value);
+          cb(value, key);
+        }
+      }
+    }
+  }
+};
+function ɵɵconditionalCreate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
+  performanceMarkFeature("NgControlFlow");
+  const lView = getLView();
+  const tView = getTView();
+  const attrs = getConstant(tView.consts, attrsIndex);
+  declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, 256, localRefsIndex, localRefExtractor);
+  return ɵɵconditionalBranchCreate;
+}
+function ɵɵconditionalBranchCreate(index, templateFn, decls, vars, tagName, attrsIndex, localRefsIndex, localRefExtractor) {
+  performanceMarkFeature("NgControlFlow");
+  const lView = getLView();
+  const tView = getTView();
+  const attrs = getConstant(tView.consts, attrsIndex);
+  declareTemplate(lView, tView, index, templateFn, decls, vars, tagName, attrs, 512, localRefsIndex, localRefExtractor);
+  return ɵɵconditionalBranchCreate;
+}
+function ɵɵconditional(matchingTemplateIndex, contextValue) {
+  performanceMarkFeature("NgControlFlow");
+  const hostLView = getLView();
+  const bindingIndex = nextBindingIndex();
+  const prevMatchingTemplateIndex = hostLView[bindingIndex] !== NO_CHANGE ? hostLView[bindingIndex] : -1;
+  const prevContainer = prevMatchingTemplateIndex !== -1 ? getLContainer(hostLView, HEADER_OFFSET + prevMatchingTemplateIndex) : void 0;
+  const viewInContainerIdx = 0;
+  if (bindingUpdated(hostLView, bindingIndex, matchingTemplateIndex)) {
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      if (prevContainer !== void 0) {
+        removeLViewFromLContainer(prevContainer, viewInContainerIdx);
+      }
+      if (matchingTemplateIndex !== -1) {
+        const nextLContainerIndex = HEADER_OFFSET + matchingTemplateIndex;
+        const nextContainer = getLContainer(hostLView, nextLContainerIndex);
+        const templateTNode = getExistingTNode(hostLView[TVIEW], nextLContainerIndex);
+        const dehydratedView = findAndReconcileMatchingDehydratedViews(nextContainer, templateTNode, hostLView);
+        const embeddedLView = createAndRenderEmbeddedLView(hostLView, templateTNode, contextValue, {
+          dehydratedView
+        });
+        addLViewToLContainer(nextContainer, embeddedLView, viewInContainerIdx, shouldAddViewToDom(templateTNode, dehydratedView));
+      }
+    } finally {
+      setActiveConsumer(prevConsumer);
+    }
+  } else if (prevContainer !== void 0) {
+    const lView = getLViewFromLContainer(prevContainer, viewInContainerIdx);
+    if (lView !== void 0) {
+      lView[CONTEXT] = contextValue;
+    }
+  }
+}
+var RepeaterContext = class {
+  lContainer;
+  $implicit;
+  $index;
+  constructor(lContainer, $implicit, $index) {
+    this.lContainer = lContainer;
+    this.$implicit = $implicit;
+    this.$index = $index;
+  }
+  get $count() {
+    return this.lContainer.length - CONTAINER_HEADER_OFFSET;
+  }
+};
+function ɵɵrepeaterTrackByIndex(index) {
+  return index;
+}
+function ɵɵrepeaterTrackByIdentity(_, value) {
+  return value;
+}
+var RepeaterMetadata = class {
+  hasEmptyBlock;
+  trackByFn;
+  liveCollection;
+  constructor(hasEmptyBlock, trackByFn, liveCollection) {
+    this.hasEmptyBlock = hasEmptyBlock;
+    this.trackByFn = trackByFn;
+    this.liveCollection = liveCollection;
+  }
+};
+function ɵɵrepeaterCreate(index, templateFn, decls, vars, tagName, attrsIndex, trackByFn, trackByUsesComponentInstance, emptyTemplateFn, emptyDecls, emptyVars, emptyTagName, emptyAttrsIndex) {
+  performanceMarkFeature("NgControlFlow");
+  ngDevMode && assertFunction(trackByFn, `A track expression must be a function, was ${typeof trackByFn} instead.`);
+  const lView = getLView();
+  const tView = getTView();
+  const hasEmptyBlock = emptyTemplateFn !== void 0;
+  const hostLView = getLView();
+  const boundTrackBy = trackByUsesComponentInstance ? (
+    // We only want to bind when necessary, because it produces a
+    // new function. For pure functions it's not necessary.
+    trackByFn.bind(hostLView[DECLARATION_COMPONENT_VIEW][CONTEXT])
+  ) : trackByFn;
+  const metadata = new RepeaterMetadata(hasEmptyBlock, boundTrackBy);
+  hostLView[HEADER_OFFSET + index] = metadata;
+  declareTemplate(
+    lView,
+    tView,
+    index + 1,
+    templateFn,
+    decls,
+    vars,
+    tagName,
+    getConstant(tView.consts, attrsIndex),
+    256
+    /* TNodeFlags.isControlFlowStart */
+  );
+  if (hasEmptyBlock) {
+    ngDevMode && assertDefined(emptyDecls, "Missing number of declarations for the empty repeater block.");
+    ngDevMode && assertDefined(emptyVars, "Missing number of bindings for the empty repeater block.");
+    declareTemplate(
+      lView,
+      tView,
+      index + 2,
+      emptyTemplateFn,
+      emptyDecls,
+      emptyVars,
+      emptyTagName,
+      getConstant(tView.consts, emptyAttrsIndex),
+      512
+      /* TNodeFlags.isInControlFlow */
+    );
+  }
+}
+function isViewExpensiveToRecreate(lView) {
+  return lView.length - HEADER_OFFSET > 2;
+}
+var OperationsCounter = class {
+  created = 0;
+  destroyed = 0;
+  reset() {
+    this.created = 0;
+    this.destroyed = 0;
+  }
+  recordCreate() {
+    this.created++;
+  }
+  recordDestroy() {
+    this.destroyed++;
+  }
+  /**
+   * A method indicating if the entire collection was re-created as part of the reconciliation pass.
+   * Used to warn developers about the usage of a tracking function that might result in excessive
+   * amount of view creation / destroy operations.
+   *
+   * @returns boolean value indicating if a live collection was re-created
+   */
+  wasReCreated(collectionLen) {
+    return collectionLen > 0 && this.created === this.destroyed && this.created === collectionLen;
+  }
+};
+var LiveCollectionLContainerImpl = class extends LiveCollection {
+  lContainer;
+  hostLView;
+  templateTNode;
+  operationsCounter = ngDevMode ? new OperationsCounter() : void 0;
+  /**
+    Property indicating if indexes in the repeater context need to be updated following the live
+    collection changes. Index updates are necessary if and only if views are inserted / removed in
+    the middle of LContainer. Adds and removals at the end don't require index updates.
+  */
+  needsIndexUpdate = false;
+  constructor(lContainer, hostLView, templateTNode) {
+    super();
+    this.lContainer = lContainer;
+    this.hostLView = hostLView;
+    this.templateTNode = templateTNode;
+  }
+  get length() {
+    return this.lContainer.length - CONTAINER_HEADER_OFFSET;
+  }
+  at(index) {
+    return this.getLView(index)[CONTEXT].$implicit;
+  }
+  attach(index, lView) {
+    const dehydratedView = lView[HYDRATION];
+    this.needsIndexUpdate ||= index !== this.length;
+    addLViewToLContainer(this.lContainer, lView, index, shouldAddViewToDom(this.templateTNode, dehydratedView));
+  }
+  detach(index) {
+    this.needsIndexUpdate ||= index !== this.length - 1;
+    return detachExistingView(this.lContainer, index);
+  }
+  create(index, value) {
+    const dehydratedView = findMatchingDehydratedView(this.lContainer, this.templateTNode.tView.ssrId);
+    const embeddedLView = createAndRenderEmbeddedLView(this.hostLView, this.templateTNode, new RepeaterContext(this.lContainer, value, index), { dehydratedView });
+    this.operationsCounter?.recordCreate();
+    return embeddedLView;
+  }
+  destroy(lView) {
+    destroyLView(lView[TVIEW], lView);
+    this.operationsCounter?.recordDestroy();
+  }
+  updateValue(index, value) {
+    this.getLView(index)[CONTEXT].$implicit = value;
+  }
+  reset() {
+    this.needsIndexUpdate = false;
+    this.operationsCounter?.reset();
+  }
+  updateIndexes() {
+    if (this.needsIndexUpdate) {
+      for (let i = 0; i < this.length; i++) {
+        this.getLView(i)[CONTEXT].$index = i;
+      }
+    }
+  }
+  getLView(index) {
+    return getExistingLViewFromLContainer(this.lContainer, index);
+  }
+};
+function ɵɵrepeater(collection) {
+  const prevConsumer = setActiveConsumer(null);
+  const metadataSlotIdx = getSelectedIndex();
+  try {
+    const hostLView = getLView();
+    const hostTView = hostLView[TVIEW];
+    const metadata = hostLView[metadataSlotIdx];
+    const containerIndex = metadataSlotIdx + 1;
+    const lContainer = getLContainer(hostLView, containerIndex);
+    if (metadata.liveCollection === void 0) {
+      const itemTemplateTNode = getExistingTNode(hostTView, containerIndex);
+      metadata.liveCollection = new LiveCollectionLContainerImpl(lContainer, hostLView, itemTemplateTNode);
+    } else {
+      metadata.liveCollection.reset();
+    }
+    const liveCollection = metadata.liveCollection;
+    reconcile(liveCollection, collection, metadata.trackByFn);
+    if (ngDevMode && metadata.trackByFn === ɵɵrepeaterTrackByIdentity && liveCollection.operationsCounter?.wasReCreated(liveCollection.length) && isViewExpensiveToRecreate(getExistingLViewFromLContainer(lContainer, 0))) {
+      const message = formatRuntimeError(-956, `The configured tracking expression (track by identity) caused re-creation of the entire collection of size ${liveCollection.length}. This is an expensive operation requiring destruction and subsequent creation of DOM nodes, directives, components etc. Please review the "track expression" and make sure that it uniquely identifies items in a collection.`);
+      console.warn(message);
+    }
+    liveCollection.updateIndexes();
+    if (metadata.hasEmptyBlock) {
+      const bindingIndex = nextBindingIndex();
+      const isCollectionEmpty = liveCollection.length === 0;
+      if (bindingUpdated(hostLView, bindingIndex, isCollectionEmpty)) {
+        const emptyTemplateIndex = metadataSlotIdx + 2;
+        const lContainerForEmpty = getLContainer(hostLView, emptyTemplateIndex);
+        if (isCollectionEmpty) {
+          const emptyTemplateTNode = getExistingTNode(hostTView, emptyTemplateIndex);
+          const dehydratedView = findAndReconcileMatchingDehydratedViews(lContainerForEmpty, emptyTemplateTNode, hostLView);
+          const embeddedLView = createAndRenderEmbeddedLView(hostLView, emptyTemplateTNode, void 0, { dehydratedView });
+          addLViewToLContainer(lContainerForEmpty, embeddedLView, 0, shouldAddViewToDom(emptyTemplateTNode, dehydratedView));
+        } else {
+          if (hostTView.firstUpdatePass) {
+            removeDehydratedViews(lContainerForEmpty);
+          }
+          removeLViewFromLContainer(lContainerForEmpty, 0);
+        }
+      }
+    }
+  } finally {
+    setActiveConsumer(prevConsumer);
+  }
+}
+function getLContainer(lView, index) {
+  const lContainer = lView[index];
+  ngDevMode && assertLContainer(lContainer);
+  return lContainer;
+}
+function detachExistingView(lContainer, index) {
+  const existingLView = detachView(lContainer, index);
+  ngDevMode && assertLView(existingLView);
+  return existingLView;
+}
+function getExistingLViewFromLContainer(lContainer, index) {
+  const existingLView = getLViewFromLContainer(lContainer, index);
+  ngDevMode && assertLView(existingLView);
+  return existingLView;
+}
+function getExistingTNode(tView, index) {
+  const tNode = getTNode(tView, index);
+  ngDevMode && assertTNode(tNode);
+  return tNode;
+}
+function ɵɵproperty(propName, value, sanitizer) {
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = getTView();
+    const tNode = getSelectedTNode();
+    setPropertyAndInputs(tNode, lView, propName, value, lView[RENDERER], sanitizer);
+    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
+  }
+  return ɵɵproperty;
+}
+function setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased) {
+  setAllInputsForProperty(tNode, tView, lView, isClassBased ? "class" : "style", value);
+}
+function ɵɵelementStart(index, name, attrsIndex, localRefsIndex) {
+  const lView = getLView();
+  const tView = getTView();
+  const adjustedIndex = HEADER_OFFSET + index;
+  ngDevMode && assertEqual(getBindingIndex(), tView.bindingStartIndex, "elements should be created before any bindings");
+  ngDevMode && assertIndexInRange(lView, adjustedIndex);
+  const renderer = lView[RENDERER];
+  const tNode = tView.firstCreatePass ? elementStartFirstCreatePass(adjustedIndex, tView, lView, name, findDirectiveDefMatches, getBindingsEnabled(), attrsIndex, localRefsIndex) : tView.data[adjustedIndex];
+  const native = _locateOrCreateElementNode(tView, lView, tNode, renderer, name, index);
+  lView[adjustedIndex] = native;
+  const hasDirectives = isDirectiveHost(tNode);
+  if (ngDevMode && tView.firstCreatePass) {
+    validateElementIsKnown(native, lView, tNode.value, tView.schemas, hasDirectives);
+  }
+  setCurrentTNode(tNode, true);
+  setupStaticAttributes(renderer, native, tNode);
+  if (!isDetachedByI18n(tNode) && wasLastNodeCreated()) {
+    appendChild(tView, lView, native, tNode);
+  }
+  if (getElementDepthCount() === 0 || hasDirectives) {
+    attachPatchData(native, lView);
+  }
+  increaseElementDepthCount();
+  if (hasDirectives) {
+    createDirectivesInstances(tView, lView, tNode);
+    executeContentQueries(tView, tNode, lView);
+  }
+  if (localRefsIndex !== null) {
+    saveResolvedLocalsInData(lView, tNode);
+  }
+  return ɵɵelementStart;
+}
+function ɵɵelementEnd() {
+  let currentTNode = getCurrentTNode();
+  ngDevMode && assertDefined(currentTNode, "No parent node to close.");
+  if (isCurrentTNodeParent()) {
+    setCurrentTNodeAsNotParent();
+  } else {
+    ngDevMode && assertHasParent(getCurrentTNode());
+    currentTNode = currentTNode.parent;
+    setCurrentTNode(currentTNode, false);
+  }
+  const tNode = currentTNode;
+  ngDevMode && assertTNodeType(
+    tNode,
+    3
+    /* TNodeType.AnyRNode */
+  );
+  if (isSkipHydrationRootTNode(tNode)) {
+    leaveSkipHydrationBlock();
+  }
+  decreaseElementDepthCount();
+  const tView = getTView();
+  if (tView.firstCreatePass) {
+    elementEndFirstCreatePass(tView, tNode);
+  }
+  if (tNode.classesWithoutHost != null && hasClassInput(tNode)) {
+    setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.classesWithoutHost, true);
+  }
+  if (tNode.stylesWithoutHost != null && hasStyleInput(tNode)) {
+    setDirectiveInputsWhichShadowsStyling(tView, tNode, getLView(), tNode.stylesWithoutHost, false);
+  }
+  return ɵɵelementEnd;
+}
+function ɵɵelement(index, name, attrsIndex, localRefsIndex) {
+  ɵɵelementStart(index, name, attrsIndex, localRefsIndex);
+  ɵɵelementEnd();
+  return ɵɵelement;
+}
+var _locateOrCreateElementNode = (tView, lView, tNode, renderer, name, index) => {
+  lastNodeWasCreated(true);
+  return createElementNode(renderer, name, getNamespace());
+};
+function locateOrCreateElementNodeImpl(tView, lView, tNode, renderer, name, index) {
+  const hydrationInfo = lView[HYDRATION];
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock() || isDetachedByI18n(tNode) || isDisconnectedNode$1(hydrationInfo, index);
+  lastNodeWasCreated(isNodeCreationMode);
+  if (isNodeCreationMode) {
+    return createElementNode(renderer, name, getNamespace());
+  }
+  const native = locateNextRNode(hydrationInfo, tView, lView, tNode);
+  ngDevMode && validateMatchingNode(native, Node.ELEMENT_NODE, name, lView, tNode);
+  ngDevMode && markRNodeAsClaimedByHydration(native);
+  if (getSerializedContainerViews(hydrationInfo, index)) {
+    ngDevMode && validateNodeExists(native.nextSibling, lView, tNode);
+    setSegmentHead(hydrationInfo, index, native.nextSibling);
+  }
+  if (hydrationInfo && (hasSkipHydrationAttrOnTNode(tNode) || hasSkipHydrationAttrOnRElement(native))) {
+    if (isComponentHost(tNode)) {
+      enterSkipHydrationBlock(tNode);
+      clearElementContents(native);
+      ngDevMode && markRNodeAsSkippedByHydration(native);
+    } else if (ngDevMode) {
+      throw invalidSkipHydrationHost(native);
+    }
+  }
+  return native;
+}
+function enableLocateOrCreateElementNodeImpl() {
+  _locateOrCreateElementNode = locateOrCreateElementNodeImpl;
+}
+function elementContainerStartFirstCreatePass(index, tView, lView, attrsIndex, localRefsIndex) {
+  const tViewConsts = tView.consts;
+  const attrs = getConstant(tViewConsts, attrsIndex);
+  const tNode = getOrCreateTNode(tView, index, 8, "ng-container", attrs);
+  if (attrs !== null) {
+    computeStaticStyling(tNode, attrs, true);
+  }
+  const localRefs = getConstant(tViewConsts, localRefsIndex);
+  if (getBindingsEnabled()) {
+    resolveDirectives(tView, lView, tNode, localRefs, findDirectiveDefMatches);
+  }
+  tNode.mergedAttrs = mergeHostAttrs(tNode.mergedAttrs, tNode.attrs);
+  if (tView.queries !== null) {
+    tView.queries.elementStart(tView, tNode);
+  }
+  return tNode;
+}
+function ɵɵelementContainerStart(index, attrsIndex, localRefsIndex) {
+  const lView = getLView();
+  const tView = getTView();
+  const adjustedIndex = index + HEADER_OFFSET;
+  ngDevMode && assertIndexInRange(lView, adjustedIndex);
+  ngDevMode && assertEqual(getBindingIndex(), tView.bindingStartIndex, "element containers should be created before any bindings");
+  const tNode = tView.firstCreatePass ? elementContainerStartFirstCreatePass(adjustedIndex, tView, lView, attrsIndex, localRefsIndex) : tView.data[adjustedIndex];
+  setCurrentTNode(tNode, true);
+  const comment = _locateOrCreateElementContainerNode(tView, lView, tNode, index);
+  lView[adjustedIndex] = comment;
+  if (wasLastNodeCreated()) {
+    appendChild(tView, lView, comment, tNode);
+  }
+  attachPatchData(comment, lView);
+  if (isDirectiveHost(tNode)) {
+    createDirectivesInstances(tView, lView, tNode);
+    executeContentQueries(tView, tNode, lView);
+  }
+  if (localRefsIndex != null) {
+    saveResolvedLocalsInData(lView, tNode);
+  }
+  return ɵɵelementContainerStart;
+}
+function ɵɵelementContainerEnd() {
+  let currentTNode = getCurrentTNode();
+  const tView = getTView();
+  if (isCurrentTNodeParent()) {
+    setCurrentTNodeAsNotParent();
+  } else {
+    ngDevMode && assertHasParent(currentTNode);
+    currentTNode = currentTNode.parent;
+    setCurrentTNode(currentTNode, false);
+  }
+  ngDevMode && assertTNodeType(
+    currentTNode,
+    8
+    /* TNodeType.ElementContainer */
+  );
+  if (tView.firstCreatePass) {
+    registerPostOrderHooks(tView, currentTNode);
+    if (isContentQueryHost(currentTNode)) {
+      tView.queries.elementEnd(currentTNode);
+    }
+  }
+  return ɵɵelementContainerEnd;
+}
+function ɵɵelementContainer(index, attrsIndex, localRefsIndex) {
+  ɵɵelementContainerStart(index, attrsIndex, localRefsIndex);
+  ɵɵelementContainerEnd();
+  return ɵɵelementContainer;
+}
+var _locateOrCreateElementContainerNode = (tView, lView, tNode, index) => {
+  lastNodeWasCreated(true);
+  return createCommentNode(lView[RENDERER], ngDevMode ? "ng-container" : "");
+};
+function locateOrCreateElementContainerNode(tView, lView, tNode, index) {
+  let comment;
+  const hydrationInfo = lView[HYDRATION];
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock() || isDisconnectedNode$1(hydrationInfo, index) || isDetachedByI18n(tNode);
+  lastNodeWasCreated(isNodeCreationMode);
+  if (isNodeCreationMode) {
+    return createCommentNode(lView[RENDERER], ngDevMode ? "ng-container" : "");
+  }
+  const currentRNode = locateNextRNode(hydrationInfo, tView, lView, tNode);
+  ngDevMode && validateNodeExists(currentRNode, lView, tNode);
+  const ngContainerSize = getNgContainerSize(hydrationInfo, index);
+  ngDevMode && assertNumber(ngContainerSize, "Unexpected state: hydrating an <ng-container>, but no hydration info is available.");
+  setSegmentHead(hydrationInfo, index, currentRNode);
+  comment = siblingAfter(ngContainerSize, currentRNode);
+  if (ngDevMode) {
+    validateMatchingNode(comment, Node.COMMENT_NODE, null, lView, tNode);
+    markRNodeAsClaimedByHydration(comment);
+  }
+  return comment;
+}
+function enableLocateOrCreateElementContainerNodeImpl() {
+  _locateOrCreateElementContainerNode = locateOrCreateElementContainerNode;
+}
+function ɵɵgetCurrentView() {
+  return getLView();
+}
+function ɵɵdomProperty(propName, value, sanitizer) {
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = getTView();
+    const tNode = getSelectedTNode();
+    setDomProperty(tNode, lView, propName, value, lView[RENDERER], sanitizer);
+    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
+  }
+  return ɵɵdomProperty;
+}
+function ɵɵsyntheticHostProperty(propName, value, sanitizer) {
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = getTView();
+    const tNode = getSelectedTNode();
+    const currentDef = getCurrentDirectiveDef(tView.data);
+    const renderer = loadComponentRenderer(currentDef, tNode, lView);
+    setDomProperty(tNode, lView, propName, value, renderer, sanitizer);
+    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
+  }
+  return ɵɵsyntheticHostProperty;
+}
+var u = void 0;
+function plural(val) {
+  const i = Math.floor(Math.abs(val)), v = val.toString().replace(/^[^.]*\.?/, "").length;
+  if (i === 1 && v === 0)
+    return 1;
+  return 5;
+}
+var localeEn = ["en", [["a", "p"], ["AM", "PM"], u], [["AM", "PM"], u, u], [["S", "M", "T", "W", "T", "F", "S"], ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"]], u, [["J", "F", "M", "A", "M", "J", "J", "A", "S", "O", "N", "D"], ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"], ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]], u, [["B", "A"], ["BC", "AD"], ["Before Christ", "Anno Domini"]], 0, [6, 0], ["M/d/yy", "MMM d, y", "MMMM d, y", "EEEE, MMMM d, y"], ["h:mm a", "h:mm:ss a", "h:mm:ss a z", "h:mm:ss a zzzz"], ["{1}, {0}", u, "{1} 'at' {0}", u], [".", ",", ";", "%", "+", "-", "E", "×", "‰", "∞", "NaN", ":"], ["#,##0.###", "#,##0%", "¤#,##0.00", "#E0"], "USD", "$", "US Dollar", {}, "ltr", plural];
+var LOCALE_DATA = {};
+function registerLocaleData(data, localeId, extraData) {
+  if (typeof localeId !== "string") {
+    extraData = localeId;
+    localeId = data[LocaleDataIndex.LocaleId];
+  }
+  localeId = localeId.toLowerCase().replace(/_/g, "-");
+  LOCALE_DATA[localeId] = data;
+  if (extraData) {
+    LOCALE_DATA[localeId][LocaleDataIndex.ExtraData] = extraData;
+  }
+}
+function findLocaleData(locale) {
+  const normalizedLocale = normalizeLocale(locale);
+  let match = getLocaleData(normalizedLocale);
+  if (match) {
+    return match;
+  }
+  const parentLocale = normalizedLocale.split("-")[0];
+  match = getLocaleData(parentLocale);
+  if (match) {
+    return match;
+  }
+  if (parentLocale === "en") {
+    return localeEn;
+  }
+  throw new RuntimeError(701, ngDevMode && `Missing locale data for the locale "${locale}".`);
+}
+function getLocaleCurrencyCode(locale) {
+  const data = findLocaleData(locale);
+  return data[LocaleDataIndex.CurrencyCode] || null;
+}
+function getLocalePluralCase(locale) {
+  const data = findLocaleData(locale);
+  return data[LocaleDataIndex.PluralCase];
+}
+function getLocaleData(normalizedLocale) {
+  if (!(normalizedLocale in LOCALE_DATA)) {
+    LOCALE_DATA[normalizedLocale] = _global.ng && _global.ng.common && _global.ng.common.locales && _global.ng.common.locales[normalizedLocale];
+  }
+  return LOCALE_DATA[normalizedLocale];
+}
+function unregisterAllLocaleData() {
+  LOCALE_DATA = {};
+}
+var LocaleDataIndex;
+(function(LocaleDataIndex2) {
+  LocaleDataIndex2[LocaleDataIndex2["LocaleId"] = 0] = "LocaleId";
+  LocaleDataIndex2[LocaleDataIndex2["DayPeriodsFormat"] = 1] = "DayPeriodsFormat";
+  LocaleDataIndex2[LocaleDataIndex2["DayPeriodsStandalone"] = 2] = "DayPeriodsStandalone";
+  LocaleDataIndex2[LocaleDataIndex2["DaysFormat"] = 3] = "DaysFormat";
+  LocaleDataIndex2[LocaleDataIndex2["DaysStandalone"] = 4] = "DaysStandalone";
+  LocaleDataIndex2[LocaleDataIndex2["MonthsFormat"] = 5] = "MonthsFormat";
+  LocaleDataIndex2[LocaleDataIndex2["MonthsStandalone"] = 6] = "MonthsStandalone";
+  LocaleDataIndex2[LocaleDataIndex2["Eras"] = 7] = "Eras";
+  LocaleDataIndex2[LocaleDataIndex2["FirstDayOfWeek"] = 8] = "FirstDayOfWeek";
+  LocaleDataIndex2[LocaleDataIndex2["WeekendRange"] = 9] = "WeekendRange";
+  LocaleDataIndex2[LocaleDataIndex2["DateFormat"] = 10] = "DateFormat";
+  LocaleDataIndex2[LocaleDataIndex2["TimeFormat"] = 11] = "TimeFormat";
+  LocaleDataIndex2[LocaleDataIndex2["DateTimeFormat"] = 12] = "DateTimeFormat";
+  LocaleDataIndex2[LocaleDataIndex2["NumberSymbols"] = 13] = "NumberSymbols";
+  LocaleDataIndex2[LocaleDataIndex2["NumberFormats"] = 14] = "NumberFormats";
+  LocaleDataIndex2[LocaleDataIndex2["CurrencyCode"] = 15] = "CurrencyCode";
+  LocaleDataIndex2[LocaleDataIndex2["CurrencySymbol"] = 16] = "CurrencySymbol";
+  LocaleDataIndex2[LocaleDataIndex2["CurrencyName"] = 17] = "CurrencyName";
+  LocaleDataIndex2[LocaleDataIndex2["Currencies"] = 18] = "Currencies";
+  LocaleDataIndex2[LocaleDataIndex2["Directionality"] = 19] = "Directionality";
+  LocaleDataIndex2[LocaleDataIndex2["PluralCase"] = 20] = "PluralCase";
+  LocaleDataIndex2[LocaleDataIndex2["ExtraData"] = 21] = "ExtraData";
+})(LocaleDataIndex || (LocaleDataIndex = {}));
+function normalizeLocale(locale) {
+  return locale.toLowerCase().replace(/_/g, "-");
+}
+var pluralMapping = ["zero", "one", "two", "few", "many"];
+function getPluralCase(value, locale) {
+  const plural2 = getLocalePluralCase(locale)(parseInt(value, 10));
+  const result = pluralMapping[plural2];
+  return result !== void 0 ? result : "other";
+}
+var DEFAULT_LOCALE_ID = "en-US";
+var USD_CURRENCY_CODE = "USD";
+var ELEMENT_MARKER = {
+  marker: "element"
+};
+var ICU_MARKER = {
+  marker: "ICU"
+};
+var I18nCreateOpCode;
+(function(I18nCreateOpCode2) {
+  I18nCreateOpCode2[I18nCreateOpCode2["SHIFT"] = 2] = "SHIFT";
+  I18nCreateOpCode2[I18nCreateOpCode2["APPEND_EAGERLY"] = 1] = "APPEND_EAGERLY";
+  I18nCreateOpCode2[I18nCreateOpCode2["COMMENT"] = 2] = "COMMENT";
+})(I18nCreateOpCode || (I18nCreateOpCode = {}));
+var LOCALE_ID$1 = DEFAULT_LOCALE_ID;
+function setLocaleId(localeId) {
+  ngDevMode && assertDefined(localeId, `Expected localeId to be defined`);
+  if (typeof localeId === "string") {
+    LOCALE_ID$1 = localeId.toLowerCase().replace(/_/g, "-");
+  }
+}
+function getLocaleId() {
+  return LOCALE_ID$1;
+}
+var changeMask = 0;
+var changeMaskCounter = 0;
+function setMaskBit(hasChange) {
+  if (hasChange) {
+    changeMask = changeMask | 1 << Math.min(changeMaskCounter, 31);
+  }
+  changeMaskCounter++;
+}
+function applyI18n(tView, lView, index) {
+  if (changeMaskCounter > 0) {
+    ngDevMode && assertDefined(tView, `tView should be defined`);
+    const tI18n = tView.data[index];
+    const updateOpCodes = Array.isArray(tI18n) ? tI18n : tI18n.update;
+    const bindingsStartIndex = getBindingIndex() - changeMaskCounter - 1;
+    applyUpdateOpCodes(tView, lView, updateOpCodes, bindingsStartIndex, changeMask);
+  }
+  changeMask = 0;
+  changeMaskCounter = 0;
+}
+function createNodeWithoutHydration(lView, textOrName, nodeType) {
+  const renderer = lView[RENDERER];
+  switch (nodeType) {
+    case Node.COMMENT_NODE:
+      return createCommentNode(renderer, textOrName);
+    case Node.TEXT_NODE:
+      return createTextNode(renderer, textOrName);
+    case Node.ELEMENT_NODE:
+      return createElementNode(renderer, textOrName, null);
+  }
+}
+var _locateOrCreateNode = (lView, index, textOrName, nodeType) => {
+  lastNodeWasCreated(true);
+  return createNodeWithoutHydration(lView, textOrName, nodeType);
+};
+function locateOrCreateNodeImpl(lView, index, textOrName, nodeType) {
+  const hydrationInfo = lView[HYDRATION];
+  const noOffsetIndex = index - HEADER_OFFSET;
+  const isNodeCreationMode = !isI18nHydrationSupportEnabled() || !hydrationInfo || isInSkipHydrationBlock() || isDisconnectedNode$1(hydrationInfo, noOffsetIndex);
+  lastNodeWasCreated(isNodeCreationMode);
+  if (isNodeCreationMode) {
+    return createNodeWithoutHydration(lView, textOrName, nodeType);
+  }
+  const native = locateI18nRNodeByIndex(hydrationInfo, noOffsetIndex);
+  ngDevMode && assertDefined(native, "expected native element");
+  ngDevMode && assertEqual(native.nodeType, nodeType, "expected matching nodeType");
+  ngDevMode && nodeType === Node.ELEMENT_NODE && assertEqual(native.tagName.toLowerCase(), textOrName.toLowerCase(), "expecting matching tagName");
+  ngDevMode && markRNodeAsClaimedByHydration(native);
+  return native;
+}
+function enableLocateOrCreateI18nNodeImpl() {
+  _locateOrCreateNode = locateOrCreateNodeImpl;
+}
+function applyCreateOpCodes(lView, createOpCodes, parentRNode, insertInFrontOf) {
+  const renderer = lView[RENDERER];
+  for (let i = 0; i < createOpCodes.length; i++) {
+    const opCode = createOpCodes[i++];
+    const text = createOpCodes[i];
+    const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;
+    const appendNow = (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;
+    const index = opCode >>> I18nCreateOpCode.SHIFT;
+    let rNode = lView[index];
+    let lastNodeWasCreated2 = false;
+    if (rNode === null) {
+      rNode = lView[index] = _locateOrCreateNode(lView, index, text, isComment ? Node.COMMENT_NODE : Node.TEXT_NODE);
+      lastNodeWasCreated2 = wasLastNodeCreated();
+    }
+    if (appendNow && parentRNode !== null && lastNodeWasCreated2) {
+      nativeInsertBefore(renderer, parentRNode, rNode, insertInFrontOf, false);
+    }
+  }
+}
+function applyMutableOpCodes(tView, mutableOpCodes, lView, anchorRNode) {
+  ngDevMode && assertDomNode(anchorRNode);
+  const renderer = lView[RENDERER];
+  let rootIdx = null;
+  let rootRNode;
+  for (let i = 0; i < mutableOpCodes.length; i++) {
+    const opCode = mutableOpCodes[i];
+    if (typeof opCode == "string") {
+      const textNodeIndex = mutableOpCodes[++i];
+      if (lView[textNodeIndex] === null) {
+        ngDevMode && assertIndexInRange(lView, textNodeIndex);
+        lView[textNodeIndex] = _locateOrCreateNode(lView, textNodeIndex, opCode, Node.TEXT_NODE);
+      }
+    } else if (typeof opCode == "number") {
+      switch (opCode & 1) {
+        case 0:
+          const parentIdx = getParentFromIcuCreateOpCode(opCode);
+          if (rootIdx === null) {
+            rootIdx = parentIdx;
+            rootRNode = renderer.parentNode(anchorRNode);
+          }
+          let insertInFrontOf;
+          let parentRNode;
+          if (parentIdx === rootIdx) {
+            insertInFrontOf = anchorRNode;
+            parentRNode = rootRNode;
+          } else {
+            insertInFrontOf = null;
+            parentRNode = unwrapRNode(lView[parentIdx]);
+          }
+          if (parentRNode !== null) {
+            ngDevMode && assertDomNode(parentRNode);
+            const refIdx = getRefFromIcuCreateOpCode(opCode);
+            ngDevMode && assertGreaterThan(refIdx, HEADER_OFFSET, "Missing ref");
+            const child = lView[refIdx];
+            ngDevMode && assertDomNode(child);
+            nativeInsertBefore(renderer, parentRNode, child, insertInFrontOf, false);
+            const tIcu = getTIcu(tView, refIdx);
+            if (tIcu !== null && typeof tIcu === "object") {
+              ngDevMode && assertTIcu(tIcu);
+              const caseIndex = getCurrentICUCaseIndex(tIcu, lView);
+              if (caseIndex !== null) {
+                applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, lView[tIcu.anchorIdx]);
+              }
+            }
+          }
+          break;
+        case 1:
+          const elementNodeIndex = opCode >>> 1;
+          const attrName = mutableOpCodes[++i];
+          const attrValue = mutableOpCodes[++i];
+          setElementAttribute(renderer, getNativeByIndex(elementNodeIndex, lView), null, null, attrName, attrValue, null);
+          break;
+        default:
+          if (ngDevMode) {
+            throw new RuntimeError(700, `Unable to determine the type of mutate operation for "${opCode}"`);
+          }
+      }
+    } else {
+      switch (opCode) {
+        case ICU_MARKER:
+          const commentValue = mutableOpCodes[++i];
+          const commentNodeIndex = mutableOpCodes[++i];
+          if (lView[commentNodeIndex] === null) {
+            ngDevMode && assertEqual(typeof commentValue, "string", `Expected "${commentValue}" to be a comment node value`);
+            ngDevMode && assertIndexInExpandoRange(lView, commentNodeIndex);
+            const commentRNode = lView[commentNodeIndex] = _locateOrCreateNode(lView, commentNodeIndex, commentValue, Node.COMMENT_NODE);
+            attachPatchData(commentRNode, lView);
+          }
+          break;
+        case ELEMENT_MARKER:
+          const tagName = mutableOpCodes[++i];
+          const elementNodeIndex = mutableOpCodes[++i];
+          if (lView[elementNodeIndex] === null) {
+            ngDevMode && assertEqual(typeof tagName, "string", `Expected "${tagName}" to be an element node tag name`);
+            ngDevMode && assertIndexInExpandoRange(lView, elementNodeIndex);
+            const elementRNode = lView[elementNodeIndex] = _locateOrCreateNode(lView, elementNodeIndex, tagName, Node.ELEMENT_NODE);
+            attachPatchData(elementRNode, lView);
+          }
+          break;
+        default:
+          ngDevMode && throwError2(`Unable to determine the type of mutate operation for "${opCode}"`);
+      }
+    }
+  }
+}
+function applyUpdateOpCodes(tView, lView, updateOpCodes, bindingsStartIndex, changeMask2) {
+  for (let i = 0; i < updateOpCodes.length; i++) {
+    const checkBit = updateOpCodes[i];
+    const skipCodes = updateOpCodes[++i];
+    if (checkBit & changeMask2) {
+      let value = "";
+      for (let j = i + 1; j <= i + skipCodes; j++) {
+        const opCode = updateOpCodes[j];
+        if (typeof opCode == "string") {
+          value += opCode;
+        } else if (typeof opCode == "number") {
+          if (opCode < 0) {
+            value += renderStringify(lView[bindingsStartIndex - opCode]);
+          } else {
+            const nodeIndex = opCode >>> 2;
+            switch (opCode & 3) {
+              case 1:
+                const propName = updateOpCodes[++j];
+                const sanitizeFn = updateOpCodes[++j];
+                const tNodeOrTagName = tView.data[nodeIndex];
+                ngDevMode && assertDefined(tNodeOrTagName, "Experting TNode or string");
+                if (typeof tNodeOrTagName === "string") {
+                  setElementAttribute(lView[RENDERER], lView[nodeIndex], null, tNodeOrTagName, propName, value, sanitizeFn);
+                } else {
+                  setPropertyAndInputs(tNodeOrTagName, lView, propName, value, lView[RENDERER], sanitizeFn);
+                }
+                break;
+              case 0:
+                const rText = lView[nodeIndex];
+                rText !== null && updateTextNode(lView[RENDERER], rText, value);
+                break;
+              case 2:
+                applyIcuSwitchCase(tView, getTIcu(tView, nodeIndex), lView, value);
+                break;
+              case 3:
+                applyIcuUpdateCase(tView, getTIcu(tView, nodeIndex), bindingsStartIndex, lView);
+                break;
+            }
+          }
+        }
+      }
+    } else {
+      const opCode = updateOpCodes[i + 1];
+      if (opCode > 0 && (opCode & 3) === 3) {
+        const nodeIndex = opCode >>> 2;
+        const tIcu = getTIcu(tView, nodeIndex);
+        const currentIndex = lView[tIcu.currentCaseLViewIndex];
+        if (currentIndex < 0) {
+          applyIcuUpdateCase(tView, tIcu, bindingsStartIndex, lView);
+        }
+      }
+    }
+    i += skipCodes;
+  }
+}
+function applyIcuUpdateCase(tView, tIcu, bindingsStartIndex, lView) {
+  ngDevMode && assertIndexInRange(lView, tIcu.currentCaseLViewIndex);
+  let activeCaseIndex = lView[tIcu.currentCaseLViewIndex];
+  if (activeCaseIndex !== null) {
+    let mask = changeMask;
+    if (activeCaseIndex < 0) {
+      activeCaseIndex = lView[tIcu.currentCaseLViewIndex] = ~activeCaseIndex;
+      mask = -1;
+    }
+    applyUpdateOpCodes(tView, lView, tIcu.update[activeCaseIndex], bindingsStartIndex, mask);
+  }
+}
+function applyIcuSwitchCase(tView, tIcu, lView, value) {
+  const caseIndex = getCaseIndex(tIcu, value);
+  let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);
+  if (activeCaseIndex !== caseIndex) {
+    applyIcuSwitchCaseRemove(tView, tIcu, lView);
+    lView[tIcu.currentCaseLViewIndex] = caseIndex === null ? null : ~caseIndex;
+    if (caseIndex !== null) {
+      const anchorRNode = lView[tIcu.anchorIdx];
+      if (anchorRNode) {
+        ngDevMode && assertDomNode(anchorRNode);
+        applyMutableOpCodes(tView, tIcu.create[caseIndex], lView, anchorRNode);
+      }
+      claimDehydratedIcuCase(lView, tIcu.anchorIdx, caseIndex);
+    }
+  }
+}
+function applyIcuSwitchCaseRemove(tView, tIcu, lView) {
+  let activeCaseIndex = getCurrentICUCaseIndex(tIcu, lView);
+  if (activeCaseIndex !== null) {
+    const removeCodes = tIcu.remove[activeCaseIndex];
+    for (let i = 0; i < removeCodes.length; i++) {
+      const nodeOrIcuIndex = removeCodes[i];
+      if (nodeOrIcuIndex > 0) {
+        const rNode = getNativeByIndex(nodeOrIcuIndex, lView);
+        rNode !== null && nativeRemoveNode(lView[RENDERER], rNode);
+      } else {
+        applyIcuSwitchCaseRemove(tView, getTIcu(tView, ~nodeOrIcuIndex), lView);
+      }
+    }
+  }
+}
+function getCaseIndex(icuExpression, bindingValue) {
+  let index = icuExpression.cases.indexOf(bindingValue);
+  if (index === -1) {
+    switch (icuExpression.type) {
+      case 1: {
+        const resolvedCase = getPluralCase(bindingValue, getLocaleId());
+        index = icuExpression.cases.indexOf(resolvedCase);
+        if (index === -1 && resolvedCase !== "other") {
+          index = icuExpression.cases.indexOf("other");
+        }
+        break;
+      }
+      case 0: {
+        index = icuExpression.cases.indexOf("other");
+        break;
+      }
+    }
+  }
+  return index === -1 ? null : index;
+}
+function i18nCreateOpCodesToString(opcodes) {
+  const createOpCodes = opcodes || (Array.isArray(this) ? this : []);
+  let lines = [];
+  for (let i = 0; i < createOpCodes.length; i++) {
+    const opCode = createOpCodes[i++];
+    const text = createOpCodes[i];
+    const isComment = (opCode & I18nCreateOpCode.COMMENT) === I18nCreateOpCode.COMMENT;
+    const appendNow = (opCode & I18nCreateOpCode.APPEND_EAGERLY) === I18nCreateOpCode.APPEND_EAGERLY;
+    const index = opCode >>> I18nCreateOpCode.SHIFT;
+    lines.push(`lView[${index}] = document.${isComment ? "createComment" : "createText"}(${JSON.stringify(text)});`);
+    if (appendNow) {
+      lines.push(`parent.appendChild(lView[${index}]);`);
+    }
+  }
+  return lines;
+}
+function i18nUpdateOpCodesToString(opcodes) {
+  const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
+  let lines = [];
+  function consumeOpCode(value) {
+    const ref = value >>> 2;
+    const opCode = value & 3;
+    switch (opCode) {
+      case 0:
+        return `(lView[${ref}] as Text).textContent = $$$`;
+      case 1:
+        const attrName = parser.consumeString();
+        const sanitizationFn = parser.consumeFunction();
+        const value2 = sanitizationFn ? `(${sanitizationFn})($$$)` : "$$$";
+        return `(lView[${ref}] as Element).setAttribute('${attrName}', ${value2})`;
+      case 2:
+        return `icuSwitchCase(${ref}, $$$)`;
+      case 3:
+        return `icuUpdateCase(${ref})`;
+    }
+    throw new Error("unexpected OpCode");
+  }
+  while (parser.hasMore()) {
+    let mask = parser.consumeNumber();
+    let size = parser.consumeNumber();
+    const end = parser.i + size;
+    const statements = [];
+    let statement = "";
+    while (parser.i < end) {
+      let value = parser.consumeNumberOrString();
+      if (typeof value === "string") {
+        statement += value;
+      } else if (value < 0) {
+        statement += "${lView[i" + value + "]}";
+      } else {
+        const opCodeText = consumeOpCode(value);
+        statements.push(opCodeText.replace("$$$", "`" + statement + "`") + ";");
+        statement = "";
+      }
+    }
+    lines.push(`if (mask & 0b${mask.toString(2)}) { ${statements.join(" ")} }`);
+  }
+  return lines;
+}
+function icuCreateOpCodesToString(opcodes) {
+  const parser = new OpCodeParser(opcodes || (Array.isArray(this) ? this : []));
+  let lines = [];
+  function consumeOpCode(opCode) {
+    const parent = getParentFromIcuCreateOpCode(opCode);
+    const ref = getRefFromIcuCreateOpCode(opCode);
+    switch (getInstructionFromIcuCreateOpCode(opCode)) {
+      case 0:
+        return `(lView[${parent}] as Element).appendChild(lView[${lastRef}])`;
+      case 1:
+        return `(lView[${ref}] as Element).setAttribute("${parser.consumeString()}", "${parser.consumeString()}")`;
+    }
+    throw new Error("Unexpected OpCode: " + getInstructionFromIcuCreateOpCode(opCode));
+  }
+  let lastRef = -1;
+  while (parser.hasMore()) {
+    let value = parser.consumeNumberStringOrMarker();
+    if (value === ICU_MARKER) {
+      const text = parser.consumeString();
+      lastRef = parser.consumeNumber();
+      lines.push(`lView[${lastRef}] = document.createComment("${text}")`);
+    } else if (value === ELEMENT_MARKER) {
+      const text = parser.consumeString();
+      lastRef = parser.consumeNumber();
+      lines.push(`lView[${lastRef}] = document.createElement("${text}")`);
+    } else if (typeof value === "string") {
+      lastRef = parser.consumeNumber();
+      lines.push(`lView[${lastRef}] = document.createTextNode("${value}")`);
+    } else if (typeof value === "number") {
+      const line = consumeOpCode(value);
+      line && lines.push(line);
+    } else {
+      throw new Error("Unexpected value");
+    }
+  }
+  return lines;
+}
+function i18nRemoveOpCodesToString(opcodes) {
+  const removeCodes = opcodes || (Array.isArray(this) ? this : []);
+  let lines = [];
+  for (let i = 0; i < removeCodes.length; i++) {
+    const nodeOrIcuIndex = removeCodes[i];
+    if (nodeOrIcuIndex > 0) {
+      lines.push(`remove(lView[${nodeOrIcuIndex}])`);
+    } else {
+      lines.push(`removeNestedICU(${~nodeOrIcuIndex})`);
+    }
+  }
+  return lines;
+}
+var OpCodeParser = class {
+  i = 0;
+  codes;
+  constructor(codes) {
+    this.codes = codes;
+  }
+  hasMore() {
+    return this.i < this.codes.length;
+  }
+  consumeNumber() {
+    let value = this.codes[this.i++];
+    assertNumber(value, "expecting number in OpCode");
+    return value;
+  }
+  consumeString() {
+    let value = this.codes[this.i++];
+    assertString(value, "expecting string in OpCode");
+    return value;
+  }
+  consumeFunction() {
+    let value = this.codes[this.i++];
+    if (value === null || typeof value === "function") {
+      return value;
+    }
+    throw new Error("expecting function in OpCode");
+  }
+  consumeNumberOrString() {
+    let value = this.codes[this.i++];
+    if (typeof value === "string") {
+      return value;
+    }
+    assertNumber(value, "expecting number or string in OpCode");
+    return value;
+  }
+  consumeNumberStringOrMarker() {
+    let value = this.codes[this.i++];
+    if (typeof value === "string" || typeof value === "number" || value == ICU_MARKER || value == ELEMENT_MARKER) {
+      return value;
+    }
+    assertNumber(value, "expecting number, string, ICU_MARKER or ELEMENT_MARKER in OpCode");
+    return value;
+  }
+};
+var BINDING_REGEXP = /�(\d+):?\d*�/gi;
+var ICU_REGEXP = /({\s*�\d+:?\d*�\s*,\s*\S{6}\s*,[\s\S]*})/gi;
+var NESTED_ICU = /�(\d+)�/;
+var ICU_BLOCK_REGEXP = /^\s*(�\d+:?\d*�)\s*,\s*(select|plural)\s*,/;
+var MARKER = `�`;
+var SUBTEMPLATE_REGEXP = /�\/?\*(\d+:\d+)�/gi;
+var PH_REGEXP = /�(\/?[#*]\d+):?\d*�/gi;
+var NGSP_UNICODE_REGEXP = /\uE500/g;
+function replaceNgsp(value) {
+  return value.replace(NGSP_UNICODE_REGEXP, " ");
+}
+function attachDebugGetter(obj, debugGetter) {
+  if (ngDevMode) {
+    Object.defineProperty(obj, "debug", { get: debugGetter, enumerable: false });
+  } else {
+    throw new Error("This method should be guarded with `ngDevMode` so that it can be tree shaken in production!");
+  }
+}
+function i18nStartFirstCreatePass(tView, parentTNodeIndex, lView, index, message, subTemplateIndex) {
+  const rootTNode = getCurrentParentTNode();
+  const createOpCodes = [];
+  const updateOpCodes = [];
+  const existingTNodeStack = [[]];
+  const astStack = [[]];
+  if (ngDevMode) {
+    attachDebugGetter(createOpCodes, i18nCreateOpCodesToString);
+    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
+  }
+  message = getTranslationForTemplate(message, subTemplateIndex);
+  const msgParts = replaceNgsp(message).split(PH_REGEXP);
+  for (let i = 0; i < msgParts.length; i++) {
+    let value = msgParts[i];
+    if ((i & 1) === 0) {
+      const parts = i18nParseTextIntoPartsAndICU(value);
+      for (let j = 0; j < parts.length; j++) {
+        let part = parts[j];
+        if ((j & 1) === 0) {
+          const text = part;
+          ngDevMode && assertString(text, "Parsed ICU part should be string");
+          if (text !== "") {
+            i18nStartFirstCreatePassProcessTextNode(astStack[0], tView, rootTNode, existingTNodeStack[0], createOpCodes, updateOpCodes, lView, text);
+          }
+        } else {
+          const icuExpression = part;
+          if (typeof icuExpression !== "object") {
+            throw new Error(`Unable to parse ICU expression in "${message}" message.`);
+          }
+          const icuContainerTNode = createTNodeAndAddOpCode(tView, rootTNode, existingTNodeStack[0], lView, createOpCodes, ngDevMode ? `ICU ${index}:${icuExpression.mainBinding}` : "", true);
+          const icuNodeIndex = icuContainerTNode.index;
+          ngDevMode && assertGreaterThanOrEqual(icuNodeIndex, HEADER_OFFSET, "Index must be in absolute LView offset");
+          icuStart(astStack[0], tView, lView, updateOpCodes, parentTNodeIndex, icuExpression, icuNodeIndex);
+        }
+      }
+    } else {
+      const isClosing = value.charCodeAt(0) === 47;
+      const type = value.charCodeAt(isClosing ? 1 : 0);
+      ngDevMode && assertOneOf(
+        type,
+        42,
+        35
+        /* CharCode.HASH */
+      );
+      const index2 = HEADER_OFFSET + Number.parseInt(value.substring(isClosing ? 2 : 1));
+      if (isClosing) {
+        existingTNodeStack.shift();
+        astStack.shift();
+        setCurrentTNode(getCurrentParentTNode(), false);
+      } else {
+        const tNode = createTNodePlaceholder(tView, existingTNodeStack[0], index2);
+        existingTNodeStack.unshift([]);
+        setCurrentTNode(tNode, true);
+        const placeholderNode = {
+          kind: 2,
+          index: index2,
+          children: [],
+          type: type === 35 ? 0 : 1
+        };
+        astStack[0].push(placeholderNode);
+        astStack.unshift(placeholderNode.children);
+      }
+    }
+  }
+  tView.data[index] = {
+    create: createOpCodes,
+    update: updateOpCodes,
+    ast: astStack[0],
+    parentTNodeIndex
+  };
+}
+function createTNodeAndAddOpCode(tView, rootTNode, existingTNodes, lView, createOpCodes, text, isICU) {
+  const i18nNodeIdx = allocExpando(tView, lView, 1, null);
+  let opCode = i18nNodeIdx << I18nCreateOpCode.SHIFT;
+  let parentTNode = getCurrentParentTNode();
+  if (rootTNode === parentTNode) {
+    parentTNode = null;
+  }
+  if (parentTNode === null) {
+    opCode |= I18nCreateOpCode.APPEND_EAGERLY;
+  }
+  if (isICU) {
+    opCode |= I18nCreateOpCode.COMMENT;
+    ensureIcuContainerVisitorLoaded(loadIcuContainerVisitor);
+  }
+  createOpCodes.push(opCode, text === null ? "" : text);
+  const tNode = createTNodeAtIndex(tView, i18nNodeIdx, isICU ? 32 : 1, text === null ? ngDevMode ? "{{?}}" : "" : text, null);
+  addTNodeAndUpdateInsertBeforeIndex(existingTNodes, tNode);
+  const tNodeIdx = tNode.index;
+  setCurrentTNode(
+    tNode,
+    false
+    /* Text nodes are self closing */
+  );
+  if (parentTNode !== null && rootTNode !== parentTNode) {
+    setTNodeInsertBeforeIndex(parentTNode, tNodeIdx);
+  }
+  return tNode;
+}
+function i18nStartFirstCreatePassProcessTextNode(ast, tView, rootTNode, existingTNodes, createOpCodes, updateOpCodes, lView, text) {
+  const hasBinding = text.match(BINDING_REGEXP);
+  const tNode = createTNodeAndAddOpCode(tView, rootTNode, existingTNodes, lView, createOpCodes, hasBinding ? null : text, false);
+  const index = tNode.index;
+  if (hasBinding) {
+    generateBindingUpdateOpCodes(updateOpCodes, text, index, null, 0, null);
+  }
+  ast.push({ kind: 0, index });
+}
+function i18nAttributesFirstPass(tView, index, values) {
+  const previousElement = getCurrentTNode();
+  const previousElementIndex = previousElement.index;
+  const updateOpCodes = [];
+  if (ngDevMode) {
+    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
+  }
+  if (tView.firstCreatePass && tView.data[index] === null) {
+    for (let i = 0; i < values.length; i += 2) {
+      const attrName = values[i];
+      const message = values[i + 1];
+      if (message !== "") {
+        if (ICU_REGEXP.test(message)) {
+          throw new Error(`ICU expressions are not supported in attributes. Message: "${message}".`);
+        }
+        generateBindingUpdateOpCodes(updateOpCodes, message, previousElementIndex, attrName, countBindings(updateOpCodes), null);
+      }
+    }
+    tView.data[index] = updateOpCodes;
+  }
+}
+function generateBindingUpdateOpCodes(updateOpCodes, str, destinationNode, attrName, bindingStart, sanitizeFn) {
+  ngDevMode && assertGreaterThanOrEqual(destinationNode, HEADER_OFFSET, "Index must be in absolute LView offset");
+  const maskIndex = updateOpCodes.length;
+  const sizeIndex = maskIndex + 1;
+  updateOpCodes.push(null, null);
+  const startIndex = maskIndex + 2;
+  if (ngDevMode) {
+    attachDebugGetter(updateOpCodes, i18nUpdateOpCodesToString);
+  }
+  const textParts = str.split(BINDING_REGEXP);
+  let mask = 0;
+  for (let j = 0; j < textParts.length; j++) {
+    const textValue = textParts[j];
+    if (j & 1) {
+      const bindingIndex = bindingStart + parseInt(textValue, 10);
+      updateOpCodes.push(-1 - bindingIndex);
+      mask = mask | toMaskBit(bindingIndex);
+    } else if (textValue !== "") {
+      updateOpCodes.push(textValue);
+    }
+  }
+  updateOpCodes.push(destinationNode << 2 | (attrName ? 1 : 0));
+  if (attrName) {
+    updateOpCodes.push(attrName, sanitizeFn);
+  }
+  updateOpCodes[maskIndex] = mask;
+  updateOpCodes[sizeIndex] = updateOpCodes.length - startIndex;
+  return mask;
+}
+function countBindings(opCodes) {
+  let count2 = 0;
+  for (let i = 0; i < opCodes.length; i++) {
+    const opCode = opCodes[i];
+    if (typeof opCode === "number" && opCode < 0) {
+      count2++;
+    }
+  }
+  return count2;
+}
+function toMaskBit(bindingIndex) {
+  return 1 << Math.min(bindingIndex, 31);
+}
+function removeInnerTemplateTranslation(message) {
+  let match;
+  let res = "";
+  let index = 0;
+  let inTemplate = false;
+  let tagMatched;
+  while ((match = SUBTEMPLATE_REGEXP.exec(message)) !== null) {
+    if (!inTemplate) {
+      res += message.substring(index, match.index + match[0].length);
+      tagMatched = match[1];
+      inTemplate = true;
+    } else {
+      if (match[0] === `${MARKER}/*${tagMatched}${MARKER}`) {
+        index = match.index;
+        inTemplate = false;
+      }
+    }
+  }
+  ngDevMode && assertEqual(inTemplate, false, `Tag mismatch: unable to find the end of the sub-template in the translation "${message}"`);
+  res += message.slice(index);
+  return res;
+}
+function getTranslationForTemplate(message, subTemplateIndex) {
+  if (isRootTemplateMessage(subTemplateIndex)) {
+    return removeInnerTemplateTranslation(message);
+  } else {
+    const start = message.indexOf(`:${subTemplateIndex}${MARKER}`) + 2 + subTemplateIndex.toString().length;
+    const end = message.search(new RegExp(`${MARKER}\\/\\*\\d+:${subTemplateIndex}${MARKER}`));
+    return removeInnerTemplateTranslation(message.substring(start, end));
+  }
+}
+function icuStart(ast, tView, lView, updateOpCodes, parentIdx, icuExpression, anchorIdx) {
+  ngDevMode && assertDefined(icuExpression, "ICU expression must be defined");
+  let bindingMask = 0;
+  const tIcu = {
+    type: icuExpression.type,
+    currentCaseLViewIndex: allocExpando(tView, lView, 1, null),
+    anchorIdx,
+    cases: [],
+    create: [],
+    remove: [],
+    update: []
+  };
+  addUpdateIcuSwitch(updateOpCodes, icuExpression, anchorIdx);
+  setTIcu(tView, anchorIdx, tIcu);
+  const values = icuExpression.values;
+  const cases = [];
+  for (let i = 0; i < values.length; i++) {
+    const valueArr = values[i];
+    const nestedIcus = [];
+    for (let j = 0; j < valueArr.length; j++) {
+      const value = valueArr[j];
+      if (typeof value !== "string") {
+        const icuIndex = nestedIcus.push(value) - 1;
+        valueArr[j] = `<!--�${icuIndex}�-->`;
+      }
+    }
+    const caseAst = [];
+    cases.push(caseAst);
+    bindingMask = parseIcuCase(caseAst, tView, tIcu, lView, updateOpCodes, parentIdx, icuExpression.cases[i], valueArr.join(""), nestedIcus) | bindingMask;
+  }
+  if (bindingMask) {
+    addUpdateIcuUpdate(updateOpCodes, bindingMask, anchorIdx);
+  }
+  ast.push({
+    kind: 3,
+    index: anchorIdx,
+    cases,
+    currentCaseLViewIndex: tIcu.currentCaseLViewIndex
+  });
+}
+function parseICUBlock(pattern) {
+  const cases = [];
+  const values = [];
+  let icuType = 1;
+  let mainBinding = 0;
+  pattern = pattern.replace(ICU_BLOCK_REGEXP, function(str, binding, type) {
+    if (type === "select") {
+      icuType = 0;
+    } else {
+      icuType = 1;
+    }
+    mainBinding = parseInt(binding.slice(1), 10);
+    return "";
+  });
+  const parts = i18nParseTextIntoPartsAndICU(pattern);
+  for (let pos = 0; pos < parts.length; ) {
+    let key = parts[pos++].trim();
+    if (icuType === 1) {
+      key = key.replace(/\s*(?:=)?(\w+)\s*/, "$1");
+    }
+    if (key.length) {
+      cases.push(key);
+    }
+    const blocks = i18nParseTextIntoPartsAndICU(parts[pos++]);
+    if (cases.length > values.length) {
+      values.push(blocks);
+    }
+  }
+  return { type: icuType, mainBinding, cases, values };
+}
+function i18nParseTextIntoPartsAndICU(pattern) {
+  if (!pattern) {
+    return [];
+  }
+  let prevPos = 0;
+  const braceStack = [];
+  const results = [];
+  const braces = /[{}]/g;
+  braces.lastIndex = 0;
+  let match;
+  while (match = braces.exec(pattern)) {
+    const pos = match.index;
+    if (match[0] == "}") {
+      braceStack.pop();
+      if (braceStack.length == 0) {
+        const block = pattern.substring(prevPos, pos);
+        if (ICU_BLOCK_REGEXP.test(block)) {
+          results.push(parseICUBlock(block));
+        } else {
+          results.push(block);
+        }
+        prevPos = pos + 1;
+      }
+    } else {
+      if (braceStack.length == 0) {
+        const substring2 = pattern.substring(prevPos, pos);
+        results.push(substring2);
+        prevPos = pos + 1;
+      }
+      braceStack.push("{");
+    }
+  }
+  const substring = pattern.substring(prevPos);
+  results.push(substring);
+  return results;
+}
+function parseIcuCase(ast, tView, tIcu, lView, updateOpCodes, parentIdx, caseName, unsafeCaseHtml, nestedIcus) {
+  const create = [];
+  const remove2 = [];
+  const update = [];
+  if (ngDevMode) {
+    attachDebugGetter(create, icuCreateOpCodesToString);
+    attachDebugGetter(remove2, i18nRemoveOpCodesToString);
+    attachDebugGetter(update, i18nUpdateOpCodesToString);
+  }
+  tIcu.cases.push(caseName);
+  tIcu.create.push(create);
+  tIcu.remove.push(remove2);
+  tIcu.update.push(update);
+  const inertBodyHelper2 = getInertBodyHelper(getDocument());
+  const inertBodyElement = inertBodyHelper2.getInertBodyElement(unsafeCaseHtml);
+  ngDevMode && assertDefined(inertBodyElement, "Unable to generate inert body element");
+  const inertRootNode = getTemplateContent(inertBodyElement) || inertBodyElement;
+  if (inertRootNode) {
+    return walkIcuTree(ast, tView, tIcu, lView, updateOpCodes, create, remove2, update, inertRootNode, parentIdx, nestedIcus, 0);
+  } else {
+    return 0;
+  }
+}
+function walkIcuTree(ast, tView, tIcu, lView, sharedUpdateOpCodes, create, remove2, update, parentNode, parentIdx, nestedIcus, depth) {
+  let bindingMask = 0;
+  let currentNode = parentNode.firstChild;
+  while (currentNode) {
+    const newIndex = allocExpando(tView, lView, 1, null);
+    switch (currentNode.nodeType) {
+      case Node.ELEMENT_NODE:
+        const element = currentNode;
+        const tagName = element.tagName.toLowerCase();
+        if (VALID_ELEMENTS.hasOwnProperty(tagName)) {
+          addCreateNodeAndAppend(create, ELEMENT_MARKER, tagName, parentIdx, newIndex);
+          tView.data[newIndex] = tagName;
+          const elAttrs = element.attributes;
+          for (let i = 0; i < elAttrs.length; i++) {
+            const attr = elAttrs.item(i);
+            const lowerAttrName = attr.name.toLowerCase();
+            const hasBinding2 = !!attr.value.match(BINDING_REGEXP);
+            if (hasBinding2) {
+              if (VALID_ATTRS.hasOwnProperty(lowerAttrName)) {
+                if (URI_ATTRS[lowerAttrName]) {
+                  generateBindingUpdateOpCodes(update, attr.value, newIndex, attr.name, 0, _sanitizeUrl);
+                } else {
+                  generateBindingUpdateOpCodes(update, attr.value, newIndex, attr.name, 0, null);
+                }
+              } else {
+                ngDevMode && console.warn(`WARNING: ignoring unsafe attribute value ${lowerAttrName} on element ${tagName} (see ${XSS_SECURITY_URL})`);
+              }
+            } else {
+              addCreateAttribute(create, newIndex, attr);
+            }
+          }
+          const elementNode = {
+            kind: 1,
+            index: newIndex,
+            children: []
+          };
+          ast.push(elementNode);
+          bindingMask = walkIcuTree(elementNode.children, tView, tIcu, lView, sharedUpdateOpCodes, create, remove2, update, currentNode, newIndex, nestedIcus, depth + 1) | bindingMask;
+          addRemoveNode(remove2, newIndex, depth);
+        }
+        break;
+      case Node.TEXT_NODE:
+        const value = currentNode.textContent || "";
+        const hasBinding = value.match(BINDING_REGEXP);
+        addCreateNodeAndAppend(create, null, hasBinding ? "" : value, parentIdx, newIndex);
+        addRemoveNode(remove2, newIndex, depth);
+        if (hasBinding) {
+          bindingMask = generateBindingUpdateOpCodes(update, value, newIndex, null, 0, null) | bindingMask;
+        }
+        ast.push({
+          kind: 0,
+          index: newIndex
+        });
+        break;
+      case Node.COMMENT_NODE:
+        const isNestedIcu = NESTED_ICU.exec(currentNode.textContent || "");
+        if (isNestedIcu) {
+          const nestedIcuIndex = parseInt(isNestedIcu[1], 10);
+          const icuExpression = nestedIcus[nestedIcuIndex];
+          addCreateNodeAndAppend(create, ICU_MARKER, ngDevMode ? `nested ICU ${nestedIcuIndex}` : "", parentIdx, newIndex);
+          icuStart(ast, tView, lView, sharedUpdateOpCodes, parentIdx, icuExpression, newIndex);
+          addRemoveNestedIcu(remove2, newIndex, depth);
+        }
+        break;
+    }
+    currentNode = currentNode.nextSibling;
+  }
+  return bindingMask;
+}
+function addRemoveNode(remove2, index, depth) {
+  if (depth === 0) {
+    remove2.push(index);
+  }
+}
+function addRemoveNestedIcu(remove2, index, depth) {
+  if (depth === 0) {
+    remove2.push(~index);
+    remove2.push(index);
+  }
+}
+function addUpdateIcuSwitch(update, icuExpression, index) {
+  update.push(
+    toMaskBit(icuExpression.mainBinding),
+    2,
+    -1 - icuExpression.mainBinding,
+    index << 2 | 2
+    /* I18nUpdateOpCode.IcuSwitch */
+  );
+}
+function addUpdateIcuUpdate(update, bindingMask, index) {
+  update.push(
+    bindingMask,
+    1,
+    index << 2 | 3
+    /* I18nUpdateOpCode.IcuUpdate */
+  );
+}
+function addCreateNodeAndAppend(create, marker, text, appendToParentIdx, createAtIdx) {
+  if (marker !== null) {
+    create.push(marker);
+  }
+  create.push(text, createAtIdx, icuCreateOpCode(0, appendToParentIdx, createAtIdx));
+}
+function addCreateAttribute(create, newIndex, attr) {
+  create.push(newIndex << 1 | 1, attr.name, attr.value);
+}
+var ROOT_TEMPLATE_ID = 0;
+var PP_MULTI_VALUE_PLACEHOLDERS_REGEXP = /\[(�.+?�?)\]/;
+var PP_PLACEHOLDERS_REGEXP = /\[(�.+?�?)\]|(�\/?\*\d+:\d+�)/g;
+var PP_ICU_VARS_REGEXP = /({\s*)(VAR_(PLURAL|SELECT)(_\d+)?)(\s*,)/g;
+var PP_ICU_PLACEHOLDERS_REGEXP = /{([A-Z0-9_]+)}/g;
+var PP_ICUS_REGEXP = /�I18N_EXP_(ICU(_\d+)?)�/g;
+var PP_CLOSE_TEMPLATE_REGEXP = /\/\*/;
+var PP_TEMPLATE_ID_REGEXP = /\d+\:(\d+)/;
+function i18nPostprocess(message, replacements = {}) {
+  let result = message;
+  if (PP_MULTI_VALUE_PLACEHOLDERS_REGEXP.test(message)) {
+    const matches = {};
+    const templateIdsStack = [ROOT_TEMPLATE_ID];
+    result = result.replace(PP_PLACEHOLDERS_REGEXP, (m, phs, tmpl) => {
+      const content = phs || tmpl;
+      const placeholders = matches[content] || [];
+      if (!placeholders.length) {
+        content.split("|").forEach((placeholder2) => {
+          const match = placeholder2.match(PP_TEMPLATE_ID_REGEXP);
+          const templateId2 = match ? parseInt(match[1], 10) : ROOT_TEMPLATE_ID;
+          const isCloseTemplateTag2 = PP_CLOSE_TEMPLATE_REGEXP.test(placeholder2);
+          placeholders.push([templateId2, isCloseTemplateTag2, placeholder2]);
+        });
+        matches[content] = placeholders;
+      }
+      if (!placeholders.length) {
+        throw new Error(`i18n postprocess: unmatched placeholder - ${content}`);
+      }
+      const currentTemplateId = templateIdsStack[templateIdsStack.length - 1];
+      let idx = 0;
+      for (let i = 0; i < placeholders.length; i++) {
+        if (placeholders[i][0] === currentTemplateId) {
+          idx = i;
+          break;
+        }
+      }
+      const [templateId, isCloseTemplateTag, placeholder] = placeholders[idx];
+      if (isCloseTemplateTag) {
+        templateIdsStack.pop();
+      } else if (currentTemplateId !== templateId) {
+        templateIdsStack.push(templateId);
+      }
+      placeholders.splice(idx, 1);
+      return placeholder;
+    });
+  }
+  if (!Object.keys(replacements).length) {
+    return result;
+  }
+  result = result.replace(PP_ICU_VARS_REGEXP, (match, start, key, _type, _idx, end) => {
+    return replacements.hasOwnProperty(key) ? `${start}${replacements[key]}${end}` : match;
+  });
+  result = result.replace(PP_ICU_PLACEHOLDERS_REGEXP, (match, key) => {
+    return replacements.hasOwnProperty(key) ? replacements[key] : match;
+  });
+  result = result.replace(PP_ICUS_REGEXP, (match, key) => {
+    if (replacements.hasOwnProperty(key)) {
+      const list = replacements[key];
+      if (!list.length) {
+        throw new Error(`i18n postprocess: unmatched ICU - ${match} with key: ${key}`);
+      }
+      return list.shift();
+    }
+    return match;
+  });
+  return result;
+}
+function ɵɵi18nStart(index, messageIndex, subTemplateIndex = -1) {
+  const tView = getTView();
+  const lView = getLView();
+  const adjustedIndex = HEADER_OFFSET + index;
+  ngDevMode && assertDefined(tView, `tView should be defined`);
+  const message = getConstant(tView.consts, messageIndex);
+  const parentTNode = getCurrentParentTNode();
+  if (tView.firstCreatePass) {
+    i18nStartFirstCreatePass(tView, parentTNode === null ? 0 : parentTNode.index, lView, adjustedIndex, message, subTemplateIndex);
+  }
+  if (tView.type === 2) {
+    const componentLView = lView[DECLARATION_COMPONENT_VIEW];
+    componentLView[FLAGS] |= 32;
+  } else {
+    lView[FLAGS] |= 32;
+  }
+  const tI18n = tView.data[adjustedIndex];
+  const sameViewParentTNode = parentTNode === lView[T_HOST] ? null : parentTNode;
+  const parentRNode = getClosestRElement(tView, sameViewParentTNode, lView);
+  const insertInFrontOf = parentTNode && parentTNode.type & 8 ? lView[parentTNode.index] : null;
+  prepareI18nBlockForHydration(lView, adjustedIndex, parentTNode, subTemplateIndex);
+  applyCreateOpCodes(lView, tI18n.create, parentRNode, insertInFrontOf);
+  setInI18nBlock(true);
+}
+function ɵɵi18nEnd() {
+  setInI18nBlock(false);
+}
+function ɵɵi18n(index, messageIndex, subTemplateIndex) {
+  ɵɵi18nStart(index, messageIndex, subTemplateIndex);
+  ɵɵi18nEnd();
+}
+function ɵɵi18nAttributes(index, attrsIndex) {
+  const tView = getTView();
+  ngDevMode && assertDefined(tView, `tView should be defined`);
+  const attrs = getConstant(tView.consts, attrsIndex);
+  i18nAttributesFirstPass(tView, index + HEADER_OFFSET, attrs);
+}
+function ɵɵi18nExp(value) {
+  const lView = getLView();
+  setMaskBit(bindingUpdated(lView, nextBindingIndex(), value));
+  return ɵɵi18nExp;
+}
+function ɵɵi18nApply(index) {
+  applyI18n(getTView(), getLView(), index + HEADER_OFFSET);
+}
+function ɵɵi18nPostprocess(message, replacements = {}) {
+  return i18nPostprocess(message, replacements);
+}
+function ɵɵlistener(eventName, listenerFn, eventTargetResolver) {
+  const lView = getLView();
+  const tView = getTView();
+  const tNode = getCurrentTNode();
+  listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn, eventTargetResolver);
+  return ɵɵlistener;
+}
+function ɵɵsyntheticHostListener(eventName, listenerFn) {
+  const tNode = getCurrentTNode();
+  const lView = getLView();
+  const tView = getTView();
+  const currentDef = getCurrentDirectiveDef(tView.data);
+  const renderer = loadComponentRenderer(currentDef, tNode, lView);
+  listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn);
+  return ɵɵsyntheticHostListener;
+}
+function listenerInternal(tView, lView, renderer, tNode, eventName, listenerFn, eventTargetResolver) {
+  ngDevMode && assertTNodeType(
+    tNode,
+    3 | 12
+    /* TNodeType.AnyContainer */
+  );
+  let processOutputs = true;
+  let wrappedListener = null;
+  if (tNode.type & 3 || eventTargetResolver) {
+    wrappedListener ??= wrapListener(tNode, lView, listenerFn);
+    const hasCoalescedDomEvent = listenToDomEvent(tNode, tView, lView, eventTargetResolver, renderer, eventName, listenerFn, wrappedListener);
+    if (hasCoalescedDomEvent) {
+      processOutputs = false;
+    }
+  }
+  if (processOutputs) {
+    const outputConfig = tNode.outputs?.[eventName];
+    const hostDirectiveOutputConfig = tNode.hostDirectiveOutputs?.[eventName];
+    if (hostDirectiveOutputConfig && hostDirectiveOutputConfig.length) {
+      for (let i = 0; i < hostDirectiveOutputConfig.length; i += 2) {
+        const index = hostDirectiveOutputConfig[i];
+        const lookupName = hostDirectiveOutputConfig[i + 1];
+        wrappedListener ??= wrapListener(tNode, lView, listenerFn);
+        listenToOutput(tNode, lView, index, lookupName, eventName, wrappedListener);
+      }
+    }
+    if (outputConfig && outputConfig.length) {
+      for (const index of outputConfig) {
+        wrappedListener ??= wrapListener(tNode, lView, listenerFn);
+        listenToOutput(tNode, lView, index, eventName, eventName, wrappedListener);
+      }
+    }
+  }
+}
+function ɵɵnextContext(level = 1) {
+  return nextContextImpl(level);
+}
+function matchingProjectionSlotIndex(tNode, projectionSlots) {
+  let wildcardNgContentIndex = null;
+  const ngProjectAsAttrVal = getProjectAsAttrValue(tNode);
+  for (let i = 0; i < projectionSlots.length; i++) {
+    const slotValue = projectionSlots[i];
+    if (slotValue === "*") {
+      wildcardNgContentIndex = i;
+      continue;
+    }
+    if (ngProjectAsAttrVal === null ? isNodeMatchingSelectorList(
+      tNode,
+      slotValue,
+      /* isProjectionMode */
+      true
+    ) : isSelectorInSelectorList(ngProjectAsAttrVal, slotValue)) {
+      return i;
+    }
+  }
+  return wildcardNgContentIndex;
+}
+function ɵɵprojectionDef(projectionSlots) {
+  const componentNode = getLView()[DECLARATION_COMPONENT_VIEW][T_HOST];
+  if (!componentNode.projection) {
+    const numProjectionSlots = projectionSlots ? projectionSlots.length : 1;
+    const projectionHeads = componentNode.projection = newArray(numProjectionSlots, null);
+    const tails = projectionHeads.slice();
+    let componentChild = componentNode.child;
+    while (componentChild !== null) {
+      if (componentChild.type !== 128) {
+        const slotIndex = projectionSlots ? matchingProjectionSlotIndex(componentChild, projectionSlots) : 0;
+        if (slotIndex !== null) {
+          if (tails[slotIndex]) {
+            tails[slotIndex].projectionNext = componentChild;
+          } else {
+            projectionHeads[slotIndex] = componentChild;
+          }
+          tails[slotIndex] = componentChild;
+        }
+      }
+      componentChild = componentChild.next;
+    }
+  }
+}
+function ɵɵprojection(nodeIndex, selectorIndex = 0, attrs, fallbackTemplateFn, fallbackDecls, fallbackVars) {
+  const lView = getLView();
+  const tView = getTView();
+  const fallbackIndex = fallbackTemplateFn ? nodeIndex + 1 : null;
+  if (fallbackIndex !== null) {
+    declareTemplate(lView, tView, fallbackIndex, fallbackTemplateFn, fallbackDecls, fallbackVars, null, attrs);
+  }
+  const tProjectionNode = getOrCreateTNode(tView, HEADER_OFFSET + nodeIndex, 16, null, attrs || null);
+  if (tProjectionNode.projection === null) {
+    tProjectionNode.projection = selectorIndex;
+  }
+  setCurrentTNodeAsNotParent();
+  const hydrationInfo = lView[HYDRATION];
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock();
+  const componentHostNode = lView[DECLARATION_COMPONENT_VIEW][T_HOST];
+  const isEmpty2 = componentHostNode.projection[tProjectionNode.projection] === null;
+  if (isEmpty2 && fallbackIndex !== null) {
+    insertFallbackContent(lView, tView, fallbackIndex);
+  } else if (isNodeCreationMode && !isDetachedByI18n(tProjectionNode)) {
+    applyProjection(tView, lView, tProjectionNode);
+  }
+}
+function insertFallbackContent(lView, tView, fallbackIndex) {
+  const adjustedIndex = HEADER_OFFSET + fallbackIndex;
+  const fallbackTNode = tView.data[adjustedIndex];
+  const fallbackLContainer = lView[adjustedIndex];
+  ngDevMode && assertTNode(fallbackTNode);
+  ngDevMode && assertLContainer(fallbackLContainer);
+  const dehydratedView = findMatchingDehydratedView(fallbackLContainer, fallbackTNode.tView.ssrId);
+  const fallbackLView = createAndRenderEmbeddedLView(lView, fallbackTNode, void 0, {
+    dehydratedView
+  });
+  addLViewToLContainer(fallbackLContainer, fallbackLView, 0, shouldAddViewToDom(fallbackTNode, dehydratedView));
+}
+function ɵɵcontentQuery(directiveIndex, predicate, flags, read) {
+  createContentQuery(directiveIndex, predicate, flags, read);
+}
+function ɵɵviewQuery(predicate, flags, read) {
+  createViewQuery(predicate, flags, read);
+}
+function ɵɵqueryRefresh(queryList) {
+  const lView = getLView();
+  const tView = getTView();
+  const queryIndex = getCurrentQueryIndex();
+  setCurrentQueryIndex(queryIndex + 1);
+  const tQuery = getTQuery(tView, queryIndex);
+  if (queryList.dirty && isCreationMode(lView) === ((tQuery.metadata.flags & 2) === 2)) {
+    if (tQuery.matches === null) {
+      queryList.reset([]);
+    } else {
+      const result = getQueryResults(lView, queryIndex);
+      queryList.reset(result, unwrapElementRef);
+      queryList.notifyOnChanges();
+    }
+    return true;
+  }
+  return false;
+}
+function ɵɵloadQuery() {
+  return loadQueryInternal(getLView(), getCurrentQueryIndex());
+}
+function ɵɵcontentQuerySignal(directiveIndex, target, predicate, flags, read) {
+  bindQueryToSignal(target, createContentQuery(directiveIndex, predicate, flags, read));
+}
+function ɵɵviewQuerySignal(target, predicate, flags, read) {
+  bindQueryToSignal(target, createViewQuery(predicate, flags, read));
+}
+function ɵɵqueryAdvance(indexOffset = 1) {
+  setCurrentQueryIndex(getCurrentQueryIndex() + indexOffset);
+}
+function ɵɵreference(index) {
+  const contextLView = getContextLView();
+  return load(contextLView, HEADER_OFFSET + index);
+}
+function toTStylingRange(prev, next) {
+  ngDevMode && assertNumberInRange(
+    prev,
+    0,
+    32767
+    /* StylingRange.UNSIGNED_MASK */
+  );
+  ngDevMode && assertNumberInRange(
+    next,
+    0,
+    32767
+    /* StylingRange.UNSIGNED_MASK */
+  );
+  return prev << 17 | next << 2;
+}
+function getTStylingRangePrev(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return tStylingRange >> 17 & 32767;
+}
+function getTStylingRangePrevDuplicate(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return (tStylingRange & 2) == 2;
+}
+function setTStylingRangePrev(tStylingRange, previous) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  ngDevMode && assertNumberInRange(
+    previous,
+    0,
+    32767
+    /* StylingRange.UNSIGNED_MASK */
+  );
+  return tStylingRange & ~4294836224 | previous << 17;
+}
+function setTStylingRangePrevDuplicate(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return tStylingRange | 2;
+}
+function getTStylingRangeNext(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return (tStylingRange & 131068) >> 2;
+}
+function setTStylingRangeNext(tStylingRange, next) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  ngDevMode && assertNumberInRange(
+    next,
+    0,
+    32767
+    /* StylingRange.UNSIGNED_MASK */
+  );
+  return tStylingRange & ~131068 | //
+  next << 2;
+}
+function getTStylingRangeNextDuplicate(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return (tStylingRange & 1) === 1;
+}
+function setTStylingRangeNextDuplicate(tStylingRange) {
+  ngDevMode && assertNumber(tStylingRange, "expected number");
+  return tStylingRange | 1;
+}
+function insertTStylingBinding(tData, tNode, tStylingKeyWithStatic, index, isHostBinding, isClassBinding) {
+  ngDevMode && assertFirstUpdatePass(getTView());
+  let tBindings = isClassBinding ? tNode.classBindings : tNode.styleBindings;
+  let tmplHead = getTStylingRangePrev(tBindings);
+  let tmplTail = getTStylingRangeNext(tBindings);
+  tData[index] = tStylingKeyWithStatic;
+  let isKeyDuplicateOfStatic = false;
+  let tStylingKey;
+  if (Array.isArray(tStylingKeyWithStatic)) {
+    const staticKeyValueArray = tStylingKeyWithStatic;
+    tStylingKey = staticKeyValueArray[1];
+    if (tStylingKey === null || keyValueArrayIndexOf(staticKeyValueArray, tStylingKey) > 0) {
+      isKeyDuplicateOfStatic = true;
+    }
+  } else {
+    tStylingKey = tStylingKeyWithStatic;
+  }
+  if (isHostBinding) {
+    const hasTemplateBindings = tmplTail !== 0;
+    if (hasTemplateBindings) {
+      const previousNode = getTStylingRangePrev(tData[tmplHead + 1]);
+      tData[index + 1] = toTStylingRange(previousNode, tmplHead);
+      if (previousNode !== 0) {
+        tData[previousNode + 1] = setTStylingRangeNext(tData[previousNode + 1], index);
+      }
+      tData[tmplHead + 1] = setTStylingRangePrev(tData[tmplHead + 1], index);
+    } else {
+      tData[index + 1] = toTStylingRange(tmplHead, 0);
+      if (tmplHead !== 0) {
+        tData[tmplHead + 1] = setTStylingRangeNext(tData[tmplHead + 1], index);
+      }
+      tmplHead = index;
+    }
+  } else {
+    tData[index + 1] = toTStylingRange(tmplTail, 0);
+    ngDevMode && assertEqual(tmplHead !== 0 && tmplTail === 0, false, "Adding template bindings after hostBindings is not allowed.");
+    if (tmplHead === 0) {
+      tmplHead = index;
+    } else {
+      tData[tmplTail + 1] = setTStylingRangeNext(tData[tmplTail + 1], index);
+    }
+    tmplTail = index;
+  }
+  if (isKeyDuplicateOfStatic) {
+    tData[index + 1] = setTStylingRangePrevDuplicate(tData[index + 1]);
+  }
+  markDuplicates(tData, tStylingKey, index, true);
+  markDuplicates(tData, tStylingKey, index, false);
+  markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding);
+  tBindings = toTStylingRange(tmplHead, tmplTail);
+  if (isClassBinding) {
+    tNode.classBindings = tBindings;
+  } else {
+    tNode.styleBindings = tBindings;
+  }
+}
+function markDuplicateOfResidualStyling(tNode, tStylingKey, tData, index, isClassBinding) {
+  const residual = isClassBinding ? tNode.residualClasses : tNode.residualStyles;
+  if (residual != null && typeof tStylingKey == "string" && keyValueArrayIndexOf(residual, tStylingKey) >= 0) {
+    tData[index + 1] = setTStylingRangeNextDuplicate(tData[index + 1]);
+  }
+}
+function markDuplicates(tData, tStylingKey, index, isPrevDir) {
+  const tStylingAtIndex = tData[index + 1];
+  const isMap = tStylingKey === null;
+  let cursor = isPrevDir ? getTStylingRangePrev(tStylingAtIndex) : getTStylingRangeNext(tStylingAtIndex);
+  let foundDuplicate = false;
+  while (cursor !== 0 && (foundDuplicate === false || isMap)) {
+    ngDevMode && assertIndexInRange(tData, cursor);
+    const tStylingValueAtCursor = tData[cursor];
+    const tStyleRangeAtCursor = tData[cursor + 1];
+    if (isStylingMatch(tStylingValueAtCursor, tStylingKey)) {
+      foundDuplicate = true;
+      tData[cursor + 1] = isPrevDir ? setTStylingRangeNextDuplicate(tStyleRangeAtCursor) : setTStylingRangePrevDuplicate(tStyleRangeAtCursor);
+    }
+    cursor = isPrevDir ? getTStylingRangePrev(tStyleRangeAtCursor) : getTStylingRangeNext(tStyleRangeAtCursor);
+  }
+  if (foundDuplicate) {
+    tData[index + 1] = isPrevDir ? setTStylingRangePrevDuplicate(tStylingAtIndex) : setTStylingRangeNextDuplicate(tStylingAtIndex);
+  }
+}
+function isStylingMatch(tStylingKeyCursor, tStylingKey) {
+  ngDevMode && assertNotEqual(Array.isArray(tStylingKey), true, "Expected that 'tStylingKey' has been unwrapped");
+  if (tStylingKeyCursor === null || // If the cursor is `null` it means that we have map at that
+  // location so we must assume that we have a match.
+  tStylingKey == null || // If `tStylingKey` is `null` then it is a map therefor assume that it
+  // contains a match.
+  (Array.isArray(tStylingKeyCursor) ? tStylingKeyCursor[1] : tStylingKeyCursor) === tStylingKey) {
+    return true;
+  } else if (Array.isArray(tStylingKeyCursor) && typeof tStylingKey === "string") {
+    return keyValueArrayIndexOf(tStylingKeyCursor, tStylingKey) >= 0;
+  }
+  return false;
+}
+var parserState = {
+  textEnd: 0,
+  key: 0,
+  keyEnd: 0,
+  value: 0,
+  valueEnd: 0
+};
+function getLastParsedKey(text) {
+  return text.substring(parserState.key, parserState.keyEnd);
+}
+function getLastParsedValue(text) {
+  return text.substring(parserState.value, parserState.valueEnd);
+}
+function parseClassName(text) {
+  resetParserState(text);
+  return parseClassNameNext(text, consumeWhitespace(text, 0, parserState.textEnd));
+}
+function parseClassNameNext(text, index) {
+  const end = parserState.textEnd;
+  if (end === index) {
+    return -1;
+  }
+  index = parserState.keyEnd = consumeClassToken(text, parserState.key = index, end);
+  return consumeWhitespace(text, index, end);
+}
+function parseStyle(text) {
+  resetParserState(text);
+  return parseStyleNext(text, consumeWhitespace(text, 0, parserState.textEnd));
+}
+function parseStyleNext(text, startIndex) {
+  const end = parserState.textEnd;
+  let index = parserState.key = consumeWhitespace(text, startIndex, end);
+  if (end === index) {
+    return -1;
+  }
+  index = parserState.keyEnd = consumeStyleKey(text, index, end);
+  index = consumeSeparator(
+    text,
+    index,
+    end,
+    58
+    /* CharCode.COLON */
+  );
+  index = parserState.value = consumeWhitespace(text, index, end);
+  index = parserState.valueEnd = consumeStyleValue(text, index, end);
+  return consumeSeparator(
+    text,
+    index,
+    end,
+    59
+    /* CharCode.SEMI_COLON */
+  );
+}
+function resetParserState(text) {
+  parserState.key = 0;
+  parserState.keyEnd = 0;
+  parserState.value = 0;
+  parserState.valueEnd = 0;
+  parserState.textEnd = text.length;
+}
+function consumeWhitespace(text, startIndex, endIndex) {
+  while (startIndex < endIndex && text.charCodeAt(startIndex) <= 32) {
+    startIndex++;
+  }
+  return startIndex;
+}
+function consumeClassToken(text, startIndex, endIndex) {
+  while (startIndex < endIndex && text.charCodeAt(startIndex) > 32) {
+    startIndex++;
+  }
+  return startIndex;
+}
+function consumeStyleKey(text, startIndex, endIndex) {
+  let ch;
+  while (startIndex < endIndex && ((ch = text.charCodeAt(startIndex)) === 45 || ch === 95 || (ch & -33) >= 65 && (ch & -33) <= 90 || ch >= 48 && ch <= 57)) {
+    startIndex++;
+  }
+  return startIndex;
+}
+function consumeSeparator(text, startIndex, endIndex, separator) {
+  startIndex = consumeWhitespace(text, startIndex, endIndex);
+  if (startIndex < endIndex) {
+    if (ngDevMode && text.charCodeAt(startIndex) !== separator) {
+      malformedStyleError(text, String.fromCharCode(separator), startIndex);
+    }
+    startIndex++;
+  }
+  return startIndex;
+}
+function consumeStyleValue(text, startIndex, endIndex) {
+  let ch1 = -1;
+  let ch2 = -1;
+  let ch3 = -1;
+  let i = startIndex;
+  let lastChIndex = i;
+  while (i < endIndex) {
+    const ch = text.charCodeAt(i++);
+    if (ch === 59) {
+      return lastChIndex;
+    } else if (ch === 34 || ch === 39) {
+      lastChIndex = i = consumeQuotedText(text, ch, i, endIndex);
+    } else if (startIndex === i - 4 && // We have seen only 4 characters so far "URL(" (Ignore "foo_URL()")
+    ch3 === 85 && ch2 === 82 && ch1 === 76 && ch === 40) {
+      lastChIndex = i = consumeQuotedText(text, 41, i, endIndex);
+    } else if (ch > 32) {
+      lastChIndex = i;
+    }
+    ch3 = ch2;
+    ch2 = ch1;
+    ch1 = ch & -33;
+  }
+  return lastChIndex;
+}
+function consumeQuotedText(text, quoteCharCode, startIndex, endIndex) {
+  let ch1 = -1;
+  let index = startIndex;
+  while (index < endIndex) {
+    const ch = text.charCodeAt(index++);
+    if (ch == quoteCharCode && ch1 !== 92) {
+      return index;
+    }
+    if (ch == 92 && ch1 === 92) {
+      ch1 = 0;
+    } else {
+      ch1 = ch;
+    }
+  }
+  throw ngDevMode ? malformedStyleError(text, String.fromCharCode(quoteCharCode), endIndex) : new Error();
+}
+function malformedStyleError(text, expecting, index) {
+  ngDevMode && assertEqual(typeof text === "string", true, "String expected here");
+  throw throwError2(`Malformed style at location ${index} in string '` + text.substring(0, index) + "[>>" + text.substring(index, index + 1) + "<<]" + text.slice(index + 1) + `'. Expecting '${expecting}'.`);
+}
+function ɵɵstyleProp(prop, value, suffix) {
+  checkStylingProperty(prop, value, suffix, false);
+  return ɵɵstyleProp;
+}
+function ɵɵclassProp(className, value) {
+  checkStylingProperty(className, value, null, true);
+  return ɵɵclassProp;
+}
+function ɵɵstyleMap(styles) {
+  checkStylingMap(styleKeyValueArraySet, styleStringParser, styles, false);
+}
+function styleStringParser(keyValueArray, text) {
+  for (let i = parseStyle(text); i >= 0; i = parseStyleNext(text, i)) {
+    styleKeyValueArraySet(keyValueArray, getLastParsedKey(text), getLastParsedValue(text));
+  }
+}
+function ɵɵclassMap(classes) {
+  checkStylingMap(classKeyValueArraySet, classStringParser, classes, true);
+}
+function classStringParser(keyValueArray, text) {
+  for (let i = parseClassName(text); i >= 0; i = parseClassNameNext(text, i)) {
+    keyValueArraySet(keyValueArray, getLastParsedKey(text), true);
+  }
+}
+function checkStylingProperty(prop, value, suffix, isClassBased) {
+  const lView = getLView();
+  const tView = getTView();
+  const bindingIndex = incrementBindingIndex(2);
+  if (tView.firstUpdatePass) {
+    stylingFirstUpdatePass(tView, prop, bindingIndex, isClassBased);
+  }
+  if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {
+    const tNode = tView.data[getSelectedIndex()];
+    updateStyling(tView, tNode, lView, lView[RENDERER], prop, lView[bindingIndex + 1] = normalizeSuffix(value, suffix), isClassBased, bindingIndex);
+  }
+}
+function checkStylingMap(keyValueArraySet2, stringParser, value, isClassBased) {
+  const tView = getTView();
+  const bindingIndex = incrementBindingIndex(2);
+  if (tView.firstUpdatePass) {
+    stylingFirstUpdatePass(tView, null, bindingIndex, isClassBased);
+  }
+  const lView = getLView();
+  if (value !== NO_CHANGE && bindingUpdated(lView, bindingIndex, value)) {
+    const tNode = tView.data[getSelectedIndex()];
+    if (hasStylingInputShadow(tNode, isClassBased) && !isInHostBindings(tView, bindingIndex)) {
+      if (ngDevMode) {
+        const tStylingKey = tView.data[bindingIndex];
+        assertEqual(Array.isArray(tStylingKey) ? tStylingKey[1] : tStylingKey, false, "Styling linked list shadow input should be marked as 'false'");
+      }
+      let staticPrefix = isClassBased ? tNode.classesWithoutHost : tNode.stylesWithoutHost;
+      ngDevMode && isClassBased === false && staticPrefix !== null && assertEqual(staticPrefix.endsWith(";"), true, "Expecting static portion to end with ';'");
+      if (staticPrefix !== null) {
+        value = concatStringsWithSpace(staticPrefix, value ? value : "");
+      }
+      setDirectiveInputsWhichShadowsStyling(tView, tNode, lView, value, isClassBased);
+    } else {
+      updateStylingMap(tView, tNode, lView, lView[RENDERER], lView[bindingIndex + 1], lView[bindingIndex + 1] = toStylingKeyValueArray(keyValueArraySet2, stringParser, value), isClassBased, bindingIndex);
+    }
+  }
+}
+function isInHostBindings(tView, bindingIndex) {
+  return bindingIndex >= tView.expandoStartIndex;
+}
+function stylingFirstUpdatePass(tView, tStylingKey, bindingIndex, isClassBased) {
+  ngDevMode && assertFirstUpdatePass(tView);
+  const tData = tView.data;
+  if (tData[bindingIndex + 1] === null) {
+    const tNode = tData[getSelectedIndex()];
+    ngDevMode && assertDefined(tNode, "TNode expected");
+    const isHostBindings = isInHostBindings(tView, bindingIndex);
+    if (hasStylingInputShadow(tNode, isClassBased) && tStylingKey === null && !isHostBindings) {
+      tStylingKey = false;
+    }
+    tStylingKey = wrapInStaticStylingKey(tData, tNode, tStylingKey, isClassBased);
+    insertTStylingBinding(tData, tNode, tStylingKey, bindingIndex, isHostBindings, isClassBased);
+  }
+}
+function wrapInStaticStylingKey(tData, tNode, stylingKey, isClassBased) {
+  const hostDirectiveDef = getCurrentDirectiveDef(tData);
+  let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;
+  if (hostDirectiveDef === null) {
+    const isFirstStylingInstructionInTemplate = (isClassBased ? tNode.classBindings : tNode.styleBindings) === 0;
+    if (isFirstStylingInstructionInTemplate) {
+      stylingKey = collectStylingFromDirectives(null, tData, tNode, stylingKey, isClassBased);
+      stylingKey = collectStylingFromTAttrs(stylingKey, tNode.attrs, isClassBased);
+      residual = null;
+    }
+  } else {
+    const directiveStylingLast = tNode.directiveStylingLast;
+    const isFirstStylingInstructionInHostBinding = directiveStylingLast === -1 || tData[directiveStylingLast] !== hostDirectiveDef;
+    if (isFirstStylingInstructionInHostBinding) {
+      stylingKey = collectStylingFromDirectives(hostDirectiveDef, tData, tNode, stylingKey, isClassBased);
+      if (residual === null) {
+        let templateStylingKey = getTemplateHeadTStylingKey(tData, tNode, isClassBased);
+        if (templateStylingKey !== void 0 && Array.isArray(templateStylingKey)) {
+          templateStylingKey = collectStylingFromDirectives(null, tData, tNode, templateStylingKey[1], isClassBased);
+          templateStylingKey = collectStylingFromTAttrs(templateStylingKey, tNode.attrs, isClassBased);
+          setTemplateHeadTStylingKey(tData, tNode, isClassBased, templateStylingKey);
+        }
+      } else {
+        residual = collectResidual(tData, tNode, isClassBased);
+      }
+    }
+  }
+  if (residual !== void 0) {
+    isClassBased ? tNode.residualClasses = residual : tNode.residualStyles = residual;
+  }
+  return stylingKey;
+}
+function getTemplateHeadTStylingKey(tData, tNode, isClassBased) {
+  const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;
+  if (getTStylingRangeNext(bindings) === 0) {
+    return void 0;
+  }
+  return tData[getTStylingRangePrev(bindings)];
+}
+function setTemplateHeadTStylingKey(tData, tNode, isClassBased, tStylingKey) {
+  const bindings = isClassBased ? tNode.classBindings : tNode.styleBindings;
+  ngDevMode && assertNotEqual(getTStylingRangeNext(bindings), 0, "Expecting to have at least one template styling binding.");
+  tData[getTStylingRangePrev(bindings)] = tStylingKey;
+}
+function collectResidual(tData, tNode, isClassBased) {
+  let residual = void 0;
+  const directiveEnd = tNode.directiveEnd;
+  ngDevMode && assertNotEqual(tNode.directiveStylingLast, -1, "By the time this function gets called at least one hostBindings-node styling instruction must have executed.");
+  for (let i = 1 + tNode.directiveStylingLast; i < directiveEnd; i++) {
+    const attrs = tData[i].hostAttrs;
+    residual = collectStylingFromTAttrs(residual, attrs, isClassBased);
+  }
+  return collectStylingFromTAttrs(residual, tNode.attrs, isClassBased);
+}
+function collectStylingFromDirectives(hostDirectiveDef, tData, tNode, stylingKey, isClassBased) {
+  let currentDirective = null;
+  const directiveEnd = tNode.directiveEnd;
+  let directiveStylingLast = tNode.directiveStylingLast;
+  if (directiveStylingLast === -1) {
+    directiveStylingLast = tNode.directiveStart;
+  } else {
+    directiveStylingLast++;
+  }
+  while (directiveStylingLast < directiveEnd) {
+    currentDirective = tData[directiveStylingLast];
+    ngDevMode && assertDefined(currentDirective, "expected to be defined");
+    stylingKey = collectStylingFromTAttrs(stylingKey, currentDirective.hostAttrs, isClassBased);
+    if (currentDirective === hostDirectiveDef)
+      break;
+    directiveStylingLast++;
+  }
+  if (hostDirectiveDef !== null) {
+    tNode.directiveStylingLast = directiveStylingLast;
+  }
+  return stylingKey;
+}
+function collectStylingFromTAttrs(stylingKey, attrs, isClassBased) {
+  const desiredMarker = isClassBased ? 1 : 2;
+  let currentMarker = -1;
+  if (attrs !== null) {
+    for (let i = 0; i < attrs.length; i++) {
+      const item = attrs[i];
+      if (typeof item === "number") {
+        currentMarker = item;
+      } else {
+        if (currentMarker === desiredMarker) {
+          if (!Array.isArray(stylingKey)) {
+            stylingKey = stylingKey === void 0 ? [] : ["", stylingKey];
+          }
+          keyValueArraySet(stylingKey, item, isClassBased ? true : attrs[++i]);
+        }
+      }
+    }
+  }
+  return stylingKey === void 0 ? null : stylingKey;
+}
+function toStylingKeyValueArray(keyValueArraySet2, stringParser, value) {
+  if (value == null || value === "")
+    return EMPTY_ARRAY;
+  const styleKeyValueArray = [];
+  const unwrappedValue = unwrapSafeValue(value);
+  if (Array.isArray(unwrappedValue)) {
+    for (let i = 0; i < unwrappedValue.length; i++) {
+      keyValueArraySet2(styleKeyValueArray, unwrappedValue[i], true);
+    }
+  } else if (typeof unwrappedValue === "object") {
+    for (const key in unwrappedValue) {
+      if (unwrappedValue.hasOwnProperty(key)) {
+        keyValueArraySet2(styleKeyValueArray, key, unwrappedValue[key]);
+      }
+    }
+  } else if (typeof unwrappedValue === "string") {
+    stringParser(styleKeyValueArray, unwrappedValue);
+  } else {
+    ngDevMode && throwError2("Unsupported styling type: " + typeof unwrappedValue + " (" + unwrappedValue + ")");
+  }
+  return styleKeyValueArray;
+}
+function styleKeyValueArraySet(keyValueArray, key, value) {
+  keyValueArraySet(keyValueArray, key, unwrapSafeValue(value));
+}
+function classKeyValueArraySet(keyValueArray, key, value) {
+  const stringKey = String(key);
+  if (stringKey !== "" && !stringKey.includes(" ")) {
+    keyValueArraySet(keyValueArray, stringKey, value);
+  }
+}
+function updateStylingMap(tView, tNode, lView, renderer, oldKeyValueArray, newKeyValueArray, isClassBased, bindingIndex) {
+  if (oldKeyValueArray === NO_CHANGE) {
+    oldKeyValueArray = EMPTY_ARRAY;
+  }
+  let oldIndex = 0;
+  let newIndex = 0;
+  let oldKey = 0 < oldKeyValueArray.length ? oldKeyValueArray[0] : null;
+  let newKey = 0 < newKeyValueArray.length ? newKeyValueArray[0] : null;
+  while (oldKey !== null || newKey !== null) {
+    ngDevMode && assertLessThan(oldIndex, 999, "Are we stuck in infinite loop?");
+    ngDevMode && assertLessThan(newIndex, 999, "Are we stuck in infinite loop?");
+    const oldValue = oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex + 1] : void 0;
+    const newValue = newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex + 1] : void 0;
+    let setKey = null;
+    let setValue = void 0;
+    if (oldKey === newKey) {
+      oldIndex += 2;
+      newIndex += 2;
+      if (oldValue !== newValue) {
+        setKey = newKey;
+        setValue = newValue;
+      }
+    } else if (newKey === null || oldKey !== null && oldKey < newKey) {
+      oldIndex += 2;
+      setKey = oldKey;
+    } else {
+      ngDevMode && assertDefined(newKey, "Expecting to have a valid key");
+      newIndex += 2;
+      setKey = newKey;
+      setValue = newValue;
+    }
+    if (setKey !== null) {
+      updateStyling(tView, tNode, lView, renderer, setKey, setValue, isClassBased, bindingIndex);
+    }
+    oldKey = oldIndex < oldKeyValueArray.length ? oldKeyValueArray[oldIndex] : null;
+    newKey = newIndex < newKeyValueArray.length ? newKeyValueArray[newIndex] : null;
+  }
+}
+function updateStyling(tView, tNode, lView, renderer, prop, value, isClassBased, bindingIndex) {
+  if (!(tNode.type & 3)) {
+    return;
+  }
+  const tData = tView.data;
+  const tRange = tData[bindingIndex + 1];
+  const higherPriorityValue = getTStylingRangeNextDuplicate(tRange) ? findStylingValue(tData, tNode, lView, prop, getTStylingRangeNext(tRange), isClassBased) : void 0;
+  if (!isStylingValuePresent(higherPriorityValue)) {
+    if (!isStylingValuePresent(value)) {
+      if (getTStylingRangePrevDuplicate(tRange)) {
+        value = findStylingValue(tData, null, lView, prop, bindingIndex, isClassBased);
+      }
+    }
+    const rNode = getNativeByIndex(getSelectedIndex(), lView);
+    applyStyling(renderer, isClassBased, rNode, prop, value);
+  }
+}
+function findStylingValue(tData, tNode, lView, prop, index, isClassBased) {
+  const isPrevDirection = tNode === null;
+  let value = void 0;
+  while (index > 0) {
+    const rawKey = tData[index];
+    const containsStatics = Array.isArray(rawKey);
+    const key = containsStatics ? rawKey[1] : rawKey;
+    const isStylingMap = key === null;
+    let valueAtLViewIndex = lView[index + 1];
+    if (valueAtLViewIndex === NO_CHANGE) {
+      valueAtLViewIndex = isStylingMap ? EMPTY_ARRAY : void 0;
+    }
+    let currentValue = isStylingMap ? keyValueArrayGet(valueAtLViewIndex, prop) : key === prop ? valueAtLViewIndex : void 0;
+    if (containsStatics && !isStylingValuePresent(currentValue)) {
+      currentValue = keyValueArrayGet(rawKey, prop);
+    }
+    if (isStylingValuePresent(currentValue)) {
+      value = currentValue;
+      if (isPrevDirection) {
+        return value;
+      }
+    }
+    const tRange = tData[index + 1];
+    index = isPrevDirection ? getTStylingRangePrev(tRange) : getTStylingRangeNext(tRange);
+  }
+  if (tNode !== null) {
+    let residual = isClassBased ? tNode.residualClasses : tNode.residualStyles;
+    if (residual != null) {
+      value = keyValueArrayGet(residual, prop);
+    }
+  }
+  return value;
+}
+function isStylingValuePresent(value) {
+  return value !== void 0;
+}
+function normalizeSuffix(value, suffix) {
+  if (value == null || value === "") ;
+  else if (typeof suffix === "string") {
+    value = value + suffix;
+  } else if (typeof value === "object") {
+    value = stringify(unwrapSafeValue(value));
+  }
+  return value;
+}
+function hasStylingInputShadow(tNode, isClassBased) {
+  return (tNode.flags & (isClassBased ? 8 : 16)) !== 0;
+}
+function ɵɵtext(index, value = "") {
+  const lView = getLView();
+  const tView = getTView();
+  const adjustedIndex = index + HEADER_OFFSET;
+  ngDevMode && assertEqual(getBindingIndex(), tView.bindingStartIndex, "text nodes should be created before any bindings");
+  ngDevMode && assertIndexInRange(lView, adjustedIndex);
+  const tNode = tView.firstCreatePass ? getOrCreateTNode(tView, adjustedIndex, 1, value, null) : tView.data[adjustedIndex];
+  const textNative = _locateOrCreateTextNode(tView, lView, tNode, value, index);
+  lView[adjustedIndex] = textNative;
+  if (wasLastNodeCreated()) {
+    appendChild(tView, lView, textNative, tNode);
+  }
+  setCurrentTNode(tNode, false);
+}
+var _locateOrCreateTextNode = (tView, lView, tNode, value, index) => {
+  lastNodeWasCreated(true);
+  return createTextNode(lView[RENDERER], value);
+};
+function locateOrCreateTextNodeImpl(tView, lView, tNode, value, index) {
+  const hydrationInfo = lView[HYDRATION];
+  const isNodeCreationMode = !hydrationInfo || isInSkipHydrationBlock() || isDetachedByI18n(tNode) || isDisconnectedNode$1(hydrationInfo, index);
+  lastNodeWasCreated(isNodeCreationMode);
+  if (isNodeCreationMode) {
+    return createTextNode(lView[RENDERER], value);
+  }
+  const textNative = locateNextRNode(hydrationInfo, tView, lView, tNode);
+  ngDevMode && validateMatchingNode(textNative, Node.TEXT_NODE, null, lView, tNode);
+  ngDevMode && markRNodeAsClaimedByHydration(textNative);
+  return textNative;
+}
+function enableLocateOrCreateTextNodeImpl() {
+  _locateOrCreateTextNode = locateOrCreateTextNodeImpl;
+}
+function interpolationV(lView, values) {
+  ngDevMode && assertLessThan(2, values.length, "should have at least 3 values");
+  let isBindingUpdated = false;
+  let bindingIndex = getBindingIndex();
+  for (let i = 1; i < values.length; i += 2) {
+    isBindingUpdated = bindingUpdated(lView, bindingIndex++, values[i]) || isBindingUpdated;
+  }
+  setBindingIndex(bindingIndex);
+  if (!isBindingUpdated) {
+    return NO_CHANGE;
+  }
+  let content = values[0];
+  for (let i = 1; i < values.length; i += 2) {
+    content += renderStringify(values[i]) + (i + 1 !== values.length ? values[i + 1] : "");
+  }
+  return content;
+}
+function interpolation1(lView, prefix, v0, suffix = "") {
+  const different = bindingUpdated(lView, nextBindingIndex(), v0);
+  return different ? prefix + renderStringify(v0) + suffix : NO_CHANGE;
+}
+function interpolation2(lView, prefix, v0, i0, v1, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  const different = bindingUpdated2(lView, bindingIndex, v0, v1);
+  incrementBindingIndex(2);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + suffix : NO_CHANGE;
+}
+function interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  const different = bindingUpdated3(lView, bindingIndex, v0, v1, v2);
+  incrementBindingIndex(3);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + suffix : NO_CHANGE;
+}
+function interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  const different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
+  incrementBindingIndex(4);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + renderStringify(v3) + suffix : NO_CHANGE;
+}
+function interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
+  different = bindingUpdated(lView, bindingIndex + 4, v4) || different;
+  incrementBindingIndex(5);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + renderStringify(v3) + i3 + renderStringify(v4) + suffix : NO_CHANGE;
+}
+function interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
+  different = bindingUpdated2(lView, bindingIndex + 4, v4, v5) || different;
+  incrementBindingIndex(6);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + suffix : NO_CHANGE;
+}
+function interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
+  different = bindingUpdated3(lView, bindingIndex + 4, v4, v5, v6) || different;
+  incrementBindingIndex(7);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + renderStringify(v6) + suffix : NO_CHANGE;
+}
+function interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix = "") {
+  const bindingIndex = getBindingIndex();
+  let different = bindingUpdated4(lView, bindingIndex, v0, v1, v2, v3);
+  different = bindingUpdated4(lView, bindingIndex + 4, v4, v5, v6, v7) || different;
+  incrementBindingIndex(8);
+  return different ? prefix + renderStringify(v0) + i0 + renderStringify(v1) + i1 + renderStringify(v2) + i2 + renderStringify(v3) + i3 + renderStringify(v4) + i4 + renderStringify(v5) + i5 + renderStringify(v6) + i6 + renderStringify(v7) + suffix : NO_CHANGE;
+}
+function ɵɵtextInterpolate(v0) {
+  ɵɵtextInterpolate1("", v0);
+  return ɵɵtextInterpolate;
+}
+function ɵɵtextInterpolate1(prefix, v0, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation1(lView, prefix, v0, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate1;
+}
+function ɵɵtextInterpolate2(prefix, v0, i0, v1, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation2(lView, prefix, v0, i0, v1, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate2;
+}
+function ɵɵtextInterpolate3(prefix, v0, i0, v1, i1, v2, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation3(lView, prefix, v0, i0, v1, i1, v2, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate3;
+}
+function ɵɵtextInterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation4(lView, prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate4;
+}
+function ɵɵtextInterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation5(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate5;
+}
+function ɵɵtextInterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation6(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate6;
+}
+function ɵɵtextInterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation7(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate7;
+}
+function ɵɵtextInterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix) {
+  const lView = getLView();
+  const interpolated = interpolation8(lView, prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolate8;
+}
+function ɵɵtextInterpolateV(values) {
+  const lView = getLView();
+  const interpolated = interpolationV(lView, values);
+  if (interpolated !== NO_CHANGE) {
+    textBindingInternal(lView, getSelectedIndex(), interpolated);
+  }
+  return ɵɵtextInterpolateV;
+}
+function textBindingInternal(lView, index, value) {
+  ngDevMode && assertString(value, "Value should be a string");
+  ngDevMode && assertNotSame(value, NO_CHANGE, "value should not be NO_CHANGE");
+  ngDevMode && assertIndexInRange(lView, index);
+  const element = getNativeByIndex(index, lView);
+  ngDevMode && assertDefined(element, "native element should exist");
+  updateTextNode(lView[RENDERER], element, value);
+}
+function ɵɵtwoWayProperty(propName, value, sanitizer) {
+  if (isWritableSignal(value)) {
+    value = value();
+  }
+  const lView = getLView();
+  const bindingIndex = nextBindingIndex();
+  if (bindingUpdated(lView, bindingIndex, value)) {
+    const tView = getTView();
+    const tNode = getSelectedTNode();
+    setPropertyAndInputs(tNode, lView, propName, value, lView[RENDERER], sanitizer);
+    ngDevMode && storePropertyBindingMetadata(tView.data, tNode, propName, bindingIndex);
+  }
+  return ɵɵtwoWayProperty;
+}
+function ɵɵtwoWayBindingSet(target, value) {
+  const canWrite = isWritableSignal(target);
+  canWrite && target.set(value);
+  return canWrite;
+}
+function ɵɵtwoWayListener(eventName, listenerFn) {
+  const lView = getLView();
+  const tView = getTView();
+  const tNode = getCurrentTNode();
+  listenerInternal(tView, lView, lView[RENDERER], tNode, eventName, listenerFn);
+  return ɵɵtwoWayListener;
+}
+var UNINITIALIZED_LET = {};
+function ɵɵdeclareLet(index) {
+  const tView = getTView();
+  const lView = getLView();
+  const adjustedIndex = index + HEADER_OFFSET;
+  const tNode = getOrCreateTNode(tView, adjustedIndex, 128, null, null);
+  setCurrentTNode(tNode, false);
+  store(tView, lView, adjustedIndex, UNINITIALIZED_LET);
+  return ɵɵdeclareLet;
+}
+function ɵɵstoreLet(value) {
+  performanceMarkFeature("NgLet");
+  const tView = getTView();
+  const lView = getLView();
+  const index = getSelectedIndex();
+  store(tView, lView, index, value);
+  return value;
+}
+function ɵɵreadContextLet(index) {
+  const contextLView = getContextLView();
+  const value = load(contextLView, HEADER_OFFSET + index);
+  if (value === UNINITIALIZED_LET) {
+    throw new RuntimeError(314, ngDevMode && "Attempting to access a @let declaration whose value is not available yet");
+  }
+  return value;
+}
+function ɵɵattachSourceLocations(templatePath, locations) {
+  const tView = getTView();
+  const lView = getLView();
+  const renderer = lView[RENDERER];
+  const attributeName = "data-ng-source-location";
+  for (const [index, offset, line, column] of locations) {
+    const tNode = getTNode(tView, index + HEADER_OFFSET);
+    ngDevMode && assertTNodeType(
+      tNode,
+      2
+      /* TNodeType.Element */
+    );
+    const node = getNativeByIndex(index + HEADER_OFFSET, lView);
+    if (!node.hasAttribute(attributeName)) {
+      const attributeValue = `${templatePath}@o:${offset},l:${line},c:${column}`;
+      renderer.setAttribute(node, attributeName, attributeValue);
+    }
+  }
+}
+function ɵɵinterpolate(v0) {
+  return bindingUpdated(getLView(), nextBindingIndex(), v0) ? renderStringify(v0) : NO_CHANGE;
+}
+function ɵɵinterpolate1(prefix, v0, suffix = "") {
+  return interpolation1(getLView(), prefix, v0, suffix);
+}
+function ɵɵinterpolate2(prefix, v0, i0, v1, suffix = "") {
+  return interpolation2(getLView(), prefix, v0, i0, v1, suffix);
+}
+function ɵɵinterpolate3(prefix, v0, i0, v1, i1, v2, suffix = "") {
+  return interpolation3(getLView(), prefix, v0, i0, v1, i1, v2, suffix);
+}
+function ɵɵinterpolate4(prefix, v0, i0, v1, i1, v2, i2, v3, suffix = "") {
+  return interpolation4(getLView(), prefix, v0, i0, v1, i1, v2, i2, v3, suffix);
+}
+function ɵɵinterpolate5(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix = "") {
+  return interpolation5(getLView(), prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, suffix);
+}
+function ɵɵinterpolate6(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix = "") {
+  return interpolation6(getLView(), prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, suffix);
+}
+function ɵɵinterpolate7(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix = "") {
+  return interpolation7(getLView(), prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, suffix);
+}
+function ɵɵinterpolate8(prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix = "") {
+  return interpolation8(getLView(), prefix, v0, i0, v1, i1, v2, i2, v3, i3, v4, i4, v5, i5, v6, i6, v7, suffix);
+}
+function ɵɵinterpolateV(values) {
+  return interpolationV(getLView(), values);
+}
+function providersResolver(def, providers, viewProviders) {
+  const tView = getTView();
+  if (tView.firstCreatePass) {
+    const isComponent2 = isComponentDef(def);
+    resolveProvider(viewProviders, tView.data, tView.blueprint, isComponent2, true);
+    resolveProvider(providers, tView.data, tView.blueprint, isComponent2, false);
+  }
+}
+function resolveProvider(provider, tInjectables, lInjectablesBlueprint, isComponent2, isViewProvider) {
+  provider = resolveForwardRef(provider);
+  if (Array.isArray(provider)) {
+    for (let i = 0; i < provider.length; i++) {
+      resolveProvider(provider[i], tInjectables, lInjectablesBlueprint, isComponent2, isViewProvider);
+    }
+  } else {
+    const tView = getTView();
+    const lView = getLView();
+    const tNode = getCurrentTNode();
+    let token = isTypeProvider(provider) ? provider : resolveForwardRef(provider.provide);
+    const providerFactory = providerToFactory(provider);
+    if (ngDevMode) {
+      const injector = new NodeInjector(tNode, lView);
+      runInInjectorProfilerContext(injector, token, () => {
+        emitProviderConfiguredEvent(provider, isViewProvider);
+      });
+    }
+    const beginIndex = tNode.providerIndexes & 1048575;
+    const endIndex = tNode.directiveStart;
+    const cptViewProvidersCount = tNode.providerIndexes >> 20;
+    if (isTypeProvider(provider) || !provider.multi) {
+      const factory = new NodeInjectorFactory(providerFactory, isViewProvider, ɵɵdirectiveInject);
+      const existingFactoryIndex = indexOf(token, tInjectables, isViewProvider ? beginIndex : beginIndex + cptViewProvidersCount, endIndex);
+      if (existingFactoryIndex === -1) {
+        diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
+        registerDestroyHooksIfSupported(tView, provider, tInjectables.length);
+        tInjectables.push(token);
+        tNode.directiveStart++;
+        tNode.directiveEnd++;
+        if (isViewProvider) {
+          tNode.providerIndexes += 1048576;
+        }
+        lInjectablesBlueprint.push(factory);
+        lView.push(factory);
+      } else {
+        lInjectablesBlueprint[existingFactoryIndex] = factory;
+        lView[existingFactoryIndex] = factory;
+      }
+    } else {
+      const existingProvidersFactoryIndex = indexOf(token, tInjectables, beginIndex + cptViewProvidersCount, endIndex);
+      const existingViewProvidersFactoryIndex = indexOf(token, tInjectables, beginIndex, beginIndex + cptViewProvidersCount);
+      const doesProvidersFactoryExist = existingProvidersFactoryIndex >= 0 && lInjectablesBlueprint[existingProvidersFactoryIndex];
+      const doesViewProvidersFactoryExist = existingViewProvidersFactoryIndex >= 0 && lInjectablesBlueprint[existingViewProvidersFactoryIndex];
+      if (isViewProvider && !doesViewProvidersFactoryExist || !isViewProvider && !doesProvidersFactoryExist) {
+        diPublicInInjector(getOrCreateNodeInjectorForNode(tNode, lView), tView, token);
+        const factory = multiFactory(isViewProvider ? multiViewProvidersFactoryResolver : multiProvidersFactoryResolver, lInjectablesBlueprint.length, isViewProvider, isComponent2, providerFactory);
+        if (!isViewProvider && doesViewProvidersFactoryExist) {
+          lInjectablesBlueprint[existingViewProvidersFactoryIndex].providerFactory = factory;
+        }
+        registerDestroyHooksIfSupported(tView, provider, tInjectables.length, 0);
+        tInjectables.push(token);
+        tNode.directiveStart++;
+        tNode.directiveEnd++;
+        if (isViewProvider) {
+          tNode.providerIndexes += 1048576;
+        }
+        lInjectablesBlueprint.push(factory);
+        lView.push(factory);
+      } else {
+        const indexInFactory = multiFactoryAdd(lInjectablesBlueprint[isViewProvider ? existingViewProvidersFactoryIndex : existingProvidersFactoryIndex], providerFactory, !isViewProvider && isComponent2);
+        registerDestroyHooksIfSupported(tView, provider, existingProvidersFactoryIndex > -1 ? existingProvidersFactoryIndex : existingViewProvidersFactoryIndex, indexInFactory);
+      }
+      if (!isViewProvider && isComponent2 && doesViewProvidersFactoryExist) {
+        lInjectablesBlueprint[existingViewProvidersFactoryIndex].componentProviders++;
+      }
+    }
+  }
+}
+function registerDestroyHooksIfSupported(tView, provider, contextIndex, indexInFactory) {
+  const providerIsTypeProvider = isTypeProvider(provider);
+  const providerIsClassProvider = isClassProvider(provider);
+  if (providerIsTypeProvider || providerIsClassProvider) {
+    const classToken = providerIsClassProvider ? resolveForwardRef(provider.useClass) : provider;
+    const prototype = classToken.prototype;
+    const ngOnDestroy = prototype.ngOnDestroy;
+    if (ngOnDestroy) {
+      const hooks = tView.destroyHooks || (tView.destroyHooks = []);
+      if (!providerIsTypeProvider && provider.multi) {
+        ngDevMode && assertDefined(indexInFactory, "indexInFactory when registering multi factory destroy hook");
+        const existingCallbacksIndex = hooks.indexOf(contextIndex);
+        if (existingCallbacksIndex === -1) {
+          hooks.push(contextIndex, [indexInFactory, ngOnDestroy]);
+        } else {
+          hooks[existingCallbacksIndex + 1].push(indexInFactory, ngOnDestroy);
+        }
+      } else {
+        hooks.push(contextIndex, ngOnDestroy);
+      }
+    }
+  }
+}
+function multiFactoryAdd(multiFactory2, factory, isComponentProvider) {
+  if (isComponentProvider) {
+    multiFactory2.componentProviders++;
+  }
+  return multiFactory2.multi.push(factory) - 1;
+}
+function indexOf(item, arr, begin, end) {
+  for (let i = begin; i < end; i++) {
+    if (arr[i] === item)
+      return i;
+  }
+  return -1;
+}
+function multiProvidersFactoryResolver(_, tData, lData, tNode) {
+  return multiResolve(this.multi, []);
+}
+function multiViewProvidersFactoryResolver(_, tData, lView, tNode) {
+  const factories = this.multi;
+  let result;
+  if (this.providerFactory) {
+    const componentCount = this.providerFactory.componentProviders;
+    const multiProviders = getNodeInjectable(lView, lView[TVIEW], this.providerFactory.index, tNode);
+    result = multiProviders.slice(0, componentCount);
+    multiResolve(factories, result);
+    for (let i = componentCount; i < multiProviders.length; i++) {
+      result.push(multiProviders[i]);
+    }
+  } else {
+    result = [];
+    multiResolve(factories, result);
+  }
+  return result;
+}
+function multiResolve(factories, result) {
+  for (let i = 0; i < factories.length; i++) {
+    const factory = factories[i];
+    result.push(factory());
+  }
+  return result;
+}
+function multiFactory(factoryFn, index, isViewProvider, isComponent2, f) {
+  const factory = new NodeInjectorFactory(factoryFn, isViewProvider, ɵɵdirectiveInject);
+  factory.multi = [];
+  factory.index = index;
+  factory.componentProviders = 0;
+  multiFactoryAdd(factory, f, isComponent2 && !isViewProvider);
+  return factory;
+}
+function ɵɵProvidersFeature(providers, viewProviders = []) {
+  return (definition) => {
+    definition.providersResolver = (def, processProvidersFn) => {
+      return providersResolver(
+        def,
+        //
+        processProvidersFn ? processProvidersFn(providers) : providers,
+        //
+        viewProviders
+      );
+    };
+  };
+}
+function ɵɵExternalStylesFeature(styleUrls) {
+  return (definition) => {
+    if (styleUrls.length < 1) {
+      return;
+    }
+    definition.getExternalStyles = (encapsulationId) => {
+      const urls = styleUrls.map((value) => value + "?ngcomp" + (encapsulationId ? "=" + encodeURIComponent(encapsulationId) : "") + "&e=" + definition.encapsulation);
+      return urls;
+    };
+  };
+}
+function ɵɵsetComponentScope(type, directives, pipes) {
+  const def = type.ɵcmp;
+  def.directiveDefs = extractDefListOrFactory(
+    directives,
+    /* pipeDef */
+    false
+  );
+  def.pipeDefs = extractDefListOrFactory(
+    pipes,
+    /* pipeDef */
+    true
+  );
+}
+function ɵɵsetNgModuleScope(type, scope) {
+  return noSideEffects(() => {
+    const ngModuleDef = getNgModuleDefOrThrow(type);
+    ngModuleDef.declarations = convertToTypeArray(scope.declarations || EMPTY_ARRAY);
+    ngModuleDef.imports = convertToTypeArray(scope.imports || EMPTY_ARRAY);
+    ngModuleDef.exports = convertToTypeArray(scope.exports || EMPTY_ARRAY);
+    if (scope.bootstrap) {
+      ngModuleDef.bootstrap = convertToTypeArray(scope.bootstrap);
+    }
+    depsTracker.registerNgModule(type, scope);
+  });
+}
+function convertToTypeArray(values) {
+  if (typeof values === "function") {
+    return values;
+  }
+  const flattenValues = flatten(values);
+  if (flattenValues.some(isForwardRef)) {
+    return () => flattenValues.map(resolveForwardRef).map(maybeUnwrapModuleWithProviders);
+  } else {
+    return flattenValues.map(maybeUnwrapModuleWithProviders);
+  }
+}
+function maybeUnwrapModuleWithProviders(value) {
+  return isModuleWithProviders(value) ? value.ngModule : value;
+}
+function ɵɵpureFunction0(slotOffset, pureFn, thisArg) {
+  const bindingIndex = getBindingRoot() + slotOffset;
+  const lView = getLView();
+  return lView[bindingIndex] === NO_CHANGE ? updateBinding(lView, bindingIndex, thisArg ? pureFn.call(thisArg) : pureFn()) : getBinding(lView, bindingIndex);
+}
+function ɵɵpureFunction1(slotOffset, pureFn, exp, thisArg) {
+  return pureFunction1Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp, thisArg);
+}
+function ɵɵpureFunction2(slotOffset, pureFn, exp1, exp2, thisArg) {
+  return pureFunction2Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, thisArg);
+}
+function ɵɵpureFunction3(slotOffset, pureFn, exp1, exp2, exp3, thisArg) {
+  return pureFunction3Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, exp3, thisArg);
+}
+function ɵɵpureFunction4(slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg) {
+  return pureFunction4Internal(getLView(), getBindingRoot(), slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg);
+}
+function ɵɵpureFunction5(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, thisArg) {
+  const bindingIndex = getBindingRoot() + slotOffset;
+  const lView = getLView();
+  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
+  return bindingUpdated(lView, bindingIndex + 4, exp5) || different ? updateBinding(lView, bindingIndex + 5, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5) : pureFn(exp1, exp2, exp3, exp4, exp5)) : getBinding(lView, bindingIndex + 5);
+}
+function ɵɵpureFunction6(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, thisArg) {
+  const bindingIndex = getBindingRoot() + slotOffset;
+  const lView = getLView();
+  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
+  return bindingUpdated2(lView, bindingIndex + 4, exp5, exp6) || different ? updateBinding(lView, bindingIndex + 6, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6) : pureFn(exp1, exp2, exp3, exp4, exp5, exp6)) : getBinding(lView, bindingIndex + 6);
+}
+function ɵɵpureFunction7(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, exp7, thisArg) {
+  const bindingIndex = getBindingRoot() + slotOffset;
+  const lView = getLView();
+  let different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
+  return bindingUpdated3(lView, bindingIndex + 4, exp5, exp6, exp7) || different ? updateBinding(lView, bindingIndex + 7, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7) : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7)) : getBinding(lView, bindingIndex + 7);
+}
+function ɵɵpureFunction8(slotOffset, pureFn, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8, thisArg) {
+  const bindingIndex = getBindingRoot() + slotOffset;
+  const lView = getLView();
+  const different = bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4);
+  return bindingUpdated4(lView, bindingIndex + 4, exp5, exp6, exp7, exp8) || different ? updateBinding(lView, bindingIndex + 8, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8) : pureFn(exp1, exp2, exp3, exp4, exp5, exp6, exp7, exp8)) : getBinding(lView, bindingIndex + 8);
+}
+function ɵɵpureFunctionV(slotOffset, pureFn, exps, thisArg) {
+  return pureFunctionVInternal(getLView(), getBindingRoot(), slotOffset, pureFn, exps, thisArg);
+}
+function getPureFunctionReturnValue(lView, returnValueIndex) {
+  ngDevMode && assertIndexInRange(lView, returnValueIndex);
+  const lastReturnValue = lView[returnValueIndex];
+  return lastReturnValue === NO_CHANGE ? void 0 : lastReturnValue;
+}
+function pureFunction1Internal(lView, bindingRoot, slotOffset, pureFn, exp, thisArg) {
+  const bindingIndex = bindingRoot + slotOffset;
+  return bindingUpdated(lView, bindingIndex, exp) ? updateBinding(lView, bindingIndex + 1, thisArg ? pureFn.call(thisArg, exp) : pureFn(exp)) : getPureFunctionReturnValue(lView, bindingIndex + 1);
+}
+function pureFunction2Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, thisArg) {
+  const bindingIndex = bindingRoot + slotOffset;
+  return bindingUpdated2(lView, bindingIndex, exp1, exp2) ? updateBinding(lView, bindingIndex + 2, thisArg ? pureFn.call(thisArg, exp1, exp2) : pureFn(exp1, exp2)) : getPureFunctionReturnValue(lView, bindingIndex + 2);
+}
+function pureFunction3Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, exp3, thisArg) {
+  const bindingIndex = bindingRoot + slotOffset;
+  return bindingUpdated3(lView, bindingIndex, exp1, exp2, exp3) ? updateBinding(lView, bindingIndex + 3, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3) : pureFn(exp1, exp2, exp3)) : getPureFunctionReturnValue(lView, bindingIndex + 3);
+}
+function pureFunction4Internal(lView, bindingRoot, slotOffset, pureFn, exp1, exp2, exp3, exp4, thisArg) {
+  const bindingIndex = bindingRoot + slotOffset;
+  return bindingUpdated4(lView, bindingIndex, exp1, exp2, exp3, exp4) ? updateBinding(lView, bindingIndex + 4, thisArg ? pureFn.call(thisArg, exp1, exp2, exp3, exp4) : pureFn(exp1, exp2, exp3, exp4)) : getPureFunctionReturnValue(lView, bindingIndex + 4);
+}
+function pureFunctionVInternal(lView, bindingRoot, slotOffset, pureFn, exps, thisArg) {
+  let bindingIndex = bindingRoot + slotOffset;
+  let different = false;
+  for (let i = 0; i < exps.length; i++) {
+    bindingUpdated(lView, bindingIndex++, exps[i]) && (different = true);
+  }
+  return different ? updateBinding(lView, bindingIndex, pureFn.apply(thisArg, exps)) : getPureFunctionReturnValue(lView, bindingIndex);
+}
+function ɵɵpipe(index, pipeName) {
+  const tView = getTView();
+  let pipeDef;
+  const adjustedIndex = index + HEADER_OFFSET;
+  if (tView.firstCreatePass) {
+    pipeDef = getPipeDef2(pipeName, tView.pipeRegistry);
+    tView.data[adjustedIndex] = pipeDef;
+    if (pipeDef.onDestroy) {
+      (tView.destroyHooks ??= []).push(adjustedIndex, pipeDef.onDestroy);
+    }
+  } else {
+    pipeDef = tView.data[adjustedIndex];
+  }
+  const pipeFactory = pipeDef.factory || (pipeDef.factory = getFactoryDef(pipeDef.type, true));
+  let previousInjectorProfilerContext;
+  if (ngDevMode) {
+    previousInjectorProfilerContext = setInjectorProfilerContext({
+      injector: new NodeInjector(getCurrentTNode(), getLView()),
+      token: pipeDef.type
+    });
+  }
+  const previousInjectImplementation = setInjectImplementation(ɵɵdirectiveInject);
+  try {
+    const previousIncludeViewProviders = setIncludeViewProviders(false);
+    const pipeInstance = pipeFactory();
+    setIncludeViewProviders(previousIncludeViewProviders);
+    store(tView, getLView(), adjustedIndex, pipeInstance);
+    return pipeInstance;
+  } finally {
+    setInjectImplementation(previousInjectImplementation);
+    ngDevMode && setInjectorProfilerContext(previousInjectorProfilerContext);
+  }
+}
+function getPipeDef2(name, registry) {
+  if (registry) {
+    if (ngDevMode) {
+      const pipes = registry.filter((pipe2) => pipe2.name === name);
+      if (pipes.length > 1) {
+        console.warn(formatRuntimeError(313, getMultipleMatchingPipesMessage(name)));
+      }
+    }
+    for (let i = registry.length - 1; i >= 0; i--) {
+      const pipeDef = registry[i];
+      if (name === pipeDef.name) {
+        return pipeDef;
+      }
+    }
+  }
+  if (ngDevMode) {
+    throw new RuntimeError(-302, getPipeNotFoundErrorMessage(name));
+  }
+  return;
+}
+function getMultipleMatchingPipesMessage(name) {
+  const lView = getLView();
+  const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
+  const context2 = declarationLView[CONTEXT];
+  const hostIsStandalone = isHostComponentStandalone(lView);
+  const componentInfoMessage = context2 ? ` in the '${context2.constructor.name}' component` : "";
+  const verifyMessage = `check ${hostIsStandalone ? "'@Component.imports' of this component" : "the imports of this module"}`;
+  const errorMessage = `Multiple pipes match the name \`${name}\`${componentInfoMessage}. ${verifyMessage}`;
+  return errorMessage;
+}
+function getPipeNotFoundErrorMessage(name) {
+  const lView = getLView();
+  const declarationLView = lView[DECLARATION_COMPONENT_VIEW];
+  const context2 = declarationLView[CONTEXT];
+  const hostIsStandalone = isHostComponentStandalone(lView);
+  const componentInfoMessage = context2 ? ` in the '${context2.constructor.name}' component` : "";
+  const verifyMessage = `Verify that it is ${hostIsStandalone ? "included in the '@Component.imports' of this component" : "declared or imported in this module"}`;
+  const errorMessage = `The pipe '${name}' could not be found${componentInfoMessage}. ${verifyMessage}`;
+  return errorMessage;
+}
+function ɵɵpipeBind1(index, offset, v1) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const lView = getLView();
+  const pipeInstance = load(lView, adjustedIndex);
+  return isPure(lView, adjustedIndex) ? pureFunction1Internal(lView, getBindingRoot(), offset, pipeInstance.transform, v1, pipeInstance) : pipeInstance.transform(v1);
+}
+function ɵɵpipeBind2(index, slotOffset, v1, v2) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const lView = getLView();
+  const pipeInstance = load(lView, adjustedIndex);
+  return isPure(lView, adjustedIndex) ? pureFunction2Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, pipeInstance) : pipeInstance.transform(v1, v2);
+}
+function ɵɵpipeBind3(index, slotOffset, v1, v2, v3) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const lView = getLView();
+  const pipeInstance = load(lView, adjustedIndex);
+  return isPure(lView, adjustedIndex) ? pureFunction3Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, v3, pipeInstance) : pipeInstance.transform(v1, v2, v3);
+}
+function ɵɵpipeBind4(index, slotOffset, v1, v2, v3, v4) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const lView = getLView();
+  const pipeInstance = load(lView, adjustedIndex);
+  return isPure(lView, adjustedIndex) ? pureFunction4Internal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, v1, v2, v3, v4, pipeInstance) : pipeInstance.transform(v1, v2, v3, v4);
+}
+function ɵɵpipeBindV(index, slotOffset, values) {
+  const adjustedIndex = index + HEADER_OFFSET;
+  const lView = getLView();
+  const pipeInstance = load(lView, adjustedIndex);
+  return isPure(lView, adjustedIndex) ? pureFunctionVInternal(lView, getBindingRoot(), slotOffset, pipeInstance.transform, values, pipeInstance) : pipeInstance.transform.apply(pipeInstance, values);
+}
+function isPure(lView, index) {
+  return lView[TVIEW].data[index].pure;
+}
+function ɵɵtemplateRefExtractor(tNode, lView) {
+  return createTemplateRef(tNode, lView);
+}
+function ɵɵgetComponentDepsFactory(type, rawImports) {
+  return () => {
+    try {
+      return depsTracker.getComponentDependencies(type, rawImports).dependencies;
+    } catch (e) {
+      console.error(`Computing dependencies in local compilation mode for the component "${type.name}" failed with the exception:`, e);
+      throw e;
+    }
+  };
+}
+function ɵsetClassDebugInfo(type, debugInfo) {
+  const def = getComponentDef(type);
+  if (def !== null) {
+    def.debugInfo = debugInfo;
+  }
+}
+function ɵɵgetReplaceMetadataURL(id, timestamp2, base) {
+  const url = `./@ng/component?c=${id}&t=${encodeURIComponent(timestamp2)}`;
+  return new URL(url, base).href;
+}
+function ɵɵreplaceMetadata(type, applyMetadata, namespaces, locals, importMeta = null, id = null) {
+  ngDevMode && assertComponentDef(type);
+  const currentDef = getComponentDef(type);
+  applyMetadata.apply(null, [type, namespaces, ...locals]);
+  const { newDef, oldDef } = mergeWithExistingDefinition(currentDef, getComponentDef(type));
+  type[NG_COMP_DEF] = newDef;
+  if (oldDef.tView) {
+    const trackedViews = getTrackedLViews().values();
+    for (const root of trackedViews) {
+      if (isRootView(root) && root[PARENT] === null) {
+        recreateMatchingLViews(importMeta, id, newDef, oldDef, root);
+      }
+    }
+  }
+}
+function mergeWithExistingDefinition(currentDef, newDef) {
+  const clone = __spreadValues({}, currentDef);
+  const replacement = Object.assign(currentDef, newDef, {
+    // We need to keep the existing directive and pipe defs, because they can get patched on
+    // by a call to `setComponentScope` from a module file. That call won't make it into the
+    // HMR replacement function, because it lives in an entirely different file.
+    directiveDefs: clone.directiveDefs,
+    pipeDefs: clone.pipeDefs,
+    // Preserve the old `setInput` function, because it has some state.
+    // This is fine, because the component instance is preserved as well.
+    setInput: clone.setInput,
+    // Externally this is redundant since we redeclare the definition using the original type.
+    // Internally we may receive a definition with an alternate, but identical, type so we have
+    // to ensure that the original one is preserved.
+    type: clone.type
+  });
+  ngDevMode && assertEqual(replacement, currentDef, "Expected definition to be merged in place");
+  return { newDef: replacement, oldDef: clone };
+}
+function recreateMatchingLViews(importMeta, id, newDef, oldDef, rootLView) {
+  ngDevMode && assertDefined(oldDef.tView, "Expected a component definition that has been instantiated at least once");
+  const tView = rootLView[TVIEW];
+  if (tView === oldDef.tView) {
+    ngDevMode && assertComponentDef(oldDef.type);
+    recreateLView(importMeta, id, newDef, oldDef, rootLView);
+    return;
+  }
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    const current = rootLView[i];
+    if (isLContainer(current)) {
+      if (isLView(current[HOST])) {
+        recreateMatchingLViews(importMeta, id, newDef, oldDef, current[HOST]);
+      }
+      for (let j = CONTAINER_HEADER_OFFSET; j < current.length; j++) {
+        recreateMatchingLViews(importMeta, id, newDef, oldDef, current[j]);
+      }
+    } else if (isLView(current)) {
+      recreateMatchingLViews(importMeta, id, newDef, oldDef, current);
+    }
+  }
+}
+function clearRendererCache(factory, def) {
+  factory.componentReplaced?.(def.id);
+}
+function recreateLView(importMeta, id, newDef, oldDef, lView) {
+  const instance = lView[CONTEXT];
+  let host = lView[HOST];
+  const parentLView = lView[PARENT];
+  ngDevMode && assertLView(parentLView);
+  const tNode = lView[T_HOST];
+  ngDevMode && assertTNodeType(
+    tNode,
+    2
+    /* TNodeType.Element */
+  );
+  ngDevMode && assertNotEqual(newDef, oldDef, "Expected different component definition");
+  const zone = lView[INJECTOR].get(NgZone, null);
+  const recreate = () => {
+    if (oldDef.encapsulation === ViewEncapsulation.ShadowDom) {
+      const newHost = host.cloneNode(false);
+      host.replaceWith(newHost);
+      host = newHost;
+    }
+    const newTView = getOrCreateComponentTView(newDef);
+    const newLView = createLView(
+      parentLView,
+      newTView,
+      instance,
+      getInitialLViewFlagsFromDef(newDef),
+      host,
+      tNode,
+      null,
+      null,
+      // The renderer will be created a bit further down once the old one is destroyed.
+      null,
+      null,
+      null
+    );
+    replaceLViewInTree(parentLView, lView, newLView, tNode.index);
+    destroyLView(lView[TVIEW], lView);
+    const rendererFactory = lView[ENVIRONMENT].rendererFactory;
+    clearRendererCache(rendererFactory, oldDef);
+    newLView[RENDERER] = rendererFactory.createRenderer(host, newDef);
+    removeViewFromDOM(lView[TVIEW], lView);
+    resetProjectionState(tNode);
+    renderView(newTView, newLView, instance);
+    refreshView(newTView, newLView, newTView.template, instance);
+  };
+  if (zone === null) {
+    executeWithInvalidateFallback(importMeta, id, recreate);
+  } else {
+    zone.run(() => executeWithInvalidateFallback(importMeta, id, recreate));
+  }
+}
+function executeWithInvalidateFallback(importMeta, id, callback) {
+  try {
+    callback();
+  } catch (e) {
+    const error = e;
+    if (id !== null && error.message) {
+      const toLog = error.message + (error.stack ? "\n" + error.stack : "");
+      importMeta?.hot?.send?.("angular:invalidate", { id, message: toLog, error: true });
+    }
+    throw e;
+  }
+}
+function replaceLViewInTree(parentLView, oldLView, newLView, index) {
+  for (let i = HEADER_OFFSET; i < parentLView[TVIEW].bindingStartIndex; i++) {
+    const current = parentLView[i];
+    if ((isLView(current) || isLContainer(current)) && current[NEXT] === oldLView) {
+      current[NEXT] = newLView;
+      break;
+    }
+  }
+  if (parentLView[CHILD_HEAD] === oldLView) {
+    parentLView[CHILD_HEAD] = newLView;
+  }
+  if (parentLView[CHILD_TAIL] === oldLView) {
+    parentLView[CHILD_TAIL] = newLView;
+  }
+  newLView[NEXT] = oldLView[NEXT];
+  oldLView[NEXT] = null;
+  parentLView[index] = newLView;
+}
+function resetProjectionState(tNode) {
+  if (tNode.projection !== null) {
+    for (const current of tNode.projection) {
+      if (isTNodeShape(current)) {
+        current.projectionNext = null;
+        current.flags &= ~2;
+      }
+    }
+    tNode.projection = null;
+  }
+}
+var angularCoreEnv = /* @__PURE__ */ (() => ({
+  "ɵɵattribute": ɵɵattribute,
+  "ɵɵdefineComponent": ɵɵdefineComponent,
+  "ɵɵdefineDirective": ɵɵdefineDirective,
+  "ɵɵdefineInjectable": ɵɵdefineInjectable,
+  "ɵɵdefineInjector": ɵɵdefineInjector,
+  "ɵɵdefineNgModule": ɵɵdefineNgModule,
+  "ɵɵdefinePipe": ɵɵdefinePipe,
+  "ɵɵdirectiveInject": ɵɵdirectiveInject,
+  "ɵɵgetInheritedFactory": ɵɵgetInheritedFactory,
+  "ɵɵinject": ɵɵinject,
+  "ɵɵinjectAttribute": ɵɵinjectAttribute,
+  "ɵɵinvalidFactory": ɵɵinvalidFactory,
+  "ɵɵinvalidFactoryDep": ɵɵinvalidFactoryDep,
+  "ɵɵtemplateRefExtractor": ɵɵtemplateRefExtractor,
+  "ɵɵresetView": ɵɵresetView,
+  "ɵɵHostDirectivesFeature": ɵɵHostDirectivesFeature,
+  "ɵɵNgOnChangesFeature": ɵɵNgOnChangesFeature,
+  "ɵɵProvidersFeature": ɵɵProvidersFeature,
+  "ɵɵCopyDefinitionFeature": ɵɵCopyDefinitionFeature,
+  "ɵɵInheritDefinitionFeature": ɵɵInheritDefinitionFeature,
+  "ɵɵExternalStylesFeature": ɵɵExternalStylesFeature,
+  "ɵɵnextContext": ɵɵnextContext,
+  "ɵɵnamespaceHTML": ɵɵnamespaceHTML,
+  "ɵɵnamespaceMathML": ɵɵnamespaceMathML,
+  "ɵɵnamespaceSVG": ɵɵnamespaceSVG,
+  "ɵɵenableBindings": ɵɵenableBindings,
+  "ɵɵdisableBindings": ɵɵdisableBindings,
+  "ɵɵelementStart": ɵɵelementStart,
+  "ɵɵelementEnd": ɵɵelementEnd,
+  "ɵɵelement": ɵɵelement,
+  "ɵɵelementContainerStart": ɵɵelementContainerStart,
+  "ɵɵelementContainerEnd": ɵɵelementContainerEnd,
+  "ɵɵelementContainer": ɵɵelementContainer,
+  "ɵɵpureFunction0": ɵɵpureFunction0,
+  "ɵɵpureFunction1": ɵɵpureFunction1,
+  "ɵɵpureFunction2": ɵɵpureFunction2,
+  "ɵɵpureFunction3": ɵɵpureFunction3,
+  "ɵɵpureFunction4": ɵɵpureFunction4,
+  "ɵɵpureFunction5": ɵɵpureFunction5,
+  "ɵɵpureFunction6": ɵɵpureFunction6,
+  "ɵɵpureFunction7": ɵɵpureFunction7,
+  "ɵɵpureFunction8": ɵɵpureFunction8,
+  "ɵɵpureFunctionV": ɵɵpureFunctionV,
+  "ɵɵgetCurrentView": ɵɵgetCurrentView,
+  "ɵɵrestoreView": ɵɵrestoreView,
+  "ɵɵlistener": ɵɵlistener,
+  "ɵɵprojection": ɵɵprojection,
+  "ɵɵsyntheticHostProperty": ɵɵsyntheticHostProperty,
+  "ɵɵsyntheticHostListener": ɵɵsyntheticHostListener,
+  "ɵɵpipeBind1": ɵɵpipeBind1,
+  "ɵɵpipeBind2": ɵɵpipeBind2,
+  "ɵɵpipeBind3": ɵɵpipeBind3,
+  "ɵɵpipeBind4": ɵɵpipeBind4,
+  "ɵɵpipeBindV": ɵɵpipeBindV,
+  "ɵɵprojectionDef": ɵɵprojectionDef,
+  "ɵɵdomProperty": ɵɵdomProperty,
+  "ɵɵproperty": ɵɵproperty,
+  "ɵɵpipe": ɵɵpipe,
+  "ɵɵqueryRefresh": ɵɵqueryRefresh,
+  "ɵɵqueryAdvance": ɵɵqueryAdvance,
+  "ɵɵviewQuery": ɵɵviewQuery,
+  "ɵɵviewQuerySignal": ɵɵviewQuerySignal,
+  "ɵɵloadQuery": ɵɵloadQuery,
+  "ɵɵcontentQuery": ɵɵcontentQuery,
+  "ɵɵcontentQuerySignal": ɵɵcontentQuerySignal,
+  "ɵɵreference": ɵɵreference,
+  "ɵɵclassMap": ɵɵclassMap,
+  "ɵɵstyleMap": ɵɵstyleMap,
+  "ɵɵstyleProp": ɵɵstyleProp,
+  "ɵɵclassProp": ɵɵclassProp,
+  "ɵɵadvance": ɵɵadvance,
+  "ɵɵtemplate": ɵɵtemplate,
+  "ɵɵconditional": ɵɵconditional,
+  "ɵɵconditionalCreate": ɵɵconditionalCreate,
+  "ɵɵconditionalBranchCreate": ɵɵconditionalBranchCreate,
+  "ɵɵdefer": ɵɵdefer,
+  "ɵɵdeferWhen": ɵɵdeferWhen,
+  "ɵɵdeferOnIdle": ɵɵdeferOnIdle,
+  "ɵɵdeferOnImmediate": ɵɵdeferOnImmediate,
+  "ɵɵdeferOnTimer": ɵɵdeferOnTimer,
+  "ɵɵdeferOnHover": ɵɵdeferOnHover,
+  "ɵɵdeferOnInteraction": ɵɵdeferOnInteraction,
+  "ɵɵdeferOnViewport": ɵɵdeferOnViewport,
+  "ɵɵdeferPrefetchWhen": ɵɵdeferPrefetchWhen,
+  "ɵɵdeferPrefetchOnIdle": ɵɵdeferPrefetchOnIdle,
+  "ɵɵdeferPrefetchOnImmediate": ɵɵdeferPrefetchOnImmediate,
+  "ɵɵdeferPrefetchOnTimer": ɵɵdeferPrefetchOnTimer,
+  "ɵɵdeferPrefetchOnHover": ɵɵdeferPrefetchOnHover,
+  "ɵɵdeferPrefetchOnInteraction": ɵɵdeferPrefetchOnInteraction,
+  "ɵɵdeferPrefetchOnViewport": ɵɵdeferPrefetchOnViewport,
+  "ɵɵdeferHydrateWhen": ɵɵdeferHydrateWhen,
+  "ɵɵdeferHydrateNever": ɵɵdeferHydrateNever,
+  "ɵɵdeferHydrateOnIdle": ɵɵdeferHydrateOnIdle,
+  "ɵɵdeferHydrateOnImmediate": ɵɵdeferHydrateOnImmediate,
+  "ɵɵdeferHydrateOnTimer": ɵɵdeferHydrateOnTimer,
+  "ɵɵdeferHydrateOnHover": ɵɵdeferHydrateOnHover,
+  "ɵɵdeferHydrateOnInteraction": ɵɵdeferHydrateOnInteraction,
+  "ɵɵdeferHydrateOnViewport": ɵɵdeferHydrateOnViewport,
+  "ɵɵdeferEnableTimerScheduling": ɵɵdeferEnableTimerScheduling,
+  "ɵɵrepeater": ɵɵrepeater,
+  "ɵɵrepeaterCreate": ɵɵrepeaterCreate,
+  "ɵɵrepeaterTrackByIndex": ɵɵrepeaterTrackByIndex,
+  "ɵɵrepeaterTrackByIdentity": ɵɵrepeaterTrackByIdentity,
+  "ɵɵcomponentInstance": ɵɵcomponentInstance,
+  "ɵɵtext": ɵɵtext,
+  "ɵɵtextInterpolate": ɵɵtextInterpolate,
+  "ɵɵtextInterpolate1": ɵɵtextInterpolate1,
+  "ɵɵtextInterpolate2": ɵɵtextInterpolate2,
+  "ɵɵtextInterpolate3": ɵɵtextInterpolate3,
+  "ɵɵtextInterpolate4": ɵɵtextInterpolate4,
+  "ɵɵtextInterpolate5": ɵɵtextInterpolate5,
+  "ɵɵtextInterpolate6": ɵɵtextInterpolate6,
+  "ɵɵtextInterpolate7": ɵɵtextInterpolate7,
+  "ɵɵtextInterpolate8": ɵɵtextInterpolate8,
+  "ɵɵtextInterpolateV": ɵɵtextInterpolateV,
+  "ɵɵi18n": ɵɵi18n,
+  "ɵɵi18nAttributes": ɵɵi18nAttributes,
+  "ɵɵi18nExp": ɵɵi18nExp,
+  "ɵɵi18nStart": ɵɵi18nStart,
+  "ɵɵi18nEnd": ɵɵi18nEnd,
+  "ɵɵi18nApply": ɵɵi18nApply,
+  "ɵɵi18nPostprocess": ɵɵi18nPostprocess,
+  "ɵɵresolveWindow": ɵɵresolveWindow,
+  "ɵɵresolveDocument": ɵɵresolveDocument,
+  "ɵɵresolveBody": ɵɵresolveBody,
+  "ɵɵsetComponentScope": ɵɵsetComponentScope,
+  "ɵɵsetNgModuleScope": ɵɵsetNgModuleScope,
+  "ɵɵregisterNgModuleType": registerNgModuleType,
+  "ɵɵgetComponentDepsFactory": ɵɵgetComponentDepsFactory,
+  "ɵsetClassDebugInfo": ɵsetClassDebugInfo,
+  "ɵɵdeclareLet": ɵɵdeclareLet,
+  "ɵɵstoreLet": ɵɵstoreLet,
+  "ɵɵreadContextLet": ɵɵreadContextLet,
+  "ɵɵattachSourceLocations": ɵɵattachSourceLocations,
+  "ɵɵinterpolate": ɵɵinterpolate,
+  "ɵɵinterpolate1": ɵɵinterpolate1,
+  "ɵɵinterpolate2": ɵɵinterpolate2,
+  "ɵɵinterpolate3": ɵɵinterpolate3,
+  "ɵɵinterpolate4": ɵɵinterpolate4,
+  "ɵɵinterpolate5": ɵɵinterpolate5,
+  "ɵɵinterpolate6": ɵɵinterpolate6,
+  "ɵɵinterpolate7": ɵɵinterpolate7,
+  "ɵɵinterpolate8": ɵɵinterpolate8,
+  "ɵɵinterpolateV": ɵɵinterpolateV,
+  "ɵɵsanitizeHtml": ɵɵsanitizeHtml,
+  "ɵɵsanitizeStyle": ɵɵsanitizeStyle,
+  "ɵɵsanitizeResourceUrl": ɵɵsanitizeResourceUrl,
+  "ɵɵsanitizeScript": ɵɵsanitizeScript,
+  "ɵɵsanitizeUrl": ɵɵsanitizeUrl,
+  "ɵɵsanitizeUrlOrResourceUrl": ɵɵsanitizeUrlOrResourceUrl,
+  "ɵɵtrustConstantHtml": ɵɵtrustConstantHtml,
+  "ɵɵtrustConstantResourceUrl": ɵɵtrustConstantResourceUrl,
+  "ɵɵvalidateIframeAttribute": ɵɵvalidateIframeAttribute,
+  "forwardRef": forwardRef,
+  "resolveForwardRef": resolveForwardRef,
+  "ɵɵtwoWayProperty": ɵɵtwoWayProperty,
+  "ɵɵtwoWayBindingSet": ɵɵtwoWayBindingSet,
+  "ɵɵtwoWayListener": ɵɵtwoWayListener,
+  "ɵɵreplaceMetadata": ɵɵreplaceMetadata,
+  "ɵɵgetReplaceMetadataURL": ɵɵgetReplaceMetadataURL
+}))();
+var jitOptions = null;
+function setJitOptions(options) {
+  if (jitOptions !== null) {
+    if (options.defaultEncapsulation !== jitOptions.defaultEncapsulation) {
+      ngDevMode && console.error("Provided value for `defaultEncapsulation` can not be changed once it has been set.");
+      return;
+    }
+    if (options.preserveWhitespaces !== jitOptions.preserveWhitespaces) {
+      ngDevMode && console.error("Provided value for `preserveWhitespaces` can not be changed once it has been set.");
+      return;
+    }
+  }
+  jitOptions = options;
+}
+function getJitOptions() {
+  return jitOptions;
+}
+function resetJitOptions() {
+  jitOptions = null;
+}
+var moduleQueue = [];
+function enqueueModuleForDelayedScoping(moduleType, ngModule) {
+  moduleQueue.push({ moduleType, ngModule });
+}
+var flushingModuleQueue = false;
+function flushModuleScopingQueueAsMuchAsPossible() {
+  if (!flushingModuleQueue) {
+    flushingModuleQueue = true;
+    try {
+      for (let i = moduleQueue.length - 1; i >= 0; i--) {
+        const { moduleType, ngModule } = moduleQueue[i];
+        if (ngModule.declarations && ngModule.declarations.every(isResolvedDeclaration)) {
+          moduleQueue.splice(i, 1);
+          setScopeOnDeclaredComponents(moduleType, ngModule);
+        }
+      }
+    } finally {
+      flushingModuleQueue = false;
+    }
+  }
+}
+function isResolvedDeclaration(declaration) {
+  if (Array.isArray(declaration)) {
+    return declaration.every(isResolvedDeclaration);
+  }
+  return !!resolveForwardRef(declaration);
+}
+function compileNgModule(moduleType, ngModule = {}) {
+  compileNgModuleDefs(moduleType, ngModule);
+  if (ngModule.id !== void 0) {
+    registerNgModuleType(moduleType, ngModule.id);
+  }
+  enqueueModuleForDelayedScoping(moduleType, ngModule);
+}
+function compileNgModuleDefs(moduleType, ngModule, allowDuplicateDeclarationsInRoot = false) {
+  ngDevMode && assertDefined(moduleType, "Required value moduleType");
+  ngDevMode && assertDefined(ngModule, "Required value ngModule");
+  const declarations = flatten(ngModule.declarations || EMPTY_ARRAY);
+  let ngModuleDef = null;
+  Object.defineProperty(moduleType, NG_MOD_DEF, {
+    configurable: true,
+    get: () => {
+      if (ngModuleDef === null) {
+        if (ngDevMode && ngModule.imports && ngModule.imports.indexOf(moduleType) > -1) {
+          throw new Error(`'${stringifyForError(moduleType)}' module can't import itself`);
+        }
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "NgModule",
+          type: moduleType
+        });
+        ngModuleDef = compiler.compileNgModule(angularCoreEnv, `ng:///${moduleType.name}/ɵmod.js`, {
+          type: moduleType,
+          bootstrap: flatten(ngModule.bootstrap || EMPTY_ARRAY).map(resolveForwardRef),
+          declarations: declarations.map(resolveForwardRef),
+          imports: flatten(ngModule.imports || EMPTY_ARRAY).map(resolveForwardRef).map(expandModuleWithProviders),
+          exports: flatten(ngModule.exports || EMPTY_ARRAY).map(resolveForwardRef).map(expandModuleWithProviders),
+          schemas: ngModule.schemas ? flatten(ngModule.schemas) : null,
+          id: ngModule.id || null
+        });
+        if (!ngModuleDef.schemas) {
+          ngModuleDef.schemas = [];
+        }
+      }
+      return ngModuleDef;
+    }
+  });
+  let ngFactoryDef = null;
+  Object.defineProperty(moduleType, NG_FACTORY_DEF, {
+    get: () => {
+      if (ngFactoryDef === null) {
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "NgModule",
+          type: moduleType
+        });
+        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${moduleType.name}/ɵfac.js`, {
+          name: moduleType.name,
+          type: moduleType,
+          deps: reflectDependencies(moduleType),
+          target: compiler.FactoryTarget.NgModule,
+          typeArgumentCount: 0
+        });
+      }
+      return ngFactoryDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+  let ngInjectorDef = null;
+  Object.defineProperty(moduleType, NG_INJ_DEF, {
+    get: () => {
+      if (ngInjectorDef === null) {
+        ngDevMode && verifySemanticsOfNgModuleDef(moduleType, allowDuplicateDeclarationsInRoot);
+        const meta = {
+          name: moduleType.name,
+          type: moduleType,
+          providers: ngModule.providers || EMPTY_ARRAY,
+          imports: [
+            (ngModule.imports || EMPTY_ARRAY).map(resolveForwardRef),
+            (ngModule.exports || EMPTY_ARRAY).map(resolveForwardRef)
+          ]
+        };
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "NgModule",
+          type: moduleType
+        });
+        ngInjectorDef = compiler.compileInjector(angularCoreEnv, `ng:///${moduleType.name}/ɵinj.js`, meta);
+      }
+      return ngInjectorDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+}
+function generateStandaloneInDeclarationsError(type, location2) {
+  const prefix = `Unexpected "${stringifyForError(type)}" found in the "declarations" array of the`;
+  const suffix = `"${stringifyForError(type)}" is marked as standalone and can't be declared in any NgModule - did you intend to import it instead (by adding it to the "imports" array)?`;
+  return `${prefix} ${location2}, ${suffix}`;
+}
+function verifySemanticsOfNgModuleDef(moduleType, allowDuplicateDeclarationsInRoot, importingModule) {
+  if (verifiedNgModule.get(moduleType))
+    return;
+  if (isStandalone(moduleType))
+    return;
+  verifiedNgModule.set(moduleType, true);
+  moduleType = resolveForwardRef(moduleType);
+  let ngModuleDef;
+  if (importingModule) {
+    ngModuleDef = getNgModuleDef(moduleType);
+    if (!ngModuleDef) {
+      throw new Error(`Unexpected value '${moduleType.name}' imported by the module '${importingModule.name}'. Please add an @NgModule annotation.`);
+    }
+  } else {
+    ngModuleDef = getNgModuleDefOrThrow(moduleType);
+  }
+  const errors = [];
+  const declarations = maybeUnwrapFn(ngModuleDef.declarations);
+  const imports = maybeUnwrapFn(ngModuleDef.imports);
+  flatten(imports).map(unwrapModuleWithProvidersImports).forEach((modOrStandaloneCmpt) => {
+    verifySemanticsOfNgModuleImport(modOrStandaloneCmpt, moduleType);
+    verifySemanticsOfNgModuleDef(modOrStandaloneCmpt, false, moduleType);
+  });
+  const exports = maybeUnwrapFn(ngModuleDef.exports);
+  declarations.forEach(verifyDeclarationsHaveDefinitions);
+  declarations.forEach(verifyDirectivesHaveSelector);
+  declarations.forEach((declarationType) => verifyNotStandalone(declarationType, moduleType));
+  const combinedDeclarations = [
+    ...declarations.map(resolveForwardRef),
+    ...flatten(imports.map(computeCombinedExports)).map(resolveForwardRef)
+  ];
+  exports.forEach(verifyExportsAreDeclaredOrReExported);
+  declarations.forEach((decl) => verifyDeclarationIsUnique(decl, allowDuplicateDeclarationsInRoot));
+  const ngModule = getAnnotation(moduleType, "NgModule");
+  if (ngModule) {
+    ngModule.imports && flatten(ngModule.imports).map(unwrapModuleWithProvidersImports).forEach((mod) => {
+      verifySemanticsOfNgModuleImport(mod, moduleType);
+      verifySemanticsOfNgModuleDef(mod, false, moduleType);
+    });
+    ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyCorrectBootstrapType);
+    ngModule.bootstrap && deepForEach(ngModule.bootstrap, verifyComponentIsPartOfNgModule);
+  }
+  if (errors.length) {
+    throw new Error(errors.join("\n"));
+  }
+  function verifyDeclarationsHaveDefinitions(type) {
+    type = resolveForwardRef(type);
+    const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);
+    if (!def) {
+      errors.push(`Unexpected value '${stringifyForError(type)}' declared by the module '${stringifyForError(moduleType)}'. Please add a @Pipe/@Directive/@Component annotation.`);
+    }
+  }
+  function verifyDirectivesHaveSelector(type) {
+    type = resolveForwardRef(type);
+    const def = getDirectiveDef(type);
+    if (!getComponentDef(type) && def && def.selectors.length == 0) {
+      errors.push(`Directive ${stringifyForError(type)} has no selector, please add it!`);
+    }
+  }
+  function verifyNotStandalone(type, moduleType2) {
+    type = resolveForwardRef(type);
+    const def = getComponentDef(type) || getDirectiveDef(type) || getPipeDef(type);
+    if (def?.standalone) {
+      const location2 = `"${stringifyForError(moduleType2)}" NgModule`;
+      errors.push(generateStandaloneInDeclarationsError(type, location2));
+    }
+  }
+  function verifyExportsAreDeclaredOrReExported(type) {
+    type = resolveForwardRef(type);
+    const kind = getComponentDef(type) && "component" || getDirectiveDef(type) && "directive" || getPipeDef(type) && "pipe";
+    if (kind) {
+      if (combinedDeclarations.lastIndexOf(type) === -1) {
+        errors.push(`Can't export ${kind} ${stringifyForError(type)} from ${stringifyForError(moduleType)} as it was neither declared nor imported!`);
+      }
+    }
+  }
+  function verifyDeclarationIsUnique(type, suppressErrors) {
+    type = resolveForwardRef(type);
+    const existingModule = ownerNgModule.get(type);
+    if (existingModule && existingModule !== moduleType) {
+      if (!suppressErrors) {
+        const modules2 = [existingModule, moduleType].map(stringifyForError).sort();
+        errors.push(`Type ${stringifyForError(type)} is part of the declarations of 2 modules: ${modules2[0]} and ${modules2[1]}! Please consider moving ${stringifyForError(type)} to a higher module that imports ${modules2[0]} and ${modules2[1]}. You can also create a new NgModule that exports and includes ${stringifyForError(type)} then import that NgModule in ${modules2[0]} and ${modules2[1]}.`);
+      }
+    } else {
+      ownerNgModule.set(type, moduleType);
+    }
+  }
+  function verifyComponentIsPartOfNgModule(type) {
+    type = resolveForwardRef(type);
+    const existingModule = ownerNgModule.get(type);
+    if (!existingModule && !isStandalone(type)) {
+      errors.push(`Component ${stringifyForError(type)} is not part of any NgModule or the module has not been imported into your module.`);
+    }
+  }
+  function verifyCorrectBootstrapType(type) {
+    type = resolveForwardRef(type);
+    if (!getComponentDef(type)) {
+      errors.push(`${stringifyForError(type)} cannot be used as an entry component.`);
+    }
+    if (isStandalone(type)) {
+      errors.push(`The \`${stringifyForError(type)}\` class is a standalone component, which can not be used in the \`@NgModule.bootstrap\` array. Use the \`bootstrapApplication\` function for bootstrap instead.`);
+    }
+  }
+  function verifySemanticsOfNgModuleImport(type, importingModule2) {
+    type = resolveForwardRef(type);
+    const directiveDef = getComponentDef(type) || getDirectiveDef(type);
+    if (directiveDef !== null && !directiveDef.standalone) {
+      throw new Error(`Unexpected directive '${type.name}' imported by the module '${importingModule2.name}'. Please add an @NgModule annotation.`);
+    }
+    const pipeDef = getPipeDef(type);
+    if (pipeDef !== null && !pipeDef.standalone) {
+      throw new Error(`Unexpected pipe '${type.name}' imported by the module '${importingModule2.name}'. Please add an @NgModule annotation.`);
+    }
+  }
+}
+function unwrapModuleWithProvidersImports(typeOrWithProviders) {
+  typeOrWithProviders = resolveForwardRef(typeOrWithProviders);
+  return typeOrWithProviders.ngModule || typeOrWithProviders;
+}
+function getAnnotation(type, name) {
+  let annotation = null;
+  collect(type.__annotations__);
+  collect(type.decorators);
+  return annotation;
+  function collect(annotations) {
+    if (annotations) {
+      annotations.forEach(readAnnotation);
+    }
+  }
+  function readAnnotation(decorator) {
+    if (!annotation) {
+      const proto = Object.getPrototypeOf(decorator);
+      if (proto.ngMetadataName == name) {
+        annotation = decorator;
+      } else if (decorator.type) {
+        const proto2 = Object.getPrototypeOf(decorator.type);
+        if (proto2.ngMetadataName == name) {
+          annotation = decorator.args[0];
+        }
+      }
+    }
+  }
+}
+var ownerNgModule = /* @__PURE__ */ new WeakMap();
+var verifiedNgModule = /* @__PURE__ */ new WeakMap();
+function resetCompiledComponents() {
+  ownerNgModule = /* @__PURE__ */ new WeakMap();
+  verifiedNgModule = /* @__PURE__ */ new WeakMap();
+  moduleQueue.length = 0;
+  GENERATED_COMP_IDS.clear();
+}
+function computeCombinedExports(type) {
+  type = resolveForwardRef(type);
+  const ngModuleDef = getNgModuleDef(type);
+  if (ngModuleDef === null) {
+    return [type];
+  }
+  return flatten(maybeUnwrapFn(ngModuleDef.exports).map((type2) => {
+    const ngModuleDef2 = getNgModuleDef(type2);
+    if (ngModuleDef2) {
+      verifySemanticsOfNgModuleDef(type2, false);
+      return computeCombinedExports(type2);
+    } else {
+      return type2;
+    }
+  }));
+}
+function setScopeOnDeclaredComponents(moduleType, ngModule) {
+  const declarations = flatten(ngModule.declarations || EMPTY_ARRAY);
+  const transitiveScopes = transitiveScopesFor(moduleType);
+  declarations.forEach((declaration) => {
+    declaration = resolveForwardRef(declaration);
+    if (declaration.hasOwnProperty(NG_COMP_DEF)) {
+      const component = declaration;
+      const componentDef = getComponentDef(component);
+      patchComponentDefWithScope(componentDef, transitiveScopes);
+    } else if (!declaration.hasOwnProperty(NG_DIR_DEF) && !declaration.hasOwnProperty(NG_PIPE_DEF)) {
+      declaration.ngSelectorScope = moduleType;
+    }
+  });
+}
+function patchComponentDefWithScope(componentDef, transitiveScopes) {
+  componentDef.directiveDefs = () => Array.from(transitiveScopes.compilation.directives).map((dir) => dir.hasOwnProperty(NG_COMP_DEF) ? getComponentDef(dir) : getDirectiveDef(dir)).filter((def) => !!def);
+  componentDef.pipeDefs = () => Array.from(transitiveScopes.compilation.pipes).map((pipe2) => getPipeDef(pipe2));
+  componentDef.schemas = transitiveScopes.schemas;
+  componentDef.tView = null;
+}
+function transitiveScopesFor(type) {
+  if (isNgModule(type)) {
+    const scope = depsTracker.getNgModuleScope(type);
+    const def = getNgModuleDefOrThrow(type);
+    return __spreadValues({
+      schemas: def.schemas || null
+    }, scope);
+  } else if (isStandalone(type)) {
+    const directiveDef = getComponentDef(type) || getDirectiveDef(type);
+    if (directiveDef !== null) {
+      return {
+        schemas: null,
+        compilation: {
+          directives: /* @__PURE__ */ new Set(),
+          pipes: /* @__PURE__ */ new Set()
+        },
+        exported: {
+          directives: /* @__PURE__ */ new Set([type]),
+          pipes: /* @__PURE__ */ new Set()
+        }
+      };
+    }
+    const pipeDef = getPipeDef(type);
+    if (pipeDef !== null) {
+      return {
+        schemas: null,
+        compilation: {
+          directives: /* @__PURE__ */ new Set(),
+          pipes: /* @__PURE__ */ new Set()
+        },
+        exported: {
+          directives: /* @__PURE__ */ new Set(),
+          pipes: /* @__PURE__ */ new Set([type])
+        }
+      };
+    }
+  }
+  throw new Error(`${type.name} does not have a module def (ɵmod property)`);
+}
+function expandModuleWithProviders(value) {
+  if (isModuleWithProviders(value)) {
+    return value.ngModule;
+  }
+  return value;
+}
+var compilationDepth = 0;
+function compileComponent(type, metadata) {
+  (typeof ngDevMode === "undefined" || ngDevMode) && initNgDevMode();
+  let ngComponentDef = null;
+  maybeQueueResolutionOfComponentResources(type, metadata);
+  addDirectiveFactoryDef(type, metadata);
+  Object.defineProperty(type, NG_COMP_DEF, {
+    get: () => {
+      if (ngComponentDef === null) {
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "component",
+          type
+        });
+        if (componentNeedsResolution(metadata)) {
+          const error = [`Component '${type.name}' is not resolved:`];
+          if (metadata.templateUrl) {
+            error.push(` - templateUrl: ${metadata.templateUrl}`);
+          }
+          if (metadata.styleUrls && metadata.styleUrls.length) {
+            error.push(` - styleUrls: ${JSON.stringify(metadata.styleUrls)}`);
+          }
+          if (metadata.styleUrl) {
+            error.push(` - styleUrl: ${metadata.styleUrl}`);
+          }
+          error.push(`Did you run and wait for 'resolveComponentResources()'?`);
+          throw new Error(error.join("\n"));
+        }
+        const options = getJitOptions();
+        let preserveWhitespaces = metadata.preserveWhitespaces;
+        if (preserveWhitespaces === void 0) {
+          if (options !== null && options.preserveWhitespaces !== void 0) {
+            preserveWhitespaces = options.preserveWhitespaces;
+          } else {
+            preserveWhitespaces = false;
+          }
+        }
+        let encapsulation = metadata.encapsulation;
+        if (encapsulation === void 0) {
+          if (options !== null && options.defaultEncapsulation !== void 0) {
+            encapsulation = options.defaultEncapsulation;
+          } else {
+            encapsulation = ViewEncapsulation.Emulated;
+          }
+        }
+        const templateUrl = metadata.templateUrl || `ng:///${type.name}/template.html`;
+        const meta = __spreadProps(__spreadValues({}, directiveMetadata(type, metadata)), {
+          typeSourceSpan: compiler.createParseSourceSpan("Component", type.name, templateUrl),
+          template: metadata.template || "",
+          preserveWhitespaces,
+          styles: typeof metadata.styles === "string" ? [metadata.styles] : metadata.styles || EMPTY_ARRAY,
+          animations: metadata.animations,
+          // JIT components are always compiled against an empty set of `declarations`. Instead, the
+          // `directiveDefs` and `pipeDefs` are updated at a later point:
+          //  * for NgModule-based components, they're set when the NgModule which declares the
+          //    component resolves in the module scoping queue
+          //  * for standalone components, they're set just below, after `compileComponent`.
+          declarations: [],
+          changeDetection: metadata.changeDetection,
+          encapsulation,
+          interpolation: metadata.interpolation,
+          viewProviders: metadata.viewProviders || null
+        });
+        compilationDepth++;
+        try {
+          if (meta.usesInheritance) {
+            addDirectiveDefToUndecoratedParents(type);
+          }
+          ngComponentDef = compiler.compileComponent(angularCoreEnv, templateUrl, meta);
+          if (meta.isStandalone) {
+            const imports = flatten(metadata.imports || EMPTY_ARRAY);
+            const { directiveDefs, pipeDefs } = getStandaloneDefFunctions(type, imports);
+            ngComponentDef.directiveDefs = directiveDefs;
+            ngComponentDef.pipeDefs = pipeDefs;
+            ngComponentDef.dependencies = () => imports.map(resolveForwardRef);
+          }
+        } finally {
+          compilationDepth--;
+        }
+        if (compilationDepth === 0) {
+          flushModuleScopingQueueAsMuchAsPossible();
+        }
+        if (hasSelectorScope(type)) {
+          const scopes = transitiveScopesFor(type.ngSelectorScope);
+          patchComponentDefWithScope(ngComponentDef, scopes);
+        }
+        if (metadata.schemas) {
+          if (meta.isStandalone) {
+            ngComponentDef.schemas = metadata.schemas;
+          } else {
+            throw new Error(`The 'schemas' was specified for the ${stringifyForError(type)} but is only valid on a component that is standalone.`);
+          }
+        } else if (meta.isStandalone) {
+          ngComponentDef.schemas = [];
+        }
+      }
+      return ngComponentDef;
+    },
+    set: (def) => {
+      ngComponentDef = def;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+}
+function getStandaloneDefFunctions(type, imports) {
+  const directiveDefs = () => {
+    if (ngDevMode) {
+      for (const rawDep of imports) {
+        verifyStandaloneImport(rawDep, type);
+      }
+    }
+    if (!isComponent(type)) {
+      return [];
+    }
+    const scope = depsTracker.getStandaloneComponentScope(type, imports);
+    return [...scope.compilation.directives].map((p) => getComponentDef(p) || getDirectiveDef(p)).filter((d) => d !== null);
+  };
+  const pipeDefs = () => {
+    if (ngDevMode) {
+      for (const rawDep of imports) {
+        verifyStandaloneImport(rawDep, type);
+      }
+    }
+    if (!isComponent(type)) {
+      return [];
+    }
+    const scope = depsTracker.getStandaloneComponentScope(type, imports);
+    return [...scope.compilation.pipes].map((p) => getPipeDef(p)).filter((d) => d !== null);
+  };
+  return {
+    directiveDefs,
+    pipeDefs
+  };
+}
+function hasSelectorScope(component) {
+  return component.ngSelectorScope !== void 0;
+}
+function compileDirective(type, directive) {
+  let ngDirectiveDef = null;
+  addDirectiveFactoryDef(type, directive || {});
+  Object.defineProperty(type, NG_DIR_DEF, {
+    get: () => {
+      if (ngDirectiveDef === null) {
+        const meta = getDirectiveMetadata(type, directive || {});
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "directive",
+          type
+        });
+        ngDirectiveDef = compiler.compileDirective(angularCoreEnv, meta.sourceMapUrl, meta.metadata);
+      }
+      return ngDirectiveDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+}
+function getDirectiveMetadata(type, metadata) {
+  const name = type && type.name;
+  const sourceMapUrl = `ng:///${name}/ɵdir.js`;
+  const compiler = getCompilerFacade({ usage: 0, kind: "directive", type });
+  const facade = directiveMetadata(type, metadata);
+  facade.typeSourceSpan = compiler.createParseSourceSpan("Directive", name, sourceMapUrl);
+  if (facade.usesInheritance) {
+    addDirectiveDefToUndecoratedParents(type);
+  }
+  return { metadata: facade, sourceMapUrl };
+}
+function addDirectiveFactoryDef(type, metadata) {
+  let ngFactoryDef = null;
+  Object.defineProperty(type, NG_FACTORY_DEF, {
+    get: () => {
+      if (ngFactoryDef === null) {
+        const meta = getDirectiveMetadata(type, metadata);
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "directive",
+          type
+        });
+        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${type.name}/ɵfac.js`, {
+          name: meta.metadata.name,
+          type: meta.metadata.type,
+          typeArgumentCount: 0,
+          deps: reflectDependencies(type),
+          target: compiler.FactoryTarget.Directive
+        });
+      }
+      return ngFactoryDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+}
+function extendsDirectlyFromObject(type) {
+  return Object.getPrototypeOf(type.prototype) === Object.prototype;
+}
+function directiveMetadata(type, metadata) {
+  const reflect = getReflect();
+  const propMetadata = reflect.ownPropMetadata(type);
+  return {
+    name: type.name,
+    type,
+    selector: metadata.selector !== void 0 ? metadata.selector : null,
+    host: metadata.host || EMPTY_OBJ,
+    propMetadata,
+    inputs: metadata.inputs || EMPTY_ARRAY,
+    outputs: metadata.outputs || EMPTY_ARRAY,
+    queries: extractQueriesMetadata(type, propMetadata, isContentQuery),
+    lifecycle: { usesOnChanges: reflect.hasLifecycleHook(type, "ngOnChanges") },
+    typeSourceSpan: null,
+    usesInheritance: !extendsDirectlyFromObject(type),
+    exportAs: extractExportAs(metadata.exportAs),
+    providers: metadata.providers || null,
+    viewQueries: extractQueriesMetadata(type, propMetadata, isViewQuery),
+    isStandalone: metadata.standalone === void 0 ? true : !!metadata.standalone,
+    isSignal: !!metadata.signals,
+    hostDirectives: metadata.hostDirectives?.map((directive) => typeof directive === "function" ? { directive } : directive) || null
+  };
+}
+function addDirectiveDefToUndecoratedParents(type) {
+  const objPrototype = Object.prototype;
+  let parent = Object.getPrototypeOf(type.prototype).constructor;
+  while (parent && parent !== objPrototype) {
+    if (!getDirectiveDef(parent) && !getComponentDef(parent) && shouldAddAbstractDirective(parent)) {
+      compileDirective(parent, null);
+    }
+    parent = Object.getPrototypeOf(parent);
+  }
+}
+function convertToR3QueryPredicate(selector) {
+  return typeof selector === "string" ? splitByComma(selector) : resolveForwardRef(selector);
+}
+function convertToR3QueryMetadata(propertyName, ann) {
+  return {
+    propertyName,
+    predicate: convertToR3QueryPredicate(ann.selector),
+    descendants: ann.descendants,
+    first: ann.first,
+    read: ann.read ? ann.read : null,
+    static: !!ann.static,
+    emitDistinctChangesOnly: !!ann.emitDistinctChangesOnly,
+    isSignal: !!ann.isSignal
+  };
+}
+function extractQueriesMetadata(type, propMetadata, isQueryAnn) {
+  const queriesMeta = [];
+  for (const field in propMetadata) {
+    if (propMetadata.hasOwnProperty(field)) {
+      const annotations = propMetadata[field];
+      annotations.forEach((ann) => {
+        if (isQueryAnn(ann)) {
+          if (!ann.selector) {
+            throw new Error(`Can't construct a query for the property "${field}" of "${stringifyForError(type)}" since the query selector wasn't defined.`);
+          }
+          if (annotations.some(isInputAnnotation)) {
+            throw new Error(`Cannot combine @Input decorators with query decorators`);
+          }
+          queriesMeta.push(convertToR3QueryMetadata(field, ann));
+        }
+      });
+    }
+  }
+  return queriesMeta;
+}
+function extractExportAs(exportAs) {
+  return exportAs === void 0 ? null : splitByComma(exportAs);
+}
+function isContentQuery(value) {
+  const name = value.ngMetadataName;
+  return name === "ContentChild" || name === "ContentChildren";
+}
+function isViewQuery(value) {
+  const name = value.ngMetadataName;
+  return name === "ViewChild" || name === "ViewChildren";
+}
+function isInputAnnotation(value) {
+  return value.ngMetadataName === "Input";
+}
+function splitByComma(value) {
+  return value.split(",").map((piece) => piece.trim());
+}
+var LIFECYCLE_HOOKS = [
+  "ngOnChanges",
+  "ngOnInit",
+  "ngOnDestroy",
+  "ngDoCheck",
+  "ngAfterViewInit",
+  "ngAfterViewChecked",
+  "ngAfterContentInit",
+  "ngAfterContentChecked"
+];
+function shouldAddAbstractDirective(type) {
+  const reflect = getReflect();
+  if (LIFECYCLE_HOOKS.some((hookName) => reflect.hasLifecycleHook(type, hookName))) {
+    return true;
+  }
+  const propMetadata = reflect.propMetadata(type);
+  for (const field in propMetadata) {
+    const annotations = propMetadata[field];
+    for (let i = 0; i < annotations.length; i++) {
+      const current = annotations[i];
+      const metadataName = current.ngMetadataName;
+      if (isInputAnnotation(current) || isContentQuery(current) || isViewQuery(current) || metadataName === "Output" || metadataName === "HostBinding" || metadataName === "HostListener") {
+        return true;
+      }
+    }
+  }
+  return false;
+}
+function compilePipe(type, meta) {
+  let ngPipeDef = null;
+  let ngFactoryDef = null;
+  Object.defineProperty(type, NG_FACTORY_DEF, {
+    get: () => {
+      if (ngFactoryDef === null) {
+        const metadata = getPipeMetadata(type, meta);
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "pipe",
+          type: metadata.type
+        });
+        ngFactoryDef = compiler.compileFactory(angularCoreEnv, `ng:///${metadata.name}/ɵfac.js`, {
+          name: metadata.name,
+          type: metadata.type,
+          typeArgumentCount: 0,
+          deps: reflectDependencies(type),
+          target: compiler.FactoryTarget.Pipe
+        });
+      }
+      return ngFactoryDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+  Object.defineProperty(type, NG_PIPE_DEF, {
+    get: () => {
+      if (ngPipeDef === null) {
+        const metadata = getPipeMetadata(type, meta);
+        const compiler = getCompilerFacade({
+          usage: 0,
+          kind: "pipe",
+          type: metadata.type
+        });
+        ngPipeDef = compiler.compilePipe(angularCoreEnv, `ng:///${metadata.name}/ɵpipe.js`, metadata);
+      }
+      return ngPipeDef;
+    },
+    // Make the property configurable in dev mode to allow overriding in tests
+    configurable: !!ngDevMode
+  });
+}
+function getPipeMetadata(type, meta) {
+  return {
+    type,
+    name: type.name,
+    pipeName: meta.name,
+    pure: meta.pure !== void 0 ? meta.pure : true,
+    isStandalone: meta.standalone === void 0 ? true : !!meta.standalone
+  };
+}
+var Directive = makeDecorator("Directive", (dir = {}) => dir, void 0, void 0, (type, meta) => compileDirective(type, meta));
+var Component = makeDecorator("Component", (c = {}) => __spreadValues({ changeDetection: ChangeDetectionStrategy.Default }, c), Directive, void 0, (type, meta) => compileComponent(type, meta));
+var Pipe = makeDecorator("Pipe", (p) => __spreadValues({ pure: true }, p), void 0, void 0, (type, meta) => compilePipe(type, meta));
+var Input = makePropDecorator("Input", (arg) => {
+  if (!arg) {
+    return {};
+  }
+  return typeof arg === "string" ? { alias: arg } : arg;
+});
+var Output = makePropDecorator("Output", (alias) => ({ alias }));
+var HostBinding = makePropDecorator("HostBinding", (hostPropertyName) => ({ hostPropertyName }));
+var HostListener = makePropDecorator("HostListener", (eventName, args) => ({ eventName, args }));
+var NgModule = makeDecorator(
+  "NgModule",
+  (ngModule) => ngModule,
+  void 0,
+  void 0,
+  /**
+   * Decorator that marks the following class as an NgModule, and supplies
+   * configuration metadata for it.
+   *
+   * * The `declarations` option configures the compiler
+   * with information about what belongs to the NgModule.
+   * * The `providers` options configures the NgModule's injector to provide
+   * dependencies the NgModule members.
+   * * The `imports` and `exports` options bring in members from other modules, and make
+   * this module's members available to others.
+   */
+  (type, meta) => compileNgModule(type, meta)
+);
+var ModuleWithComponentFactories = class {
+  ngModuleFactory;
+  componentFactories;
+  constructor(ngModuleFactory, componentFactories) {
+    this.ngModuleFactory = ngModuleFactory;
+    this.componentFactories = componentFactories;
+  }
+};
+var Compiler = class _Compiler {
+  /**
+   * Compiles the given NgModule and all of its components. All templates of the components
+   * have to be inlined.
+   */
+  compileModuleSync(moduleType) {
+    return new NgModuleFactory2(moduleType);
+  }
+  /**
+   * Compiles the given NgModule and all of its components
+   */
+  compileModuleAsync(moduleType) {
+    return Promise.resolve(this.compileModuleSync(moduleType));
+  }
+  /**
+   * Same as {@link Compiler#compileModuleSync compileModuleSync} but also creates ComponentFactories for all components.
+   */
+  compileModuleAndAllComponentsSync(moduleType) {
+    const ngModuleFactory = this.compileModuleSync(moduleType);
+    const moduleDef = getNgModuleDef(moduleType);
+    const componentFactories = maybeUnwrapFn(moduleDef.declarations).reduce((factories, declaration) => {
+      const componentDef = getComponentDef(declaration);
+      componentDef && factories.push(new ComponentFactory2(componentDef));
+      return factories;
+    }, []);
+    return new ModuleWithComponentFactories(ngModuleFactory, componentFactories);
+  }
+  /**
+   * Same as {@link Compiler#compileModuleAsync compileModuleAsync} but also creates ComponentFactories for all components.
+   */
+  compileModuleAndAllComponentsAsync(moduleType) {
+    return Promise.resolve(this.compileModuleAndAllComponentsSync(moduleType));
+  }
+  /**
+   * Clears all caches.
+   */
+  clearCache() {
+  }
+  /**
+   * Clears the cache for the given component/ngModule.
+   */
+  clearCacheFor(type) {
+  }
+  /**
+   * Returns the id for a given NgModule, if one is defined and known to the compiler.
+   */
+  getModuleId(moduleType) {
+    return void 0;
+  }
+  static ɵfac = function Compiler_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _Compiler)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _Compiler, factory: _Compiler.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(Compiler, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], null, null);
+})();
+var COMPILER_OPTIONS = new InjectionToken(ngDevMode ? "compilerOptions" : "");
+var CompilerFactory = class {
+};
+var NgZoneChangeDetectionScheduler = class _NgZoneChangeDetectionScheduler {
+  zone = inject(NgZone);
+  changeDetectionScheduler = inject(ChangeDetectionScheduler);
+  applicationRef = inject(ApplicationRef);
+  applicationErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+  _onMicrotaskEmptySubscription;
+  initialize() {
+    if (this._onMicrotaskEmptySubscription) {
+      return;
+    }
+    this._onMicrotaskEmptySubscription = this.zone.onMicrotaskEmpty.subscribe({
+      next: () => {
+        if (this.changeDetectionScheduler.runningTick) {
+          return;
+        }
+        this.zone.run(() => {
+          try {
+            this.applicationRef.dirtyFlags |= 1;
+            this.applicationRef._tick();
+          } catch (e) {
+            this.applicationErrorHandler(e);
+          }
+        });
+      }
+    });
+  }
+  ngOnDestroy() {
+    this._onMicrotaskEmptySubscription?.unsubscribe();
+  }
+  static ɵfac = function NgZoneChangeDetectionScheduler_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _NgZoneChangeDetectionScheduler)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _NgZoneChangeDetectionScheduler, factory: _NgZoneChangeDetectionScheduler.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(NgZoneChangeDetectionScheduler, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], null, null);
+})();
+var PROVIDED_NG_ZONE = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "provideZoneChangeDetection token" : "", { factory: () => false });
+function internalProvideZoneChangeDetection({ ngZoneFactory, ignoreChangesOutsideZone, scheduleInRootZone }) {
+  ngZoneFactory ??= () => new NgZone(__spreadProps(__spreadValues({}, getNgZoneOptions()), { scheduleInRootZone }));
+  return [
+    { provide: NgZone, useFactory: ngZoneFactory },
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      multi: true,
+      useFactory: () => {
+        const ngZoneChangeDetectionScheduler = inject(NgZoneChangeDetectionScheduler, {
+          optional: true
+        });
+        if ((typeof ngDevMode === "undefined" || ngDevMode) && ngZoneChangeDetectionScheduler === null) {
+          throw new RuntimeError(402, `A required Injectable was not found in the dependency injection tree. If you are bootstrapping an NgModule, make sure that the \`BrowserModule\` is imported.`);
+        }
+        return () => ngZoneChangeDetectionScheduler.initialize();
+      }
+    },
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      multi: true,
+      useFactory: () => {
+        const service = inject(ZoneStablePendingTask);
+        return () => {
+          service.initialize();
+        };
+      }
+    },
+    // Always disable scheduler whenever explicitly disabled, even if another place called
+    // `provideZoneChangeDetection` without the 'ignore' option.
+    ignoreChangesOutsideZone === true ? { provide: ZONELESS_SCHEDULER_DISABLED, useValue: true } : [],
+    {
+      provide: SCHEDULE_IN_ROOT_ZONE,
+      useValue: scheduleInRootZone ?? SCHEDULE_IN_ROOT_ZONE_DEFAULT
+    },
+    {
+      provide: INTERNAL_APPLICATION_ERROR_HANDLER,
+      useFactory: () => {
+        const zone = inject(NgZone);
+        const injector = inject(EnvironmentInjector);
+        let userErrorHandler;
+        return (e) => {
+          zone.runOutsideAngular(() => {
+            if (injector.destroyed && !userErrorHandler) {
+              setTimeout(() => {
+                throw e;
+              });
+            } else {
+              userErrorHandler ??= injector.get(ErrorHandler);
+              userErrorHandler.handleError(e);
+            }
+          });
+        };
+      }
+    }
+  ];
+}
+function provideZoneChangeDetection(options) {
+  const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;
+  const scheduleInRootZone = options?.scheduleInRootZone;
+  const zoneProviders = internalProvideZoneChangeDetection({
+    ngZoneFactory: () => {
+      const ngZoneOptions = getNgZoneOptions(options);
+      ngZoneOptions.scheduleInRootZone = scheduleInRootZone;
+      if (ngZoneOptions.shouldCoalesceEventChangeDetection) {
+        performanceMarkFeature("NgZone_CoalesceEvent");
+      }
+      return new NgZone(ngZoneOptions);
+    },
+    ignoreChangesOutsideZone,
+    scheduleInRootZone
+  });
+  return makeEnvironmentProviders([
+    { provide: PROVIDED_NG_ZONE, useValue: true },
+    { provide: ZONELESS_ENABLED, useValue: false },
+    zoneProviders
+  ]);
+}
+function getNgZoneOptions(options) {
+  return {
+    enableLongStackTrace: typeof ngDevMode === "undefined" ? false : !!ngDevMode,
+    shouldCoalesceEventChangeDetection: options?.eventCoalescing ?? false,
+    shouldCoalesceRunChangeDetection: options?.runCoalescing ?? false
+  };
+}
+var ZoneStablePendingTask = class _ZoneStablePendingTask {
+  subscription = new Subscription();
+  initialized = false;
+  zone = inject(NgZone);
+  pendingTasks = inject(PendingTasksInternal);
+  initialize() {
+    if (this.initialized) {
+      return;
+    }
+    this.initialized = true;
+    let task = null;
+    if (!this.zone.isStable && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
+      task = this.pendingTasks.add();
+    }
+    this.zone.runOutsideAngular(() => {
+      this.subscription.add(this.zone.onStable.subscribe(() => {
+        NgZone.assertNotInAngularZone();
+        queueMicrotask(() => {
+          if (task !== null && !this.zone.hasPendingMacrotasks && !this.zone.hasPendingMicrotasks) {
+            this.pendingTasks.remove(task);
+            task = null;
+          }
+        });
+      }));
+    });
+    this.subscription.add(this.zone.onUnstable.subscribe(() => {
+      NgZone.assertInAngularZone();
+      task ??= this.pendingTasks.add();
+    }));
+  }
+  ngOnDestroy() {
+    this.subscription.unsubscribe();
+  }
+  static ɵfac = function ZoneStablePendingTask_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ZoneStablePendingTask)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _ZoneStablePendingTask, factory: _ZoneStablePendingTask.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ZoneStablePendingTask, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], null, null);
+})();
+var CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT = 100;
+var consecutiveMicrotaskNotifications = 0;
+var stackFromLastFewNotifications = [];
+function trackMicrotaskNotificationForDebugging() {
+  consecutiveMicrotaskNotifications++;
+  if (CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT - consecutiveMicrotaskNotifications < 5) {
+    const stack = new Error().stack;
+    if (stack) {
+      stackFromLastFewNotifications.push(stack);
+    }
+  }
+  if (consecutiveMicrotaskNotifications === CONSECUTIVE_MICROTASK_NOTIFICATION_LIMIT) {
+    throw new RuntimeError(103, "Angular could not stabilize because there were endless change notifications within the browser event loop. The stack from the last several notifications: \n" + stackFromLastFewNotifications.join("\n"));
+  }
+}
+var ChangeDetectionSchedulerImpl = class _ChangeDetectionSchedulerImpl {
+  applicationErrorHandler = inject(INTERNAL_APPLICATION_ERROR_HANDLER);
+  appRef = inject(ApplicationRef);
+  taskService = inject(PendingTasksInternal);
+  ngZone = inject(NgZone);
+  zonelessEnabled = inject(ZONELESS_ENABLED);
+  tracing = inject(TracingService, { optional: true });
+  disableScheduling = inject(ZONELESS_SCHEDULER_DISABLED, { optional: true }) ?? false;
+  zoneIsDefined = typeof Zone !== "undefined" && !!Zone.root.run;
+  schedulerTickApplyArgs = [{ data: { "__scheduler_tick__": true } }];
+  subscriptions = new Subscription();
+  angularZoneId = this.zoneIsDefined ? this.ngZone._inner?.get(angularZoneInstanceIdProperty) : null;
+  scheduleInRootZone = !this.zonelessEnabled && this.zoneIsDefined && (inject(SCHEDULE_IN_ROOT_ZONE, { optional: true }) ?? false);
+  cancelScheduledCallback = null;
+  useMicrotaskScheduler = false;
+  runningTick = false;
+  pendingRenderTaskId = null;
+  constructor() {
+    this.subscriptions.add(this.appRef.afterTick.subscribe(() => {
+      if (!this.runningTick) {
+        this.cleanup();
+      }
+    }));
+    this.subscriptions.add(this.ngZone.onUnstable.subscribe(() => {
+      if (!this.runningTick) {
+        this.cleanup();
+      }
+    }));
+    this.disableScheduling ||= !this.zonelessEnabled && // NoopNgZone without enabling zoneless means no scheduling whatsoever
+    (this.ngZone instanceof NoopNgZone || // The same goes for the lack of Zone without enabling zoneless scheduling
+    !this.zoneIsDefined);
+  }
+  notify(source) {
+    if (!this.zonelessEnabled && source === 5) {
+      return;
+    }
+    let force = false;
+    switch (source) {
+      case 0: {
+        this.appRef.dirtyFlags |= 2;
+        break;
+      }
+      case 3:
+      case 2:
+      case 4:
+      case 5:
+      case 1: {
+        this.appRef.dirtyFlags |= 4;
+        break;
+      }
+      case 6: {
+        this.appRef.dirtyFlags |= 2;
+        force = true;
+        break;
+      }
+      case 12: {
+        this.appRef.dirtyFlags |= 16;
+        force = true;
+        break;
+      }
+      case 13: {
+        this.appRef.dirtyFlags |= 2;
+        force = true;
+        break;
+      }
+      case 11: {
+        force = true;
+        break;
+      }
+      case 9:
+      case 8:
+      case 7:
+      case 10:
+      default: {
+        this.appRef.dirtyFlags |= 8;
+      }
+    }
+    this.appRef.tracingSnapshot = this.tracing?.snapshot(this.appRef.tracingSnapshot) ?? null;
+    if (!this.shouldScheduleTick(force)) {
+      return;
+    }
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      if (this.useMicrotaskScheduler) {
+        trackMicrotaskNotificationForDebugging();
+      } else {
+        consecutiveMicrotaskNotifications = 0;
+        stackFromLastFewNotifications.length = 0;
+      }
+    }
+    const scheduleCallback = this.useMicrotaskScheduler ? scheduleCallbackWithMicrotask : scheduleCallbackWithRafRace;
+    this.pendingRenderTaskId = this.taskService.add();
+    if (this.scheduleInRootZone) {
+      this.cancelScheduledCallback = Zone.root.run(() => scheduleCallback(() => this.tick()));
+    } else {
+      this.cancelScheduledCallback = this.ngZone.runOutsideAngular(() => scheduleCallback(() => this.tick()));
+    }
+  }
+  shouldScheduleTick(force) {
+    if (this.disableScheduling && !force || this.appRef.destroyed) {
+      return false;
+    }
+    if (this.pendingRenderTaskId !== null || this.runningTick || this.appRef._runningTick) {
+      return false;
+    }
+    if (!this.zonelessEnabled && this.zoneIsDefined && Zone.current.get(angularZoneInstanceIdProperty + this.angularZoneId)) {
+      return false;
+    }
+    return true;
+  }
+  /**
+   * Calls ApplicationRef._tick inside the `NgZone`.
+   *
+   * Calling `tick` directly runs change detection and cancels any change detection that had been
+   * scheduled previously.
+   *
+   * @param shouldRefreshViews Passed directly to `ApplicationRef._tick` and skips straight to
+   *     render hooks when `false`.
+   */
+  tick() {
+    if (this.runningTick || this.appRef.destroyed) {
+      return;
+    }
+    if (this.appRef.dirtyFlags === 0) {
+      this.cleanup();
+      return;
+    }
+    if (!this.zonelessEnabled && this.appRef.dirtyFlags & 7) {
+      this.appRef.dirtyFlags |= 1;
+    }
+    const task = this.taskService.add();
+    try {
+      this.ngZone.run(() => {
+        this.runningTick = true;
+        this.appRef._tick();
+      }, void 0, this.schedulerTickApplyArgs);
+    } catch (e) {
+      this.taskService.remove(task);
+      this.applicationErrorHandler(e);
+    } finally {
+      this.cleanup();
+    }
+    this.useMicrotaskScheduler = true;
+    scheduleCallbackWithMicrotask(() => {
+      this.useMicrotaskScheduler = false;
+      this.taskService.remove(task);
+    });
+  }
+  ngOnDestroy() {
+    this.subscriptions.unsubscribe();
+    this.cleanup();
+  }
+  cleanup() {
+    this.runningTick = false;
+    this.cancelScheduledCallback?.();
+    this.cancelScheduledCallback = null;
+    if (this.pendingRenderTaskId !== null) {
+      const taskId = this.pendingRenderTaskId;
+      this.pendingRenderTaskId = null;
+      this.taskService.remove(taskId);
+    }
+  }
+  static ɵfac = function ChangeDetectionSchedulerImpl_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ChangeDetectionSchedulerImpl)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _ChangeDetectionSchedulerImpl, factory: _ChangeDetectionSchedulerImpl.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ChangeDetectionSchedulerImpl, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], () => [], null);
+})();
+function provideZonelessChangeDetection() {
+  performanceMarkFeature("NgZoneless");
+  if ((typeof ngDevMode === "undefined" || ngDevMode) && typeof Zone !== "undefined" && Zone) {
+    const message = formatRuntimeError(914, `The application is using zoneless change detection, but is still loading Zone.js. Consider removing Zone.js to get the full benefits of zoneless. In applications using the Angular CLI, Zone.js is typically included in the "polyfills" section of the angular.json file.`);
+    console.warn(message);
+  }
+  return makeEnvironmentProviders([
+    { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
+    { provide: NgZone, useClass: NoopNgZone },
+    { provide: ZONELESS_ENABLED, useValue: true },
+    { provide: SCHEDULE_IN_ROOT_ZONE, useValue: false },
+    typeof ngDevMode === "undefined" || ngDevMode ? [{ provide: PROVIDED_ZONELESS, useValue: true }] : []
+  ]);
+}
+function getGlobalLocale() {
+  if (typeof ngI18nClosureMode !== "undefined" && ngI18nClosureMode && typeof goog !== "undefined" && goog.LOCALE !== "en") {
+    return goog.LOCALE;
+  } else {
+    return typeof $localize !== "undefined" && $localize.locale || DEFAULT_LOCALE_ID;
+  }
+}
+var LOCALE_ID = new InjectionToken(ngDevMode ? "LocaleId" : "", {
+  providedIn: "root",
+  factory: () => inject(LOCALE_ID, { optional: true, skipSelf: true }) || getGlobalLocale()
+});
+var DEFAULT_CURRENCY_CODE = new InjectionToken(ngDevMode ? "DefaultCurrencyCode" : "", {
+  providedIn: "root",
+  factory: () => USD_CURRENCY_CODE
+});
+var TRANSLATIONS = new InjectionToken(ngDevMode ? "Translations" : "");
+var TRANSLATIONS_FORMAT = new InjectionToken(ngDevMode ? "TranslationsFormat" : "");
+var MissingTranslationStrategy;
+(function(MissingTranslationStrategy2) {
+  MissingTranslationStrategy2[MissingTranslationStrategy2["Error"] = 0] = "Error";
+  MissingTranslationStrategy2[MissingTranslationStrategy2["Warning"] = 1] = "Warning";
+  MissingTranslationStrategy2[MissingTranslationStrategy2["Ignore"] = 2] = "Ignore";
+})(MissingTranslationStrategy || (MissingTranslationStrategy = {}));
+var DebugEventListener = class {
+  name;
+  callback;
+  constructor(name, callback) {
+    this.name = name;
+    this.callback = callback;
+  }
+};
+function asNativeElements(debugEls) {
+  return debugEls.map((el) => el.nativeElement);
+}
+var DebugNode = class {
+  /**
+   * The underlying DOM node.
+   */
+  nativeNode;
+  constructor(nativeNode) {
+    this.nativeNode = nativeNode;
+  }
+  /**
+   * The `DebugElement` parent. Will be `null` if this is the root element.
+   */
+  get parent() {
+    const parent = this.nativeNode.parentNode;
+    return parent ? new DebugElement(parent) : null;
+  }
+  /**
+   * The host dependency injector. For example, the root element's component instance injector.
+   */
+  get injector() {
+    return getInjector(this.nativeNode);
+  }
+  /**
+   * The element's own component instance, if it has one.
+   */
+  get componentInstance() {
+    const nativeElement = this.nativeNode;
+    return nativeElement && (getComponent(nativeElement) || getOwningComponent(nativeElement));
+  }
+  /**
+   * An object that provides parent context for this element. Often an ancestor component instance
+   * that governs this element.
+   *
+   * When an element is repeated within *ngFor, the context is an `NgForOf` whose `$implicit`
+   * property is the value of the row instance value. For example, the `hero` in `*ngFor="let hero
+   * of heroes"`.
+   */
+  get context() {
+    return getComponent(this.nativeNode) || getContext(this.nativeNode);
+  }
+  /**
+   * The callbacks attached to the component's @Output properties and/or the element's event
+   * properties.
+   */
+  get listeners() {
+    return getListeners(this.nativeNode).filter((listener) => listener.type === "dom");
+  }
+  /**
+   * Dictionary of objects associated with template local variables (e.g. #foo), keyed by the local
+   * variable name.
+   */
+  get references() {
+    return getLocalRefs(this.nativeNode);
+  }
+  /**
+   * This component's injector lookup tokens. Includes the component itself plus the tokens that the
+   * component lists in its providers metadata.
+   */
+  get providerTokens() {
+    return getInjectionTokens(this.nativeNode);
+  }
+};
+var DebugElement = class extends DebugNode {
+  constructor(nativeNode) {
+    ngDevMode && assertDomNode(nativeNode);
+    super(nativeNode);
+  }
+  /**
+   * The underlying DOM element at the root of the component.
+   */
+  get nativeElement() {
+    return this.nativeNode.nodeType == Node.ELEMENT_NODE ? this.nativeNode : null;
+  }
+  /**
+   * The element tag name, if it is an element.
+   */
+  get name() {
+    const context2 = getLContext(this.nativeNode);
+    const lView = context2 ? context2.lView : null;
+    if (lView !== null) {
+      const tData = lView[TVIEW].data;
+      const tNode = tData[context2.nodeIndex];
+      return tNode.value;
+    } else {
+      return this.nativeNode.nodeName;
+    }
+  }
+  /**
+   *  Gets a map of property names to property values for an element.
+   *
+   *  This map includes:
+   *  - Regular property bindings (e.g. `[id]="id"`)
+   *  - Host property bindings (e.g. `host: { '[id]': "id" }`)
+   *  - Interpolated property bindings (e.g. `id="{{ value }}")
+   *
+   *  It does not include:
+   *  - input property bindings (e.g. `[myCustomInput]="value"`)
+   *  - attribute bindings (e.g. `[attr.role]="menu"`)
+   */
+  get properties() {
+    const context2 = getLContext(this.nativeNode);
+    const lView = context2 ? context2.lView : null;
+    if (lView === null) {
+      return {};
+    }
+    const tData = lView[TVIEW].data;
+    const tNode = tData[context2.nodeIndex];
+    const properties = {};
+    copyDomProperties(this.nativeElement, properties);
+    collectPropertyBindings(properties, tNode, lView, tData);
+    return properties;
+  }
+  /**
+   *  A map of attribute names to attribute values for an element.
+   */
+  // TODO: replace null by undefined in the return type
+  get attributes() {
+    const attributes = {};
+    const element = this.nativeElement;
+    if (!element) {
+      return attributes;
+    }
+    const context2 = getLContext(element);
+    const lView = context2 ? context2.lView : null;
+    if (lView === null) {
+      return {};
+    }
+    const tNodeAttrs = lView[TVIEW].data[context2.nodeIndex].attrs;
+    const lowercaseTNodeAttrs = [];
+    if (tNodeAttrs) {
+      let i = 0;
+      while (i < tNodeAttrs.length) {
+        const attrName = tNodeAttrs[i];
+        if (typeof attrName !== "string")
+          break;
+        const attrValue = tNodeAttrs[i + 1];
+        attributes[attrName] = attrValue;
+        lowercaseTNodeAttrs.push(attrName.toLowerCase());
+        i += 2;
+      }
+    }
+    for (const attr of element.attributes) {
+      if (!lowercaseTNodeAttrs.includes(attr.name)) {
+        attributes[attr.name] = attr.value;
+      }
+    }
+    return attributes;
+  }
+  /**
+   * The inline styles of the DOM element.
+   */
+  // TODO: replace null by undefined in the return type
+  get styles() {
+    const element = this.nativeElement;
+    return element?.style ?? {};
+  }
+  /**
+   * A map containing the class names on the element as keys.
+   *
+   * This map is derived from the `className` property of the DOM element.
+   *
+   * Note: The values of this object will always be `true`. The class key will not appear in the KV
+   * object if it does not exist on the element.
+   *
+   * @see [Element.className](https://developer.mozilla.org/en-US/docs/Web/API/Element/className)
+   */
+  get classes() {
+    const result = {};
+    const element = this.nativeElement;
+    const className = element.className;
+    const classes = typeof className !== "string" ? className.baseVal.split(" ") : className.split(" ");
+    classes.forEach((value) => result[value] = true);
+    return result;
+  }
+  /**
+   * The `childNodes` of the DOM element as a `DebugNode` array.
+   *
+   * @see [Node.childNodes](https://developer.mozilla.org/en-US/docs/Web/API/Node/childNodes)
+   */
+  get childNodes() {
+    const childNodes = this.nativeNode.childNodes;
+    const children = [];
+    for (let i = 0; i < childNodes.length; i++) {
+      const element = childNodes[i];
+      children.push(getDebugNode(element));
+    }
+    return children;
+  }
+  /**
+   * The immediate `DebugElement` children. Walk the tree by descending through `children`.
+   */
+  get children() {
+    const nativeElement = this.nativeElement;
+    if (!nativeElement)
+      return [];
+    const childNodes = nativeElement.children;
+    const children = [];
+    for (let i = 0; i < childNodes.length; i++) {
+      const element = childNodes[i];
+      children.push(getDebugNode(element));
+    }
+    return children;
+  }
+  /**
+   * @returns the first `DebugElement` that matches the predicate at any depth in the subtree.
+   */
+  query(predicate) {
+    const results = this.queryAll(predicate);
+    return results[0] || null;
+  }
+  /**
+   * @returns All `DebugElement` matches for the predicate at any depth in the subtree.
+   */
+  queryAll(predicate) {
+    const matches = [];
+    _queryAll(this, predicate, matches, true);
+    return matches;
+  }
+  /**
+   * @returns All `DebugNode` matches for the predicate at any depth in the subtree.
+   */
+  queryAllNodes(predicate) {
+    const matches = [];
+    _queryAll(this, predicate, matches, false);
+    return matches;
+  }
+  /**
+   * Triggers the event by its name if there is a corresponding listener in the element's
+   * `listeners` collection.
+   *
+   * If the event lacks a listener or there's some other problem, consider
+   * calling `nativeElement.dispatchEvent(eventObject)`.
+   *
+   * @param eventName The name of the event to trigger
+   * @param eventObj The _event object_ expected by the handler
+   *
+   * @see [Testing components scenarios](guide/testing/components-scenarios#trigger-event-handler)
+   */
+  triggerEventHandler(eventName, eventObj) {
+    const node = this.nativeNode;
+    const invokedListeners = [];
+    this.listeners.forEach((listener) => {
+      if (listener.name === eventName) {
+        const callback = listener.callback;
+        callback.call(node, eventObj);
+        invokedListeners.push(callback);
+      }
+    });
+    if (typeof node.eventListeners === "function") {
+      node.eventListeners(eventName).forEach((listener) => {
+        if (listener.toString().indexOf("__ngUnwrap__") !== -1) {
+          const unwrappedListener = listener("__ngUnwrap__");
+          return invokedListeners.indexOf(unwrappedListener) === -1 && unwrappedListener.call(node, eventObj);
+        }
+      });
+    }
+  }
+};
+function copyDomProperties(element, properties) {
+  if (element) {
+    let obj = Object.getPrototypeOf(element);
+    const NodePrototype = Node.prototype;
+    while (obj !== null && obj !== NodePrototype) {
+      const descriptors = Object.getOwnPropertyDescriptors(obj);
+      for (let key in descriptors) {
+        if (!key.startsWith("__") && !key.startsWith("on")) {
+          const value = element[key];
+          if (isPrimitiveValue(value)) {
+            properties[key] = value;
+          }
+        }
+      }
+      obj = Object.getPrototypeOf(obj);
+    }
+  }
+}
+function isPrimitiveValue(value) {
+  return typeof value === "string" || typeof value === "boolean" || typeof value === "number" || value === null;
+}
+function _queryAll(parentElement, predicate, matches, elementsOnly) {
+  const context2 = getLContext(parentElement.nativeNode);
+  const lView = context2 ? context2.lView : null;
+  if (lView !== null) {
+    const parentTNode = lView[TVIEW].data[context2.nodeIndex];
+    _queryNodeChildren(parentTNode, lView, predicate, matches, elementsOnly, parentElement.nativeNode);
+  } else {
+    _queryNativeNodeDescendants(parentElement.nativeNode, predicate, matches, elementsOnly);
+  }
+}
+function _queryNodeChildren(tNode, lView, predicate, matches, elementsOnly, rootNativeNode) {
+  ngDevMode && assertTNodeForLView(tNode, lView);
+  const nativeNode = getNativeByTNodeOrNull(tNode, lView);
+  if (tNode.type & (3 | 8)) {
+    _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode);
+    if (isComponentHost(tNode)) {
+      const componentView = getComponentLViewByIndex(tNode.index, lView);
+      if (componentView && componentView[TVIEW].firstChild) {
+        _queryNodeChildren(componentView[TVIEW].firstChild, componentView, predicate, matches, elementsOnly, rootNativeNode);
+      }
+    } else {
+      if (tNode.child) {
+        _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
+      }
+      nativeNode && _queryNativeNodeDescendants(nativeNode, predicate, matches, elementsOnly);
+    }
+    const nodeOrContainer = lView[tNode.index];
+    if (isLContainer(nodeOrContainer)) {
+      _queryNodeChildrenInContainer(nodeOrContainer, predicate, matches, elementsOnly, rootNativeNode);
+    }
+  } else if (tNode.type & 4) {
+    const lContainer = lView[tNode.index];
+    _addQueryMatch(lContainer[NATIVE], predicate, matches, elementsOnly, rootNativeNode);
+    _queryNodeChildrenInContainer(lContainer, predicate, matches, elementsOnly, rootNativeNode);
+  } else if (tNode.type & 16) {
+    const componentView = lView[DECLARATION_COMPONENT_VIEW];
+    const componentHost = componentView[T_HOST];
+    const head = componentHost.projection[tNode.projection];
+    if (Array.isArray(head)) {
+      for (let nativeNode2 of head) {
+        _addQueryMatch(nativeNode2, predicate, matches, elementsOnly, rootNativeNode);
+      }
+    } else if (head) {
+      const nextLView = componentView[PARENT];
+      const nextTNode = nextLView[TVIEW].data[head.index];
+      _queryNodeChildren(nextTNode, nextLView, predicate, matches, elementsOnly, rootNativeNode);
+    }
+  } else if (tNode.child) {
+    _queryNodeChildren(tNode.child, lView, predicate, matches, elementsOnly, rootNativeNode);
+  }
+  if (rootNativeNode !== nativeNode) {
+    const nextTNode = tNode.flags & 2 ? tNode.projectionNext : tNode.next;
+    if (nextTNode) {
+      _queryNodeChildren(nextTNode, lView, predicate, matches, elementsOnly, rootNativeNode);
+    }
+  }
+}
+function _queryNodeChildrenInContainer(lContainer, predicate, matches, elementsOnly, rootNativeNode) {
+  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+    const childView = lContainer[i];
+    const firstChild = childView[TVIEW].firstChild;
+    if (firstChild) {
+      _queryNodeChildren(firstChild, childView, predicate, matches, elementsOnly, rootNativeNode);
+    }
+  }
+}
+function _addQueryMatch(nativeNode, predicate, matches, elementsOnly, rootNativeNode) {
+  if (rootNativeNode !== nativeNode) {
+    const debugNode = getDebugNode(nativeNode);
+    if (!debugNode) {
+      return;
+    }
+    if (elementsOnly && debugNode instanceof DebugElement && predicate(debugNode) && matches.indexOf(debugNode) === -1) {
+      matches.push(debugNode);
+    } else if (!elementsOnly && predicate(debugNode) && matches.indexOf(debugNode) === -1) {
+      matches.push(debugNode);
+    }
+  }
+}
+function _queryNativeNodeDescendants(parentNode, predicate, matches, elementsOnly) {
+  const nodes = parentNode.childNodes;
+  const length = nodes.length;
+  for (let i = 0; i < length; i++) {
+    const node = nodes[i];
+    const debugNode = getDebugNode(node);
+    if (debugNode) {
+      if (elementsOnly && debugNode instanceof DebugElement && predicate(debugNode) && matches.indexOf(debugNode) === -1) {
+        matches.push(debugNode);
+      } else if (!elementsOnly && predicate(debugNode) && matches.indexOf(debugNode) === -1) {
+        matches.push(debugNode);
+      }
+      _queryNativeNodeDescendants(node, predicate, matches, elementsOnly);
+    }
+  }
+}
+function collectPropertyBindings(properties, tNode, lView, tData) {
+  let bindingIndexes = tNode.propertyBindings;
+  if (bindingIndexes !== null) {
+    for (let i = 0; i < bindingIndexes.length; i++) {
+      const bindingIndex = bindingIndexes[i];
+      const propMetadata = tData[bindingIndex];
+      const metadataParts = propMetadata.split(INTERPOLATION_DELIMITER);
+      const propertyName = metadataParts[0];
+      if (metadataParts.length > 1) {
+        let value = metadataParts[1];
+        for (let j = 1; j < metadataParts.length - 1; j++) {
+          value += renderStringify(lView[bindingIndex + j - 1]) + metadataParts[j + 1];
+        }
+        properties[propertyName] = value;
+      } else {
+        properties[propertyName] = lView[bindingIndex];
+      }
+    }
+  }
+}
+var NG_DEBUG_PROPERTY = "__ng_debug__";
+function getDebugNode(nativeNode) {
+  if (nativeNode instanceof Node) {
+    if (!nativeNode.hasOwnProperty(NG_DEBUG_PROPERTY)) {
+      nativeNode[NG_DEBUG_PROPERTY] = nativeNode.nodeType == Node.ELEMENT_NODE ? new DebugElement(nativeNode) : new DebugNode(nativeNode);
+    }
+    return nativeNode[NG_DEBUG_PROPERTY];
+  }
+  return null;
+}
+
+// node_modules/@angular/core/fesm2022/resource.mjs
+var OutputEmitterRef = class {
+  destroyed = false;
+  listeners = null;
+  errorHandler = inject(ErrorHandler, { optional: true });
+  /** @internal */
+  destroyRef = inject(DestroyRef);
+  constructor() {
+    this.destroyRef.onDestroy(() => {
+      this.destroyed = true;
+      this.listeners = null;
+    });
+  }
+  subscribe(callback) {
+    if (this.destroyed) {
+      throw new RuntimeError(953, ngDevMode && "Unexpected subscription to destroyed `OutputRef`. The owning directive/component is destroyed.");
+    }
+    (this.listeners ??= []).push(callback);
+    return {
+      unsubscribe: () => {
+        const idx = this.listeners?.indexOf(callback);
+        if (idx !== void 0 && idx !== -1) {
+          this.listeners?.splice(idx, 1);
+        }
+      }
+    };
+  }
+  /** Emits a new value to the output. */
+  emit(value) {
+    if (this.destroyed) {
+      console.warn(formatRuntimeError(953, ngDevMode && "Unexpected emit for destroyed `OutputRef`. The owning directive/component is destroyed."));
+      return;
+    }
+    if (this.listeners === null) {
+      return;
+    }
+    const previousConsumer = setActiveConsumer(null);
+    try {
+      for (const listenerFn of this.listeners) {
+        try {
+          listenerFn(value);
+        } catch (err) {
+          this.errorHandler?.handleError(err);
+        }
+      }
+    } finally {
+      setActiveConsumer(previousConsumer);
+    }
+  }
+};
+function getOutputDestroyRef(ref) {
+  return ref.destroyRef;
+}
+function untracked2(nonReactiveReadsFn) {
+  return untracked(nonReactiveReadsFn);
+}
+function computed(computation, options) {
+  const getter = createComputed(computation, options?.equal);
+  if (ngDevMode) {
+    getter.toString = () => `[Computed: ${getter()}]`;
+    getter[SIGNAL].debugName = options?.debugName;
+  }
+  return getter;
+}
+var EffectRefImpl = class {
+  [SIGNAL];
+  constructor(node) {
+    this[SIGNAL] = node;
+  }
+  destroy() {
+    this[SIGNAL].destroy();
+  }
+};
+function effect(effectFn, options) {
+  ngDevMode && assertNotInReactiveContext(effect, "Call `effect` outside of a reactive context. For example, schedule the effect inside the component constructor.");
+  if (ngDevMode && !options?.injector) {
+    assertInInjectionContext(effect);
+  }
+  if (ngDevMode && options?.allowSignalWrites !== void 0) {
+    console.warn(`The 'allowSignalWrites' flag is deprecated and no longer impacts effect() (writes are always allowed)`);
+  }
+  const injector = options?.injector ?? inject(Injector);
+  let destroyRef = options?.manualCleanup !== true ? injector.get(DestroyRef) : null;
+  let node;
+  const viewContext = injector.get(ViewContext, null, { optional: true });
+  const notifier = injector.get(ChangeDetectionScheduler);
+  if (viewContext !== null) {
+    node = createViewEffect(viewContext.view, notifier, effectFn);
+    if (destroyRef instanceof NodeInjectorDestroyRef && destroyRef._lView === viewContext.view) {
+      destroyRef = null;
+    }
+  } else {
+    node = createRootEffect(effectFn, injector.get(EffectScheduler), notifier);
+  }
+  node.injector = injector;
+  if (destroyRef !== null) {
+    node.onDestroyFn = destroyRef.onDestroy(() => node.destroy());
+  }
+  const effectRef = new EffectRefImpl(node);
+  if (ngDevMode) {
+    node.debugName = options?.debugName ?? "";
+    const prevInjectorProfilerContext = setInjectorProfilerContext({ injector, token: null });
+    try {
+      emitEffectCreatedEvent(effectRef);
+    } finally {
+      setInjectorProfilerContext(prevInjectorProfilerContext);
+    }
+  }
+  return effectRef;
+}
+var BASE_EFFECT_NODE = (() => __spreadProps(__spreadValues({}, REACTIVE_NODE), {
+  consumerIsAlwaysLive: true,
+  consumerAllowSignalWrites: true,
+  dirty: true,
+  hasRun: false,
+  cleanupFns: void 0,
+  zone: null,
+  kind: "effect",
+  onDestroyFn: noop2,
+  run() {
+    this.dirty = false;
+    if (ngDevMode && isInNotificationPhase()) {
+      throw new Error(`Schedulers cannot synchronously execute watches while scheduling.`);
+    }
+    if (this.hasRun && !consumerPollProducersForChange(this)) {
+      return;
+    }
+    this.hasRun = true;
+    const registerCleanupFn = (cleanupFn) => (this.cleanupFns ??= []).push(cleanupFn);
+    const prevNode = consumerBeforeComputation(this);
+    const prevRefreshingViews = setIsRefreshingViews(false);
+    try {
+      this.maybeCleanup();
+      this.fn(registerCleanupFn);
+    } finally {
+      setIsRefreshingViews(prevRefreshingViews);
+      consumerAfterComputation(this, prevNode);
+    }
+  },
+  maybeCleanup() {
+    if (!this.cleanupFns?.length) {
+      return;
+    }
+    const prevConsumer = setActiveConsumer(null);
+    try {
+      while (this.cleanupFns.length) {
+        this.cleanupFns.pop()();
+      }
+    } finally {
+      this.cleanupFns = [];
+      setActiveConsumer(prevConsumer);
+    }
+  }
+}))();
+var ROOT_EFFECT_NODE = (() => __spreadProps(__spreadValues({}, BASE_EFFECT_NODE), {
+  consumerMarkedDirty() {
+    this.scheduler.schedule(this);
+    this.notifier.notify(
+      12
+      /* NotificationSource.RootEffect */
+    );
+  },
+  destroy() {
+    consumerDestroy(this);
+    this.onDestroyFn();
+    this.maybeCleanup();
+    this.scheduler.remove(this);
+  }
+}))();
+var VIEW_EFFECT_NODE = (() => __spreadProps(__spreadValues({}, BASE_EFFECT_NODE), {
+  consumerMarkedDirty() {
+    this.view[FLAGS] |= 8192;
+    markAncestorsForTraversal(this.view);
+    this.notifier.notify(
+      13
+      /* NotificationSource.ViewEffect */
+    );
+  },
+  destroy() {
+    consumerDestroy(this);
+    this.onDestroyFn();
+    this.maybeCleanup();
+    this.view[EFFECTS]?.delete(this);
+  }
+}))();
+function createViewEffect(view, notifier, fn) {
+  const node = Object.create(VIEW_EFFECT_NODE);
+  node.view = view;
+  node.zone = typeof Zone !== "undefined" ? Zone.current : null;
+  node.notifier = notifier;
+  node.fn = fn;
+  view[EFFECTS] ??= /* @__PURE__ */ new Set();
+  view[EFFECTS].add(node);
+  node.consumerMarkedDirty(node);
+  return node;
+}
+function createRootEffect(fn, scheduler, notifier) {
+  const node = Object.create(ROOT_EFFECT_NODE);
+  node.fn = fn;
+  node.scheduler = scheduler;
+  node.notifier = notifier;
+  node.zone = typeof Zone !== "undefined" ? Zone.current : null;
+  node.scheduler.add(node);
+  node.notifier.notify(
+    12
+    /* NotificationSource.RootEffect */
+  );
+  return node;
+}
+var identityFn = (v) => v;
+function linkedSignal(optionsOrComputation, options) {
+  if (typeof optionsOrComputation === "function") {
+    const getter = createLinkedSignal(optionsOrComputation, identityFn, options?.equal);
+    return upgradeLinkedSignalGetter(getter);
+  } else {
+    const getter = createLinkedSignal(optionsOrComputation.source, optionsOrComputation.computation, optionsOrComputation.equal);
+    return upgradeLinkedSignalGetter(getter);
+  }
+}
+function upgradeLinkedSignalGetter(getter) {
+  if (ngDevMode) {
+    getter.toString = () => `[LinkedSignal: ${getter()}]`;
+  }
+  const node = getter[SIGNAL];
+  const upgradedGetter = getter;
+  upgradedGetter.set = (newValue) => linkedSignalSetFn(node, newValue);
+  upgradedGetter.update = (updateFn) => linkedSignalUpdateFn(node, updateFn);
+  upgradedGetter.asReadonly = signalAsReadonlyFn.bind(getter);
+  return upgradedGetter;
+}
+var RESOURCE_VALUE_THROWS_ERRORS_DEFAULT = true;
+function resource(options) {
+  if (ngDevMode && !options?.injector) {
+    assertInInjectionContext(resource);
+  }
+  const oldNameForParams = options.request;
+  const params = options.params ?? oldNameForParams ?? (() => null);
+  return new ResourceImpl(params, getLoader(options), options.defaultValue, options.equal ? wrapEqualityFn(options.equal) : void 0, options.injector ?? inject(Injector), RESOURCE_VALUE_THROWS_ERRORS_DEFAULT);
+}
+var BaseWritableResource = class {
+  value;
+  constructor(value) {
+    this.value = value;
+    this.value.set = this.set.bind(this);
+    this.value.update = this.update.bind(this);
+    this.value.asReadonly = signalAsReadonlyFn;
+  }
+  isError = computed(() => this.status() === "error");
+  update(updateFn) {
+    this.set(updateFn(untracked2(this.value)));
+  }
+  isLoading = computed(() => this.status() === "loading" || this.status() === "reloading");
+  hasValue() {
+    if (this.isError()) {
+      return false;
+    }
+    return this.value() !== void 0;
+  }
+  asReadonly() {
+    return this;
+  }
+};
+var ResourceImpl = class extends BaseWritableResource {
+  loaderFn;
+  equal;
+  pendingTasks;
+  /**
+   * The current state of the resource. Status, value, and error are derived from this.
+   */
+  state;
+  /**
+   * Combines the current request with a reload counter which allows the resource to be reloaded on
+   * imperative command.
+   */
+  extRequest;
+  effectRef;
+  pendingController;
+  resolvePendingTask = void 0;
+  destroyed = false;
+  unregisterOnDestroy;
+  constructor(request, loaderFn, defaultValue, equal, injector, throwErrorsFromValue = RESOURCE_VALUE_THROWS_ERRORS_DEFAULT) {
+    super(
+      // Feed a computed signal for the value to `BaseWritableResource`, which will upgrade it to a
+      // `WritableSignal` that delegates to `ResourceImpl.set`.
+      computed(() => {
+        const streamValue = this.state().stream?.();
+        if (!streamValue) {
+          return defaultValue;
+        }
+        if (this.state().status === "loading" && this.error()) {
+          return defaultValue;
+        }
+        if (!isResolved(streamValue)) {
+          if (throwErrorsFromValue) {
+            throw new ResourceValueError(this.error());
+          } else {
+            return defaultValue;
+          }
+        }
+        return streamValue.value;
+      }, { equal })
+    );
+    this.loaderFn = loaderFn;
+    this.equal = equal;
+    this.extRequest = linkedSignal({
+      source: request,
+      computation: (request2) => ({ request: request2, reload: 0 })
+    });
+    this.state = linkedSignal({
+      // Whenever the request changes,
+      source: this.extRequest,
+      // Compute the state of the resource given a change in status.
+      computation: (extRequest, previous) => {
+        const status = extRequest.request === void 0 ? "idle" : "loading";
+        if (!previous) {
+          return {
+            extRequest,
+            status,
+            previousStatus: "idle",
+            stream: void 0
+          };
+        } else {
+          return {
+            extRequest,
+            status,
+            previousStatus: projectStatusOfState(previous.value),
+            // If the request hasn't changed, keep the previous stream.
+            stream: previous.value.extRequest.request === extRequest.request ? previous.value.stream : void 0
+          };
+        }
+      }
+    });
+    this.effectRef = effect(this.loadEffect.bind(this), {
+      injector,
+      manualCleanup: true
+    });
+    this.pendingTasks = injector.get(PendingTasks);
+    this.unregisterOnDestroy = injector.get(DestroyRef).onDestroy(() => this.destroy());
+  }
+  status = computed(() => projectStatusOfState(this.state()));
+  error = computed(() => {
+    const stream = this.state().stream?.();
+    return stream && !isResolved(stream) ? stream.error : void 0;
+  });
+  /**
+   * Called either directly via `WritableResource.set` or via `.value.set()`.
+   */
+  set(value) {
+    if (this.destroyed) {
+      return;
+    }
+    const error = untracked2(this.error);
+    const state = untracked2(this.state);
+    if (!error) {
+      const current = untracked2(this.value);
+      if (state.status === "local" && (this.equal ? this.equal(current, value) : current === value)) {
+        return;
+      }
+    }
+    this.state.set({
+      extRequest: state.extRequest,
+      status: "local",
+      previousStatus: "local",
+      stream: signal({ value })
+    });
+    this.abortInProgressLoad();
+  }
+  reload() {
+    const { status } = untracked2(this.state);
+    if (status === "idle" || status === "loading") {
+      return false;
+    }
+    this.extRequest.update(({ request, reload }) => ({ request, reload: reload + 1 }));
+    return true;
+  }
+  destroy() {
+    this.destroyed = true;
+    this.unregisterOnDestroy();
+    this.effectRef.destroy();
+    this.abortInProgressLoad();
+    this.state.set({
+      extRequest: { request: void 0, reload: 0 },
+      status: "idle",
+      previousStatus: "idle",
+      stream: void 0
+    });
+  }
+  loadEffect() {
+    return __async(this, null, function* () {
+      const extRequest = this.extRequest();
+      const { status: currentStatus, previousStatus } = untracked2(this.state);
+      if (extRequest.request === void 0) {
+        return;
+      } else if (currentStatus !== "loading") {
+        return;
+      }
+      this.abortInProgressLoad();
+      let resolvePendingTask = this.resolvePendingTask = this.pendingTasks.add();
+      const { signal: abortSignal } = this.pendingController = new AbortController();
+      try {
+        const stream = yield untracked2(() => {
+          return this.loaderFn({
+            params: extRequest.request,
+            // TODO(alxhub): cleanup after g3 removal of `request` alias.
+            request: extRequest.request,
+            abortSignal,
+            previous: {
+              status: previousStatus
+            }
+          });
+        });
+        if (abortSignal.aborted || untracked2(this.extRequest) !== extRequest) {
+          return;
+        }
+        this.state.set({
+          extRequest,
+          status: "resolved",
+          previousStatus: "resolved",
+          stream
+        });
+      } catch (err) {
+        if (abortSignal.aborted || untracked2(this.extRequest) !== extRequest) {
+          return;
+        }
+        this.state.set({
+          extRequest,
+          status: "resolved",
+          previousStatus: "error",
+          stream: signal({ error: encapsulateResourceError(err) })
+        });
+      } finally {
+        resolvePendingTask?.();
+        resolvePendingTask = void 0;
+      }
+    });
+  }
+  abortInProgressLoad() {
+    untracked2(() => this.pendingController?.abort());
+    this.pendingController = void 0;
+    this.resolvePendingTask?.();
+    this.resolvePendingTask = void 0;
+  }
+};
+function wrapEqualityFn(equal) {
+  return (a, b) => a === void 0 || b === void 0 ? a === b : equal(a, b);
+}
+function getLoader(options) {
+  if (isStreamingResourceOptions(options)) {
+    return options.stream;
+  }
+  return (params) => __async(null, null, function* () {
+    try {
+      return signal({ value: yield options.loader(params) });
+    } catch (err) {
+      return signal({ error: encapsulateResourceError(err) });
+    }
+  });
+}
+function isStreamingResourceOptions(options) {
+  return !!options.stream;
+}
+function projectStatusOfState(state) {
+  switch (state.status) {
+    case "loading":
+      return state.extRequest.reload === 0 ? "loading" : "reloading";
+    case "resolved":
+      return isResolved(state.stream()) ? "resolved" : "error";
+    default:
+      return state.status;
+  }
+}
+function isResolved(state) {
+  return state.error === void 0;
+}
+function encapsulateResourceError(error) {
+  if (error instanceof Error) {
+    return error;
+  }
+  return new ResourceWrappedError(error);
+}
+var ResourceValueError = class extends Error {
+  constructor(error) {
+    super(ngDevMode ? `Resource is currently in an error state (see Error.cause for details): ${error.message}` : error.message, { cause: error });
+  }
+};
+var ResourceWrappedError = class extends Error {
+  constructor(error) {
+    super(ngDevMode ? `Resource returned an error that's not an Error instance: ${String(error)}. Check this error's .cause for the actual error.` : String(error), { cause: error });
+  }
+};
+
+// node_modules/@angular/core/fesm2022/primitives/event-dispatch.mjs
+var Property = {
+  /**
+   * The parsed value of the jsaction attribute is stored in this
+   * property on the DOM node. The parsed value is an Object. The
+   * property names of the object are the events; the values are the
+   * names of the actions. This property is attached even on nodes
+   * that don't have a jsaction attribute as an optimization, because
+   * property lookup is faster than attribute access.
+   */
+  JSACTION: "__jsaction",
+  /**
+   * The owner property references an a logical owner for a DOM node. JSAction
+   * will follow this reference instead of parentNode when traversing the DOM
+   * to find jsaction attributes. This allows overlaying a logical structure
+   * over a document where the DOM structure can't reflect that structure.
+   */
+  OWNER: "__owner"
+};
+var parseCache = {};
+function get(element) {
+  return element[Property.JSACTION];
+}
+function set(element, actionMap) {
+  element[Property.JSACTION] = actionMap;
+}
+function getParsed(text) {
+  return parseCache[text];
+}
+function setParsed(text, parsed) {
+  parseCache[text] = parsed;
+}
+var EventType = {
+  /**
+   * Mouse middle click, introduced in Chrome 55 and not yet supported on
+   * other browsers.
+   */
+  AUXCLICK: "auxclick",
+  /**
+   * The change event fired by browsers when the `value` attribute of input,
+   * select, and textarea elements are changed.
+   */
+  CHANGE: "change",
+  /**
+   * The click event. In addEvent() refers to all click events, in the
+   * jsaction attribute it refers to the unmodified click and Enter/Space
+   * keypress events.  In the latter case, a jsaction click will be triggered,
+   * for accessibility reasons.  See clickmod and clickonly, below.
+   */
+  CLICK: "click",
+  /**
+   * Specifies the jsaction for a modified click event (i.e. a mouse
+   * click with the modifier key Cmd/Ctrl pressed). This event isn't
+   * separately enabled in addEvent(), because in the DOM, it's just a
+   * click event.
+   */
+  CLICKMOD: "clickmod",
+  /**
+   * Specifies the jsaction for a click-only event.  Click-only doesn't take
+   * into account the case where an element with focus receives an Enter/Space
+   * keypress.  This event isn't separately enabled in addEvent().
+   */
+  CLICKONLY: "clickonly",
+  /**
+   * The dblclick event.
+   */
+  DBLCLICK: "dblclick",
+  /**
+   * Focus doesn't bubble, but you can use it in addEvent() and
+   * jsaction anyway. EventContract does the right thing under the
+   * hood.
+   */
+  FOCUS: "focus",
+  /**
+   * This event only exists in IE. For addEvent() and jsaction, use
+   * focus instead; EventContract does the right thing even though
+   * focus doesn't bubble.
+   */
+  FOCUSIN: "focusin",
+  /**
+   * Analog to focus.
+   */
+  BLUR: "blur",
+  /**
+   * Analog to focusin.
+   */
+  FOCUSOUT: "focusout",
+  /**
+   * Submit doesn't bubble, so it cannot be used with event
+   * contract. However, the browser helpfully fires a click event on
+   * the submit button of a form (even if the form is not submitted by
+   * a click on the submit button). So you should handle click on the
+   * submit button instead.
+   */
+  SUBMIT: "submit",
+  /**
+   * The keydown event. In addEvent() and non-click jsaction it represents the
+   * regular DOM keydown event. It represents click actions in non-Gecko
+   * browsers.
+   */
+  KEYDOWN: "keydown",
+  /**
+   * The keypress event. In addEvent() and non-click jsaction it represents the
+   * regular DOM keypress event. It represents click actions in Gecko browsers.
+   */
+  KEYPRESS: "keypress",
+  /**
+   * The keyup event. In addEvent() and non-click jsaction it represents the
+   * regular DOM keyup event. It represents click actions in non-Gecko
+   * browsers.
+   */
+  KEYUP: "keyup",
+  /**
+   * The mouseup event. Can either be used directly or used implicitly to
+   * capture mouseup events. In addEvent(), it represents a regular DOM
+   * mouseup event.
+   */
+  MOUSEUP: "mouseup",
+  /**
+   * The mousedown event. Can either be used directly or used implicitly to
+   * capture mouseenter events. In addEvent(), it represents a regular DOM
+   * mouseover event.
+   */
+  MOUSEDOWN: "mousedown",
+  /**
+   * The mouseover event. Can either be used directly or used implicitly to
+   * capture mouseenter events. In addEvent(), it represents a regular DOM
+   * mouseover event.
+   */
+  MOUSEOVER: "mouseover",
+  /**
+   * The mouseout event. Can either be used directly or used implicitly to
+   * capture mouseover events. In addEvent(), it represents a regular DOM
+   * mouseout event.
+   */
+  MOUSEOUT: "mouseout",
+  /**
+   * The mouseenter event. Does not bubble and fires individually on each
+   * element being entered within a DOM tree.
+   */
+  MOUSEENTER: "mouseenter",
+  /**
+   * The mouseleave event. Does not bubble and fires individually on each
+   * element being entered within a DOM tree.
+   */
+  MOUSELEAVE: "mouseleave",
+  /**
+   * The mousemove event.
+   */
+  MOUSEMOVE: "mousemove",
+  /**
+   * The pointerup event. Can either be used directly or used implicitly to
+   * capture pointerup events. In addEvent(), it represents a regular DOM
+   * pointerup event.
+   */
+  POINTERUP: "pointerup",
+  /**
+   * The pointerdown event. Can either be used directly or used implicitly to
+   * capture pointerenter events. In addEvent(), it represents a regular DOM
+   * mouseover event.
+   */
+  POINTERDOWN: "pointerdown",
+  /**
+   * The pointerover event. Can either be used directly or used implicitly to
+   * capture pointerenter events. In addEvent(), it represents a regular DOM
+   * pointerover event.
+   */
+  POINTEROVER: "pointerover",
+  /**
+   * The pointerout event. Can either be used directly or used implicitly to
+   * capture pointerover events. In addEvent(), it represents a regular DOM
+   * pointerout event.
+   */
+  POINTEROUT: "pointerout",
+  /**
+   * The pointerenter event. Does not bubble and fires individually on each
+   * element being entered within a DOM tree.
+   */
+  POINTERENTER: "pointerenter",
+  /**
+   * The pointerleave event. Does not bubble and fires individually on each
+   * element being entered within a DOM tree.
+   */
+  POINTERLEAVE: "pointerleave",
+  /**
+   * The pointermove event.
+   */
+  POINTERMOVE: "pointermove",
+  /**
+   * The pointercancel event.
+   */
+  POINTERCANCEL: "pointercancel",
+  /**
+   * The gotpointercapture event is fired when
+   * Element.setPointerCapture(pointerId) is called on a mouse input, or
+   * implicitly when a touch input begins.
+   */
+  GOTPOINTERCAPTURE: "gotpointercapture",
+  /**
+   * The lostpointercapture event is fired when
+   * Element.releasePointerCapture(pointerId) is called, or implicitly after a
+   * touch input ends.
+   */
+  LOSTPOINTERCAPTURE: "lostpointercapture",
+  /**
+   * The error event. The error event doesn't bubble, but you can use it in
+   * addEvent() and jsaction anyway. EventContract does the right thing under
+   * the hood (except in IE8 which does not use error events).
+   */
+  ERROR: "error",
+  /**
+   * The load event. The load event doesn't bubble, but you can use it in
+   * addEvent() and jsaction anyway. EventContract does the right thing
+   * under the hood.
+   */
+  LOAD: "load",
+  /**
+   * The unload event.
+   */
+  UNLOAD: "unload",
+  /**
+   * The touchstart event. Bubbles, will only ever fire in browsers with
+   * touch support.
+   */
+  TOUCHSTART: "touchstart",
+  /**
+   * The touchend event. Bubbles, will only ever fire in browsers with
+   * touch support.
+   */
+  TOUCHEND: "touchend",
+  /**
+   * The touchmove event. Bubbles, will only ever fire in browsers with
+   * touch support.
+   */
+  TOUCHMOVE: "touchmove",
+  /**
+   * The input event.
+   */
+  INPUT: "input",
+  /**
+   * The scroll event.
+   */
+  SCROLL: "scroll",
+  /**
+   * The toggle event. The toggle event doesn't bubble, but you can use it in
+   * addEvent() and jsaction anyway. EventContract does the right thing
+   * under the hood.
+   */
+  TOGGLE: "toggle",
+  /**
+   * A custom event. The actual custom event type is declared as the 'type'
+   * field in the event details. Supported in Firefox 6+, IE 9+, and all Chrome
+   * versions.
+   *
+   * This is an internal name. Users should use jsaction's fireCustomEvent to
+   * fire custom events instead of relying on this type to create them.
+   */
+  CUSTOM: "_custom"
+};
+var MOUSE_SPECIAL_EVENT_TYPES = [
+  EventType.MOUSEENTER,
+  EventType.MOUSELEAVE,
+  "pointerenter",
+  "pointerleave"
+];
+var BUBBLE_EVENT_TYPES = [
+  EventType.CLICK,
+  EventType.DBLCLICK,
+  EventType.FOCUSIN,
+  EventType.FOCUSOUT,
+  EventType.KEYDOWN,
+  EventType.KEYUP,
+  EventType.KEYPRESS,
+  EventType.MOUSEOVER,
+  EventType.MOUSEOUT,
+  EventType.SUBMIT,
+  EventType.TOUCHSTART,
+  EventType.TOUCHEND,
+  EventType.TOUCHMOVE,
+  "touchcancel",
+  "auxclick",
+  "change",
+  "compositionstart",
+  "compositionupdate",
+  "compositionend",
+  "beforeinput",
+  "input",
+  "select",
+  "copy",
+  "cut",
+  "paste",
+  "mousedown",
+  "mouseup",
+  "wheel",
+  "contextmenu",
+  "dragover",
+  "dragenter",
+  "dragleave",
+  "drop",
+  "dragstart",
+  "dragend",
+  "pointerdown",
+  "pointermove",
+  "pointerup",
+  "pointercancel",
+  "pointerover",
+  "pointerout",
+  "gotpointercapture",
+  "lostpointercapture",
+  // Video events.
+  "ended",
+  "loadedmetadata",
+  // Page visibility events.
+  "pagehide",
+  "pageshow",
+  "visibilitychange",
+  // Content visibility events.
+  "beforematch"
+];
+var CAPTURE_EVENT_TYPES = [
+  EventType.FOCUS,
+  EventType.BLUR,
+  EventType.ERROR,
+  EventType.LOAD,
+  EventType.TOGGLE
+];
+var isCaptureEventType = (eventType) => CAPTURE_EVENT_TYPES.indexOf(eventType) >= 0;
+var EARLY_EVENT_TYPES = BUBBLE_EVENT_TYPES.concat(CAPTURE_EVENT_TYPES);
+var isEarlyEventType = (eventType) => EARLY_EVENT_TYPES.indexOf(eventType) >= 0;
+function getBrowserEventType(eventType) {
+  if (eventType === EventType.MOUSEENTER) {
+    return EventType.MOUSEOVER;
+  } else if (eventType === EventType.MOUSELEAVE) {
+    return EventType.MOUSEOUT;
+  } else if (eventType === EventType.POINTERENTER) {
+    return EventType.POINTEROVER;
+  } else if (eventType === EventType.POINTERLEAVE) {
+    return EventType.POINTEROUT;
+  }
+  return eventType;
+}
+function addEventListener(element, eventType, handler, passive) {
+  let capture = false;
+  if (isCaptureEventType(eventType)) {
+    capture = true;
+  }
+  const options = typeof passive === "boolean" ? { capture, passive } : capture;
+  element.addEventListener(eventType, handler, options);
+  return { eventType, handler, capture, passive };
+}
+function removeEventListener(element, info) {
+  if (element.removeEventListener) {
+    const options = typeof info.passive === "boolean" ? { capture: info.capture } : info.capture;
+    element.removeEventListener(info.eventType, info.handler, options);
+  } else if (element.detachEvent) {
+    element.detachEvent(`on${info.eventType}`, info.handler);
+  }
+}
+function preventDefault(e) {
+  e.preventDefault ? e.preventDefault() : e.returnValue = false;
+}
+var isMac = typeof navigator !== "undefined" && /Macintosh/.test(navigator.userAgent);
+function isMiddleClick(e) {
+  return (
+    // `which` is an old DOM API.
+    e.which === 2 || // `which` is an old DOM API.
+    e.which == null && // `button` is an old DOM API.
+    e.button === 4
+  );
+}
+function isModifiedClickEvent(e) {
+  return (
+    // `metaKey` is an old DOM API.
+    isMac && e.metaKey || // `ctrlKey` is an old DOM API.
+    !isMac && e.ctrlKey || isMiddleClick(e) || // `shiftKey` is an old DOM API.
+    e.shiftKey
+  );
+}
+function isMouseSpecialEvent(e, type, element) {
+  const related = e.relatedTarget;
+  return (e.type === EventType.MOUSEOVER && type === EventType.MOUSEENTER || e.type === EventType.MOUSEOUT && type === EventType.MOUSELEAVE || e.type === EventType.POINTEROVER && type === EventType.POINTERENTER || e.type === EventType.POINTEROUT && type === EventType.POINTERLEAVE) && (!related || related !== element && !element.contains(related));
+}
+function createMouseSpecialEvent(e, target) {
+  const copy = {};
+  for (const property in e) {
+    if (property === "srcElement" || property === "target") {
+      continue;
+    }
+    const key = property;
+    const value = e[key];
+    if (typeof value === "function") {
+      continue;
+    }
+    copy[key] = value;
+  }
+  if (e.type === EventType.MOUSEOVER) {
+    copy["type"] = EventType.MOUSEENTER;
+  } else if (e.type === EventType.MOUSEOUT) {
+    copy["type"] = EventType.MOUSELEAVE;
+  } else if (e.type === EventType.POINTEROVER) {
+    copy["type"] = EventType.POINTERENTER;
+  } else {
+    copy["type"] = EventType.POINTERLEAVE;
+  }
+  copy["target"] = copy["srcElement"] = target;
+  copy["bubbles"] = false;
+  copy["_originalEvent"] = e;
+  return copy;
+}
+var isIos = typeof navigator !== "undefined" && /iPhone|iPad|iPod/.test(navigator.userAgent);
+var EventContractContainer = class {
+  element;
+  /**
+   * Array of event handlers and their corresponding event types that are
+   * installed on this container.
+   *
+   */
+  handlerInfos = [];
+  /**
+   * @param element The container Element.
+   */
+  constructor(element) {
+    this.element = element;
+  }
+  /**
+   * Installs the provided installer on the element owned by this container,
+   * and maintains a reference to resulting handler in order to remove it
+   * later if desired.
+   */
+  addEventListener(eventType, getHandler, passive) {
+    if (isIos) {
+      this.element.style.cursor = "pointer";
+    }
+    this.handlerInfos.push(addEventListener(this.element, eventType, getHandler(this.element), passive));
+  }
+  /**
+   * Removes all the handlers installed on this container.
+   */
+  cleanUp() {
+    for (let i = 0; i < this.handlerInfos.length; i++) {
+      removeEventListener(this.element, this.handlerInfos[i]);
+    }
+    this.handlerInfos = [];
+  }
+};
+var Char = {
+  /**
+   * The separator between the namespace and the action name in the
+   * jsaction attribute value.
+   */
+  NAMESPACE_ACTION_SEPARATOR: ".",
+  /**
+   * The separator between the event name and action in the jsaction
+   * attribute value.
+   */
+  EVENT_ACTION_SEPARATOR: ":"
+};
+function getEventType(eventInfo) {
+  return eventInfo.eventType;
+}
+function setEventType(eventInfo, eventType) {
+  eventInfo.eventType = eventType;
+}
+function getEvent(eventInfo) {
+  return eventInfo.event;
+}
+function setEvent(eventInfo, event) {
+  eventInfo.event = event;
+}
+function getTargetElement(eventInfo) {
+  return eventInfo.targetElement;
+}
+function setTargetElement(eventInfo, targetElement) {
+  eventInfo.targetElement = targetElement;
+}
+function getContainer(eventInfo) {
+  return eventInfo.eic;
+}
+function setContainer(eventInfo, container) {
+  eventInfo.eic = container;
+}
+function getTimestamp(eventInfo) {
+  return eventInfo.timeStamp;
+}
+function setTimestamp(eventInfo, timestamp2) {
+  eventInfo.timeStamp = timestamp2;
+}
+function getAction(eventInfo) {
+  return eventInfo.eia;
+}
+function setAction(eventInfo, actionName, actionElement) {
+  eventInfo.eia = [actionName, actionElement];
+}
+function unsetAction(eventInfo) {
+  eventInfo.eia = void 0;
+}
+function getActionElement(actionInfo) {
+  return actionInfo[1];
+}
+function getIsReplay(eventInfo) {
+  return eventInfo.eirp;
+}
+function setIsReplay(eventInfo, replay) {
+  eventInfo.eirp = replay;
+}
+function getResolved(eventInfo) {
+  return eventInfo.eir;
+}
+function setResolved(eventInfo, resolved2) {
+  eventInfo.eir = resolved2;
+}
+function cloneEventInfo(eventInfo) {
+  return {
+    eventType: eventInfo.eventType,
+    event: eventInfo.event,
+    targetElement: eventInfo.targetElement,
+    eic: eventInfo.eic,
+    eia: eventInfo.eia,
+    timeStamp: eventInfo.timeStamp,
+    eirp: eventInfo.eirp,
+    eiack: eventInfo.eiack,
+    eir: eventInfo.eir
+  };
+}
+function createEventInfoFromParameters(eventType, event, targetElement, container, timestamp2, action, isReplay, a11yClickKey) {
+  return {
+    eventType,
+    event,
+    targetElement,
+    eic: container,
+    timeStamp: timestamp2,
+    eia: action,
+    eirp: isReplay,
+    eiack: a11yClickKey
+  };
+}
+var EventInfoWrapper = class _EventInfoWrapper {
+  eventInfo;
+  constructor(eventInfo) {
+    this.eventInfo = eventInfo;
+  }
+  getEventType() {
+    return getEventType(this.eventInfo);
+  }
+  setEventType(eventType) {
+    setEventType(this.eventInfo, eventType);
+  }
+  getEvent() {
+    return getEvent(this.eventInfo);
+  }
+  setEvent(event) {
+    setEvent(this.eventInfo, event);
+  }
+  getTargetElement() {
+    return getTargetElement(this.eventInfo);
+  }
+  setTargetElement(targetElement) {
+    setTargetElement(this.eventInfo, targetElement);
+  }
+  getContainer() {
+    return getContainer(this.eventInfo);
+  }
+  setContainer(container) {
+    setContainer(this.eventInfo, container);
+  }
+  getTimestamp() {
+    return getTimestamp(this.eventInfo);
+  }
+  setTimestamp(timestamp2) {
+    setTimestamp(this.eventInfo, timestamp2);
+  }
+  getAction() {
+    const action = getAction(this.eventInfo);
+    if (!action)
+      return void 0;
+    return {
+      name: action[0],
+      element: action[1]
+    };
+  }
+  setAction(action) {
+    if (!action) {
+      unsetAction(this.eventInfo);
+      return;
+    }
+    setAction(this.eventInfo, action.name, action.element);
+  }
+  getIsReplay() {
+    return getIsReplay(this.eventInfo);
+  }
+  setIsReplay(replay) {
+    setIsReplay(this.eventInfo, replay);
+  }
+  getResolved() {
+    return getResolved(this.eventInfo);
+  }
+  setResolved(resolved2) {
+    setResolved(this.eventInfo, resolved2);
+  }
+  clone() {
+    return new _EventInfoWrapper(cloneEventInfo(this.eventInfo));
+  }
+};
+var EMPTY_ACTION_MAP = {};
+var REGEXP_SEMICOLON = /\s*;\s*/;
+var DEFAULT_EVENT_TYPE = EventType.CLICK;
+var ActionResolver = class {
+  a11yClickSupport = false;
+  clickModSupport = true;
+  syntheticMouseEventSupport;
+  updateEventInfoForA11yClick = void 0;
+  preventDefaultForA11yClick = void 0;
+  populateClickOnlyAction = void 0;
+  constructor({ syntheticMouseEventSupport = false, clickModSupport = true } = {}) {
+    this.syntheticMouseEventSupport = syntheticMouseEventSupport;
+    this.clickModSupport = clickModSupport;
+  }
+  resolveEventType(eventInfo) {
+    if (this.clickModSupport && getEventType(eventInfo) === EventType.CLICK && isModifiedClickEvent(getEvent(eventInfo))) {
+      setEventType(eventInfo, EventType.CLICKMOD);
+    } else if (this.a11yClickSupport) {
+      this.updateEventInfoForA11yClick(eventInfo);
+    }
+  }
+  resolveAction(eventInfo) {
+    if (getResolved(eventInfo)) {
+      return;
+    }
+    this.populateAction(eventInfo, getTargetElement(eventInfo));
+    setResolved(eventInfo, true);
+  }
+  resolveParentAction(eventInfo) {
+    const action = getAction(eventInfo);
+    const actionElement = action && getActionElement(action);
+    unsetAction(eventInfo);
+    const parentNode = actionElement && this.getParentNode(actionElement);
+    if (!parentNode) {
+      return;
+    }
+    this.populateAction(eventInfo, parentNode);
+  }
+  /**
+   * Searches for a jsaction that the DOM event maps to and creates an
+   * object containing event information used for dispatching by
+   * jsaction.Dispatcher. This method populates the `action` and `actionElement`
+   * fields of the EventInfo object passed in by finding the first
+   * jsaction attribute above the target Node of the event, and below
+   * the container Node, that specifies a jsaction for the event
+   * type. If no such jsaction is found, then action is undefined.
+   *
+   * @param eventInfo `EventInfo` to set `action` and `actionElement` if an
+   *    action is found on any `Element` in the path of the `Event`.
+   */
+  populateAction(eventInfo, currentTarget) {
+    let actionElement = currentTarget;
+    while (actionElement && actionElement !== getContainer(eventInfo)) {
+      if (actionElement.nodeType === Node.ELEMENT_NODE) {
+        this.populateActionOnElement(actionElement, eventInfo);
+      }
+      if (getAction(eventInfo)) {
+        break;
+      }
+      actionElement = this.getParentNode(actionElement);
+    }
+    const action = getAction(eventInfo);
+    if (!action) {
+      return;
+    }
+    if (this.a11yClickSupport) {
+      this.preventDefaultForA11yClick(eventInfo);
+    }
+    if (this.syntheticMouseEventSupport) {
+      if (getEventType(eventInfo) === EventType.MOUSEENTER || getEventType(eventInfo) === EventType.MOUSELEAVE || getEventType(eventInfo) === EventType.POINTERENTER || getEventType(eventInfo) === EventType.POINTERLEAVE) {
+        if (isMouseSpecialEvent(getEvent(eventInfo), getEventType(eventInfo), getActionElement(action))) {
+          const copiedEvent = createMouseSpecialEvent(getEvent(eventInfo), getActionElement(action));
+          setEvent(eventInfo, copiedEvent);
+          setTargetElement(eventInfo, getActionElement(action));
+        } else {
+          unsetAction(eventInfo);
+        }
+      }
+    }
+  }
+  /**
+   * Walk to the parent node, unless the node has a different owner in
+   * which case we walk to the owner. Attempt to walk to host of a
+   * shadow root if needed.
+   */
+  getParentNode(element) {
+    const owner = element[Property.OWNER];
+    if (owner) {
+      return owner;
+    }
+    const parentNode = element.parentNode;
+    if (parentNode?.nodeName === "#document-fragment") {
+      return parentNode?.host ?? null;
+    }
+    return parentNode;
+  }
+  /**
+   * Accesses the jsaction map on a node and retrieves the name of the
+   * action the given event is mapped to, if any. It parses the
+   * attribute value and stores it in a property on the node for
+   * subsequent retrieval without re-parsing and re-accessing the
+   * attribute.
+   *
+   * @param actionElement The DOM node to retrieve the jsaction map from.
+   * @param eventInfo `EventInfo` to set `action` and `actionElement` if an
+   *    action is found on the `actionElement`.
+   */
+  populateActionOnElement(actionElement, eventInfo) {
+    const actionMap = this.parseActions(actionElement);
+    const actionName = actionMap[getEventType(eventInfo)];
+    if (actionName !== void 0) {
+      setAction(eventInfo, actionName, actionElement);
+    }
+    if (this.a11yClickSupport) {
+      this.populateClickOnlyAction(actionElement, eventInfo, actionMap);
+    }
+  }
+  /**
+   * Parses and caches an element's jsaction element into a map.
+   *
+   * This is primarily for internal use.
+   *
+   * @param actionElement The DOM node to retrieve the jsaction map from.
+   * @return Map from event to qualified name of the jsaction bound to it.
+   */
+  parseActions(actionElement) {
+    let actionMap = get(actionElement);
+    if (!actionMap) {
+      const jsactionAttribute = actionElement.getAttribute(Attribute.JSACTION);
+      if (!jsactionAttribute) {
+        actionMap = EMPTY_ACTION_MAP;
+        set(actionElement, actionMap);
+      } else {
+        actionMap = getParsed(jsactionAttribute);
+        if (!actionMap) {
+          actionMap = {};
+          const values = jsactionAttribute.split(REGEXP_SEMICOLON);
+          for (let idx = 0; idx < values.length; idx++) {
+            const value = values[idx];
+            if (!value) {
+              continue;
+            }
+            const colon = value.indexOf(Char.EVENT_ACTION_SEPARATOR);
+            const hasColon = colon !== -1;
+            const type = hasColon ? value.substr(0, colon).trim() : DEFAULT_EVENT_TYPE;
+            const action = hasColon ? value.substr(colon + 1).trim() : value;
+            actionMap[type] = action;
+          }
+          setParsed(jsactionAttribute, actionMap);
+        }
+        set(actionElement, actionMap);
+      }
+    }
+    return actionMap;
+  }
+  addA11yClickSupport(updateEventInfoForA11yClick, preventDefaultForA11yClick, populateClickOnlyAction) {
+    this.a11yClickSupport = true;
+    this.updateEventInfoForA11yClick = updateEventInfoForA11yClick;
+    this.preventDefaultForA11yClick = preventDefaultForA11yClick;
+    this.populateClickOnlyAction = populateClickOnlyAction;
+  }
+};
+var Restriction;
+(function(Restriction2) {
+  Restriction2[Restriction2["I_AM_THE_JSACTION_FRAMEWORK"] = 0] = "I_AM_THE_JSACTION_FRAMEWORK";
+})(Restriction || (Restriction = {}));
+var Dispatcher = class {
+  dispatchDelegate;
+  // The ActionResolver to use to resolve actions.
+  actionResolver;
+  /** The replayer function to be called when there are queued events. */
+  eventReplayer;
+  /** Whether the event replay is scheduled. */
+  eventReplayScheduled = false;
+  /** The queue of events. */
+  replayEventInfoWrappers = [];
+  /**
+   * Options are:
+   *   - `eventReplayer`: When the event contract dispatches replay events
+   *      to the Dispatcher, the Dispatcher collects them and in the next tick
+   *      dispatches them to the `eventReplayer`. Defaults to dispatching to `dispatchDelegate`.
+   * @param dispatchDelegate A function that should handle dispatching an `EventInfoWrapper` to handlers.
+   */
+  constructor(dispatchDelegate, { actionResolver, eventReplayer } = {}) {
+    this.dispatchDelegate = dispatchDelegate;
+    this.actionResolver = actionResolver;
+    this.eventReplayer = eventReplayer;
+  }
+  /**
+   * Receives an event or the event queue from the EventContract. The event
+   * queue is copied and it attempts to replay.
+   * If event info is passed in it looks for an action handler that can handle
+   * the given event.  If there is no handler registered queues the event and
+   * checks if a loader is registered for the given namespace. If so, calls it.
+   *
+   * Alternatively, if in global dispatch mode, calls all registered global
+   * handlers for the appropriate event type.
+   *
+   * The three functionalities of this call are deliberately not split into
+   * three methods (and then declared as an abstract interface), because the
+   * interface is used by EventContract, which lives in a different jsbinary.
+   * Therefore the interface between the three is defined entirely in terms that
+   * are invariant under jscompiler processing (Function and Array, as opposed
+   * to a custom type with method names).
+   *
+   * @param eventInfo The info for the event that triggered this call or the
+   *     queue of events from EventContract.
+   */
+  dispatch(eventInfo) {
+    const eventInfoWrapper = new EventInfoWrapper(eventInfo);
+    this.actionResolver?.resolveEventType(eventInfo);
+    this.actionResolver?.resolveAction(eventInfo);
+    const action = eventInfoWrapper.getAction();
+    if (action && shouldPreventDefaultBeforeDispatching(action.element, eventInfoWrapper)) {
+      preventDefault(eventInfoWrapper.getEvent());
+    }
+    if (this.eventReplayer && eventInfoWrapper.getIsReplay()) {
+      this.scheduleEventInfoWrapperReplay(eventInfoWrapper);
+      return;
+    }
+    this.dispatchDelegate(eventInfoWrapper);
+  }
+  /**
+   * Schedules an `EventInfoWrapper` for replay. The replaying will happen in its own
+   * stack once the current flow cedes control. This is done to mimic
+   * browser event handling.
+   */
+  scheduleEventInfoWrapperReplay(eventInfoWrapper) {
+    this.replayEventInfoWrappers.push(eventInfoWrapper);
+    if (this.eventReplayScheduled) {
+      return;
+    }
+    this.eventReplayScheduled = true;
+    Promise.resolve().then(() => {
+      this.eventReplayScheduled = false;
+      this.eventReplayer(this.replayEventInfoWrappers);
+    });
+  }
+};
+function shouldPreventDefaultBeforeDispatching(actionElement, eventInfoWrapper) {
+  return actionElement.tagName === "A" && (eventInfoWrapper.getEventType() === EventType.CLICK || eventInfoWrapper.getEventType() === EventType.CLICKMOD);
+}
+var PROPAGATION_STOPPED_SYMBOL = Symbol.for("propagationStopped");
+var EventPhase = {
+  REPLAY: 101
+};
+var PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS = " Because event replay occurs after browser dispatch, `preventDefault` would have no effect. You can check whether an event is being replayed by accessing the event phase: `event.eventPhase === EventPhase.REPLAY`.";
+var PREVENT_DEFAULT_ERROR_MESSAGE = `\`preventDefault\` called during event replay.`;
+var COMPOSED_PATH_ERROR_MESSAGE_DETAILS = " Because event replay occurs after browser dispatch, `composedPath()` will be empty. Iterate parent nodes from `event.target` or `event.currentTarget` if you need to check elements in the event path.";
+var COMPOSED_PATH_ERROR_MESSAGE = `\`composedPath\` called during event replay.`;
+var EventDispatcher = class {
+  dispatchDelegate;
+  clickModSupport;
+  actionResolver;
+  dispatcher;
+  constructor(dispatchDelegate, clickModSupport = true) {
+    this.dispatchDelegate = dispatchDelegate;
+    this.clickModSupport = clickModSupport;
+    this.actionResolver = new ActionResolver({ clickModSupport });
+    this.dispatcher = new Dispatcher((eventInfoWrapper) => {
+      this.dispatchToDelegate(eventInfoWrapper);
+    }, {
+      actionResolver: this.actionResolver
+    });
+  }
+  /**
+   * The entrypoint for the `EventContract` dispatch.
+   */
+  dispatch(eventInfo) {
+    this.dispatcher.dispatch(eventInfo);
+  }
+  /** Internal method that does basic disaptching. */
+  dispatchToDelegate(eventInfoWrapper) {
+    if (eventInfoWrapper.getIsReplay()) {
+      prepareEventForReplay(eventInfoWrapper);
+    }
+    prepareEventForBubbling(eventInfoWrapper);
+    while (eventInfoWrapper.getAction()) {
+      prepareEventForDispatch(eventInfoWrapper);
+      if (isCaptureEventType(eventInfoWrapper.getEventType()) && eventInfoWrapper.getAction().element !== eventInfoWrapper.getTargetElement()) {
+        return;
+      }
+      this.dispatchDelegate(eventInfoWrapper.getEvent(), eventInfoWrapper.getAction().name);
+      if (propagationStopped(eventInfoWrapper)) {
+        return;
+      }
+      this.actionResolver.resolveParentAction(eventInfoWrapper.eventInfo);
+    }
+  }
+};
+function prepareEventForBubbling(eventInfoWrapper) {
+  const event = eventInfoWrapper.getEvent();
+  const originalStopPropagation = eventInfoWrapper.getEvent().stopPropagation.bind(event);
+  const stopPropagation = () => {
+    event[PROPAGATION_STOPPED_SYMBOL] = true;
+    originalStopPropagation();
+  };
+  patchEventInstance(event, "stopPropagation", stopPropagation);
+  patchEventInstance(event, "stopImmediatePropagation", stopPropagation);
+}
+function propagationStopped(eventInfoWrapper) {
+  const event = eventInfoWrapper.getEvent();
+  return !!event[PROPAGATION_STOPPED_SYMBOL];
+}
+function prepareEventForReplay(eventInfoWrapper) {
+  const event = eventInfoWrapper.getEvent();
+  const target = eventInfoWrapper.getTargetElement();
+  const originalPreventDefault = event.preventDefault.bind(event);
+  patchEventInstance(event, "target", target);
+  patchEventInstance(event, "eventPhase", EventPhase.REPLAY);
+  patchEventInstance(event, "preventDefault", () => {
+    originalPreventDefault();
+    throw new Error(PREVENT_DEFAULT_ERROR_MESSAGE + (ngDevMode ? PREVENT_DEFAULT_ERROR_MESSAGE_DETAILS : ""));
+  });
+  patchEventInstance(event, "composedPath", () => {
+    throw new Error(COMPOSED_PATH_ERROR_MESSAGE + (ngDevMode ? COMPOSED_PATH_ERROR_MESSAGE_DETAILS : ""));
+  });
+}
+function prepareEventForDispatch(eventInfoWrapper) {
+  const event = eventInfoWrapper.getEvent();
+  const currentTarget = eventInfoWrapper.getAction()?.element;
+  if (currentTarget) {
+    patchEventInstance(event, "currentTarget", currentTarget, {
+      // `currentTarget` is going to get reassigned every dispatch.
+      configurable: true
+    });
+  }
+}
+function patchEventInstance(event, property, value, { configurable = false } = {}) {
+  Object.defineProperty(event, property, { value, configurable });
+}
+function registerDispatcher$1(eventContract, dispatcher) {
+  eventContract.ecrd((eventInfo) => {
+    dispatcher.dispatch(eventInfo);
+  }, Restriction.I_AM_THE_JSACTION_FRAMEWORK);
+}
+function getQueuedEventInfos(earlyJsactionData) {
+  return earlyJsactionData?.q ?? [];
+}
+function removeAllEventListeners(earlyJsactionData) {
+  if (!earlyJsactionData) {
+    return;
+  }
+  removeEventListeners(earlyJsactionData.c, earlyJsactionData.et, earlyJsactionData.h);
+  removeEventListeners(earlyJsactionData.c, earlyJsactionData.etc, earlyJsactionData.h, true);
+}
+function removeEventListeners(container, eventTypes, earlyEventHandler, capture) {
+  for (let i = 0; i < eventTypes.length; i++) {
+    container.removeEventListener(
+      eventTypes[i],
+      earlyEventHandler,
+      /* useCapture */
+      capture
+    );
+  }
+}
+var MOUSE_SPECIAL_SUPPORT = false;
+var EventContract = class _EventContract {
+  static MOUSE_SPECIAL_SUPPORT = MOUSE_SPECIAL_SUPPORT;
+  containerManager;
+  /**
+   * The DOM events which this contract covers. Used to prevent double
+   * registration of event types. The value of the map is the
+   * internally created DOM event handler function that handles the
+   * DOM events. See addEvent().
+   *
+   */
+  eventHandlers = {};
+  browserEventTypeToExtraEventTypes = {};
+  /**
+   * The dispatcher function. Events are passed to this function for
+   * handling once it was set using the registerDispatcher() method. This is
+   * done because the function is passed from another jsbinary, so passing the
+   * instance and invoking the method here would require to leave the method
+   * unobfuscated.
+   */
+  dispatcher = null;
+  /**
+   * The list of suspended `EventInfo` that will be dispatched
+   * as soon as the `Dispatcher` is registered.
+   */
+  queuedEventInfos = [];
+  constructor(containerManager) {
+    this.containerManager = containerManager;
+  }
+  handleEvent(eventType, event, container) {
+    const eventInfo = createEventInfoFromParameters(
+      /* eventType= */
+      eventType,
+      /* event= */
+      event,
+      /* targetElement= */
+      event.target,
+      /* container= */
+      container,
+      /* timestamp= */
+      Date.now()
+    );
+    this.handleEventInfo(eventInfo);
+  }
+  /**
+   * Handle an `EventInfo`.
+   */
+  handleEventInfo(eventInfo) {
+    if (!this.dispatcher) {
+      setIsReplay(eventInfo, true);
+      this.queuedEventInfos?.push(eventInfo);
+      return;
+    }
+    this.dispatcher(eventInfo);
+  }
+  /**
+   * Enables jsaction handlers to be called for the event type given by
+   * name.
+   *
+   * If the event is already registered, this does nothing.
+   *
+   * @param prefixedEventType If supplied, this event is used in
+   *     the actual browser event registration instead of the name that is
+   *     exposed to jsaction. Use this if you e.g. want users to be able
+   *     to subscribe to jsaction="transitionEnd:foo" while the underlying
+   *     event is webkitTransitionEnd in one browser and mozTransitionEnd
+   *     in another.
+   *
+   * @param passive A boolean value that, if `true`, indicates that the event
+   *     handler will never call `preventDefault()`.
+   */
+  addEvent(eventType, prefixedEventType, passive) {
+    if (eventType in this.eventHandlers || !this.containerManager) {
+      return;
+    }
+    if (!_EventContract.MOUSE_SPECIAL_SUPPORT && MOUSE_SPECIAL_EVENT_TYPES.indexOf(eventType) >= 0) {
+      return;
+    }
+    const eventHandler = (eventType2, event, container) => {
+      this.handleEvent(eventType2, event, container);
+    };
+    this.eventHandlers[eventType] = eventHandler;
+    const browserEventType = getBrowserEventType(prefixedEventType || eventType);
+    if (browserEventType !== eventType) {
+      const eventTypes = this.browserEventTypeToExtraEventTypes[browserEventType] || [];
+      eventTypes.push(eventType);
+      this.browserEventTypeToExtraEventTypes[browserEventType] = eventTypes;
+    }
+    this.containerManager.addEventListener(browserEventType, (element) => {
+      return (event) => {
+        eventHandler(eventType, event, element);
+      };
+    }, passive);
+  }
+  /**
+   * Gets the queued early events and replay them using the appropriate handler
+   * in the provided event contract. Once all the events are replayed, it cleans
+   * up the early contract.
+   */
+  replayEarlyEvents(earlyJsactionData = window._ejsa) {
+    if (!earlyJsactionData) {
+      return;
+    }
+    this.replayEarlyEventInfos(earlyJsactionData.q);
+    removeAllEventListeners(earlyJsactionData);
+    delete window._ejsa;
+  }
+  /**
+   * Replays all the early `EventInfo` objects, dispatching them through the normal
+   * `EventContract` flow.
+   */
+  replayEarlyEventInfos(earlyEventInfos) {
+    for (let i = 0; i < earlyEventInfos.length; i++) {
+      const earlyEventInfo = earlyEventInfos[i];
+      const eventTypes = this.getEventTypesForBrowserEventType(earlyEventInfo.eventType);
+      for (let j = 0; j < eventTypes.length; j++) {
+        const eventInfo = cloneEventInfo(earlyEventInfo);
+        setEventType(eventInfo, eventTypes[j]);
+        this.handleEventInfo(eventInfo);
+      }
+    }
+  }
+  /**
+   * Returns all JSAction event types that have been registered for a given
+   * browser event type.
+   */
+  getEventTypesForBrowserEventType(browserEventType) {
+    const eventTypes = [];
+    if (this.eventHandlers[browserEventType]) {
+      eventTypes.push(browserEventType);
+    }
+    if (this.browserEventTypeToExtraEventTypes[browserEventType]) {
+      eventTypes.push(...this.browserEventTypeToExtraEventTypes[browserEventType]);
+    }
+    return eventTypes;
+  }
+  /**
+   * Returns the event handler function for a given event type.
+   */
+  handler(eventType) {
+    return this.eventHandlers[eventType];
+  }
+  /**
+   * Cleans up the event contract. This resets all of the `EventContract`'s
+   * internal state. Users are responsible for not using this `EventContract`
+   * after it has been cleaned up.
+   */
+  cleanUp() {
+    this.containerManager?.cleanUp();
+    this.containerManager = null;
+    this.eventHandlers = {};
+    this.browserEventTypeToExtraEventTypes = {};
+    this.dispatcher = null;
+    this.queuedEventInfos = [];
+  }
+  /**
+   * Register a dispatcher function. Event info of each event mapped to
+   * a jsaction is passed for handling to this callback. The queued
+   * events are passed as well to the dispatcher for later replaying
+   * once the dispatcher is registered. Clears the event queue to null.
+   *
+   * @param dispatcher The dispatcher function.
+   * @param restriction
+   */
+  registerDispatcher(dispatcher, restriction) {
+    this.ecrd(dispatcher, restriction);
+  }
+  /**
+   * Unrenamed alias for registerDispatcher. Necessary for any codebases that
+   * split the `EventContract` and `Dispatcher` code into different compilation
+   * units.
+   */
+  ecrd(dispatcher, restriction) {
+    this.dispatcher = dispatcher;
+    if (this.queuedEventInfos?.length) {
+      for (let i = 0; i < this.queuedEventInfos.length; i++) {
+        this.handleEventInfo(this.queuedEventInfos[i]);
+      }
+      this.queuedEventInfos = null;
+    }
+  }
+};
+function getAppScopedQueuedEventInfos(appId, dataContainer = window) {
+  return getQueuedEventInfos(dataContainer._ejsas?.[appId]);
+}
+function clearAppScopedEarlyEventContract(appId, dataContainer = window) {
+  if (!dataContainer._ejsas) {
+    return;
+  }
+  dataContainer._ejsas[appId] = void 0;
+}
+
+// node_modules/@angular/core/fesm2022/core.mjs
+var REQUIRED_UNSET_VALUE = Symbol("InputSignalNode#UNSET");
+var INPUT_SIGNAL_NODE = (() => {
+  return __spreadProps(__spreadValues({}, SIGNAL_NODE), {
+    transformFn: void 0,
+    applyValueToInputSignal(node, value) {
+      signalSetFn(node, value);
+    }
+  });
+})();
+var ɵINPUT_SIGNAL_BRAND_WRITE_TYPE = Symbol();
+function createInputSignal(initialValue, options) {
+  const node = Object.create(INPUT_SIGNAL_NODE);
+  node.value = initialValue;
+  node.transformFn = options?.transform;
+  function inputValueFn() {
+    producerAccessed(node);
+    if (node.value === REQUIRED_UNSET_VALUE) {
+      let message = null;
+      if (ngDevMode) {
+        const name = options?.debugName ?? options?.alias;
+        message = `Input${name ? ` "${name}"` : ""} is required but no value is available yet.`;
+      }
+      throw new RuntimeError(-950, message);
+    }
+    return node.value;
+  }
+  inputValueFn[SIGNAL] = node;
+  if (ngDevMode) {
+    inputValueFn.toString = () => `[Input Signal: ${inputValueFn()}]`;
+    node.debugName = options?.debugName;
+  }
+  return inputValueFn;
+}
+var FactoryTarget;
+(function(FactoryTarget2) {
+  FactoryTarget2[FactoryTarget2["Directive"] = 0] = "Directive";
+  FactoryTarget2[FactoryTarget2["Component"] = 1] = "Component";
+  FactoryTarget2[FactoryTarget2["Injectable"] = 2] = "Injectable";
+  FactoryTarget2[FactoryTarget2["Pipe"] = 3] = "Pipe";
+  FactoryTarget2[FactoryTarget2["NgModule"] = 4] = "NgModule";
+})(FactoryTarget || (FactoryTarget = {}));
+var R3TemplateDependencyKind;
+(function(R3TemplateDependencyKind2) {
+  R3TemplateDependencyKind2[R3TemplateDependencyKind2["Directive"] = 0] = "Directive";
+  R3TemplateDependencyKind2[R3TemplateDependencyKind2["Pipe"] = 1] = "Pipe";
+  R3TemplateDependencyKind2[R3TemplateDependencyKind2["NgModule"] = 2] = "NgModule";
+})(R3TemplateDependencyKind || (R3TemplateDependencyKind = {}));
+var ViewEncapsulation2;
+(function(ViewEncapsulation3) {
+  ViewEncapsulation3[ViewEncapsulation3["Emulated"] = 0] = "Emulated";
+  ViewEncapsulation3[ViewEncapsulation3["None"] = 2] = "None";
+  ViewEncapsulation3[ViewEncapsulation3["ShadowDom"] = 3] = "ShadowDom";
+})(ViewEncapsulation2 || (ViewEncapsulation2 = {}));
+var HostAttributeToken = class {
+  attributeName;
+  constructor(attributeName) {
+    this.attributeName = attributeName;
+  }
+  /** @internal */
+  __NG_ELEMENT_ID__ = () => ɵɵinjectAttribute(this.attributeName);
+  toString() {
+    return `HostAttributeToken ${this.attributeName}`;
+  }
+};
+var HOST_TAG_NAME = new InjectionToken(ngDevMode ? "HOST_TAG_NAME" : "");
+HOST_TAG_NAME.__NG_ELEMENT_ID__ = (flags) => {
+  const tNode = getCurrentTNode();
+  if (tNode === null) {
+    throw new RuntimeError(204, ngDevMode && "HOST_TAG_NAME can only be injected in directives and components during construction time (in a class constructor or as a class field initializer)");
+  }
+  if (tNode.type & 2) {
+    return tNode.value;
+  }
+  if (flags & 8) {
+    return null;
+  }
+  throw new RuntimeError(204, ngDevMode && `HOST_TAG_NAME was used on ${getDevModeNodeName(tNode)} which doesn't have an underlying element in the DOM. This is invalid, and so the dependency should be marked as optional.`);
+};
+function getDevModeNodeName(tNode) {
+  if (tNode.type & 8) {
+    return "an <ng-container>";
+  } else if (tNode.type & 4) {
+    return "an <ng-template>";
+  } else if (tNode.type & 128) {
+    return "an @let declaration";
+  } else {
+    return "a node";
+  }
+}
+function output(opts) {
+  ngDevMode && assertInInjectionContext(output);
+  return new OutputEmitterRef();
+}
+function inputFunction(initialValue, opts) {
+  ngDevMode && assertInInjectionContext(input);
+  return createInputSignal(initialValue, opts);
+}
+function inputRequiredFunction(opts) {
+  ngDevMode && assertInInjectionContext(input);
+  return createInputSignal(REQUIRED_UNSET_VALUE, opts);
+}
+var input = (() => {
+  inputFunction.required = inputRequiredFunction;
+  return inputFunction;
+})();
+function viewChildFn(locator, opts) {
+  ngDevMode && assertInInjectionContext(viewChild);
+  return createSingleResultOptionalQuerySignalFn(opts);
+}
+function viewChildRequiredFn(locator, opts) {
+  ngDevMode && assertInInjectionContext(viewChild);
+  return createSingleResultRequiredQuerySignalFn(opts);
+}
+var viewChild = (() => {
+  viewChildFn.required = viewChildRequiredFn;
+  return viewChildFn;
+})();
+function viewChildren(locator, opts) {
+  ngDevMode && assertInInjectionContext(viewChildren);
+  return createMultiResultQuerySignalFn(opts);
+}
+function contentChildFn(locator, opts) {
+  ngDevMode && assertInInjectionContext(contentChild);
+  return createSingleResultOptionalQuerySignalFn(opts);
+}
+function contentChildRequiredFn(locator, opts) {
+  ngDevMode && assertInInjectionContext(contentChildren);
+  return createSingleResultRequiredQuerySignalFn(opts);
+}
+var contentChild = (() => {
+  contentChildFn.required = contentChildRequiredFn;
+  return contentChildFn;
+})();
+function contentChildren(locator, opts) {
+  return createMultiResultQuerySignalFn(opts);
+}
+function createModelSignal(initialValue, opts) {
+  const node = Object.create(INPUT_SIGNAL_NODE);
+  const emitterRef = new OutputEmitterRef();
+  node.value = initialValue;
+  function getter() {
+    producerAccessed(node);
+    assertModelSet(node.value);
+    return node.value;
+  }
+  getter[SIGNAL] = node;
+  getter.asReadonly = signalAsReadonlyFn.bind(getter);
+  getter.set = (newValue) => {
+    if (!node.equal(node.value, newValue)) {
+      signalSetFn(node, newValue);
+      emitterRef.emit(newValue);
+    }
+  };
+  getter.update = (updateFn) => {
+    assertModelSet(node.value);
+    getter.set(updateFn(node.value));
+  };
+  getter.subscribe = emitterRef.subscribe.bind(emitterRef);
+  getter.destroyRef = emitterRef.destroyRef;
+  if (ngDevMode) {
+    getter.toString = () => `[Model Signal: ${getter()}]`;
+    node.debugName = opts?.debugName;
+  }
+  return getter;
+}
+function assertModelSet(value) {
+  if (value === REQUIRED_UNSET_VALUE) {
+    throw new RuntimeError(952, ngDevMode && "Model is required but no value is available yet.");
+  }
+}
+function modelFunction(initialValue, opts) {
+  ngDevMode && assertInInjectionContext(model);
+  return createModelSignal(initialValue, opts);
+}
+function modelRequiredFunction(opts) {
+  ngDevMode && assertInInjectionContext(model);
+  return createModelSignal(REQUIRED_UNSET_VALUE, opts);
+}
+var model = (() => {
+  modelFunction.required = modelRequiredFunction;
+  return modelFunction;
+})();
+var emitDistinctChangesOnlyDefaultValue = true;
+var Query = class {
+};
+var ContentChildren = makePropDecorator("ContentChildren", (selector, opts = {}) => __spreadValues({
+  selector,
+  first: false,
+  isViewQuery: false,
+  descendants: false,
+  emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue
+}, opts), Query);
+var ContentChild = makePropDecorator("ContentChild", (selector, opts = {}) => __spreadValues({
+  selector,
+  first: true,
+  isViewQuery: false,
+  descendants: true
+}, opts), Query);
+var ViewChildren = makePropDecorator("ViewChildren", (selector, opts = {}) => __spreadValues({
+  selector,
+  first: false,
+  isViewQuery: true,
+  descendants: true,
+  emitDistinctChangesOnly: emitDistinctChangesOnlyDefaultValue
+}, opts), Query);
+var ViewChild = makePropDecorator("ViewChild", (selector, opts) => __spreadValues({
+  selector,
+  first: true,
+  isViewQuery: true,
+  descendants: true
+}, opts), Query);
+var Version = class {
+  full;
+  major;
+  minor;
+  patch;
+  constructor(full) {
+    this.full = full;
+    const parts = full.split(".");
+    this.major = parts[0];
+    this.minor = parts[1];
+    this.patch = parts.slice(2).join(".");
+  }
+};
+var VERSION = new Version("20.0.5");
+function compileNgModuleFactory(injector, options, moduleType) {
+  ngDevMode && assertNgModuleType(moduleType);
+  const moduleFactory = new NgModuleFactory2(moduleType);
+  if (typeof ngJitMode !== "undefined" && !ngJitMode) {
+    return Promise.resolve(moduleFactory);
+  }
+  const compilerOptions = injector.get(COMPILER_OPTIONS, []).concat(options);
+  setJitOptions({
+    defaultEncapsulation: _lastDefined(compilerOptions.map((opts) => opts.defaultEncapsulation)),
+    preserveWhitespaces: _lastDefined(compilerOptions.map((opts) => opts.preserveWhitespaces))
+  });
+  if (isComponentResourceResolutionQueueEmpty()) {
+    return Promise.resolve(moduleFactory);
+  }
+  const compilerProviders = compilerOptions.flatMap((option) => option.providers ?? []);
+  if (compilerProviders.length === 0) {
+    return Promise.resolve(moduleFactory);
+  }
+  const compiler = getCompilerFacade({
+    usage: 0,
+    kind: "NgModule",
+    type: moduleType
+  });
+  const compilerInjector = Injector.create({ providers: compilerProviders });
+  const resourceLoader = compilerInjector.get(compiler.ResourceLoader);
+  return resolveComponentResources((url) => Promise.resolve(resourceLoader.get(url))).then(() => moduleFactory);
+}
+function _lastDefined(args) {
+  for (let i = args.length - 1; i >= 0; i--) {
+    if (args[i] !== void 0) {
+      return args[i];
+    }
+  }
+  return void 0;
+}
+var SCAN_DELAY = 200;
+var OVERSIZED_IMAGE_TOLERANCE = 1200;
+var ImagePerformanceWarning = class _ImagePerformanceWarning {
+  // Map of full image URLs -> original `ngSrc` values.
+  window = null;
+  observer = null;
+  options = inject(IMAGE_CONFIG);
+  lcpImageUrl;
+  start() {
+    if (typeof PerformanceObserver === "undefined" || this.options?.disableImageSizeWarning && this.options?.disableImageLazyLoadWarning) {
+      return;
+    }
+    this.observer = this.initPerformanceObserver();
+    const doc = getDocument();
+    const win = doc.defaultView;
+    if (win) {
+      this.window = win;
+      const waitToScan = () => {
+        setTimeout(this.scanImages.bind(this), SCAN_DELAY);
+      };
+      const setup = () => {
+        if (doc.readyState === "complete") {
+          waitToScan();
+        } else {
+          this.window?.addEventListener("load", waitToScan, { once: true });
+        }
+      };
+      if (typeof Zone !== "undefined") {
+        Zone.root.run(() => setup());
+      } else {
+        setup();
+      }
+    }
+  }
+  ngOnDestroy() {
+    this.observer?.disconnect();
+  }
+  initPerformanceObserver() {
+    if (typeof PerformanceObserver === "undefined") {
+      return null;
+    }
+    const observer = new PerformanceObserver((entryList) => {
+      const entries = entryList.getEntries();
+      if (entries.length === 0)
+        return;
+      const lcpElement = entries[entries.length - 1];
+      const imgSrc = lcpElement.element?.src ?? "";
+      if (imgSrc.startsWith("data:") || imgSrc.startsWith("blob:"))
+        return;
+      this.lcpImageUrl = imgSrc;
+    });
+    observer.observe({ type: "largest-contentful-paint", buffered: true });
+    return observer;
+  }
+  scanImages() {
+    const images = getDocument().querySelectorAll("img");
+    let lcpElementFound, lcpElementLoadedCorrectly = false;
+    images.forEach((image) => {
+      if (!this.options?.disableImageSizeWarning) {
+        if (!image.getAttribute("ng-img") && this.isOversized(image)) {
+          logOversizedImageWarning(image.src);
+        }
+      }
+      if (!this.options?.disableImageLazyLoadWarning && this.lcpImageUrl) {
+        if (image.src === this.lcpImageUrl) {
+          lcpElementFound = true;
+          if (image.loading !== "lazy" || image.getAttribute("ng-img")) {
+            lcpElementLoadedCorrectly = true;
+          }
+        }
+      }
+    });
+    if (lcpElementFound && !lcpElementLoadedCorrectly && this.lcpImageUrl && !this.options?.disableImageLazyLoadWarning) {
+      logLazyLCPWarning(this.lcpImageUrl);
+    }
+  }
+  isOversized(image) {
+    if (!this.window) {
+      return false;
+    }
+    const nonOversizedImageExtentions = [
+      // SVG images are vector-based, which means they can scale
+      // to any size without losing quality.
+      ".svg"
+    ];
+    const imageSource = (image.src || "").toLowerCase();
+    if (nonOversizedImageExtentions.some((extension) => imageSource.endsWith(extension))) {
+      return false;
+    }
+    const computedStyle = this.window.getComputedStyle(image);
+    let renderedWidth = parseFloat(computedStyle.getPropertyValue("width"));
+    let renderedHeight = parseFloat(computedStyle.getPropertyValue("height"));
+    const boxSizing = computedStyle.getPropertyValue("box-sizing");
+    const objectFit = computedStyle.getPropertyValue("object-fit");
+    if (objectFit === `cover`) {
+      return false;
+    }
+    if (boxSizing === "border-box") {
+      const paddingTop = computedStyle.getPropertyValue("padding-top");
+      const paddingRight = computedStyle.getPropertyValue("padding-right");
+      const paddingBottom = computedStyle.getPropertyValue("padding-bottom");
+      const paddingLeft = computedStyle.getPropertyValue("padding-left");
+      renderedWidth -= parseFloat(paddingRight) + parseFloat(paddingLeft);
+      renderedHeight -= parseFloat(paddingTop) + parseFloat(paddingBottom);
+    }
+    const intrinsicWidth = image.naturalWidth;
+    const intrinsicHeight = image.naturalHeight;
+    const recommendedWidth = this.window.devicePixelRatio * renderedWidth;
+    const recommendedHeight = this.window.devicePixelRatio * renderedHeight;
+    const oversizedWidth = intrinsicWidth - recommendedWidth >= OVERSIZED_IMAGE_TOLERANCE;
+    const oversizedHeight = intrinsicHeight - recommendedHeight >= OVERSIZED_IMAGE_TOLERANCE;
+    return oversizedWidth || oversizedHeight;
+  }
+  static ɵfac = function ImagePerformanceWarning_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ImagePerformanceWarning)();
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _ImagePerformanceWarning, factory: _ImagePerformanceWarning.ɵfac, providedIn: "root" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ImagePerformanceWarning, [{
+    type: Injectable,
+    args: [{ providedIn: "root" }]
+  }], null, null);
+})();
+function logLazyLCPWarning(src) {
+  console.warn(formatRuntimeError(-913, `An image with src ${src} is the Largest Contentful Paint (LCP) element but was given a "loading" value of "lazy", which can negatively impact application loading performance. This warning can be addressed by changing the loading value of the LCP image to "eager", or by using the NgOptimizedImage directive's prioritization utilities. For more information about addressing or disabling this warning, see https://angular.dev/errors/NG0913`));
+}
+function logOversizedImageWarning(src) {
+  console.warn(formatRuntimeError(-913, `An image with src ${src} has intrinsic file dimensions much larger than its rendered size. This can negatively impact application loading performance. For more information about addressing or disabling this warning, see https://angular.dev/errors/NG0913`));
+}
+var PLATFORM_DESTROY_LISTENERS = new InjectionToken(ngDevMode ? "PlatformDestroyListeners" : "");
+var ENABLE_ROOT_COMPONENT_BOOTSTRAP = new InjectionToken(ngDevMode ? "ENABLE_ROOT_COMPONENT_BOOTSTRAP" : "");
+function isApplicationBootstrapConfig(config2) {
+  return !config2.moduleRef;
+}
+function bootstrap(config2) {
+  const envInjector = isApplicationBootstrapConfig(config2) ? config2.r3Injector : config2.moduleRef.injector;
+  const ngZone = envInjector.get(NgZone);
+  return ngZone.run(() => {
+    if (isApplicationBootstrapConfig(config2)) {
+      config2.r3Injector.resolveInjectorInitializers();
+    } else {
+      config2.moduleRef.resolveInjectorInitializers();
+    }
+    const exceptionHandler = envInjector.get(INTERNAL_APPLICATION_ERROR_HANDLER);
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      if (envInjector.get(PROVIDED_ZONELESS) && envInjector.get(PROVIDED_NG_ZONE)) {
+        throw new RuntimeError(408, "Invalid change detection configuration: provideZoneChangeDetection and provideZonelessChangeDetection cannot be used together.");
+      }
+    }
+    let onErrorSubscription;
+    ngZone.runOutsideAngular(() => {
+      onErrorSubscription = ngZone.onError.subscribe({
+        next: exceptionHandler
+      });
+    });
+    if (isApplicationBootstrapConfig(config2)) {
+      const destroyListener = () => envInjector.destroy();
+      const onPlatformDestroyListeners = config2.platformInjector.get(PLATFORM_DESTROY_LISTENERS);
+      onPlatformDestroyListeners.add(destroyListener);
+      envInjector.onDestroy(() => {
+        onErrorSubscription.unsubscribe();
+        onPlatformDestroyListeners.delete(destroyListener);
+      });
+    } else {
+      const destroyListener = () => config2.moduleRef.destroy();
+      const onPlatformDestroyListeners = config2.platformInjector.get(PLATFORM_DESTROY_LISTENERS);
+      onPlatformDestroyListeners.add(destroyListener);
+      config2.moduleRef.onDestroy(() => {
+        remove(config2.allPlatformModules, config2.moduleRef);
+        onErrorSubscription.unsubscribe();
+        onPlatformDestroyListeners.delete(destroyListener);
+      });
+    }
+    return _callAndReportToErrorHandler(exceptionHandler, ngZone, () => {
+      const initStatus = envInjector.get(ApplicationInitStatus);
+      initStatus.runInitializers();
+      return initStatus.donePromise.then(() => {
+        const localeId = envInjector.get(LOCALE_ID, DEFAULT_LOCALE_ID);
+        setLocaleId(localeId || DEFAULT_LOCALE_ID);
+        const enableRootComponentBoostrap = envInjector.get(ENABLE_ROOT_COMPONENT_BOOTSTRAP, true);
+        if (!enableRootComponentBoostrap) {
+          if (isApplicationBootstrapConfig(config2)) {
+            return envInjector.get(ApplicationRef);
+          }
+          config2.allPlatformModules.push(config2.moduleRef);
+          return config2.moduleRef;
+        }
+        if (typeof ngDevMode === "undefined" || ngDevMode) {
+          const imagePerformanceService = envInjector.get(ImagePerformanceWarning);
+          imagePerformanceService.start();
+        }
+        if (isApplicationBootstrapConfig(config2)) {
+          const appRef = envInjector.get(ApplicationRef);
+          if (config2.rootComponent !== void 0) {
+            appRef.bootstrap(config2.rootComponent);
+          }
+          return appRef;
+        } else {
+          moduleBootstrapImpl?.(config2.moduleRef, config2.allPlatformModules);
+          return config2.moduleRef;
+        }
+      });
+    });
+  });
+}
+var moduleBootstrapImpl;
+function setModuleBootstrapImpl() {
+  moduleBootstrapImpl = _moduleDoBootstrap;
+}
+function _moduleDoBootstrap(moduleRef, allPlatformModules) {
+  const appRef = moduleRef.injector.get(ApplicationRef);
+  if (moduleRef._bootstrapComponents.length > 0) {
+    moduleRef._bootstrapComponents.forEach((f) => appRef.bootstrap(f));
+  } else if (moduleRef.instance.ngDoBootstrap) {
+    moduleRef.instance.ngDoBootstrap(appRef);
+  } else {
+    throw new RuntimeError(-403, ngDevMode && `The module ${stringify(moduleRef.instance.constructor)} was bootstrapped, but it does not declare "@NgModule.bootstrap" components nor a "ngDoBootstrap" method. Please define one of these.`);
+  }
+  allPlatformModules.push(moduleRef);
+}
+function _callAndReportToErrorHandler(errorHandler, ngZone, callback) {
+  try {
+    const result = callback();
+    if (isPromise2(result)) {
+      return result.catch((e) => {
+        ngZone.runOutsideAngular(() => errorHandler(e));
+        throw e;
+      });
+    }
+    return result;
+  } catch (e) {
+    ngZone.runOutsideAngular(() => errorHandler(e));
+    throw e;
+  }
+}
+var PlatformRef = class _PlatformRef {
+  _injector;
+  _modules = [];
+  _destroyListeners = [];
+  _destroyed = false;
+  /** @internal */
+  constructor(_injector) {
+    this._injector = _injector;
+  }
+  /**
+   * Creates an instance of an `@NgModule` for the given platform.
+   *
+   * @deprecated Passing NgModule factories as the `PlatformRef.bootstrapModuleFactory` function
+   *     argument is deprecated. Use the `PlatformRef.bootstrapModule` API instead.
+   */
+  bootstrapModuleFactory(moduleFactory, options) {
+    const scheduleInRootZone = options?.scheduleInRootZone;
+    const ngZoneFactory = () => getNgZone(options?.ngZone, __spreadProps(__spreadValues({}, getNgZoneOptions({
+      eventCoalescing: options?.ngZoneEventCoalescing,
+      runCoalescing: options?.ngZoneRunCoalescing
+    })), {
+      scheduleInRootZone
+    }));
+    const ignoreChangesOutsideZone = options?.ignoreChangesOutsideZone;
+    const allAppProviders = [
+      internalProvideZoneChangeDetection({
+        ngZoneFactory,
+        ignoreChangesOutsideZone
+      }),
+      { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
+      errorHandlerEnvironmentInitializer
+    ];
+    const moduleRef = createNgModuleRefWithProviders(moduleFactory.moduleType, this.injector, allAppProviders);
+    setModuleBootstrapImpl();
+    return bootstrap({
+      moduleRef,
+      allPlatformModules: this._modules,
+      platformInjector: this.injector
+    });
+  }
+  /**
+   * Creates an instance of an `@NgModule` for a given platform.
+   *
+   * @usageNotes
+   * ### Simple Example
+   *
+   * ```ts
+   * @NgModule({
+   *   imports: [BrowserModule]
+   * })
+   * class MyModule {}
+   *
+   * let moduleRef = platformBrowser().bootstrapModule(MyModule);
+   * ```
+   *
+   */
+  bootstrapModule(moduleType, compilerOptions = []) {
+    const options = optionsReducer({}, compilerOptions);
+    setModuleBootstrapImpl();
+    return compileNgModuleFactory(this.injector, options, moduleType).then((moduleFactory) => this.bootstrapModuleFactory(moduleFactory, options));
+  }
+  /**
+   * Registers a listener to be called when the platform is destroyed.
+   */
+  onDestroy(callback) {
+    this._destroyListeners.push(callback);
+  }
+  /**
+   * Retrieves the platform {@link Injector}, which is the parent injector for
+   * every Angular application on the page and provides singleton providers.
+   */
+  get injector() {
+    return this._injector;
+  }
+  /**
+   * Destroys the current Angular platform and all Angular applications on the page.
+   * Destroys all modules and listeners registered with the platform.
+   */
+  destroy() {
+    if (this._destroyed) {
+      throw new RuntimeError(404, ngDevMode && "The platform has already been destroyed!");
+    }
+    this._modules.slice().forEach((module) => module.destroy());
+    this._destroyListeners.forEach((listener) => listener());
+    const destroyListeners = this._injector.get(PLATFORM_DESTROY_LISTENERS, null);
+    if (destroyListeners) {
+      destroyListeners.forEach((listener) => listener());
+      destroyListeners.clear();
+    }
+    this._destroyed = true;
+  }
+  /**
+   * Indicates whether this instance was destroyed.
+   */
+  get destroyed() {
+    return this._destroyed;
+  }
+  static ɵfac = function PlatformRef_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _PlatformRef)(ɵɵinject(Injector));
+  };
+  static ɵprov = ɵɵdefineInjectable({ token: _PlatformRef, factory: _PlatformRef.ɵfac, providedIn: "platform" });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(PlatformRef, [{
+    type: Injectable,
+    args: [{ providedIn: "platform" }]
+  }], () => [{ type: Injector }], null);
+})();
+var _platformInjector = null;
+var ALLOW_MULTIPLE_PLATFORMS = new InjectionToken(ngDevMode ? "AllowMultipleToken" : "");
+function createPlatform(injector) {
+  if (_platformInjector && !_platformInjector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
+    throw new RuntimeError(400, ngDevMode && "There can be only one platform. Destroy the previous one to create a new one.");
+  }
+  publishDefaultGlobalUtils();
+  publishSignalConfiguration();
+  _platformInjector = injector;
+  const platform = injector.get(PlatformRef);
+  runPlatformInitializers(injector);
+  return platform;
+}
+function createPlatformFactory(parentPlatformFactory, name, providers = []) {
+  const desc = `Platform: ${name}`;
+  const marker = new InjectionToken(desc);
+  return (extraProviders = []) => {
+    let platform = getPlatform();
+    if (!platform || platform.injector.get(ALLOW_MULTIPLE_PLATFORMS, false)) {
+      const platformProviders = [
+        ...providers,
+        ...extraProviders,
+        { provide: marker, useValue: true }
+      ];
+      if (parentPlatformFactory) {
+        parentPlatformFactory(platformProviders);
+      } else {
+        createPlatform(createPlatformInjector(platformProviders, desc));
+      }
+    }
+    return assertPlatform(marker);
+  };
+}
+function createPlatformInjector(providers = [], name) {
+  return Injector.create({
+    name,
+    providers: [
+      { provide: INJECTOR_SCOPE, useValue: "platform" },
+      { provide: PLATFORM_DESTROY_LISTENERS, useValue: /* @__PURE__ */ new Set([() => _platformInjector = null]) },
+      ...providers
+    ]
+  });
+}
+function assertPlatform(requiredToken) {
+  const platform = getPlatform();
+  if (!platform) {
+    throw new RuntimeError(401, ngDevMode && "No platform exists!");
+  }
+  if ((typeof ngDevMode === "undefined" || ngDevMode) && !platform.injector.get(requiredToken, null)) {
+    throw new RuntimeError(400, "A platform with a different configuration has been created. Please destroy it first.");
+  }
+  return platform;
+}
+function getPlatform() {
+  return _platformInjector?.get(PlatformRef) ?? null;
+}
+function destroyPlatform() {
+  getPlatform()?.destroy();
+}
+function createOrReusePlatformInjector(providers = []) {
+  if (_platformInjector)
+    return _platformInjector;
+  publishDefaultGlobalUtils();
+  const injector = createPlatformInjector(providers);
+  _platformInjector = injector;
+  publishSignalConfiguration();
+  runPlatformInitializers(injector);
+  return injector;
+}
+function providePlatformInitializer(initializerFn) {
+  return makeEnvironmentProviders([
+    {
+      provide: PLATFORM_INITIALIZER,
+      useValue: initializerFn,
+      multi: true
+    }
+  ]);
+}
+function runPlatformInitializers(injector) {
+  const inits = injector.get(PLATFORM_INITIALIZER, null);
+  runInInjectionContext(injector, () => {
+    inits?.forEach((init) => init());
+  });
+}
+function exhaustiveCheckNoChangesInterval(interval2) {
+  return provideEnvironmentInitializer(() => {
+    const applicationRef = inject(ApplicationRef);
+    const errorHandler = inject(ErrorHandler);
+    const scheduler = inject(ChangeDetectionSchedulerImpl);
+    const ngZone = inject(NgZone);
+    function scheduleCheckNoChanges() {
+      ngZone.runOutsideAngular(() => {
+        setTimeout(() => {
+          if (applicationRef.destroyed) {
+            return;
+          }
+          if (scheduler.pendingRenderTaskId || scheduler.runningTick) {
+            scheduleCheckNoChanges();
+            return;
+          }
+          for (const view of applicationRef.allViews) {
+            try {
+              checkNoChangesInternal(
+                view._lView,
+                true
+                /** exhaustive */
+              );
+            } catch (e) {
+              errorHandler.handleError(e);
+            }
+          }
+          scheduleCheckNoChanges();
+        }, interval2);
+      });
+    }
+    scheduleCheckNoChanges();
+  });
+}
+function provideCheckNoChangesConfig(options) {
+  return makeEnvironmentProviders(typeof ngDevMode === "undefined" || ngDevMode ? [
+    {
+      provide: UseExhaustiveCheckNoChanges,
+      useValue: options.exhaustive
+    },
+    options?.interval !== void 0 ? exhaustiveCheckNoChangesInterval(options.interval) : []
+  ] : []);
+}
+function isDevMode() {
+  return typeof ngDevMode === "undefined" || !!ngDevMode;
+}
+function enableProdMode() {
+  if (typeof ngDevMode === "undefined" || ngDevMode) {
+    _global["ngDevMode"] = false;
+  }
+}
+function getModuleFactory(id) {
+  const type = getRegisteredNgModuleType(id);
+  if (!type)
+    throw noModuleError(id);
+  return new NgModuleFactory2(type);
+}
+function getNgModuleById(id) {
+  const type = getRegisteredNgModuleType(id);
+  if (!type)
+    throw noModuleError(id);
+  return type;
+}
+function noModuleError(id) {
+  return new Error(`No module with ID ${id} loaded`);
+}
+var ChangeDetectorRef = class {
+  /**
+   * @internal
+   * @nocollapse
+   */
+  static __NG_ELEMENT_ID__ = injectChangeDetectorRef;
+};
+function injectChangeDetectorRef(flags) {
+  return createViewRef(
+    getCurrentTNode(),
+    getLView(),
+    (flags & 16) === 16
+    /* InternalInjectFlags.ForPipe */
+  );
+}
+function createViewRef(tNode, lView, isPipe2) {
+  if (isComponentHost(tNode) && !isPipe2) {
+    const componentView = getComponentLViewByIndex(tNode.index, lView);
+    return new ViewRef(componentView, componentView);
+  } else if (tNode.type & (3 | 12 | 32 | 128)) {
+    const hostComponentView = lView[DECLARATION_COMPONENT_VIEW];
+    return new ViewRef(hostComponentView, lView);
+  }
+  return null;
+}
+var ViewRef2 = class extends ChangeDetectorRef {
+};
+var EmbeddedViewRef = class extends ViewRef2 {
+};
+var DefaultIterableDifferFactory = class {
+  constructor() {
+  }
+  supports(obj) {
+    return isListLikeIterable(obj);
+  }
+  create(trackByFn) {
+    return new DefaultIterableDiffer(trackByFn);
+  }
+};
+var trackByIdentity = (index, item) => item;
+var DefaultIterableDiffer = class {
+  length = 0;
+  // TODO: confirm the usage of `collection` as it's unused, readonly and on a non public API.
+  collection;
+  // Keeps track of the used records at any point in time (during & across `_check()` calls)
+  _linkedRecords = null;
+  // Keeps track of the removed records at any point in time during `_check()` calls.
+  _unlinkedRecords = null;
+  _previousItHead = null;
+  _itHead = null;
+  _itTail = null;
+  _additionsHead = null;
+  _additionsTail = null;
+  _movesHead = null;
+  _movesTail = null;
+  _removalsHead = null;
+  _removalsTail = null;
+  // Keeps track of records where custom track by is the same, but item identity has changed
+  _identityChangesHead = null;
+  _identityChangesTail = null;
+  _trackByFn;
+  constructor(trackByFn) {
+    this._trackByFn = trackByFn || trackByIdentity;
+  }
+  forEachItem(fn) {
+    let record;
+    for (record = this._itHead; record !== null; record = record._next) {
+      fn(record);
+    }
+  }
+  forEachOperation(fn) {
+    let nextIt = this._itHead;
+    let nextRemove = this._removalsHead;
+    let addRemoveOffset = 0;
+    let moveOffsets = null;
+    while (nextIt || nextRemove) {
+      const record = !nextRemove || nextIt && nextIt.currentIndex < getPreviousIndex(nextRemove, addRemoveOffset, moveOffsets) ? nextIt : nextRemove;
+      const adjPreviousIndex = getPreviousIndex(record, addRemoveOffset, moveOffsets);
+      const currentIndex = record.currentIndex;
+      if (record === nextRemove) {
+        addRemoveOffset--;
+        nextRemove = nextRemove._nextRemoved;
+      } else {
+        nextIt = nextIt._next;
+        if (record.previousIndex == null) {
+          addRemoveOffset++;
+        } else {
+          if (!moveOffsets)
+            moveOffsets = [];
+          const localMovePreviousIndex = adjPreviousIndex - addRemoveOffset;
+          const localCurrentIndex = currentIndex - addRemoveOffset;
+          if (localMovePreviousIndex != localCurrentIndex) {
+            for (let i = 0; i < localMovePreviousIndex; i++) {
+              const offset = i < moveOffsets.length ? moveOffsets[i] : moveOffsets[i] = 0;
+              const index = offset + i;
+              if (localCurrentIndex <= index && index < localMovePreviousIndex) {
+                moveOffsets[i] = offset + 1;
+              }
+            }
+            const previousIndex = record.previousIndex;
+            moveOffsets[previousIndex] = localCurrentIndex - localMovePreviousIndex;
+          }
+        }
+      }
+      if (adjPreviousIndex !== currentIndex) {
+        fn(record, adjPreviousIndex, currentIndex);
+      }
+    }
+  }
+  forEachPreviousItem(fn) {
+    let record;
+    for (record = this._previousItHead; record !== null; record = record._nextPrevious) {
+      fn(record);
+    }
+  }
+  forEachAddedItem(fn) {
+    let record;
+    for (record = this._additionsHead; record !== null; record = record._nextAdded) {
+      fn(record);
+    }
+  }
+  forEachMovedItem(fn) {
+    let record;
+    for (record = this._movesHead; record !== null; record = record._nextMoved) {
+      fn(record);
+    }
+  }
+  forEachRemovedItem(fn) {
+    let record;
+    for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
+      fn(record);
+    }
+  }
+  forEachIdentityChange(fn) {
+    let record;
+    for (record = this._identityChangesHead; record !== null; record = record._nextIdentityChange) {
+      fn(record);
+    }
+  }
+  diff(collection) {
+    if (collection == null)
+      collection = [];
+    if (!isListLikeIterable(collection)) {
+      throw new RuntimeError(900, ngDevMode && `Error trying to diff '${stringify(collection)}'. Only arrays and iterables are allowed`);
+    }
+    if (this.check(collection)) {
+      return this;
+    } else {
+      return null;
+    }
+  }
+  onDestroy() {
+  }
+  check(collection) {
+    this._reset();
+    let record = this._itHead;
+    let mayBeDirty = false;
+    let index;
+    let item;
+    let itemTrackBy;
+    if (Array.isArray(collection)) {
+      this.length = collection.length;
+      for (let index2 = 0; index2 < this.length; index2++) {
+        item = collection[index2];
+        itemTrackBy = this._trackByFn(index2, item);
+        if (record === null || !Object.is(record.trackById, itemTrackBy)) {
+          record = this._mismatch(record, item, itemTrackBy, index2);
+          mayBeDirty = true;
+        } else {
+          if (mayBeDirty) {
+            record = this._verifyReinsertion(record, item, itemTrackBy, index2);
+          }
+          if (!Object.is(record.item, item))
+            this._addIdentityChange(record, item);
+        }
+        record = record._next;
+      }
+    } else {
+      index = 0;
+      iterateListLike(collection, (item2) => {
+        itemTrackBy = this._trackByFn(index, item2);
+        if (record === null || !Object.is(record.trackById, itemTrackBy)) {
+          record = this._mismatch(record, item2, itemTrackBy, index);
+          mayBeDirty = true;
+        } else {
+          if (mayBeDirty) {
+            record = this._verifyReinsertion(record, item2, itemTrackBy, index);
+          }
+          if (!Object.is(record.item, item2))
+            this._addIdentityChange(record, item2);
+        }
+        record = record._next;
+        index++;
+      });
+      this.length = index;
+    }
+    this._truncate(record);
+    this.collection = collection;
+    return this.isDirty;
+  }
+  /* CollectionChanges is considered dirty if it has any additions, moves, removals, or identity
+   * changes.
+   */
+  get isDirty() {
+    return this._additionsHead !== null || this._movesHead !== null || this._removalsHead !== null || this._identityChangesHead !== null;
+  }
+  /**
+   * Reset the state of the change objects to show no changes. This means set previousKey to
+   * currentKey, and clear all of the queues (additions, moves, removals).
+   * Set the previousIndexes of moved and added items to their currentIndexes
+   * Reset the list of additions, moves and removals
+   *
+   * @internal
+   */
+  _reset() {
+    if (this.isDirty) {
+      let record;
+      for (record = this._previousItHead = this._itHead; record !== null; record = record._next) {
+        record._nextPrevious = record._next;
+      }
+      for (record = this._additionsHead; record !== null; record = record._nextAdded) {
+        record.previousIndex = record.currentIndex;
+      }
+      this._additionsHead = this._additionsTail = null;
+      for (record = this._movesHead; record !== null; record = record._nextMoved) {
+        record.previousIndex = record.currentIndex;
+      }
+      this._movesHead = this._movesTail = null;
+      this._removalsHead = this._removalsTail = null;
+      this._identityChangesHead = this._identityChangesTail = null;
+    }
+  }
+  /**
+   * This is the core function which handles differences between collections.
+   *
+   * - `record` is the record which we saw at this position last time. If null then it is a new
+   *   item.
+   * - `item` is the current item in the collection
+   * - `index` is the position of the item in the collection
+   *
+   * @internal
+   */
+  _mismatch(record, item, itemTrackBy, index) {
+    let previousRecord;
+    if (record === null) {
+      previousRecord = this._itTail;
+    } else {
+      previousRecord = record._prev;
+      this._remove(record);
+    }
+    record = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
+    if (record !== null) {
+      if (!Object.is(record.item, item))
+        this._addIdentityChange(record, item);
+      this._reinsertAfter(record, previousRecord, index);
+    } else {
+      record = this._linkedRecords === null ? null : this._linkedRecords.get(itemTrackBy, index);
+      if (record !== null) {
+        if (!Object.is(record.item, item))
+          this._addIdentityChange(record, item);
+        this._moveAfter(record, previousRecord, index);
+      } else {
+        record = this._addAfter(new IterableChangeRecord_(item, itemTrackBy), previousRecord, index);
+      }
+    }
+    return record;
+  }
+  /**
+   * This check is only needed if an array contains duplicates. (Short circuit of nothing dirty)
+   *
+   * Use case: `[a, a]` => `[b, a, a]`
+   *
+   * If we did not have this check then the insertion of `b` would:
+   *   1) evict first `a`
+   *   2) insert `b` at `0` index.
+   *   3) leave `a` at index `1` as is. <-- this is wrong!
+   *   3) reinsert `a` at index 2. <-- this is wrong!
+   *
+   * The correct behavior is:
+   *   1) evict first `a`
+   *   2) insert `b` at `0` index.
+   *   3) reinsert `a` at index 1.
+   *   3) move `a` at from `1` to `2`.
+   *
+   *
+   * Double check that we have not evicted a duplicate item. We need to check if the item type may
+   * have already been removed:
+   * The insertion of b will evict the first 'a'. If we don't reinsert it now it will be reinserted
+   * at the end. Which will show up as the two 'a's switching position. This is incorrect, since a
+   * better way to think of it is as insert of 'b' rather then switch 'a' with 'b' and then add 'a'
+   * at the end.
+   *
+   * @internal
+   */
+  _verifyReinsertion(record, item, itemTrackBy, index) {
+    let reinsertRecord = this._unlinkedRecords === null ? null : this._unlinkedRecords.get(itemTrackBy, null);
+    if (reinsertRecord !== null) {
+      record = this._reinsertAfter(reinsertRecord, record._prev, index);
+    } else if (record.currentIndex != index) {
+      record.currentIndex = index;
+      this._addToMoves(record, index);
+    }
+    return record;
+  }
+  /**
+   * Get rid of any excess {@link IterableChangeRecord_}s from the previous collection
+   *
+   * - `record` The first excess {@link IterableChangeRecord_}.
+   *
+   * @internal
+   */
+  _truncate(record) {
+    while (record !== null) {
+      const nextRecord = record._next;
+      this._addToRemovals(this._unlink(record));
+      record = nextRecord;
+    }
+    if (this._unlinkedRecords !== null) {
+      this._unlinkedRecords.clear();
+    }
+    if (this._additionsTail !== null) {
+      this._additionsTail._nextAdded = null;
+    }
+    if (this._movesTail !== null) {
+      this._movesTail._nextMoved = null;
+    }
+    if (this._itTail !== null) {
+      this._itTail._next = null;
+    }
+    if (this._removalsTail !== null) {
+      this._removalsTail._nextRemoved = null;
+    }
+    if (this._identityChangesTail !== null) {
+      this._identityChangesTail._nextIdentityChange = null;
+    }
+  }
+  /** @internal */
+  _reinsertAfter(record, prevRecord, index) {
+    if (this._unlinkedRecords !== null) {
+      this._unlinkedRecords.remove(record);
+    }
+    const prev = record._prevRemoved;
+    const next = record._nextRemoved;
+    if (prev === null) {
+      this._removalsHead = next;
+    } else {
+      prev._nextRemoved = next;
+    }
+    if (next === null) {
+      this._removalsTail = prev;
+    } else {
+      next._prevRemoved = prev;
+    }
+    this._insertAfter(record, prevRecord, index);
+    this._addToMoves(record, index);
+    return record;
+  }
+  /** @internal */
+  _moveAfter(record, prevRecord, index) {
+    this._unlink(record);
+    this._insertAfter(record, prevRecord, index);
+    this._addToMoves(record, index);
+    return record;
+  }
+  /** @internal */
+  _addAfter(record, prevRecord, index) {
+    this._insertAfter(record, prevRecord, index);
+    if (this._additionsTail === null) {
+      this._additionsTail = this._additionsHead = record;
+    } else {
+      this._additionsTail = this._additionsTail._nextAdded = record;
+    }
+    return record;
+  }
+  /** @internal */
+  _insertAfter(record, prevRecord, index) {
+    const next = prevRecord === null ? this._itHead : prevRecord._next;
+    record._next = next;
+    record._prev = prevRecord;
+    if (next === null) {
+      this._itTail = record;
+    } else {
+      next._prev = record;
+    }
+    if (prevRecord === null) {
+      this._itHead = record;
+    } else {
+      prevRecord._next = record;
+    }
+    if (this._linkedRecords === null) {
+      this._linkedRecords = new _DuplicateMap();
+    }
+    this._linkedRecords.put(record);
+    record.currentIndex = index;
+    return record;
+  }
+  /** @internal */
+  _remove(record) {
+    return this._addToRemovals(this._unlink(record));
+  }
+  /** @internal */
+  _unlink(record) {
+    if (this._linkedRecords !== null) {
+      this._linkedRecords.remove(record);
+    }
+    const prev = record._prev;
+    const next = record._next;
+    if (prev === null) {
+      this._itHead = next;
+    } else {
+      prev._next = next;
+    }
+    if (next === null) {
+      this._itTail = prev;
+    } else {
+      next._prev = prev;
+    }
+    return record;
+  }
+  /** @internal */
+  _addToMoves(record, toIndex) {
+    if (record.previousIndex === toIndex) {
+      return record;
+    }
+    if (this._movesTail === null) {
+      this._movesTail = this._movesHead = record;
+    } else {
+      this._movesTail = this._movesTail._nextMoved = record;
+    }
+    return record;
+  }
+  _addToRemovals(record) {
+    if (this._unlinkedRecords === null) {
+      this._unlinkedRecords = new _DuplicateMap();
+    }
+    this._unlinkedRecords.put(record);
+    record.currentIndex = null;
+    record._nextRemoved = null;
+    if (this._removalsTail === null) {
+      this._removalsTail = this._removalsHead = record;
+      record._prevRemoved = null;
+    } else {
+      record._prevRemoved = this._removalsTail;
+      this._removalsTail = this._removalsTail._nextRemoved = record;
+    }
+    return record;
+  }
+  /** @internal */
+  _addIdentityChange(record, item) {
+    record.item = item;
+    if (this._identityChangesTail === null) {
+      this._identityChangesTail = this._identityChangesHead = record;
+    } else {
+      this._identityChangesTail = this._identityChangesTail._nextIdentityChange = record;
+    }
+    return record;
+  }
+};
+var IterableChangeRecord_ = class {
+  item;
+  trackById;
+  currentIndex = null;
+  previousIndex = null;
+  /** @internal */
+  _nextPrevious = null;
+  /** @internal */
+  _prev = null;
+  /** @internal */
+  _next = null;
+  /** @internal */
+  _prevDup = null;
+  /** @internal */
+  _nextDup = null;
+  /** @internal */
+  _prevRemoved = null;
+  /** @internal */
+  _nextRemoved = null;
+  /** @internal */
+  _nextAdded = null;
+  /** @internal */
+  _nextMoved = null;
+  /** @internal */
+  _nextIdentityChange = null;
+  constructor(item, trackById) {
+    this.item = item;
+    this.trackById = trackById;
+  }
+};
+var _DuplicateItemRecordList = class {
+  /** @internal */
+  _head = null;
+  /** @internal */
+  _tail = null;
+  /**
+   * Append the record to the list of duplicates.
+   *
+   * Note: by design all records in the list of duplicates hold the same value in record.item.
+   */
+  add(record) {
+    if (this._head === null) {
+      this._head = this._tail = record;
+      record._nextDup = null;
+      record._prevDup = null;
+    } else {
+      this._tail._nextDup = record;
+      record._prevDup = this._tail;
+      record._nextDup = null;
+      this._tail = record;
+    }
+  }
+  // Returns a IterableChangeRecord_ having IterableChangeRecord_.trackById == trackById and
+  // IterableChangeRecord_.currentIndex >= atOrAfterIndex
+  get(trackById, atOrAfterIndex) {
+    let record;
+    for (record = this._head; record !== null; record = record._nextDup) {
+      if ((atOrAfterIndex === null || atOrAfterIndex <= record.currentIndex) && Object.is(record.trackById, trackById)) {
+        return record;
+      }
+    }
+    return null;
+  }
+  /**
+   * Remove one {@link IterableChangeRecord_} from the list of duplicates.
+   *
+   * Returns whether the list of duplicates is empty.
+   */
+  remove(record) {
+    const prev = record._prevDup;
+    const next = record._nextDup;
+    if (prev === null) {
+      this._head = next;
+    } else {
+      prev._nextDup = next;
+    }
+    if (next === null) {
+      this._tail = prev;
+    } else {
+      next._prevDup = prev;
+    }
+    return this._head === null;
+  }
+};
+var _DuplicateMap = class {
+  map = /* @__PURE__ */ new Map();
+  put(record) {
+    const key = record.trackById;
+    let duplicates = this.map.get(key);
+    if (!duplicates) {
+      duplicates = new _DuplicateItemRecordList();
+      this.map.set(key, duplicates);
+    }
+    duplicates.add(record);
+  }
+  /**
+   * Retrieve the `value` using key. Because the IterableChangeRecord_ value may be one which we
+   * have already iterated over, we use the `atOrAfterIndex` to pretend it is not there.
+   *
+   * Use case: `[a, b, c, a, a]` if we are at index `3` which is the second `a` then asking if we
+   * have any more `a`s needs to return the second `a`.
+   */
+  get(trackById, atOrAfterIndex) {
+    const key = trackById;
+    const recordList = this.map.get(key);
+    return recordList ? recordList.get(trackById, atOrAfterIndex) : null;
+  }
+  /**
+   * Removes a {@link IterableChangeRecord_} from the list of duplicates.
+   *
+   * The list of duplicates also is removed from the map if it gets empty.
+   */
+  remove(record) {
+    const key = record.trackById;
+    const recordList = this.map.get(key);
+    if (recordList.remove(record)) {
+      this.map.delete(key);
+    }
+    return record;
+  }
+  get isEmpty() {
+    return this.map.size === 0;
+  }
+  clear() {
+    this.map.clear();
+  }
+};
+function getPreviousIndex(item, addRemoveOffset, moveOffsets) {
+  const previousIndex = item.previousIndex;
+  if (previousIndex === null)
+    return previousIndex;
+  let moveOffset = 0;
+  if (moveOffsets && previousIndex < moveOffsets.length) {
+    moveOffset = moveOffsets[previousIndex];
+  }
+  return previousIndex + addRemoveOffset + moveOffset;
+}
+var DefaultKeyValueDifferFactory = class {
+  constructor() {
+  }
+  supports(obj) {
+    return obj instanceof Map || isJsObject(obj);
+  }
+  create() {
+    return new DefaultKeyValueDiffer();
+  }
+};
+var DefaultKeyValueDiffer = class {
+  _records = /* @__PURE__ */ new Map();
+  _mapHead = null;
+  // _appendAfter is used in the check loop
+  _appendAfter = null;
+  _previousMapHead = null;
+  _changesHead = null;
+  _changesTail = null;
+  _additionsHead = null;
+  _additionsTail = null;
+  _removalsHead = null;
+  _removalsTail = null;
+  get isDirty() {
+    return this._additionsHead !== null || this._changesHead !== null || this._removalsHead !== null;
+  }
+  forEachItem(fn) {
+    let record;
+    for (record = this._mapHead; record !== null; record = record._next) {
+      fn(record);
+    }
+  }
+  forEachPreviousItem(fn) {
+    let record;
+    for (record = this._previousMapHead; record !== null; record = record._nextPrevious) {
+      fn(record);
+    }
+  }
+  forEachChangedItem(fn) {
+    let record;
+    for (record = this._changesHead; record !== null; record = record._nextChanged) {
+      fn(record);
+    }
+  }
+  forEachAddedItem(fn) {
+    let record;
+    for (record = this._additionsHead; record !== null; record = record._nextAdded) {
+      fn(record);
+    }
+  }
+  forEachRemovedItem(fn) {
+    let record;
+    for (record = this._removalsHead; record !== null; record = record._nextRemoved) {
+      fn(record);
+    }
+  }
+  diff(map2) {
+    if (!map2) {
+      map2 = /* @__PURE__ */ new Map();
+    } else if (!(map2 instanceof Map || isJsObject(map2))) {
+      throw new RuntimeError(900, ngDevMode && `Error trying to diff '${stringify(map2)}'. Only maps and objects are allowed`);
+    }
+    return this.check(map2) ? this : null;
+  }
+  onDestroy() {
+  }
+  /**
+   * Check the current state of the map vs the previous.
+   * The algorithm is optimised for when the keys do no change.
+   */
+  check(map2) {
+    this._reset();
+    let insertBefore = this._mapHead;
+    this._appendAfter = null;
+    this._forEach(map2, (value, key) => {
+      if (insertBefore && insertBefore.key === key) {
+        this._maybeAddToChanges(insertBefore, value);
+        this._appendAfter = insertBefore;
+        insertBefore = insertBefore._next;
+      } else {
+        const record = this._getOrCreateRecordForKey(key, value);
+        insertBefore = this._insertBeforeOrAppend(insertBefore, record);
+      }
+    });
+    if (insertBefore) {
+      if (insertBefore._prev) {
+        insertBefore._prev._next = null;
+      }
+      this._removalsHead = insertBefore;
+      for (let record = insertBefore; record !== null; record = record._nextRemoved) {
+        if (record === this._mapHead) {
+          this._mapHead = null;
+        }
+        this._records.delete(record.key);
+        record._nextRemoved = record._next;
+        record.previousValue = record.currentValue;
+        record.currentValue = null;
+        record._prev = null;
+        record._next = null;
+      }
+    }
+    if (this._changesTail)
+      this._changesTail._nextChanged = null;
+    if (this._additionsTail)
+      this._additionsTail._nextAdded = null;
+    return this.isDirty;
+  }
+  /**
+   * Inserts a record before `before` or append at the end of the list when `before` is null.
+   *
+   * Notes:
+   * - This method appends at `this._appendAfter`,
+   * - This method updates `this._appendAfter`,
+   * - The return value is the new value for the insertion pointer.
+   */
+  _insertBeforeOrAppend(before, record) {
+    if (before) {
+      const prev = before._prev;
+      record._next = before;
+      record._prev = prev;
+      before._prev = record;
+      if (prev) {
+        prev._next = record;
+      }
+      if (before === this._mapHead) {
+        this._mapHead = record;
+      }
+      this._appendAfter = before;
+      return before;
+    }
+    if (this._appendAfter) {
+      this._appendAfter._next = record;
+      record._prev = this._appendAfter;
+    } else {
+      this._mapHead = record;
+    }
+    this._appendAfter = record;
+    return null;
+  }
+  _getOrCreateRecordForKey(key, value) {
+    if (this._records.has(key)) {
+      const record2 = this._records.get(key);
+      this._maybeAddToChanges(record2, value);
+      const prev = record2._prev;
+      const next = record2._next;
+      if (prev) {
+        prev._next = next;
+      }
+      if (next) {
+        next._prev = prev;
+      }
+      record2._next = null;
+      record2._prev = null;
+      return record2;
+    }
+    const record = new KeyValueChangeRecord_(key);
+    this._records.set(key, record);
+    record.currentValue = value;
+    this._addToAdditions(record);
+    return record;
+  }
+  /** @internal */
+  _reset() {
+    if (this.isDirty) {
+      let record;
+      this._previousMapHead = this._mapHead;
+      for (record = this._previousMapHead; record !== null; record = record._next) {
+        record._nextPrevious = record._next;
+      }
+      for (record = this._changesHead; record !== null; record = record._nextChanged) {
+        record.previousValue = record.currentValue;
+      }
+      for (record = this._additionsHead; record != null; record = record._nextAdded) {
+        record.previousValue = record.currentValue;
+      }
+      this._changesHead = this._changesTail = null;
+      this._additionsHead = this._additionsTail = null;
+      this._removalsHead = null;
+    }
+  }
+  // Add the record or a given key to the list of changes only when the value has actually changed
+  _maybeAddToChanges(record, newValue) {
+    if (!Object.is(newValue, record.currentValue)) {
+      record.previousValue = record.currentValue;
+      record.currentValue = newValue;
+      this._addToChanges(record);
+    }
+  }
+  _addToAdditions(record) {
+    if (this._additionsHead === null) {
+      this._additionsHead = this._additionsTail = record;
+    } else {
+      this._additionsTail._nextAdded = record;
+      this._additionsTail = record;
+    }
+  }
+  _addToChanges(record) {
+    if (this._changesHead === null) {
+      this._changesHead = this._changesTail = record;
+    } else {
+      this._changesTail._nextChanged = record;
+      this._changesTail = record;
+    }
+  }
+  /** @internal */
+  _forEach(obj, fn) {
+    if (obj instanceof Map) {
+      obj.forEach(fn);
+    } else {
+      Object.keys(obj).forEach((k) => fn(obj[k], k));
+    }
+  }
+};
+var KeyValueChangeRecord_ = class {
+  key;
+  previousValue = null;
+  currentValue = null;
+  /** @internal */
+  _nextPrevious = null;
+  /** @internal */
+  _next = null;
+  /** @internal */
+  _prev = null;
+  /** @internal */
+  _nextAdded = null;
+  /** @internal */
+  _nextRemoved = null;
+  /** @internal */
+  _nextChanged = null;
+  constructor(key) {
+    this.key = key;
+  }
+};
+function defaultIterableDiffersFactory() {
+  return new IterableDiffers([new DefaultIterableDifferFactory()]);
+}
+var IterableDiffers = class _IterableDiffers {
+  factories;
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _IterableDiffers,
+      providedIn: "root",
+      factory: defaultIterableDiffersFactory
+    })
+  );
+  constructor(factories) {
+    this.factories = factories;
+  }
+  static create(factories, parent) {
+    if (parent != null) {
+      const copied = parent.factories.slice();
+      factories = factories.concat(copied);
+    }
+    return new _IterableDiffers(factories);
+  }
+  /**
+   * Takes an array of {@link IterableDifferFactory} and returns a provider used to extend the
+   * inherited {@link IterableDiffers} instance with the provided factories and return a new
+   * {@link IterableDiffers} instance.
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * The following example shows how to extend an existing list of factories,
+   * which will only be applied to the injector for this component and its children.
+   * This step is all that's required to make a new {@link IterableDiffer} available.
+   *
+   * ```ts
+   * @Component({
+   *   viewProviders: [
+   *     IterableDiffers.extend([new ImmutableListDiffer()])
+   *   ]
+   * })
+   * ```
+   */
+  static extend(factories) {
+    return {
+      provide: _IterableDiffers,
+      useFactory: (parent) => {
+        return _IterableDiffers.create(factories, parent || defaultIterableDiffersFactory());
+      },
+      // Dependency technically isn't optional, but we can provide a better error message this way.
+      deps: [[_IterableDiffers, new SkipSelf(), new Optional()]]
+    };
+  }
+  find(iterable) {
+    const factory = this.factories.find((f) => f.supports(iterable));
+    if (factory != null) {
+      return factory;
+    } else {
+      throw new RuntimeError(901, ngDevMode && `Cannot find a differ supporting object '${iterable}' of type '${getTypeNameForDebugging(iterable)}'`);
+    }
+  }
+};
+function getTypeNameForDebugging(type) {
+  return type["name"] || typeof type;
+}
+function defaultKeyValueDiffersFactory() {
+  return new KeyValueDiffers([new DefaultKeyValueDifferFactory()]);
+}
+var KeyValueDiffers = class _KeyValueDiffers {
+  /** @nocollapse */
+  static ɵprov = (
+    /** @pureOrBreakMyCode */
+    ɵɵdefineInjectable({
+      token: _KeyValueDiffers,
+      providedIn: "root",
+      factory: defaultKeyValueDiffersFactory
+    })
+  );
+  factories;
+  constructor(factories) {
+    this.factories = factories;
+  }
+  static create(factories, parent) {
+    if (parent) {
+      const copied = parent.factories.slice();
+      factories = factories.concat(copied);
+    }
+    return new _KeyValueDiffers(factories);
+  }
+  /**
+   * Takes an array of {@link KeyValueDifferFactory} and returns a provider used to extend the
+   * inherited {@link KeyValueDiffers} instance with the provided factories and return a new
+   * {@link KeyValueDiffers} instance.
+   *
+   * @usageNotes
+   * ### Example
+   *
+   * The following example shows how to extend an existing list of factories,
+   * which will only be applied to the injector for this component and its children.
+   * This step is all that's required to make a new {@link KeyValueDiffer} available.
+   *
+   * ```ts
+   * @Component({
+   *   viewProviders: [
+   *     KeyValueDiffers.extend([new ImmutableMapDiffer()])
+   *   ]
+   * })
+   * ```
+   */
+  static extend(factories) {
+    return {
+      provide: _KeyValueDiffers,
+      useFactory: (parent) => {
+        return _KeyValueDiffers.create(factories, parent || defaultKeyValueDiffersFactory());
+      },
+      // Dependency technically isn't optional, but we can provide a better error message this way.
+      deps: [[_KeyValueDiffers, new SkipSelf(), new Optional()]]
+    };
+  }
+  find(kv) {
+    const factory = this.factories.find((f) => f.supports(kv));
+    if (factory) {
+      return factory;
+    }
+    throw new RuntimeError(901, ngDevMode && `Cannot find a differ supporting object '${kv}'`);
+  }
+};
+var keyValDiff = [new DefaultKeyValueDifferFactory()];
+var iterableDiff = [new DefaultIterableDifferFactory()];
+var defaultIterableDiffers = new IterableDiffers(iterableDiff);
+var defaultKeyValueDiffers = new KeyValueDiffers(keyValDiff);
+var platformCore = createPlatformFactory(null, "core", []);
+var ApplicationModule = class _ApplicationModule {
+  // Inject ApplicationRef to make it eager...
+  constructor(appRef) {
+  }
+  static ɵfac = function ApplicationModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _ApplicationModule)(ɵɵinject(ApplicationRef));
+  };
+  static ɵmod = ɵɵdefineNgModule({ type: _ApplicationModule });
+  static ɵinj = ɵɵdefineInjector({});
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(ApplicationModule, [{
+    type: NgModule
+  }], () => [{ type: ApplicationRef }], null);
+})();
+function internalCreateApplication(config2) {
+  profiler(
+    8
+    /* ProfilerEvent.BootstrapApplicationStart */
+  );
+  try {
+    const { rootComponent, appProviders, platformProviders } = config2;
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && rootComponent !== void 0) {
+      assertStandaloneComponentType(rootComponent);
+    }
+    const platformInjector = createOrReusePlatformInjector(platformProviders);
+    const allAppProviders = [
+      internalProvideZoneChangeDetection({}),
+      { provide: ChangeDetectionScheduler, useExisting: ChangeDetectionSchedulerImpl },
+      errorHandlerEnvironmentInitializer,
+      ...appProviders || []
+    ];
+    const adapter = new EnvironmentNgModuleRefAdapter({
+      providers: allAppProviders,
+      parent: platformInjector,
+      debugName: typeof ngDevMode === "undefined" || ngDevMode ? "Environment Injector" : "",
+      // We skip environment initializers because we need to run them inside the NgZone, which
+      // happens after we get the NgZone instance from the Injector.
+      runEnvironmentInitializers: false
+    });
+    return bootstrap({
+      r3Injector: adapter.injector,
+      platformInjector,
+      rootComponent
+    });
+  } catch (e) {
+    return Promise.reject(e);
+  } finally {
+    profiler(
+      9
+      /* ProfilerEvent.BootstrapApplicationEnd */
+    );
+  }
+}
+var appsWithEventReplay = /* @__PURE__ */ new WeakSet();
+var EAGER_CONTENT_LISTENERS_KEY = "";
+var blockEventQueue = [];
+function shouldEnableEventReplay(injector) {
+  return injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);
+}
+function withEventReplay() {
+  const providers = [
+    {
+      provide: IS_EVENT_REPLAY_ENABLED,
+      useFactory: () => {
+        let isEnabled = true;
+        if (true) {
+          const appId = inject(APP_ID);
+          isEnabled = !!window._ejsas?.[appId];
+        }
+        if (isEnabled) {
+          performanceMarkFeature("NgEventReplay");
+        }
+        return isEnabled;
+      }
+    }
+  ];
+  if (true) {
+    providers.push({
+      provide: ENVIRONMENT_INITIALIZER,
+      useValue: () => {
+        const appRef = inject(ApplicationRef);
+        const { injector } = appRef;
+        if (!appsWithEventReplay.has(appRef)) {
+          const jsActionMap = inject(JSACTION_BLOCK_ELEMENT_MAP);
+          if (shouldEnableEventReplay(injector)) {
+            enableStashEventListenerImpl();
+            const appId = injector.get(APP_ID);
+            const clearStashFn = setStashFn(appId, (rEl, eventName, listenerFn) => {
+              if (rEl.nodeType !== Node.ELEMENT_NODE)
+                return;
+              sharedStashFunction(rEl, eventName, listenerFn);
+              sharedMapFunction(rEl, jsActionMap);
+            });
+            appRef.onDestroy(clearStashFn);
+          }
+        }
+      },
+      multi: true
+    }, {
+      provide: APP_BOOTSTRAP_LISTENER,
+      useFactory: () => {
+        const appRef = inject(ApplicationRef);
+        const { injector } = appRef;
+        return () => {
+          if (!shouldEnableEventReplay(injector) || appsWithEventReplay.has(appRef)) {
+            return;
+          }
+          appsWithEventReplay.add(appRef);
+          const appId = injector.get(APP_ID);
+          appRef.onDestroy(() => {
+            appsWithEventReplay.delete(appRef);
+            if (true) {
+              clearAppScopedEarlyEventContract(appId);
+            }
+          });
+          appRef.whenStable().then(() => {
+            if (appRef.destroyed) {
+              return;
+            }
+            const eventContractDetails = injector.get(JSACTION_EVENT_CONTRACT);
+            initEventReplay(eventContractDetails, injector);
+            const jsActionMap = injector.get(JSACTION_BLOCK_ELEMENT_MAP);
+            jsActionMap.get(EAGER_CONTENT_LISTENERS_KEY)?.forEach(removeListeners);
+            jsActionMap.delete(EAGER_CONTENT_LISTENERS_KEY);
+            const eventContract = eventContractDetails.instance;
+            if (isIncrementalHydrationEnabled(injector)) {
+              appRef.onDestroy(() => eventContract.cleanUp());
+            } else {
+              eventContract.cleanUp();
+            }
+          });
+        };
+      },
+      multi: true
+    });
+  }
+  return providers;
+}
+var initEventReplay = (eventDelegation, injector) => {
+  const appId = injector.get(APP_ID);
+  const earlyJsactionData = window._ejsas[appId];
+  const eventContract = eventDelegation.instance = new EventContract(new EventContractContainer(earlyJsactionData.c));
+  for (const et of earlyJsactionData.et) {
+    eventContract.addEvent(et);
+  }
+  for (const et of earlyJsactionData.etc) {
+    eventContract.addEvent(et);
+  }
+  const eventInfos = getAppScopedQueuedEventInfos(appId);
+  eventContract.replayEarlyEventInfos(eventInfos);
+  clearAppScopedEarlyEventContract(appId);
+  const dispatcher = new EventDispatcher((event) => {
+    invokeRegisteredReplayListeners(injector, event, event.currentTarget);
+  });
+  registerDispatcher$1(eventContract, dispatcher);
+};
+function collectDomEventsInfo(tView, lView, eventTypesToReplay) {
+  const domEventsInfo = /* @__PURE__ */ new Map();
+  const lCleanup = lView[CLEANUP];
+  const tCleanup = tView.cleanup;
+  if (!tCleanup || !lCleanup) {
+    return domEventsInfo;
+  }
+  for (let i = 0; i < tCleanup.length; ) {
+    const firstParam = tCleanup[i++];
+    const secondParam = tCleanup[i++];
+    if (typeof firstParam !== "string") {
+      continue;
+    }
+    const eventType = firstParam;
+    if (!isEarlyEventType(eventType)) {
+      continue;
+    }
+    if (isCaptureEventType(eventType)) {
+      eventTypesToReplay.capture.add(eventType);
+    } else {
+      eventTypesToReplay.regular.add(eventType);
+    }
+    const listenerElement = unwrapRNode(lView[secondParam]);
+    i++;
+    const useCaptureOrIndx = tCleanup[i++];
+    const isDomEvent = typeof useCaptureOrIndx === "boolean" || useCaptureOrIndx >= 0;
+    if (!isDomEvent) {
+      continue;
+    }
+    if (!domEventsInfo.has(listenerElement)) {
+      domEventsInfo.set(listenerElement, [eventType]);
+    } else {
+      domEventsInfo.get(listenerElement).push(eventType);
+    }
+  }
+  return domEventsInfo;
+}
+function invokeRegisteredReplayListeners(injector, event, currentTarget) {
+  const blockName = (currentTarget && currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE)) ?? "";
+  if (/d\d+/.test(blockName)) {
+    hydrateAndInvokeBlockListeners(blockName, injector, event, currentTarget);
+  } else if (event.eventPhase === EventPhase.REPLAY) {
+    invokeListeners(event, currentTarget);
+  }
+}
+function hydrateAndInvokeBlockListeners(blockName, injector, event, currentTarget) {
+  blockEventQueue.push({ event, currentTarget });
+  triggerHydrationFromBlockName(injector, blockName, replayQueuedBlockEvents);
+}
+function replayQueuedBlockEvents(hydratedBlocks) {
+  const queue2 = [...blockEventQueue];
+  const hydrated = new Set(hydratedBlocks);
+  blockEventQueue = [];
+  for (let { event, currentTarget } of queue2) {
+    const blockName = currentTarget.getAttribute(DEFER_BLOCK_SSR_ID_ATTRIBUTE);
+    if (hydrated.has(blockName)) {
+      invokeListeners(event, currentTarget);
+    } else {
+      blockEventQueue.push({ event, currentTarget });
+    }
+  }
+}
+var SerializedViewCollection = class {
+  views = [];
+  indexByContent = /* @__PURE__ */ new Map();
+  add(serializedView) {
+    const viewAsString = JSON.stringify(serializedView);
+    if (!this.indexByContent.has(viewAsString)) {
+      const index = this.views.length;
+      this.views.push(serializedView);
+      this.indexByContent.set(viewAsString, index);
+      return index;
+    }
+    return this.indexByContent.get(viewAsString);
+  }
+  getAll() {
+    return this.views;
+  }
+};
+var tViewSsrId = 0;
+function getSsrId(tView) {
+  if (!tView.ssrId) {
+    tView.ssrId = `t${tViewSsrId++}`;
+  }
+  return tView.ssrId;
+}
+function calcNumRootNodes(tView, lView, tNode) {
+  const rootNodes = [];
+  collectNativeNodes(tView, lView, tNode, rootNodes);
+  return rootNodes.length;
+}
+function calcNumRootNodesInLContainer(lContainer) {
+  const rootNodes = [];
+  collectNativeNodesInLContainer(lContainer, rootNodes);
+  return rootNodes.length;
+}
+function annotateComponentLViewForHydration(lView, context2, injector) {
+  const hostElement = lView[HOST];
+  if (hostElement && !hostElement.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
+    return annotateHostElementForHydration(hostElement, lView, null, context2);
+  }
+  return null;
+}
+function annotateLContainerForHydration(lContainer, context2, injector) {
+  const componentLView = unwrapLView(lContainer[HOST]);
+  const componentLViewNghIndex = annotateComponentLViewForHydration(componentLView, context2);
+  if (componentLViewNghIndex === null) {
+    return;
+  }
+  const hostElement = unwrapRNode(componentLView[HOST]);
+  const rootLView = lContainer[PARENT];
+  const rootLViewNghIndex = annotateHostElementForHydration(hostElement, rootLView, null, context2);
+  const renderer = componentLView[RENDERER];
+  const finalIndex = `${componentLViewNghIndex}|${rootLViewNghIndex}`;
+  renderer.setAttribute(hostElement, NGH_ATTR_NAME, finalIndex);
+}
+function annotateForHydration(appRef, doc) {
+  const injector = appRef.injector;
+  const isI18nHydrationEnabledVal = isI18nHydrationEnabled(injector);
+  const isIncrementalHydrationEnabledVal = isIncrementalHydrationEnabled(injector);
+  const serializedViewCollection = new SerializedViewCollection();
+  const corruptedTextNodes = /* @__PURE__ */ new Map();
+  const viewRefs = appRef._views;
+  const shouldReplayEvents = injector.get(IS_EVENT_REPLAY_ENABLED, EVENT_REPLAY_ENABLED_DEFAULT);
+  const eventTypesToReplay = {
+    regular: /* @__PURE__ */ new Set(),
+    capture: /* @__PURE__ */ new Set()
+  };
+  const deferBlocks = /* @__PURE__ */ new Map();
+  const appId = appRef.injector.get(APP_ID);
+  for (const viewRef of viewRefs) {
+    const lNode = getLNodeForHydration(viewRef);
+    if (lNode !== null) {
+      const context2 = {
+        serializedViewCollection,
+        corruptedTextNodes,
+        isI18nHydrationEnabled: isI18nHydrationEnabledVal,
+        isIncrementalHydrationEnabled: isIncrementalHydrationEnabledVal,
+        i18nChildren: /* @__PURE__ */ new Map(),
+        eventTypesToReplay,
+        shouldReplayEvents,
+        appId,
+        deferBlocks
+      };
+      if (isLContainer(lNode)) {
+        annotateLContainerForHydration(lNode, context2);
+      } else {
+        annotateComponentLViewForHydration(lNode, context2);
+      }
+      insertCorruptedTextNodeMarkers(corruptedTextNodes, doc);
+    }
+  }
+  const serializedViews = serializedViewCollection.getAll();
+  const transferState = injector.get(TransferState);
+  transferState.set(NGH_DATA_KEY, serializedViews);
+  if (deferBlocks.size > 0) {
+    const blocks = {};
+    for (const [id, info] of deferBlocks.entries()) {
+      blocks[id] = info;
+    }
+    transferState.set(NGH_DEFER_BLOCKS_KEY, blocks);
+  }
+  return eventTypesToReplay;
+}
+function serializeLContainer(lContainer, tNode, lView, parentDeferBlockId, context2) {
+  const views = [];
+  let lastViewAsString = "";
+  for (let i = CONTAINER_HEADER_OFFSET; i < lContainer.length; i++) {
+    let childLView = lContainer[i];
+    let template;
+    let numRootNodes;
+    let serializedView;
+    if (isRootView(childLView)) {
+      childLView = childLView[HEADER_OFFSET];
+      if (isLContainer(childLView)) {
+        numRootNodes = calcNumRootNodesInLContainer(childLView) + 1;
+        annotateLContainerForHydration(childLView, context2);
+        const componentLView = unwrapLView(childLView[HOST]);
+        serializedView = {
+          [TEMPLATE_ID]: componentLView[TVIEW].ssrId,
+          [NUM_ROOT_NODES]: numRootNodes
+        };
+      }
+    }
+    if (!serializedView) {
+      const childTView = childLView[TVIEW];
+      if (childTView.type === 1) {
+        template = childTView.ssrId;
+        numRootNodes = 1;
+      } else {
+        template = getSsrId(childTView);
+        numRootNodes = calcNumRootNodes(childTView, childLView, childTView.firstChild);
+      }
+      serializedView = {
+        [TEMPLATE_ID]: template,
+        [NUM_ROOT_NODES]: numRootNodes
+      };
+      let isHydrateNeverBlock = false;
+      if (isDeferBlock(lView[TVIEW], tNode)) {
+        const lDetails = getLDeferBlockDetails(lView, tNode);
+        const tDetails = getTDeferBlockDetails(lView[TVIEW], tNode);
+        if (context2.isIncrementalHydrationEnabled && tDetails.hydrateTriggers !== null) {
+          const deferBlockId = `d${context2.deferBlocks.size}`;
+          if (tDetails.hydrateTriggers.has(
+            7
+            /* DeferBlockTrigger.Never */
+          )) {
+            isHydrateNeverBlock = true;
+          }
+          let rootNodes = [];
+          collectNativeNodesInLContainer(lContainer, rootNodes);
+          const deferBlockInfo = {
+            [NUM_ROOT_NODES]: rootNodes.length,
+            [DEFER_BLOCK_STATE$1]: lDetails[DEFER_BLOCK_STATE]
+          };
+          const serializedTriggers = serializeHydrateTriggers(tDetails.hydrateTriggers);
+          if (serializedTriggers.length > 0) {
+            deferBlockInfo[DEFER_HYDRATE_TRIGGERS] = serializedTriggers;
+          }
+          if (parentDeferBlockId !== null) {
+            deferBlockInfo[DEFER_PARENT_BLOCK_ID] = parentDeferBlockId;
+          }
+          context2.deferBlocks.set(deferBlockId, deferBlockInfo);
+          const node = unwrapRNode(lContainer);
+          if (node !== void 0) {
+            if (node.nodeType === Node.COMMENT_NODE) {
+              annotateDeferBlockAnchorForHydration(node, deferBlockId);
+            }
+          } else {
+            ngDevMode && validateNodeExists(node, childLView, tNode);
+            ngDevMode && validateMatchingNode(node, Node.COMMENT_NODE, null, childLView, tNode, true);
+            annotateDeferBlockAnchorForHydration(node, deferBlockId);
+          }
+          if (!isHydrateNeverBlock) {
+            annotateDeferBlockRootNodesWithJsAction(tDetails, rootNodes, deferBlockId, context2);
+          }
+          parentDeferBlockId = deferBlockId;
+          serializedView[DEFER_BLOCK_ID] = deferBlockId;
+        }
+        serializedView[DEFER_BLOCK_STATE$1] = lDetails[DEFER_BLOCK_STATE];
+      }
+      if (!isHydrateNeverBlock) {
+        Object.assign(serializedView, serializeLView(lContainer[i], parentDeferBlockId, context2));
+      }
+    }
+    const currentViewAsString = JSON.stringify(serializedView);
+    if (views.length > 0 && currentViewAsString === lastViewAsString) {
+      const previousView = views[views.length - 1];
+      previousView[MULTIPLIER] ??= 1;
+      previousView[MULTIPLIER]++;
+    } else {
+      lastViewAsString = currentViewAsString;
+      views.push(serializedView);
+    }
+  }
+  return views;
+}
+function serializeHydrateTriggers(triggerMap) {
+  const serializableDeferBlockTrigger = /* @__PURE__ */ new Set([
+    0,
+    1,
+    2,
+    5
+  ]);
+  let triggers = [];
+  for (let [trigger, details] of triggerMap) {
+    if (serializableDeferBlockTrigger.has(trigger)) {
+      if (details === null) {
+        triggers.push(trigger);
+      } else {
+        triggers.push({ trigger, delay: details.delay });
+      }
+    }
+  }
+  return triggers;
+}
+function appendSerializedNodePath(ngh, tNode, lView, excludedParentNodes) {
+  const noOffsetIndex = tNode.index - HEADER_OFFSET;
+  ngh[NODES] ??= {};
+  ngh[NODES][noOffsetIndex] ??= calcPathForNode(tNode, lView, excludedParentNodes);
+}
+function appendDisconnectedNodeIndex(ngh, tNodeOrNoOffsetIndex) {
+  const noOffsetIndex = typeof tNodeOrNoOffsetIndex === "number" ? tNodeOrNoOffsetIndex : tNodeOrNoOffsetIndex.index - HEADER_OFFSET;
+  ngh[DISCONNECTED_NODES] ??= [];
+  if (!ngh[DISCONNECTED_NODES].includes(noOffsetIndex)) {
+    ngh[DISCONNECTED_NODES].push(noOffsetIndex);
+  }
+}
+function serializeLView(lView, parentDeferBlockId = null, context2) {
+  const ngh = {};
+  const tView = lView[TVIEW];
+  const i18nChildren = getOrComputeI18nChildren(tView, context2);
+  const nativeElementsToEventTypes = context2.shouldReplayEvents ? collectDomEventsInfo(tView, lView, context2.eventTypesToReplay) : null;
+  for (let i = HEADER_OFFSET; i < tView.bindingStartIndex; i++) {
+    const tNode = tView.data[i];
+    const noOffsetIndex = i - HEADER_OFFSET;
+    const i18nData = trySerializeI18nBlock(lView, i, context2);
+    if (i18nData) {
+      ngh[I18N_DATA] ??= {};
+      ngh[I18N_DATA][noOffsetIndex] = i18nData.caseQueue;
+      for (const nodeNoOffsetIndex of i18nData.disconnectedNodes) {
+        appendDisconnectedNodeIndex(ngh, nodeNoOffsetIndex);
+      }
+      for (const nodeNoOffsetIndex of i18nData.disjointNodes) {
+        const tNode2 = tView.data[nodeNoOffsetIndex + HEADER_OFFSET];
+        ngDevMode && assertTNode(tNode2);
+        appendSerializedNodePath(ngh, tNode2, lView, i18nChildren);
+      }
+      continue;
+    }
+    if (!isTNodeShape(tNode)) {
+      continue;
+    }
+    if (isDetachedByI18n(tNode)) {
+      continue;
+    }
+    if (isLContainer(lView[i]) && tNode.tView) {
+      ngh[TEMPLATES] ??= {};
+      ngh[TEMPLATES][noOffsetIndex] = getSsrId(tNode.tView);
+    }
+    if (isDisconnectedNode(tNode, lView) && isContentProjectedNode(tNode)) {
+      appendDisconnectedNodeIndex(ngh, tNode);
+      continue;
+    }
+    if (Array.isArray(tNode.projection)) {
+      for (const projectionHeadTNode of tNode.projection) {
+        if (!projectionHeadTNode)
+          continue;
+        if (!Array.isArray(projectionHeadTNode)) {
+          if (!isProjectionTNode(projectionHeadTNode) && !isInSkipHydrationBlock2(projectionHeadTNode)) {
+            if (isDisconnectedNode(projectionHeadTNode, lView)) {
+              appendDisconnectedNodeIndex(ngh, projectionHeadTNode);
+            } else {
+              appendSerializedNodePath(ngh, projectionHeadTNode, lView, i18nChildren);
+            }
+          }
+        } else {
+          throw unsupportedProjectionOfDomNodes(unwrapRNode(lView[i]));
+        }
+      }
+    }
+    conditionallyAnnotateNodePath(ngh, tNode, lView, i18nChildren);
+    if (isLContainer(lView[i])) {
+      const hostNode = lView[i][HOST];
+      if (Array.isArray(hostNode)) {
+        const targetNode = unwrapRNode(hostNode);
+        if (!targetNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
+          annotateHostElementForHydration(targetNode, hostNode, parentDeferBlockId, context2);
+        }
+      }
+      ngh[CONTAINERS] ??= {};
+      ngh[CONTAINERS][noOffsetIndex] = serializeLContainer(lView[i], tNode, lView, parentDeferBlockId, context2);
+    } else if (Array.isArray(lView[i]) && !isLetDeclaration(tNode)) {
+      const targetNode = unwrapRNode(lView[i][HOST]);
+      if (!targetNode.hasAttribute(SKIP_HYDRATION_ATTR_NAME)) {
+        annotateHostElementForHydration(targetNode, lView[i], parentDeferBlockId, context2);
+      }
+    } else {
+      if (tNode.type & 8) {
+        ngh[ELEMENT_CONTAINERS] ??= {};
+        ngh[ELEMENT_CONTAINERS][noOffsetIndex] = calcNumRootNodes(tView, lView, tNode.child);
+      } else if (tNode.type & (16 | 128)) {
+        let nextTNode = tNode.next;
+        while (nextTNode !== null && nextTNode.type & (16 | 128)) {
+          nextTNode = nextTNode.next;
+        }
+        if (nextTNode && !isInSkipHydrationBlock2(nextTNode)) {
+          appendSerializedNodePath(ngh, nextTNode, lView, i18nChildren);
+        }
+      } else if (tNode.type & 1) {
+        const rNode = unwrapRNode(lView[i]);
+        processTextNodeBeforeSerialization(context2, rNode);
+      }
+    }
+    if (nativeElementsToEventTypes && tNode.type & 2) {
+      const nativeElement = unwrapRNode(lView[i]);
+      if (nativeElementsToEventTypes.has(nativeElement)) {
+        setJSActionAttributes(nativeElement, nativeElementsToEventTypes.get(nativeElement), parentDeferBlockId);
+      }
+    }
+  }
+  return ngh;
+}
+function conditionallyAnnotateNodePath(ngh, tNode, lView, excludedParentNodes) {
+  if (isProjectionTNode(tNode)) {
+    return;
+  }
+  if (tNode.projectionNext && tNode.projectionNext !== tNode.next && !isInSkipHydrationBlock2(tNode.projectionNext)) {
+    appendSerializedNodePath(ngh, tNode.projectionNext, lView, excludedParentNodes);
+  }
+  if (tNode.prev === null && tNode.parent !== null && isDisconnectedNode(tNode.parent, lView) && !isDisconnectedNode(tNode, lView)) {
+    appendSerializedNodePath(ngh, tNode, lView, excludedParentNodes);
+  }
+}
+function componentUsesShadowDomEncapsulation(lView) {
+  const instance = lView[CONTEXT];
+  return instance?.constructor ? getComponentDef(instance.constructor)?.encapsulation === ViewEncapsulation.ShadowDom : false;
+}
+function annotateHostElementForHydration(element, lView, parentDeferBlockId, context2) {
+  const renderer = lView[RENDERER];
+  if (hasI18n(lView) && !isI18nHydrationSupportEnabled() || componentUsesShadowDomEncapsulation(lView)) {
+    renderer.setAttribute(element, SKIP_HYDRATION_ATTR_NAME, "");
+    return null;
+  } else {
+    const ngh = serializeLView(lView, parentDeferBlockId, context2);
+    const index = context2.serializedViewCollection.add(ngh);
+    renderer.setAttribute(element, NGH_ATTR_NAME, index.toString());
+    return index;
+  }
+}
+function annotateDeferBlockAnchorForHydration(comment, deferBlockId) {
+  comment.textContent = `ngh=${deferBlockId}`;
+}
+function insertCorruptedTextNodeMarkers(corruptedTextNodes, doc) {
+  for (const [textNode, marker] of corruptedTextNodes) {
+    textNode.after(doc.createComment(marker));
+  }
+}
+function isContentProjectedNode(tNode) {
+  let currentTNode = tNode;
+  while (currentTNode != null) {
+    if (isComponentHost(currentTNode)) {
+      return true;
+    }
+    currentTNode = currentTNode.parent;
+  }
+  return false;
+}
+function annotateDeferBlockRootNodesWithJsAction(tDetails, rootNodes, parentDeferBlockId, context2) {
+  const actionList = convertHydrateTriggersToJsAction(tDetails.hydrateTriggers);
+  for (let et of actionList) {
+    context2.eventTypesToReplay.regular.add(et);
+  }
+  if (actionList.length > 0) {
+    const elementNodes = rootNodes.filter((rn) => rn.nodeType === Node.ELEMENT_NODE);
+    for (let rNode of elementNodes) {
+      setJSActionAttributes(rNode, actionList, parentDeferBlockId);
+    }
+  }
+}
+var isHydrationSupportEnabled = false;
+var isI18nHydrationRuntimeSupportEnabled = false;
+var isIncrementalHydrationRuntimeSupportEnabled = false;
+var APPLICATION_IS_STABLE_TIMEOUT = 1e4;
+function enableHydrationRuntimeSupport() {
+  if (!isHydrationSupportEnabled) {
+    isHydrationSupportEnabled = true;
+    enableRetrieveHydrationInfoImpl();
+    enableLocateOrCreateElementNodeImpl();
+    enableLocateOrCreateTextNodeImpl();
+    enableLocateOrCreateElementContainerNodeImpl();
+    enableLocateOrCreateContainerAnchorImpl();
+    enableLocateOrCreateContainerRefImpl();
+    enableFindMatchingDehydratedViewImpl();
+    enableApplyRootElementTransformImpl();
+  }
+}
+function enableI18nHydrationRuntimeSupport() {
+  if (!isI18nHydrationRuntimeSupportEnabled) {
+    isI18nHydrationRuntimeSupportEnabled = true;
+    enableLocateOrCreateI18nNodeImpl();
+    enablePrepareI18nBlockForHydrationImpl();
+    enableClaimDehydratedIcuCaseImpl();
+  }
+}
+function enableIncrementalHydrationRuntimeSupport() {
+  if (!isIncrementalHydrationRuntimeSupportEnabled) {
+    isIncrementalHydrationRuntimeSupportEnabled = true;
+    enableRetrieveDeferBlockDataImpl();
+  }
+}
+function printHydrationStats(injector) {
+  const console2 = injector.get(Console);
+  const message = `Angular hydrated ${ngDevMode.hydratedComponents} component(s) and ${ngDevMode.hydratedNodes} node(s), ${ngDevMode.componentsSkippedHydration} component(s) were skipped. ` + (isIncrementalHydrationEnabled(injector) ? `${ngDevMode.deferBlocksWithIncrementalHydration} defer block(s) were configured to use incremental hydration. ` : "") + `Learn more at https://angular.dev/guide/hydration.`;
+  console2.log(message);
+}
+function whenStableWithTimeout(appRef) {
+  const whenStablePromise = appRef.whenStable();
+  if (typeof ngDevMode !== "undefined" && ngDevMode) {
+    const timeoutTime = APPLICATION_IS_STABLE_TIMEOUT;
+    const console2 = appRef.injector.get(Console);
+    const ngZone = appRef.injector.get(NgZone);
+    const timeoutId = ngZone.runOutsideAngular(() => {
+      return setTimeout(() => logWarningOnStableTimedout(timeoutTime, console2), timeoutTime);
+    });
+    whenStablePromise.finally(() => clearTimeout(timeoutId));
+  }
+  return whenStablePromise;
+}
+var CLIENT_RENDER_MODE_FLAG = "ngcm";
+function isClientRenderModeEnabled() {
+  const doc = getDocument();
+  return doc.body.hasAttribute(CLIENT_RENDER_MODE_FLAG);
+}
+function withDomHydration() {
+  const providers = [
+    {
+      provide: IS_HYDRATION_DOM_REUSE_ENABLED,
+      useFactory: () => {
+        let isEnabled = true;
+        if (true) {
+          const transferState = inject(TransferState, { optional: true });
+          isEnabled = !!transferState?.get(NGH_DATA_KEY, null);
+        }
+        if (isEnabled) {
+          performanceMarkFeature("NgHydration");
+        }
+        return isEnabled;
+      }
+    },
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      useValue: () => {
+        setIsI18nHydrationSupportEnabled(false);
+        if (false) {
+          return;
+        }
+        if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
+          verifySsrContentsIntegrity(getDocument());
+          enableHydrationRuntimeSupport();
+        } else if (typeof ngDevMode !== "undefined" && ngDevMode && !isClientRenderModeEnabled()) {
+          const console2 = inject(Console);
+          const message = formatRuntimeError(-505, "Angular hydration was requested on the client, but there was no serialized information present in the server response, thus hydration was not enabled. Make sure the `provideClientHydration()` is included into the list of providers in the server part of the application configuration.");
+          console2.warn(message);
+        }
+      },
+      multi: true
+    }
+  ];
+  if (true) {
+    providers.push({
+      provide: PRESERVE_HOST_CONTENT,
+      useFactory: () => {
+        return inject(IS_HYDRATION_DOM_REUSE_ENABLED);
+      }
+    }, {
+      provide: APP_BOOTSTRAP_LISTENER,
+      useFactory: () => {
+        if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
+          const appRef = inject(ApplicationRef);
+          return () => {
+            whenStableWithTimeout(appRef).then(() => {
+              if (appRef.destroyed) {
+                return;
+              }
+              cleanupDehydratedViews(appRef);
+              if (typeof ngDevMode !== "undefined" && ngDevMode) {
+                countBlocksSkippedByHydration(appRef.injector);
+                printHydrationStats(appRef.injector);
+              }
+            });
+          };
+        }
+        return () => {
+        };
+      },
+      multi: true
+    });
+  }
+  return makeEnvironmentProviders(providers);
+}
+function withI18nSupport() {
+  return [
+    {
+      provide: IS_I18N_HYDRATION_ENABLED,
+      useFactory: () => inject(IS_HYDRATION_DOM_REUSE_ENABLED)
+    },
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      useValue: () => {
+        if (inject(IS_HYDRATION_DOM_REUSE_ENABLED)) {
+          enableI18nHydrationRuntimeSupport();
+          setIsI18nHydrationSupportEnabled(true);
+          performanceMarkFeature("NgI18nHydration");
+        }
+      },
+      multi: true
+    }
+  ];
+}
+function withIncrementalHydration() {
+  const providers = [
+    withEventReplay(),
+    {
+      provide: IS_INCREMENTAL_HYDRATION_ENABLED,
+      useValue: true
+    },
+    {
+      provide: DEHYDRATED_BLOCK_REGISTRY,
+      useClass: DehydratedBlockRegistry
+    },
+    {
+      provide: ENVIRONMENT_INITIALIZER,
+      useValue: () => {
+        enableIncrementalHydrationRuntimeSupport();
+        performanceMarkFeature("NgIncrementalHydration");
+      },
+      multi: true
+    }
+  ];
+  if (true) {
+    providers.push({
+      provide: APP_BOOTSTRAP_LISTENER,
+      useFactory: () => {
+        const injector = inject(Injector);
+        const doc = getDocument();
+        return () => {
+          const deferBlockData = processBlockData(injector);
+          const commentsByBlockId = gatherDeferBlocksCommentNodes(doc, doc.body);
+          processAndInitTriggers(injector, deferBlockData, commentsByBlockId);
+          appendDeferBlocksToJSActionMap(doc, injector);
+        };
+      },
+      multi: true
+    });
+  }
+  return providers;
+}
+function logWarningOnStableTimedout(time, console2) {
+  const message = `Angular hydration expected the ApplicationRef.isStable() to emit \`true\`, but it didn't happen within ${time}ms. Angular hydration logic depends on the application becoming stable as a signal to complete hydration process.`;
+  console2.warn(formatRuntimeError(-506, message));
+}
+function booleanAttribute(value) {
+  return typeof value === "boolean" ? value : value != null && value !== "false";
+}
+function numberAttribute(value, fallbackValue = NaN) {
+  const isNumberValue = !isNaN(parseFloat(value)) && !isNaN(Number(value));
+  return isNumberValue ? Number(value) : fallbackValue;
+}
+var PERFORMANCE_MARK_PREFIX = "🅰️";
+var enablePerfLogging = false;
+function startMeasuring(label) {
+  if (!enablePerfLogging) {
+    return;
+  }
+  const { startLabel } = labels(label);
+  performance.mark(startLabel);
+}
+function stopMeasuring(label) {
+  if (!enablePerfLogging) {
+    return;
+  }
+  const { startLabel, labelName, endLabel } = labels(label);
+  performance.mark(endLabel);
+  performance.measure(labelName, startLabel, endLabel);
+  performance.clearMarks(startLabel);
+  performance.clearMarks(endLabel);
+}
+function labels(label) {
+  const labelName = `${PERFORMANCE_MARK_PREFIX}:${label}`;
+  return {
+    labelName,
+    startLabel: `start:${labelName}`,
+    endLabel: `end:${labelName}`
+  };
+}
+var warningLogged = false;
+function enableProfiling2() {
+  if (!warningLogged && (typeof performance === "undefined" || !performance.mark || !performance.measure)) {
+    warningLogged = true;
+    console.warn("Performance API is not supported on this platform");
+    return;
+  }
+  enablePerfLogging = true;
+}
+function disableProfiling() {
+  enablePerfLogging = false;
+}
+function getClosestComponentName(node) {
+  let currentNode = node;
+  while (currentNode) {
+    const lView = readPatchedLView(currentNode);
+    if (lView !== null) {
+      for (let i = HEADER_OFFSET; i < lView.length; i++) {
+        const current = lView[i];
+        if (!isLView(current) && !isLContainer(current) || current[HOST] !== currentNode) {
+          continue;
+        }
+        const tView = lView[TVIEW];
+        const tNode = getTNode(tView, i);
+        if (isComponentHost(tNode)) {
+          const def = tView.data[tNode.directiveStart + tNode.componentOffset];
+          const name = def.debugInfo?.className || def.type.name;
+          if (name) {
+            return name;
+          } else {
+            break;
+          }
+        }
+      }
+    }
+    currentNode = currentNode.parentNode;
+  }
+  return null;
+}
+function ɵɵngDeclareDirective(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "directive",
+    type: decl.type
+  });
+  return compiler.compileDirectiveDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
+}
+function ɵɵngDeclareClassMetadata(decl) {
+  setClassMetadata(decl.type, decl.decorators, decl.ctorParameters ?? null, decl.propDecorators ?? null);
+}
+function ɵɵngDeclareClassMetadataAsync(decl) {
+  setClassMetadataAsync(decl.type, decl.resolveDeferredDeps, (...types) => {
+    const meta = decl.resolveMetadata(...types);
+    setClassMetadata(decl.type, meta.decorators, meta.ctorParameters, meta.propDecorators);
+  });
+}
+function ɵɵngDeclareComponent(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "component",
+    type: decl.type
+  });
+  return compiler.compileComponentDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵcmp.js`, decl);
+}
+function ɵɵngDeclareFactory(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: getFactoryKind(decl.target),
+    type: decl.type
+  });
+  return compiler.compileFactoryDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵfac.js`, decl);
+}
+function getFactoryKind(target) {
+  switch (target) {
+    case FactoryTarget.Directive:
+      return "directive";
+    case FactoryTarget.Component:
+      return "component";
+    case FactoryTarget.Injectable:
+      return "injectable";
+    case FactoryTarget.Pipe:
+      return "pipe";
+    case FactoryTarget.NgModule:
+      return "NgModule";
+  }
+}
+function ɵɵngDeclareInjectable(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "injectable",
+    type: decl.type
+  });
+  return compiler.compileInjectableDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵprov.js`, decl);
+}
+function ɵɵngDeclareInjector(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "NgModule",
+    type: decl.type
+  });
+  return compiler.compileInjectorDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵinj.js`, decl);
+}
+function ɵɵngDeclareNgModule(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "NgModule",
+    type: decl.type
+  });
+  return compiler.compileNgModuleDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵmod.js`, decl);
+}
+function ɵɵngDeclarePipe(decl) {
+  const compiler = getCompilerFacade({
+    usage: 1,
+    kind: "pipe",
+    type: decl.type
+  });
+  return compiler.compilePipeDeclaration(angularCoreEnv, `ng:///${decl.type.name}/ɵpipe.js`, decl);
+}
+var NOT_SET = Symbol("NOT_SET");
+var EMPTY_CLEANUP_SET = /* @__PURE__ */ new Set();
+var AFTER_RENDER_PHASE_EFFECT_NODE = (() => __spreadProps(__spreadValues({}, SIGNAL_NODE), {
+  consumerIsAlwaysLive: true,
+  consumerAllowSignalWrites: true,
+  value: NOT_SET,
+  cleanup: null,
+  /** Called when the effect becomes dirty */
+  consumerMarkedDirty() {
+    if (this.sequence.impl.executing) {
+      if (this.sequence.lastPhase === null || this.sequence.lastPhase < this.phase) {
+        return;
+      }
+      this.sequence.erroredOrDestroyed = true;
+    }
+    this.sequence.scheduler.notify(
+      7
+      /* NotificationSource.RenderHook */
+    );
+  },
+  phaseFn(previousValue) {
+    this.sequence.lastPhase = this.phase;
+    if (!this.dirty) {
+      return this.signal;
+    }
+    this.dirty = false;
+    if (this.value !== NOT_SET && !consumerPollProducersForChange(this)) {
+      return this.signal;
+    }
+    try {
+      for (const cleanupFn of this.cleanup ?? EMPTY_CLEANUP_SET) {
+        cleanupFn();
+      }
+    } finally {
+      this.cleanup?.clear();
+    }
+    const args = [];
+    if (previousValue !== void 0) {
+      args.push(previousValue);
+    }
+    args.push(this.registerCleanupFn);
+    const prevConsumer = consumerBeforeComputation(this);
+    let newValue;
+    try {
+      newValue = this.userFn.apply(null, args);
+    } finally {
+      consumerAfterComputation(this, prevConsumer);
+    }
+    if (this.value === NOT_SET || !this.equal(this.value, newValue)) {
+      this.value = newValue;
+      this.version++;
+    }
+    return this.signal;
+  }
+}))();
+var AfterRenderEffectSequence = class extends AfterRenderSequence {
+  scheduler;
+  /**
+   * While this sequence is executing, this tracks the last phase which was called by the
+   * `afterRender` machinery.
+   *
+   * When a phase effect is marked dirty, this is used to determine whether it's already run or not.
+   */
+  lastPhase = null;
+  /**
+   * The reactive nodes for each phase, if a phase effect is defined for that phase.
+   *
+   * These are initialized to `undefined` but set in the constructor.
+   */
+  nodes = [void 0, void 0, void 0, void 0];
+  constructor(impl, effectHooks, view, scheduler, destroyRef, snapshot = null) {
+    super(impl, [void 0, void 0, void 0, void 0], view, false, destroyRef, snapshot);
+    this.scheduler = scheduler;
+    for (const phase of AFTER_RENDER_PHASES) {
+      const effectHook = effectHooks[phase];
+      if (effectHook === void 0) {
+        continue;
+      }
+      const node = Object.create(AFTER_RENDER_PHASE_EFFECT_NODE);
+      node.sequence = this;
+      node.phase = phase;
+      node.userFn = effectHook;
+      node.dirty = true;
+      node.signal = () => {
+        producerAccessed(node);
+        return node.value;
+      };
+      node.signal[SIGNAL] = node;
+      node.registerCleanupFn = (fn) => (node.cleanup ??= /* @__PURE__ */ new Set()).add(fn);
+      this.nodes[phase] = node;
+      this.hooks[phase] = (value) => node.phaseFn(value);
+    }
+  }
+  afterRun() {
+    super.afterRun();
+    this.lastPhase = null;
+  }
+  destroy() {
+    super.destroy();
+    for (const node of this.nodes) {
+      for (const fn of node?.cleanup ?? EMPTY_CLEANUP_SET) {
+        fn();
+      }
+    }
+  }
+};
+function afterRenderEffect(callbackOrSpec, options) {
+  ngDevMode && assertNotInReactiveContext(afterRenderEffect, "Call `afterRenderEffect` outside of a reactive context. For example, create the render effect inside the component constructor`.");
+  if (ngDevMode && !options?.injector) {
+    assertInInjectionContext(afterRenderEffect);
+  }
+  if (false) {
+    return NOOP_AFTER_RENDER_REF;
+  }
+  const injector = options?.injector ?? inject(Injector);
+  const scheduler = injector.get(ChangeDetectionScheduler);
+  const manager = injector.get(AfterRenderManager);
+  const tracing = injector.get(TracingService, null, { optional: true });
+  manager.impl ??= injector.get(AfterRenderImpl);
+  let spec = callbackOrSpec;
+  if (typeof spec === "function") {
+    spec = { mixedReadWrite: callbackOrSpec };
+  }
+  const viewContext = injector.get(ViewContext, null, { optional: true });
+  const sequence = new AfterRenderEffectSequence(manager.impl, [spec.earlyRead, spec.write, spec.mixedReadWrite, spec.read], viewContext?.view, scheduler, injector.get(DestroyRef), tracing?.snapshot(null));
+  manager.impl.register(sequence);
+  return sequence;
+}
+function createComponent(component, options) {
+  ngDevMode && assertComponentDef(component);
+  const componentDef = getComponentDef(component);
+  const elementInjector = options.elementInjector || getNullInjector();
+  const factory = new ComponentFactory2(componentDef);
+  return factory.create(elementInjector, options.projectableNodes, options.hostElement, options.environmentInjector, options.directives, options.bindings);
+}
+function reflectComponentType(component) {
+  const componentDef = getComponentDef(component);
+  if (!componentDef)
+    return null;
+  const factory = new ComponentFactory2(componentDef);
+  return {
+    get selector() {
+      return factory.selector;
+    },
+    get type() {
+      return factory.componentType;
+    },
+    get inputs() {
+      return factory.inputs;
+    },
+    get outputs() {
+      return factory.outputs;
+    },
+    get ngContentSelectors() {
+      return factory.ngContentSelectors;
+    },
+    get isStandalone() {
+      return componentDef.standalone;
+    },
+    get isSignal() {
+      return componentDef.signals;
+    }
+  };
+}
+function mergeApplicationConfig(...configs) {
+  return configs.reduce((prev, curr) => {
+    return Object.assign(prev, curr, { providers: [...prev.providers, ...curr.providers] });
+  }, { providers: [] });
+}
+var REQUEST = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "REQUEST" : "", {
+  providedIn: "platform",
+  factory: () => null
+});
+var RESPONSE_INIT = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "RESPONSE_INIT" : "", {
+  providedIn: "platform",
+  factory: () => null
+});
+var REQUEST_CONTEXT = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "REQUEST_CONTEXT" : "", {
+  providedIn: "platform",
+  factory: () => null
+});
+
+export {
+  setCurrentInjector,
+  SIGNAL,
+  Subscription,
+  pipe,
+  Observable,
+  refCount,
+  ConnectableObservable,
+  Subject,
+  BehaviorSubject,
+  EMPTY,
+  from,
+  of,
+  throwError,
+  isObservable,
+  EmptyError,
+  map,
+  combineLatest,
+  mergeMap,
+  mergeAll,
+  concat,
+  defer,
+  forkJoin,
+  filter,
+  catchError,
+  concatMap,
+  defaultIfEmpty,
+  take,
+  finalize,
+  first,
+  takeLast,
+  last2 as last,
+  scan,
+  startWith,
+  switchMap,
+  takeUntil,
+  tap,
+  setAlternateWeakRefImpl,
+  XSS_SECURITY_URL,
+  RuntimeError,
+  formatRuntimeError,
+  _global,
+  stringify,
+  truncateMiddle,
+  forwardRef,
+  resolveForwardRef,
+  ɵɵdefineInjectable,
+  defineInjectable,
+  ɵɵdefineInjector,
+  getInjectableDef,
+  isInjectable,
+  NG_PROV_DEF,
+  NG_INJ_DEF,
+  InjectionToken,
+  setInjectorProfilerContext,
+  isEnvironmentProviders,
+  NG_COMP_DEF,
+  NG_DIR_DEF,
+  NG_PIPE_DEF,
+  NG_MOD_DEF,
+  NG_ELEMENT_ID,
+  ɵɵinject,
+  ɵɵinvalidFactoryDep,
+  inject,
+  convertToBitFlags,
+  ENVIRONMENT_INITIALIZER,
+  INJECTOR$1,
+  getComponentDef,
+  isStandalone,
+  makeEnvironmentProviders,
+  provideEnvironmentInitializer,
+  importProvidersFrom,
+  INJECTOR_SCOPE,
+  EnvironmentInjector,
+  R3Injector,
+  runInInjectionContext,
+  assertInInjectionContext,
+  CONTAINER_HEADER_OFFSET,
+  store,
+  ɵɵenableBindings,
+  ɵɵdisableBindings,
+  ɵɵrestoreView,
+  ɵɵresetView,
+  ɵɵnamespaceSVG,
+  ɵɵnamespaceMathML,
+  ɵɵnamespaceHTML,
+  createInjector,
+  Injector,
+  DOCUMENT,
+  DestroyRef,
+  ErrorHandler,
+  INTERNAL_APPLICATION_ERROR_HANDLER,
+  provideBrowserGlobalErrorListeners,
+  isSignal,
+  ɵunwrapWritableSignal,
+  signal,
+  ChangeDetectionScheduler,
+  ZONELESS_ENABLED,
+  assertNotInReactiveContext,
+  PendingTasksInternal,
+  PendingTasks,
+  EffectScheduler,
+  noSideEffects,
+  Inject,
+  Optional,
+  Self,
+  SkipSelf,
+  Host,
+  Type,
+  ReflectionCapabilities,
+  SimpleChange,
+  ɵɵNgOnChangesFeature,
+  ɵɵgetInheritedFactory,
+  ɵɵinjectAttribute,
+  Attribute2 as Attribute,
+  Injectable,
+  ElementRef,
+  QueryList,
+  ChangeDetectionStrategy,
+  LContext,
+  getLContext,
+  getDirectives,
+  Framework,
+  AcxChangeDetectionStrategy,
+  AcxViewEncapsulation,
+  getHostElement,
+  setDocument,
+  getDocument,
+  APP_ID,
+  PLATFORM_INITIALIZER,
+  PLATFORM_ID,
+  PACKAGE_ROOT_URL,
+  ANIMATION_MODULE_TYPE,
+  CSP_NONCE,
+  IMAGE_CONFIG_DEFAULTS,
+  IMAGE_CONFIG,
+  makeStateKey,
+  TransferState,
+  IS_HYDRATION_DOM_REUSE_ENABLED,
+  IS_INCREMENTAL_HYDRATION_ENABLED,
+  JSACTION_BLOCK_ELEMENT_MAP,
+  JSACTION_EVENT_CONTRACT,
+  DEHYDRATED_BLOCK_REGISTRY,
+  SSR_CONTENT_INTEGRITY_MARKER,
+  HydrationStatus,
+  readHydrationInfo,
+  ViewEncapsulation,
+  unwrapSafeValue,
+  allowSanitizationBypassAndThrow,
+  getSanitizationBypassType,
+  bypassSanitizationTrustHtml,
+  bypassSanitizationTrustStyle,
+  bypassSanitizationTrustScript,
+  bypassSanitizationTrustUrl,
+  bypassSanitizationTrustResourceUrl,
+  _sanitizeUrl,
+  _sanitizeHtml,
+  SecurityContext,
+  ɵɵsanitizeHtml,
+  ɵɵsanitizeStyle,
+  ɵɵsanitizeUrl,
+  ɵɵsanitizeResourceUrl,
+  ɵɵsanitizeScript,
+  ɵɵtrustConstantHtml,
+  ɵɵtrustConstantResourceUrl,
+  ɵɵsanitizeUrlOrResourceUrl,
+  provideNgReflectAttributes,
+  CUSTOM_ELEMENTS_SCHEMA,
+  NO_ERRORS_SCHEMA,
+  ɵsetUnknownElementStrictMode,
+  ɵgetUnknownElementStrictMode,
+  ɵsetUnknownPropertyStrictMode,
+  ɵgetUnknownPropertyStrictMode,
+  ɵɵresolveWindow,
+  ɵɵresolveDocument,
+  ɵɵresolveBody,
+  NO_CHANGE,
+  ɵɵadvance,
+  RendererStyleFlags2,
+  ViewRef,
+  isViewDirty,
+  markForRefresh,
+  TemplateRef,
+  ComponentRef$1,
+  ComponentFactory$1,
+  ComponentFactoryResolver$1,
+  RendererFactory2,
+  Renderer2,
+  Sanitizer,
+  isNgModule,
+  depsTracker,
+  NOT_FOUND_CHECK_ONLY_ELEMENT_INJECTOR,
+  ɵɵdirectiveInject,
+  ɵɵinvalidFactory,
+  devModeEqual,
+  inputBinding,
+  outputBinding,
+  twoWayBinding,
+  ComponentFactory2 as ComponentFactory,
+  ComponentRef2 as ComponentRef,
+  ViewContainerRef,
+  resolveComponentResources,
+  isComponentDefPendingResolution,
+  clearResolutionOfComponentResourcesQueue,
+  restoreComponentResolutionQueue,
+  registerNgModuleType,
+  setAllowDuplicateNgModuleIdsForTest,
+  ɵɵvalidateIframeAttribute,
+  performanceMarkFeature,
+  NgModuleRef$1,
+  NgModuleFactory$1,
+  createNgModule,
+  createNgModuleRef,
+  NgModuleRef2 as NgModuleRef,
+  NgModuleFactory2 as NgModuleFactory,
+  createEnvironmentInjector,
+  ɵɵdefineComponent,
+  ɵɵdefineNgModule,
+  ɵɵdefineDirective,
+  ɵɵdefinePipe,
+  ɵɵInheritDefinitionFeature,
+  ɵɵCopyDefinitionFeature,
+  ɵɵHostDirectivesFeature,
+  ɵɵtemplate,
+  DeferBlockState,
+  DeferBlockBehavior,
+  TracingAction,
+  TracingService,
+  EventEmitter,
+  NgZone,
+  NoopNgZone,
+  AfterRenderManager,
+  afterEveryRender,
+  afterNextRender,
+  TimerScheduler,
+  DEFER_BLOCK_DEPENDENCY_INTERCEPTOR,
+  DEFER_BLOCK_CONFIG,
+  renderDeferBlockState,
+  ɵɵdeferEnableTimerScheduling,
+  getAsyncClassMetadataFn,
+  setClassMetadataAsync,
+  setClassMetadata,
+  Console,
+  getDeferBlocks$1,
+  enableProfiling,
+  publishExternalGlobalUtil,
+  TESTABILITY,
+  TESTABILITY_GETTER,
+  Testability,
+  TestabilityRegistry,
+  setTestabilityGetter,
+  isPromise2 as isPromise,
+  isSubscribable,
+  APP_INITIALIZER,
+  provideAppInitializer,
+  ApplicationInitStatus,
+  APP_BOOTSTRAP_LISTENER,
+  isBoundToModule,
+  NgProbeToken,
+  ApplicationRef,
+  triggerResourceLoading,
+  ɵɵdefer,
+  ɵɵdeferWhen,
+  ɵɵdeferPrefetchWhen,
+  ɵɵdeferHydrateWhen,
+  ɵɵdeferHydrateNever,
+  ɵɵdeferOnIdle,
+  ɵɵdeferPrefetchOnIdle,
+  ɵɵdeferHydrateOnIdle,
+  ɵɵdeferOnImmediate,
+  ɵɵdeferPrefetchOnImmediate,
+  ɵɵdeferHydrateOnImmediate,
+  ɵɵdeferOnTimer,
+  ɵɵdeferPrefetchOnTimer,
+  ɵɵdeferHydrateOnTimer,
+  ɵɵdeferOnHover,
+  ɵɵdeferPrefetchOnHover,
+  ɵɵdeferHydrateOnHover,
+  ɵɵdeferOnInteraction,
+  ɵɵdeferPrefetchOnInteraction,
+  ɵɵdeferHydrateOnInteraction,
+  ɵɵdeferOnViewport,
+  ɵɵdeferPrefetchOnViewport,
+  ɵɵdeferHydrateOnViewport,
+  ɵɵattribute,
+  ɵɵcomponentInstance,
+  ɵɵconditionalCreate,
+  ɵɵconditionalBranchCreate,
+  ɵɵconditional,
+  ɵɵrepeaterTrackByIndex,
+  ɵɵrepeaterTrackByIdentity,
+  ɵɵrepeaterCreate,
+  ɵɵrepeater,
+  ɵɵproperty,
+  ɵɵelementStart,
+  ɵɵelementEnd,
+  ɵɵelement,
+  ɵɵelementContainerStart,
+  ɵɵelementContainerEnd,
+  ɵɵelementContainer,
+  ɵɵgetCurrentView,
+  ɵɵdomProperty,
+  ɵɵsyntheticHostProperty,
+  registerLocaleData,
+  findLocaleData,
+  getLocaleCurrencyCode,
+  getLocalePluralCase,
+  unregisterAllLocaleData,
+  LocaleDataIndex,
+  DEFAULT_LOCALE_ID,
+  setLocaleId,
+  ɵɵi18nStart,
+  ɵɵi18nEnd,
+  ɵɵi18n,
+  ɵɵi18nAttributes,
+  ɵɵi18nExp,
+  ɵɵi18nApply,
+  ɵɵi18nPostprocess,
+  ɵɵlistener,
+  ɵɵsyntheticHostListener,
+  ɵɵnextContext,
+  ɵɵprojectionDef,
+  ɵɵprojection,
+  ɵɵcontentQuery,
+  ɵɵviewQuery,
+  ɵɵqueryRefresh,
+  ɵɵloadQuery,
+  ɵɵcontentQuerySignal,
+  ɵɵviewQuerySignal,
+  ɵɵqueryAdvance,
+  ɵɵreference,
+  ɵɵstyleProp,
+  ɵɵclassProp,
+  ɵɵstyleMap,
+  ɵɵclassMap,
+  ɵɵtext,
+  ɵɵtextInterpolate,
+  ɵɵtextInterpolate1,
+  ɵɵtextInterpolate2,
+  ɵɵtextInterpolate3,
+  ɵɵtextInterpolate4,
+  ɵɵtextInterpolate5,
+  ɵɵtextInterpolate6,
+  ɵɵtextInterpolate7,
+  ɵɵtextInterpolate8,
+  ɵɵtextInterpolateV,
+  ɵɵtwoWayProperty,
+  ɵɵtwoWayBindingSet,
+  ɵɵtwoWayListener,
+  ɵɵdeclareLet,
+  ɵɵstoreLet,
+  ɵɵreadContextLet,
+  ɵɵattachSourceLocations,
+  ɵɵinterpolate,
+  ɵɵinterpolate1,
+  ɵɵinterpolate2,
+  ɵɵinterpolate3,
+  ɵɵinterpolate4,
+  ɵɵinterpolate5,
+  ɵɵinterpolate6,
+  ɵɵinterpolate7,
+  ɵɵinterpolate8,
+  ɵɵinterpolateV,
+  ɵɵProvidersFeature,
+  ɵɵExternalStylesFeature,
+  ɵɵsetComponentScope,
+  ɵɵsetNgModuleScope,
+  ɵɵpureFunction0,
+  ɵɵpureFunction1,
+  ɵɵpureFunction2,
+  ɵɵpureFunction3,
+  ɵɵpureFunction4,
+  ɵɵpureFunction5,
+  ɵɵpureFunction6,
+  ɵɵpureFunction7,
+  ɵɵpureFunction8,
+  ɵɵpureFunctionV,
+  ɵɵpipe,
+  ɵɵpipeBind1,
+  ɵɵpipeBind2,
+  ɵɵpipeBind3,
+  ɵɵpipeBind4,
+  ɵɵpipeBindV,
+  ɵɵtemplateRefExtractor,
+  ɵɵgetComponentDepsFactory,
+  ɵsetClassDebugInfo,
+  ɵɵgetReplaceMetadataURL,
+  ɵɵreplaceMetadata,
+  resetJitOptions,
+  flushModuleScopingQueueAsMuchAsPossible,
+  compileNgModule,
+  compileNgModuleDefs,
+  generateStandaloneInDeclarationsError,
+  resetCompiledComponents,
+  patchComponentDefWithScope,
+  transitiveScopesFor,
+  compileComponent,
+  compileDirective,
+  compilePipe,
+  Directive,
+  Component,
+  Pipe,
+  Input,
+  Output,
+  HostBinding,
+  HostListener,
+  NgModule,
+  ModuleWithComponentFactories,
+  Compiler,
+  COMPILER_OPTIONS,
+  CompilerFactory,
+  PROVIDED_NG_ZONE,
+  internalProvideZoneChangeDetection,
+  provideZoneChangeDetection,
+  ChangeDetectionSchedulerImpl,
+  provideZonelessChangeDetection,
+  LOCALE_ID,
+  DEFAULT_CURRENCY_CODE,
+  TRANSLATIONS,
+  TRANSLATIONS_FORMAT,
+  MissingTranslationStrategy,
+  DebugEventListener,
+  asNativeElements,
+  DebugNode,
+  DebugElement,
+  getDebugNode,
+  OutputEmitterRef,
+  getOutputDestroyRef,
+  untracked2 as untracked,
+  computed,
+  effect,
+  linkedSignal,
+  resource,
+  ResourceImpl,
+  encapsulateResourceError,
+  ɵINPUT_SIGNAL_BRAND_WRITE_TYPE,
+  FactoryTarget,
+  HostAttributeToken,
+  HOST_TAG_NAME,
+  output,
+  input,
+  viewChild,
+  viewChildren,
+  contentChild,
+  contentChildren,
+  model,
+  Query,
+  ContentChildren,
+  ContentChild,
+  ViewChildren,
+  ViewChild,
+  Version,
+  VERSION,
+  compileNgModuleFactory,
+  ENABLE_ROOT_COMPONENT_BOOTSTRAP,
+  PlatformRef,
+  ALLOW_MULTIPLE_PLATFORMS,
+  createPlatform,
+  createPlatformFactory,
+  assertPlatform,
+  getPlatform,
+  destroyPlatform,
+  createOrReusePlatformInjector,
+  providePlatformInitializer,
+  provideCheckNoChangesConfig,
+  isDevMode,
+  enableProdMode,
+  getModuleFactory,
+  getNgModuleById,
+  ChangeDetectorRef,
+  injectChangeDetectorRef,
+  ViewRef2,
+  EmbeddedViewRef,
+  DefaultIterableDiffer,
+  IterableDiffers,
+  KeyValueDiffers,
+  defaultIterableDiffers,
+  defaultKeyValueDiffers,
+  platformCore,
+  ApplicationModule,
+  internalCreateApplication,
+  withEventReplay,
+  annotateForHydration,
+  CLIENT_RENDER_MODE_FLAG,
+  withDomHydration,
+  withI18nSupport,
+  withIncrementalHydration,
+  booleanAttribute,
+  numberAttribute,
+  PERFORMANCE_MARK_PREFIX,
+  startMeasuring,
+  stopMeasuring,
+  enableProfiling2,
+  disableProfiling,
+  getClosestComponentName,
+  ɵɵngDeclareDirective,
+  ɵɵngDeclareClassMetadata,
+  ɵɵngDeclareClassMetadataAsync,
+  ɵɵngDeclareComponent,
+  ɵɵngDeclareFactory,
+  ɵɵngDeclareInjectable,
+  ɵɵngDeclareInjector,
+  ɵɵngDeclareNgModule,
+  ɵɵngDeclarePipe,
+  afterRenderEffect,
+  createComponent,
+  reflectComponentType,
+  mergeApplicationConfig,
+  REQUEST,
+  RESPONSE_INIT,
+  REQUEST_CONTEXT
+};
+/*! Bundled license information:
+
+@angular/core/fesm2022/primitives/di.mjs:
+@angular/core/fesm2022/signal.mjs:
+@angular/core/fesm2022/untracked.mjs:
+@angular/core/fesm2022/weak_ref.mjs:
+@angular/core/fesm2022/primitives/signals.mjs:
+@angular/core/fesm2022/root_effect_scheduler.mjs:
+@angular/core/fesm2022/attribute.mjs:
+@angular/core/fesm2022/resource.mjs:
+@angular/core/fesm2022/primitives/event-dispatch.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+
+@angular/core/fesm2022/debug_node.mjs:
+@angular/core/fesm2022/core.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+  (*!
+   * @license
+   * Copyright Google LLC All Rights Reserved.
+   *
+   * Use of this source code is governed by an MIT-style license that can be
+   * found in the LICENSE file at https://angular.dev/license
+   *)
+
+@angular/core/fesm2022/debug_node.mjs:
+  (*!
+   * @license
+   * Copyright Google LLC All Rights Reserved.
+   *
+   * Use of this source code is governed by an MIT-style license that can be
+   * found in the LICENSE file at https://angular.dev/license
+   *)
+*/
+//# sourceMappingURL=chunk-Y7NS2SYH.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 2 - 0
ai-interview/vite/deps/chunk-Y7NS2SYH.js.map


+ 2552 - 0
ai-interview/vite/deps/chunk-YWBOMLBY.js

@@ -0,0 +1,2552 @@
+import {
+  XhrFactory,
+  parseCookieValue
+} from "./chunk-OPGNYZHR.js";
+import {
+  APP_BOOTSTRAP_LISTENER,
+  ApplicationRef,
+  DOCUMENT,
+  DestroyRef,
+  EnvironmentInjector,
+  Inject,
+  Injectable,
+  InjectionToken,
+  Injector,
+  NgModule,
+  NgZone,
+  Observable,
+  PendingTasks,
+  ResourceImpl,
+  RuntimeError,
+  TransferState,
+  assertInInjectionContext,
+  computed,
+  concatMap,
+  encapsulateResourceError,
+  filter,
+  finalize,
+  formatRuntimeError,
+  from,
+  inject,
+  linkedSignal,
+  makeEnvironmentProviders,
+  makeStateKey,
+  map,
+  of,
+  performanceMarkFeature,
+  runInInjectionContext,
+  setClassMetadata,
+  signal,
+  switchMap,
+  truncateMiddle,
+  ɵɵdefineInjectable,
+  ɵɵdefineInjector,
+  ɵɵdefineNgModule,
+  ɵɵinject
+} from "./chunk-Y7NS2SYH.js";
+import {
+  __async,
+  __objRest,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/@angular/common/fesm2022/module.mjs
+var HttpHandler = class {
+};
+var HttpBackend = class {
+};
+var HttpHeaders = class _HttpHeaders {
+  /**
+   * Internal map of lowercase header names to values.
+   */
+  headers;
+  /**
+   * Internal map of lowercased header names to the normalized
+   * form of the name (the form seen first).
+   */
+  normalizedNames = /* @__PURE__ */ new Map();
+  /**
+   * Complete the lazy initialization of this object (needed before reading).
+   */
+  lazyInit;
+  /**
+   * Queued updates to be materialized the next initialization.
+   */
+  lazyUpdate = null;
+  /**  Constructs a new HTTP header object with the given values.*/
+  constructor(headers) {
+    if (!headers) {
+      this.headers = /* @__PURE__ */ new Map();
+    } else if (typeof headers === "string") {
+      this.lazyInit = () => {
+        this.headers = /* @__PURE__ */ new Map();
+        headers.split("\n").forEach((line) => {
+          const index = line.indexOf(":");
+          if (index > 0) {
+            const name = line.slice(0, index);
+            const value = line.slice(index + 1).trim();
+            this.addHeaderEntry(name, value);
+          }
+        });
+      };
+    } else if (typeof Headers !== "undefined" && headers instanceof Headers) {
+      this.headers = /* @__PURE__ */ new Map();
+      headers.forEach((value, name) => {
+        this.addHeaderEntry(name, value);
+      });
+    } else {
+      this.lazyInit = () => {
+        if (typeof ngDevMode === "undefined" || ngDevMode) {
+          assertValidHeaders(headers);
+        }
+        this.headers = /* @__PURE__ */ new Map();
+        Object.entries(headers).forEach(([name, values]) => {
+          this.setHeaderEntries(name, values);
+        });
+      };
+    }
+  }
+  /**
+   * Checks for existence of a given header.
+   *
+   * @param name The header name to check for existence.
+   *
+   * @returns True if the header exists, false otherwise.
+   */
+  has(name) {
+    this.init();
+    return this.headers.has(name.toLowerCase());
+  }
+  /**
+   * Retrieves the first value of a given header.
+   *
+   * @param name The header name.
+   *
+   * @returns The value string if the header exists, null otherwise
+   */
+  get(name) {
+    this.init();
+    const values = this.headers.get(name.toLowerCase());
+    return values && values.length > 0 ? values[0] : null;
+  }
+  /**
+   * Retrieves the names of the headers.
+   *
+   * @returns A list of header names.
+   */
+  keys() {
+    this.init();
+    return Array.from(this.normalizedNames.values());
+  }
+  /**
+   * Retrieves a list of values for a given header.
+   *
+   * @param name The header name from which to retrieve values.
+   *
+   * @returns A string of values if the header exists, null otherwise.
+   */
+  getAll(name) {
+    this.init();
+    return this.headers.get(name.toLowerCase()) || null;
+  }
+  /**
+   * Appends a new value to the existing set of values for a header
+   * and returns them in a clone of the original instance.
+   *
+   * @param name The header name for which to append the values.
+   * @param value The value to append.
+   *
+   * @returns A clone of the HTTP headers object with the value appended to the given header.
+   */
+  append(name, value) {
+    return this.clone({
+      name,
+      value,
+      op: "a"
+    });
+  }
+  /**
+   * Sets or modifies a value for a given header in a clone of the original instance.
+   * If the header already exists, its value is replaced with the given value
+   * in the returned object.
+   *
+   * @param name The header name.
+   * @param value The value or values to set or override for the given header.
+   *
+   * @returns A clone of the HTTP headers object with the newly set header value.
+   */
+  set(name, value) {
+    return this.clone({
+      name,
+      value,
+      op: "s"
+    });
+  }
+  /**
+   * Deletes values for a given header in a clone of the original instance.
+   *
+   * @param name The header name.
+   * @param value The value or values to delete for the given header.
+   *
+   * @returns A clone of the HTTP headers object with the given value deleted.
+   */
+  delete(name, value) {
+    return this.clone({
+      name,
+      value,
+      op: "d"
+    });
+  }
+  maybeSetNormalizedName(name, lcName) {
+    if (!this.normalizedNames.has(lcName)) {
+      this.normalizedNames.set(lcName, name);
+    }
+  }
+  init() {
+    if (!!this.lazyInit) {
+      if (this.lazyInit instanceof _HttpHeaders) {
+        this.copyFrom(this.lazyInit);
+      } else {
+        this.lazyInit();
+      }
+      this.lazyInit = null;
+      if (!!this.lazyUpdate) {
+        this.lazyUpdate.forEach((update) => this.applyUpdate(update));
+        this.lazyUpdate = null;
+      }
+    }
+  }
+  copyFrom(other) {
+    other.init();
+    Array.from(other.headers.keys()).forEach((key) => {
+      this.headers.set(key, other.headers.get(key));
+      this.normalizedNames.set(key, other.normalizedNames.get(key));
+    });
+  }
+  clone(update) {
+    const clone = new _HttpHeaders();
+    clone.lazyInit = !!this.lazyInit && this.lazyInit instanceof _HttpHeaders ? this.lazyInit : this;
+    clone.lazyUpdate = (this.lazyUpdate || []).concat([update]);
+    return clone;
+  }
+  applyUpdate(update) {
+    const key = update.name.toLowerCase();
+    switch (update.op) {
+      case "a":
+      case "s":
+        let value = update.value;
+        if (typeof value === "string") {
+          value = [value];
+        }
+        if (value.length === 0) {
+          return;
+        }
+        this.maybeSetNormalizedName(update.name, key);
+        const base = (update.op === "a" ? this.headers.get(key) : void 0) || [];
+        base.push(...value);
+        this.headers.set(key, base);
+        break;
+      case "d":
+        const toDelete = update.value;
+        if (!toDelete) {
+          this.headers.delete(key);
+          this.normalizedNames.delete(key);
+        } else {
+          let existing = this.headers.get(key);
+          if (!existing) {
+            return;
+          }
+          existing = existing.filter((value2) => toDelete.indexOf(value2) === -1);
+          if (existing.length === 0) {
+            this.headers.delete(key);
+            this.normalizedNames.delete(key);
+          } else {
+            this.headers.set(key, existing);
+          }
+        }
+        break;
+    }
+  }
+  addHeaderEntry(name, value) {
+    const key = name.toLowerCase();
+    this.maybeSetNormalizedName(name, key);
+    if (this.headers.has(key)) {
+      this.headers.get(key).push(value);
+    } else {
+      this.headers.set(key, [value]);
+    }
+  }
+  setHeaderEntries(name, values) {
+    const headerValues = (Array.isArray(values) ? values : [values]).map((value) => value.toString());
+    const key = name.toLowerCase();
+    this.headers.set(key, headerValues);
+    this.maybeSetNormalizedName(name, key);
+  }
+  /**
+   * @internal
+   */
+  forEach(fn) {
+    this.init();
+    Array.from(this.normalizedNames.keys()).forEach((key) => fn(this.normalizedNames.get(key), this.headers.get(key)));
+  }
+};
+function assertValidHeaders(headers) {
+  for (const [key, value] of Object.entries(headers)) {
+    if (!(typeof value === "string" || typeof value === "number") && !Array.isArray(value)) {
+      throw new Error(`Unexpected value of the \`${key}\` header provided. Expecting either a string, a number or an array, but got: \`${value}\`.`);
+    }
+  }
+}
+var HttpUrlEncodingCodec = class {
+  /**
+   * Encodes a key name for a URL parameter or query-string.
+   * @param key The key name.
+   * @returns The encoded key name.
+   */
+  encodeKey(key) {
+    return standardEncoding(key);
+  }
+  /**
+   * Encodes the value of a URL parameter or query-string.
+   * @param value The value.
+   * @returns The encoded value.
+   */
+  encodeValue(value) {
+    return standardEncoding(value);
+  }
+  /**
+   * Decodes an encoded URL parameter or query-string key.
+   * @param key The encoded key name.
+   * @returns The decoded key name.
+   */
+  decodeKey(key) {
+    return decodeURIComponent(key);
+  }
+  /**
+   * Decodes an encoded URL parameter or query-string value.
+   * @param value The encoded value.
+   * @returns The decoded value.
+   */
+  decodeValue(value) {
+    return decodeURIComponent(value);
+  }
+};
+function paramParser(rawParams, codec) {
+  const map2 = /* @__PURE__ */ new Map();
+  if (rawParams.length > 0) {
+    const params = rawParams.replace(/^\?/, "").split("&");
+    params.forEach((param) => {
+      const eqIdx = param.indexOf("=");
+      const [key, val] = eqIdx == -1 ? [codec.decodeKey(param), ""] : [codec.decodeKey(param.slice(0, eqIdx)), codec.decodeValue(param.slice(eqIdx + 1))];
+      const list = map2.get(key) || [];
+      list.push(val);
+      map2.set(key, list);
+    });
+  }
+  return map2;
+}
+var STANDARD_ENCODING_REGEX = /%(\d[a-f0-9])/gi;
+var STANDARD_ENCODING_REPLACEMENTS = {
+  "40": "@",
+  "3A": ":",
+  "24": "$",
+  "2C": ",",
+  "3B": ";",
+  "3D": "=",
+  "3F": "?",
+  "2F": "/"
+};
+function standardEncoding(v) {
+  return encodeURIComponent(v).replace(STANDARD_ENCODING_REGEX, (s, t) => STANDARD_ENCODING_REPLACEMENTS[t] ?? s);
+}
+function valueToString(value) {
+  return `${value}`;
+}
+var HttpParams = class _HttpParams {
+  map;
+  encoder;
+  updates = null;
+  cloneFrom = null;
+  constructor(options = {}) {
+    this.encoder = options.encoder || new HttpUrlEncodingCodec();
+    if (options.fromString) {
+      if (options.fromObject) {
+        throw new RuntimeError(2805, ngDevMode && "Cannot specify both fromString and fromObject.");
+      }
+      this.map = paramParser(options.fromString, this.encoder);
+    } else if (!!options.fromObject) {
+      this.map = /* @__PURE__ */ new Map();
+      Object.keys(options.fromObject).forEach((key) => {
+        const value = options.fromObject[key];
+        const values = Array.isArray(value) ? value.map(valueToString) : [valueToString(value)];
+        this.map.set(key, values);
+      });
+    } else {
+      this.map = null;
+    }
+  }
+  /**
+   * Reports whether the body includes one or more values for a given parameter.
+   * @param param The parameter name.
+   * @returns True if the parameter has one or more values,
+   * false if it has no value or is not present.
+   */
+  has(param) {
+    this.init();
+    return this.map.has(param);
+  }
+  /**
+   * Retrieves the first value for a parameter.
+   * @param param The parameter name.
+   * @returns The first value of the given parameter,
+   * or `null` if the parameter is not present.
+   */
+  get(param) {
+    this.init();
+    const res = this.map.get(param);
+    return !!res ? res[0] : null;
+  }
+  /**
+   * Retrieves all values for a  parameter.
+   * @param param The parameter name.
+   * @returns All values in a string array,
+   * or `null` if the parameter not present.
+   */
+  getAll(param) {
+    this.init();
+    return this.map.get(param) || null;
+  }
+  /**
+   * Retrieves all the parameters for this body.
+   * @returns The parameter names in a string array.
+   */
+  keys() {
+    this.init();
+    return Array.from(this.map.keys());
+  }
+  /**
+   * Appends a new value to existing values for a parameter.
+   * @param param The parameter name.
+   * @param value The new value to add.
+   * @return A new body with the appended value.
+   */
+  append(param, value) {
+    return this.clone({
+      param,
+      value,
+      op: "a"
+    });
+  }
+  /**
+   * Constructs a new body with appended values for the given parameter name.
+   * @param params parameters and values
+   * @return A new body with the new value.
+   */
+  appendAll(params) {
+    const updates = [];
+    Object.keys(params).forEach((param) => {
+      const value = params[param];
+      if (Array.isArray(value)) {
+        value.forEach((_value) => {
+          updates.push({
+            param,
+            value: _value,
+            op: "a"
+          });
+        });
+      } else {
+        updates.push({
+          param,
+          value,
+          op: "a"
+        });
+      }
+    });
+    return this.clone(updates);
+  }
+  /**
+   * Replaces the value for a parameter.
+   * @param param The parameter name.
+   * @param value The new value.
+   * @return A new body with the new value.
+   */
+  set(param, value) {
+    return this.clone({
+      param,
+      value,
+      op: "s"
+    });
+  }
+  /**
+   * Removes a given value or all values from a parameter.
+   * @param param The parameter name.
+   * @param value The value to remove, if provided.
+   * @return A new body with the given value removed, or with all values
+   * removed if no value is specified.
+   */
+  delete(param, value) {
+    return this.clone({
+      param,
+      value,
+      op: "d"
+    });
+  }
+  /**
+   * Serializes the body to an encoded string, where key-value pairs (separated by `=`) are
+   * separated by `&`s.
+   */
+  toString() {
+    this.init();
+    return this.keys().map((key) => {
+      const eKey = this.encoder.encodeKey(key);
+      return this.map.get(key).map((value) => eKey + "=" + this.encoder.encodeValue(value)).join("&");
+    }).filter((param) => param !== "").join("&");
+  }
+  clone(update) {
+    const clone = new _HttpParams({
+      encoder: this.encoder
+    });
+    clone.cloneFrom = this.cloneFrom || this;
+    clone.updates = (this.updates || []).concat(update);
+    return clone;
+  }
+  init() {
+    if (this.map === null) {
+      this.map = /* @__PURE__ */ new Map();
+    }
+    if (this.cloneFrom !== null) {
+      this.cloneFrom.init();
+      this.cloneFrom.keys().forEach((key) => this.map.set(key, this.cloneFrom.map.get(key)));
+      this.updates.forEach((update) => {
+        switch (update.op) {
+          case "a":
+          case "s":
+            const base = (update.op === "a" ? this.map.get(update.param) : void 0) || [];
+            base.push(valueToString(update.value));
+            this.map.set(update.param, base);
+            break;
+          case "d":
+            if (update.value !== void 0) {
+              let base2 = this.map.get(update.param) || [];
+              const idx = base2.indexOf(valueToString(update.value));
+              if (idx !== -1) {
+                base2.splice(idx, 1);
+              }
+              if (base2.length > 0) {
+                this.map.set(update.param, base2);
+              } else {
+                this.map.delete(update.param);
+              }
+            } else {
+              this.map.delete(update.param);
+              break;
+            }
+        }
+      });
+      this.cloneFrom = this.updates = null;
+    }
+  }
+};
+var HttpContextToken = class {
+  defaultValue;
+  constructor(defaultValue) {
+    this.defaultValue = defaultValue;
+  }
+};
+var HttpContext = class {
+  map = /* @__PURE__ */ new Map();
+  /**
+   * Store a value in the context. If a value is already present it will be overwritten.
+   *
+   * @param token The reference to an instance of `HttpContextToken`.
+   * @param value The value to store.
+   *
+   * @returns A reference to itself for easy chaining.
+   */
+  set(token, value) {
+    this.map.set(token, value);
+    return this;
+  }
+  /**
+   * Retrieve the value associated with the given token.
+   *
+   * @param token The reference to an instance of `HttpContextToken`.
+   *
+   * @returns The stored value or default if one is defined.
+   */
+  get(token) {
+    if (!this.map.has(token)) {
+      this.map.set(token, token.defaultValue());
+    }
+    return this.map.get(token);
+  }
+  /**
+   * Delete the value associated with the given token.
+   *
+   * @param token The reference to an instance of `HttpContextToken`.
+   *
+   * @returns A reference to itself for easy chaining.
+   */
+  delete(token) {
+    this.map.delete(token);
+    return this;
+  }
+  /**
+   * Checks for existence of a given token.
+   *
+   * @param token The reference to an instance of `HttpContextToken`.
+   *
+   * @returns True if the token exists, false otherwise.
+   */
+  has(token) {
+    return this.map.has(token);
+  }
+  /**
+   * @returns a list of tokens currently stored in the context.
+   */
+  keys() {
+    return this.map.keys();
+  }
+};
+function mightHaveBody(method) {
+  switch (method) {
+    case "DELETE":
+    case "GET":
+    case "HEAD":
+    case "OPTIONS":
+    case "JSONP":
+      return false;
+    default:
+      return true;
+  }
+}
+function isArrayBuffer(value) {
+  return typeof ArrayBuffer !== "undefined" && value instanceof ArrayBuffer;
+}
+function isBlob(value) {
+  return typeof Blob !== "undefined" && value instanceof Blob;
+}
+function isFormData(value) {
+  return typeof FormData !== "undefined" && value instanceof FormData;
+}
+function isUrlSearchParams(value) {
+  return typeof URLSearchParams !== "undefined" && value instanceof URLSearchParams;
+}
+var CONTENT_TYPE_HEADER = "Content-Type";
+var ACCEPT_HEADER = "Accept";
+var X_REQUEST_URL_HEADER = "X-Request-URL";
+var TEXT_CONTENT_TYPE = "text/plain";
+var JSON_CONTENT_TYPE = "application/json";
+var ACCEPT_HEADER_VALUE = `${JSON_CONTENT_TYPE}, ${TEXT_CONTENT_TYPE}, */*`;
+var HttpRequest = class _HttpRequest {
+  url;
+  /**
+   * The request body, or `null` if one isn't set.
+   *
+   * Bodies are not enforced to be immutable, as they can include a reference to any
+   * user-defined data type. However, interceptors should take care to preserve
+   * idempotence by treating them as such.
+   */
+  body = null;
+  /**
+   * Outgoing headers for this request.
+   */
+  headers;
+  /**
+   * Shared and mutable context that can be used by interceptors
+   */
+  context;
+  /**
+   * Whether this request should be made in a way that exposes progress events.
+   *
+   * Progress events are expensive (change detection runs on each event) and so
+   * they should only be requested if the consumer intends to monitor them.
+   *
+   * Note: The `FetchBackend` doesn't support progress report on uploads.
+   */
+  reportProgress = false;
+  /**
+   * Whether this request should be sent with outgoing credentials (cookies).
+   */
+  withCredentials = false;
+  /**
+   * When using the fetch implementation and set to `true`, the browser will not abort the associated request if the page that initiated it is unloaded before the request is complete.
+   */
+  keepalive = false;
+  /**
+   * The expected response type of the server.
+   *
+   * This is used to parse the response appropriately before returning it to
+   * the requestee.
+   */
+  responseType = "json";
+  /**
+   * The outgoing HTTP request method.
+   */
+  method;
+  /**
+   * Outgoing URL parameters.
+   *
+   * To pass a string representation of HTTP parameters in the URL-query-string format,
+   * the `HttpParamsOptions`' `fromString` may be used. For example:
+   *
+   * ```ts
+   * new HttpParams({fromString: 'angular=awesome'})
+   * ```
+   */
+  params;
+  /**
+   * The outgoing URL with all URL parameters set.
+   */
+  urlWithParams;
+  /**
+   * The HttpTransferCache option for the request
+   */
+  transferCache;
+  constructor(method, url, third, fourth) {
+    this.url = url;
+    this.method = method.toUpperCase();
+    let options;
+    if (mightHaveBody(this.method) || !!fourth) {
+      this.body = third !== void 0 ? third : null;
+      options = fourth;
+    } else {
+      options = third;
+    }
+    if (options) {
+      this.reportProgress = !!options.reportProgress;
+      this.withCredentials = !!options.withCredentials;
+      this.keepalive = !!options.keepalive;
+      if (!!options.responseType) {
+        this.responseType = options.responseType;
+      }
+      if (!!options.headers) {
+        this.headers = options.headers;
+      }
+      if (!!options.context) {
+        this.context = options.context;
+      }
+      if (!!options.params) {
+        this.params = options.params;
+      }
+      this.transferCache = options.transferCache;
+    }
+    this.headers ??= new HttpHeaders();
+    this.context ??= new HttpContext();
+    if (!this.params) {
+      this.params = new HttpParams();
+      this.urlWithParams = url;
+    } else {
+      const params = this.params.toString();
+      if (params.length === 0) {
+        this.urlWithParams = url;
+      } else {
+        const qIdx = url.indexOf("?");
+        const sep = qIdx === -1 ? "?" : qIdx < url.length - 1 ? "&" : "";
+        this.urlWithParams = url + sep + params;
+      }
+    }
+  }
+  /**
+   * Transform the free-form body into a serialized format suitable for
+   * transmission to the server.
+   */
+  serializeBody() {
+    if (this.body === null) {
+      return null;
+    }
+    if (typeof this.body === "string" || isArrayBuffer(this.body) || isBlob(this.body) || isFormData(this.body) || isUrlSearchParams(this.body)) {
+      return this.body;
+    }
+    if (this.body instanceof HttpParams) {
+      return this.body.toString();
+    }
+    if (typeof this.body === "object" || typeof this.body === "boolean" || Array.isArray(this.body)) {
+      return JSON.stringify(this.body);
+    }
+    return this.body.toString();
+  }
+  /**
+   * Examine the body and attempt to infer an appropriate MIME type
+   * for it.
+   *
+   * If no such type can be inferred, this method will return `null`.
+   */
+  detectContentTypeHeader() {
+    if (this.body === null) {
+      return null;
+    }
+    if (isFormData(this.body)) {
+      return null;
+    }
+    if (isBlob(this.body)) {
+      return this.body.type || null;
+    }
+    if (isArrayBuffer(this.body)) {
+      return null;
+    }
+    if (typeof this.body === "string") {
+      return TEXT_CONTENT_TYPE;
+    }
+    if (this.body instanceof HttpParams) {
+      return "application/x-www-form-urlencoded;charset=UTF-8";
+    }
+    if (typeof this.body === "object" || typeof this.body === "number" || typeof this.body === "boolean") {
+      return JSON_CONTENT_TYPE;
+    }
+    return null;
+  }
+  clone(update = {}) {
+    const method = update.method || this.method;
+    const url = update.url || this.url;
+    const responseType = update.responseType || this.responseType;
+    const keepalive = update.keepalive ?? this.keepalive;
+    const transferCache = update.transferCache ?? this.transferCache;
+    const body = update.body !== void 0 ? update.body : this.body;
+    const withCredentials = update.withCredentials ?? this.withCredentials;
+    const reportProgress = update.reportProgress ?? this.reportProgress;
+    let headers = update.headers || this.headers;
+    let params = update.params || this.params;
+    const context = update.context ?? this.context;
+    if (update.setHeaders !== void 0) {
+      headers = Object.keys(update.setHeaders).reduce((headers2, name) => headers2.set(name, update.setHeaders[name]), headers);
+    }
+    if (update.setParams) {
+      params = Object.keys(update.setParams).reduce((params2, param) => params2.set(param, update.setParams[param]), params);
+    }
+    return new _HttpRequest(method, url, body, {
+      params,
+      headers,
+      context,
+      reportProgress,
+      responseType,
+      withCredentials,
+      transferCache,
+      keepalive
+    });
+  }
+};
+var HttpEventType;
+(function(HttpEventType2) {
+  HttpEventType2[HttpEventType2["Sent"] = 0] = "Sent";
+  HttpEventType2[HttpEventType2["UploadProgress"] = 1] = "UploadProgress";
+  HttpEventType2[HttpEventType2["ResponseHeader"] = 2] = "ResponseHeader";
+  HttpEventType2[HttpEventType2["DownloadProgress"] = 3] = "DownloadProgress";
+  HttpEventType2[HttpEventType2["Response"] = 4] = "Response";
+  HttpEventType2[HttpEventType2["User"] = 5] = "User";
+})(HttpEventType || (HttpEventType = {}));
+var HttpResponseBase = class {
+  /**
+   * All response headers.
+   */
+  headers;
+  /**
+   * Response status code.
+   */
+  status;
+  /**
+   * Textual description of response status code, defaults to OK.
+   *
+   * Do not depend on this.
+   */
+  statusText;
+  /**
+   * URL of the resource retrieved, or null if not available.
+   */
+  url;
+  /**
+   * Whether the status code falls in the 2xx range.
+   */
+  ok;
+  /**
+   * Type of the response, narrowed to either the full response or the header.
+   */
+  type;
+  /**
+   * Super-constructor for all responses.
+   *
+   * The single parameter accepted is an initialization hash. Any properties
+   * of the response passed there will override the default values.
+   */
+  constructor(init, defaultStatus = 200, defaultStatusText = "OK") {
+    this.headers = init.headers || new HttpHeaders();
+    this.status = init.status !== void 0 ? init.status : defaultStatus;
+    this.statusText = init.statusText || defaultStatusText;
+    this.url = init.url || null;
+    this.ok = this.status >= 200 && this.status < 300;
+  }
+};
+var HttpHeaderResponse = class _HttpHeaderResponse extends HttpResponseBase {
+  /**
+   * Create a new `HttpHeaderResponse` with the given parameters.
+   */
+  constructor(init = {}) {
+    super(init);
+  }
+  type = HttpEventType.ResponseHeader;
+  /**
+   * Copy this `HttpHeaderResponse`, overriding its contents with the
+   * given parameter hash.
+   */
+  clone(update = {}) {
+    return new _HttpHeaderResponse({
+      headers: update.headers || this.headers,
+      status: update.status !== void 0 ? update.status : this.status,
+      statusText: update.statusText || this.statusText,
+      url: update.url || this.url || void 0
+    });
+  }
+};
+var HttpResponse = class _HttpResponse extends HttpResponseBase {
+  /**
+   * The response body, or `null` if one was not returned.
+   */
+  body;
+  /**
+   * Construct a new `HttpResponse`.
+   */
+  constructor(init = {}) {
+    super(init);
+    this.body = init.body !== void 0 ? init.body : null;
+  }
+  type = HttpEventType.Response;
+  clone(update = {}) {
+    return new _HttpResponse({
+      body: update.body !== void 0 ? update.body : this.body,
+      headers: update.headers || this.headers,
+      status: update.status !== void 0 ? update.status : this.status,
+      statusText: update.statusText || this.statusText,
+      url: update.url || this.url || void 0
+    });
+  }
+};
+var HttpErrorResponse = class extends HttpResponseBase {
+  name = "HttpErrorResponse";
+  message;
+  error;
+  /**
+   * Errors are never okay, even when the status code is in the 2xx success range.
+   */
+  ok = false;
+  constructor(init) {
+    super(init, 0, "Unknown Error");
+    if (this.status >= 200 && this.status < 300) {
+      this.message = `Http failure during parsing for ${init.url || "(unknown url)"}`;
+    } else {
+      this.message = `Http failure response for ${init.url || "(unknown url)"}: ${init.status} ${init.statusText}`;
+    }
+    this.error = init.error || null;
+  }
+};
+var HTTP_STATUS_CODE_OK = 200;
+var HTTP_STATUS_CODE_NO_CONTENT = 204;
+var HttpStatusCode;
+(function(HttpStatusCode2) {
+  HttpStatusCode2[HttpStatusCode2["Continue"] = 100] = "Continue";
+  HttpStatusCode2[HttpStatusCode2["SwitchingProtocols"] = 101] = "SwitchingProtocols";
+  HttpStatusCode2[HttpStatusCode2["Processing"] = 102] = "Processing";
+  HttpStatusCode2[HttpStatusCode2["EarlyHints"] = 103] = "EarlyHints";
+  HttpStatusCode2[HttpStatusCode2["Ok"] = 200] = "Ok";
+  HttpStatusCode2[HttpStatusCode2["Created"] = 201] = "Created";
+  HttpStatusCode2[HttpStatusCode2["Accepted"] = 202] = "Accepted";
+  HttpStatusCode2[HttpStatusCode2["NonAuthoritativeInformation"] = 203] = "NonAuthoritativeInformation";
+  HttpStatusCode2[HttpStatusCode2["NoContent"] = 204] = "NoContent";
+  HttpStatusCode2[HttpStatusCode2["ResetContent"] = 205] = "ResetContent";
+  HttpStatusCode2[HttpStatusCode2["PartialContent"] = 206] = "PartialContent";
+  HttpStatusCode2[HttpStatusCode2["MultiStatus"] = 207] = "MultiStatus";
+  HttpStatusCode2[HttpStatusCode2["AlreadyReported"] = 208] = "AlreadyReported";
+  HttpStatusCode2[HttpStatusCode2["ImUsed"] = 226] = "ImUsed";
+  HttpStatusCode2[HttpStatusCode2["MultipleChoices"] = 300] = "MultipleChoices";
+  HttpStatusCode2[HttpStatusCode2["MovedPermanently"] = 301] = "MovedPermanently";
+  HttpStatusCode2[HttpStatusCode2["Found"] = 302] = "Found";
+  HttpStatusCode2[HttpStatusCode2["SeeOther"] = 303] = "SeeOther";
+  HttpStatusCode2[HttpStatusCode2["NotModified"] = 304] = "NotModified";
+  HttpStatusCode2[HttpStatusCode2["UseProxy"] = 305] = "UseProxy";
+  HttpStatusCode2[HttpStatusCode2["Unused"] = 306] = "Unused";
+  HttpStatusCode2[HttpStatusCode2["TemporaryRedirect"] = 307] = "TemporaryRedirect";
+  HttpStatusCode2[HttpStatusCode2["PermanentRedirect"] = 308] = "PermanentRedirect";
+  HttpStatusCode2[HttpStatusCode2["BadRequest"] = 400] = "BadRequest";
+  HttpStatusCode2[HttpStatusCode2["Unauthorized"] = 401] = "Unauthorized";
+  HttpStatusCode2[HttpStatusCode2["PaymentRequired"] = 402] = "PaymentRequired";
+  HttpStatusCode2[HttpStatusCode2["Forbidden"] = 403] = "Forbidden";
+  HttpStatusCode2[HttpStatusCode2["NotFound"] = 404] = "NotFound";
+  HttpStatusCode2[HttpStatusCode2["MethodNotAllowed"] = 405] = "MethodNotAllowed";
+  HttpStatusCode2[HttpStatusCode2["NotAcceptable"] = 406] = "NotAcceptable";
+  HttpStatusCode2[HttpStatusCode2["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
+  HttpStatusCode2[HttpStatusCode2["RequestTimeout"] = 408] = "RequestTimeout";
+  HttpStatusCode2[HttpStatusCode2["Conflict"] = 409] = "Conflict";
+  HttpStatusCode2[HttpStatusCode2["Gone"] = 410] = "Gone";
+  HttpStatusCode2[HttpStatusCode2["LengthRequired"] = 411] = "LengthRequired";
+  HttpStatusCode2[HttpStatusCode2["PreconditionFailed"] = 412] = "PreconditionFailed";
+  HttpStatusCode2[HttpStatusCode2["PayloadTooLarge"] = 413] = "PayloadTooLarge";
+  HttpStatusCode2[HttpStatusCode2["UriTooLong"] = 414] = "UriTooLong";
+  HttpStatusCode2[HttpStatusCode2["UnsupportedMediaType"] = 415] = "UnsupportedMediaType";
+  HttpStatusCode2[HttpStatusCode2["RangeNotSatisfiable"] = 416] = "RangeNotSatisfiable";
+  HttpStatusCode2[HttpStatusCode2["ExpectationFailed"] = 417] = "ExpectationFailed";
+  HttpStatusCode2[HttpStatusCode2["ImATeapot"] = 418] = "ImATeapot";
+  HttpStatusCode2[HttpStatusCode2["MisdirectedRequest"] = 421] = "MisdirectedRequest";
+  HttpStatusCode2[HttpStatusCode2["UnprocessableEntity"] = 422] = "UnprocessableEntity";
+  HttpStatusCode2[HttpStatusCode2["Locked"] = 423] = "Locked";
+  HttpStatusCode2[HttpStatusCode2["FailedDependency"] = 424] = "FailedDependency";
+  HttpStatusCode2[HttpStatusCode2["TooEarly"] = 425] = "TooEarly";
+  HttpStatusCode2[HttpStatusCode2["UpgradeRequired"] = 426] = "UpgradeRequired";
+  HttpStatusCode2[HttpStatusCode2["PreconditionRequired"] = 428] = "PreconditionRequired";
+  HttpStatusCode2[HttpStatusCode2["TooManyRequests"] = 429] = "TooManyRequests";
+  HttpStatusCode2[HttpStatusCode2["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge";
+  HttpStatusCode2[HttpStatusCode2["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons";
+  HttpStatusCode2[HttpStatusCode2["InternalServerError"] = 500] = "InternalServerError";
+  HttpStatusCode2[HttpStatusCode2["NotImplemented"] = 501] = "NotImplemented";
+  HttpStatusCode2[HttpStatusCode2["BadGateway"] = 502] = "BadGateway";
+  HttpStatusCode2[HttpStatusCode2["ServiceUnavailable"] = 503] = "ServiceUnavailable";
+  HttpStatusCode2[HttpStatusCode2["GatewayTimeout"] = 504] = "GatewayTimeout";
+  HttpStatusCode2[HttpStatusCode2["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported";
+  HttpStatusCode2[HttpStatusCode2["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates";
+  HttpStatusCode2[HttpStatusCode2["InsufficientStorage"] = 507] = "InsufficientStorage";
+  HttpStatusCode2[HttpStatusCode2["LoopDetected"] = 508] = "LoopDetected";
+  HttpStatusCode2[HttpStatusCode2["NotExtended"] = 510] = "NotExtended";
+  HttpStatusCode2[HttpStatusCode2["NetworkAuthenticationRequired"] = 511] = "NetworkAuthenticationRequired";
+})(HttpStatusCode || (HttpStatusCode = {}));
+function addBody(options, body) {
+  return {
+    body,
+    headers: options.headers,
+    context: options.context,
+    observe: options.observe,
+    params: options.params,
+    reportProgress: options.reportProgress,
+    responseType: options.responseType,
+    withCredentials: options.withCredentials,
+    transferCache: options.transferCache,
+    keepalive: options.keepalive
+  };
+}
+var HttpClient = class _HttpClient {
+  handler;
+  constructor(handler) {
+    this.handler = handler;
+  }
+  /**
+   * Constructs an observable for a generic HTTP request that, when subscribed,
+   * fires the request through the chain of registered interceptors and on to the
+   * server.
+   *
+   * You can pass an `HttpRequest` directly as the only parameter. In this case,
+   * the call returns an observable of the raw `HttpEvent` stream.
+   *
+   * Alternatively you can pass an HTTP method as the first parameter,
+   * a URL string as the second, and an options hash containing the request body as the third.
+   * See `addBody()`. In this case, the specified `responseType` and `observe` options determine the
+   * type of returned observable.
+   *   * The `responseType` value determines how a successful response body is parsed.
+   *   * If `responseType` is the default `json`, you can pass a type interface for the resulting
+   * object as a type parameter to the call.
+   *
+   * The `observe` value determines the return type, according to what you are interested in
+   * observing.
+   *   * An `observe` value of events returns an observable of the raw `HttpEvent` stream, including
+   * progress events by default.
+   *   * An `observe` value of response returns an observable of `HttpResponse<T>`,
+   * where the `T` parameter depends on the `responseType` and any optionally provided type
+   * parameter.
+   *   * An `observe` value of body returns an observable of `<T>` with the same `T` body type.
+   *
+   */
+  request(first, url, options = {}) {
+    let req;
+    if (first instanceof HttpRequest) {
+      req = first;
+    } else {
+      let headers = void 0;
+      if (options.headers instanceof HttpHeaders) {
+        headers = options.headers;
+      } else {
+        headers = new HttpHeaders(options.headers);
+      }
+      let params = void 0;
+      if (!!options.params) {
+        if (options.params instanceof HttpParams) {
+          params = options.params;
+        } else {
+          params = new HttpParams({
+            fromObject: options.params
+          });
+        }
+      }
+      req = new HttpRequest(first, url, options.body !== void 0 ? options.body : null, {
+        headers,
+        context: options.context,
+        params,
+        reportProgress: options.reportProgress,
+        // By default, JSON is assumed to be returned for all calls.
+        responseType: options.responseType || "json",
+        withCredentials: options.withCredentials,
+        transferCache: options.transferCache,
+        keepalive: options.keepalive
+      });
+    }
+    const events$ = of(req).pipe(concatMap((req2) => this.handler.handle(req2)));
+    if (first instanceof HttpRequest || options.observe === "events") {
+      return events$;
+    }
+    const res$ = events$.pipe(filter((event) => event instanceof HttpResponse));
+    switch (options.observe || "body") {
+      case "body":
+        switch (req.responseType) {
+          case "arraybuffer":
+            return res$.pipe(map((res) => {
+              if (res.body !== null && !(res.body instanceof ArrayBuffer)) {
+                throw new RuntimeError(2806, ngDevMode && "Response is not an ArrayBuffer.");
+              }
+              return res.body;
+            }));
+          case "blob":
+            return res$.pipe(map((res) => {
+              if (res.body !== null && !(res.body instanceof Blob)) {
+                throw new RuntimeError(2807, ngDevMode && "Response is not a Blob.");
+              }
+              return res.body;
+            }));
+          case "text":
+            return res$.pipe(map((res) => {
+              if (res.body !== null && typeof res.body !== "string") {
+                throw new RuntimeError(2808, ngDevMode && "Response is not a string.");
+              }
+              return res.body;
+            }));
+          case "json":
+          default:
+            return res$.pipe(map((res) => res.body));
+        }
+      case "response":
+        return res$;
+      default:
+        throw new RuntimeError(2809, ngDevMode && `Unreachable: unhandled observe type ${options.observe}}`);
+    }
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `DELETE` request to execute on the server. See the individual overloads for
+   * details on the return type.
+   *
+   * @param url     The endpoint URL.
+   * @param options The HTTP options to send with the request.
+   *
+   */
+  delete(url, options = {}) {
+    return this.request("DELETE", url, options);
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `GET` request to execute on the server. See the individual overloads for
+   * details on the return type.
+   */
+  get(url, options = {}) {
+    return this.request("GET", url, options);
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `HEAD` request to execute on the server. The `HEAD` method returns
+   * meta information about the resource without transferring the
+   * resource itself. See the individual overloads for
+   * details on the return type.
+   */
+  head(url, options = {}) {
+    return this.request("HEAD", url, options);
+  }
+  /**
+   * Constructs an `Observable` that, when subscribed, causes a request with the special method
+   * `JSONP` to be dispatched via the interceptor pipeline.
+   * The [JSONP pattern](https://en.wikipedia.org/wiki/JSONP) works around limitations of certain
+   * API endpoints that don't support newer,
+   * and preferable [CORS](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) protocol.
+   * JSONP treats the endpoint API as a JavaScript file and tricks the browser to process the
+   * requests even if the API endpoint is not located on the same domain (origin) as the client-side
+   * application making the request.
+   * The endpoint API must support JSONP callback for JSONP requests to work.
+   * The resource API returns the JSON response wrapped in a callback function.
+   * You can pass the callback function name as one of the query parameters.
+   * Note that JSONP requests can only be used with `GET` requests.
+   *
+   * @param url The resource URL.
+   * @param callbackParam The callback function name.
+   *
+   */
+  jsonp(url, callbackParam) {
+    return this.request("JSONP", url, {
+      params: new HttpParams().append(callbackParam, "JSONP_CALLBACK"),
+      observe: "body",
+      responseType: "json"
+    });
+  }
+  /**
+   * Constructs an `Observable` that, when subscribed, causes the configured
+   * `OPTIONS` request to execute on the server. This method allows the client
+   * to determine the supported HTTP methods and other capabilities of an endpoint,
+   * without implying a resource action. See the individual overloads for
+   * details on the return type.
+   */
+  options(url, options = {}) {
+    return this.request("OPTIONS", url, options);
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `PATCH` request to execute on the server. See the individual overloads for
+   * details on the return type.
+   */
+  patch(url, body, options = {}) {
+    return this.request("PATCH", url, addBody(options, body));
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `POST` request to execute on the server. The server responds with the location of
+   * the replaced resource. See the individual overloads for
+   * details on the return type.
+   */
+  post(url, body, options = {}) {
+    return this.request("POST", url, addBody(options, body));
+  }
+  /**
+   * Constructs an observable that, when subscribed, causes the configured
+   * `PUT` request to execute on the server. The `PUT` method replaces an existing resource
+   * with a new set of values.
+   * See the individual overloads for details on the return type.
+   */
+  put(url, body, options = {}) {
+    return this.request("PUT", url, addBody(options, body));
+  }
+  static ɵfac = function HttpClient_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpClient)(ɵɵinject(HttpHandler));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HttpClient,
+    factory: _HttpClient.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpClient, [{
+    type: Injectable
+  }], () => [{
+    type: HttpHandler
+  }], null);
+})();
+var XSSI_PREFIX$1 = /^\)\]\}',?\n/;
+function getResponseUrl$1(response) {
+  if (response.url) {
+    return response.url;
+  }
+  const xRequestUrl = X_REQUEST_URL_HEADER.toLocaleLowerCase();
+  return response.headers.get(xRequestUrl);
+}
+var FETCH_BACKEND = new InjectionToken(typeof ngDevMode === "undefined" || ngDevMode ? "FETCH_BACKEND" : "");
+var FetchBackend = class _FetchBackend {
+  // We use an arrow function to always reference the current global implementation of `fetch`.
+  // This is helpful for cases when the global `fetch` implementation is modified by external code,
+  // see https://github.com/angular/angular/issues/57527.
+  fetchImpl = inject(FetchFactory, {
+    optional: true
+  })?.fetch ?? ((...args) => globalThis.fetch(...args));
+  ngZone = inject(NgZone);
+  destroyRef = inject(DestroyRef);
+  destroyed = false;
+  constructor() {
+    this.destroyRef.onDestroy(() => {
+      this.destroyed = true;
+    });
+  }
+  handle(request) {
+    return new Observable((observer) => {
+      const aborter = new AbortController();
+      this.doRequest(request, aborter.signal, observer).then(noop, (error) => observer.error(new HttpErrorResponse({
+        error
+      })));
+      return () => aborter.abort();
+    });
+  }
+  doRequest(request, signal2, observer) {
+    return __async(this, null, function* () {
+      const init = this.createRequestInit(request);
+      let response;
+      try {
+        const fetchPromise = this.ngZone.runOutsideAngular(() => this.fetchImpl(request.urlWithParams, __spreadValues({
+          signal: signal2
+        }, init)));
+        silenceSuperfluousUnhandledPromiseRejection(fetchPromise);
+        observer.next({
+          type: HttpEventType.Sent
+        });
+        response = yield fetchPromise;
+      } catch (error) {
+        observer.error(new HttpErrorResponse({
+          error,
+          status: error.status ?? 0,
+          statusText: error.statusText,
+          url: request.urlWithParams,
+          headers: error.headers
+        }));
+        return;
+      }
+      const headers = new HttpHeaders(response.headers);
+      const statusText = response.statusText;
+      const url = getResponseUrl$1(response) ?? request.urlWithParams;
+      let status = response.status;
+      let body = null;
+      if (request.reportProgress) {
+        observer.next(new HttpHeaderResponse({
+          headers,
+          status,
+          statusText,
+          url
+        }));
+      }
+      if (response.body) {
+        const contentLength = response.headers.get("content-length");
+        const chunks = [];
+        const reader = response.body.getReader();
+        let receivedLength = 0;
+        let decoder;
+        let partialText;
+        const reqZone = typeof Zone !== "undefined" && Zone.current;
+        let canceled = false;
+        yield this.ngZone.runOutsideAngular(() => __async(this, null, function* () {
+          while (true) {
+            if (this.destroyed) {
+              yield reader.cancel();
+              canceled = true;
+              break;
+            }
+            const {
+              done,
+              value
+            } = yield reader.read();
+            if (done) {
+              break;
+            }
+            chunks.push(value);
+            receivedLength += value.length;
+            if (request.reportProgress) {
+              partialText = request.responseType === "text" ? (partialText ?? "") + (decoder ??= new TextDecoder()).decode(value, {
+                stream: true
+              }) : void 0;
+              const reportProgress = () => observer.next({
+                type: HttpEventType.DownloadProgress,
+                total: contentLength ? +contentLength : void 0,
+                loaded: receivedLength,
+                partialText
+              });
+              reqZone ? reqZone.run(reportProgress) : reportProgress();
+            }
+          }
+        }));
+        if (canceled) {
+          observer.complete();
+          return;
+        }
+        const chunksAll = this.concatChunks(chunks, receivedLength);
+        try {
+          const contentType = response.headers.get(CONTENT_TYPE_HEADER) ?? "";
+          body = this.parseBody(request, chunksAll, contentType);
+        } catch (error) {
+          observer.error(new HttpErrorResponse({
+            error,
+            headers: new HttpHeaders(response.headers),
+            status: response.status,
+            statusText: response.statusText,
+            url: getResponseUrl$1(response) ?? request.urlWithParams
+          }));
+          return;
+        }
+      }
+      if (status === 0) {
+        status = body ? HTTP_STATUS_CODE_OK : 0;
+      }
+      const ok = status >= 200 && status < 300;
+      if (ok) {
+        observer.next(new HttpResponse({
+          body,
+          headers,
+          status,
+          statusText,
+          url
+        }));
+        observer.complete();
+      } else {
+        observer.error(new HttpErrorResponse({
+          error: body,
+          headers,
+          status,
+          statusText,
+          url
+        }));
+      }
+    });
+  }
+  parseBody(request, binContent, contentType) {
+    switch (request.responseType) {
+      case "json":
+        const text = new TextDecoder().decode(binContent).replace(XSSI_PREFIX$1, "");
+        return text === "" ? null : JSON.parse(text);
+      case "text":
+        return new TextDecoder().decode(binContent);
+      case "blob":
+        return new Blob([binContent], {
+          type: contentType
+        });
+      case "arraybuffer":
+        return binContent.buffer;
+    }
+  }
+  createRequestInit(req) {
+    const headers = {};
+    const credentials = req.withCredentials ? "include" : void 0;
+    req.headers.forEach((name, values) => headers[name] = values.join(","));
+    if (!req.headers.has(ACCEPT_HEADER)) {
+      headers[ACCEPT_HEADER] = ACCEPT_HEADER_VALUE;
+    }
+    if (!req.headers.has(CONTENT_TYPE_HEADER)) {
+      const detectedType = req.detectContentTypeHeader();
+      if (detectedType !== null) {
+        headers[CONTENT_TYPE_HEADER] = detectedType;
+      }
+    }
+    return {
+      body: req.serializeBody(),
+      method: req.method,
+      headers,
+      credentials,
+      keepalive: req.keepalive
+    };
+  }
+  concatChunks(chunks, totalLength) {
+    const chunksAll = new Uint8Array(totalLength);
+    let position = 0;
+    for (const chunk of chunks) {
+      chunksAll.set(chunk, position);
+      position += chunk.length;
+    }
+    return chunksAll;
+  }
+  static ɵfac = function FetchBackend_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _FetchBackend)();
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _FetchBackend,
+    factory: _FetchBackend.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(FetchBackend, [{
+    type: Injectable
+  }], () => [], null);
+})();
+var FetchFactory = class {
+};
+function noop() {
+}
+function silenceSuperfluousUnhandledPromiseRejection(promise) {
+  promise.then(noop, noop);
+}
+function interceptorChainEndFn(req, finalHandlerFn) {
+  return finalHandlerFn(req);
+}
+function adaptLegacyInterceptorToChain(chainTailFn, interceptor) {
+  return (initialRequest, finalHandlerFn) => interceptor.intercept(initialRequest, {
+    handle: (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn)
+  });
+}
+function chainedInterceptorFn(chainTailFn, interceptorFn, injector) {
+  return (initialRequest, finalHandlerFn) => runInInjectionContext(injector, () => interceptorFn(initialRequest, (downstreamRequest) => chainTailFn(downstreamRequest, finalHandlerFn)));
+}
+var HTTP_INTERCEPTORS = new InjectionToken(ngDevMode ? "HTTP_INTERCEPTORS" : "");
+var HTTP_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? "HTTP_INTERCEPTOR_FNS" : "");
+var HTTP_ROOT_INTERCEPTOR_FNS = new InjectionToken(ngDevMode ? "HTTP_ROOT_INTERCEPTOR_FNS" : "");
+var REQUESTS_CONTRIBUTE_TO_STABILITY = new InjectionToken(ngDevMode ? "REQUESTS_CONTRIBUTE_TO_STABILITY" : "", {
+  providedIn: "root",
+  factory: () => true
+});
+function legacyInterceptorFnFactory() {
+  let chain = null;
+  return (req, handler) => {
+    if (chain === null) {
+      const interceptors = inject(HTTP_INTERCEPTORS, {
+        optional: true
+      }) ?? [];
+      chain = interceptors.reduceRight(adaptLegacyInterceptorToChain, interceptorChainEndFn);
+    }
+    const pendingTasks = inject(PendingTasks);
+    const contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);
+    if (contributeToStability) {
+      const removeTask = pendingTasks.add();
+      return chain(req, handler).pipe(finalize(removeTask));
+    } else {
+      return chain(req, handler);
+    }
+  };
+}
+var fetchBackendWarningDisplayed = false;
+var HttpInterceptorHandler = class _HttpInterceptorHandler extends HttpHandler {
+  backend;
+  injector;
+  chain = null;
+  pendingTasks = inject(PendingTasks);
+  contributeToStability = inject(REQUESTS_CONTRIBUTE_TO_STABILITY);
+  constructor(backend, injector) {
+    super();
+    this.backend = backend;
+    this.injector = injector;
+    if ((typeof ngDevMode === "undefined" || ngDevMode) && !fetchBackendWarningDisplayed) {
+      const isTestingBackend = this.backend.isTestingBackend;
+      if (false) {
+        fetchBackendWarningDisplayed = true;
+        injector.get(Console).warn(formatRuntimeError(2801, "Angular detected that `HttpClient` is not configured to use `fetch` APIs. It's strongly recommended to enable `fetch` for applications that use Server-Side Rendering for better performance and compatibility. To enable `fetch`, add the `withFetch()` to the `provideHttpClient()` call at the root of the application."));
+      }
+    }
+  }
+  handle(initialRequest) {
+    if (this.chain === null) {
+      const dedupedInterceptorFns = Array.from(/* @__PURE__ */ new Set([...this.injector.get(HTTP_INTERCEPTOR_FNS), ...this.injector.get(HTTP_ROOT_INTERCEPTOR_FNS, [])]));
+      this.chain = dedupedInterceptorFns.reduceRight((nextSequencedFn, interceptorFn) => chainedInterceptorFn(nextSequencedFn, interceptorFn, this.injector), interceptorChainEndFn);
+    }
+    if (this.contributeToStability) {
+      const removeTask = this.pendingTasks.add();
+      return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest)).pipe(finalize(removeTask));
+    } else {
+      return this.chain(initialRequest, (downstreamRequest) => this.backend.handle(downstreamRequest));
+    }
+  }
+  static ɵfac = function HttpInterceptorHandler_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpInterceptorHandler)(ɵɵinject(HttpBackend), ɵɵinject(EnvironmentInjector));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HttpInterceptorHandler,
+    factory: _HttpInterceptorHandler.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpInterceptorHandler, [{
+    type: Injectable
+  }], () => [{
+    type: HttpBackend
+  }, {
+    type: EnvironmentInjector
+  }], null);
+})();
+var nextRequestId = 0;
+var foreignDocument;
+var JSONP_ERR_NO_CALLBACK = "JSONP injected script did not invoke callback.";
+var JSONP_ERR_WRONG_METHOD = "JSONP requests must use JSONP request method.";
+var JSONP_ERR_WRONG_RESPONSE_TYPE = "JSONP requests must use Json response type.";
+var JSONP_ERR_HEADERS_NOT_SUPPORTED = "JSONP requests do not support headers.";
+var JsonpCallbackContext = class {
+};
+function jsonpCallbackContext() {
+  if (typeof window === "object") {
+    return window;
+  }
+  return {};
+}
+var JsonpClientBackend = class _JsonpClientBackend {
+  callbackMap;
+  document;
+  /**
+   * A resolved promise that can be used to schedule microtasks in the event handlers.
+   */
+  resolvedPromise = Promise.resolve();
+  constructor(callbackMap, document) {
+    this.callbackMap = callbackMap;
+    this.document = document;
+  }
+  /**
+   * Get the name of the next callback method, by incrementing the global `nextRequestId`.
+   */
+  nextCallback() {
+    return `ng_jsonp_callback_${nextRequestId++}`;
+  }
+  /**
+   * Processes a JSONP request and returns an event stream of the results.
+   * @param req The request object.
+   * @returns An observable of the response events.
+   *
+   */
+  handle(req) {
+    if (req.method !== "JSONP") {
+      throw new RuntimeError(2810, ngDevMode && JSONP_ERR_WRONG_METHOD);
+    } else if (req.responseType !== "json") {
+      throw new RuntimeError(2811, ngDevMode && JSONP_ERR_WRONG_RESPONSE_TYPE);
+    }
+    if (req.headers.keys().length > 0) {
+      throw new RuntimeError(2812, ngDevMode && JSONP_ERR_HEADERS_NOT_SUPPORTED);
+    }
+    return new Observable((observer) => {
+      const callback = this.nextCallback();
+      const url = req.urlWithParams.replace(/=JSONP_CALLBACK(&|$)/, `=${callback}$1`);
+      const node = this.document.createElement("script");
+      node.src = url;
+      let body = null;
+      let finished = false;
+      this.callbackMap[callback] = (data) => {
+        delete this.callbackMap[callback];
+        body = data;
+        finished = true;
+      };
+      const cleanup = () => {
+        node.removeEventListener("load", onLoad);
+        node.removeEventListener("error", onError);
+        node.remove();
+        delete this.callbackMap[callback];
+      };
+      const onLoad = () => {
+        this.resolvedPromise.then(() => {
+          cleanup();
+          if (!finished) {
+            observer.error(new HttpErrorResponse({
+              url,
+              status: 0,
+              statusText: "JSONP Error",
+              error: new Error(JSONP_ERR_NO_CALLBACK)
+            }));
+            return;
+          }
+          observer.next(new HttpResponse({
+            body,
+            status: HTTP_STATUS_CODE_OK,
+            statusText: "OK",
+            url
+          }));
+          observer.complete();
+        });
+      };
+      const onError = (error) => {
+        cleanup();
+        observer.error(new HttpErrorResponse({
+          error,
+          status: 0,
+          statusText: "JSONP Error",
+          url
+        }));
+      };
+      node.addEventListener("load", onLoad);
+      node.addEventListener("error", onError);
+      this.document.body.appendChild(node);
+      observer.next({
+        type: HttpEventType.Sent
+      });
+      return () => {
+        if (!finished) {
+          this.removeListeners(node);
+        }
+        cleanup();
+      };
+    });
+  }
+  removeListeners(script) {
+    foreignDocument ??= this.document.implementation.createHTMLDocument();
+    foreignDocument.adoptNode(script);
+  }
+  static ɵfac = function JsonpClientBackend_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _JsonpClientBackend)(ɵɵinject(JsonpCallbackContext), ɵɵinject(DOCUMENT));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _JsonpClientBackend,
+    factory: _JsonpClientBackend.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(JsonpClientBackend, [{
+    type: Injectable
+  }], () => [{
+    type: JsonpCallbackContext
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }], null);
+})();
+function jsonpInterceptorFn(req, next) {
+  if (req.method === "JSONP") {
+    return inject(JsonpClientBackend).handle(req);
+  }
+  return next(req);
+}
+var JsonpInterceptor = class _JsonpInterceptor {
+  injector;
+  constructor(injector) {
+    this.injector = injector;
+  }
+  /**
+   * Identifies and handles a given JSONP request.
+   * @param initialRequest The outgoing request object to handle.
+   * @param next The next interceptor in the chain, or the backend
+   * if no interceptors remain in the chain.
+   * @returns An observable of the event stream.
+   */
+  intercept(initialRequest, next) {
+    return runInInjectionContext(this.injector, () => jsonpInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));
+  }
+  static ɵfac = function JsonpInterceptor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _JsonpInterceptor)(ɵɵinject(EnvironmentInjector));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _JsonpInterceptor,
+    factory: _JsonpInterceptor.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(JsonpInterceptor, [{
+    type: Injectable
+  }], () => [{
+    type: EnvironmentInjector
+  }], null);
+})();
+var XSSI_PREFIX = /^\)\]\}',?\n/;
+var X_REQUEST_URL_REGEXP = RegExp(`^${X_REQUEST_URL_HEADER}:`, "m");
+function getResponseUrl(xhr) {
+  if ("responseURL" in xhr && xhr.responseURL) {
+    return xhr.responseURL;
+  }
+  if (X_REQUEST_URL_REGEXP.test(xhr.getAllResponseHeaders())) {
+    return xhr.getResponseHeader(X_REQUEST_URL_HEADER);
+  }
+  return null;
+}
+var HttpXhrBackend = class _HttpXhrBackend {
+  xhrFactory;
+  constructor(xhrFactory) {
+    this.xhrFactory = xhrFactory;
+  }
+  /**
+   * Processes a request and returns a stream of response events.
+   * @param req The request object.
+   * @returns An observable of the response events.
+   */
+  handle(req) {
+    if (req.method === "JSONP") {
+      throw new RuntimeError(-2800, (typeof ngDevMode === "undefined" || ngDevMode) && `Cannot make a JSONP request without JSONP support. To fix the problem, either add the \`withJsonpSupport()\` call (if \`provideHttpClient()\` is used) or import the \`HttpClientJsonpModule\` in the root NgModule.`);
+    }
+    if (req.keepalive && ngDevMode) {
+      console.warn(formatRuntimeError(2813, `Angular detected that a \`HttpClient\` request with the \`keepalive\` option was sent using XHR, which does not support it. To use the \`keepalive\` option, enable Fetch API support by passing \`withFetch()\` as an argument to \`provideHttpClient()\`.`));
+    }
+    const xhrFactory = this.xhrFactory;
+    const source = xhrFactory.ɵloadImpl ? from(xhrFactory.ɵloadImpl()) : of(null);
+    return source.pipe(switchMap(() => {
+      return new Observable((observer) => {
+        const xhr = xhrFactory.build();
+        xhr.open(req.method, req.urlWithParams);
+        if (req.withCredentials) {
+          xhr.withCredentials = true;
+        }
+        req.headers.forEach((name, values) => xhr.setRequestHeader(name, values.join(",")));
+        if (!req.headers.has(ACCEPT_HEADER)) {
+          xhr.setRequestHeader(ACCEPT_HEADER, ACCEPT_HEADER_VALUE);
+        }
+        if (!req.headers.has(CONTENT_TYPE_HEADER)) {
+          const detectedType = req.detectContentTypeHeader();
+          if (detectedType !== null) {
+            xhr.setRequestHeader(CONTENT_TYPE_HEADER, detectedType);
+          }
+        }
+        if (req.responseType) {
+          const responseType = req.responseType.toLowerCase();
+          xhr.responseType = responseType !== "json" ? responseType : "text";
+        }
+        const reqBody = req.serializeBody();
+        let headerResponse = null;
+        const partialFromXhr = () => {
+          if (headerResponse !== null) {
+            return headerResponse;
+          }
+          const statusText = xhr.statusText || "OK";
+          const headers = new HttpHeaders(xhr.getAllResponseHeaders());
+          const url = getResponseUrl(xhr) || req.url;
+          headerResponse = new HttpHeaderResponse({
+            headers,
+            status: xhr.status,
+            statusText,
+            url
+          });
+          return headerResponse;
+        };
+        const onLoad = () => {
+          let {
+            headers,
+            status,
+            statusText,
+            url
+          } = partialFromXhr();
+          let body = null;
+          if (status !== HTTP_STATUS_CODE_NO_CONTENT) {
+            body = typeof xhr.response === "undefined" ? xhr.responseText : xhr.response;
+          }
+          if (status === 0) {
+            status = !!body ? HTTP_STATUS_CODE_OK : 0;
+          }
+          let ok = status >= 200 && status < 300;
+          if (req.responseType === "json" && typeof body === "string") {
+            const originalBody = body;
+            body = body.replace(XSSI_PREFIX, "");
+            try {
+              body = body !== "" ? JSON.parse(body) : null;
+            } catch (error) {
+              body = originalBody;
+              if (ok) {
+                ok = false;
+                body = {
+                  error,
+                  text: body
+                };
+              }
+            }
+          }
+          if (ok) {
+            observer.next(new HttpResponse({
+              body,
+              headers,
+              status,
+              statusText,
+              url: url || void 0
+            }));
+            observer.complete();
+          } else {
+            observer.error(new HttpErrorResponse({
+              // The error in this case is the response body (error from the server).
+              error: body,
+              headers,
+              status,
+              statusText,
+              url: url || void 0
+            }));
+          }
+        };
+        const onError = (error) => {
+          const {
+            url
+          } = partialFromXhr();
+          const res = new HttpErrorResponse({
+            error,
+            status: xhr.status || 0,
+            statusText: xhr.statusText || "Unknown Error",
+            url: url || void 0
+          });
+          observer.error(res);
+        };
+        let sentHeaders = false;
+        const onDownProgress = (event) => {
+          if (!sentHeaders) {
+            observer.next(partialFromXhr());
+            sentHeaders = true;
+          }
+          let progressEvent = {
+            type: HttpEventType.DownloadProgress,
+            loaded: event.loaded
+          };
+          if (event.lengthComputable) {
+            progressEvent.total = event.total;
+          }
+          if (req.responseType === "text" && !!xhr.responseText) {
+            progressEvent.partialText = xhr.responseText;
+          }
+          observer.next(progressEvent);
+        };
+        const onUpProgress = (event) => {
+          let progress = {
+            type: HttpEventType.UploadProgress,
+            loaded: event.loaded
+          };
+          if (event.lengthComputable) {
+            progress.total = event.total;
+          }
+          observer.next(progress);
+        };
+        xhr.addEventListener("load", onLoad);
+        xhr.addEventListener("error", onError);
+        xhr.addEventListener("timeout", onError);
+        xhr.addEventListener("abort", onError);
+        if (req.reportProgress) {
+          xhr.addEventListener("progress", onDownProgress);
+          if (reqBody !== null && xhr.upload) {
+            xhr.upload.addEventListener("progress", onUpProgress);
+          }
+        }
+        xhr.send(reqBody);
+        observer.next({
+          type: HttpEventType.Sent
+        });
+        return () => {
+          xhr.removeEventListener("error", onError);
+          xhr.removeEventListener("abort", onError);
+          xhr.removeEventListener("load", onLoad);
+          xhr.removeEventListener("timeout", onError);
+          if (req.reportProgress) {
+            xhr.removeEventListener("progress", onDownProgress);
+            if (reqBody !== null && xhr.upload) {
+              xhr.upload.removeEventListener("progress", onUpProgress);
+            }
+          }
+          if (xhr.readyState !== xhr.DONE) {
+            xhr.abort();
+          }
+        };
+      });
+    }));
+  }
+  static ɵfac = function HttpXhrBackend_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpXhrBackend)(ɵɵinject(XhrFactory));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HttpXhrBackend,
+    factory: _HttpXhrBackend.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpXhrBackend, [{
+    type: Injectable
+  }], () => [{
+    type: XhrFactory
+  }], null);
+})();
+var XSRF_ENABLED = new InjectionToken(ngDevMode ? "XSRF_ENABLED" : "");
+var XSRF_DEFAULT_COOKIE_NAME = "XSRF-TOKEN";
+var XSRF_COOKIE_NAME = new InjectionToken(ngDevMode ? "XSRF_COOKIE_NAME" : "", {
+  providedIn: "root",
+  factory: () => XSRF_DEFAULT_COOKIE_NAME
+});
+var XSRF_DEFAULT_HEADER_NAME = "X-XSRF-TOKEN";
+var XSRF_HEADER_NAME = new InjectionToken(ngDevMode ? "XSRF_HEADER_NAME" : "", {
+  providedIn: "root",
+  factory: () => XSRF_DEFAULT_HEADER_NAME
+});
+var HttpXsrfTokenExtractor = class {
+};
+var HttpXsrfCookieExtractor = class _HttpXsrfCookieExtractor {
+  doc;
+  cookieName;
+  lastCookieString = "";
+  lastToken = null;
+  /**
+   * @internal for testing
+   */
+  parseCount = 0;
+  constructor(doc, cookieName) {
+    this.doc = doc;
+    this.cookieName = cookieName;
+  }
+  getToken() {
+    if (false) {
+      return null;
+    }
+    const cookieString = this.doc.cookie || "";
+    if (cookieString !== this.lastCookieString) {
+      this.parseCount++;
+      this.lastToken = parseCookieValue(cookieString, this.cookieName);
+      this.lastCookieString = cookieString;
+    }
+    return this.lastToken;
+  }
+  static ɵfac = function HttpXsrfCookieExtractor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpXsrfCookieExtractor)(ɵɵinject(DOCUMENT), ɵɵinject(XSRF_COOKIE_NAME));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HttpXsrfCookieExtractor,
+    factory: _HttpXsrfCookieExtractor.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpXsrfCookieExtractor, [{
+    type: Injectable
+  }], () => [{
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [DOCUMENT]
+    }]
+  }, {
+    type: void 0,
+    decorators: [{
+      type: Inject,
+      args: [XSRF_COOKIE_NAME]
+    }]
+  }], null);
+})();
+function xsrfInterceptorFn(req, next) {
+  const lcUrl = req.url.toLowerCase();
+  if (!inject(XSRF_ENABLED) || req.method === "GET" || req.method === "HEAD" || lcUrl.startsWith("http://") || lcUrl.startsWith("https://")) {
+    return next(req);
+  }
+  const token = inject(HttpXsrfTokenExtractor).getToken();
+  const headerName = inject(XSRF_HEADER_NAME);
+  if (token != null && !req.headers.has(headerName)) {
+    req = req.clone({
+      headers: req.headers.set(headerName, token)
+    });
+  }
+  return next(req);
+}
+var HttpXsrfInterceptor = class _HttpXsrfInterceptor {
+  injector;
+  constructor(injector) {
+    this.injector = injector;
+  }
+  intercept(initialRequest, next) {
+    return runInInjectionContext(this.injector, () => xsrfInterceptorFn(initialRequest, (downstreamRequest) => next.handle(downstreamRequest)));
+  }
+  static ɵfac = function HttpXsrfInterceptor_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpXsrfInterceptor)(ɵɵinject(EnvironmentInjector));
+  };
+  static ɵprov = ɵɵdefineInjectable({
+    token: _HttpXsrfInterceptor,
+    factory: _HttpXsrfInterceptor.ɵfac
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpXsrfInterceptor, [{
+    type: Injectable
+  }], () => [{
+    type: EnvironmentInjector
+  }], null);
+})();
+var HttpFeatureKind;
+(function(HttpFeatureKind2) {
+  HttpFeatureKind2[HttpFeatureKind2["Interceptors"] = 0] = "Interceptors";
+  HttpFeatureKind2[HttpFeatureKind2["LegacyInterceptors"] = 1] = "LegacyInterceptors";
+  HttpFeatureKind2[HttpFeatureKind2["CustomXsrfConfiguration"] = 2] = "CustomXsrfConfiguration";
+  HttpFeatureKind2[HttpFeatureKind2["NoXsrfProtection"] = 3] = "NoXsrfProtection";
+  HttpFeatureKind2[HttpFeatureKind2["JsonpSupport"] = 4] = "JsonpSupport";
+  HttpFeatureKind2[HttpFeatureKind2["RequestsMadeViaParent"] = 5] = "RequestsMadeViaParent";
+  HttpFeatureKind2[HttpFeatureKind2["Fetch"] = 6] = "Fetch";
+})(HttpFeatureKind || (HttpFeatureKind = {}));
+function makeHttpFeature(kind, providers) {
+  return {
+    ɵkind: kind,
+    ɵproviders: providers
+  };
+}
+function provideHttpClient(...features) {
+  if (ngDevMode) {
+    const featureKinds = new Set(features.map((f) => f.ɵkind));
+    if (featureKinds.has(HttpFeatureKind.NoXsrfProtection) && featureKinds.has(HttpFeatureKind.CustomXsrfConfiguration)) {
+      throw new Error(ngDevMode ? `Configuration error: found both withXsrfConfiguration() and withNoXsrfProtection() in the same call to provideHttpClient(), which is a contradiction.` : "");
+    }
+  }
+  const providers = [HttpClient, HttpXhrBackend, HttpInterceptorHandler, {
+    provide: HttpHandler,
+    useExisting: HttpInterceptorHandler
+  }, {
+    provide: HttpBackend,
+    useFactory: () => {
+      return inject(FETCH_BACKEND, {
+        optional: true
+      }) ?? inject(HttpXhrBackend);
+    }
+  }, {
+    provide: HTTP_INTERCEPTOR_FNS,
+    useValue: xsrfInterceptorFn,
+    multi: true
+  }, {
+    provide: XSRF_ENABLED,
+    useValue: true
+  }, {
+    provide: HttpXsrfTokenExtractor,
+    useClass: HttpXsrfCookieExtractor
+  }];
+  for (const feature of features) {
+    providers.push(...feature.ɵproviders);
+  }
+  return makeEnvironmentProviders(providers);
+}
+function withInterceptors(interceptorFns) {
+  return makeHttpFeature(HttpFeatureKind.Interceptors, interceptorFns.map((interceptorFn) => {
+    return {
+      provide: HTTP_INTERCEPTOR_FNS,
+      useValue: interceptorFn,
+      multi: true
+    };
+  }));
+}
+var LEGACY_INTERCEPTOR_FN = new InjectionToken(ngDevMode ? "LEGACY_INTERCEPTOR_FN" : "");
+function withInterceptorsFromDi() {
+  return makeHttpFeature(HttpFeatureKind.LegacyInterceptors, [{
+    provide: LEGACY_INTERCEPTOR_FN,
+    useFactory: legacyInterceptorFnFactory
+  }, {
+    provide: HTTP_INTERCEPTOR_FNS,
+    useExisting: LEGACY_INTERCEPTOR_FN,
+    multi: true
+  }]);
+}
+function withXsrfConfiguration({
+  cookieName,
+  headerName
+}) {
+  const providers = [];
+  if (cookieName !== void 0) {
+    providers.push({
+      provide: XSRF_COOKIE_NAME,
+      useValue: cookieName
+    });
+  }
+  if (headerName !== void 0) {
+    providers.push({
+      provide: XSRF_HEADER_NAME,
+      useValue: headerName
+    });
+  }
+  return makeHttpFeature(HttpFeatureKind.CustomXsrfConfiguration, providers);
+}
+function withNoXsrfProtection() {
+  return makeHttpFeature(HttpFeatureKind.NoXsrfProtection, [{
+    provide: XSRF_ENABLED,
+    useValue: false
+  }]);
+}
+function withJsonpSupport() {
+  return makeHttpFeature(HttpFeatureKind.JsonpSupport, [JsonpClientBackend, {
+    provide: JsonpCallbackContext,
+    useFactory: jsonpCallbackContext
+  }, {
+    provide: HTTP_INTERCEPTOR_FNS,
+    useValue: jsonpInterceptorFn,
+    multi: true
+  }]);
+}
+function withRequestsMadeViaParent() {
+  return makeHttpFeature(HttpFeatureKind.RequestsMadeViaParent, [{
+    provide: HttpBackend,
+    useFactory: () => {
+      const handlerFromParent = inject(HttpHandler, {
+        skipSelf: true,
+        optional: true
+      });
+      if (ngDevMode && handlerFromParent === null) {
+        throw new Error("withRequestsMadeViaParent() can only be used when the parent injector also configures HttpClient");
+      }
+      return handlerFromParent;
+    }
+  }]);
+}
+function withFetch() {
+  return makeHttpFeature(HttpFeatureKind.Fetch, [FetchBackend, {
+    provide: FETCH_BACKEND,
+    useExisting: FetchBackend
+  }, {
+    provide: HttpBackend,
+    useExisting: FetchBackend
+  }]);
+}
+var HttpClientXsrfModule = class _HttpClientXsrfModule {
+  /**
+   * Disable the default XSRF protection.
+   */
+  static disable() {
+    return {
+      ngModule: _HttpClientXsrfModule,
+      providers: [withNoXsrfProtection().ɵproviders]
+    };
+  }
+  /**
+   * Configure XSRF protection.
+   * @param options An object that can specify either or both
+   * cookie name or header name.
+   * - Cookie name default is `XSRF-TOKEN`.
+   * - Header name default is `X-XSRF-TOKEN`.
+   *
+   */
+  static withOptions(options = {}) {
+    return {
+      ngModule: _HttpClientXsrfModule,
+      providers: withXsrfConfiguration(options).ɵproviders
+    };
+  }
+  static ɵfac = function HttpClientXsrfModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpClientXsrfModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _HttpClientXsrfModule
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: [HttpXsrfInterceptor, {
+      provide: HTTP_INTERCEPTORS,
+      useExisting: HttpXsrfInterceptor,
+      multi: true
+    }, {
+      provide: HttpXsrfTokenExtractor,
+      useClass: HttpXsrfCookieExtractor
+    }, withXsrfConfiguration({
+      cookieName: XSRF_DEFAULT_COOKIE_NAME,
+      headerName: XSRF_DEFAULT_HEADER_NAME
+    }).ɵproviders, {
+      provide: XSRF_ENABLED,
+      useValue: true
+    }]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpClientXsrfModule, [{
+    type: NgModule,
+    args: [{
+      providers: [HttpXsrfInterceptor, {
+        provide: HTTP_INTERCEPTORS,
+        useExisting: HttpXsrfInterceptor,
+        multi: true
+      }, {
+        provide: HttpXsrfTokenExtractor,
+        useClass: HttpXsrfCookieExtractor
+      }, withXsrfConfiguration({
+        cookieName: XSRF_DEFAULT_COOKIE_NAME,
+        headerName: XSRF_DEFAULT_HEADER_NAME
+      }).ɵproviders, {
+        provide: XSRF_ENABLED,
+        useValue: true
+      }]
+    }]
+  }], null, null);
+})();
+var HttpClientModule = class _HttpClientModule {
+  static ɵfac = function HttpClientModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpClientModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _HttpClientModule
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: [provideHttpClient(withInterceptorsFromDi())]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpClientModule, [{
+    type: NgModule,
+    args: [{
+      /**
+       * Configures the dependency injector where it is imported
+       * with supporting services for HTTP communications.
+       */
+      providers: [provideHttpClient(withInterceptorsFromDi())]
+    }]
+  }], null, null);
+})();
+var HttpClientJsonpModule = class _HttpClientJsonpModule {
+  static ɵfac = function HttpClientJsonpModule_Factory(__ngFactoryType__) {
+    return new (__ngFactoryType__ || _HttpClientJsonpModule)();
+  };
+  static ɵmod = ɵɵdefineNgModule({
+    type: _HttpClientJsonpModule
+  });
+  static ɵinj = ɵɵdefineInjector({
+    providers: [withJsonpSupport().ɵproviders]
+  });
+};
+(() => {
+  (typeof ngDevMode === "undefined" || ngDevMode) && setClassMetadata(HttpClientJsonpModule, [{
+    type: NgModule,
+    args: [{
+      providers: [withJsonpSupport().ɵproviders]
+    }]
+  }], null, null);
+})();
+
+// node_modules/@angular/common/fesm2022/http.mjs
+var httpResource = (() => {
+  const jsonFn = makeHttpResourceFn("json");
+  jsonFn.arrayBuffer = makeHttpResourceFn("arraybuffer");
+  jsonFn.blob = makeHttpResourceFn("blob");
+  jsonFn.text = makeHttpResourceFn("text");
+  return jsonFn;
+})();
+function makeHttpResourceFn(responseType) {
+  return function httpResource2(request, options) {
+    if (ngDevMode && !options?.injector) {
+      assertInInjectionContext(httpResource2);
+    }
+    const injector = options?.injector ?? inject(Injector);
+    return new HttpResourceImpl(injector, () => normalizeRequest(request, responseType), options?.defaultValue, options?.parse, options?.equal);
+  };
+}
+function normalizeRequest(request, responseType) {
+  let unwrappedRequest = typeof request === "function" ? request() : request;
+  if (unwrappedRequest === void 0) {
+    return void 0;
+  } else if (typeof unwrappedRequest === "string") {
+    unwrappedRequest = { url: unwrappedRequest };
+  }
+  const headers = unwrappedRequest.headers instanceof HttpHeaders ? unwrappedRequest.headers : new HttpHeaders(unwrappedRequest.headers);
+  const params = unwrappedRequest.params instanceof HttpParams ? unwrappedRequest.params : new HttpParams({ fromObject: unwrappedRequest.params });
+  return new HttpRequest(unwrappedRequest.method ?? "GET", unwrappedRequest.url, unwrappedRequest.body ?? null, {
+    headers,
+    params,
+    reportProgress: unwrappedRequest.reportProgress,
+    withCredentials: unwrappedRequest.withCredentials,
+    responseType,
+    context: unwrappedRequest.context,
+    transferCache: unwrappedRequest.transferCache
+  });
+}
+var HttpResourceImpl = class extends ResourceImpl {
+  client;
+  _headers = linkedSignal({
+    source: this.extRequest,
+    computation: () => void 0
+  });
+  _progress = linkedSignal({
+    source: this.extRequest,
+    computation: () => void 0
+  });
+  _statusCode = linkedSignal({
+    source: this.extRequest,
+    computation: () => void 0
+  });
+  headers = computed(() => this.status() === "resolved" || this.status() === "error" ? this._headers() : void 0);
+  progress = this._progress.asReadonly();
+  statusCode = this._statusCode.asReadonly();
+  constructor(injector, request, defaultValue, parse, equal) {
+    super(request, ({ params: request2, abortSignal }) => {
+      let sub;
+      const onAbort = () => sub.unsubscribe();
+      abortSignal.addEventListener("abort", onAbort);
+      const stream = signal({ value: void 0 });
+      let resolve;
+      const promise = new Promise((r) => resolve = r);
+      const send = (value) => {
+        stream.set(value);
+        resolve?.(stream);
+        resolve = void 0;
+      };
+      sub = this.client.request(request2).subscribe({
+        next: (event) => {
+          switch (event.type) {
+            case HttpEventType.Response:
+              this._headers.set(event.headers);
+              this._statusCode.set(event.status);
+              try {
+                send({ value: parse ? parse(event.body) : event.body });
+              } catch (error) {
+                send({ error: encapsulateResourceError(error) });
+              }
+              break;
+            case HttpEventType.DownloadProgress:
+              this._progress.set(event);
+              break;
+          }
+        },
+        error: (error) => {
+          if (error instanceof HttpErrorResponse) {
+            this._headers.set(error.headers);
+            this._statusCode.set(error.status);
+          }
+          send({ error });
+          abortSignal.removeEventListener("abort", onAbort);
+        },
+        complete: () => {
+          if (resolve) {
+            send({
+              error: new RuntimeError(991, ngDevMode && "Resource completed before producing a value")
+            });
+          }
+          abortSignal.removeEventListener("abort", onAbort);
+        }
+      });
+      return promise;
+    }, defaultValue, equal, injector);
+    this.client = injector.get(HttpClient);
+  }
+};
+var HTTP_TRANSFER_CACHE_ORIGIN_MAP = new InjectionToken(ngDevMode ? "HTTP_TRANSFER_CACHE_ORIGIN_MAP" : "");
+var BODY = "b";
+var HEADERS = "h";
+var STATUS = "s";
+var STATUS_TEXT = "st";
+var REQ_URL = "u";
+var RESPONSE_TYPE = "rt";
+var CACHE_OPTIONS = new InjectionToken(ngDevMode ? "HTTP_TRANSFER_STATE_CACHE_OPTIONS" : "");
+var ALLOWED_METHODS = ["GET", "HEAD"];
+function transferCacheInterceptorFn(req, next) {
+  const _a = inject(CACHE_OPTIONS), { isCacheActive } = _a, globalOptions = __objRest(_a, ["isCacheActive"]);
+  const { transferCache: requestOptions, method: requestMethod } = req;
+  if (!isCacheActive || requestOptions === false || // POST requests are allowed either globally or at request level
+  requestMethod === "POST" && !globalOptions.includePostRequests && !requestOptions || requestMethod !== "POST" && !ALLOWED_METHODS.includes(requestMethod) || // Do not cache request that require authorization when includeRequestsWithAuthHeaders is falsey
+  !globalOptions.includeRequestsWithAuthHeaders && hasAuthHeaders(req) || globalOptions.filter?.(req) === false) {
+    return next(req);
+  }
+  const transferState = inject(TransferState);
+  const originMap = inject(HTTP_TRANSFER_CACHE_ORIGIN_MAP, {
+    optional: true
+  });
+  if (originMap) {
+    throw new RuntimeError(2803, ngDevMode && "Angular detected that the `HTTP_TRANSFER_CACHE_ORIGIN_MAP` token is configured and present in the client side code. Please ensure that this token is only provided in the server code of the application.");
+  }
+  const requestUrl = false ? mapRequestOriginUrl(req.url, originMap) : req.url;
+  const storeKey = makeCacheKey(req, requestUrl);
+  const response = transferState.get(storeKey, null);
+  let headersToInclude = globalOptions.includeHeaders;
+  if (typeof requestOptions === "object" && requestOptions.includeHeaders) {
+    headersToInclude = requestOptions.includeHeaders;
+  }
+  if (response) {
+    const { [BODY]: undecodedBody, [RESPONSE_TYPE]: responseType, [HEADERS]: httpHeaders, [STATUS]: status, [STATUS_TEXT]: statusText, [REQ_URL]: url } = response;
+    let body = undecodedBody;
+    switch (responseType) {
+      case "arraybuffer":
+        body = new TextEncoder().encode(undecodedBody).buffer;
+        break;
+      case "blob":
+        body = new Blob([undecodedBody]);
+        break;
+    }
+    let headers = new HttpHeaders(httpHeaders);
+    if (typeof ngDevMode === "undefined" || ngDevMode) {
+      headers = appendMissingHeadersDetection(req.url, headers, headersToInclude ?? []);
+    }
+    return of(new HttpResponse({
+      body,
+      headers,
+      status,
+      statusText,
+      url
+    }));
+  }
+  const event$ = next(req);
+  if (false) {
+    return event$.pipe(tap((event) => {
+      if (event instanceof HttpResponse) {
+        transferState.set(storeKey, {
+          [BODY]: event.body,
+          [HEADERS]: getFilteredHeaders(event.headers, headersToInclude),
+          [STATUS]: event.status,
+          [STATUS_TEXT]: event.statusText,
+          [REQ_URL]: requestUrl,
+          [RESPONSE_TYPE]: req.responseType
+        });
+      }
+    }));
+  }
+  return event$;
+}
+function hasAuthHeaders(req) {
+  return req.headers.has("authorization") || req.headers.has("proxy-authorization");
+}
+function sortAndConcatParams(params) {
+  return [...params.keys()].sort().map((k) => `${k}=${params.getAll(k)}`).join("&");
+}
+function makeCacheKey(request, mappedRequestUrl) {
+  const { params, method, responseType } = request;
+  const encodedParams = sortAndConcatParams(params);
+  let serializedBody = request.serializeBody();
+  if (serializedBody instanceof URLSearchParams) {
+    serializedBody = sortAndConcatParams(serializedBody);
+  } else if (typeof serializedBody !== "string") {
+    serializedBody = "";
+  }
+  const key = [method, responseType, mappedRequestUrl, serializedBody, encodedParams].join("|");
+  const hash = generateHash(key);
+  return makeStateKey(hash);
+}
+function generateHash(value) {
+  let hash = 0;
+  for (const char of value) {
+    hash = Math.imul(31, hash) + char.charCodeAt(0) << 0;
+  }
+  hash += 2147483647 + 1;
+  return hash.toString();
+}
+function withHttpTransferCache(cacheOptions) {
+  return [
+    {
+      provide: CACHE_OPTIONS,
+      useFactory: () => {
+        performanceMarkFeature("NgHttpTransferCache");
+        return __spreadValues({ isCacheActive: true }, cacheOptions);
+      }
+    },
+    {
+      provide: HTTP_ROOT_INTERCEPTOR_FNS,
+      useValue: transferCacheInterceptorFn,
+      multi: true
+    },
+    {
+      provide: APP_BOOTSTRAP_LISTENER,
+      multi: true,
+      useFactory: () => {
+        const appRef = inject(ApplicationRef);
+        const cacheState = inject(CACHE_OPTIONS);
+        return () => {
+          appRef.whenStable().then(() => {
+            cacheState.isCacheActive = false;
+          });
+        };
+      }
+    }
+  ];
+}
+function appendMissingHeadersDetection(url, headers, headersToInclude) {
+  const warningProduced = /* @__PURE__ */ new Set();
+  return new Proxy(headers, {
+    get(target, prop) {
+      const value = Reflect.get(target, prop);
+      const methods = /* @__PURE__ */ new Set(["get", "has", "getAll"]);
+      if (typeof value !== "function" || !methods.has(prop)) {
+        return value;
+      }
+      return (headerName) => {
+        const key = (prop + ":" + headerName).toLowerCase();
+        if (!headersToInclude.includes(headerName) && !warningProduced.has(key)) {
+          warningProduced.add(key);
+          const truncatedUrl = truncateMiddle(url);
+          console.warn(formatRuntimeError(2802, `Angular detected that the \`${headerName}\` header is accessed, but the value of the header was not transferred from the server to the client by the HttpTransferCache. To include the value of the \`${headerName}\` header for the \`${truncatedUrl}\` request, use the \`includeHeaders\` list. The \`includeHeaders\` can be defined either on a request level by adding the \`transferCache\` parameter, or on an application level by adding the \`httpCacheTransfer.includeHeaders\` argument to the \`provideClientHydration()\` call. `));
+        }
+        return value.apply(target, [headerName]);
+      };
+    }
+  });
+}
+
+export {
+  HttpHandler,
+  HttpBackend,
+  HttpHeaders,
+  HttpUrlEncodingCodec,
+  HttpParams,
+  HttpContextToken,
+  HttpContext,
+  HttpRequest,
+  HttpEventType,
+  HttpResponseBase,
+  HttpHeaderResponse,
+  HttpResponse,
+  HttpErrorResponse,
+  HttpStatusCode,
+  HttpClient,
+  FetchBackend,
+  HTTP_INTERCEPTORS,
+  HTTP_ROOT_INTERCEPTOR_FNS,
+  REQUESTS_CONTRIBUTE_TO_STABILITY,
+  HttpInterceptorHandler,
+  JsonpClientBackend,
+  JsonpInterceptor,
+  HttpXhrBackend,
+  HttpXsrfTokenExtractor,
+  HttpFeatureKind,
+  provideHttpClient,
+  withInterceptors,
+  withInterceptorsFromDi,
+  withXsrfConfiguration,
+  withNoXsrfProtection,
+  withJsonpSupport,
+  withRequestsMadeViaParent,
+  withFetch,
+  HttpClientXsrfModule,
+  HttpClientModule,
+  HttpClientJsonpModule,
+  httpResource,
+  HTTP_TRANSFER_CACHE_ORIGIN_MAP,
+  withHttpTransferCache
+};
+/*! Bundled license information:
+
+@angular/common/fesm2022/module.mjs:
+@angular/common/fesm2022/http.mjs:
+  (**
+   * @license Angular v20.0.5
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=chunk-YWBOMLBY.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/chunk-YWBOMLBY.js.map


+ 3 - 0
ai-interview/vite/deps/package.json

@@ -0,0 +1,3 @@
+{
+  "type": "module"
+}

+ 4148 - 0
ai-interview/vite/deps/swiper.js

@@ -0,0 +1,4148 @@
+import {
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/swiper/shared/ssr-window.esm.mjs
+function isObject(obj) {
+  return obj !== null && typeof obj === "object" && "constructor" in obj && obj.constructor === Object;
+}
+function extend(target, src) {
+  if (target === void 0) {
+    target = {};
+  }
+  if (src === void 0) {
+    src = {};
+  }
+  const noExtend = ["__proto__", "constructor", "prototype"];
+  Object.keys(src).filter((key) => noExtend.indexOf(key) < 0).forEach((key) => {
+    if (typeof target[key] === "undefined") target[key] = src[key];
+    else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {
+      extend(target[key], src[key]);
+    }
+  });
+}
+var ssrDocument = {
+  body: {},
+  addEventListener() {
+  },
+  removeEventListener() {
+  },
+  activeElement: {
+    blur() {
+    },
+    nodeName: ""
+  },
+  querySelector() {
+    return null;
+  },
+  querySelectorAll() {
+    return [];
+  },
+  getElementById() {
+    return null;
+  },
+  createEvent() {
+    return {
+      initEvent() {
+      }
+    };
+  },
+  createElement() {
+    return {
+      children: [],
+      childNodes: [],
+      style: {},
+      setAttribute() {
+      },
+      getElementsByTagName() {
+        return [];
+      }
+    };
+  },
+  createElementNS() {
+    return {};
+  },
+  importNode() {
+    return null;
+  },
+  location: {
+    hash: "",
+    host: "",
+    hostname: "",
+    href: "",
+    origin: "",
+    pathname: "",
+    protocol: "",
+    search: ""
+  }
+};
+function getDocument() {
+  const doc = typeof document !== "undefined" ? document : {};
+  extend(doc, ssrDocument);
+  return doc;
+}
+var ssrWindow = {
+  document: ssrDocument,
+  navigator: {
+    userAgent: ""
+  },
+  location: {
+    hash: "",
+    host: "",
+    hostname: "",
+    href: "",
+    origin: "",
+    pathname: "",
+    protocol: "",
+    search: ""
+  },
+  history: {
+    replaceState() {
+    },
+    pushState() {
+    },
+    go() {
+    },
+    back() {
+    }
+  },
+  CustomEvent: function CustomEvent() {
+    return this;
+  },
+  addEventListener() {
+  },
+  removeEventListener() {
+  },
+  getComputedStyle() {
+    return {
+      getPropertyValue() {
+        return "";
+      }
+    };
+  },
+  Image() {
+  },
+  Date() {
+  },
+  screen: {},
+  setTimeout() {
+  },
+  clearTimeout() {
+  },
+  matchMedia() {
+    return {};
+  },
+  requestAnimationFrame(callback) {
+    if (typeof setTimeout === "undefined") {
+      callback();
+      return null;
+    }
+    return setTimeout(callback, 0);
+  },
+  cancelAnimationFrame(id) {
+    if (typeof setTimeout === "undefined") {
+      return;
+    }
+    clearTimeout(id);
+  }
+};
+function getWindow() {
+  const win = typeof window !== "undefined" ? window : {};
+  extend(win, ssrWindow);
+  return win;
+}
+
+// node_modules/swiper/shared/utils.mjs
+function classesToTokens(classes2) {
+  if (classes2 === void 0) {
+    classes2 = "";
+  }
+  return classes2.trim().split(" ").filter((c) => !!c.trim());
+}
+function deleteProps(obj) {
+  const object = obj;
+  Object.keys(object).forEach((key) => {
+    try {
+      object[key] = null;
+    } catch (e) {
+    }
+    try {
+      delete object[key];
+    } catch (e) {
+    }
+  });
+}
+function nextTick(callback, delay) {
+  if (delay === void 0) {
+    delay = 0;
+  }
+  return setTimeout(callback, delay);
+}
+function now() {
+  return Date.now();
+}
+function getComputedStyle2(el) {
+  const window2 = getWindow();
+  let style;
+  if (window2.getComputedStyle) {
+    style = window2.getComputedStyle(el, null);
+  }
+  if (!style && el.currentStyle) {
+    style = el.currentStyle;
+  }
+  if (!style) {
+    style = el.style;
+  }
+  return style;
+}
+function getTranslate(el, axis) {
+  if (axis === void 0) {
+    axis = "x";
+  }
+  const window2 = getWindow();
+  let matrix;
+  let curTransform;
+  let transformMatrix;
+  const curStyle = getComputedStyle2(el);
+  if (window2.WebKitCSSMatrix) {
+    curTransform = curStyle.transform || curStyle.webkitTransform;
+    if (curTransform.split(",").length > 6) {
+      curTransform = curTransform.split(", ").map((a) => a.replace(",", ".")).join(", ");
+    }
+    transformMatrix = new window2.WebKitCSSMatrix(curTransform === "none" ? "" : curTransform);
+  } else {
+    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue("transform").replace("translate(", "matrix(1, 0, 0, 1,");
+    matrix = transformMatrix.toString().split(",");
+  }
+  if (axis === "x") {
+    if (window2.WebKitCSSMatrix) curTransform = transformMatrix.m41;
+    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]);
+    else curTransform = parseFloat(matrix[4]);
+  }
+  if (axis === "y") {
+    if (window2.WebKitCSSMatrix) curTransform = transformMatrix.m42;
+    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]);
+    else curTransform = parseFloat(matrix[5]);
+  }
+  return curTransform || 0;
+}
+function isObject2(o) {
+  return typeof o === "object" && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === "Object";
+}
+function isNode(node) {
+  if (typeof window !== "undefined" && typeof window.HTMLElement !== "undefined") {
+    return node instanceof HTMLElement;
+  }
+  return node && (node.nodeType === 1 || node.nodeType === 11);
+}
+function extend2() {
+  const to = Object(arguments.length <= 0 ? void 0 : arguments[0]);
+  const noExtend = ["__proto__", "constructor", "prototype"];
+  for (let i = 1; i < arguments.length; i += 1) {
+    const nextSource = i < 0 || arguments.length <= i ? void 0 : arguments[i];
+    if (nextSource !== void 0 && nextSource !== null && !isNode(nextSource)) {
+      const keysArray = Object.keys(Object(nextSource)).filter((key) => noExtend.indexOf(key) < 0);
+      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {
+        const nextKey = keysArray[nextIndex];
+        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);
+        if (desc !== void 0 && desc.enumerable) {
+          if (isObject2(to[nextKey]) && isObject2(nextSource[nextKey])) {
+            if (nextSource[nextKey].__swiper__) {
+              to[nextKey] = nextSource[nextKey];
+            } else {
+              extend2(to[nextKey], nextSource[nextKey]);
+            }
+          } else if (!isObject2(to[nextKey]) && isObject2(nextSource[nextKey])) {
+            to[nextKey] = {};
+            if (nextSource[nextKey].__swiper__) {
+              to[nextKey] = nextSource[nextKey];
+            } else {
+              extend2(to[nextKey], nextSource[nextKey]);
+            }
+          } else {
+            to[nextKey] = nextSource[nextKey];
+          }
+        }
+      }
+    }
+  }
+  return to;
+}
+function setCSSProperty(el, varName, varValue) {
+  el.style.setProperty(varName, varValue);
+}
+function animateCSSModeScroll(_ref) {
+  let {
+    swiper,
+    targetPosition,
+    side
+  } = _ref;
+  const window2 = getWindow();
+  const startPosition = -swiper.translate;
+  let startTime = null;
+  let time;
+  const duration = swiper.params.speed;
+  swiper.wrapperEl.style.scrollSnapType = "none";
+  window2.cancelAnimationFrame(swiper.cssModeFrameID);
+  const dir = targetPosition > startPosition ? "next" : "prev";
+  const isOutOfBound = (current, target) => {
+    return dir === "next" && current >= target || dir === "prev" && current <= target;
+  };
+  const animate = () => {
+    time = (/* @__PURE__ */ new Date()).getTime();
+    if (startTime === null) {
+      startTime = time;
+    }
+    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);
+    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;
+    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);
+    if (isOutOfBound(currentPosition, targetPosition)) {
+      currentPosition = targetPosition;
+    }
+    swiper.wrapperEl.scrollTo({
+      [side]: currentPosition
+    });
+    if (isOutOfBound(currentPosition, targetPosition)) {
+      swiper.wrapperEl.style.overflow = "hidden";
+      swiper.wrapperEl.style.scrollSnapType = "";
+      setTimeout(() => {
+        swiper.wrapperEl.style.overflow = "";
+        swiper.wrapperEl.scrollTo({
+          [side]: currentPosition
+        });
+      });
+      window2.cancelAnimationFrame(swiper.cssModeFrameID);
+      return;
+    }
+    swiper.cssModeFrameID = window2.requestAnimationFrame(animate);
+  };
+  animate();
+}
+function elementChildren(element, selector) {
+  if (selector === void 0) {
+    selector = "";
+  }
+  const window2 = getWindow();
+  const children = [...element.children];
+  if (window2.HTMLSlotElement && element instanceof HTMLSlotElement) {
+    children.push(...element.assignedElements());
+  }
+  if (!selector) {
+    return children;
+  }
+  return children.filter((el) => el.matches(selector));
+}
+function elementIsChildOfSlot(el, slot) {
+  const elementsQueue = [slot];
+  while (elementsQueue.length > 0) {
+    const elementToCheck = elementsQueue.shift();
+    if (el === elementToCheck) {
+      return true;
+    }
+    elementsQueue.push(...elementToCheck.children, ...elementToCheck.shadowRoot ? elementToCheck.shadowRoot.children : [], ...elementToCheck.assignedElements ? elementToCheck.assignedElements() : []);
+  }
+}
+function elementIsChildOf(el, parent) {
+  const window2 = getWindow();
+  let isChild = parent.contains(el);
+  if (!isChild && window2.HTMLSlotElement && parent instanceof HTMLSlotElement) {
+    const children = [...parent.assignedElements()];
+    isChild = children.includes(el);
+    if (!isChild) {
+      isChild = elementIsChildOfSlot(el, parent);
+    }
+  }
+  return isChild;
+}
+function showWarning(text) {
+  try {
+    console.warn(text);
+    return;
+  } catch (err) {
+  }
+}
+function createElement(tag, classes2) {
+  if (classes2 === void 0) {
+    classes2 = [];
+  }
+  const el = document.createElement(tag);
+  el.classList.add(...Array.isArray(classes2) ? classes2 : classesToTokens(classes2));
+  return el;
+}
+function elementPrevAll(el, selector) {
+  const prevEls = [];
+  while (el.previousElementSibling) {
+    const prev = el.previousElementSibling;
+    if (selector) {
+      if (prev.matches(selector)) prevEls.push(prev);
+    } else prevEls.push(prev);
+    el = prev;
+  }
+  return prevEls;
+}
+function elementNextAll(el, selector) {
+  const nextEls = [];
+  while (el.nextElementSibling) {
+    const next = el.nextElementSibling;
+    if (selector) {
+      if (next.matches(selector)) nextEls.push(next);
+    } else nextEls.push(next);
+    el = next;
+  }
+  return nextEls;
+}
+function elementStyle(el, prop) {
+  const window2 = getWindow();
+  return window2.getComputedStyle(el, null).getPropertyValue(prop);
+}
+function elementIndex(el) {
+  let child = el;
+  let i;
+  if (child) {
+    i = 0;
+    while ((child = child.previousSibling) !== null) {
+      if (child.nodeType === 1) i += 1;
+    }
+    return i;
+  }
+  return void 0;
+}
+function elementParents(el, selector) {
+  const parents = [];
+  let parent = el.parentElement;
+  while (parent) {
+    if (selector) {
+      if (parent.matches(selector)) parents.push(parent);
+    } else {
+      parents.push(parent);
+    }
+    parent = parent.parentElement;
+  }
+  return parents;
+}
+function elementOuterSize(el, size, includeMargins) {
+  const window2 = getWindow();
+  if (includeMargins) {
+    return el[size === "width" ? "offsetWidth" : "offsetHeight"] + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-right" : "margin-top")) + parseFloat(window2.getComputedStyle(el, null).getPropertyValue(size === "width" ? "margin-left" : "margin-bottom"));
+  }
+  return el.offsetWidth;
+}
+
+// node_modules/swiper/shared/swiper-core.mjs
+var support;
+function calcSupport() {
+  const window2 = getWindow();
+  const document2 = getDocument();
+  return {
+    smoothScroll: document2.documentElement && document2.documentElement.style && "scrollBehavior" in document2.documentElement.style,
+    touch: !!("ontouchstart" in window2 || window2.DocumentTouch && document2 instanceof window2.DocumentTouch)
+  };
+}
+function getSupport() {
+  if (!support) {
+    support = calcSupport();
+  }
+  return support;
+}
+var deviceCached;
+function calcDevice(_temp) {
+  let {
+    userAgent
+  } = _temp === void 0 ? {} : _temp;
+  const support2 = getSupport();
+  const window2 = getWindow();
+  const platform = window2.navigator.platform;
+  const ua = userAgent || window2.navigator.userAgent;
+  const device = {
+    ios: false,
+    android: false
+  };
+  const screenWidth = window2.screen.width;
+  const screenHeight = window2.screen.height;
+  const android = ua.match(/(Android);?[\s\/]+([\d.]+)?/);
+  let ipad = ua.match(/(iPad).*OS\s([\d_]+)/);
+  const ipod = ua.match(/(iPod)(.*OS\s([\d_]+))?/);
+  const iphone = !ipad && ua.match(/(iPhone\sOS|iOS)\s([\d_]+)/);
+  const windows = platform === "Win32";
+  let macos = platform === "MacIntel";
+  const iPadScreens = ["1024x1366", "1366x1024", "834x1194", "1194x834", "834x1112", "1112x834", "768x1024", "1024x768", "820x1180", "1180x820", "810x1080", "1080x810"];
+  if (!ipad && macos && support2.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {
+    ipad = ua.match(/(Version)\/([\d.]+)/);
+    if (!ipad) ipad = [0, 1, "13_0_0"];
+    macos = false;
+  }
+  if (android && !windows) {
+    device.os = "android";
+    device.android = true;
+  }
+  if (ipad || iphone || ipod) {
+    device.os = "ios";
+    device.ios = true;
+  }
+  return device;
+}
+function getDevice(overrides) {
+  if (overrides === void 0) {
+    overrides = {};
+  }
+  if (!deviceCached) {
+    deviceCached = calcDevice(overrides);
+  }
+  return deviceCached;
+}
+var browser;
+function calcBrowser() {
+  const window2 = getWindow();
+  const device = getDevice();
+  let needPerspectiveFix = false;
+  function isSafari() {
+    const ua = window2.navigator.userAgent.toLowerCase();
+    return ua.indexOf("safari") >= 0 && ua.indexOf("chrome") < 0 && ua.indexOf("android") < 0;
+  }
+  if (isSafari()) {
+    const ua = String(window2.navigator.userAgent);
+    if (ua.includes("Version/")) {
+      const [major, minor] = ua.split("Version/")[1].split(" ")[0].split(".").map((num) => Number(num));
+      needPerspectiveFix = major < 16 || major === 16 && minor < 2;
+    }
+  }
+  const isWebView = /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window2.navigator.userAgent);
+  const isSafariBrowser = isSafari();
+  const need3dFix = isSafariBrowser || isWebView && device.ios;
+  return {
+    isSafari: needPerspectiveFix || isSafariBrowser,
+    needPerspectiveFix,
+    need3dFix,
+    isWebView
+  };
+}
+function getBrowser() {
+  if (!browser) {
+    browser = calcBrowser();
+  }
+  return browser;
+}
+function Resize(_ref) {
+  let {
+    swiper,
+    on,
+    emit
+  } = _ref;
+  const window2 = getWindow();
+  let observer = null;
+  let animationFrame = null;
+  const resizeHandler = () => {
+    if (!swiper || swiper.destroyed || !swiper.initialized) return;
+    emit("beforeResize");
+    emit("resize");
+  };
+  const createObserver = () => {
+    if (!swiper || swiper.destroyed || !swiper.initialized) return;
+    observer = new ResizeObserver((entries) => {
+      animationFrame = window2.requestAnimationFrame(() => {
+        const {
+          width,
+          height
+        } = swiper;
+        let newWidth = width;
+        let newHeight = height;
+        entries.forEach((_ref2) => {
+          let {
+            contentBoxSize,
+            contentRect,
+            target
+          } = _ref2;
+          if (target && target !== swiper.el) return;
+          newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;
+          newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;
+        });
+        if (newWidth !== width || newHeight !== height) {
+          resizeHandler();
+        }
+      });
+    });
+    observer.observe(swiper.el);
+  };
+  const removeObserver = () => {
+    if (animationFrame) {
+      window2.cancelAnimationFrame(animationFrame);
+    }
+    if (observer && observer.unobserve && swiper.el) {
+      observer.unobserve(swiper.el);
+      observer = null;
+    }
+  };
+  const orientationChangeHandler = () => {
+    if (!swiper || swiper.destroyed || !swiper.initialized) return;
+    emit("orientationchange");
+  };
+  on("init", () => {
+    if (swiper.params.resizeObserver && typeof window2.ResizeObserver !== "undefined") {
+      createObserver();
+      return;
+    }
+    window2.addEventListener("resize", resizeHandler);
+    window2.addEventListener("orientationchange", orientationChangeHandler);
+  });
+  on("destroy", () => {
+    removeObserver();
+    window2.removeEventListener("resize", resizeHandler);
+    window2.removeEventListener("orientationchange", orientationChangeHandler);
+  });
+}
+function Observer(_ref) {
+  let {
+    swiper,
+    extendParams,
+    on,
+    emit
+  } = _ref;
+  const observers = [];
+  const window2 = getWindow();
+  const attach = function(target, options) {
+    if (options === void 0) {
+      options = {};
+    }
+    const ObserverFunc = window2.MutationObserver || window2.WebkitMutationObserver;
+    const observer = new ObserverFunc((mutations) => {
+      if (swiper.__preventObserver__) return;
+      if (mutations.length === 1) {
+        emit("observerUpdate", mutations[0]);
+        return;
+      }
+      const observerUpdate = function observerUpdate2() {
+        emit("observerUpdate", mutations[0]);
+      };
+      if (window2.requestAnimationFrame) {
+        window2.requestAnimationFrame(observerUpdate);
+      } else {
+        window2.setTimeout(observerUpdate, 0);
+      }
+    });
+    observer.observe(target, {
+      attributes: typeof options.attributes === "undefined" ? true : options.attributes,
+      childList: swiper.isElement || (typeof options.childList === "undefined" ? true : options).childList,
+      characterData: typeof options.characterData === "undefined" ? true : options.characterData
+    });
+    observers.push(observer);
+  };
+  const init = () => {
+    if (!swiper.params.observer) return;
+    if (swiper.params.observeParents) {
+      const containerParents = elementParents(swiper.hostEl);
+      for (let i = 0; i < containerParents.length; i += 1) {
+        attach(containerParents[i]);
+      }
+    }
+    attach(swiper.hostEl, {
+      childList: swiper.params.observeSlideChildren
+    });
+    attach(swiper.wrapperEl, {
+      attributes: false
+    });
+  };
+  const destroy = () => {
+    observers.forEach((observer) => {
+      observer.disconnect();
+    });
+    observers.splice(0, observers.length);
+  };
+  extendParams({
+    observer: false,
+    observeParents: false,
+    observeSlideChildren: false
+  });
+  on("init", init);
+  on("destroy", destroy);
+}
+var eventsEmitter = {
+  on(events2, handler, priority) {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (typeof handler !== "function") return self;
+    const method = priority ? "unshift" : "push";
+    events2.split(" ").forEach((event) => {
+      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];
+      self.eventsListeners[event][method](handler);
+    });
+    return self;
+  },
+  once(events2, handler, priority) {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (typeof handler !== "function") return self;
+    function onceHandler() {
+      self.off(events2, onceHandler);
+      if (onceHandler.__emitterProxy) {
+        delete onceHandler.__emitterProxy;
+      }
+      for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+        args[_key] = arguments[_key];
+      }
+      handler.apply(self, args);
+    }
+    onceHandler.__emitterProxy = handler;
+    return self.on(events2, onceHandler, priority);
+  },
+  onAny(handler, priority) {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (typeof handler !== "function") return self;
+    const method = priority ? "unshift" : "push";
+    if (self.eventsAnyListeners.indexOf(handler) < 0) {
+      self.eventsAnyListeners[method](handler);
+    }
+    return self;
+  },
+  offAny(handler) {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (!self.eventsAnyListeners) return self;
+    const index = self.eventsAnyListeners.indexOf(handler);
+    if (index >= 0) {
+      self.eventsAnyListeners.splice(index, 1);
+    }
+    return self;
+  },
+  off(events2, handler) {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (!self.eventsListeners) return self;
+    events2.split(" ").forEach((event) => {
+      if (typeof handler === "undefined") {
+        self.eventsListeners[event] = [];
+      } else if (self.eventsListeners[event]) {
+        self.eventsListeners[event].forEach((eventHandler, index) => {
+          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {
+            self.eventsListeners[event].splice(index, 1);
+          }
+        });
+      }
+    });
+    return self;
+  },
+  emit() {
+    const self = this;
+    if (!self.eventsListeners || self.destroyed) return self;
+    if (!self.eventsListeners) return self;
+    let events2;
+    let data;
+    let context;
+    for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
+      args[_key2] = arguments[_key2];
+    }
+    if (typeof args[0] === "string" || Array.isArray(args[0])) {
+      events2 = args[0];
+      data = args.slice(1, args.length);
+      context = self;
+    } else {
+      events2 = args[0].events;
+      data = args[0].data;
+      context = args[0].context || self;
+    }
+    data.unshift(context);
+    const eventsArray = Array.isArray(events2) ? events2 : events2.split(" ");
+    eventsArray.forEach((event) => {
+      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {
+        self.eventsAnyListeners.forEach((eventHandler) => {
+          eventHandler.apply(context, [event, ...data]);
+        });
+      }
+      if (self.eventsListeners && self.eventsListeners[event]) {
+        self.eventsListeners[event].forEach((eventHandler) => {
+          eventHandler.apply(context, data);
+        });
+      }
+    });
+    return self;
+  }
+};
+function updateSize() {
+  const swiper = this;
+  let width;
+  let height;
+  const el = swiper.el;
+  if (typeof swiper.params.width !== "undefined" && swiper.params.width !== null) {
+    width = swiper.params.width;
+  } else {
+    width = el.clientWidth;
+  }
+  if (typeof swiper.params.height !== "undefined" && swiper.params.height !== null) {
+    height = swiper.params.height;
+  } else {
+    height = el.clientHeight;
+  }
+  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {
+    return;
+  }
+  width = width - parseInt(elementStyle(el, "padding-left") || 0, 10) - parseInt(elementStyle(el, "padding-right") || 0, 10);
+  height = height - parseInt(elementStyle(el, "padding-top") || 0, 10) - parseInt(elementStyle(el, "padding-bottom") || 0, 10);
+  if (Number.isNaN(width)) width = 0;
+  if (Number.isNaN(height)) height = 0;
+  Object.assign(swiper, {
+    width,
+    height,
+    size: swiper.isHorizontal() ? width : height
+  });
+}
+function updateSlides() {
+  const swiper = this;
+  function getDirectionPropertyValue(node, label) {
+    return parseFloat(node.getPropertyValue(swiper.getDirectionLabel(label)) || 0);
+  }
+  const params = swiper.params;
+  const {
+    wrapperEl,
+    slidesEl,
+    size: swiperSize,
+    rtlTranslate: rtl,
+    wrongRTL
+  } = swiper;
+  const isVirtual = swiper.virtual && params.virtual.enabled;
+  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;
+  const slides = elementChildren(slidesEl, `.${swiper.params.slideClass}, swiper-slide`);
+  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;
+  let snapGrid = [];
+  const slidesGrid = [];
+  const slidesSizesGrid = [];
+  let offsetBefore = params.slidesOffsetBefore;
+  if (typeof offsetBefore === "function") {
+    offsetBefore = params.slidesOffsetBefore.call(swiper);
+  }
+  let offsetAfter = params.slidesOffsetAfter;
+  if (typeof offsetAfter === "function") {
+    offsetAfter = params.slidesOffsetAfter.call(swiper);
+  }
+  const previousSnapGridLength = swiper.snapGrid.length;
+  const previousSlidesGridLength = swiper.slidesGrid.length;
+  let spaceBetween = params.spaceBetween;
+  let slidePosition = -offsetBefore;
+  let prevSlideSize = 0;
+  let index = 0;
+  if (typeof swiperSize === "undefined") {
+    return;
+  }
+  if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) {
+    spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiperSize;
+  } else if (typeof spaceBetween === "string") {
+    spaceBetween = parseFloat(spaceBetween);
+  }
+  swiper.virtualSize = -spaceBetween;
+  slides.forEach((slideEl) => {
+    if (rtl) {
+      slideEl.style.marginLeft = "";
+    } else {
+      slideEl.style.marginRight = "";
+    }
+    slideEl.style.marginBottom = "";
+    slideEl.style.marginTop = "";
+  });
+  if (params.centeredSlides && params.cssMode) {
+    setCSSProperty(wrapperEl, "--swiper-centered-offset-before", "");
+    setCSSProperty(wrapperEl, "--swiper-centered-offset-after", "");
+  }
+  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;
+  if (gridEnabled) {
+    swiper.grid.initSlides(slides);
+  } else if (swiper.grid) {
+    swiper.grid.unsetSlides();
+  }
+  let slideSize;
+  const shouldResetSlideSize = params.slidesPerView === "auto" && params.breakpoints && Object.keys(params.breakpoints).filter((key) => {
+    return typeof params.breakpoints[key].slidesPerView !== "undefined";
+  }).length > 0;
+  for (let i = 0; i < slidesLength; i += 1) {
+    slideSize = 0;
+    let slide2;
+    if (slides[i]) slide2 = slides[i];
+    if (gridEnabled) {
+      swiper.grid.updateSlide(i, slide2, slides);
+    }
+    if (slides[i] && elementStyle(slide2, "display") === "none") continue;
+    if (params.slidesPerView === "auto") {
+      if (shouldResetSlideSize) {
+        slides[i].style[swiper.getDirectionLabel("width")] = ``;
+      }
+      const slideStyles = getComputedStyle(slide2);
+      const currentTransform = slide2.style.transform;
+      const currentWebKitTransform = slide2.style.webkitTransform;
+      if (currentTransform) {
+        slide2.style.transform = "none";
+      }
+      if (currentWebKitTransform) {
+        slide2.style.webkitTransform = "none";
+      }
+      if (params.roundLengths) {
+        slideSize = swiper.isHorizontal() ? elementOuterSize(slide2, "width", true) : elementOuterSize(slide2, "height", true);
+      } else {
+        const width = getDirectionPropertyValue(slideStyles, "width");
+        const paddingLeft = getDirectionPropertyValue(slideStyles, "padding-left");
+        const paddingRight = getDirectionPropertyValue(slideStyles, "padding-right");
+        const marginLeft = getDirectionPropertyValue(slideStyles, "margin-left");
+        const marginRight = getDirectionPropertyValue(slideStyles, "margin-right");
+        const boxSizing = slideStyles.getPropertyValue("box-sizing");
+        if (boxSizing && boxSizing === "border-box") {
+          slideSize = width + marginLeft + marginRight;
+        } else {
+          const {
+            clientWidth,
+            offsetWidth
+          } = slide2;
+          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);
+        }
+      }
+      if (currentTransform) {
+        slide2.style.transform = currentTransform;
+      }
+      if (currentWebKitTransform) {
+        slide2.style.webkitTransform = currentWebKitTransform;
+      }
+      if (params.roundLengths) slideSize = Math.floor(slideSize);
+    } else {
+      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;
+      if (params.roundLengths) slideSize = Math.floor(slideSize);
+      if (slides[i]) {
+        slides[i].style[swiper.getDirectionLabel("width")] = `${slideSize}px`;
+      }
+    }
+    if (slides[i]) {
+      slides[i].swiperSlideSize = slideSize;
+    }
+    slidesSizesGrid.push(slideSize);
+    if (params.centeredSlides) {
+      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;
+      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
+      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;
+      if (Math.abs(slidePosition) < 1 / 1e3) slidePosition = 0;
+      if (params.roundLengths) slidePosition = Math.floor(slidePosition);
+      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);
+      slidesGrid.push(slidePosition);
+    } else {
+      if (params.roundLengths) slidePosition = Math.floor(slidePosition);
+      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);
+      slidesGrid.push(slidePosition);
+      slidePosition = slidePosition + slideSize + spaceBetween;
+    }
+    swiper.virtualSize += slideSize + spaceBetween;
+    prevSlideSize = slideSize;
+    index += 1;
+  }
+  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;
+  if (rtl && wrongRTL && (params.effect === "slide" || params.effect === "coverflow")) {
+    wrapperEl.style.width = `${swiper.virtualSize + spaceBetween}px`;
+  }
+  if (params.setWrapperSize) {
+    wrapperEl.style[swiper.getDirectionLabel("width")] = `${swiper.virtualSize + spaceBetween}px`;
+  }
+  if (gridEnabled) {
+    swiper.grid.updateWrapperSize(slideSize, snapGrid);
+  }
+  if (!params.centeredSlides) {
+    const newSlidesGrid = [];
+    for (let i = 0; i < snapGrid.length; i += 1) {
+      let slidesGridItem = snapGrid[i];
+      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);
+      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {
+        newSlidesGrid.push(slidesGridItem);
+      }
+    }
+    snapGrid = newSlidesGrid;
+    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {
+      snapGrid.push(swiper.virtualSize - swiperSize);
+    }
+  }
+  if (isVirtual && params.loop) {
+    const size = slidesSizesGrid[0] + spaceBetween;
+    if (params.slidesPerGroup > 1) {
+      const groups = Math.ceil((swiper.virtual.slidesBefore + swiper.virtual.slidesAfter) / params.slidesPerGroup);
+      const groupSize = size * params.slidesPerGroup;
+      for (let i = 0; i < groups; i += 1) {
+        snapGrid.push(snapGrid[snapGrid.length - 1] + groupSize);
+      }
+    }
+    for (let i = 0; i < swiper.virtual.slidesBefore + swiper.virtual.slidesAfter; i += 1) {
+      if (params.slidesPerGroup === 1) {
+        snapGrid.push(snapGrid[snapGrid.length - 1] + size);
+      }
+      slidesGrid.push(slidesGrid[slidesGrid.length - 1] + size);
+      swiper.virtualSize += size;
+    }
+  }
+  if (snapGrid.length === 0) snapGrid = [0];
+  if (spaceBetween !== 0) {
+    const key = swiper.isHorizontal() && rtl ? "marginLeft" : swiper.getDirectionLabel("marginRight");
+    slides.filter((_, slideIndex) => {
+      if (!params.cssMode || params.loop) return true;
+      if (slideIndex === slides.length - 1) {
+        return false;
+      }
+      return true;
+    }).forEach((slideEl) => {
+      slideEl.style[key] = `${spaceBetween}px`;
+    });
+  }
+  if (params.centeredSlides && params.centeredSlidesBounds) {
+    let allSlidesSize = 0;
+    slidesSizesGrid.forEach((slideSizeValue) => {
+      allSlidesSize += slideSizeValue + (spaceBetween || 0);
+    });
+    allSlidesSize -= spaceBetween;
+    const maxSnap = allSlidesSize > swiperSize ? allSlidesSize - swiperSize : 0;
+    snapGrid = snapGrid.map((snap) => {
+      if (snap <= 0) return -offsetBefore;
+      if (snap > maxSnap) return maxSnap + offsetAfter;
+      return snap;
+    });
+  }
+  if (params.centerInsufficientSlides) {
+    let allSlidesSize = 0;
+    slidesSizesGrid.forEach((slideSizeValue) => {
+      allSlidesSize += slideSizeValue + (spaceBetween || 0);
+    });
+    allSlidesSize -= spaceBetween;
+    const offsetSize = (params.slidesOffsetBefore || 0) + (params.slidesOffsetAfter || 0);
+    if (allSlidesSize + offsetSize < swiperSize) {
+      const allSlidesOffset = (swiperSize - allSlidesSize - offsetSize) / 2;
+      snapGrid.forEach((snap, snapIndex) => {
+        snapGrid[snapIndex] = snap - allSlidesOffset;
+      });
+      slidesGrid.forEach((snap, snapIndex) => {
+        slidesGrid[snapIndex] = snap + allSlidesOffset;
+      });
+    }
+  }
+  Object.assign(swiper, {
+    slides,
+    snapGrid,
+    slidesGrid,
+    slidesSizesGrid
+  });
+  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {
+    setCSSProperty(wrapperEl, "--swiper-centered-offset-before", `${-snapGrid[0]}px`);
+    setCSSProperty(wrapperEl, "--swiper-centered-offset-after", `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);
+    const addToSnapGrid = -swiper.snapGrid[0];
+    const addToSlidesGrid = -swiper.slidesGrid[0];
+    swiper.snapGrid = swiper.snapGrid.map((v) => v + addToSnapGrid);
+    swiper.slidesGrid = swiper.slidesGrid.map((v) => v + addToSlidesGrid);
+  }
+  if (slidesLength !== previousSlidesLength) {
+    swiper.emit("slidesLengthChange");
+  }
+  if (snapGrid.length !== previousSnapGridLength) {
+    if (swiper.params.watchOverflow) swiper.checkOverflow();
+    swiper.emit("snapGridLengthChange");
+  }
+  if (slidesGrid.length !== previousSlidesGridLength) {
+    swiper.emit("slidesGridLengthChange");
+  }
+  if (params.watchSlidesProgress) {
+    swiper.updateSlidesOffset();
+  }
+  swiper.emit("slidesUpdated");
+  if (!isVirtual && !params.cssMode && (params.effect === "slide" || params.effect === "fade")) {
+    const backFaceHiddenClass = `${params.containerModifierClass}backface-hidden`;
+    const hasClassBackfaceClassAdded = swiper.el.classList.contains(backFaceHiddenClass);
+    if (slidesLength <= params.maxBackfaceHiddenSlides) {
+      if (!hasClassBackfaceClassAdded) swiper.el.classList.add(backFaceHiddenClass);
+    } else if (hasClassBackfaceClassAdded) {
+      swiper.el.classList.remove(backFaceHiddenClass);
+    }
+  }
+}
+function updateAutoHeight(speed) {
+  const swiper = this;
+  const activeSlides = [];
+  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
+  let newHeight = 0;
+  let i;
+  if (typeof speed === "number") {
+    swiper.setTransition(speed);
+  } else if (speed === true) {
+    swiper.setTransition(swiper.params.speed);
+  }
+  const getSlideByIndex = (index) => {
+    if (isVirtual) {
+      return swiper.slides[swiper.getSlideIndexByData(index)];
+    }
+    return swiper.slides[index];
+  };
+  if (swiper.params.slidesPerView !== "auto" && swiper.params.slidesPerView > 1) {
+    if (swiper.params.centeredSlides) {
+      (swiper.visibleSlides || []).forEach((slide2) => {
+        activeSlides.push(slide2);
+      });
+    } else {
+      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {
+        const index = swiper.activeIndex + i;
+        if (index > swiper.slides.length && !isVirtual) break;
+        activeSlides.push(getSlideByIndex(index));
+      }
+    }
+  } else {
+    activeSlides.push(getSlideByIndex(swiper.activeIndex));
+  }
+  for (i = 0; i < activeSlides.length; i += 1) {
+    if (typeof activeSlides[i] !== "undefined") {
+      const height = activeSlides[i].offsetHeight;
+      newHeight = height > newHeight ? height : newHeight;
+    }
+  }
+  if (newHeight || newHeight === 0) swiper.wrapperEl.style.height = `${newHeight}px`;
+}
+function updateSlidesOffset() {
+  const swiper = this;
+  const slides = swiper.slides;
+  const minusOffset = swiper.isElement ? swiper.isHorizontal() ? swiper.wrapperEl.offsetLeft : swiper.wrapperEl.offsetTop : 0;
+  for (let i = 0; i < slides.length; i += 1) {
+    slides[i].swiperSlideOffset = (swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop) - minusOffset - swiper.cssOverflowAdjustment();
+  }
+}
+var toggleSlideClasses$1 = (slideEl, condition, className) => {
+  if (condition && !slideEl.classList.contains(className)) {
+    slideEl.classList.add(className);
+  } else if (!condition && slideEl.classList.contains(className)) {
+    slideEl.classList.remove(className);
+  }
+};
+function updateSlidesProgress(translate2) {
+  if (translate2 === void 0) {
+    translate2 = this && this.translate || 0;
+  }
+  const swiper = this;
+  const params = swiper.params;
+  const {
+    slides,
+    rtlTranslate: rtl,
+    snapGrid
+  } = swiper;
+  if (slides.length === 0) return;
+  if (typeof slides[0].swiperSlideOffset === "undefined") swiper.updateSlidesOffset();
+  let offsetCenter = -translate2;
+  if (rtl) offsetCenter = translate2;
+  swiper.visibleSlidesIndexes = [];
+  swiper.visibleSlides = [];
+  let spaceBetween = params.spaceBetween;
+  if (typeof spaceBetween === "string" && spaceBetween.indexOf("%") >= 0) {
+    spaceBetween = parseFloat(spaceBetween.replace("%", "")) / 100 * swiper.size;
+  } else if (typeof spaceBetween === "string") {
+    spaceBetween = parseFloat(spaceBetween);
+  }
+  for (let i = 0; i < slides.length; i += 1) {
+    const slide2 = slides[i];
+    let slideOffset = slide2.swiperSlideOffset;
+    if (params.cssMode && params.centeredSlides) {
+      slideOffset -= slides[0].swiperSlideOffset;
+    }
+    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween);
+    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide2.swiperSlideSize + spaceBetween);
+    const slideBefore = -(offsetCenter - slideOffset);
+    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];
+    const isFullyVisible = slideBefore >= 0 && slideBefore <= swiper.size - swiper.slidesSizesGrid[i];
+    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;
+    if (isVisible) {
+      swiper.visibleSlides.push(slide2);
+      swiper.visibleSlidesIndexes.push(i);
+    }
+    toggleSlideClasses$1(slide2, isVisible, params.slideVisibleClass);
+    toggleSlideClasses$1(slide2, isFullyVisible, params.slideFullyVisibleClass);
+    slide2.progress = rtl ? -slideProgress : slideProgress;
+    slide2.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;
+  }
+}
+function updateProgress(translate2) {
+  const swiper = this;
+  if (typeof translate2 === "undefined") {
+    const multiplier = swiper.rtlTranslate ? -1 : 1;
+    translate2 = swiper && swiper.translate && swiper.translate * multiplier || 0;
+  }
+  const params = swiper.params;
+  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
+  let {
+    progress,
+    isBeginning,
+    isEnd,
+    progressLoop
+  } = swiper;
+  const wasBeginning = isBeginning;
+  const wasEnd = isEnd;
+  if (translatesDiff === 0) {
+    progress = 0;
+    isBeginning = true;
+    isEnd = true;
+  } else {
+    progress = (translate2 - swiper.minTranslate()) / translatesDiff;
+    const isBeginningRounded = Math.abs(translate2 - swiper.minTranslate()) < 1;
+    const isEndRounded = Math.abs(translate2 - swiper.maxTranslate()) < 1;
+    isBeginning = isBeginningRounded || progress <= 0;
+    isEnd = isEndRounded || progress >= 1;
+    if (isBeginningRounded) progress = 0;
+    if (isEndRounded) progress = 1;
+  }
+  if (params.loop) {
+    const firstSlideIndex = swiper.getSlideIndexByData(0);
+    const lastSlideIndex = swiper.getSlideIndexByData(swiper.slides.length - 1);
+    const firstSlideTranslate = swiper.slidesGrid[firstSlideIndex];
+    const lastSlideTranslate = swiper.slidesGrid[lastSlideIndex];
+    const translateMax = swiper.slidesGrid[swiper.slidesGrid.length - 1];
+    const translateAbs = Math.abs(translate2);
+    if (translateAbs >= firstSlideTranslate) {
+      progressLoop = (translateAbs - firstSlideTranslate) / translateMax;
+    } else {
+      progressLoop = (translateAbs + translateMax - lastSlideTranslate) / translateMax;
+    }
+    if (progressLoop > 1) progressLoop -= 1;
+  }
+  Object.assign(swiper, {
+    progress,
+    progressLoop,
+    isBeginning,
+    isEnd
+  });
+  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate2);
+  if (isBeginning && !wasBeginning) {
+    swiper.emit("reachBeginning toEdge");
+  }
+  if (isEnd && !wasEnd) {
+    swiper.emit("reachEnd toEdge");
+  }
+  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {
+    swiper.emit("fromEdge");
+  }
+  swiper.emit("progress", progress);
+}
+var toggleSlideClasses = (slideEl, condition, className) => {
+  if (condition && !slideEl.classList.contains(className)) {
+    slideEl.classList.add(className);
+  } else if (!condition && slideEl.classList.contains(className)) {
+    slideEl.classList.remove(className);
+  }
+};
+function updateSlidesClasses() {
+  const swiper = this;
+  const {
+    slides,
+    params,
+    slidesEl,
+    activeIndex
+  } = swiper;
+  const isVirtual = swiper.virtual && params.virtual.enabled;
+  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
+  const getFilteredSlide = (selector) => {
+    return elementChildren(slidesEl, `.${params.slideClass}${selector}, swiper-slide${selector}`)[0];
+  };
+  let activeSlide;
+  let prevSlide;
+  let nextSlide;
+  if (isVirtual) {
+    if (params.loop) {
+      let slideIndex = activeIndex - swiper.virtual.slidesBefore;
+      if (slideIndex < 0) slideIndex = swiper.virtual.slides.length + slideIndex;
+      if (slideIndex >= swiper.virtual.slides.length) slideIndex -= swiper.virtual.slides.length;
+      activeSlide = getFilteredSlide(`[data-swiper-slide-index="${slideIndex}"]`);
+    } else {
+      activeSlide = getFilteredSlide(`[data-swiper-slide-index="${activeIndex}"]`);
+    }
+  } else {
+    if (gridEnabled) {
+      activeSlide = slides.find((slideEl) => slideEl.column === activeIndex);
+      nextSlide = slides.find((slideEl) => slideEl.column === activeIndex + 1);
+      prevSlide = slides.find((slideEl) => slideEl.column === activeIndex - 1);
+    } else {
+      activeSlide = slides[activeIndex];
+    }
+  }
+  if (activeSlide) {
+    if (!gridEnabled) {
+      nextSlide = elementNextAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
+      if (params.loop && !nextSlide) {
+        nextSlide = slides[0];
+      }
+      prevSlide = elementPrevAll(activeSlide, `.${params.slideClass}, swiper-slide`)[0];
+      if (params.loop && !prevSlide === 0) {
+        prevSlide = slides[slides.length - 1];
+      }
+    }
+  }
+  slides.forEach((slideEl) => {
+    toggleSlideClasses(slideEl, slideEl === activeSlide, params.slideActiveClass);
+    toggleSlideClasses(slideEl, slideEl === nextSlide, params.slideNextClass);
+    toggleSlideClasses(slideEl, slideEl === prevSlide, params.slidePrevClass);
+  });
+  swiper.emitSlidesClasses();
+}
+var processLazyPreloader = (swiper, imageEl) => {
+  if (!swiper || swiper.destroyed || !swiper.params) return;
+  const slideSelector = () => swiper.isElement ? `swiper-slide` : `.${swiper.params.slideClass}`;
+  const slideEl = imageEl.closest(slideSelector());
+  if (slideEl) {
+    let lazyEl = slideEl.querySelector(`.${swiper.params.lazyPreloaderClass}`);
+    if (!lazyEl && swiper.isElement) {
+      if (slideEl.shadowRoot) {
+        lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
+      } else {
+        requestAnimationFrame(() => {
+          if (slideEl.shadowRoot) {
+            lazyEl = slideEl.shadowRoot.querySelector(`.${swiper.params.lazyPreloaderClass}`);
+            if (lazyEl) lazyEl.remove();
+          }
+        });
+      }
+    }
+    if (lazyEl) lazyEl.remove();
+  }
+};
+var unlazy = (swiper, index) => {
+  if (!swiper.slides[index]) return;
+  const imageEl = swiper.slides[index].querySelector('[loading="lazy"]');
+  if (imageEl) imageEl.removeAttribute("loading");
+};
+var preload = (swiper) => {
+  if (!swiper || swiper.destroyed || !swiper.params) return;
+  let amount = swiper.params.lazyPreloadPrevNext;
+  const len = swiper.slides.length;
+  if (!len || !amount || amount < 0) return;
+  amount = Math.min(amount, len);
+  const slidesPerView = swiper.params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(swiper.params.slidesPerView);
+  const activeIndex = swiper.activeIndex;
+  if (swiper.params.grid && swiper.params.grid.rows > 1) {
+    const activeColumn = activeIndex;
+    const preloadColumns = [activeColumn - amount];
+    preloadColumns.push(...Array.from({
+      length: amount
+    }).map((_, i) => {
+      return activeColumn + slidesPerView + i;
+    }));
+    swiper.slides.forEach((slideEl, i) => {
+      if (preloadColumns.includes(slideEl.column)) unlazy(swiper, i);
+    });
+    return;
+  }
+  const slideIndexLastInView = activeIndex + slidesPerView - 1;
+  if (swiper.params.rewind || swiper.params.loop) {
+    for (let i = activeIndex - amount; i <= slideIndexLastInView + amount; i += 1) {
+      const realIndex = (i % len + len) % len;
+      if (realIndex < activeIndex || realIndex > slideIndexLastInView) unlazy(swiper, realIndex);
+    }
+  } else {
+    for (let i = Math.max(activeIndex - amount, 0); i <= Math.min(slideIndexLastInView + amount, len - 1); i += 1) {
+      if (i !== activeIndex && (i > slideIndexLastInView || i < activeIndex)) {
+        unlazy(swiper, i);
+      }
+    }
+  }
+};
+function getActiveIndexByTranslate(swiper) {
+  const {
+    slidesGrid,
+    params
+  } = swiper;
+  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
+  let activeIndex;
+  for (let i = 0; i < slidesGrid.length; i += 1) {
+    if (typeof slidesGrid[i + 1] !== "undefined") {
+      if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {
+        activeIndex = i;
+      } else if (translate2 >= slidesGrid[i] && translate2 < slidesGrid[i + 1]) {
+        activeIndex = i + 1;
+      }
+    } else if (translate2 >= slidesGrid[i]) {
+      activeIndex = i;
+    }
+  }
+  if (params.normalizeSlideIndex) {
+    if (activeIndex < 0 || typeof activeIndex === "undefined") activeIndex = 0;
+  }
+  return activeIndex;
+}
+function updateActiveIndex(newActiveIndex) {
+  const swiper = this;
+  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
+  const {
+    snapGrid,
+    params,
+    activeIndex: previousIndex,
+    realIndex: previousRealIndex,
+    snapIndex: previousSnapIndex
+  } = swiper;
+  let activeIndex = newActiveIndex;
+  let snapIndex;
+  const getVirtualRealIndex = (aIndex) => {
+    let realIndex2 = aIndex - swiper.virtual.slidesBefore;
+    if (realIndex2 < 0) {
+      realIndex2 = swiper.virtual.slides.length + realIndex2;
+    }
+    if (realIndex2 >= swiper.virtual.slides.length) {
+      realIndex2 -= swiper.virtual.slides.length;
+    }
+    return realIndex2;
+  };
+  if (typeof activeIndex === "undefined") {
+    activeIndex = getActiveIndexByTranslate(swiper);
+  }
+  if (snapGrid.indexOf(translate2) >= 0) {
+    snapIndex = snapGrid.indexOf(translate2);
+  } else {
+    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);
+    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);
+  }
+  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
+  if (activeIndex === previousIndex && !swiper.params.loop) {
+    if (snapIndex !== previousSnapIndex) {
+      swiper.snapIndex = snapIndex;
+      swiper.emit("snapIndexChange");
+    }
+    return;
+  }
+  if (activeIndex === previousIndex && swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
+    swiper.realIndex = getVirtualRealIndex(activeIndex);
+    return;
+  }
+  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
+  let realIndex;
+  if (swiper.virtual && params.virtual.enabled && params.loop) {
+    realIndex = getVirtualRealIndex(activeIndex);
+  } else if (gridEnabled) {
+    const firstSlideInColumn = swiper.slides.find((slideEl) => slideEl.column === activeIndex);
+    let activeSlideIndex = parseInt(firstSlideInColumn.getAttribute("data-swiper-slide-index"), 10);
+    if (Number.isNaN(activeSlideIndex)) {
+      activeSlideIndex = Math.max(swiper.slides.indexOf(firstSlideInColumn), 0);
+    }
+    realIndex = Math.floor(activeSlideIndex / params.grid.rows);
+  } else if (swiper.slides[activeIndex]) {
+    const slideIndex = swiper.slides[activeIndex].getAttribute("data-swiper-slide-index");
+    if (slideIndex) {
+      realIndex = parseInt(slideIndex, 10);
+    } else {
+      realIndex = activeIndex;
+    }
+  } else {
+    realIndex = activeIndex;
+  }
+  Object.assign(swiper, {
+    previousSnapIndex,
+    snapIndex,
+    previousRealIndex,
+    realIndex,
+    previousIndex,
+    activeIndex
+  });
+  if (swiper.initialized) {
+    preload(swiper);
+  }
+  swiper.emit("activeIndexChange");
+  swiper.emit("snapIndexChange");
+  if (swiper.initialized || swiper.params.runCallbacksOnInit) {
+    if (previousRealIndex !== realIndex) {
+      swiper.emit("realIndexChange");
+    }
+    swiper.emit("slideChange");
+  }
+}
+function updateClickedSlide(el, path) {
+  const swiper = this;
+  const params = swiper.params;
+  let slide2 = el.closest(`.${params.slideClass}, swiper-slide`);
+  if (!slide2 && swiper.isElement && path && path.length > 1 && path.includes(el)) {
+    [...path.slice(path.indexOf(el) + 1, path.length)].forEach((pathEl) => {
+      if (!slide2 && pathEl.matches && pathEl.matches(`.${params.slideClass}, swiper-slide`)) {
+        slide2 = pathEl;
+      }
+    });
+  }
+  let slideFound = false;
+  let slideIndex;
+  if (slide2) {
+    for (let i = 0; i < swiper.slides.length; i += 1) {
+      if (swiper.slides[i] === slide2) {
+        slideFound = true;
+        slideIndex = i;
+        break;
+      }
+    }
+  }
+  if (slide2 && slideFound) {
+    swiper.clickedSlide = slide2;
+    if (swiper.virtual && swiper.params.virtual.enabled) {
+      swiper.clickedIndex = parseInt(slide2.getAttribute("data-swiper-slide-index"), 10);
+    } else {
+      swiper.clickedIndex = slideIndex;
+    }
+  } else {
+    swiper.clickedSlide = void 0;
+    swiper.clickedIndex = void 0;
+    return;
+  }
+  if (params.slideToClickedSlide && swiper.clickedIndex !== void 0 && swiper.clickedIndex !== swiper.activeIndex) {
+    swiper.slideToClickedSlide();
+  }
+}
+var update = {
+  updateSize,
+  updateSlides,
+  updateAutoHeight,
+  updateSlidesOffset,
+  updateSlidesProgress,
+  updateProgress,
+  updateSlidesClasses,
+  updateActiveIndex,
+  updateClickedSlide
+};
+function getSwiperTranslate(axis) {
+  if (axis === void 0) {
+    axis = this.isHorizontal() ? "x" : "y";
+  }
+  const swiper = this;
+  const {
+    params,
+    rtlTranslate: rtl,
+    translate: translate2,
+    wrapperEl
+  } = swiper;
+  if (params.virtualTranslate) {
+    return rtl ? -translate2 : translate2;
+  }
+  if (params.cssMode) {
+    return translate2;
+  }
+  let currentTranslate = getTranslate(wrapperEl, axis);
+  currentTranslate += swiper.cssOverflowAdjustment();
+  if (rtl) currentTranslate = -currentTranslate;
+  return currentTranslate || 0;
+}
+function setTranslate(translate2, byController) {
+  const swiper = this;
+  const {
+    rtlTranslate: rtl,
+    params,
+    wrapperEl,
+    progress
+  } = swiper;
+  let x = 0;
+  let y = 0;
+  const z = 0;
+  if (swiper.isHorizontal()) {
+    x = rtl ? -translate2 : translate2;
+  } else {
+    y = translate2;
+  }
+  if (params.roundLengths) {
+    x = Math.floor(x);
+    y = Math.floor(y);
+  }
+  swiper.previousTranslate = swiper.translate;
+  swiper.translate = swiper.isHorizontal() ? x : y;
+  if (params.cssMode) {
+    wrapperEl[swiper.isHorizontal() ? "scrollLeft" : "scrollTop"] = swiper.isHorizontal() ? -x : -y;
+  } else if (!params.virtualTranslate) {
+    if (swiper.isHorizontal()) {
+      x -= swiper.cssOverflowAdjustment();
+    } else {
+      y -= swiper.cssOverflowAdjustment();
+    }
+    wrapperEl.style.transform = `translate3d(${x}px, ${y}px, ${z}px)`;
+  }
+  let newProgress;
+  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
+  if (translatesDiff === 0) {
+    newProgress = 0;
+  } else {
+    newProgress = (translate2 - swiper.minTranslate()) / translatesDiff;
+  }
+  if (newProgress !== progress) {
+    swiper.updateProgress(translate2);
+  }
+  swiper.emit("setTranslate", swiper.translate, byController);
+}
+function minTranslate() {
+  return -this.snapGrid[0];
+}
+function maxTranslate() {
+  return -this.snapGrid[this.snapGrid.length - 1];
+}
+function translateTo(translate2, speed, runCallbacks, translateBounds, internal) {
+  if (translate2 === void 0) {
+    translate2 = 0;
+  }
+  if (speed === void 0) {
+    speed = this.params.speed;
+  }
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  if (translateBounds === void 0) {
+    translateBounds = true;
+  }
+  const swiper = this;
+  const {
+    params,
+    wrapperEl
+  } = swiper;
+  if (swiper.animating && params.preventInteractionOnTransition) {
+    return false;
+  }
+  const minTranslate2 = swiper.minTranslate();
+  const maxTranslate2 = swiper.maxTranslate();
+  let newTranslate;
+  if (translateBounds && translate2 > minTranslate2) newTranslate = minTranslate2;
+  else if (translateBounds && translate2 < maxTranslate2) newTranslate = maxTranslate2;
+  else newTranslate = translate2;
+  swiper.updateProgress(newTranslate);
+  if (params.cssMode) {
+    const isH = swiper.isHorizontal();
+    if (speed === 0) {
+      wrapperEl[isH ? "scrollLeft" : "scrollTop"] = -newTranslate;
+    } else {
+      if (!swiper.support.smoothScroll) {
+        animateCSSModeScroll({
+          swiper,
+          targetPosition: -newTranslate,
+          side: isH ? "left" : "top"
+        });
+        return true;
+      }
+      wrapperEl.scrollTo({
+        [isH ? "left" : "top"]: -newTranslate,
+        behavior: "smooth"
+      });
+    }
+    return true;
+  }
+  if (speed === 0) {
+    swiper.setTransition(0);
+    swiper.setTranslate(newTranslate);
+    if (runCallbacks) {
+      swiper.emit("beforeTransitionStart", speed, internal);
+      swiper.emit("transitionEnd");
+    }
+  } else {
+    swiper.setTransition(speed);
+    swiper.setTranslate(newTranslate);
+    if (runCallbacks) {
+      swiper.emit("beforeTransitionStart", speed, internal);
+      swiper.emit("transitionStart");
+    }
+    if (!swiper.animating) {
+      swiper.animating = true;
+      if (!swiper.onTranslateToWrapperTransitionEnd) {
+        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd2(e) {
+          if (!swiper || swiper.destroyed) return;
+          if (e.target !== this) return;
+          swiper.wrapperEl.removeEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd);
+          swiper.onTranslateToWrapperTransitionEnd = null;
+          delete swiper.onTranslateToWrapperTransitionEnd;
+          swiper.animating = false;
+          if (runCallbacks) {
+            swiper.emit("transitionEnd");
+          }
+        };
+      }
+      swiper.wrapperEl.addEventListener("transitionend", swiper.onTranslateToWrapperTransitionEnd);
+    }
+  }
+  return true;
+}
+var translate = {
+  getTranslate: getSwiperTranslate,
+  setTranslate,
+  minTranslate,
+  maxTranslate,
+  translateTo
+};
+function setTransition(duration, byController) {
+  const swiper = this;
+  if (!swiper.params.cssMode) {
+    swiper.wrapperEl.style.transitionDuration = `${duration}ms`;
+    swiper.wrapperEl.style.transitionDelay = duration === 0 ? `0ms` : "";
+  }
+  swiper.emit("setTransition", duration, byController);
+}
+function transitionEmit(_ref) {
+  let {
+    swiper,
+    runCallbacks,
+    direction,
+    step
+  } = _ref;
+  const {
+    activeIndex,
+    previousIndex
+  } = swiper;
+  let dir = direction;
+  if (!dir) {
+    if (activeIndex > previousIndex) dir = "next";
+    else if (activeIndex < previousIndex) dir = "prev";
+    else dir = "reset";
+  }
+  swiper.emit(`transition${step}`);
+  if (runCallbacks && dir === "reset") {
+    swiper.emit(`slideResetTransition${step}`);
+  } else if (runCallbacks && activeIndex !== previousIndex) {
+    swiper.emit(`slideChangeTransition${step}`);
+    if (dir === "next") {
+      swiper.emit(`slideNextTransition${step}`);
+    } else {
+      swiper.emit(`slidePrevTransition${step}`);
+    }
+  }
+}
+function transitionStart(runCallbacks, direction) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  const swiper = this;
+  const {
+    params
+  } = swiper;
+  if (params.cssMode) return;
+  if (params.autoHeight) {
+    swiper.updateAutoHeight();
+  }
+  transitionEmit({
+    swiper,
+    runCallbacks,
+    direction,
+    step: "Start"
+  });
+}
+function transitionEnd(runCallbacks, direction) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  const swiper = this;
+  const {
+    params
+  } = swiper;
+  swiper.animating = false;
+  if (params.cssMode) return;
+  swiper.setTransition(0);
+  transitionEmit({
+    swiper,
+    runCallbacks,
+    direction,
+    step: "End"
+  });
+}
+var transition = {
+  setTransition,
+  transitionStart,
+  transitionEnd
+};
+function slideTo(index, speed, runCallbacks, internal, initial) {
+  if (index === void 0) {
+    index = 0;
+  }
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  if (typeof index === "string") {
+    index = parseInt(index, 10);
+  }
+  const swiper = this;
+  let slideIndex = index;
+  if (slideIndex < 0) slideIndex = 0;
+  const {
+    params,
+    snapGrid,
+    slidesGrid,
+    previousIndex,
+    activeIndex,
+    rtlTranslate: rtl,
+    wrapperEl,
+    enabled
+  } = swiper;
+  if (!enabled && !internal && !initial || swiper.destroyed || swiper.animating && params.preventInteractionOnTransition) {
+    return false;
+  }
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);
+  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);
+  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;
+  const translate2 = -snapGrid[snapIndex];
+  if (params.normalizeSlideIndex) {
+    for (let i = 0; i < slidesGrid.length; i += 1) {
+      const normalizedTranslate = -Math.floor(translate2 * 100);
+      const normalizedGrid = Math.floor(slidesGrid[i] * 100);
+      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);
+      if (typeof slidesGrid[i + 1] !== "undefined") {
+        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {
+          slideIndex = i;
+        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {
+          slideIndex = i + 1;
+        }
+      } else if (normalizedTranslate >= normalizedGrid) {
+        slideIndex = i;
+      }
+    }
+  }
+  if (swiper.initialized && slideIndex !== activeIndex) {
+    if (!swiper.allowSlideNext && (rtl ? translate2 > swiper.translate && translate2 > swiper.minTranslate() : translate2 < swiper.translate && translate2 < swiper.minTranslate())) {
+      return false;
+    }
+    if (!swiper.allowSlidePrev && translate2 > swiper.translate && translate2 > swiper.maxTranslate()) {
+      if ((activeIndex || 0) !== slideIndex) {
+        return false;
+      }
+    }
+  }
+  if (slideIndex !== (previousIndex || 0) && runCallbacks) {
+    swiper.emit("beforeSlideChangeStart");
+  }
+  swiper.updateProgress(translate2);
+  let direction;
+  if (slideIndex > activeIndex) direction = "next";
+  else if (slideIndex < activeIndex) direction = "prev";
+  else direction = "reset";
+  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
+  const isInitialVirtual = isVirtual && initial;
+  if (!isInitialVirtual && (rtl && -translate2 === swiper.translate || !rtl && translate2 === swiper.translate)) {
+    swiper.updateActiveIndex(slideIndex);
+    if (params.autoHeight) {
+      swiper.updateAutoHeight();
+    }
+    swiper.updateSlidesClasses();
+    if (params.effect !== "slide") {
+      swiper.setTranslate(translate2);
+    }
+    if (direction !== "reset") {
+      swiper.transitionStart(runCallbacks, direction);
+      swiper.transitionEnd(runCallbacks, direction);
+    }
+    return false;
+  }
+  if (params.cssMode) {
+    const isH = swiper.isHorizontal();
+    const t = rtl ? translate2 : -translate2;
+    if (speed === 0) {
+      if (isVirtual) {
+        swiper.wrapperEl.style.scrollSnapType = "none";
+        swiper._immediateVirtual = true;
+      }
+      if (isVirtual && !swiper._cssModeVirtualInitialSet && swiper.params.initialSlide > 0) {
+        swiper._cssModeVirtualInitialSet = true;
+        requestAnimationFrame(() => {
+          wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t;
+        });
+      } else {
+        wrapperEl[isH ? "scrollLeft" : "scrollTop"] = t;
+      }
+      if (isVirtual) {
+        requestAnimationFrame(() => {
+          swiper.wrapperEl.style.scrollSnapType = "";
+          swiper._immediateVirtual = false;
+        });
+      }
+    } else {
+      if (!swiper.support.smoothScroll) {
+        animateCSSModeScroll({
+          swiper,
+          targetPosition: t,
+          side: isH ? "left" : "top"
+        });
+        return true;
+      }
+      wrapperEl.scrollTo({
+        [isH ? "left" : "top"]: t,
+        behavior: "smooth"
+      });
+    }
+    return true;
+  }
+  const browser2 = getBrowser();
+  const isSafari = browser2.isSafari;
+  if (isVirtual && !initial && isSafari && swiper.isElement) {
+    swiper.virtual.update(false, false, slideIndex);
+  }
+  swiper.setTransition(speed);
+  swiper.setTranslate(translate2);
+  swiper.updateActiveIndex(slideIndex);
+  swiper.updateSlidesClasses();
+  swiper.emit("beforeTransitionStart", speed, internal);
+  swiper.transitionStart(runCallbacks, direction);
+  if (speed === 0) {
+    swiper.transitionEnd(runCallbacks, direction);
+  } else if (!swiper.animating) {
+    swiper.animating = true;
+    if (!swiper.onSlideToWrapperTransitionEnd) {
+      swiper.onSlideToWrapperTransitionEnd = function transitionEnd2(e) {
+        if (!swiper || swiper.destroyed) return;
+        if (e.target !== this) return;
+        swiper.wrapperEl.removeEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd);
+        swiper.onSlideToWrapperTransitionEnd = null;
+        delete swiper.onSlideToWrapperTransitionEnd;
+        swiper.transitionEnd(runCallbacks, direction);
+      };
+    }
+    swiper.wrapperEl.addEventListener("transitionend", swiper.onSlideToWrapperTransitionEnd);
+  }
+  return true;
+}
+function slideToLoop(index, speed, runCallbacks, internal) {
+  if (index === void 0) {
+    index = 0;
+  }
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  if (typeof index === "string") {
+    const indexAsNumber = parseInt(index, 10);
+    index = indexAsNumber;
+  }
+  const swiper = this;
+  if (swiper.destroyed) return;
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  const gridEnabled = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
+  let newIndex = index;
+  if (swiper.params.loop) {
+    if (swiper.virtual && swiper.params.virtual.enabled) {
+      newIndex = newIndex + swiper.virtual.slidesBefore;
+    } else {
+      let targetSlideIndex;
+      if (gridEnabled) {
+        const slideIndex = newIndex * swiper.params.grid.rows;
+        targetSlideIndex = swiper.slides.find((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex).column;
+      } else {
+        targetSlideIndex = swiper.getSlideIndexByData(newIndex);
+      }
+      const cols = gridEnabled ? Math.ceil(swiper.slides.length / swiper.params.grid.rows) : swiper.slides.length;
+      const {
+        centeredSlides
+      } = swiper.params;
+      let slidesPerView = swiper.params.slidesPerView;
+      if (slidesPerView === "auto") {
+        slidesPerView = swiper.slidesPerViewDynamic();
+      } else {
+        slidesPerView = Math.ceil(parseFloat(swiper.params.slidesPerView, 10));
+        if (centeredSlides && slidesPerView % 2 === 0) {
+          slidesPerView = slidesPerView + 1;
+        }
+      }
+      let needLoopFix = cols - targetSlideIndex < slidesPerView;
+      if (centeredSlides) {
+        needLoopFix = needLoopFix || targetSlideIndex < Math.ceil(slidesPerView / 2);
+      }
+      if (internal && centeredSlides && swiper.params.slidesPerView !== "auto" && !gridEnabled) {
+        needLoopFix = false;
+      }
+      if (needLoopFix) {
+        const direction = centeredSlides ? targetSlideIndex < swiper.activeIndex ? "prev" : "next" : targetSlideIndex - swiper.activeIndex - 1 < swiper.params.slidesPerView ? "next" : "prev";
+        swiper.loopFix({
+          direction,
+          slideTo: true,
+          activeSlideIndex: direction === "next" ? targetSlideIndex + 1 : targetSlideIndex - cols + 1,
+          slideRealIndex: direction === "next" ? swiper.realIndex : void 0
+        });
+      }
+      if (gridEnabled) {
+        const slideIndex = newIndex * swiper.params.grid.rows;
+        newIndex = swiper.slides.find((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === slideIndex).column;
+      } else {
+        newIndex = swiper.getSlideIndexByData(newIndex);
+      }
+    }
+  }
+  requestAnimationFrame(() => {
+    swiper.slideTo(newIndex, speed, runCallbacks, internal);
+  });
+  return swiper;
+}
+function slideNext(speed, runCallbacks, internal) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  const swiper = this;
+  const {
+    enabled,
+    params,
+    animating
+  } = swiper;
+  if (!enabled || swiper.destroyed) return swiper;
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  let perGroup = params.slidesPerGroup;
+  if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
+    perGroup = Math.max(swiper.slidesPerViewDynamic("current", true), 1);
+  }
+  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;
+  const isVirtual = swiper.virtual && params.virtual.enabled;
+  if (params.loop) {
+    if (animating && !isVirtual && params.loopPreventsSliding) return false;
+    swiper.loopFix({
+      direction: "next"
+    });
+    swiper._clientLeft = swiper.wrapperEl.clientLeft;
+    if (swiper.activeIndex === swiper.slides.length - 1 && params.cssMode) {
+      requestAnimationFrame(() => {
+        swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
+      });
+      return true;
+    }
+  }
+  if (params.rewind && swiper.isEnd) {
+    return swiper.slideTo(0, speed, runCallbacks, internal);
+  }
+  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);
+}
+function slidePrev(speed, runCallbacks, internal) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  const swiper = this;
+  const {
+    params,
+    snapGrid,
+    slidesGrid,
+    rtlTranslate,
+    enabled,
+    animating
+  } = swiper;
+  if (!enabled || swiper.destroyed) return swiper;
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  const isVirtual = swiper.virtual && params.virtual.enabled;
+  if (params.loop) {
+    if (animating && !isVirtual && params.loopPreventsSliding) return false;
+    swiper.loopFix({
+      direction: "prev"
+    });
+    swiper._clientLeft = swiper.wrapperEl.clientLeft;
+  }
+  const translate2 = rtlTranslate ? swiper.translate : -swiper.translate;
+  function normalize(val) {
+    if (val < 0) return -Math.floor(Math.abs(val));
+    return Math.floor(val);
+  }
+  const normalizedTranslate = normalize(translate2);
+  const normalizedSnapGrid = snapGrid.map((val) => normalize(val));
+  const isFreeMode = params.freeMode && params.freeMode.enabled;
+  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];
+  if (typeof prevSnap === "undefined" && (params.cssMode || isFreeMode)) {
+    let prevSnapIndex;
+    snapGrid.forEach((snap, snapIndex) => {
+      if (normalizedTranslate >= snap) {
+        prevSnapIndex = snapIndex;
+      }
+    });
+    if (typeof prevSnapIndex !== "undefined") {
+      prevSnap = isFreeMode ? snapGrid[prevSnapIndex] : snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];
+    }
+  }
+  let prevIndex = 0;
+  if (typeof prevSnap !== "undefined") {
+    prevIndex = slidesGrid.indexOf(prevSnap);
+    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;
+    if (params.slidesPerView === "auto" && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {
+      prevIndex = prevIndex - swiper.slidesPerViewDynamic("previous", true) + 1;
+      prevIndex = Math.max(prevIndex, 0);
+    }
+  }
+  if (params.rewind && swiper.isBeginning) {
+    const lastIndex = swiper.params.virtual && swiper.params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
+    return swiper.slideTo(lastIndex, speed, runCallbacks, internal);
+  } else if (params.loop && swiper.activeIndex === 0 && params.cssMode) {
+    requestAnimationFrame(() => {
+      swiper.slideTo(prevIndex, speed, runCallbacks, internal);
+    });
+    return true;
+  }
+  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);
+}
+function slideReset(speed, runCallbacks, internal) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  const swiper = this;
+  if (swiper.destroyed) return;
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);
+}
+function slideToClosest(speed, runCallbacks, internal, threshold) {
+  if (runCallbacks === void 0) {
+    runCallbacks = true;
+  }
+  if (threshold === void 0) {
+    threshold = 0.5;
+  }
+  const swiper = this;
+  if (swiper.destroyed) return;
+  if (typeof speed === "undefined") {
+    speed = swiper.params.speed;
+  }
+  let index = swiper.activeIndex;
+  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);
+  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);
+  const translate2 = swiper.rtlTranslate ? swiper.translate : -swiper.translate;
+  if (translate2 >= swiper.snapGrid[snapIndex]) {
+    const currentSnap = swiper.snapGrid[snapIndex];
+    const nextSnap = swiper.snapGrid[snapIndex + 1];
+    if (translate2 - currentSnap > (nextSnap - currentSnap) * threshold) {
+      index += swiper.params.slidesPerGroup;
+    }
+  } else {
+    const prevSnap = swiper.snapGrid[snapIndex - 1];
+    const currentSnap = swiper.snapGrid[snapIndex];
+    if (translate2 - prevSnap <= (currentSnap - prevSnap) * threshold) {
+      index -= swiper.params.slidesPerGroup;
+    }
+  }
+  index = Math.max(index, 0);
+  index = Math.min(index, swiper.slidesGrid.length - 1);
+  return swiper.slideTo(index, speed, runCallbacks, internal);
+}
+function slideToClickedSlide() {
+  const swiper = this;
+  if (swiper.destroyed) return;
+  const {
+    params,
+    slidesEl
+  } = swiper;
+  const slidesPerView = params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : params.slidesPerView;
+  let slideToIndex = swiper.getSlideIndexWhenGrid(swiper.clickedIndex);
+  let realIndex;
+  const slideSelector = swiper.isElement ? `swiper-slide` : `.${params.slideClass}`;
+  const isGrid = swiper.grid && swiper.params.grid && swiper.params.grid.rows > 1;
+  if (params.loop) {
+    if (swiper.animating) return;
+    realIndex = parseInt(swiper.clickedSlide.getAttribute("data-swiper-slide-index"), 10);
+    if (params.centeredSlides) {
+      swiper.slideToLoop(realIndex);
+    } else if (slideToIndex > (isGrid ? (swiper.slides.length - slidesPerView) / 2 - (swiper.params.grid.rows - 1) : swiper.slides.length - slidesPerView)) {
+      swiper.loopFix();
+      slideToIndex = swiper.getSlideIndex(elementChildren(slidesEl, `${slideSelector}[data-swiper-slide-index="${realIndex}"]`)[0]);
+      nextTick(() => {
+        swiper.slideTo(slideToIndex);
+      });
+    } else {
+      swiper.slideTo(slideToIndex);
+    }
+  } else {
+    swiper.slideTo(slideToIndex);
+  }
+}
+var slide = {
+  slideTo,
+  slideToLoop,
+  slideNext,
+  slidePrev,
+  slideReset,
+  slideToClosest,
+  slideToClickedSlide
+};
+function loopCreate(slideRealIndex, initial) {
+  const swiper = this;
+  const {
+    params,
+    slidesEl
+  } = swiper;
+  if (!params.loop || swiper.virtual && swiper.params.virtual.enabled) return;
+  const initSlides = () => {
+    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
+    slides.forEach((el, index) => {
+      el.setAttribute("data-swiper-slide-index", index);
+    });
+  };
+  const clearBlankSlides = () => {
+    const slides = elementChildren(slidesEl, `.${params.slideBlankClass}`);
+    slides.forEach((el) => {
+      el.remove();
+    });
+    if (slides.length > 0) {
+      swiper.recalcSlides();
+      swiper.updateSlides();
+    }
+  };
+  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
+  if (params.loopAddBlankSlides && (params.slidesPerGroup > 1 || gridEnabled)) {
+    clearBlankSlides();
+  }
+  const slidesPerGroup = params.slidesPerGroup * (gridEnabled ? params.grid.rows : 1);
+  const shouldFillGroup = swiper.slides.length % slidesPerGroup !== 0;
+  const shouldFillGrid = gridEnabled && swiper.slides.length % params.grid.rows !== 0;
+  const addBlankSlides = (amountOfSlides) => {
+    for (let i = 0; i < amountOfSlides; i += 1) {
+      const slideEl = swiper.isElement ? createElement("swiper-slide", [params.slideBlankClass]) : createElement("div", [params.slideClass, params.slideBlankClass]);
+      swiper.slidesEl.append(slideEl);
+    }
+  };
+  if (shouldFillGroup) {
+    if (params.loopAddBlankSlides) {
+      const slidesToAdd = slidesPerGroup - swiper.slides.length % slidesPerGroup;
+      addBlankSlides(slidesToAdd);
+      swiper.recalcSlides();
+      swiper.updateSlides();
+    } else {
+      showWarning("Swiper Loop Warning: The number of slides is not even to slidesPerGroup, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");
+    }
+    initSlides();
+  } else if (shouldFillGrid) {
+    if (params.loopAddBlankSlides) {
+      const slidesToAdd = params.grid.rows - swiper.slides.length % params.grid.rows;
+      addBlankSlides(slidesToAdd);
+      swiper.recalcSlides();
+      swiper.updateSlides();
+    } else {
+      showWarning("Swiper Loop Warning: The number of slides is not even to grid.rows, loop mode may not function properly. You need to add more slides (or make duplicates, or empty slides)");
+    }
+    initSlides();
+  } else {
+    initSlides();
+  }
+  swiper.loopFix({
+    slideRealIndex,
+    direction: params.centeredSlides ? void 0 : "next",
+    initial
+  });
+}
+function loopFix(_temp) {
+  let {
+    slideRealIndex,
+    slideTo: slideTo2 = true,
+    direction,
+    setTranslate: setTranslate2,
+    activeSlideIndex,
+    initial,
+    byController,
+    byMousewheel
+  } = _temp === void 0 ? {} : _temp;
+  const swiper = this;
+  if (!swiper.params.loop) return;
+  swiper.emit("beforeLoopFix");
+  const {
+    slides,
+    allowSlidePrev,
+    allowSlideNext,
+    slidesEl,
+    params
+  } = swiper;
+  const {
+    centeredSlides,
+    initialSlide
+  } = params;
+  swiper.allowSlidePrev = true;
+  swiper.allowSlideNext = true;
+  if (swiper.virtual && params.virtual.enabled) {
+    if (slideTo2) {
+      if (!params.centeredSlides && swiper.snapIndex === 0) {
+        swiper.slideTo(swiper.virtual.slides.length, 0, false, true);
+      } else if (params.centeredSlides && swiper.snapIndex < params.slidesPerView) {
+        swiper.slideTo(swiper.virtual.slides.length + swiper.snapIndex, 0, false, true);
+      } else if (swiper.snapIndex === swiper.snapGrid.length - 1) {
+        swiper.slideTo(swiper.virtual.slidesBefore, 0, false, true);
+      }
+    }
+    swiper.allowSlidePrev = allowSlidePrev;
+    swiper.allowSlideNext = allowSlideNext;
+    swiper.emit("loopFix");
+    return;
+  }
+  let slidesPerView = params.slidesPerView;
+  if (slidesPerView === "auto") {
+    slidesPerView = swiper.slidesPerViewDynamic();
+  } else {
+    slidesPerView = Math.ceil(parseFloat(params.slidesPerView, 10));
+    if (centeredSlides && slidesPerView % 2 === 0) {
+      slidesPerView = slidesPerView + 1;
+    }
+  }
+  const slidesPerGroup = params.slidesPerGroupAuto ? slidesPerView : params.slidesPerGroup;
+  let loopedSlides = centeredSlides ? Math.max(slidesPerGroup, Math.ceil(slidesPerView / 2)) : slidesPerGroup;
+  if (loopedSlides % slidesPerGroup !== 0) {
+    loopedSlides += slidesPerGroup - loopedSlides % slidesPerGroup;
+  }
+  loopedSlides += params.loopAdditionalSlides;
+  swiper.loopedSlides = loopedSlides;
+  const gridEnabled = swiper.grid && params.grid && params.grid.rows > 1;
+  if (slides.length < slidesPerView + loopedSlides || swiper.params.effect === "cards" && slides.length < slidesPerView + loopedSlides * 2) {
+    showWarning("Swiper Loop Warning: The number of slides is not enough for loop mode, it will be disabled or not function properly. You need to add more slides (or make duplicates) or lower the values of slidesPerView and slidesPerGroup parameters");
+  } else if (gridEnabled && params.grid.fill === "row") {
+    showWarning("Swiper Loop Warning: Loop mode is not compatible with grid.fill = `row`");
+  }
+  const prependSlidesIndexes = [];
+  const appendSlidesIndexes = [];
+  const cols = gridEnabled ? Math.ceil(slides.length / params.grid.rows) : slides.length;
+  const isInitialOverflow = initial && cols - initialSlide < slidesPerView && !centeredSlides;
+  let activeIndex = isInitialOverflow ? initialSlide : swiper.activeIndex;
+  if (typeof activeSlideIndex === "undefined") {
+    activeSlideIndex = swiper.getSlideIndex(slides.find((el) => el.classList.contains(params.slideActiveClass)));
+  } else {
+    activeIndex = activeSlideIndex;
+  }
+  const isNext = direction === "next" || !direction;
+  const isPrev = direction === "prev" || !direction;
+  let slidesPrepended = 0;
+  let slidesAppended = 0;
+  const activeColIndex = gridEnabled ? slides[activeSlideIndex].column : activeSlideIndex;
+  const activeColIndexWithShift = activeColIndex + (centeredSlides && typeof setTranslate2 === "undefined" ? -slidesPerView / 2 + 0.5 : 0);
+  if (activeColIndexWithShift < loopedSlides) {
+    slidesPrepended = Math.max(loopedSlides - activeColIndexWithShift, slidesPerGroup);
+    for (let i = 0; i < loopedSlides - activeColIndexWithShift; i += 1) {
+      const index = i - Math.floor(i / cols) * cols;
+      if (gridEnabled) {
+        const colIndexToPrepend = cols - index - 1;
+        for (let i2 = slides.length - 1; i2 >= 0; i2 -= 1) {
+          if (slides[i2].column === colIndexToPrepend) prependSlidesIndexes.push(i2);
+        }
+      } else {
+        prependSlidesIndexes.push(cols - index - 1);
+      }
+    }
+  } else if (activeColIndexWithShift + slidesPerView > cols - loopedSlides) {
+    slidesAppended = Math.max(activeColIndexWithShift - (cols - loopedSlides * 2), slidesPerGroup);
+    if (isInitialOverflow) {
+      slidesAppended = Math.max(slidesAppended, slidesPerView - cols + initialSlide + 1);
+    }
+    for (let i = 0; i < slidesAppended; i += 1) {
+      const index = i - Math.floor(i / cols) * cols;
+      if (gridEnabled) {
+        slides.forEach((slide2, slideIndex) => {
+          if (slide2.column === index) appendSlidesIndexes.push(slideIndex);
+        });
+      } else {
+        appendSlidesIndexes.push(index);
+      }
+    }
+  }
+  swiper.__preventObserver__ = true;
+  requestAnimationFrame(() => {
+    swiper.__preventObserver__ = false;
+  });
+  if (swiper.params.effect === "cards" && slides.length < slidesPerView + loopedSlides * 2) {
+    if (appendSlidesIndexes.includes(activeSlideIndex)) {
+      appendSlidesIndexes.splice(appendSlidesIndexes.indexOf(activeSlideIndex), 1);
+    }
+    if (prependSlidesIndexes.includes(activeSlideIndex)) {
+      prependSlidesIndexes.splice(prependSlidesIndexes.indexOf(activeSlideIndex), 1);
+    }
+  }
+  if (isPrev) {
+    prependSlidesIndexes.forEach((index) => {
+      slides[index].swiperLoopMoveDOM = true;
+      slidesEl.prepend(slides[index]);
+      slides[index].swiperLoopMoveDOM = false;
+    });
+  }
+  if (isNext) {
+    appendSlidesIndexes.forEach((index) => {
+      slides[index].swiperLoopMoveDOM = true;
+      slidesEl.append(slides[index]);
+      slides[index].swiperLoopMoveDOM = false;
+    });
+  }
+  swiper.recalcSlides();
+  if (params.slidesPerView === "auto") {
+    swiper.updateSlides();
+  } else if (gridEnabled && (prependSlidesIndexes.length > 0 && isPrev || appendSlidesIndexes.length > 0 && isNext)) {
+    swiper.slides.forEach((slide2, slideIndex) => {
+      swiper.grid.updateSlide(slideIndex, slide2, swiper.slides);
+    });
+  }
+  if (params.watchSlidesProgress) {
+    swiper.updateSlidesOffset();
+  }
+  if (slideTo2) {
+    if (prependSlidesIndexes.length > 0 && isPrev) {
+      if (typeof slideRealIndex === "undefined") {
+        const currentSlideTranslate = swiper.slidesGrid[activeIndex];
+        const newSlideTranslate = swiper.slidesGrid[activeIndex + slidesPrepended];
+        const diff = newSlideTranslate - currentSlideTranslate;
+        if (byMousewheel) {
+          swiper.setTranslate(swiper.translate - diff);
+        } else {
+          swiper.slideTo(activeIndex + Math.ceil(slidesPrepended), 0, false, true);
+          if (setTranslate2) {
+            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
+            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
+          }
+        }
+      } else {
+        if (setTranslate2) {
+          const shift = gridEnabled ? prependSlidesIndexes.length / params.grid.rows : prependSlidesIndexes.length;
+          swiper.slideTo(swiper.activeIndex + shift, 0, false, true);
+          swiper.touchEventsData.currentTranslate = swiper.translate;
+        }
+      }
+    } else if (appendSlidesIndexes.length > 0 && isNext) {
+      if (typeof slideRealIndex === "undefined") {
+        const currentSlideTranslate = swiper.slidesGrid[activeIndex];
+        const newSlideTranslate = swiper.slidesGrid[activeIndex - slidesAppended];
+        const diff = newSlideTranslate - currentSlideTranslate;
+        if (byMousewheel) {
+          swiper.setTranslate(swiper.translate - diff);
+        } else {
+          swiper.slideTo(activeIndex - slidesAppended, 0, false, true);
+          if (setTranslate2) {
+            swiper.touchEventsData.startTranslate = swiper.touchEventsData.startTranslate - diff;
+            swiper.touchEventsData.currentTranslate = swiper.touchEventsData.currentTranslate - diff;
+          }
+        }
+      } else {
+        const shift = gridEnabled ? appendSlidesIndexes.length / params.grid.rows : appendSlidesIndexes.length;
+        swiper.slideTo(swiper.activeIndex - shift, 0, false, true);
+      }
+    }
+  }
+  swiper.allowSlidePrev = allowSlidePrev;
+  swiper.allowSlideNext = allowSlideNext;
+  if (swiper.controller && swiper.controller.control && !byController) {
+    const loopParams = {
+      slideRealIndex,
+      direction,
+      setTranslate: setTranslate2,
+      activeSlideIndex,
+      byController: true
+    };
+    if (Array.isArray(swiper.controller.control)) {
+      swiper.controller.control.forEach((c) => {
+        if (!c.destroyed && c.params.loop) c.loopFix(__spreadProps(__spreadValues({}, loopParams), {
+          slideTo: c.params.slidesPerView === params.slidesPerView ? slideTo2 : false
+        }));
+      });
+    } else if (swiper.controller.control instanceof swiper.constructor && swiper.controller.control.params.loop) {
+      swiper.controller.control.loopFix(__spreadProps(__spreadValues({}, loopParams), {
+        slideTo: swiper.controller.control.params.slidesPerView === params.slidesPerView ? slideTo2 : false
+      }));
+    }
+  }
+  swiper.emit("loopFix");
+}
+function loopDestroy() {
+  const swiper = this;
+  const {
+    params,
+    slidesEl
+  } = swiper;
+  if (!params.loop || !slidesEl || swiper.virtual && swiper.params.virtual.enabled) return;
+  swiper.recalcSlides();
+  const newSlidesOrder = [];
+  swiper.slides.forEach((slideEl) => {
+    const index = typeof slideEl.swiperSlideIndex === "undefined" ? slideEl.getAttribute("data-swiper-slide-index") * 1 : slideEl.swiperSlideIndex;
+    newSlidesOrder[index] = slideEl;
+  });
+  swiper.slides.forEach((slideEl) => {
+    slideEl.removeAttribute("data-swiper-slide-index");
+  });
+  newSlidesOrder.forEach((slideEl) => {
+    slidesEl.append(slideEl);
+  });
+  swiper.recalcSlides();
+  swiper.slideTo(swiper.realIndex, 0);
+}
+var loop = {
+  loopCreate,
+  loopFix,
+  loopDestroy
+};
+function setGrabCursor(moving) {
+  const swiper = this;
+  if (!swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;
+  const el = swiper.params.touchEventsTarget === "container" ? swiper.el : swiper.wrapperEl;
+  if (swiper.isElement) {
+    swiper.__preventObserver__ = true;
+  }
+  el.style.cursor = "move";
+  el.style.cursor = moving ? "grabbing" : "grab";
+  if (swiper.isElement) {
+    requestAnimationFrame(() => {
+      swiper.__preventObserver__ = false;
+    });
+  }
+}
+function unsetGrabCursor() {
+  const swiper = this;
+  if (swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {
+    return;
+  }
+  if (swiper.isElement) {
+    swiper.__preventObserver__ = true;
+  }
+  swiper[swiper.params.touchEventsTarget === "container" ? "el" : "wrapperEl"].style.cursor = "";
+  if (swiper.isElement) {
+    requestAnimationFrame(() => {
+      swiper.__preventObserver__ = false;
+    });
+  }
+}
+var grabCursor = {
+  setGrabCursor,
+  unsetGrabCursor
+};
+function closestElement(selector, base) {
+  if (base === void 0) {
+    base = this;
+  }
+  function __closestFrom(el) {
+    if (!el || el === getDocument() || el === getWindow()) return null;
+    if (el.assignedSlot) el = el.assignedSlot;
+    const found = el.closest(selector);
+    if (!found && !el.getRootNode) {
+      return null;
+    }
+    return found || __closestFrom(el.getRootNode().host);
+  }
+  return __closestFrom(base);
+}
+function preventEdgeSwipe(swiper, event, startX) {
+  const window2 = getWindow();
+  const {
+    params
+  } = swiper;
+  const edgeSwipeDetection = params.edgeSwipeDetection;
+  const edgeSwipeThreshold = params.edgeSwipeThreshold;
+  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window2.innerWidth - edgeSwipeThreshold)) {
+    if (edgeSwipeDetection === "prevent") {
+      event.preventDefault();
+      return true;
+    }
+    return false;
+  }
+  return true;
+}
+function onTouchStart(event) {
+  const swiper = this;
+  const document2 = getDocument();
+  let e = event;
+  if (e.originalEvent) e = e.originalEvent;
+  const data = swiper.touchEventsData;
+  if (e.type === "pointerdown") {
+    if (data.pointerId !== null && data.pointerId !== e.pointerId) {
+      return;
+    }
+    data.pointerId = e.pointerId;
+  } else if (e.type === "touchstart" && e.targetTouches.length === 1) {
+    data.touchId = e.targetTouches[0].identifier;
+  }
+  if (e.type === "touchstart") {
+    preventEdgeSwipe(swiper, e, e.targetTouches[0].pageX);
+    return;
+  }
+  const {
+    params,
+    touches,
+    enabled
+  } = swiper;
+  if (!enabled) return;
+  if (!params.simulateTouch && e.pointerType === "mouse") return;
+  if (swiper.animating && params.preventInteractionOnTransition) {
+    return;
+  }
+  if (!swiper.animating && params.cssMode && params.loop) {
+    swiper.loopFix();
+  }
+  let targetEl = e.target;
+  if (params.touchEventsTarget === "wrapper") {
+    if (!elementIsChildOf(targetEl, swiper.wrapperEl)) return;
+  }
+  if ("which" in e && e.which === 3) return;
+  if ("button" in e && e.button > 0) return;
+  if (data.isTouched && data.isMoved) return;
+  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== "";
+  const eventPath = e.composedPath ? e.composedPath() : e.path;
+  if (swipingClassHasValue && e.target && e.target.shadowRoot && eventPath) {
+    targetEl = eventPath[0];
+  }
+  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;
+  const isTargetShadow = !!(e.target && e.target.shadowRoot);
+  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, targetEl) : targetEl.closest(noSwipingSelector))) {
+    swiper.allowClick = true;
+    return;
+  }
+  if (params.swipeHandler) {
+    if (!targetEl.closest(params.swipeHandler)) return;
+  }
+  touches.currentX = e.pageX;
+  touches.currentY = e.pageY;
+  const startX = touches.currentX;
+  const startY = touches.currentY;
+  if (!preventEdgeSwipe(swiper, e, startX)) {
+    return;
+  }
+  Object.assign(data, {
+    isTouched: true,
+    isMoved: false,
+    allowTouchCallbacks: true,
+    isScrolling: void 0,
+    startMoving: void 0
+  });
+  touches.startX = startX;
+  touches.startY = startY;
+  data.touchStartTime = now();
+  swiper.allowClick = true;
+  swiper.updateSize();
+  swiper.swipeDirection = void 0;
+  if (params.threshold > 0) data.allowThresholdMove = false;
+  let preventDefault = true;
+  if (targetEl.matches(data.focusableElements)) {
+    preventDefault = false;
+    if (targetEl.nodeName === "SELECT") {
+      data.isTouched = false;
+    }
+  }
+  if (document2.activeElement && document2.activeElement.matches(data.focusableElements) && document2.activeElement !== targetEl && (e.pointerType === "mouse" || e.pointerType !== "mouse" && !targetEl.matches(data.focusableElements))) {
+    document2.activeElement.blur();
+  }
+  const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;
+  if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !targetEl.isContentEditable) {
+    e.preventDefault();
+  }
+  if (params.freeMode && params.freeMode.enabled && swiper.freeMode && swiper.animating && !params.cssMode) {
+    swiper.freeMode.onTouchStart();
+  }
+  swiper.emit("touchStart", e);
+}
+function onTouchMove(event) {
+  const document2 = getDocument();
+  const swiper = this;
+  const data = swiper.touchEventsData;
+  const {
+    params,
+    touches,
+    rtlTranslate: rtl,
+    enabled
+  } = swiper;
+  if (!enabled) return;
+  if (!params.simulateTouch && event.pointerType === "mouse") return;
+  let e = event;
+  if (e.originalEvent) e = e.originalEvent;
+  if (e.type === "pointermove") {
+    if (data.touchId !== null) return;
+    const id = e.pointerId;
+    if (id !== data.pointerId) return;
+  }
+  let targetTouch;
+  if (e.type === "touchmove") {
+    targetTouch = [...e.changedTouches].find((t) => t.identifier === data.touchId);
+    if (!targetTouch || targetTouch.identifier !== data.touchId) return;
+  } else {
+    targetTouch = e;
+  }
+  if (!data.isTouched) {
+    if (data.startMoving && data.isScrolling) {
+      swiper.emit("touchMoveOpposite", e);
+    }
+    return;
+  }
+  const pageX = targetTouch.pageX;
+  const pageY = targetTouch.pageY;
+  if (e.preventedByNestedSwiper) {
+    touches.startX = pageX;
+    touches.startY = pageY;
+    return;
+  }
+  if (!swiper.allowTouchMove) {
+    if (!e.target.matches(data.focusableElements)) {
+      swiper.allowClick = false;
+    }
+    if (data.isTouched) {
+      Object.assign(touches, {
+        startX: pageX,
+        startY: pageY,
+        currentX: pageX,
+        currentY: pageY
+      });
+      data.touchStartTime = now();
+    }
+    return;
+  }
+  if (params.touchReleaseOnEdges && !params.loop) {
+    if (swiper.isVertical()) {
+      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {
+        data.isTouched = false;
+        data.isMoved = false;
+        return;
+      }
+    } else if (rtl && (pageX > touches.startX && -swiper.translate <= swiper.maxTranslate() || pageX < touches.startX && -swiper.translate >= swiper.minTranslate())) {
+      return;
+    } else if (!rtl && (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate())) {
+      return;
+    }
+  }
+  if (document2.activeElement && document2.activeElement.matches(data.focusableElements) && document2.activeElement !== e.target && e.pointerType !== "mouse") {
+    document2.activeElement.blur();
+  }
+  if (document2.activeElement) {
+    if (e.target === document2.activeElement && e.target.matches(data.focusableElements)) {
+      data.isMoved = true;
+      swiper.allowClick = false;
+      return;
+    }
+  }
+  if (data.allowTouchCallbacks) {
+    swiper.emit("touchMove", e);
+  }
+  touches.previousX = touches.currentX;
+  touches.previousY = touches.currentY;
+  touches.currentX = pageX;
+  touches.currentY = pageY;
+  const diffX = touches.currentX - touches.startX;
+  const diffY = touches.currentY - touches.startY;
+  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;
+  if (typeof data.isScrolling === "undefined") {
+    let touchAngle;
+    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {
+      data.isScrolling = false;
+    } else {
+      if (diffX * diffX + diffY * diffY >= 25) {
+        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;
+        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;
+      }
+    }
+  }
+  if (data.isScrolling) {
+    swiper.emit("touchMoveOpposite", e);
+  }
+  if (typeof data.startMoving === "undefined") {
+    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {
+      data.startMoving = true;
+    }
+  }
+  if (data.isScrolling || e.type === "touchmove" && data.preventTouchMoveFromPointerMove) {
+    data.isTouched = false;
+    return;
+  }
+  if (!data.startMoving) {
+    return;
+  }
+  swiper.allowClick = false;
+  if (!params.cssMode && e.cancelable) {
+    e.preventDefault();
+  }
+  if (params.touchMoveStopPropagation && !params.nested) {
+    e.stopPropagation();
+  }
+  let diff = swiper.isHorizontal() ? diffX : diffY;
+  let touchesDiff = swiper.isHorizontal() ? touches.currentX - touches.previousX : touches.currentY - touches.previousY;
+  if (params.oneWayMovement) {
+    diff = Math.abs(diff) * (rtl ? 1 : -1);
+    touchesDiff = Math.abs(touchesDiff) * (rtl ? 1 : -1);
+  }
+  touches.diff = diff;
+  diff *= params.touchRatio;
+  if (rtl) {
+    diff = -diff;
+    touchesDiff = -touchesDiff;
+  }
+  const prevTouchesDirection = swiper.touchesDirection;
+  swiper.swipeDirection = diff > 0 ? "prev" : "next";
+  swiper.touchesDirection = touchesDiff > 0 ? "prev" : "next";
+  const isLoop = swiper.params.loop && !params.cssMode;
+  const allowLoopFix = swiper.touchesDirection === "next" && swiper.allowSlideNext || swiper.touchesDirection === "prev" && swiper.allowSlidePrev;
+  if (!data.isMoved) {
+    if (isLoop && allowLoopFix) {
+      swiper.loopFix({
+        direction: swiper.swipeDirection
+      });
+    }
+    data.startTranslate = swiper.getTranslate();
+    swiper.setTransition(0);
+    if (swiper.animating) {
+      const evt = new window.CustomEvent("transitionend", {
+        bubbles: true,
+        cancelable: true,
+        detail: {
+          bySwiperTouchMove: true
+        }
+      });
+      swiper.wrapperEl.dispatchEvent(evt);
+    }
+    data.allowMomentumBounce = false;
+    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
+      swiper.setGrabCursor(true);
+    }
+    swiper.emit("sliderFirstMove", e);
+  }
+  let loopFixed;
+  (/* @__PURE__ */ new Date()).getTime();
+  if (params._loopSwapReset !== false && data.isMoved && data.allowThresholdMove && prevTouchesDirection !== swiper.touchesDirection && isLoop && allowLoopFix && Math.abs(diff) >= 1) {
+    Object.assign(touches, {
+      startX: pageX,
+      startY: pageY,
+      currentX: pageX,
+      currentY: pageY,
+      startTranslate: data.currentTranslate
+    });
+    data.loopSwapReset = true;
+    data.startTranslate = data.currentTranslate;
+    return;
+  }
+  swiper.emit("sliderMove", e);
+  data.isMoved = true;
+  data.currentTranslate = diff + data.startTranslate;
+  let disableParentSwiper = true;
+  let resistanceRatio = params.resistanceRatio;
+  if (params.touchReleaseOnEdges) {
+    resistanceRatio = 0;
+  }
+  if (diff > 0) {
+    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate > (params.centeredSlides ? swiper.minTranslate() - swiper.slidesSizesGrid[swiper.activeIndex + 1] - (params.slidesPerView !== "auto" && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.activeIndex + 1] + swiper.params.spaceBetween : 0) - swiper.params.spaceBetween : swiper.minTranslate())) {
+      swiper.loopFix({
+        direction: "prev",
+        setTranslate: true,
+        activeSlideIndex: 0
+      });
+    }
+    if (data.currentTranslate > swiper.minTranslate()) {
+      disableParentSwiper = false;
+      if (params.resistance) {
+        data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;
+      }
+    }
+  } else if (diff < 0) {
+    if (isLoop && allowLoopFix && !loopFixed && data.allowThresholdMove && data.currentTranslate < (params.centeredSlides ? swiper.maxTranslate() + swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween + (params.slidesPerView !== "auto" && swiper.slides.length - params.slidesPerView >= 2 ? swiper.slidesSizesGrid[swiper.slidesSizesGrid.length - 1] + swiper.params.spaceBetween : 0) : swiper.maxTranslate())) {
+      swiper.loopFix({
+        direction: "next",
+        setTranslate: true,
+        activeSlideIndex: swiper.slides.length - (params.slidesPerView === "auto" ? swiper.slidesPerViewDynamic() : Math.ceil(parseFloat(params.slidesPerView, 10)))
+      });
+    }
+    if (data.currentTranslate < swiper.maxTranslate()) {
+      disableParentSwiper = false;
+      if (params.resistance) {
+        data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;
+      }
+    }
+  }
+  if (disableParentSwiper) {
+    e.preventedByNestedSwiper = true;
+  }
+  if (!swiper.allowSlideNext && swiper.swipeDirection === "next" && data.currentTranslate < data.startTranslate) {
+    data.currentTranslate = data.startTranslate;
+  }
+  if (!swiper.allowSlidePrev && swiper.swipeDirection === "prev" && data.currentTranslate > data.startTranslate) {
+    data.currentTranslate = data.startTranslate;
+  }
+  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {
+    data.currentTranslate = data.startTranslate;
+  }
+  if (params.threshold > 0) {
+    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {
+      if (!data.allowThresholdMove) {
+        data.allowThresholdMove = true;
+        touches.startX = touches.currentX;
+        touches.startY = touches.currentY;
+        data.currentTranslate = data.startTranslate;
+        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;
+        return;
+      }
+    } else {
+      data.currentTranslate = data.startTranslate;
+      return;
+    }
+  }
+  if (!params.followFinger || params.cssMode) return;
+  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {
+    swiper.updateActiveIndex();
+    swiper.updateSlidesClasses();
+  }
+  if (params.freeMode && params.freeMode.enabled && swiper.freeMode) {
+    swiper.freeMode.onTouchMove();
+  }
+  swiper.updateProgress(data.currentTranslate);
+  swiper.setTranslate(data.currentTranslate);
+}
+function onTouchEnd(event) {
+  const swiper = this;
+  const data = swiper.touchEventsData;
+  let e = event;
+  if (e.originalEvent) e = e.originalEvent;
+  let targetTouch;
+  const isTouchEvent = e.type === "touchend" || e.type === "touchcancel";
+  if (!isTouchEvent) {
+    if (data.touchId !== null) return;
+    if (e.pointerId !== data.pointerId) return;
+    targetTouch = e;
+  } else {
+    targetTouch = [...e.changedTouches].find((t) => t.identifier === data.touchId);
+    if (!targetTouch || targetTouch.identifier !== data.touchId) return;
+  }
+  if (["pointercancel", "pointerout", "pointerleave", "contextmenu"].includes(e.type)) {
+    const proceed = ["pointercancel", "contextmenu"].includes(e.type) && (swiper.browser.isSafari || swiper.browser.isWebView);
+    if (!proceed) {
+      return;
+    }
+  }
+  data.pointerId = null;
+  data.touchId = null;
+  const {
+    params,
+    touches,
+    rtlTranslate: rtl,
+    slidesGrid,
+    enabled
+  } = swiper;
+  if (!enabled) return;
+  if (!params.simulateTouch && e.pointerType === "mouse") return;
+  if (data.allowTouchCallbacks) {
+    swiper.emit("touchEnd", e);
+  }
+  data.allowTouchCallbacks = false;
+  if (!data.isTouched) {
+    if (data.isMoved && params.grabCursor) {
+      swiper.setGrabCursor(false);
+    }
+    data.isMoved = false;
+    data.startMoving = false;
+    return;
+  }
+  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {
+    swiper.setGrabCursor(false);
+  }
+  const touchEndTime = now();
+  const timeDiff = touchEndTime - data.touchStartTime;
+  if (swiper.allowClick) {
+    const pathTree = e.path || e.composedPath && e.composedPath();
+    swiper.updateClickedSlide(pathTree && pathTree[0] || e.target, pathTree);
+    swiper.emit("tap click", e);
+    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {
+      swiper.emit("doubleTap doubleClick", e);
+    }
+  }
+  data.lastClickTime = now();
+  nextTick(() => {
+    if (!swiper.destroyed) swiper.allowClick = true;
+  });
+  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 && !data.loopSwapReset || data.currentTranslate === data.startTranslate && !data.loopSwapReset) {
+    data.isTouched = false;
+    data.isMoved = false;
+    data.startMoving = false;
+    return;
+  }
+  data.isTouched = false;
+  data.isMoved = false;
+  data.startMoving = false;
+  let currentPos;
+  if (params.followFinger) {
+    currentPos = rtl ? swiper.translate : -swiper.translate;
+  } else {
+    currentPos = -data.currentTranslate;
+  }
+  if (params.cssMode) {
+    return;
+  }
+  if (params.freeMode && params.freeMode.enabled) {
+    swiper.freeMode.onTouchEnd({
+      currentPos
+    });
+    return;
+  }
+  const swipeToLast = currentPos >= -swiper.maxTranslate() && !swiper.params.loop;
+  let stopIndex = 0;
+  let groupSize = swiper.slidesSizesGrid[0];
+  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {
+    const increment2 = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
+    if (typeof slidesGrid[i + increment2] !== "undefined") {
+      if (swipeToLast || currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment2]) {
+        stopIndex = i;
+        groupSize = slidesGrid[i + increment2] - slidesGrid[i];
+      }
+    } else if (swipeToLast || currentPos >= slidesGrid[i]) {
+      stopIndex = i;
+      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];
+    }
+  }
+  let rewindFirstIndex = null;
+  let rewindLastIndex = null;
+  if (params.rewind) {
+    if (swiper.isBeginning) {
+      rewindLastIndex = params.virtual && params.virtual.enabled && swiper.virtual ? swiper.virtual.slides.length - 1 : swiper.slides.length - 1;
+    } else if (swiper.isEnd) {
+      rewindFirstIndex = 0;
+    }
+  }
+  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;
+  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;
+  if (timeDiff > params.longSwipesMs) {
+    if (!params.longSwipes) {
+      swiper.slideTo(swiper.activeIndex);
+      return;
+    }
+    if (swiper.swipeDirection === "next") {
+      if (ratio >= params.longSwipesRatio) swiper.slideTo(params.rewind && swiper.isEnd ? rewindFirstIndex : stopIndex + increment);
+      else swiper.slideTo(stopIndex);
+    }
+    if (swiper.swipeDirection === "prev") {
+      if (ratio > 1 - params.longSwipesRatio) {
+        swiper.slideTo(stopIndex + increment);
+      } else if (rewindLastIndex !== null && ratio < 0 && Math.abs(ratio) > params.longSwipesRatio) {
+        swiper.slideTo(rewindLastIndex);
+      } else {
+        swiper.slideTo(stopIndex);
+      }
+    }
+  } else {
+    if (!params.shortSwipes) {
+      swiper.slideTo(swiper.activeIndex);
+      return;
+    }
+    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);
+    if (!isNavButtonTarget) {
+      if (swiper.swipeDirection === "next") {
+        swiper.slideTo(rewindFirstIndex !== null ? rewindFirstIndex : stopIndex + increment);
+      }
+      if (swiper.swipeDirection === "prev") {
+        swiper.slideTo(rewindLastIndex !== null ? rewindLastIndex : stopIndex);
+      }
+    } else if (e.target === swiper.navigation.nextEl) {
+      swiper.slideTo(stopIndex + increment);
+    } else {
+      swiper.slideTo(stopIndex);
+    }
+  }
+}
+function onResize() {
+  const swiper = this;
+  const {
+    params,
+    el
+  } = swiper;
+  if (el && el.offsetWidth === 0) return;
+  if (params.breakpoints) {
+    swiper.setBreakpoint();
+  }
+  const {
+    allowSlideNext,
+    allowSlidePrev,
+    snapGrid
+  } = swiper;
+  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;
+  swiper.allowSlideNext = true;
+  swiper.allowSlidePrev = true;
+  swiper.updateSize();
+  swiper.updateSlides();
+  swiper.updateSlidesClasses();
+  const isVirtualLoop = isVirtual && params.loop;
+  if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides && !isVirtualLoop) {
+    swiper.slideTo(swiper.slides.length - 1, 0, false, true);
+  } else {
+    if (swiper.params.loop && !isVirtual) {
+      swiper.slideToLoop(swiper.realIndex, 0, false, true);
+    } else {
+      swiper.slideTo(swiper.activeIndex, 0, false, true);
+    }
+  }
+  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
+    clearTimeout(swiper.autoplay.resizeTimeout);
+    swiper.autoplay.resizeTimeout = setTimeout(() => {
+      if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {
+        swiper.autoplay.resume();
+      }
+    }, 500);
+  }
+  swiper.allowSlidePrev = allowSlidePrev;
+  swiper.allowSlideNext = allowSlideNext;
+  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {
+    swiper.checkOverflow();
+  }
+}
+function onClick(e) {
+  const swiper = this;
+  if (!swiper.enabled) return;
+  if (!swiper.allowClick) {
+    if (swiper.params.preventClicks) e.preventDefault();
+    if (swiper.params.preventClicksPropagation && swiper.animating) {
+      e.stopPropagation();
+      e.stopImmediatePropagation();
+    }
+  }
+}
+function onScroll() {
+  const swiper = this;
+  const {
+    wrapperEl,
+    rtlTranslate,
+    enabled
+  } = swiper;
+  if (!enabled) return;
+  swiper.previousTranslate = swiper.translate;
+  if (swiper.isHorizontal()) {
+    swiper.translate = -wrapperEl.scrollLeft;
+  } else {
+    swiper.translate = -wrapperEl.scrollTop;
+  }
+  if (swiper.translate === 0) swiper.translate = 0;
+  swiper.updateActiveIndex();
+  swiper.updateSlidesClasses();
+  let newProgress;
+  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();
+  if (translatesDiff === 0) {
+    newProgress = 0;
+  } else {
+    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;
+  }
+  if (newProgress !== swiper.progress) {
+    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);
+  }
+  swiper.emit("setTranslate", swiper.translate, false);
+}
+function onLoad(e) {
+  const swiper = this;
+  processLazyPreloader(swiper, e.target);
+  if (swiper.params.cssMode || swiper.params.slidesPerView !== "auto" && !swiper.params.autoHeight) {
+    return;
+  }
+  swiper.update();
+}
+function onDocumentTouchStart() {
+  const swiper = this;
+  if (swiper.documentTouchHandlerProceeded) return;
+  swiper.documentTouchHandlerProceeded = true;
+  if (swiper.params.touchReleaseOnEdges) {
+    swiper.el.style.touchAction = "auto";
+  }
+}
+var events = (swiper, method) => {
+  const document2 = getDocument();
+  const {
+    params,
+    el,
+    wrapperEl,
+    device
+  } = swiper;
+  const capture = !!params.nested;
+  const domMethod = method === "on" ? "addEventListener" : "removeEventListener";
+  const swiperMethod = method;
+  if (!el || typeof el === "string") return;
+  document2[domMethod]("touchstart", swiper.onDocumentTouchStart, {
+    passive: false,
+    capture
+  });
+  el[domMethod]("touchstart", swiper.onTouchStart, {
+    passive: false
+  });
+  el[domMethod]("pointerdown", swiper.onTouchStart, {
+    passive: false
+  });
+  document2[domMethod]("touchmove", swiper.onTouchMove, {
+    passive: false,
+    capture
+  });
+  document2[domMethod]("pointermove", swiper.onTouchMove, {
+    passive: false,
+    capture
+  });
+  document2[domMethod]("touchend", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("pointerup", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("pointercancel", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("touchcancel", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("pointerout", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("pointerleave", swiper.onTouchEnd, {
+    passive: true
+  });
+  document2[domMethod]("contextmenu", swiper.onTouchEnd, {
+    passive: true
+  });
+  if (params.preventClicks || params.preventClicksPropagation) {
+    el[domMethod]("click", swiper.onClick, true);
+  }
+  if (params.cssMode) {
+    wrapperEl[domMethod]("scroll", swiper.onScroll);
+  }
+  if (params.updateOnWindowResize) {
+    swiper[swiperMethod](device.ios || device.android ? "resize orientationchange observerUpdate" : "resize observerUpdate", onResize, true);
+  } else {
+    swiper[swiperMethod]("observerUpdate", onResize, true);
+  }
+  el[domMethod]("load", swiper.onLoad, {
+    capture: true
+  });
+};
+function attachEvents() {
+  const swiper = this;
+  const {
+    params
+  } = swiper;
+  swiper.onTouchStart = onTouchStart.bind(swiper);
+  swiper.onTouchMove = onTouchMove.bind(swiper);
+  swiper.onTouchEnd = onTouchEnd.bind(swiper);
+  swiper.onDocumentTouchStart = onDocumentTouchStart.bind(swiper);
+  if (params.cssMode) {
+    swiper.onScroll = onScroll.bind(swiper);
+  }
+  swiper.onClick = onClick.bind(swiper);
+  swiper.onLoad = onLoad.bind(swiper);
+  events(swiper, "on");
+}
+function detachEvents() {
+  const swiper = this;
+  events(swiper, "off");
+}
+var events$1 = {
+  attachEvents,
+  detachEvents
+};
+var isGridEnabled = (swiper, params) => {
+  return swiper.grid && params.grid && params.grid.rows > 1;
+};
+function setBreakpoint() {
+  const swiper = this;
+  const {
+    realIndex,
+    initialized,
+    params,
+    el
+  } = swiper;
+  const breakpoints2 = params.breakpoints;
+  if (!breakpoints2 || breakpoints2 && Object.keys(breakpoints2).length === 0) return;
+  const document2 = getDocument();
+  const breakpointsBase = params.breakpointsBase === "window" || !params.breakpointsBase ? params.breakpointsBase : "container";
+  const breakpointContainer = ["window", "container"].includes(params.breakpointsBase) || !params.breakpointsBase ? swiper.el : document2.querySelector(params.breakpointsBase);
+  const breakpoint = swiper.getBreakpoint(breakpoints2, breakpointsBase, breakpointContainer);
+  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;
+  const breakpointOnlyParams = breakpoint in breakpoints2 ? breakpoints2[breakpoint] : void 0;
+  const breakpointParams = breakpointOnlyParams || swiper.originalParams;
+  const wasMultiRow = isGridEnabled(swiper, params);
+  const isMultiRow = isGridEnabled(swiper, breakpointParams);
+  const wasGrabCursor = swiper.params.grabCursor;
+  const isGrabCursor = breakpointParams.grabCursor;
+  const wasEnabled = params.enabled;
+  if (wasMultiRow && !isMultiRow) {
+    el.classList.remove(`${params.containerModifierClass}grid`, `${params.containerModifierClass}grid-column`);
+    swiper.emitContainerClasses();
+  } else if (!wasMultiRow && isMultiRow) {
+    el.classList.add(`${params.containerModifierClass}grid`);
+    if (breakpointParams.grid.fill && breakpointParams.grid.fill === "column" || !breakpointParams.grid.fill && params.grid.fill === "column") {
+      el.classList.add(`${params.containerModifierClass}grid-column`);
+    }
+    swiper.emitContainerClasses();
+  }
+  if (wasGrabCursor && !isGrabCursor) {
+    swiper.unsetGrabCursor();
+  } else if (!wasGrabCursor && isGrabCursor) {
+    swiper.setGrabCursor();
+  }
+  ["navigation", "pagination", "scrollbar"].forEach((prop) => {
+    if (typeof breakpointParams[prop] === "undefined") return;
+    const wasModuleEnabled = params[prop] && params[prop].enabled;
+    const isModuleEnabled = breakpointParams[prop] && breakpointParams[prop].enabled;
+    if (wasModuleEnabled && !isModuleEnabled) {
+      swiper[prop].disable();
+    }
+    if (!wasModuleEnabled && isModuleEnabled) {
+      swiper[prop].enable();
+    }
+  });
+  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;
+  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);
+  const wasLoop = params.loop;
+  if (directionChanged && initialized) {
+    swiper.changeDirection();
+  }
+  extend2(swiper.params, breakpointParams);
+  const isEnabled = swiper.params.enabled;
+  const hasLoop = swiper.params.loop;
+  Object.assign(swiper, {
+    allowTouchMove: swiper.params.allowTouchMove,
+    allowSlideNext: swiper.params.allowSlideNext,
+    allowSlidePrev: swiper.params.allowSlidePrev
+  });
+  if (wasEnabled && !isEnabled) {
+    swiper.disable();
+  } else if (!wasEnabled && isEnabled) {
+    swiper.enable();
+  }
+  swiper.currentBreakpoint = breakpoint;
+  swiper.emit("_beforeBreakpoint", breakpointParams);
+  if (initialized) {
+    if (needsReLoop) {
+      swiper.loopDestroy();
+      swiper.loopCreate(realIndex);
+      swiper.updateSlides();
+    } else if (!wasLoop && hasLoop) {
+      swiper.loopCreate(realIndex);
+      swiper.updateSlides();
+    } else if (wasLoop && !hasLoop) {
+      swiper.loopDestroy();
+    }
+  }
+  swiper.emit("breakpoint", breakpointParams);
+}
+function getBreakpoint(breakpoints2, base, containerEl) {
+  if (base === void 0) {
+    base = "window";
+  }
+  if (!breakpoints2 || base === "container" && !containerEl) return void 0;
+  let breakpoint = false;
+  const window2 = getWindow();
+  const currentHeight = base === "window" ? window2.innerHeight : containerEl.clientHeight;
+  const points = Object.keys(breakpoints2).map((point) => {
+    if (typeof point === "string" && point.indexOf("@") === 0) {
+      const minRatio = parseFloat(point.substr(1));
+      const value = currentHeight * minRatio;
+      return {
+        value,
+        point
+      };
+    }
+    return {
+      value: point,
+      point
+    };
+  });
+  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));
+  for (let i = 0; i < points.length; i += 1) {
+    const {
+      point,
+      value
+    } = points[i];
+    if (base === "window") {
+      if (window2.matchMedia(`(min-width: ${value}px)`).matches) {
+        breakpoint = point;
+      }
+    } else if (value <= containerEl.clientWidth) {
+      breakpoint = point;
+    }
+  }
+  return breakpoint || "max";
+}
+var breakpoints = {
+  setBreakpoint,
+  getBreakpoint
+};
+function prepareClasses(entries, prefix) {
+  const resultClasses = [];
+  entries.forEach((item) => {
+    if (typeof item === "object") {
+      Object.keys(item).forEach((classNames) => {
+        if (item[classNames]) {
+          resultClasses.push(prefix + classNames);
+        }
+      });
+    } else if (typeof item === "string") {
+      resultClasses.push(prefix + item);
+    }
+  });
+  return resultClasses;
+}
+function addClasses() {
+  const swiper = this;
+  const {
+    classNames,
+    params,
+    rtl,
+    el,
+    device
+  } = swiper;
+  const suffixes = prepareClasses(["initialized", params.direction, {
+    "free-mode": swiper.params.freeMode && params.freeMode.enabled
+  }, {
+    "autoheight": params.autoHeight
+  }, {
+    "rtl": rtl
+  }, {
+    "grid": params.grid && params.grid.rows > 1
+  }, {
+    "grid-column": params.grid && params.grid.rows > 1 && params.grid.fill === "column"
+  }, {
+    "android": device.android
+  }, {
+    "ios": device.ios
+  }, {
+    "css-mode": params.cssMode
+  }, {
+    "centered": params.cssMode && params.centeredSlides
+  }, {
+    "watch-progress": params.watchSlidesProgress
+  }], params.containerModifierClass);
+  classNames.push(...suffixes);
+  el.classList.add(...classNames);
+  swiper.emitContainerClasses();
+}
+function removeClasses() {
+  const swiper = this;
+  const {
+    el,
+    classNames
+  } = swiper;
+  if (!el || typeof el === "string") return;
+  el.classList.remove(...classNames);
+  swiper.emitContainerClasses();
+}
+var classes = {
+  addClasses,
+  removeClasses
+};
+function checkOverflow() {
+  const swiper = this;
+  const {
+    isLocked: wasLocked,
+    params
+  } = swiper;
+  const {
+    slidesOffsetBefore
+  } = params;
+  if (slidesOffsetBefore) {
+    const lastSlideIndex = swiper.slides.length - 1;
+    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;
+    swiper.isLocked = swiper.size > lastSlideRightEdge;
+  } else {
+    swiper.isLocked = swiper.snapGrid.length === 1;
+  }
+  if (params.allowSlideNext === true) {
+    swiper.allowSlideNext = !swiper.isLocked;
+  }
+  if (params.allowSlidePrev === true) {
+    swiper.allowSlidePrev = !swiper.isLocked;
+  }
+  if (wasLocked && wasLocked !== swiper.isLocked) {
+    swiper.isEnd = false;
+  }
+  if (wasLocked !== swiper.isLocked) {
+    swiper.emit(swiper.isLocked ? "lock" : "unlock");
+  }
+}
+var checkOverflow$1 = {
+  checkOverflow
+};
+var defaults = {
+  init: true,
+  direction: "horizontal",
+  oneWayMovement: false,
+  swiperElementNodeName: "SWIPER-CONTAINER",
+  touchEventsTarget: "wrapper",
+  initialSlide: 0,
+  speed: 300,
+  cssMode: false,
+  updateOnWindowResize: true,
+  resizeObserver: true,
+  nested: false,
+  createElements: false,
+  eventsPrefix: "swiper",
+  enabled: true,
+  focusableElements: "input, select, option, textarea, button, video, label",
+  // Overrides
+  width: null,
+  height: null,
+  //
+  preventInteractionOnTransition: false,
+  // ssr
+  userAgent: null,
+  url: null,
+  // To support iOS's swipe-to-go-back gesture (when being used in-app).
+  edgeSwipeDetection: false,
+  edgeSwipeThreshold: 20,
+  // Autoheight
+  autoHeight: false,
+  // Set wrapper width
+  setWrapperSize: false,
+  // Virtual Translate
+  virtualTranslate: false,
+  // Effects
+  effect: "slide",
+  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'
+  // Breakpoints
+  breakpoints: void 0,
+  breakpointsBase: "window",
+  // Slides grid
+  spaceBetween: 0,
+  slidesPerView: 1,
+  slidesPerGroup: 1,
+  slidesPerGroupSkip: 0,
+  slidesPerGroupAuto: false,
+  centeredSlides: false,
+  centeredSlidesBounds: false,
+  slidesOffsetBefore: 0,
+  // in px
+  slidesOffsetAfter: 0,
+  // in px
+  normalizeSlideIndex: true,
+  centerInsufficientSlides: false,
+  // Disable swiper and hide navigation when container not overflow
+  watchOverflow: true,
+  // Round length
+  roundLengths: false,
+  // Touches
+  touchRatio: 1,
+  touchAngle: 45,
+  simulateTouch: true,
+  shortSwipes: true,
+  longSwipes: true,
+  longSwipesRatio: 0.5,
+  longSwipesMs: 300,
+  followFinger: true,
+  allowTouchMove: true,
+  threshold: 5,
+  touchMoveStopPropagation: false,
+  touchStartPreventDefault: true,
+  touchStartForcePreventDefault: false,
+  touchReleaseOnEdges: false,
+  // Unique Navigation Elements
+  uniqueNavElements: true,
+  // Resistance
+  resistance: true,
+  resistanceRatio: 0.85,
+  // Progress
+  watchSlidesProgress: false,
+  // Cursor
+  grabCursor: false,
+  // Clicks
+  preventClicks: true,
+  preventClicksPropagation: true,
+  slideToClickedSlide: false,
+  // loop
+  loop: false,
+  loopAddBlankSlides: true,
+  loopAdditionalSlides: 0,
+  loopPreventsSliding: true,
+  // rewind
+  rewind: false,
+  // Swiping/no swiping
+  allowSlidePrev: true,
+  allowSlideNext: true,
+  swipeHandler: null,
+  // '.swipe-handler',
+  noSwiping: true,
+  noSwipingClass: "swiper-no-swiping",
+  noSwipingSelector: null,
+  // Passive Listeners
+  passiveListeners: true,
+  maxBackfaceHiddenSlides: 10,
+  // NS
+  containerModifierClass: "swiper-",
+  // NEW
+  slideClass: "swiper-slide",
+  slideBlankClass: "swiper-slide-blank",
+  slideActiveClass: "swiper-slide-active",
+  slideVisibleClass: "swiper-slide-visible",
+  slideFullyVisibleClass: "swiper-slide-fully-visible",
+  slideNextClass: "swiper-slide-next",
+  slidePrevClass: "swiper-slide-prev",
+  wrapperClass: "swiper-wrapper",
+  lazyPreloaderClass: "swiper-lazy-preloader",
+  lazyPreloadPrevNext: 0,
+  // Callbacks
+  runCallbacksOnInit: true,
+  // Internals
+  _emitClasses: false
+};
+function moduleExtendParams(params, allModulesParams) {
+  return function extendParams(obj) {
+    if (obj === void 0) {
+      obj = {};
+    }
+    const moduleParamName = Object.keys(obj)[0];
+    const moduleParams = obj[moduleParamName];
+    if (typeof moduleParams !== "object" || moduleParams === null) {
+      extend2(allModulesParams, obj);
+      return;
+    }
+    if (params[moduleParamName] === true) {
+      params[moduleParamName] = {
+        enabled: true
+      };
+    }
+    if (moduleParamName === "navigation" && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].prevEl && !params[moduleParamName].nextEl) {
+      params[moduleParamName].auto = true;
+    }
+    if (["pagination", "scrollbar"].indexOf(moduleParamName) >= 0 && params[moduleParamName] && params[moduleParamName].enabled && !params[moduleParamName].el) {
+      params[moduleParamName].auto = true;
+    }
+    if (!(moduleParamName in params && "enabled" in moduleParams)) {
+      extend2(allModulesParams, obj);
+      return;
+    }
+    if (typeof params[moduleParamName] === "object" && !("enabled" in params[moduleParamName])) {
+      params[moduleParamName].enabled = true;
+    }
+    if (!params[moduleParamName]) params[moduleParamName] = {
+      enabled: false
+    };
+    extend2(allModulesParams, obj);
+  };
+}
+var prototypes = {
+  eventsEmitter,
+  update,
+  translate,
+  transition,
+  slide,
+  loop,
+  grabCursor,
+  events: events$1,
+  breakpoints,
+  checkOverflow: checkOverflow$1,
+  classes
+};
+var extendedDefaults = {};
+var Swiper = class _Swiper {
+  constructor() {
+    let el;
+    let params;
+    for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
+      args[_key] = arguments[_key];
+    }
+    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === "Object") {
+      params = args[0];
+    } else {
+      [el, params] = args;
+    }
+    if (!params) params = {};
+    params = extend2({}, params);
+    if (el && !params.el) params.el = el;
+    const document2 = getDocument();
+    if (params.el && typeof params.el === "string" && document2.querySelectorAll(params.el).length > 1) {
+      const swipers = [];
+      document2.querySelectorAll(params.el).forEach((containerEl) => {
+        const newParams = extend2({}, params, {
+          el: containerEl
+        });
+        swipers.push(new _Swiper(newParams));
+      });
+      return swipers;
+    }
+    const swiper = this;
+    swiper.__swiper__ = true;
+    swiper.support = getSupport();
+    swiper.device = getDevice({
+      userAgent: params.userAgent
+    });
+    swiper.browser = getBrowser();
+    swiper.eventsListeners = {};
+    swiper.eventsAnyListeners = [];
+    swiper.modules = [...swiper.__modules__];
+    if (params.modules && Array.isArray(params.modules)) {
+      swiper.modules.push(...params.modules);
+    }
+    const allModulesParams = {};
+    swiper.modules.forEach((mod) => {
+      mod({
+        params,
+        swiper,
+        extendParams: moduleExtendParams(params, allModulesParams),
+        on: swiper.on.bind(swiper),
+        once: swiper.once.bind(swiper),
+        off: swiper.off.bind(swiper),
+        emit: swiper.emit.bind(swiper)
+      });
+    });
+    const swiperParams = extend2({}, defaults, allModulesParams);
+    swiper.params = extend2({}, swiperParams, extendedDefaults, params);
+    swiper.originalParams = extend2({}, swiper.params);
+    swiper.passedParams = extend2({}, params);
+    if (swiper.params && swiper.params.on) {
+      Object.keys(swiper.params.on).forEach((eventName) => {
+        swiper.on(eventName, swiper.params.on[eventName]);
+      });
+    }
+    if (swiper.params && swiper.params.onAny) {
+      swiper.onAny(swiper.params.onAny);
+    }
+    Object.assign(swiper, {
+      enabled: swiper.params.enabled,
+      el,
+      // Classes
+      classNames: [],
+      // Slides
+      slides: [],
+      slidesGrid: [],
+      snapGrid: [],
+      slidesSizesGrid: [],
+      // isDirection
+      isHorizontal() {
+        return swiper.params.direction === "horizontal";
+      },
+      isVertical() {
+        return swiper.params.direction === "vertical";
+      },
+      // Indexes
+      activeIndex: 0,
+      realIndex: 0,
+      //
+      isBeginning: true,
+      isEnd: false,
+      // Props
+      translate: 0,
+      previousTranslate: 0,
+      progress: 0,
+      velocity: 0,
+      animating: false,
+      cssOverflowAdjustment() {
+        return Math.trunc(this.translate / 2 ** 23) * 2 ** 23;
+      },
+      // Locks
+      allowSlideNext: swiper.params.allowSlideNext,
+      allowSlidePrev: swiper.params.allowSlidePrev,
+      // Touch Events
+      touchEventsData: {
+        isTouched: void 0,
+        isMoved: void 0,
+        allowTouchCallbacks: void 0,
+        touchStartTime: void 0,
+        isScrolling: void 0,
+        currentTranslate: void 0,
+        startTranslate: void 0,
+        allowThresholdMove: void 0,
+        // Form elements to match
+        focusableElements: swiper.params.focusableElements,
+        // Last click time
+        lastClickTime: 0,
+        clickTimeout: void 0,
+        // Velocities
+        velocities: [],
+        allowMomentumBounce: void 0,
+        startMoving: void 0,
+        pointerId: null,
+        touchId: null
+      },
+      // Clicks
+      allowClick: true,
+      // Touches
+      allowTouchMove: swiper.params.allowTouchMove,
+      touches: {
+        startX: 0,
+        startY: 0,
+        currentX: 0,
+        currentY: 0,
+        diff: 0
+      },
+      // Images
+      imagesToLoad: [],
+      imagesLoaded: 0
+    });
+    swiper.emit("_swiper");
+    if (swiper.params.init) {
+      swiper.init();
+    }
+    return swiper;
+  }
+  getDirectionLabel(property) {
+    if (this.isHorizontal()) {
+      return property;
+    }
+    return {
+      "width": "height",
+      "margin-top": "margin-left",
+      "margin-bottom ": "margin-right",
+      "margin-left": "margin-top",
+      "margin-right": "margin-bottom",
+      "padding-left": "padding-top",
+      "padding-right": "padding-bottom",
+      "marginRight": "marginBottom"
+    }[property];
+  }
+  getSlideIndex(slideEl) {
+    const {
+      slidesEl,
+      params
+    } = this;
+    const slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
+    const firstSlideIndex = elementIndex(slides[0]);
+    return elementIndex(slideEl) - firstSlideIndex;
+  }
+  getSlideIndexByData(index) {
+    return this.getSlideIndex(this.slides.find((slideEl) => slideEl.getAttribute("data-swiper-slide-index") * 1 === index));
+  }
+  getSlideIndexWhenGrid(index) {
+    if (this.grid && this.params.grid && this.params.grid.rows > 1) {
+      if (this.params.grid.fill === "column") {
+        index = Math.floor(index / this.params.grid.rows);
+      } else if (this.params.grid.fill === "row") {
+        index = index % Math.ceil(this.slides.length / this.params.grid.rows);
+      }
+    }
+    return index;
+  }
+  recalcSlides() {
+    const swiper = this;
+    const {
+      slidesEl,
+      params
+    } = swiper;
+    swiper.slides = elementChildren(slidesEl, `.${params.slideClass}, swiper-slide`);
+  }
+  enable() {
+    const swiper = this;
+    if (swiper.enabled) return;
+    swiper.enabled = true;
+    if (swiper.params.grabCursor) {
+      swiper.setGrabCursor();
+    }
+    swiper.emit("enable");
+  }
+  disable() {
+    const swiper = this;
+    if (!swiper.enabled) return;
+    swiper.enabled = false;
+    if (swiper.params.grabCursor) {
+      swiper.unsetGrabCursor();
+    }
+    swiper.emit("disable");
+  }
+  setProgress(progress, speed) {
+    const swiper = this;
+    progress = Math.min(Math.max(progress, 0), 1);
+    const min = swiper.minTranslate();
+    const max = swiper.maxTranslate();
+    const current = (max - min) * progress + min;
+    swiper.translateTo(current, typeof speed === "undefined" ? 0 : speed);
+    swiper.updateActiveIndex();
+    swiper.updateSlidesClasses();
+  }
+  emitContainerClasses() {
+    const swiper = this;
+    if (!swiper.params._emitClasses || !swiper.el) return;
+    const cls = swiper.el.className.split(" ").filter((className) => {
+      return className.indexOf("swiper") === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;
+    });
+    swiper.emit("_containerClasses", cls.join(" "));
+  }
+  getSlideClasses(slideEl) {
+    const swiper = this;
+    if (swiper.destroyed) return "";
+    return slideEl.className.split(" ").filter((className) => {
+      return className.indexOf("swiper-slide") === 0 || className.indexOf(swiper.params.slideClass) === 0;
+    }).join(" ");
+  }
+  emitSlidesClasses() {
+    const swiper = this;
+    if (!swiper.params._emitClasses || !swiper.el) return;
+    const updates = [];
+    swiper.slides.forEach((slideEl) => {
+      const classNames = swiper.getSlideClasses(slideEl);
+      updates.push({
+        slideEl,
+        classNames
+      });
+      swiper.emit("_slideClass", slideEl, classNames);
+    });
+    swiper.emit("_slideClasses", updates);
+  }
+  slidesPerViewDynamic(view, exact) {
+    if (view === void 0) {
+      view = "current";
+    }
+    if (exact === void 0) {
+      exact = false;
+    }
+    const swiper = this;
+    const {
+      params,
+      slides,
+      slidesGrid,
+      slidesSizesGrid,
+      size: swiperSize,
+      activeIndex
+    } = swiper;
+    let spv = 1;
+    if (typeof params.slidesPerView === "number") return params.slidesPerView;
+    if (params.centeredSlides) {
+      let slideSize = slides[activeIndex] ? Math.ceil(slides[activeIndex].swiperSlideSize) : 0;
+      let breakLoop;
+      for (let i = activeIndex + 1; i < slides.length; i += 1) {
+        if (slides[i] && !breakLoop) {
+          slideSize += Math.ceil(slides[i].swiperSlideSize);
+          spv += 1;
+          if (slideSize > swiperSize) breakLoop = true;
+        }
+      }
+      for (let i = activeIndex - 1; i >= 0; i -= 1) {
+        if (slides[i] && !breakLoop) {
+          slideSize += slides[i].swiperSlideSize;
+          spv += 1;
+          if (slideSize > swiperSize) breakLoop = true;
+        }
+      }
+    } else {
+      if (view === "current") {
+        for (let i = activeIndex + 1; i < slides.length; i += 1) {
+          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;
+          if (slideInView) {
+            spv += 1;
+          }
+        }
+      } else {
+        for (let i = activeIndex - 1; i >= 0; i -= 1) {
+          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;
+          if (slideInView) {
+            spv += 1;
+          }
+        }
+      }
+    }
+    return spv;
+  }
+  update() {
+    const swiper = this;
+    if (!swiper || swiper.destroyed) return;
+    const {
+      snapGrid,
+      params
+    } = swiper;
+    if (params.breakpoints) {
+      swiper.setBreakpoint();
+    }
+    [...swiper.el.querySelectorAll('[loading="lazy"]')].forEach((imageEl) => {
+      if (imageEl.complete) {
+        processLazyPreloader(swiper, imageEl);
+      }
+    });
+    swiper.updateSize();
+    swiper.updateSlides();
+    swiper.updateProgress();
+    swiper.updateSlidesClasses();
+    function setTranslate2() {
+      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;
+      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());
+      swiper.setTranslate(newTranslate);
+      swiper.updateActiveIndex();
+      swiper.updateSlidesClasses();
+    }
+    let translated;
+    if (params.freeMode && params.freeMode.enabled && !params.cssMode) {
+      setTranslate2();
+      if (params.autoHeight) {
+        swiper.updateAutoHeight();
+      }
+    } else {
+      if ((params.slidesPerView === "auto" || params.slidesPerView > 1) && swiper.isEnd && !params.centeredSlides) {
+        const slides = swiper.virtual && params.virtual.enabled ? swiper.virtual.slides : swiper.slides;
+        translated = swiper.slideTo(slides.length - 1, 0, false, true);
+      } else {
+        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);
+      }
+      if (!translated) {
+        setTranslate2();
+      }
+    }
+    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {
+      swiper.checkOverflow();
+    }
+    swiper.emit("update");
+  }
+  changeDirection(newDirection, needUpdate) {
+    if (needUpdate === void 0) {
+      needUpdate = true;
+    }
+    const swiper = this;
+    const currentDirection = swiper.params.direction;
+    if (!newDirection) {
+      newDirection = currentDirection === "horizontal" ? "vertical" : "horizontal";
+    }
+    if (newDirection === currentDirection || newDirection !== "horizontal" && newDirection !== "vertical") {
+      return swiper;
+    }
+    swiper.el.classList.remove(`${swiper.params.containerModifierClass}${currentDirection}`);
+    swiper.el.classList.add(`${swiper.params.containerModifierClass}${newDirection}`);
+    swiper.emitContainerClasses();
+    swiper.params.direction = newDirection;
+    swiper.slides.forEach((slideEl) => {
+      if (newDirection === "vertical") {
+        slideEl.style.width = "";
+      } else {
+        slideEl.style.height = "";
+      }
+    });
+    swiper.emit("changeDirection");
+    if (needUpdate) swiper.update();
+    return swiper;
+  }
+  changeLanguageDirection(direction) {
+    const swiper = this;
+    if (swiper.rtl && direction === "rtl" || !swiper.rtl && direction === "ltr") return;
+    swiper.rtl = direction === "rtl";
+    swiper.rtlTranslate = swiper.params.direction === "horizontal" && swiper.rtl;
+    if (swiper.rtl) {
+      swiper.el.classList.add(`${swiper.params.containerModifierClass}rtl`);
+      swiper.el.dir = "rtl";
+    } else {
+      swiper.el.classList.remove(`${swiper.params.containerModifierClass}rtl`);
+      swiper.el.dir = "ltr";
+    }
+    swiper.update();
+  }
+  mount(element) {
+    const swiper = this;
+    if (swiper.mounted) return true;
+    let el = element || swiper.params.el;
+    if (typeof el === "string") {
+      el = document.querySelector(el);
+    }
+    if (!el) {
+      return false;
+    }
+    el.swiper = swiper;
+    if (el.parentNode && el.parentNode.host && el.parentNode.host.nodeName === swiper.params.swiperElementNodeName.toUpperCase()) {
+      swiper.isElement = true;
+    }
+    const getWrapperSelector = () => {
+      return `.${(swiper.params.wrapperClass || "").trim().split(" ").join(".")}`;
+    };
+    const getWrapper = () => {
+      if (el && el.shadowRoot && el.shadowRoot.querySelector) {
+        const res = el.shadowRoot.querySelector(getWrapperSelector());
+        return res;
+      }
+      return elementChildren(el, getWrapperSelector())[0];
+    };
+    let wrapperEl = getWrapper();
+    if (!wrapperEl && swiper.params.createElements) {
+      wrapperEl = createElement("div", swiper.params.wrapperClass);
+      el.append(wrapperEl);
+      elementChildren(el, `.${swiper.params.slideClass}`).forEach((slideEl) => {
+        wrapperEl.append(slideEl);
+      });
+    }
+    Object.assign(swiper, {
+      el,
+      wrapperEl,
+      slidesEl: swiper.isElement && !el.parentNode.host.slideSlots ? el.parentNode.host : wrapperEl,
+      hostEl: swiper.isElement ? el.parentNode.host : el,
+      mounted: true,
+      // RTL
+      rtl: el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl",
+      rtlTranslate: swiper.params.direction === "horizontal" && (el.dir.toLowerCase() === "rtl" || elementStyle(el, "direction") === "rtl"),
+      wrongRTL: elementStyle(wrapperEl, "display") === "-webkit-box"
+    });
+    return true;
+  }
+  init(el) {
+    const swiper = this;
+    if (swiper.initialized) return swiper;
+    const mounted = swiper.mount(el);
+    if (mounted === false) return swiper;
+    swiper.emit("beforeInit");
+    if (swiper.params.breakpoints) {
+      swiper.setBreakpoint();
+    }
+    swiper.addClasses();
+    swiper.updateSize();
+    swiper.updateSlides();
+    if (swiper.params.watchOverflow) {
+      swiper.checkOverflow();
+    }
+    if (swiper.params.grabCursor && swiper.enabled) {
+      swiper.setGrabCursor();
+    }
+    if (swiper.params.loop && swiper.virtual && swiper.params.virtual.enabled) {
+      swiper.slideTo(swiper.params.initialSlide + swiper.virtual.slidesBefore, 0, swiper.params.runCallbacksOnInit, false, true);
+    } else {
+      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);
+    }
+    if (swiper.params.loop) {
+      swiper.loopCreate(void 0, true);
+    }
+    swiper.attachEvents();
+    const lazyElements = [...swiper.el.querySelectorAll('[loading="lazy"]')];
+    if (swiper.isElement) {
+      lazyElements.push(...swiper.hostEl.querySelectorAll('[loading="lazy"]'));
+    }
+    lazyElements.forEach((imageEl) => {
+      if (imageEl.complete) {
+        processLazyPreloader(swiper, imageEl);
+      } else {
+        imageEl.addEventListener("load", (e) => {
+          processLazyPreloader(swiper, e.target);
+        });
+      }
+    });
+    preload(swiper);
+    swiper.initialized = true;
+    preload(swiper);
+    swiper.emit("init");
+    swiper.emit("afterInit");
+    return swiper;
+  }
+  destroy(deleteInstance, cleanStyles) {
+    if (deleteInstance === void 0) {
+      deleteInstance = true;
+    }
+    if (cleanStyles === void 0) {
+      cleanStyles = true;
+    }
+    const swiper = this;
+    const {
+      params,
+      el,
+      wrapperEl,
+      slides
+    } = swiper;
+    if (typeof swiper.params === "undefined" || swiper.destroyed) {
+      return null;
+    }
+    swiper.emit("beforeDestroy");
+    swiper.initialized = false;
+    swiper.detachEvents();
+    if (params.loop) {
+      swiper.loopDestroy();
+    }
+    if (cleanStyles) {
+      swiper.removeClasses();
+      if (el && typeof el !== "string") {
+        el.removeAttribute("style");
+      }
+      if (wrapperEl) {
+        wrapperEl.removeAttribute("style");
+      }
+      if (slides && slides.length) {
+        slides.forEach((slideEl) => {
+          slideEl.classList.remove(params.slideVisibleClass, params.slideFullyVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass);
+          slideEl.removeAttribute("style");
+          slideEl.removeAttribute("data-swiper-slide-index");
+        });
+      }
+    }
+    swiper.emit("destroy");
+    Object.keys(swiper.eventsListeners).forEach((eventName) => {
+      swiper.off(eventName);
+    });
+    if (deleteInstance !== false) {
+      if (swiper.el && typeof swiper.el !== "string") {
+        swiper.el.swiper = null;
+      }
+      deleteProps(swiper);
+    }
+    swiper.destroyed = true;
+    return null;
+  }
+  static extendDefaults(newDefaults) {
+    extend2(extendedDefaults, newDefaults);
+  }
+  static get extendedDefaults() {
+    return extendedDefaults;
+  }
+  static get defaults() {
+    return defaults;
+  }
+  static installModule(mod) {
+    if (!_Swiper.prototype.__modules__) _Swiper.prototype.__modules__ = [];
+    const modules = _Swiper.prototype.__modules__;
+    if (typeof mod === "function" && modules.indexOf(mod) < 0) {
+      modules.push(mod);
+    }
+  }
+  static use(module) {
+    if (Array.isArray(module)) {
+      module.forEach((m) => _Swiper.installModule(m));
+      return _Swiper;
+    }
+    _Swiper.installModule(module);
+    return _Swiper;
+  }
+};
+Object.keys(prototypes).forEach((prototypeGroup) => {
+  Object.keys(prototypes[prototypeGroup]).forEach((protoMethod) => {
+    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];
+  });
+});
+Swiper.use([Resize, Observer]);
+export {
+  Swiper,
+  Swiper as default
+};
+//# sourceMappingURL=swiper.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/swiper.js.map


+ 2394 - 0
ai-interview/vite/deps/zone__js.js

@@ -0,0 +1,2394 @@
+import {
+  __spreadProps,
+  __spreadValues
+} from "./chunk-WDMUDEB6.js";
+
+// node_modules/zone.js/fesm2015/zone.js
+var global = globalThis;
+function __symbol__(name) {
+  const symbolPrefix = global["__Zone_symbol_prefix"] || "__zone_symbol__";
+  return symbolPrefix + name;
+}
+function initZone() {
+  const performance = global["performance"];
+  function mark(name) {
+    performance && performance["mark"] && performance["mark"](name);
+  }
+  function performanceMeasure(name, label) {
+    performance && performance["measure"] && performance["measure"](name, label);
+  }
+  mark("Zone");
+  class ZoneImpl {
+    static __symbol__ = __symbol__;
+    static assertZonePatched() {
+      if (global["Promise"] !== patches["ZoneAwarePromise"]) {
+        throw new Error("Zone.js has detected that ZoneAwarePromise `(window|global).Promise` has been overwritten.\nMost likely cause is that a Promise polyfill has been loaded after Zone.js (Polyfilling Promise api is not necessary when zone.js is loaded. If you must load one, do so before loading zone.js.)");
+      }
+    }
+    static get root() {
+      let zone = ZoneImpl.current;
+      while (zone.parent) {
+        zone = zone.parent;
+      }
+      return zone;
+    }
+    static get current() {
+      return _currentZoneFrame.zone;
+    }
+    static get currentTask() {
+      return _currentTask;
+    }
+    static __load_patch(name, fn, ignoreDuplicate = false) {
+      if (patches.hasOwnProperty(name)) {
+        const checkDuplicate = global[__symbol__("forceDuplicateZoneCheck")] === true;
+        if (!ignoreDuplicate && checkDuplicate) {
+          throw Error("Already loaded patch: " + name);
+        }
+      } else if (!global["__Zone_disable_" + name]) {
+        const perfName = "Zone:" + name;
+        mark(perfName);
+        patches[name] = fn(global, ZoneImpl, _api);
+        performanceMeasure(perfName, perfName);
+      }
+    }
+    get parent() {
+      return this._parent;
+    }
+    get name() {
+      return this._name;
+    }
+    _parent;
+    _name;
+    _properties;
+    _zoneDelegate;
+    constructor(parent, zoneSpec) {
+      this._parent = parent;
+      this._name = zoneSpec ? zoneSpec.name || "unnamed" : "<root>";
+      this._properties = zoneSpec && zoneSpec.properties || {};
+      this._zoneDelegate = new _ZoneDelegate(this, this._parent && this._parent._zoneDelegate, zoneSpec);
+    }
+    get(key) {
+      const zone = this.getZoneWith(key);
+      if (zone)
+        return zone._properties[key];
+    }
+    getZoneWith(key) {
+      let current = this;
+      while (current) {
+        if (current._properties.hasOwnProperty(key)) {
+          return current;
+        }
+        current = current._parent;
+      }
+      return null;
+    }
+    fork(zoneSpec) {
+      if (!zoneSpec)
+        throw new Error("ZoneSpec required!");
+      return this._zoneDelegate.fork(this, zoneSpec);
+    }
+    wrap(callback, source) {
+      if (typeof callback !== "function") {
+        throw new Error("Expecting function got: " + callback);
+      }
+      const _callback = this._zoneDelegate.intercept(this, callback, source);
+      const zone = this;
+      return function() {
+        return zone.runGuarded(_callback, this, arguments, source);
+      };
+    }
+    run(callback, applyThis, applyArgs, source) {
+      _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+      try {
+        return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+      } finally {
+        _currentZoneFrame = _currentZoneFrame.parent;
+      }
+    }
+    runGuarded(callback, applyThis = null, applyArgs, source) {
+      _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+      try {
+        try {
+          return this._zoneDelegate.invoke(this, callback, applyThis, applyArgs, source);
+        } catch (error) {
+          if (this._zoneDelegate.handleError(this, error)) {
+            throw error;
+          }
+        }
+      } finally {
+        _currentZoneFrame = _currentZoneFrame.parent;
+      }
+    }
+    runTask(task, applyThis, applyArgs) {
+      if (task.zone != this) {
+        throw new Error("A task can only be run in the zone of creation! (Creation: " + (task.zone || NO_ZONE).name + "; Execution: " + this.name + ")");
+      }
+      const zoneTask = task;
+      const { type, data: { isPeriodic = false, isRefreshable = false } = {} } = task;
+      if (task.state === notScheduled && (type === eventTask || type === macroTask)) {
+        return;
+      }
+      const reEntryGuard = task.state != running;
+      reEntryGuard && zoneTask._transitionTo(running, scheduled);
+      const previousTask = _currentTask;
+      _currentTask = zoneTask;
+      _currentZoneFrame = { parent: _currentZoneFrame, zone: this };
+      try {
+        if (type == macroTask && task.data && !isPeriodic && !isRefreshable) {
+          task.cancelFn = void 0;
+        }
+        try {
+          return this._zoneDelegate.invokeTask(this, zoneTask, applyThis, applyArgs);
+        } catch (error) {
+          if (this._zoneDelegate.handleError(this, error)) {
+            throw error;
+          }
+        }
+      } finally {
+        const state = task.state;
+        if (state !== notScheduled && state !== unknown) {
+          if (type == eventTask || isPeriodic || isRefreshable && state === scheduling) {
+            reEntryGuard && zoneTask._transitionTo(scheduled, running, scheduling);
+          } else {
+            const zoneDelegates = zoneTask._zoneDelegates;
+            this._updateTaskCount(zoneTask, -1);
+            reEntryGuard && zoneTask._transitionTo(notScheduled, running, notScheduled);
+            if (isRefreshable) {
+              zoneTask._zoneDelegates = zoneDelegates;
+            }
+          }
+        }
+        _currentZoneFrame = _currentZoneFrame.parent;
+        _currentTask = previousTask;
+      }
+    }
+    scheduleTask(task) {
+      if (task.zone && task.zone !== this) {
+        let newZone = this;
+        while (newZone) {
+          if (newZone === task.zone) {
+            throw Error(`can not reschedule task to ${this.name} which is descendants of the original zone ${task.zone.name}`);
+          }
+          newZone = newZone.parent;
+        }
+      }
+      task._transitionTo(scheduling, notScheduled);
+      const zoneDelegates = [];
+      task._zoneDelegates = zoneDelegates;
+      task._zone = this;
+      try {
+        task = this._zoneDelegate.scheduleTask(this, task);
+      } catch (err) {
+        task._transitionTo(unknown, scheduling, notScheduled);
+        this._zoneDelegate.handleError(this, err);
+        throw err;
+      }
+      if (task._zoneDelegates === zoneDelegates) {
+        this._updateTaskCount(task, 1);
+      }
+      if (task.state == scheduling) {
+        task._transitionTo(scheduled, scheduling);
+      }
+      return task;
+    }
+    scheduleMicroTask(source, callback, data, customSchedule) {
+      return this.scheduleTask(new ZoneTask(microTask, source, callback, data, customSchedule, void 0));
+    }
+    scheduleMacroTask(source, callback, data, customSchedule, customCancel) {
+      return this.scheduleTask(new ZoneTask(macroTask, source, callback, data, customSchedule, customCancel));
+    }
+    scheduleEventTask(source, callback, data, customSchedule, customCancel) {
+      return this.scheduleTask(new ZoneTask(eventTask, source, callback, data, customSchedule, customCancel));
+    }
+    cancelTask(task) {
+      if (task.zone != this)
+        throw new Error("A task can only be cancelled in the zone of creation! (Creation: " + (task.zone || NO_ZONE).name + "; Execution: " + this.name + ")");
+      if (task.state !== scheduled && task.state !== running) {
+        return;
+      }
+      task._transitionTo(canceling, scheduled, running);
+      try {
+        this._zoneDelegate.cancelTask(this, task);
+      } catch (err) {
+        task._transitionTo(unknown, canceling);
+        this._zoneDelegate.handleError(this, err);
+        throw err;
+      }
+      this._updateTaskCount(task, -1);
+      task._transitionTo(notScheduled, canceling);
+      task.runCount = -1;
+      return task;
+    }
+    _updateTaskCount(task, count) {
+      const zoneDelegates = task._zoneDelegates;
+      if (count == -1) {
+        task._zoneDelegates = null;
+      }
+      for (let i = 0; i < zoneDelegates.length; i++) {
+        zoneDelegates[i]._updateTaskCount(task.type, count);
+      }
+    }
+  }
+  const DELEGATE_ZS = {
+    name: "",
+    onHasTask: (delegate, _, target, hasTaskState) => delegate.hasTask(target, hasTaskState),
+    onScheduleTask: (delegate, _, target, task) => delegate.scheduleTask(target, task),
+    onInvokeTask: (delegate, _, target, task, applyThis, applyArgs) => delegate.invokeTask(target, task, applyThis, applyArgs),
+    onCancelTask: (delegate, _, target, task) => delegate.cancelTask(target, task)
+  };
+  class _ZoneDelegate {
+    get zone() {
+      return this._zone;
+    }
+    _zone;
+    _taskCounts = {
+      "microTask": 0,
+      "macroTask": 0,
+      "eventTask": 0
+    };
+    _parentDelegate;
+    _forkDlgt;
+    _forkZS;
+    _forkCurrZone;
+    _interceptDlgt;
+    _interceptZS;
+    _interceptCurrZone;
+    _invokeDlgt;
+    _invokeZS;
+    _invokeCurrZone;
+    _handleErrorDlgt;
+    _handleErrorZS;
+    _handleErrorCurrZone;
+    _scheduleTaskDlgt;
+    _scheduleTaskZS;
+    _scheduleTaskCurrZone;
+    _invokeTaskDlgt;
+    _invokeTaskZS;
+    _invokeTaskCurrZone;
+    _cancelTaskDlgt;
+    _cancelTaskZS;
+    _cancelTaskCurrZone;
+    _hasTaskDlgt;
+    _hasTaskDlgtOwner;
+    _hasTaskZS;
+    _hasTaskCurrZone;
+    constructor(zone, parentDelegate, zoneSpec) {
+      this._zone = zone;
+      this._parentDelegate = parentDelegate;
+      this._forkZS = zoneSpec && (zoneSpec && zoneSpec.onFork ? zoneSpec : parentDelegate._forkZS);
+      this._forkDlgt = zoneSpec && (zoneSpec.onFork ? parentDelegate : parentDelegate._forkDlgt);
+      this._forkCurrZone = zoneSpec && (zoneSpec.onFork ? this._zone : parentDelegate._forkCurrZone);
+      this._interceptZS = zoneSpec && (zoneSpec.onIntercept ? zoneSpec : parentDelegate._interceptZS);
+      this._interceptDlgt = zoneSpec && (zoneSpec.onIntercept ? parentDelegate : parentDelegate._interceptDlgt);
+      this._interceptCurrZone = zoneSpec && (zoneSpec.onIntercept ? this._zone : parentDelegate._interceptCurrZone);
+      this._invokeZS = zoneSpec && (zoneSpec.onInvoke ? zoneSpec : parentDelegate._invokeZS);
+      this._invokeDlgt = zoneSpec && (zoneSpec.onInvoke ? parentDelegate : parentDelegate._invokeDlgt);
+      this._invokeCurrZone = zoneSpec && (zoneSpec.onInvoke ? this._zone : parentDelegate._invokeCurrZone);
+      this._handleErrorZS = zoneSpec && (zoneSpec.onHandleError ? zoneSpec : parentDelegate._handleErrorZS);
+      this._handleErrorDlgt = zoneSpec && (zoneSpec.onHandleError ? parentDelegate : parentDelegate._handleErrorDlgt);
+      this._handleErrorCurrZone = zoneSpec && (zoneSpec.onHandleError ? this._zone : parentDelegate._handleErrorCurrZone);
+      this._scheduleTaskZS = zoneSpec && (zoneSpec.onScheduleTask ? zoneSpec : parentDelegate._scheduleTaskZS);
+      this._scheduleTaskDlgt = zoneSpec && (zoneSpec.onScheduleTask ? parentDelegate : parentDelegate._scheduleTaskDlgt);
+      this._scheduleTaskCurrZone = zoneSpec && (zoneSpec.onScheduleTask ? this._zone : parentDelegate._scheduleTaskCurrZone);
+      this._invokeTaskZS = zoneSpec && (zoneSpec.onInvokeTask ? zoneSpec : parentDelegate._invokeTaskZS);
+      this._invokeTaskDlgt = zoneSpec && (zoneSpec.onInvokeTask ? parentDelegate : parentDelegate._invokeTaskDlgt);
+      this._invokeTaskCurrZone = zoneSpec && (zoneSpec.onInvokeTask ? this._zone : parentDelegate._invokeTaskCurrZone);
+      this._cancelTaskZS = zoneSpec && (zoneSpec.onCancelTask ? zoneSpec : parentDelegate._cancelTaskZS);
+      this._cancelTaskDlgt = zoneSpec && (zoneSpec.onCancelTask ? parentDelegate : parentDelegate._cancelTaskDlgt);
+      this._cancelTaskCurrZone = zoneSpec && (zoneSpec.onCancelTask ? this._zone : parentDelegate._cancelTaskCurrZone);
+      this._hasTaskZS = null;
+      this._hasTaskDlgt = null;
+      this._hasTaskDlgtOwner = null;
+      this._hasTaskCurrZone = null;
+      const zoneSpecHasTask = zoneSpec && zoneSpec.onHasTask;
+      const parentHasTask = parentDelegate && parentDelegate._hasTaskZS;
+      if (zoneSpecHasTask || parentHasTask) {
+        this._hasTaskZS = zoneSpecHasTask ? zoneSpec : DELEGATE_ZS;
+        this._hasTaskDlgt = parentDelegate;
+        this._hasTaskDlgtOwner = this;
+        this._hasTaskCurrZone = this._zone;
+        if (!zoneSpec.onScheduleTask) {
+          this._scheduleTaskZS = DELEGATE_ZS;
+          this._scheduleTaskDlgt = parentDelegate;
+          this._scheduleTaskCurrZone = this._zone;
+        }
+        if (!zoneSpec.onInvokeTask) {
+          this._invokeTaskZS = DELEGATE_ZS;
+          this._invokeTaskDlgt = parentDelegate;
+          this._invokeTaskCurrZone = this._zone;
+        }
+        if (!zoneSpec.onCancelTask) {
+          this._cancelTaskZS = DELEGATE_ZS;
+          this._cancelTaskDlgt = parentDelegate;
+          this._cancelTaskCurrZone = this._zone;
+        }
+      }
+    }
+    fork(targetZone, zoneSpec) {
+      return this._forkZS ? this._forkZS.onFork(this._forkDlgt, this.zone, targetZone, zoneSpec) : new ZoneImpl(targetZone, zoneSpec);
+    }
+    intercept(targetZone, callback, source) {
+      return this._interceptZS ? this._interceptZS.onIntercept(this._interceptDlgt, this._interceptCurrZone, targetZone, callback, source) : callback;
+    }
+    invoke(targetZone, callback, applyThis, applyArgs, source) {
+      return this._invokeZS ? this._invokeZS.onInvoke(this._invokeDlgt, this._invokeCurrZone, targetZone, callback, applyThis, applyArgs, source) : callback.apply(applyThis, applyArgs);
+    }
+    handleError(targetZone, error) {
+      return this._handleErrorZS ? this._handleErrorZS.onHandleError(this._handleErrorDlgt, this._handleErrorCurrZone, targetZone, error) : true;
+    }
+    scheduleTask(targetZone, task) {
+      let returnTask = task;
+      if (this._scheduleTaskZS) {
+        if (this._hasTaskZS) {
+          returnTask._zoneDelegates.push(this._hasTaskDlgtOwner);
+        }
+        returnTask = this._scheduleTaskZS.onScheduleTask(this._scheduleTaskDlgt, this._scheduleTaskCurrZone, targetZone, task);
+        if (!returnTask)
+          returnTask = task;
+      } else {
+        if (task.scheduleFn) {
+          task.scheduleFn(task);
+        } else if (task.type == microTask) {
+          scheduleMicroTask(task);
+        } else {
+          throw new Error("Task is missing scheduleFn.");
+        }
+      }
+      return returnTask;
+    }
+    invokeTask(targetZone, task, applyThis, applyArgs) {
+      return this._invokeTaskZS ? this._invokeTaskZS.onInvokeTask(this._invokeTaskDlgt, this._invokeTaskCurrZone, targetZone, task, applyThis, applyArgs) : task.callback.apply(applyThis, applyArgs);
+    }
+    cancelTask(targetZone, task) {
+      let value;
+      if (this._cancelTaskZS) {
+        value = this._cancelTaskZS.onCancelTask(this._cancelTaskDlgt, this._cancelTaskCurrZone, targetZone, task);
+      } else {
+        if (!task.cancelFn) {
+          throw Error("Task is not cancelable");
+        }
+        value = task.cancelFn(task);
+      }
+      return value;
+    }
+    hasTask(targetZone, isEmpty) {
+      try {
+        this._hasTaskZS && this._hasTaskZS.onHasTask(this._hasTaskDlgt, this._hasTaskCurrZone, targetZone, isEmpty);
+      } catch (err) {
+        this.handleError(targetZone, err);
+      }
+    }
+    _updateTaskCount(type, count) {
+      const counts = this._taskCounts;
+      const prev = counts[type];
+      const next = counts[type] = prev + count;
+      if (next < 0) {
+        throw new Error("More tasks executed then were scheduled.");
+      }
+      if (prev == 0 || next == 0) {
+        const isEmpty = {
+          microTask: counts["microTask"] > 0,
+          macroTask: counts["macroTask"] > 0,
+          eventTask: counts["eventTask"] > 0,
+          change: type
+        };
+        this.hasTask(this._zone, isEmpty);
+      }
+    }
+  }
+  class ZoneTask {
+    type;
+    source;
+    invoke;
+    callback;
+    data;
+    scheduleFn;
+    cancelFn;
+    _zone = null;
+    runCount = 0;
+    _zoneDelegates = null;
+    _state = "notScheduled";
+    constructor(type, source, callback, options, scheduleFn, cancelFn) {
+      this.type = type;
+      this.source = source;
+      this.data = options;
+      this.scheduleFn = scheduleFn;
+      this.cancelFn = cancelFn;
+      if (!callback) {
+        throw new Error("callback is not defined");
+      }
+      this.callback = callback;
+      const self2 = this;
+      if (type === eventTask && options && options.useG) {
+        this.invoke = ZoneTask.invokeTask;
+      } else {
+        this.invoke = function() {
+          return ZoneTask.invokeTask.call(global, self2, this, arguments);
+        };
+      }
+    }
+    static invokeTask(task, target, args) {
+      if (!task) {
+        task = this;
+      }
+      _numberOfNestedTaskFrames++;
+      try {
+        task.runCount++;
+        return task.zone.runTask(task, target, args);
+      } finally {
+        if (_numberOfNestedTaskFrames == 1) {
+          drainMicroTaskQueue();
+        }
+        _numberOfNestedTaskFrames--;
+      }
+    }
+    get zone() {
+      return this._zone;
+    }
+    get state() {
+      return this._state;
+    }
+    cancelScheduleRequest() {
+      this._transitionTo(notScheduled, scheduling);
+    }
+    _transitionTo(toState, fromState1, fromState2) {
+      if (this._state === fromState1 || this._state === fromState2) {
+        this._state = toState;
+        if (toState == notScheduled) {
+          this._zoneDelegates = null;
+        }
+      } else {
+        throw new Error(`${this.type} '${this.source}': can not transition to '${toState}', expecting state '${fromState1}'${fromState2 ? " or '" + fromState2 + "'" : ""}, was '${this._state}'.`);
+      }
+    }
+    toString() {
+      if (this.data && typeof this.data.handleId !== "undefined") {
+        return this.data.handleId.toString();
+      } else {
+        return Object.prototype.toString.call(this);
+      }
+    }
+    // add toJSON method to prevent cyclic error when
+    // call JSON.stringify(zoneTask)
+    toJSON() {
+      return {
+        type: this.type,
+        state: this.state,
+        source: this.source,
+        zone: this.zone.name,
+        runCount: this.runCount
+      };
+    }
+  }
+  const symbolSetTimeout = __symbol__("setTimeout");
+  const symbolPromise = __symbol__("Promise");
+  const symbolThen = __symbol__("then");
+  let _microTaskQueue = [];
+  let _isDrainingMicrotaskQueue = false;
+  let nativeMicroTaskQueuePromise;
+  function nativeScheduleMicroTask(func) {
+    if (!nativeMicroTaskQueuePromise) {
+      if (global[symbolPromise]) {
+        nativeMicroTaskQueuePromise = global[symbolPromise].resolve(0);
+      }
+    }
+    if (nativeMicroTaskQueuePromise) {
+      let nativeThen = nativeMicroTaskQueuePromise[symbolThen];
+      if (!nativeThen) {
+        nativeThen = nativeMicroTaskQueuePromise["then"];
+      }
+      nativeThen.call(nativeMicroTaskQueuePromise, func);
+    } else {
+      global[symbolSetTimeout](func, 0);
+    }
+  }
+  function scheduleMicroTask(task) {
+    if (_numberOfNestedTaskFrames === 0 && _microTaskQueue.length === 0) {
+      nativeScheduleMicroTask(drainMicroTaskQueue);
+    }
+    task && _microTaskQueue.push(task);
+  }
+  function drainMicroTaskQueue() {
+    if (!_isDrainingMicrotaskQueue) {
+      _isDrainingMicrotaskQueue = true;
+      while (_microTaskQueue.length) {
+        const queue = _microTaskQueue;
+        _microTaskQueue = [];
+        for (let i = 0; i < queue.length; i++) {
+          const task = queue[i];
+          try {
+            task.zone.runTask(task, null, null);
+          } catch (error) {
+            _api.onUnhandledError(error);
+          }
+        }
+      }
+      _api.microtaskDrainDone();
+      _isDrainingMicrotaskQueue = false;
+    }
+  }
+  const NO_ZONE = { name: "NO ZONE" };
+  const notScheduled = "notScheduled", scheduling = "scheduling", scheduled = "scheduled", running = "running", canceling = "canceling", unknown = "unknown";
+  const microTask = "microTask", macroTask = "macroTask", eventTask = "eventTask";
+  const patches = {};
+  const _api = {
+    symbol: __symbol__,
+    currentZoneFrame: () => _currentZoneFrame,
+    onUnhandledError: noop,
+    microtaskDrainDone: noop,
+    scheduleMicroTask,
+    showUncaughtError: () => !ZoneImpl[__symbol__("ignoreConsoleErrorUncaughtError")],
+    patchEventTarget: () => [],
+    patchOnProperties: noop,
+    patchMethod: () => noop,
+    bindArguments: () => [],
+    patchThen: () => noop,
+    patchMacroTask: () => noop,
+    patchEventPrototype: () => noop,
+    isIEOrEdge: () => false,
+    getGlobalObjects: () => void 0,
+    ObjectDefineProperty: () => noop,
+    ObjectGetOwnPropertyDescriptor: () => void 0,
+    ObjectCreate: () => void 0,
+    ArraySlice: () => [],
+    patchClass: () => noop,
+    wrapWithCurrentZone: () => noop,
+    filterProperties: () => [],
+    attachOriginToPatched: () => noop,
+    _redefineProperty: () => noop,
+    patchCallbacks: () => noop,
+    nativeScheduleMicroTask
+  };
+  let _currentZoneFrame = { parent: null, zone: new ZoneImpl(null, null) };
+  let _currentTask = null;
+  let _numberOfNestedTaskFrames = 0;
+  function noop() {
+  }
+  performanceMeasure("Zone", "Zone");
+  return ZoneImpl;
+}
+function loadZone() {
+  const global2 = globalThis;
+  const checkDuplicate = global2[__symbol__("forceDuplicateZoneCheck")] === true;
+  if (global2["Zone"] && (checkDuplicate || typeof global2["Zone"].__symbol__ !== "function")) {
+    throw new Error("Zone already loaded.");
+  }
+  global2["Zone"] ??= initZone();
+  return global2["Zone"];
+}
+var ObjectGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;
+var ObjectDefineProperty = Object.defineProperty;
+var ObjectGetPrototypeOf = Object.getPrototypeOf;
+var ObjectCreate = Object.create;
+var ArraySlice = Array.prototype.slice;
+var ADD_EVENT_LISTENER_STR = "addEventListener";
+var REMOVE_EVENT_LISTENER_STR = "removeEventListener";
+var ZONE_SYMBOL_ADD_EVENT_LISTENER = __symbol__(ADD_EVENT_LISTENER_STR);
+var ZONE_SYMBOL_REMOVE_EVENT_LISTENER = __symbol__(REMOVE_EVENT_LISTENER_STR);
+var TRUE_STR = "true";
+var FALSE_STR = "false";
+var ZONE_SYMBOL_PREFIX = __symbol__("");
+function wrapWithCurrentZone(callback, source) {
+  return Zone.current.wrap(callback, source);
+}
+function scheduleMacroTaskWithCurrentZone(source, callback, data, customSchedule, customCancel) {
+  return Zone.current.scheduleMacroTask(source, callback, data, customSchedule, customCancel);
+}
+var zoneSymbol = __symbol__;
+var isWindowExists = typeof window !== "undefined";
+var internalWindow = isWindowExists ? window : void 0;
+var _global = isWindowExists && internalWindow || globalThis;
+var REMOVE_ATTRIBUTE = "removeAttribute";
+function bindArguments(args, source) {
+  for (let i = args.length - 1; i >= 0; i--) {
+    if (typeof args[i] === "function") {
+      args[i] = wrapWithCurrentZone(args[i], source + "_" + i);
+    }
+  }
+  return args;
+}
+function patchPrototype(prototype, fnNames) {
+  const source = prototype.constructor["name"];
+  for (let i = 0; i < fnNames.length; i++) {
+    const name = fnNames[i];
+    const delegate = prototype[name];
+    if (delegate) {
+      const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, name);
+      if (!isPropertyWritable(prototypeDesc)) {
+        continue;
+      }
+      prototype[name] = ((delegate2) => {
+        const patched = function() {
+          return delegate2.apply(this, bindArguments(arguments, source + "." + name));
+        };
+        attachOriginToPatched(patched, delegate2);
+        return patched;
+      })(delegate);
+    }
+  }
+}
+function isPropertyWritable(propertyDesc) {
+  if (!propertyDesc) {
+    return true;
+  }
+  if (propertyDesc.writable === false) {
+    return false;
+  }
+  return !(typeof propertyDesc.get === "function" && typeof propertyDesc.set === "undefined");
+}
+var isWebWorker = typeof WorkerGlobalScope !== "undefined" && self instanceof WorkerGlobalScope;
+var isNode = !("nw" in _global) && typeof _global.process !== "undefined" && _global.process.toString() === "[object process]";
+var isBrowser = !isNode && !isWebWorker && !!(isWindowExists && internalWindow["HTMLElement"]);
+var isMix = typeof _global.process !== "undefined" && _global.process.toString() === "[object process]" && !isWebWorker && !!(isWindowExists && internalWindow["HTMLElement"]);
+var zoneSymbolEventNames$1 = {};
+var enableBeforeunloadSymbol = zoneSymbol("enable_beforeunload");
+var wrapFn = function(event) {
+  event = event || _global.event;
+  if (!event) {
+    return;
+  }
+  let eventNameSymbol = zoneSymbolEventNames$1[event.type];
+  if (!eventNameSymbol) {
+    eventNameSymbol = zoneSymbolEventNames$1[event.type] = zoneSymbol("ON_PROPERTY" + event.type);
+  }
+  const target = this || event.target || _global;
+  const listener = target[eventNameSymbol];
+  let result;
+  if (isBrowser && target === internalWindow && event.type === "error") {
+    const errorEvent = event;
+    result = listener && listener.call(this, errorEvent.message, errorEvent.filename, errorEvent.lineno, errorEvent.colno, errorEvent.error);
+    if (result === true) {
+      event.preventDefault();
+    }
+  } else {
+    result = listener && listener.apply(this, arguments);
+    if (
+      // https://github.com/angular/angular/issues/47579
+      // https://www.w3.org/TR/2011/WD-html5-20110525/history.html#beforeunloadevent
+      // This is the only specific case we should check for. The spec defines that the
+      // `returnValue` attribute represents the message to show the user. When the event
+      // is created, this attribute must be set to the empty string.
+      event.type === "beforeunload" && // To prevent any breaking changes resulting from this change, given that
+      // it was already causing a significant number of failures in G3, we have hidden
+      // that behavior behind a global configuration flag. Consumers can enable this
+      // flag explicitly if they want the `beforeunload` event to be handled as defined
+      // in the specification.
+      _global[enableBeforeunloadSymbol] && // The IDL event definition is `attribute DOMString returnValue`, so we check whether
+      // `typeof result` is a string.
+      typeof result === "string"
+    ) {
+      event.returnValue = result;
+    } else if (result != void 0 && !result) {
+      event.preventDefault();
+    }
+  }
+  return result;
+};
+function patchProperty(obj, prop, prototype) {
+  let desc = ObjectGetOwnPropertyDescriptor(obj, prop);
+  if (!desc && prototype) {
+    const prototypeDesc = ObjectGetOwnPropertyDescriptor(prototype, prop);
+    if (prototypeDesc) {
+      desc = { enumerable: true, configurable: true };
+    }
+  }
+  if (!desc || !desc.configurable) {
+    return;
+  }
+  const onPropPatchedSymbol = zoneSymbol("on" + prop + "patched");
+  if (obj.hasOwnProperty(onPropPatchedSymbol) && obj[onPropPatchedSymbol]) {
+    return;
+  }
+  delete desc.writable;
+  delete desc.value;
+  const originalDescGet = desc.get;
+  const originalDescSet = desc.set;
+  const eventName = prop.slice(2);
+  let eventNameSymbol = zoneSymbolEventNames$1[eventName];
+  if (!eventNameSymbol) {
+    eventNameSymbol = zoneSymbolEventNames$1[eventName] = zoneSymbol("ON_PROPERTY" + eventName);
+  }
+  desc.set = function(newValue) {
+    let target = this;
+    if (!target && obj === _global) {
+      target = _global;
+    }
+    if (!target) {
+      return;
+    }
+    const previousValue = target[eventNameSymbol];
+    if (typeof previousValue === "function") {
+      target.removeEventListener(eventName, wrapFn);
+    }
+    originalDescSet?.call(target, null);
+    target[eventNameSymbol] = newValue;
+    if (typeof newValue === "function") {
+      target.addEventListener(eventName, wrapFn, false);
+    }
+  };
+  desc.get = function() {
+    let target = this;
+    if (!target && obj === _global) {
+      target = _global;
+    }
+    if (!target) {
+      return null;
+    }
+    const listener = target[eventNameSymbol];
+    if (listener) {
+      return listener;
+    } else if (originalDescGet) {
+      let value = originalDescGet.call(this);
+      if (value) {
+        desc.set.call(this, value);
+        if (typeof target[REMOVE_ATTRIBUTE] === "function") {
+          target.removeAttribute(prop);
+        }
+        return value;
+      }
+    }
+    return null;
+  };
+  ObjectDefineProperty(obj, prop, desc);
+  obj[onPropPatchedSymbol] = true;
+}
+function patchOnProperties(obj, properties, prototype) {
+  if (properties) {
+    for (let i = 0; i < properties.length; i++) {
+      patchProperty(obj, "on" + properties[i], prototype);
+    }
+  } else {
+    const onProperties = [];
+    for (const prop in obj) {
+      if (prop.slice(0, 2) == "on") {
+        onProperties.push(prop);
+      }
+    }
+    for (let j = 0; j < onProperties.length; j++) {
+      patchProperty(obj, onProperties[j], prototype);
+    }
+  }
+}
+var originalInstanceKey = zoneSymbol("originalInstance");
+function patchClass(className) {
+  const OriginalClass = _global[className];
+  if (!OriginalClass)
+    return;
+  _global[zoneSymbol(className)] = OriginalClass;
+  _global[className] = function() {
+    const a = bindArguments(arguments, className);
+    switch (a.length) {
+      case 0:
+        this[originalInstanceKey] = new OriginalClass();
+        break;
+      case 1:
+        this[originalInstanceKey] = new OriginalClass(a[0]);
+        break;
+      case 2:
+        this[originalInstanceKey] = new OriginalClass(a[0], a[1]);
+        break;
+      case 3:
+        this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2]);
+        break;
+      case 4:
+        this[originalInstanceKey] = new OriginalClass(a[0], a[1], a[2], a[3]);
+        break;
+      default:
+        throw new Error("Arg list too long.");
+    }
+  };
+  attachOriginToPatched(_global[className], OriginalClass);
+  const instance = new OriginalClass(function() {
+  });
+  let prop;
+  for (prop in instance) {
+    if (className === "XMLHttpRequest" && prop === "responseBlob")
+      continue;
+    (function(prop2) {
+      if (typeof instance[prop2] === "function") {
+        _global[className].prototype[prop2] = function() {
+          return this[originalInstanceKey][prop2].apply(this[originalInstanceKey], arguments);
+        };
+      } else {
+        ObjectDefineProperty(_global[className].prototype, prop2, {
+          set: function(fn) {
+            if (typeof fn === "function") {
+              this[originalInstanceKey][prop2] = wrapWithCurrentZone(fn, className + "." + prop2);
+              attachOriginToPatched(this[originalInstanceKey][prop2], fn);
+            } else {
+              this[originalInstanceKey][prop2] = fn;
+            }
+          },
+          get: function() {
+            return this[originalInstanceKey][prop2];
+          }
+        });
+      }
+    })(prop);
+  }
+  for (prop in OriginalClass) {
+    if (prop !== "prototype" && OriginalClass.hasOwnProperty(prop)) {
+      _global[className][prop] = OriginalClass[prop];
+    }
+  }
+}
+function patchMethod(target, name, patchFn) {
+  let proto = target;
+  while (proto && !proto.hasOwnProperty(name)) {
+    proto = ObjectGetPrototypeOf(proto);
+  }
+  if (!proto && target[name]) {
+    proto = target;
+  }
+  const delegateName = zoneSymbol(name);
+  let delegate = null;
+  if (proto && (!(delegate = proto[delegateName]) || !proto.hasOwnProperty(delegateName))) {
+    delegate = proto[delegateName] = proto[name];
+    const desc = proto && ObjectGetOwnPropertyDescriptor(proto, name);
+    if (isPropertyWritable(desc)) {
+      const patchDelegate = patchFn(delegate, delegateName, name);
+      proto[name] = function() {
+        return patchDelegate(this, arguments);
+      };
+      attachOriginToPatched(proto[name], delegate);
+    }
+  }
+  return delegate;
+}
+function patchMacroTask(obj, funcName, metaCreator) {
+  let setNative = null;
+  function scheduleTask(task) {
+    const data = task.data;
+    data.args[data.cbIdx] = function() {
+      task.invoke.apply(this, arguments);
+    };
+    setNative.apply(data.target, data.args);
+    return task;
+  }
+  setNative = patchMethod(obj, funcName, (delegate) => function(self2, args) {
+    const meta = metaCreator(self2, args);
+    if (meta.cbIdx >= 0 && typeof args[meta.cbIdx] === "function") {
+      return scheduleMacroTaskWithCurrentZone(meta.name, args[meta.cbIdx], meta, scheduleTask);
+    } else {
+      return delegate.apply(self2, args);
+    }
+  });
+}
+function attachOriginToPatched(patched, original) {
+  patched[zoneSymbol("OriginalDelegate")] = original;
+}
+var isDetectedIEOrEdge = false;
+var ieOrEdge = false;
+function isIEOrEdge() {
+  if (isDetectedIEOrEdge) {
+    return ieOrEdge;
+  }
+  isDetectedIEOrEdge = true;
+  try {
+    const ua = internalWindow.navigator.userAgent;
+    if (ua.indexOf("MSIE ") !== -1 || ua.indexOf("Trident/") !== -1 || ua.indexOf("Edge/") !== -1) {
+      ieOrEdge = true;
+    }
+  } catch (error) {
+  }
+  return ieOrEdge;
+}
+function isFunction(value) {
+  return typeof value === "function";
+}
+function isNumber(value) {
+  return typeof value === "number";
+}
+var OPTIMIZED_ZONE_EVENT_TASK_DATA = {
+  useG: true
+};
+var zoneSymbolEventNames = {};
+var globalSources = {};
+var EVENT_NAME_SYMBOL_REGX = new RegExp("^" + ZONE_SYMBOL_PREFIX + "(\\w+)(true|false)$");
+var IMMEDIATE_PROPAGATION_SYMBOL = zoneSymbol("propagationStopped");
+function prepareEventNames(eventName, eventNameToString) {
+  const falseEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + FALSE_STR;
+  const trueEventName = (eventNameToString ? eventNameToString(eventName) : eventName) + TRUE_STR;
+  const symbol = ZONE_SYMBOL_PREFIX + falseEventName;
+  const symbolCapture = ZONE_SYMBOL_PREFIX + trueEventName;
+  zoneSymbolEventNames[eventName] = {};
+  zoneSymbolEventNames[eventName][FALSE_STR] = symbol;
+  zoneSymbolEventNames[eventName][TRUE_STR] = symbolCapture;
+}
+function patchEventTarget(_global2, api, apis, patchOptions) {
+  const ADD_EVENT_LISTENER = patchOptions && patchOptions.add || ADD_EVENT_LISTENER_STR;
+  const REMOVE_EVENT_LISTENER = patchOptions && patchOptions.rm || REMOVE_EVENT_LISTENER_STR;
+  const LISTENERS_EVENT_LISTENER = patchOptions && patchOptions.listeners || "eventListeners";
+  const REMOVE_ALL_LISTENERS_EVENT_LISTENER = patchOptions && patchOptions.rmAll || "removeAllListeners";
+  const zoneSymbolAddEventListener = zoneSymbol(ADD_EVENT_LISTENER);
+  const ADD_EVENT_LISTENER_SOURCE = "." + ADD_EVENT_LISTENER + ":";
+  const PREPEND_EVENT_LISTENER = "prependListener";
+  const PREPEND_EVENT_LISTENER_SOURCE = "." + PREPEND_EVENT_LISTENER + ":";
+  const invokeTask = function(task, target, event) {
+    if (task.isRemoved) {
+      return;
+    }
+    const delegate = task.callback;
+    if (typeof delegate === "object" && delegate.handleEvent) {
+      task.callback = (event2) => delegate.handleEvent(event2);
+      task.originalDelegate = delegate;
+    }
+    let error;
+    try {
+      task.invoke(task, target, [event]);
+    } catch (err) {
+      error = err;
+    }
+    const options = task.options;
+    if (options && typeof options === "object" && options.once) {
+      const delegate2 = task.originalDelegate ? task.originalDelegate : task.callback;
+      target[REMOVE_EVENT_LISTENER].call(target, event.type, delegate2, options);
+    }
+    return error;
+  };
+  function globalCallback(context, event, isCapture) {
+    event = event || _global2.event;
+    if (!event) {
+      return;
+    }
+    const target = context || event.target || _global2;
+    const tasks = target[zoneSymbolEventNames[event.type][isCapture ? TRUE_STR : FALSE_STR]];
+    if (tasks) {
+      const errors = [];
+      if (tasks.length === 1) {
+        const err = invokeTask(tasks[0], target, event);
+        err && errors.push(err);
+      } else {
+        const copyTasks = tasks.slice();
+        for (let i = 0; i < copyTasks.length; i++) {
+          if (event && event[IMMEDIATE_PROPAGATION_SYMBOL] === true) {
+            break;
+          }
+          const err = invokeTask(copyTasks[i], target, event);
+          err && errors.push(err);
+        }
+      }
+      if (errors.length === 1) {
+        throw errors[0];
+      } else {
+        for (let i = 0; i < errors.length; i++) {
+          const err = errors[i];
+          api.nativeScheduleMicroTask(() => {
+            throw err;
+          });
+        }
+      }
+    }
+  }
+  const globalZoneAwareCallback = function(event) {
+    return globalCallback(this, event, false);
+  };
+  const globalZoneAwareCaptureCallback = function(event) {
+    return globalCallback(this, event, true);
+  };
+  function patchEventTargetMethods(obj, patchOptions2) {
+    if (!obj) {
+      return false;
+    }
+    let useGlobalCallback = true;
+    if (patchOptions2 && patchOptions2.useG !== void 0) {
+      useGlobalCallback = patchOptions2.useG;
+    }
+    const validateHandler = patchOptions2 && patchOptions2.vh;
+    let checkDuplicate = true;
+    if (patchOptions2 && patchOptions2.chkDup !== void 0) {
+      checkDuplicate = patchOptions2.chkDup;
+    }
+    let returnTarget = false;
+    if (patchOptions2 && patchOptions2.rt !== void 0) {
+      returnTarget = patchOptions2.rt;
+    }
+    let proto = obj;
+    while (proto && !proto.hasOwnProperty(ADD_EVENT_LISTENER)) {
+      proto = ObjectGetPrototypeOf(proto);
+    }
+    if (!proto && obj[ADD_EVENT_LISTENER]) {
+      proto = obj;
+    }
+    if (!proto) {
+      return false;
+    }
+    if (proto[zoneSymbolAddEventListener]) {
+      return false;
+    }
+    const eventNameToString = patchOptions2 && patchOptions2.eventNameToString;
+    const taskData = {};
+    const nativeAddEventListener = proto[zoneSymbolAddEventListener] = proto[ADD_EVENT_LISTENER];
+    const nativeRemoveEventListener = proto[zoneSymbol(REMOVE_EVENT_LISTENER)] = proto[REMOVE_EVENT_LISTENER];
+    const nativeListeners = proto[zoneSymbol(LISTENERS_EVENT_LISTENER)] = proto[LISTENERS_EVENT_LISTENER];
+    const nativeRemoveAllListeners = proto[zoneSymbol(REMOVE_ALL_LISTENERS_EVENT_LISTENER)] = proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER];
+    let nativePrependEventListener;
+    if (patchOptions2 && patchOptions2.prepend) {
+      nativePrependEventListener = proto[zoneSymbol(patchOptions2.prepend)] = proto[patchOptions2.prepend];
+    }
+    function buildEventListenerOptions(options, passive) {
+      if (!passive) {
+        return options;
+      }
+      if (typeof options === "boolean") {
+        return { capture: options, passive: true };
+      }
+      if (!options) {
+        return { passive: true };
+      }
+      if (typeof options === "object" && options.passive !== false) {
+        return __spreadProps(__spreadValues({}, options), { passive: true });
+      }
+      return options;
+    }
+    const customScheduleGlobal = function(task) {
+      if (taskData.isExisting) {
+        return;
+      }
+      return nativeAddEventListener.call(taskData.target, taskData.eventName, taskData.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, taskData.options);
+    };
+    const customCancelGlobal = function(task) {
+      if (!task.isRemoved) {
+        const symbolEventNames = zoneSymbolEventNames[task.eventName];
+        let symbolEventName;
+        if (symbolEventNames) {
+          symbolEventName = symbolEventNames[task.capture ? TRUE_STR : FALSE_STR];
+        }
+        const existingTasks = symbolEventName && task.target[symbolEventName];
+        if (existingTasks) {
+          for (let i = 0; i < existingTasks.length; i++) {
+            const existingTask = existingTasks[i];
+            if (existingTask === task) {
+              existingTasks.splice(i, 1);
+              task.isRemoved = true;
+              if (task.removeAbortListener) {
+                task.removeAbortListener();
+                task.removeAbortListener = null;
+              }
+              if (existingTasks.length === 0) {
+                task.allRemoved = true;
+                task.target[symbolEventName] = null;
+              }
+              break;
+            }
+          }
+        }
+      }
+      if (!task.allRemoved) {
+        return;
+      }
+      return nativeRemoveEventListener.call(task.target, task.eventName, task.capture ? globalZoneAwareCaptureCallback : globalZoneAwareCallback, task.options);
+    };
+    const customScheduleNonGlobal = function(task) {
+      return nativeAddEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+    };
+    const customSchedulePrepend = function(task) {
+      return nativePrependEventListener.call(taskData.target, taskData.eventName, task.invoke, taskData.options);
+    };
+    const customCancelNonGlobal = function(task) {
+      return nativeRemoveEventListener.call(task.target, task.eventName, task.invoke, task.options);
+    };
+    const customSchedule = useGlobalCallback ? customScheduleGlobal : customScheduleNonGlobal;
+    const customCancel = useGlobalCallback ? customCancelGlobal : customCancelNonGlobal;
+    const compareTaskCallbackVsDelegate = function(task, delegate) {
+      const typeOfDelegate = typeof delegate;
+      return typeOfDelegate === "function" && task.callback === delegate || typeOfDelegate === "object" && task.originalDelegate === delegate;
+    };
+    const compare = patchOptions2?.diff || compareTaskCallbackVsDelegate;
+    const unpatchedEvents = Zone[zoneSymbol("UNPATCHED_EVENTS")];
+    const passiveEvents = _global2[zoneSymbol("PASSIVE_EVENTS")];
+    function copyEventListenerOptions(options) {
+      if (typeof options === "object" && options !== null) {
+        const newOptions = __spreadValues({}, options);
+        if (options.signal) {
+          newOptions.signal = options.signal;
+        }
+        return newOptions;
+      }
+      return options;
+    }
+    const makeAddListener = function(nativeListener, addSource, customScheduleFn, customCancelFn, returnTarget2 = false, prepend = false) {
+      return function() {
+        const target = this || _global2;
+        let eventName = arguments[0];
+        if (patchOptions2 && patchOptions2.transferEventName) {
+          eventName = patchOptions2.transferEventName(eventName);
+        }
+        let delegate = arguments[1];
+        if (!delegate) {
+          return nativeListener.apply(this, arguments);
+        }
+        if (isNode && eventName === "uncaughtException") {
+          return nativeListener.apply(this, arguments);
+        }
+        let isEventListenerObject = false;
+        if (typeof delegate !== "function") {
+          if (!delegate.handleEvent) {
+            return nativeListener.apply(this, arguments);
+          }
+          isEventListenerObject = true;
+        }
+        if (validateHandler && !validateHandler(nativeListener, delegate, target, arguments)) {
+          return;
+        }
+        const passive = !!passiveEvents && passiveEvents.indexOf(eventName) !== -1;
+        const options = copyEventListenerOptions(buildEventListenerOptions(arguments[2], passive));
+        const signal = options?.signal;
+        if (signal?.aborted) {
+          return;
+        }
+        if (unpatchedEvents) {
+          for (let i = 0; i < unpatchedEvents.length; i++) {
+            if (eventName === unpatchedEvents[i]) {
+              if (passive) {
+                return nativeListener.call(target, eventName, delegate, options);
+              } else {
+                return nativeListener.apply(this, arguments);
+              }
+            }
+          }
+        }
+        const capture = !options ? false : typeof options === "boolean" ? true : options.capture;
+        const once = options && typeof options === "object" ? options.once : false;
+        const zone = Zone.current;
+        let symbolEventNames = zoneSymbolEventNames[eventName];
+        if (!symbolEventNames) {
+          prepareEventNames(eventName, eventNameToString);
+          symbolEventNames = zoneSymbolEventNames[eventName];
+        }
+        const symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+        let existingTasks = target[symbolEventName];
+        let isExisting = false;
+        if (existingTasks) {
+          isExisting = true;
+          if (checkDuplicate) {
+            for (let i = 0; i < existingTasks.length; i++) {
+              if (compare(existingTasks[i], delegate)) {
+                return;
+              }
+            }
+          }
+        } else {
+          existingTasks = target[symbolEventName] = [];
+        }
+        let source;
+        const constructorName = target.constructor["name"];
+        const targetSource = globalSources[constructorName];
+        if (targetSource) {
+          source = targetSource[eventName];
+        }
+        if (!source) {
+          source = constructorName + addSource + (eventNameToString ? eventNameToString(eventName) : eventName);
+        }
+        taskData.options = options;
+        if (once) {
+          taskData.options.once = false;
+        }
+        taskData.target = target;
+        taskData.capture = capture;
+        taskData.eventName = eventName;
+        taskData.isExisting = isExisting;
+        const data = useGlobalCallback ? OPTIMIZED_ZONE_EVENT_TASK_DATA : void 0;
+        if (data) {
+          data.taskData = taskData;
+        }
+        if (signal) {
+          taskData.options.signal = void 0;
+        }
+        const task = zone.scheduleEventTask(source, delegate, data, customScheduleFn, customCancelFn);
+        if (signal) {
+          taskData.options.signal = signal;
+          const onAbort = () => task.zone.cancelTask(task);
+          nativeListener.call(signal, "abort", onAbort, { once: true });
+          task.removeAbortListener = () => signal.removeEventListener("abort", onAbort);
+        }
+        taskData.target = null;
+        if (data) {
+          data.taskData = null;
+        }
+        if (once) {
+          taskData.options.once = true;
+        }
+        if (typeof task.options !== "boolean") {
+          task.options = options;
+        }
+        task.target = target;
+        task.capture = capture;
+        task.eventName = eventName;
+        if (isEventListenerObject) {
+          task.originalDelegate = delegate;
+        }
+        if (!prepend) {
+          existingTasks.push(task);
+        } else {
+          existingTasks.unshift(task);
+        }
+        if (returnTarget2) {
+          return target;
+        }
+      };
+    };
+    proto[ADD_EVENT_LISTENER] = makeAddListener(nativeAddEventListener, ADD_EVENT_LISTENER_SOURCE, customSchedule, customCancel, returnTarget);
+    if (nativePrependEventListener) {
+      proto[PREPEND_EVENT_LISTENER] = makeAddListener(nativePrependEventListener, PREPEND_EVENT_LISTENER_SOURCE, customSchedulePrepend, customCancel, returnTarget, true);
+    }
+    proto[REMOVE_EVENT_LISTENER] = function() {
+      const target = this || _global2;
+      let eventName = arguments[0];
+      if (patchOptions2 && patchOptions2.transferEventName) {
+        eventName = patchOptions2.transferEventName(eventName);
+      }
+      const options = arguments[2];
+      const capture = !options ? false : typeof options === "boolean" ? true : options.capture;
+      const delegate = arguments[1];
+      if (!delegate) {
+        return nativeRemoveEventListener.apply(this, arguments);
+      }
+      if (validateHandler && !validateHandler(nativeRemoveEventListener, delegate, target, arguments)) {
+        return;
+      }
+      const symbolEventNames = zoneSymbolEventNames[eventName];
+      let symbolEventName;
+      if (symbolEventNames) {
+        symbolEventName = symbolEventNames[capture ? TRUE_STR : FALSE_STR];
+      }
+      const existingTasks = symbolEventName && target[symbolEventName];
+      if (existingTasks) {
+        for (let i = 0; i < existingTasks.length; i++) {
+          const existingTask = existingTasks[i];
+          if (compare(existingTask, delegate)) {
+            existingTasks.splice(i, 1);
+            existingTask.isRemoved = true;
+            if (existingTasks.length === 0) {
+              existingTask.allRemoved = true;
+              target[symbolEventName] = null;
+              if (!capture && typeof eventName === "string") {
+                const onPropertySymbol = ZONE_SYMBOL_PREFIX + "ON_PROPERTY" + eventName;
+                target[onPropertySymbol] = null;
+              }
+            }
+            existingTask.zone.cancelTask(existingTask);
+            if (returnTarget) {
+              return target;
+            }
+            return;
+          }
+        }
+      }
+      return nativeRemoveEventListener.apply(this, arguments);
+    };
+    proto[LISTENERS_EVENT_LISTENER] = function() {
+      const target = this || _global2;
+      let eventName = arguments[0];
+      if (patchOptions2 && patchOptions2.transferEventName) {
+        eventName = patchOptions2.transferEventName(eventName);
+      }
+      const listeners = [];
+      const tasks = findEventTasks(target, eventNameToString ? eventNameToString(eventName) : eventName);
+      for (let i = 0; i < tasks.length; i++) {
+        const task = tasks[i];
+        let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+        listeners.push(delegate);
+      }
+      return listeners;
+    };
+    proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER] = function() {
+      const target = this || _global2;
+      let eventName = arguments[0];
+      if (!eventName) {
+        const keys = Object.keys(target);
+        for (let i = 0; i < keys.length; i++) {
+          const prop = keys[i];
+          const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+          let evtName = match && match[1];
+          if (evtName && evtName !== "removeListener") {
+            this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, evtName);
+          }
+        }
+        this[REMOVE_ALL_LISTENERS_EVENT_LISTENER].call(this, "removeListener");
+      } else {
+        if (patchOptions2 && patchOptions2.transferEventName) {
+          eventName = patchOptions2.transferEventName(eventName);
+        }
+        const symbolEventNames = zoneSymbolEventNames[eventName];
+        if (symbolEventNames) {
+          const symbolEventName = symbolEventNames[FALSE_STR];
+          const symbolCaptureEventName = symbolEventNames[TRUE_STR];
+          const tasks = target[symbolEventName];
+          const captureTasks = target[symbolCaptureEventName];
+          if (tasks) {
+            const removeTasks = tasks.slice();
+            for (let i = 0; i < removeTasks.length; i++) {
+              const task = removeTasks[i];
+              let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+              this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+            }
+          }
+          if (captureTasks) {
+            const removeTasks = captureTasks.slice();
+            for (let i = 0; i < removeTasks.length; i++) {
+              const task = removeTasks[i];
+              let delegate = task.originalDelegate ? task.originalDelegate : task.callback;
+              this[REMOVE_EVENT_LISTENER].call(this, eventName, delegate, task.options);
+            }
+          }
+        }
+      }
+      if (returnTarget) {
+        return this;
+      }
+    };
+    attachOriginToPatched(proto[ADD_EVENT_LISTENER], nativeAddEventListener);
+    attachOriginToPatched(proto[REMOVE_EVENT_LISTENER], nativeRemoveEventListener);
+    if (nativeRemoveAllListeners) {
+      attachOriginToPatched(proto[REMOVE_ALL_LISTENERS_EVENT_LISTENER], nativeRemoveAllListeners);
+    }
+    if (nativeListeners) {
+      attachOriginToPatched(proto[LISTENERS_EVENT_LISTENER], nativeListeners);
+    }
+    return true;
+  }
+  let results = [];
+  for (let i = 0; i < apis.length; i++) {
+    results[i] = patchEventTargetMethods(apis[i], patchOptions);
+  }
+  return results;
+}
+function findEventTasks(target, eventName) {
+  if (!eventName) {
+    const foundTasks = [];
+    for (let prop in target) {
+      const match = EVENT_NAME_SYMBOL_REGX.exec(prop);
+      let evtName = match && match[1];
+      if (evtName && (!eventName || evtName === eventName)) {
+        const tasks = target[prop];
+        if (tasks) {
+          for (let i = 0; i < tasks.length; i++) {
+            foundTasks.push(tasks[i]);
+          }
+        }
+      }
+    }
+    return foundTasks;
+  }
+  let symbolEventName = zoneSymbolEventNames[eventName];
+  if (!symbolEventName) {
+    prepareEventNames(eventName);
+    symbolEventName = zoneSymbolEventNames[eventName];
+  }
+  const captureFalseTasks = target[symbolEventName[FALSE_STR]];
+  const captureTrueTasks = target[symbolEventName[TRUE_STR]];
+  if (!captureFalseTasks) {
+    return captureTrueTasks ? captureTrueTasks.slice() : [];
+  } else {
+    return captureTrueTasks ? captureFalseTasks.concat(captureTrueTasks) : captureFalseTasks.slice();
+  }
+}
+function patchEventPrototype(global2, api) {
+  const Event = global2["Event"];
+  if (Event && Event.prototype) {
+    api.patchMethod(Event.prototype, "stopImmediatePropagation", (delegate) => function(self2, args) {
+      self2[IMMEDIATE_PROPAGATION_SYMBOL] = true;
+      delegate && delegate.apply(self2, args);
+    });
+  }
+}
+function patchQueueMicrotask(global2, api) {
+  api.patchMethod(global2, "queueMicrotask", (delegate) => {
+    return function(self2, args) {
+      Zone.current.scheduleMicroTask("queueMicrotask", args[0]);
+    };
+  });
+}
+var taskSymbol = zoneSymbol("zoneTask");
+function patchTimer(window2, setName, cancelName, nameSuffix) {
+  let setNative = null;
+  let clearNative = null;
+  setName += nameSuffix;
+  cancelName += nameSuffix;
+  const tasksByHandleId = {};
+  function scheduleTask(task) {
+    const data = task.data;
+    data.args[0] = function() {
+      return task.invoke.apply(this, arguments);
+    };
+    const handleOrId = setNative.apply(window2, data.args);
+    if (isNumber(handleOrId)) {
+      data.handleId = handleOrId;
+    } else {
+      data.handle = handleOrId;
+      data.isRefreshable = isFunction(handleOrId.refresh);
+    }
+    return task;
+  }
+  function clearTask(task) {
+    const { handle, handleId } = task.data;
+    return clearNative.call(window2, handle ?? handleId);
+  }
+  setNative = patchMethod(window2, setName, (delegate) => function(self2, args) {
+    if (isFunction(args[0])) {
+      const options = {
+        isRefreshable: false,
+        isPeriodic: nameSuffix === "Interval",
+        delay: nameSuffix === "Timeout" || nameSuffix === "Interval" ? args[1] || 0 : void 0,
+        args
+      };
+      const callback = args[0];
+      args[0] = function timer() {
+        try {
+          return callback.apply(this, arguments);
+        } finally {
+          const { handle: handle2, handleId: handleId2, isPeriodic: isPeriodic2, isRefreshable: isRefreshable2 } = options;
+          if (!isPeriodic2 && !isRefreshable2) {
+            if (handleId2) {
+              delete tasksByHandleId[handleId2];
+            } else if (handle2) {
+              handle2[taskSymbol] = null;
+            }
+          }
+        }
+      };
+      const task = scheduleMacroTaskWithCurrentZone(setName, args[0], options, scheduleTask, clearTask);
+      if (!task) {
+        return task;
+      }
+      const { handleId, handle, isRefreshable, isPeriodic } = task.data;
+      if (handleId) {
+        tasksByHandleId[handleId] = task;
+      } else if (handle) {
+        handle[taskSymbol] = task;
+        if (isRefreshable && !isPeriodic) {
+          const originalRefresh = handle.refresh;
+          handle.refresh = function() {
+            const { zone, state } = task;
+            if (state === "notScheduled") {
+              task._state = "scheduled";
+              zone._updateTaskCount(task, 1);
+            } else if (state === "running") {
+              task._state = "scheduling";
+            }
+            return originalRefresh.call(this);
+          };
+        }
+      }
+      return handle ?? handleId ?? task;
+    } else {
+      return delegate.apply(window2, args);
+    }
+  });
+  clearNative = patchMethod(window2, cancelName, (delegate) => function(self2, args) {
+    const id = args[0];
+    let task;
+    if (isNumber(id)) {
+      task = tasksByHandleId[id];
+      delete tasksByHandleId[id];
+    } else {
+      task = id?.[taskSymbol];
+      if (task) {
+        id[taskSymbol] = null;
+      } else {
+        task = id;
+      }
+    }
+    if (task?.type) {
+      if (task.cancelFn) {
+        task.zone.cancelTask(task);
+      }
+    } else {
+      delegate.apply(window2, args);
+    }
+  });
+}
+function patchCustomElements(_global2, api) {
+  const { isBrowser: isBrowser2, isMix: isMix2 } = api.getGlobalObjects();
+  if (!isBrowser2 && !isMix2 || !_global2["customElements"] || !("customElements" in _global2)) {
+    return;
+  }
+  const callbacks = [
+    "connectedCallback",
+    "disconnectedCallback",
+    "adoptedCallback",
+    "attributeChangedCallback",
+    "formAssociatedCallback",
+    "formDisabledCallback",
+    "formResetCallback",
+    "formStateRestoreCallback"
+  ];
+  api.patchCallbacks(api, _global2.customElements, "customElements", "define", callbacks);
+}
+function eventTargetPatch(_global2, api) {
+  if (Zone[api.symbol("patchEventTarget")]) {
+    return;
+  }
+  const { eventNames, zoneSymbolEventNames: zoneSymbolEventNames2, TRUE_STR: TRUE_STR2, FALSE_STR: FALSE_STR2, ZONE_SYMBOL_PREFIX: ZONE_SYMBOL_PREFIX2 } = api.getGlobalObjects();
+  for (let i = 0; i < eventNames.length; i++) {
+    const eventName = eventNames[i];
+    const falseEventName = eventName + FALSE_STR2;
+    const trueEventName = eventName + TRUE_STR2;
+    const symbol = ZONE_SYMBOL_PREFIX2 + falseEventName;
+    const symbolCapture = ZONE_SYMBOL_PREFIX2 + trueEventName;
+    zoneSymbolEventNames2[eventName] = {};
+    zoneSymbolEventNames2[eventName][FALSE_STR2] = symbol;
+    zoneSymbolEventNames2[eventName][TRUE_STR2] = symbolCapture;
+  }
+  const EVENT_TARGET = _global2["EventTarget"];
+  if (!EVENT_TARGET || !EVENT_TARGET.prototype) {
+    return;
+  }
+  api.patchEventTarget(_global2, api, [EVENT_TARGET && EVENT_TARGET.prototype]);
+  return true;
+}
+function patchEvent(global2, api) {
+  api.patchEventPrototype(global2, api);
+}
+function filterProperties(target, onProperties, ignoreProperties) {
+  if (!ignoreProperties || ignoreProperties.length === 0) {
+    return onProperties;
+  }
+  const tip = ignoreProperties.filter((ip) => ip.target === target);
+  if (tip.length === 0) {
+    return onProperties;
+  }
+  const targetIgnoreProperties = tip[0].ignoreProperties;
+  return onProperties.filter((op) => targetIgnoreProperties.indexOf(op) === -1);
+}
+function patchFilteredProperties(target, onProperties, ignoreProperties, prototype) {
+  if (!target) {
+    return;
+  }
+  const filteredProperties = filterProperties(target, onProperties, ignoreProperties);
+  patchOnProperties(target, filteredProperties, prototype);
+}
+function getOnEventNames(target) {
+  return Object.getOwnPropertyNames(target).filter((name) => name.startsWith("on") && name.length > 2).map((name) => name.substring(2));
+}
+function propertyDescriptorPatch(api, _global2) {
+  if (isNode && !isMix) {
+    return;
+  }
+  if (Zone[api.symbol("patchEvents")]) {
+    return;
+  }
+  const ignoreProperties = _global2["__Zone_ignore_on_properties"];
+  let patchTargets = [];
+  if (isBrowser) {
+    const internalWindow2 = window;
+    patchTargets = patchTargets.concat([
+      "Document",
+      "SVGElement",
+      "Element",
+      "HTMLElement",
+      "HTMLBodyElement",
+      "HTMLMediaElement",
+      "HTMLFrameSetElement",
+      "HTMLFrameElement",
+      "HTMLIFrameElement",
+      "HTMLMarqueeElement",
+      "Worker"
+    ]);
+    const ignoreErrorProperties = [];
+    patchFilteredProperties(internalWindow2, getOnEventNames(internalWindow2), ignoreProperties ? ignoreProperties.concat(ignoreErrorProperties) : ignoreProperties, ObjectGetPrototypeOf(internalWindow2));
+  }
+  patchTargets = patchTargets.concat([
+    "XMLHttpRequest",
+    "XMLHttpRequestEventTarget",
+    "IDBIndex",
+    "IDBRequest",
+    "IDBOpenDBRequest",
+    "IDBDatabase",
+    "IDBTransaction",
+    "IDBCursor",
+    "WebSocket"
+  ]);
+  for (let i = 0; i < patchTargets.length; i++) {
+    const target = _global2[patchTargets[i]];
+    target?.prototype && patchFilteredProperties(target.prototype, getOnEventNames(target.prototype), ignoreProperties);
+  }
+}
+function patchBrowser(Zone2) {
+  Zone2.__load_patch("legacy", (global2) => {
+    const legacyPatch = global2[Zone2.__symbol__("legacyPatch")];
+    if (legacyPatch) {
+      legacyPatch();
+    }
+  });
+  Zone2.__load_patch("timers", (global2) => {
+    const set = "set";
+    const clear = "clear";
+    patchTimer(global2, set, clear, "Timeout");
+    patchTimer(global2, set, clear, "Interval");
+    patchTimer(global2, set, clear, "Immediate");
+  });
+  Zone2.__load_patch("requestAnimationFrame", (global2) => {
+    patchTimer(global2, "request", "cancel", "AnimationFrame");
+    patchTimer(global2, "mozRequest", "mozCancel", "AnimationFrame");
+    patchTimer(global2, "webkitRequest", "webkitCancel", "AnimationFrame");
+  });
+  Zone2.__load_patch("blocking", (global2, Zone3) => {
+    const blockingMethods = ["alert", "prompt", "confirm"];
+    for (let i = 0; i < blockingMethods.length; i++) {
+      const name = blockingMethods[i];
+      patchMethod(global2, name, (delegate, symbol, name2) => {
+        return function(s, args) {
+          return Zone3.current.run(delegate, global2, args, name2);
+        };
+      });
+    }
+  });
+  Zone2.__load_patch("EventTarget", (global2, Zone3, api) => {
+    patchEvent(global2, api);
+    eventTargetPatch(global2, api);
+    const XMLHttpRequestEventTarget = global2["XMLHttpRequestEventTarget"];
+    if (XMLHttpRequestEventTarget && XMLHttpRequestEventTarget.prototype) {
+      api.patchEventTarget(global2, api, [XMLHttpRequestEventTarget.prototype]);
+    }
+  });
+  Zone2.__load_patch("MutationObserver", (global2, Zone3, api) => {
+    patchClass("MutationObserver");
+    patchClass("WebKitMutationObserver");
+  });
+  Zone2.__load_patch("IntersectionObserver", (global2, Zone3, api) => {
+    patchClass("IntersectionObserver");
+  });
+  Zone2.__load_patch("FileReader", (global2, Zone3, api) => {
+    patchClass("FileReader");
+  });
+  Zone2.__load_patch("on_property", (global2, Zone3, api) => {
+    propertyDescriptorPatch(api, global2);
+  });
+  Zone2.__load_patch("customElements", (global2, Zone3, api) => {
+    patchCustomElements(global2, api);
+  });
+  Zone2.__load_patch("XHR", (global2, Zone3) => {
+    patchXHR(global2);
+    const XHR_TASK = zoneSymbol("xhrTask");
+    const XHR_SYNC = zoneSymbol("xhrSync");
+    const XHR_LISTENER = zoneSymbol("xhrListener");
+    const XHR_SCHEDULED = zoneSymbol("xhrScheduled");
+    const XHR_URL = zoneSymbol("xhrURL");
+    const XHR_ERROR_BEFORE_SCHEDULED = zoneSymbol("xhrErrorBeforeScheduled");
+    function patchXHR(window2) {
+      const XMLHttpRequest = window2["XMLHttpRequest"];
+      if (!XMLHttpRequest) {
+        return;
+      }
+      const XMLHttpRequestPrototype = XMLHttpRequest.prototype;
+      function findPendingTask(target) {
+        return target[XHR_TASK];
+      }
+      let oriAddListener = XMLHttpRequestPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+      let oriRemoveListener = XMLHttpRequestPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+      if (!oriAddListener) {
+        const XMLHttpRequestEventTarget = window2["XMLHttpRequestEventTarget"];
+        if (XMLHttpRequestEventTarget) {
+          const XMLHttpRequestEventTargetPrototype = XMLHttpRequestEventTarget.prototype;
+          oriAddListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+          oriRemoveListener = XMLHttpRequestEventTargetPrototype[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+        }
+      }
+      const READY_STATE_CHANGE = "readystatechange";
+      const SCHEDULED = "scheduled";
+      function scheduleTask(task) {
+        const data = task.data;
+        const target = data.target;
+        target[XHR_SCHEDULED] = false;
+        target[XHR_ERROR_BEFORE_SCHEDULED] = false;
+        const listener = target[XHR_LISTENER];
+        if (!oriAddListener) {
+          oriAddListener = target[ZONE_SYMBOL_ADD_EVENT_LISTENER];
+          oriRemoveListener = target[ZONE_SYMBOL_REMOVE_EVENT_LISTENER];
+        }
+        if (listener) {
+          oriRemoveListener.call(target, READY_STATE_CHANGE, listener);
+        }
+        const newListener = target[XHR_LISTENER] = () => {
+          if (target.readyState === target.DONE) {
+            if (!data.aborted && target[XHR_SCHEDULED] && task.state === SCHEDULED) {
+              const loadTasks = target[Zone3.__symbol__("loadfalse")];
+              if (target.status !== 0 && loadTasks && loadTasks.length > 0) {
+                const oriInvoke = task.invoke;
+                task.invoke = function() {
+                  const loadTasks2 = target[Zone3.__symbol__("loadfalse")];
+                  for (let i = 0; i < loadTasks2.length; i++) {
+                    if (loadTasks2[i] === task) {
+                      loadTasks2.splice(i, 1);
+                    }
+                  }
+                  if (!data.aborted && task.state === SCHEDULED) {
+                    oriInvoke.call(task);
+                  }
+                };
+                loadTasks.push(task);
+              } else {
+                task.invoke();
+              }
+            } else if (!data.aborted && target[XHR_SCHEDULED] === false) {
+              target[XHR_ERROR_BEFORE_SCHEDULED] = true;
+            }
+          }
+        };
+        oriAddListener.call(target, READY_STATE_CHANGE, newListener);
+        const storedTask = target[XHR_TASK];
+        if (!storedTask) {
+          target[XHR_TASK] = task;
+        }
+        sendNative.apply(target, data.args);
+        target[XHR_SCHEDULED] = true;
+        return task;
+      }
+      function placeholderCallback() {
+      }
+      function clearTask(task) {
+        const data = task.data;
+        data.aborted = true;
+        return abortNative.apply(data.target, data.args);
+      }
+      const openNative = patchMethod(XMLHttpRequestPrototype, "open", () => function(self2, args) {
+        self2[XHR_SYNC] = args[2] == false;
+        self2[XHR_URL] = args[1];
+        return openNative.apply(self2, args);
+      });
+      const XMLHTTPREQUEST_SOURCE = "XMLHttpRequest.send";
+      const fetchTaskAborting = zoneSymbol("fetchTaskAborting");
+      const fetchTaskScheduling = zoneSymbol("fetchTaskScheduling");
+      const sendNative = patchMethod(XMLHttpRequestPrototype, "send", () => function(self2, args) {
+        if (Zone3.current[fetchTaskScheduling] === true) {
+          return sendNative.apply(self2, args);
+        }
+        if (self2[XHR_SYNC]) {
+          return sendNative.apply(self2, args);
+        } else {
+          const options = {
+            target: self2,
+            url: self2[XHR_URL],
+            isPeriodic: false,
+            args,
+            aborted: false
+          };
+          const task = scheduleMacroTaskWithCurrentZone(XMLHTTPREQUEST_SOURCE, placeholderCallback, options, scheduleTask, clearTask);
+          if (self2 && self2[XHR_ERROR_BEFORE_SCHEDULED] === true && !options.aborted && task.state === SCHEDULED) {
+            task.invoke();
+          }
+        }
+      });
+      const abortNative = patchMethod(XMLHttpRequestPrototype, "abort", () => function(self2, args) {
+        const task = findPendingTask(self2);
+        if (task && typeof task.type == "string") {
+          if (task.cancelFn == null || task.data && task.data.aborted) {
+            return;
+          }
+          task.zone.cancelTask(task);
+        } else if (Zone3.current[fetchTaskAborting] === true) {
+          return abortNative.apply(self2, args);
+        }
+      });
+    }
+  });
+  Zone2.__load_patch("geolocation", (global2) => {
+    if (global2["navigator"] && global2["navigator"].geolocation) {
+      patchPrototype(global2["navigator"].geolocation, ["getCurrentPosition", "watchPosition"]);
+    }
+  });
+  Zone2.__load_patch("PromiseRejectionEvent", (global2, Zone3) => {
+    function findPromiseRejectionHandler(evtName) {
+      return function(e) {
+        const eventTasks = findEventTasks(global2, evtName);
+        eventTasks.forEach((eventTask) => {
+          const PromiseRejectionEvent = global2["PromiseRejectionEvent"];
+          if (PromiseRejectionEvent) {
+            const evt = new PromiseRejectionEvent(evtName, {
+              promise: e.promise,
+              reason: e.rejection
+            });
+            eventTask.invoke(evt);
+          }
+        });
+      };
+    }
+    if (global2["PromiseRejectionEvent"]) {
+      Zone3[zoneSymbol("unhandledPromiseRejectionHandler")] = findPromiseRejectionHandler("unhandledrejection");
+      Zone3[zoneSymbol("rejectionHandledHandler")] = findPromiseRejectionHandler("rejectionhandled");
+    }
+  });
+  Zone2.__load_patch("queueMicrotask", (global2, Zone3, api) => {
+    patchQueueMicrotask(global2, api);
+  });
+}
+function patchPromise(Zone2) {
+  Zone2.__load_patch("ZoneAwarePromise", (global2, Zone3, api) => {
+    const ObjectGetOwnPropertyDescriptor2 = Object.getOwnPropertyDescriptor;
+    const ObjectDefineProperty2 = Object.defineProperty;
+    function readableObjectToString(obj) {
+      if (obj && obj.toString === Object.prototype.toString) {
+        const className = obj.constructor && obj.constructor.name;
+        return (className ? className : "") + ": " + JSON.stringify(obj);
+      }
+      return obj ? obj.toString() : Object.prototype.toString.call(obj);
+    }
+    const __symbol__2 = api.symbol;
+    const _uncaughtPromiseErrors = [];
+    const isDisableWrappingUncaughtPromiseRejection = global2[__symbol__2("DISABLE_WRAPPING_UNCAUGHT_PROMISE_REJECTION")] !== false;
+    const symbolPromise = __symbol__2("Promise");
+    const symbolThen = __symbol__2("then");
+    const creationTrace = "__creationTrace__";
+    api.onUnhandledError = (e) => {
+      if (api.showUncaughtError()) {
+        const rejection = e && e.rejection;
+        if (rejection) {
+          console.error("Unhandled Promise rejection:", rejection instanceof Error ? rejection.message : rejection, "; Zone:", e.zone.name, "; Task:", e.task && e.task.source, "; Value:", rejection, rejection instanceof Error ? rejection.stack : void 0);
+        } else {
+          console.error(e);
+        }
+      }
+    };
+    api.microtaskDrainDone = () => {
+      while (_uncaughtPromiseErrors.length) {
+        const uncaughtPromiseError = _uncaughtPromiseErrors.shift();
+        try {
+          uncaughtPromiseError.zone.runGuarded(() => {
+            if (uncaughtPromiseError.throwOriginal) {
+              throw uncaughtPromiseError.rejection;
+            }
+            throw uncaughtPromiseError;
+          });
+        } catch (error) {
+          handleUnhandledRejection(error);
+        }
+      }
+    };
+    const UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL = __symbol__2("unhandledPromiseRejectionHandler");
+    function handleUnhandledRejection(e) {
+      api.onUnhandledError(e);
+      try {
+        const handler = Zone3[UNHANDLED_PROMISE_REJECTION_HANDLER_SYMBOL];
+        if (typeof handler === "function") {
+          handler.call(this, e);
+        }
+      } catch (err) {
+      }
+    }
+    function isThenable(value) {
+      return value && typeof value.then === "function";
+    }
+    function forwardResolution(value) {
+      return value;
+    }
+    function forwardRejection(rejection) {
+      return ZoneAwarePromise.reject(rejection);
+    }
+    const symbolState = __symbol__2("state");
+    const symbolValue = __symbol__2("value");
+    const symbolFinally = __symbol__2("finally");
+    const symbolParentPromiseValue = __symbol__2("parentPromiseValue");
+    const symbolParentPromiseState = __symbol__2("parentPromiseState");
+    const source = "Promise.then";
+    const UNRESOLVED = null;
+    const RESOLVED = true;
+    const REJECTED = false;
+    const REJECTED_NO_CATCH = 0;
+    function makeResolver(promise, state) {
+      return (v) => {
+        try {
+          resolvePromise(promise, state, v);
+        } catch (err) {
+          resolvePromise(promise, false, err);
+        }
+      };
+    }
+    const once = function() {
+      let wasCalled = false;
+      return function wrapper(wrappedFunction) {
+        return function() {
+          if (wasCalled) {
+            return;
+          }
+          wasCalled = true;
+          wrappedFunction.apply(null, arguments);
+        };
+      };
+    };
+    const TYPE_ERROR = "Promise resolved with itself";
+    const CURRENT_TASK_TRACE_SYMBOL = __symbol__2("currentTaskTrace");
+    function resolvePromise(promise, state, value) {
+      const onceWrapper = once();
+      if (promise === value) {
+        throw new TypeError(TYPE_ERROR);
+      }
+      if (promise[symbolState] === UNRESOLVED) {
+        let then = null;
+        try {
+          if (typeof value === "object" || typeof value === "function") {
+            then = value && value.then;
+          }
+        } catch (err) {
+          onceWrapper(() => {
+            resolvePromise(promise, false, err);
+          })();
+          return promise;
+        }
+        if (state !== REJECTED && value instanceof ZoneAwarePromise && value.hasOwnProperty(symbolState) && value.hasOwnProperty(symbolValue) && value[symbolState] !== UNRESOLVED) {
+          clearRejectedNoCatch(value);
+          resolvePromise(promise, value[symbolState], value[symbolValue]);
+        } else if (state !== REJECTED && typeof then === "function") {
+          try {
+            then.call(value, onceWrapper(makeResolver(promise, state)), onceWrapper(makeResolver(promise, false)));
+          } catch (err) {
+            onceWrapper(() => {
+              resolvePromise(promise, false, err);
+            })();
+          }
+        } else {
+          promise[symbolState] = state;
+          const queue = promise[symbolValue];
+          promise[symbolValue] = value;
+          if (promise[symbolFinally] === symbolFinally) {
+            if (state === RESOLVED) {
+              promise[symbolState] = promise[symbolParentPromiseState];
+              promise[symbolValue] = promise[symbolParentPromiseValue];
+            }
+          }
+          if (state === REJECTED && value instanceof Error) {
+            const trace = Zone3.currentTask && Zone3.currentTask.data && Zone3.currentTask.data[creationTrace];
+            if (trace) {
+              ObjectDefineProperty2(value, CURRENT_TASK_TRACE_SYMBOL, {
+                configurable: true,
+                enumerable: false,
+                writable: true,
+                value: trace
+              });
+            }
+          }
+          for (let i = 0; i < queue.length; ) {
+            scheduleResolveOrReject(promise, queue[i++], queue[i++], queue[i++], queue[i++]);
+          }
+          if (queue.length == 0 && state == REJECTED) {
+            promise[symbolState] = REJECTED_NO_CATCH;
+            let uncaughtPromiseError = value;
+            try {
+              throw new Error("Uncaught (in promise): " + readableObjectToString(value) + (value && value.stack ? "\n" + value.stack : ""));
+            } catch (err) {
+              uncaughtPromiseError = err;
+            }
+            if (isDisableWrappingUncaughtPromiseRejection) {
+              uncaughtPromiseError.throwOriginal = true;
+            }
+            uncaughtPromiseError.rejection = value;
+            uncaughtPromiseError.promise = promise;
+            uncaughtPromiseError.zone = Zone3.current;
+            uncaughtPromiseError.task = Zone3.currentTask;
+            _uncaughtPromiseErrors.push(uncaughtPromiseError);
+            api.scheduleMicroTask();
+          }
+        }
+      }
+      return promise;
+    }
+    const REJECTION_HANDLED_HANDLER = __symbol__2("rejectionHandledHandler");
+    function clearRejectedNoCatch(promise) {
+      if (promise[symbolState] === REJECTED_NO_CATCH) {
+        try {
+          const handler = Zone3[REJECTION_HANDLED_HANDLER];
+          if (handler && typeof handler === "function") {
+            handler.call(this, { rejection: promise[symbolValue], promise });
+          }
+        } catch (err) {
+        }
+        promise[symbolState] = REJECTED;
+        for (let i = 0; i < _uncaughtPromiseErrors.length; i++) {
+          if (promise === _uncaughtPromiseErrors[i].promise) {
+            _uncaughtPromiseErrors.splice(i, 1);
+          }
+        }
+      }
+    }
+    function scheduleResolveOrReject(promise, zone, chainPromise, onFulfilled, onRejected) {
+      clearRejectedNoCatch(promise);
+      const promiseState = promise[symbolState];
+      const delegate = promiseState ? typeof onFulfilled === "function" ? onFulfilled : forwardResolution : typeof onRejected === "function" ? onRejected : forwardRejection;
+      zone.scheduleMicroTask(source, () => {
+        try {
+          const parentPromiseValue = promise[symbolValue];
+          const isFinallyPromise = !!chainPromise && symbolFinally === chainPromise[symbolFinally];
+          if (isFinallyPromise) {
+            chainPromise[symbolParentPromiseValue] = parentPromiseValue;
+            chainPromise[symbolParentPromiseState] = promiseState;
+          }
+          const value = zone.run(delegate, void 0, isFinallyPromise && delegate !== forwardRejection && delegate !== forwardResolution ? [] : [parentPromiseValue]);
+          resolvePromise(chainPromise, true, value);
+        } catch (error) {
+          resolvePromise(chainPromise, false, error);
+        }
+      }, chainPromise);
+    }
+    const ZONE_AWARE_PROMISE_TO_STRING = "function ZoneAwarePromise() { [native code] }";
+    const noop = function() {
+    };
+    const AggregateError = global2.AggregateError;
+    class ZoneAwarePromise {
+      static toString() {
+        return ZONE_AWARE_PROMISE_TO_STRING;
+      }
+      static resolve(value) {
+        if (value instanceof ZoneAwarePromise) {
+          return value;
+        }
+        return resolvePromise(new this(null), RESOLVED, value);
+      }
+      static reject(error) {
+        return resolvePromise(new this(null), REJECTED, error);
+      }
+      static withResolvers() {
+        const result = {};
+        result.promise = new ZoneAwarePromise((res, rej) => {
+          result.resolve = res;
+          result.reject = rej;
+        });
+        return result;
+      }
+      static any(values) {
+        if (!values || typeof values[Symbol.iterator] !== "function") {
+          return Promise.reject(new AggregateError([], "All promises were rejected"));
+        }
+        const promises = [];
+        let count = 0;
+        try {
+          for (let v of values) {
+            count++;
+            promises.push(ZoneAwarePromise.resolve(v));
+          }
+        } catch (err) {
+          return Promise.reject(new AggregateError([], "All promises were rejected"));
+        }
+        if (count === 0) {
+          return Promise.reject(new AggregateError([], "All promises were rejected"));
+        }
+        let finished = false;
+        const errors = [];
+        return new ZoneAwarePromise((resolve, reject) => {
+          for (let i = 0; i < promises.length; i++) {
+            promises[i].then((v) => {
+              if (finished) {
+                return;
+              }
+              finished = true;
+              resolve(v);
+            }, (err) => {
+              errors.push(err);
+              count--;
+              if (count === 0) {
+                finished = true;
+                reject(new AggregateError(errors, "All promises were rejected"));
+              }
+            });
+          }
+        });
+      }
+      static race(values) {
+        let resolve;
+        let reject;
+        let promise = new this((res, rej) => {
+          resolve = res;
+          reject = rej;
+        });
+        function onResolve(value) {
+          resolve(value);
+        }
+        function onReject(error) {
+          reject(error);
+        }
+        for (let value of values) {
+          if (!isThenable(value)) {
+            value = this.resolve(value);
+          }
+          value.then(onResolve, onReject);
+        }
+        return promise;
+      }
+      static all(values) {
+        return ZoneAwarePromise.allWithCallback(values);
+      }
+      static allSettled(values) {
+        const P = this && this.prototype instanceof ZoneAwarePromise ? this : ZoneAwarePromise;
+        return P.allWithCallback(values, {
+          thenCallback: (value) => ({ status: "fulfilled", value }),
+          errorCallback: (err) => ({ status: "rejected", reason: err })
+        });
+      }
+      static allWithCallback(values, callback) {
+        let resolve;
+        let reject;
+        let promise = new this((res, rej) => {
+          resolve = res;
+          reject = rej;
+        });
+        let unresolvedCount = 2;
+        let valueIndex = 0;
+        const resolvedValues = [];
+        for (let value of values) {
+          if (!isThenable(value)) {
+            value = this.resolve(value);
+          }
+          const curValueIndex = valueIndex;
+          try {
+            value.then((value2) => {
+              resolvedValues[curValueIndex] = callback ? callback.thenCallback(value2) : value2;
+              unresolvedCount--;
+              if (unresolvedCount === 0) {
+                resolve(resolvedValues);
+              }
+            }, (err) => {
+              if (!callback) {
+                reject(err);
+              } else {
+                resolvedValues[curValueIndex] = callback.errorCallback(err);
+                unresolvedCount--;
+                if (unresolvedCount === 0) {
+                  resolve(resolvedValues);
+                }
+              }
+            });
+          } catch (thenErr) {
+            reject(thenErr);
+          }
+          unresolvedCount++;
+          valueIndex++;
+        }
+        unresolvedCount -= 2;
+        if (unresolvedCount === 0) {
+          resolve(resolvedValues);
+        }
+        return promise;
+      }
+      constructor(executor) {
+        const promise = this;
+        if (!(promise instanceof ZoneAwarePromise)) {
+          throw new Error("Must be an instanceof Promise.");
+        }
+        promise[symbolState] = UNRESOLVED;
+        promise[symbolValue] = [];
+        try {
+          const onceWrapper = once();
+          executor && executor(onceWrapper(makeResolver(promise, RESOLVED)), onceWrapper(makeResolver(promise, REJECTED)));
+        } catch (error) {
+          resolvePromise(promise, false, error);
+        }
+      }
+      get [Symbol.toStringTag]() {
+        return "Promise";
+      }
+      get [Symbol.species]() {
+        return ZoneAwarePromise;
+      }
+      then(onFulfilled, onRejected) {
+        let C = this.constructor?.[Symbol.species];
+        if (!C || typeof C !== "function") {
+          C = this.constructor || ZoneAwarePromise;
+        }
+        const chainPromise = new C(noop);
+        const zone = Zone3.current;
+        if (this[symbolState] == UNRESOLVED) {
+          this[symbolValue].push(zone, chainPromise, onFulfilled, onRejected);
+        } else {
+          scheduleResolveOrReject(this, zone, chainPromise, onFulfilled, onRejected);
+        }
+        return chainPromise;
+      }
+      catch(onRejected) {
+        return this.then(null, onRejected);
+      }
+      finally(onFinally) {
+        let C = this.constructor?.[Symbol.species];
+        if (!C || typeof C !== "function") {
+          C = ZoneAwarePromise;
+        }
+        const chainPromise = new C(noop);
+        chainPromise[symbolFinally] = symbolFinally;
+        const zone = Zone3.current;
+        if (this[symbolState] == UNRESOLVED) {
+          this[symbolValue].push(zone, chainPromise, onFinally, onFinally);
+        } else {
+          scheduleResolveOrReject(this, zone, chainPromise, onFinally, onFinally);
+        }
+        return chainPromise;
+      }
+    }
+    ZoneAwarePromise["resolve"] = ZoneAwarePromise.resolve;
+    ZoneAwarePromise["reject"] = ZoneAwarePromise.reject;
+    ZoneAwarePromise["race"] = ZoneAwarePromise.race;
+    ZoneAwarePromise["all"] = ZoneAwarePromise.all;
+    const NativePromise = global2[symbolPromise] = global2["Promise"];
+    global2["Promise"] = ZoneAwarePromise;
+    const symbolThenPatched = __symbol__2("thenPatched");
+    function patchThen(Ctor) {
+      const proto = Ctor.prototype;
+      const prop = ObjectGetOwnPropertyDescriptor2(proto, "then");
+      if (prop && (prop.writable === false || !prop.configurable)) {
+        return;
+      }
+      const originalThen = proto.then;
+      proto[symbolThen] = originalThen;
+      Ctor.prototype.then = function(onResolve, onReject) {
+        const wrapped = new ZoneAwarePromise((resolve, reject) => {
+          originalThen.call(this, resolve, reject);
+        });
+        return wrapped.then(onResolve, onReject);
+      };
+      Ctor[symbolThenPatched] = true;
+    }
+    api.patchThen = patchThen;
+    function zoneify(fn) {
+      return function(self2, args) {
+        let resultPromise = fn.apply(self2, args);
+        if (resultPromise instanceof ZoneAwarePromise) {
+          return resultPromise;
+        }
+        let ctor = resultPromise.constructor;
+        if (!ctor[symbolThenPatched]) {
+          patchThen(ctor);
+        }
+        return resultPromise;
+      };
+    }
+    if (NativePromise) {
+      patchThen(NativePromise);
+      patchMethod(global2, "fetch", (delegate) => zoneify(delegate));
+    }
+    Promise[Zone3.__symbol__("uncaughtPromiseErrors")] = _uncaughtPromiseErrors;
+    return ZoneAwarePromise;
+  });
+}
+function patchToString(Zone2) {
+  Zone2.__load_patch("toString", (global2) => {
+    const originalFunctionToString = Function.prototype.toString;
+    const ORIGINAL_DELEGATE_SYMBOL = zoneSymbol("OriginalDelegate");
+    const PROMISE_SYMBOL = zoneSymbol("Promise");
+    const ERROR_SYMBOL = zoneSymbol("Error");
+    const newFunctionToString = function toString() {
+      if (typeof this === "function") {
+        const originalDelegate = this[ORIGINAL_DELEGATE_SYMBOL];
+        if (originalDelegate) {
+          if (typeof originalDelegate === "function") {
+            return originalFunctionToString.call(originalDelegate);
+          } else {
+            return Object.prototype.toString.call(originalDelegate);
+          }
+        }
+        if (this === Promise) {
+          const nativePromise = global2[PROMISE_SYMBOL];
+          if (nativePromise) {
+            return originalFunctionToString.call(nativePromise);
+          }
+        }
+        if (this === Error) {
+          const nativeError = global2[ERROR_SYMBOL];
+          if (nativeError) {
+            return originalFunctionToString.call(nativeError);
+          }
+        }
+      }
+      return originalFunctionToString.call(this);
+    };
+    newFunctionToString[ORIGINAL_DELEGATE_SYMBOL] = originalFunctionToString;
+    Function.prototype.toString = newFunctionToString;
+    const originalObjectToString = Object.prototype.toString;
+    const PROMISE_OBJECT_TO_STRING = "[object Promise]";
+    Object.prototype.toString = function() {
+      if (typeof Promise === "function" && this instanceof Promise) {
+        return PROMISE_OBJECT_TO_STRING;
+      }
+      return originalObjectToString.call(this);
+    };
+  });
+}
+function patchCallbacks(api, target, targetName, method, callbacks) {
+  const symbol = Zone.__symbol__(method);
+  if (target[symbol]) {
+    return;
+  }
+  const nativeDelegate = target[symbol] = target[method];
+  target[method] = function(name, opts, options) {
+    if (opts && opts.prototype) {
+      callbacks.forEach(function(callback) {
+        const source = `${targetName}.${method}::` + callback;
+        const prototype = opts.prototype;
+        try {
+          if (prototype.hasOwnProperty(callback)) {
+            const descriptor = api.ObjectGetOwnPropertyDescriptor(prototype, callback);
+            if (descriptor && descriptor.value) {
+              descriptor.value = api.wrapWithCurrentZone(descriptor.value, source);
+              api._redefineProperty(opts.prototype, callback, descriptor);
+            } else if (prototype[callback]) {
+              prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+            }
+          } else if (prototype[callback]) {
+            prototype[callback] = api.wrapWithCurrentZone(prototype[callback], source);
+          }
+        } catch {
+        }
+      });
+    }
+    return nativeDelegate.call(target, name, opts, options);
+  };
+  api.attachOriginToPatched(target[method], nativeDelegate);
+}
+function patchUtil(Zone2) {
+  Zone2.__load_patch("util", (global2, Zone3, api) => {
+    const eventNames = getOnEventNames(global2);
+    api.patchOnProperties = patchOnProperties;
+    api.patchMethod = patchMethod;
+    api.bindArguments = bindArguments;
+    api.patchMacroTask = patchMacroTask;
+    const SYMBOL_BLACK_LISTED_EVENTS = Zone3.__symbol__("BLACK_LISTED_EVENTS");
+    const SYMBOL_UNPATCHED_EVENTS = Zone3.__symbol__("UNPATCHED_EVENTS");
+    if (global2[SYMBOL_UNPATCHED_EVENTS]) {
+      global2[SYMBOL_BLACK_LISTED_EVENTS] = global2[SYMBOL_UNPATCHED_EVENTS];
+    }
+    if (global2[SYMBOL_BLACK_LISTED_EVENTS]) {
+      Zone3[SYMBOL_BLACK_LISTED_EVENTS] = Zone3[SYMBOL_UNPATCHED_EVENTS] = global2[SYMBOL_BLACK_LISTED_EVENTS];
+    }
+    api.patchEventPrototype = patchEventPrototype;
+    api.patchEventTarget = patchEventTarget;
+    api.isIEOrEdge = isIEOrEdge;
+    api.ObjectDefineProperty = ObjectDefineProperty;
+    api.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
+    api.ObjectCreate = ObjectCreate;
+    api.ArraySlice = ArraySlice;
+    api.patchClass = patchClass;
+    api.wrapWithCurrentZone = wrapWithCurrentZone;
+    api.filterProperties = filterProperties;
+    api.attachOriginToPatched = attachOriginToPatched;
+    api._redefineProperty = Object.defineProperty;
+    api.patchCallbacks = patchCallbacks;
+    api.getGlobalObjects = () => ({
+      globalSources,
+      zoneSymbolEventNames,
+      eventNames,
+      isBrowser,
+      isMix,
+      isNode,
+      TRUE_STR,
+      FALSE_STR,
+      ZONE_SYMBOL_PREFIX,
+      ADD_EVENT_LISTENER_STR,
+      REMOVE_EVENT_LISTENER_STR
+    });
+  });
+}
+function patchCommon(Zone2) {
+  patchPromise(Zone2);
+  patchToString(Zone2);
+  patchUtil(Zone2);
+}
+var Zone$1 = loadZone();
+patchCommon(Zone$1);
+patchBrowser(Zone$1);
+/*! Bundled license information:
+
+zone.js/fesm2015/zone.js:
+  (**
+   * @license Angular v<unknown>
+   * (c) 2010-2025 Google LLC. https://angular.io/
+   * License: MIT
+   *)
+*/
+//# sourceMappingURL=zone__js.js.map

A diferenza do arquivo foi suprimida porque é demasiado grande
+ 3 - 0
ai-interview/vite/deps/zone__js.js.map


+ 8 - 0
ai-interview/vite/deps_ssr/_metadata.json

@@ -0,0 +1,8 @@
+{
+  "hash": "0ec570df",
+  "configHash": "37204903",
+  "lockfileHash": "67e957ad",
+  "browserHash": "b3b9274d",
+  "optimized": {},
+  "chunks": {}
+}

+ 3 - 0
ai-interview/vite/deps_ssr/package.json

@@ -0,0 +1,3 @@
+{
+  "type": "module"
+}

+ 130 - 0
angular.json

@@ -0,0 +1,130 @@
+{
+  "$schema": "./node_modules/@angular/cli/lib/config/schema.json",
+  "version": 1,
+  "newProjectRoot": "projects",
+  "projects": {
+    "ai-interview": {
+      "projectType": "application",
+      "schematics": {
+        "@schematics/angular:component": {
+          "style": "scss"
+        }
+      },
+      "root": "",
+      "sourceRoot": "src",
+      "prefix": "app",
+      "architect": {
+        "build": {
+          "builder": "@angular/build:application",
+          "options": {
+            "browser": "src/main.ts",
+             "allowedCommonJsDependencies": [
+              "@angular/common",
+              "@angular/core",
+              "@angular/compiler",
+              "swiper",
+              "echarts"
+            ],
+            "scripts": [
+              "node_modules/swiper/swiper.min.js",
+              "node_modules/echarts/dist/echarts.min.js"
+            ],
+            "polyfills": [
+              "zone.js"
+            ],
+            "tsConfig": "tsconfig.app.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                "glob": "**/*",
+                "input": "public"
+              }
+            ],
+            "styles": [
+              
+              "node_modules/font-awesome/css/font-awesome.min.css",
+              "node_modules/swiper/swiper-bundle.min.css",
+             "node_modules/swiper/swiper.min.css",
+              "@angular/material/prebuilt-themes/azure-blue.css",
+             "node_modules/@fortawesome/fontawesome-free/css/all.min.css",
+              "node_modules/animate.css/animate.min.css",
+              "src/styles.scss",
+              {
+                "input": "https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css",
+                "inject": false,
+                "bundleName": "font-awesome"
+              },
+              {
+                "input": "https://cdn.bootcdn.net/ajax/libs/animate.css/4.1.1/animate.min.css",
+                "inject": false,
+                "bundleName": "animate-css"
+              }
+            ]
+          },
+          "configurations": {
+            "production": {
+              "budgets": [
+                {
+                  "type": "initial",
+                  "maximumWarning": "2MB",
+                  "maximumError": "3MB"
+                },
+                {
+                  "type": "anyComponentStyle",
+                  "maximumWarning": "4kB",
+                  "maximumError": "8kB"
+                }
+              ],
+              "outputHashing": "all"
+            },
+            "development": {
+              "optimization": false,
+              "extractLicenses": false,
+              "sourceMap": true
+            }
+          },
+          "defaultConfiguration": "production"
+        },
+        "serve": {
+          "builder": "@angular/build:dev-server",
+          "configurations": {
+            "production": {
+              "buildTarget": "ai-interview:build:production"
+            },
+            "development": {
+              "buildTarget": "ai-interview:build:development"
+            }
+          },
+          "defaultConfiguration": "development"
+        },
+        "extract-i18n": {
+          "builder": "@angular/build:extract-i18n"
+        },
+        "test": {
+          "builder": "@angular/build:karma",
+          "options": {
+            "polyfills": [
+              "zone.js",
+              "zone.js/testing"
+            ],
+            "tsConfig": "tsconfig.spec.json",
+            "inlineStyleLanguage": "scss",
+            "assets": [
+              {
+                
+                "glob": "**/*",
+                "input": "public"
+              }
+            ],
+            "styles": [
+              "@angular/material/prebuilt-themes/azure-blue.css",
+              "src/styles.scss"
+            ]
+          }
+        }
+      }
+    }
+  }
+  
+}
+

+ 74 - 0
package-lock.json

@@ -0,0 +1,74 @@
+{
+  "name": "ai-interview",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "angular-swiper": "^0.4.0",
+        "echarts": "^5.6.0",
+        "swiper": "^11.2.10"
+      },
+      "devDependencies": {
+        "@types/swiper": "^5.4.3"
+      }
+    },
+    "node_modules/@types/swiper": {
+      "version": "5.4.3",
+      "resolved": "https://registry.npmmirror.com/@types/swiper/-/swiper-5.4.3.tgz",
+      "integrity": "sha512-hJXpVeANf+XQXgbvmuFZdsnaSOKqOEZcaLDnHhZOJDRow+lfboatwubW+Ay9XiHobMGyEomkgpXSYRlDVn4gMQ==",
+      "dev": true,
+      "license": "MIT"
+    },
+    "node_modules/angular-swiper": {
+      "version": "0.4.0",
+      "resolved": "https://registry.npmmirror.com/angular-swiper/-/angular-swiper-0.4.0.tgz",
+      "integrity": "sha512-1qhJrlI0Zl7h3qMXFb7Mlg+dEAELc79P5R7U3Gv1YZgYVEWW3sIOU1QSiEcZwZALTwZtKDxzsU301MsrhwI51Q==",
+      "license": "Apache"
+    },
+    "node_modules/echarts": {
+      "version": "5.6.0",
+      "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.6.0.tgz",
+      "integrity": "sha512-oTbVTsXfKuEhxftHqL5xprgLoc0k7uScAwtryCgWF6hPYFLRwOUHiFmHGCBKP5NPFNkDVopOieyUqYGH8Fa3kA==",
+      "license": "Apache-2.0",
+      "dependencies": {
+        "tslib": "2.3.0",
+        "zrender": "5.6.1"
+      }
+    },
+    "node_modules/swiper": {
+      "version": "11.2.10",
+      "resolved": "https://registry.npmmirror.com/swiper/-/swiper-11.2.10.tgz",
+      "integrity": "sha512-RMeVUUjTQH+6N3ckimK93oxz6Sn5la4aDlgPzB+rBrG/smPdCTicXyhxa+woIpopz+jewEloiEE3lKo1h9w2YQ==",
+      "funding": [
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/swiperjs"
+        },
+        {
+          "type": "open_collective",
+          "url": "http://opencollective.com/swiper"
+        }
+      ],
+      "license": "MIT",
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz",
+      "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==",
+      "license": "0BSD"
+    },
+    "node_modules/zrender": {
+      "version": "5.6.1",
+      "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.1.tgz",
+      "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==",
+      "license": "BSD-3-Clause",
+      "dependencies": {
+        "tslib": "2.3.0"
+      }
+    }
+  }
+}

+ 10 - 0
package.json

@@ -0,0 +1,10 @@
+{
+  "dependencies": {
+    "angular-swiper": "^0.4.0",
+    "echarts": "^5.6.0",
+    "swiper": "^11.2.10"
+  },
+  "devDependencies": {
+    "@types/swiper": "^5.4.3"
+  }
+}

BIN=BIN
public/favicon.ico


+ 21 - 0
src/app/app.config.ts

@@ -0,0 +1,21 @@
+// src/app/app.config.ts
+import { ApplicationConfig } from '@angular/core';
+import { provideRouter } from '@angular/router';
+import { routes } from './app.routes';
+import { provideAnimations } from '@angular/platform-browser/animations';
+import { provideHttpClient, withRequestsMadeViaParent } from '@angular/common/http';
+import { FontAwesomeModule } from '@fortawesome/angular-fontawesome';
+import { library } from '@fortawesome/fontawesome-svg-core';
+import { faUserTie, faChartLine } from '@fortawesome/free-solid-svg-icons';
+
+// 添加图标到库
+library.add(faUserTie, faChartLine);
+
+export const appConfig: ApplicationConfig = {
+  providers: [
+    provideRouter(routes),
+    provideAnimations(),
+    provideHttpClient(withRequestsMadeViaParent()) as any,
+    FontAwesomeModule
+  ]
+};

+ 2 - 0
src/app/app.html

@@ -0,0 +1,2 @@
+<app-login-choice></app-login-choice>
+<router-outlet></router-outlet>

+ 14 - 0
src/app/app.routes.ts

@@ -0,0 +1,14 @@
+import { Routes } from '@angular/router';
+import {LoginChoice } from './login-choice/login-choice';
+
+export const routes: Routes = [
+  { path: '', component: LoginChoice},
+  { 
+    path: 'intervieweeauth', 
+    loadChildren: () => import('./interviewee-auth/auth.routes').then(m=>m.AuthRoutes)
+  },
+  { 
+    path: 'hrauth', 
+    loadChildren: () => import('./hr-auth/hr-auth.routes').then(m => m.HrAuthRoutes) 
+  },
+];

+ 0 - 0
src/app/app.scss


+ 23 - 0
src/app/app.spec.ts

@@ -0,0 +1,23 @@
+import { TestBed } from '@angular/core/testing';
+import { App } from './app';
+
+describe('App', () => {
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [App],
+    }).compileComponents();
+  });
+
+  it('should create the app', () => {
+    const fixture = TestBed.createComponent(App);
+    const app = fixture.componentInstance;
+    expect(app).toBeTruthy();
+  });
+
+  it('should render title', () => {
+    const fixture = TestBed.createComponent(App);
+    fixture.detectChanges();
+    const compiled = fixture.nativeElement as HTMLElement;
+    expect(compiled.querySelector('h1')?.textContent).toContain('Hello, ai-interview');
+  });
+});

+ 20 - 0
src/app/app.ts

@@ -0,0 +1,20 @@
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterOutlet } from '@angular/router';
+import 'swiper/css';
+import 'swiper/css/effect-cards';
+import 'font-awesome/css/font-awesome.min.css';
+import 'animate.css';
+
+@Component({
+  selector: 'app-root',
+  standalone: true,
+  imports: [CommonModule, RouterOutlet],
+  template: `
+    <router-outlet></router-outlet>
+  `,
+  styles: []
+})
+export class App {
+  title = 'ai-interview';
+}

+ 62 - 0
src/app/hr-auth/auth.html

@@ -0,0 +1,62 @@
+<div class="auth-container">
+  <!-- 科幻风格装饰元素 -->
+  <div class="decorator decorator-1"></div>
+  <div class="decorator decorator-2"></div>
+  
+  <div class="auth-header">
+    <h1 class="auth-title">企业登录</h1>
+    <p class="auth-subtitle">欢迎回来,请使用您的凭证登录系统</p>
+  </div>
+
+  <!-- 错误消息 -->
+  @if (errorMessage()) {
+    <div class="message error-message">
+      {{ errorMessage() }}
+    </div>
+  }
+
+  <!-- 成功消息 -->
+  @if (successMessage()) {
+    <div class="message success-message">
+      {{ successMessage() }}
+    </div>
+  }
+
+  <form class="auth-form" (ngSubmit)="onSubmit()">
+    <div class="form-group">
+      <label for="username" class="form-label">企业凭证</label>
+      <input
+        type="text"
+        id="username"
+        [(ngModel)]="username"
+        name="username"
+        class="form-input"
+        placeholder="输入您的企业凭证"
+        required
+      />
+    </div>
+
+    <div class="form-group">
+      <label for="password" class="form-label">密码</label>
+      <input
+        type="password"
+        id="password"
+        [(ngModel)]="password"
+        name="password"
+        class="form-input"
+        placeholder="输入您的密码"
+        required
+      />
+    </div>
+
+    <button type="submit" class="submit-btn" [disabled]="isLoading()">
+      @if (isLoading()) {
+        <span>登录中...</span>
+      } @else {
+        <span>登 录</span>
+      }
+    </button>
+  </form>
+
+  
+</div>

+ 222 - 0
src/app/hr-auth/auth.scss

@@ -0,0 +1,222 @@
+:host {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 100vh;
+  background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+  font-family: 'Inter', 'Alibaba PuHuiTi', sans-serif;
+  color: white;
+}
+
+.auth-container {
+  width: 100%;
+  max-width: 420px;
+  padding: 2.5rem;
+  background: rgba(30, 41, 59, 0.8);
+  border-radius: 1rem;
+  box-shadow: 0 0 30px rgba(37, 99, 235, 0.3);
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  backdrop-filter: blur(10px);
+  position: relative;
+  overflow: hidden;
+}
+
+.auth-container::before {
+  content: '';
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  width: 200%;
+  height: 200%;
+  background: radial-gradient(circle, rgba(37, 99, 235, 0.1) 0%, transparent 70%);
+  animation: rotate 20s linear infinite;
+  z-index: -1;
+}
+
+@keyframes rotate {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+.auth-header {
+  text-align: center;
+  margin-bottom: 2rem;
+}
+
+.auth-title {
+  font-size: 1.8rem;
+  font-weight: 600;
+  margin-bottom: 0.5rem;
+  background: linear-gradient(90deg, #2563EB, #7C3AED);
+  -webkit-background-clip: text;
+  background-clip: text;
+  color: transparent;
+}
+
+.auth-subtitle {
+  font-size: 0.9rem;
+  color: #94a3b8;
+}
+
+.auth-form {
+  display: flex;
+  flex-direction: column;
+  gap: 1.5rem;
+}
+
+.form-group {
+  display: flex;
+  flex-direction: column;
+  gap: 0.5rem;
+}
+
+.form-label {
+  font-size: 0.9rem;
+  color: #e2e8f0;
+  display: flex;
+  align-items: center;
+  gap: 0.5rem;
+}
+
+.form-label::before {
+  content: '>';
+  color: #7C3AED;
+  font-weight: bold;
+}
+
+.form-input {
+  padding: 0.8rem 1rem;
+  background: rgba(15, 23, 42, 0.5);
+  border: 1px solid rgba(37, 99, 235, 0.3);
+  border-radius: 0.5rem;
+  color: white;
+  font-family: inherit;
+  font-size: 1rem;
+  transition: all 0.3s ease;
+}
+
+.form-input:focus {
+  outline: none;
+  border-color: #2563EB;
+  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2);
+}
+
+.submit-btn {
+  padding: 0.8rem;
+  background: linear-gradient(90deg, #2563EB, #7C3AED);
+  color: white;
+  border: none;
+  border-radius: 0.5rem;
+  font-size: 1rem;
+  font-weight: 600;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  margin-top: 0.5rem;
+  position: relative;
+  overflow: hidden;
+}
+
+.submit-btn::after {
+  content: '';
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  width: 200%;
+  height: 200%;
+  background: linear-gradient(
+    to bottom right,
+    rgba(255, 255, 255, 0.3) 0%,
+    rgba(255, 255, 255, 0) 60%
+  );
+  transform: rotate(30deg);
+  transition: all 0.3s ease;
+}
+
+.submit-btn:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 5px 15px rgba(37, 99, 235, 0.4);
+}
+
+.submit-btn:hover::after {
+  left: 100%;
+}
+
+.submit-btn:active {
+  transform: translateY(0);
+}
+
+.mode-toggle {
+  text-align: center;
+  margin-top: 1.5rem;
+  font-size: 0.9rem;
+  color: #94a3b8;
+}
+
+.toggle-link {
+  color: #7C3AED;
+  cursor: pointer;
+  font-weight: 600;
+  text-decoration: none;
+  transition: color 0.3s ease;
+}
+
+.toggle-link:hover {
+  color: #2563EB;
+  text-decoration: underline;
+}
+
+.message {
+  padding: 0.8rem;
+  border-radius: 0.5rem;
+  margin-bottom: 1rem;
+  font-size: 0.9rem;
+  text-align: center;
+}
+
+.error-message {
+  background-color: rgba(245, 158, 11, 0.1);
+  border: 1px solid rgba(245, 158, 11, 0.3);
+  color: #F59E0B;
+}
+
+.success-message {
+  background-color: rgba(16, 185, 129, 0.1);
+  border: 1px solid rgba(16, 185, 129, 0.3);
+  color: #10B981;
+}
+
+/* 科幻风格的装饰元素 */
+.decorator {
+  position: absolute;
+  background: rgba(37, 99, 235, 0.1);
+  border: 1px solid rgba(37, 99, 235, 0.3);
+}
+
+.decorator-1 {
+  width: 100px;
+  height: 100px;
+  border-radius: 50%;
+  top: -50px;
+  right: -50px;
+}
+
+.decorator-2 {
+  width: 60px;
+  height: 60px;
+  border-radius: 10px;
+  bottom: -30px;
+  left: -30px;
+  transform: rotate(45deg);
+}
+
+/* 响应式设计 */
+@media (max-width: 480px) {
+  .auth-container {
+    padding: 1.5rem;
+    margin: 0 1rem;
+  }
+}

+ 23 - 0
src/app/hr-auth/auth.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Auth } from './auth';
+
+describe('Auth', () => {
+  let component: Auth;
+  let fixture: ComponentFixture<Auth>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Auth]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Auth);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 45 - 0
src/app/hr-auth/auth.ts

@@ -0,0 +1,45 @@
+import { Component, OnInit, signal } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule, ReactiveFormsModule } from '@angular/forms';
+import { Router, RouterModule } from '@angular/router';
+
+@Component({
+  selector: 'app-auth',
+  standalone: true,
+  imports: [CommonModule, FormsModule, ReactiveFormsModule, RouterModule],
+  templateUrl: './auth.html',
+  styleUrls: ['./auth.scss']
+})
+export class Auth implements OnInit {
+  // 表单数据
+  username = signal('');
+  password = signal('');
+  
+  // 状态管理
+  isLoading = signal(false);
+  errorMessage = signal('');
+  successMessage = signal('');
+
+  ngOnInit() {
+    // 初始化时可以添加一些动画效果
+  }
+
+  onSubmit() {
+    this.isLoading.set(true);
+    this.errorMessage.set('');
+    this.successMessage.set('');
+
+    // 模拟登录请求
+    setTimeout(() => {
+      if (this.username() === '1' && this.password() === '1') {
+        this.successMessage.set('登录成功!');
+        this.router.navigate(['/hrauth/hr']);
+        // 这里实际项目中应该是导航到主页
+      } else {
+        this.errorMessage.set('企业凭证或密码错误,请重试');
+      }
+      this.isLoading.set(false);
+    }, 1500);
+  }
+  constructor(private router: Router){}
+}

+ 14 - 0
src/app/hr-auth/hr-auth.routes.ts

@@ -0,0 +1,14 @@
+import { Routes } from '@angular/router';
+
+
+export const HrAuthRoutes: Routes = [
+  { 
+    path: '', 
+    loadComponent: () => import('./auth').then(m=>m.Auth)
+  },
+  {
+     path:'hr',
+     loadComponent: () => import('../hr/dashboard/dashboard').then(m=>m.Dashboard)
+  },
+  
+];

+ 63 - 0
src/app/hr/company-profile/company-profile.html

@@ -0,0 +1,63 @@
+<!-- company-profile.component.html -->
+<div class="company-profile-container">
+  <div class="profile-header">
+    <h2>企业资料</h2>
+    <button class="edit-button" (click)="toggleEdit()">
+      {{ isEditing ? '保存更改' : '编辑资料' }}
+    </button>
+  </div>
+
+  <div class="company-info">
+    <div class="info-row">
+      <label>企业名称</label>
+      <span *ngIf="!isEditing">{{ company.name }}</span>
+      <input *ngIf="isEditing" [(ngModel)]="company.name">
+    </div>
+
+    <div class="info-row">
+      <label>企业地址</label>
+      <span *ngIf="!isEditing">{{ company.address }}</span>
+      <input *ngIf="isEditing" [(ngModel)]="company.address">
+    </div>
+
+    <div class="info-row">
+      <label>行业方向</label>
+      <span *ngIf="!isEditing">{{ company.industry }}</span>
+      <input *ngIf="isEditing" [(ngModel)]="company.industry">
+    </div>
+
+    <div class="info-row">
+      <label>企业简介</label>
+      <span *ngIf="!isEditing">{{ company.description }}</span>
+      <textarea *ngIf="isEditing" [(ngModel)]="company.description" rows="4"></textarea>
+    </div>
+  </div>
+
+  <div class="job-openings">
+    <h3>招聘职位</h3>
+    
+    <div *ngIf="isEditing" class="add-job-form">
+      <div class="form-row">
+        <input [(ngModel)]="newJob.title" placeholder="职位名称">
+        <input [(ngModel)]="newJob.requirements" placeholder="职位要求">
+      </div>
+      <textarea [(ngModel)]="newJob.description" placeholder="职位描述" rows="3"></textarea>
+      <button class="add-button" (click)="addJob()">添加职位</button>
+    </div>
+
+    <div class="job-list">
+      <div *ngFor="let job of company.jobOpenings; let i = index" class="job-card">
+        <div class="job-header">
+          <h4>{{ job.title }}</h4>
+          <button *ngIf="isEditing" class="remove-button" (click)="removeJob(i)">删除</button>
+        </div>
+        <div class="job-requirements">
+          <strong>要求:</strong> {{ job.requirements || '无特定要求' }}
+        </div>
+        <div class="job-description">
+          {{ job.description }}
+        </div>
+      </div>
+    </div>
+  </div>
+</div>

+ 229 - 0
src/app/hr/company-profile/company-profile.scss

@@ -0,0 +1,229 @@
+/* company-profile.component.scss */
+.company-profile-container {
+  display: flex;
+  flex-direction: column;
+  gap: 2rem;
+}
+
+.profile-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 1rem;
+
+  h2 {
+    margin: 0;
+    font-size: 1.5rem;
+    font-weight: 600;
+    color: white;
+    background: linear-gradient(90deg, #2563EB 0%, #7C3AED 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+  }
+}
+
+.edit-button {
+  background: #2563EB;
+  color: white;
+  border: none;
+  padding: 0.6rem 1.2rem;
+  border-radius: 0.5rem;
+  font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+  font-weight: 500;
+  cursor: pointer;
+  transition: all 0.3s ease;
+
+  &:hover {
+    background: #1d4ed8;
+    box-shadow: 0 0 15px rgba(37, 99, 235, 0.5);
+  }
+}
+
+.company-info {
+  display: flex;
+  flex-direction: column;
+  gap: 1.2rem;
+  background: rgba(15, 23, 42, 0.7);
+  border-radius: 0.8rem;
+  padding: 1.5rem;
+  border: 1px solid rgba(37, 99, 235, 0.2);
+}
+
+.info-row {
+  display: grid;
+  grid-template-columns: 120px 1fr;
+  gap: 1rem;
+  align-items: center;
+
+  label {
+    font-weight: 500;
+    color: rgba(255, 255, 255, 0.8);
+  }
+
+  span {
+    color: white;
+  }
+
+  input, textarea {
+    width: 100%;
+    padding: 0.7rem 1rem;
+    background: rgba(30, 41, 59, 0.8);
+    border: 1px solid rgba(37, 99, 235, 0.3);
+    border-radius: 0.5rem;
+    color: white;
+    font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+    transition: all 0.3s ease;
+
+    &:focus {
+      outline: none;
+      border-color: #7C3AED;
+      box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.3);
+    }
+  }
+
+  textarea {
+    resize: vertical;
+    min-height: 100px;
+  }
+}
+
+.job-openings {
+  display: flex;
+  flex-direction: column;
+  gap: 1.5rem;
+
+  h3 {
+    margin: 0;
+    font-size: 1.3rem;
+    font-weight: 600;
+    color: white;
+  }
+}
+
+.add-job-form {
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
+  background: rgba(15, 23, 42, 0.7);
+  border-radius: 0.8rem;
+  padding: 1.5rem;
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  margin-bottom: 1rem;
+
+  .form-row {
+    display: flex;
+    gap: 1rem;
+
+    input {
+      flex: 1;
+    }
+  }
+
+  input, textarea {
+    width: 100%;
+    padding: 0.7rem 1rem;
+    background: rgba(30, 41, 59, 0.8);
+    border: 1px solid rgba(37, 99, 235, 0.3);
+    border-radius: 0.5rem;
+    color: white;
+    font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+    transition: all 0.3s ease;
+
+    &:focus {
+      outline: none;
+      border-color: #7C3AED;
+      box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.3);
+    }
+  }
+
+  textarea {
+    resize: vertical;
+    min-height: 80px;
+  }
+}
+
+.add-button {
+  align-self: flex-end;
+  background: #10B981;
+  color: white;
+  border: none;
+  padding: 0.6rem 1.2rem;
+  border-radius: 0.5rem;
+  font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+  font-weight: 500;
+  cursor: pointer;
+  transition: all 0.3s ease;
+
+  &:hover {
+    background: #0d9f6e;
+    box-shadow: 0 0 15px rgba(16, 185, 129, 0.5);
+  }
+}
+
+.job-list {
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
+}
+
+.job-card {
+  background: rgba(15, 23, 42, 0.7);
+  border-radius: 0.8rem;
+  padding: 1.5rem;
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  transition: all 0.3s ease;
+
+  &:hover {
+    transform: translateY(-3px);
+    box-shadow: 0 5px 15px rgba(37, 99, 235, 0.2);
+    border-color: rgba(37, 99, 235, 0.5);
+  }
+}
+
+.job-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 0.8rem;
+
+  h4 {
+    margin: 0;
+    font-size: 1.1rem;
+    font-weight: 600;
+    color: white;
+  }
+}
+
+.remove-button {
+  background: rgba(239, 68, 68, 0.2);
+  color: #EF4444;
+  border: none;
+  padding: 0.3rem 0.8rem;
+  border-radius: 0.3rem;
+  font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+  font-weight: 500;
+  cursor: pointer;
+  transition: all 0.3s ease;
+
+  &:hover {
+    background: #EF4444;
+    color: white;
+  }
+}
+
+.job-requirements {
+  font-size: 0.9rem;
+  color: rgba(255, 255, 255, 0.8);
+  margin-bottom: 0.8rem;
+
+  strong {
+    color: white;
+    font-weight: 500;
+  }
+}
+
+.job-description {
+  font-size: 0.95rem;
+  color: rgba(255, 255, 255, 0.7);
+  line-height: 1.5;
+}

+ 23 - 0
src/app/hr/company-profile/company-profile.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { CompanyProfile } from './company-profile';
+
+describe('CompanyProfile', () => {
+  let component: CompanyProfile;
+  let fixture: ComponentFixture<CompanyProfile>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [CompanyProfile]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(CompanyProfile);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 43 - 0
src/app/hr/company-profile/company-profile.ts

@@ -0,0 +1,43 @@
+// company-profile.component.ts
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { Company } from '../models/company.model';
+import { CompanyService } from '../services/company.service';
+
+@Component({
+  selector: 'app-company-profile',
+  standalone: true,
+  imports: [CommonModule, FormsModule],
+  templateUrl: './company-profile.html',
+  styleUrls: ['./company-profile.scss']
+})
+export class CompanyProfile {
+  company: Company;
+  isEditing = false;
+  newJob = { title: '', description: '', requirements: '' };
+
+  constructor(private companyService: CompanyService) {
+    this.company = this.companyService.getCompany();
+  }
+
+  toggleEdit() {
+    this.isEditing = !this.isEditing;
+    if (!this.isEditing) {
+      this.companyService.updateCompany(this.company);
+    }
+  }
+
+  addJob() {
+    if (this.newJob.title && this.newJob.description) {
+      this.company.jobOpenings.push({...this.newJob});
+      this.newJob = { title: '', description: '', requirements: '' };
+      this.companyService.updateCompany(this.company);
+    }
+  }
+
+  removeJob(index: number) {
+    this.company.jobOpenings.splice(index, 1);
+    this.companyService.updateCompany(this.company);
+  }
+}

+ 29 - 0
src/app/hr/dashboard/dashboard.html

@@ -0,0 +1,29 @@
+<!-- dashboard.component.html -->
+<div class="dashboard-container">
+  <header class="dashboard-header">
+    <h1 class="title">企业后端管理系统</h1>
+    <div class="tab-nav">
+      <button 
+        class="tab-button" 
+        [class.active]="activeTab === 'resumes'"
+        (click)="activeTab = 'resumes'">
+        简历筛选
+      </button>
+      <button 
+        class="tab-button" 
+        [class.active]="activeTab === 'company'"
+        (click)="activeTab = 'company'">
+        企业资料
+      </button>
+    </div>
+  </header>
+
+  <div class="dashboard-content">
+    <app-status-card *ngIf="activeTab === 'resumes'"></app-status-card>
+    
+    <div class="main-content">
+      <app-resume-filter *ngIf="activeTab === 'resumes'"></app-resume-filter>
+      <app-company-profile *ngIf="activeTab === 'company'"></app-company-profile>
+    </div>
+  </div>
+</div>

+ 75 - 0
src/app/hr/dashboard/dashboard.scss

@@ -0,0 +1,75 @@
+/* dashboard.component.scss */
+@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&display=swap');
+
+.dashboard-container {
+  font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+  background: linear-gradient(135deg, #0f172a 0%, #1e293b 100%);
+  min-height: 100vh;
+  color: white;
+  padding: 2rem;
+}
+
+.dashboard-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 2rem;
+  border-bottom: 1px solid rgba(37, 99, 235, 0.3);
+  padding-bottom: 1rem;
+
+  .title {
+    font-size: 1.8rem;
+    font-weight: 600;
+    background: linear-gradient(90deg, #2563EB 0%, #7C3AED 100%);
+    -webkit-background-clip: text;
+    -webkit-text-fill-color: transparent;
+    margin: 0;
+  }
+}
+
+.tab-nav {
+  display: flex;
+  gap: 1rem;
+  background: rgba(30, 41, 59, 0.8);
+  padding: 0.5rem;
+  border-radius: 0.5rem;
+  backdrop-filter: blur(10px);
+  border: 1px solid rgba(37, 99, 235, 0.2);
+}
+
+.tab-button {
+  background: transparent;
+  border: none;
+  color: rgba(255, 255, 255, 0.7);
+  padding: 0.5rem 1.5rem;
+  border-radius: 0.3rem;
+  cursor: pointer;
+  font-weight: 500;
+  transition: all 0.3s ease;
+
+  &:hover {
+    color: white;
+    background: rgba(37, 99, 235, 0.2);
+  }
+
+  &.active {
+    background: #2563EB;
+    color: white;
+    box-shadow: 0 0 15px rgba(37, 99, 235, 0.5);
+  }
+}
+
+.dashboard-content {
+  display: grid;
+  grid-template-columns: 300px 1fr;
+  gap: 1.5rem;
+
+  .main-content {
+    background: rgba(30, 41, 59, 0.8);
+    border-radius: 0.8rem;
+    padding: 1.5rem;
+    backdrop-filter: blur(10px);
+    border: 1px solid rgba(37, 99, 235, 0.2);
+    box-shadow: 0 10px 30px rgba(0, 0, 0, 0.2);
+  }
+}

+ 23 - 0
src/app/hr/dashboard/dashboard.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { Dashboard } from './dashboard';
+
+describe('Dashboard', () => {
+  let component: Dashboard;
+  let fixture: ComponentFixture<Dashboard>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Dashboard]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Dashboard);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 24 - 0
src/app/hr/dashboard/dashboard.ts

@@ -0,0 +1,24 @@
+// dashboard.component.ts
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { RouterModule } from '@angular/router';
+import { StatusCard } from '../status-card/status-card';
+import { ResumeFilter } from '../resume-filter/resume-filter';
+import { CompanyProfile } from '../company-profile/company-profile';
+
+@Component({
+  selector: 'app-dashboard',
+  standalone: true,
+  imports: [
+    CommonModule, 
+    RouterModule,
+    StatusCard,
+    ResumeFilter,
+    CompanyProfile
+  ],
+  templateUrl: './dashboard.html',
+  styleUrls: ['./dashboard.scss']
+})
+export class Dashboard {
+  activeTab: 'resumes' | 'company' = 'resumes';
+}

+ 10 - 0
src/app/hr/dashboard/hr.routes.ts

@@ -0,0 +1,10 @@
+import { Routes } from '@angular/router';
+
+
+export const HrRoutes: Routes = [
+  { 
+    path: '', 
+    loadComponent: () => import('./dashboard').then(m=>m.Dashboard)
+  },
+  
+];

+ 14 - 0
src/app/hr/models/company.model.ts

@@ -0,0 +1,14 @@
+// company.model.ts
+export interface JobOpening {
+  title: string;
+  description: string;
+  requirements: string;
+}
+
+export interface Company {
+  name: string;
+  address: string;
+  industry: string;
+  description: string;
+  jobOpenings: JobOpening[];
+}

+ 10 - 0
src/app/hr/models/resume.model.ts

@@ -0,0 +1,10 @@
+// resume.model.ts
+export interface Resume {
+  id: string;
+  name: string;
+  position: string;
+  education: '博士' | '硕士' | '本科' | '大专';
+  experience: number;
+  skills: string[];
+  status: 'pending' | 'approved' | 'rejected';
+}

+ 79 - 0
src/app/hr/resume-filter/resume-filter.html

@@ -0,0 +1,79 @@
+<!-- resume-filter.component.html -->
+<div class="resume-filter-container">
+  <div class="filter-controls">
+    <div class="search-box">
+      <input 
+        type="text" 
+        [(ngModel)]="filters.search" 
+        (input)="applyFilters()"
+        placeholder="搜索姓名或职位...">
+      <svg width="18" height="18" viewBox="0 0 24 24" fill="none">
+        <path d="M11 19C15.4183 19 19 15.4183 19 11C19 6.58172 15.4183 3 11 3C6.58172 3 3 6.58172 3 11C3 15.4183 6.58172 19 11 19Z" stroke="#7C3AED" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+        <path d="M21 21L16.65 16.65" stroke="#7C3AED" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+      </svg>
+    </div>
+
+    <div class="filter-group">
+      <select [(ngModel)]="filters.education" (change)="applyFilters()">
+        <option value="">所有学历</option>
+        <option value="博士">博士</option>
+        <option value="硕士">硕士</option>
+        <option value="本科">本科</option>
+        <option value="大专">大专</option>
+      </select>
+
+      <select [(ngModel)]="filters.experience" (change)="applyFilters()">
+        <option value="">所有经验</option>
+        <option value="1">1年以上</option>
+        <option value="3">3年以上</option>
+        <option value="5">5年以上</option>
+      </select>
+
+      <select [(ngModel)]="filters.status" (change)="applyFilters()">
+        <option value="">所有状态</option>
+        <option value="pending">待处理</option>
+        <option value="approved">已通过</option>
+        <option value="rejected">已拒绝</option>
+      </select>
+    </div>
+  </div>
+
+  <div class="resume-list">
+    <div *ngFor="let resume of filteredResumes" class="resume-card">
+      <div class="resume-header">
+        <div class="avatar">{{ resume.name.charAt(0) }}</div>
+        <div class="resume-info">
+          <h3>{{ resume.name }}</h3>
+          <p>{{ resume.position }} · {{ resume.experience }}年经验</p>
+        </div>
+        <div class="education-badge">{{ resume.education }}</div>
+      </div>
+
+      <div class="resume-skills">
+        <span *ngFor="let skill of resume.skills" class="skill-tag">{{ skill }}</span>
+      </div>
+
+      <div class="resume-actions">
+        <button 
+          class="approve" 
+          (click)="updateStatus(resume, 'approved')"
+          [class.active]="resume.status === 'approved'">
+          通过
+        </button>
+        <button 
+          class="reject" 
+          (click)="updateStatus(resume, 'rejected')"
+          [class.active]="resume.status === 'rejected'">
+          拒绝
+        </button>
+      </div>
+
+      <div class="resume-status" [class.pending]="resume.status === 'pending'" 
+                               [class.approved]="resume.status === 'approved'" 
+                               [class.rejected]="resume.status === 'rejected'">
+        {{ resume.status === 'pending' ? '待处理' : 
+           resume.status === 'approved' ? '已通过' : '已拒绝' }}
+      </div>
+    </div>
+  </div>
+</div>

+ 212 - 0
src/app/hr/resume-filter/resume-filter.scss

@@ -0,0 +1,212 @@
+/* resume-filter.component.scss */
+.resume-filter-container {
+  display: flex;
+  flex-direction: column;
+  gap: 1.5rem;
+}
+
+.filter-controls {
+  display: flex;
+  flex-direction: column;
+  gap: 1rem;
+}
+
+.search-box {
+  position: relative;
+  
+  input {
+    width: 100%;
+    padding: 0.8rem 1rem 0.8rem 2.5rem;
+    background: rgba(15, 23, 42, 0.7);
+    border: 1px solid rgba(37, 99, 235, 0.3);
+    border-radius: 0.5rem;
+    color: white;
+    font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+    transition: all 0.3s ease;
+
+    &:focus {
+      outline: none;
+      border-color: #7C3AED;
+      box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.3);
+    }
+
+    &::placeholder {
+      color: rgba(255, 255, 255, 0.5);
+    }
+  }
+
+  svg {
+    position: absolute;
+    left: 1rem;
+    top: 50%;
+    transform: translateY(-50%);
+  }
+}
+
+.filter-group {
+  display: flex;
+  gap: 1rem;
+
+  select {
+    flex: 1;
+    padding: 0.7rem 1rem;
+    background: rgba(15, 23, 42, 0.7);
+    border: 1px solid rgba(37, 99, 235, 0.3);
+    border-radius: 0.5rem;
+    color: white;
+    font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+    cursor: pointer;
+    transition: all 0.3s ease;
+
+    &:focus {
+      outline: none;
+      border-color: #7C3AED;
+      box-shadow: 0 0 0 2px rgba(124, 58, 237, 0.3);
+    }
+  }
+}
+
+.resume-list {
+  display: grid;
+  grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
+  gap: 1.5rem;
+}
+
+.resume-card {
+  background: rgba(15, 23, 42, 0.7);
+  border-radius: 0.8rem;
+  padding: 1.5rem;
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  transition: all 0.3s ease;
+  position: relative;
+  overflow: hidden;
+
+  &:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 10px 25px rgba(37, 99, 235, 0.2);
+    border-color: rgba(37, 99, 235, 0.5);
+  }
+}
+
+.resume-header {
+  display: flex;
+  align-items: center;
+  gap: 1rem;
+  margin-bottom: 1.2rem;
+}
+
+.avatar {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  background: linear-gradient(135deg, #2563EB 0%, #7C3AED 100%);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  font-weight: 600;
+  font-size: 1.2rem;
+  color: white;
+}
+
+.resume-info {
+  flex: 1;
+
+  h3 {
+    margin: 0;
+    font-size: 1.1rem;
+    font-weight: 600;
+    color: white;
+  }
+
+  p {
+    margin: 0.3rem 0 0 0;
+    font-size: 0.9rem;
+    color: rgba(255, 255, 255, 0.7);
+  }
+}
+
+.education-badge {
+  background: rgba(37, 99, 235, 0.2);
+  color: #2563EB;
+  padding: 0.3rem 0.8rem;
+  border-radius: 1rem;
+  font-size: 0.8rem;
+  font-weight: 500;
+}
+
+.resume-skills {
+  display: flex;
+  flex-wrap: wrap;
+  gap: 0.5rem;
+  margin-bottom: 1.5rem;
+}
+
+.skill-tag {
+  background: rgba(124, 58, 237, 0.2);
+  color: #7C3AED;
+  padding: 0.3rem 0.8rem;
+  border-radius: 1rem;
+  font-size: 0.8rem;
+  font-weight: 500;
+}
+
+.resume-actions {
+  display: flex;
+  gap: 0.8rem;
+
+  button {
+    flex: 1;
+    padding: 0.6rem;
+    border-radius: 0.5rem;
+    border: none;
+    font-family: 'Inter', '阿里巴巴普惠体', sans-serif;
+    font-weight: 500;
+    cursor: pointer;
+    transition: all 0.3s ease;
+
+    &.approve {
+      background: rgba(16, 185, 129, 0.2);
+      color: #10B981;
+
+      &:hover, &.active {
+        background: #10B981;
+        color: white;
+      }
+    }
+
+    &.reject {
+      background: rgba(245, 158, 11, 0.2);
+      color: #F59E0B;
+
+      &:hover, &.active {
+        background: #F59E0B;
+        color: white;
+      }
+    }
+  }
+}
+
+.resume-status {
+  position: absolute;
+  top: 0;
+  right: 0;
+  padding: 0.3rem 1rem;
+  border-bottom-left-radius: 0.8rem;
+  font-size: 0.8rem;
+  font-weight: 500;
+
+  &.pending {
+    background: rgba(37, 99, 235, 0.2);
+    color: #2563EB;
+  }
+
+  &.approved {
+    background: rgba(16, 185, 129, 0.2);
+    color: #10B981;
+  }
+
+  &.rejected {
+    background: rgba(245, 158, 11, 0.2);
+    color: #F59E0B;
+  }
+}

+ 23 - 0
src/app/hr/resume-filter/resume-filter.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { ResumeFilter } from './resume-filter';
+
+describe('ResumeFilter', () => {
+  let component: ResumeFilter;
+  let fixture: ComponentFixture<ResumeFilter>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [ResumeFilter]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(ResumeFilter);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 47 - 0
src/app/hr/resume-filter/resume-filter.ts

@@ -0,0 +1,47 @@
+// resume-filter.component.ts
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { Resume } from '../models/resume.model';
+import { ResumeService } from '../services/resume.service';
+
+@Component({
+  selector: 'app-resume-filter',
+  standalone: true,
+  imports: [CommonModule, FormsModule],
+  templateUrl: './resume-filter.html',
+  styleUrls: ['./resume-filter.scss']
+})
+export class ResumeFilter {
+  resumes: Resume[] = [];
+  filteredResumes: Resume[] = [];
+  filters = {
+    education: '',
+    experience: '',
+    status: '',
+    search: ''
+  };
+
+  constructor(private resumeService: ResumeService) {
+    this.resumes = this.resumeService.getResumes();
+    this.filteredResumes = [...this.resumes];
+  }
+
+  applyFilters() {
+    this.filteredResumes = this.resumes.filter(resume => {
+      return (
+        (this.filters.education === '' || resume.education === this.filters.education) &&
+        (this.filters.experience === '' || resume.experience >= +this.filters.experience) &&
+        (this.filters.status === '' || resume.status === this.filters.status) &&
+        (this.filters.search === '' || 
+         resume.name.toLowerCase().includes(this.filters.search.toLowerCase()) ||
+         resume.position.toLowerCase().includes(this.filters.search.toLowerCase()))
+      );
+    });
+  }
+
+  updateStatus(resume: Resume, status: 'pending' | 'approved' | 'rejected') {
+    resume.status = status;
+    this.applyFilters();
+  }
+}

+ 40 - 0
src/app/hr/services/company.service.ts

@@ -0,0 +1,40 @@
+// company.service.ts
+import { Injectable } from '@angular/core';
+import { Company } from '../models/company.model';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class CompanyService {
+  private company: Company = {
+    name: '未来科技股份有限公司',
+    address: '北京市海淀区中关村软件园二期8号楼',
+    industry: '人工智能与大数据',
+    description: '未来科技是一家专注于人工智能和大数据技术研发的高科技企业,致力于为企业提供智能化解决方案。我们拥有一支由博士和硕士组成的高素质研发团队,在自然语言处理、计算机视觉和机器学习领域具有深厚的技术积累。',
+    jobOpenings: [
+      {
+        title: '高级前端工程师',
+        description: '负责公司核心产品的前端开发工作,参与技术方案设计和架构优化。',
+        requirements: '3年以上前端开发经验,精通Angular/React/Vue等框架'
+      },
+      {
+        title: 'Java后端开发',
+        description: '参与公司后端服务开发,负责高并发、分布式系统的设计与实现。',
+        requirements: '5年以上Java开发经验,熟悉Spring Cloud微服务架构'
+      },
+      {
+        title: 'AI算法工程师',
+        description: '负责机器学习算法的研发和优化,参与产品智能化功能的实现。',
+        requirements: '硕士及以上学历,熟悉TensorFlow/PyTorch等框架'
+      }
+    ]
+  };
+
+  getCompany(): Company {
+    return {...this.company};
+  }
+
+  updateCompany(updatedCompany: Company): void {
+    this.company = {...updatedCompany};
+  }
+}

+ 51 - 0
src/app/hr/services/resume.service.ts

@@ -0,0 +1,51 @@
+// resume.service.ts
+import { Injectable } from '@angular/core';
+import { Resume } from '../models/resume.model';
+
+@Injectable({
+  providedIn: 'root'
+})
+export class ResumeService {
+  private resumes: Resume[] = [
+    {
+      id: '1',
+      name: '张伟',
+      position: '高级前端工程师',
+      education: '硕士',
+      experience: 5,
+      skills: ['Angular', 'TypeScript', 'RxJS', 'SCSS'],
+      status: 'pending'
+    },
+    {
+      id: '2',
+      name: '李娜',
+      position: '后端开发工程师',
+      education: '本科',
+      experience: 3,
+      skills: ['Java', 'Spring Boot', 'MySQL', '微服务'],
+      status: 'approved'
+    },
+    {
+      id: '3',
+      name: '王强',
+      position: 'UI设计师',
+      education: '本科',
+      experience: 4,
+      skills: ['Figma', 'Sketch', 'Photoshop', '用户体验设计'],
+      status: 'rejected'
+    },
+    {
+      id: '4',
+      name: '赵敏',
+      position: '数据分析师',
+      education: '博士',
+      experience: 2,
+      skills: ['Python', 'SQL', '机器学习', '数据可视化'],
+      status: 'pending'
+    }
+  ];
+
+  getResumes(): Resume[] {
+    return this.resumes;
+  }
+}

+ 14 - 0
src/app/hr/status-card/status-card.html

@@ -0,0 +1,14 @@
+<!-- status-card.component.html -->
+<div class="status-card-container">
+  <div class="stat-card" *ngFor="let stat of stats">
+    <h3 class="stat-title">{{ stat.title }}</h3>
+    <div class="stat-value">{{ stat.value }}</div>
+    <div class="stat-change" [class.up]="stat.trend === 'up'" [class.down]="stat.trend === 'down'">
+      {{ stat.change }}
+      <svg width="12" height="12" viewBox="0 0 24 24" fill="none">
+        <path *ngIf="stat.trend === 'up'" d="M12 4L12 20M12 4L18 10M12 4L6 10" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+        <path *ngIf="stat.trend === 'down'" d="M12 20L12 4M12 20L18 14M12 20L6 14" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"/>
+      </svg>
+    </div>
+  </div>
+</div>

+ 56 - 0
src/app/hr/status-card/status-card.scss

@@ -0,0 +1,56 @@
+/* status-card.component.scss */
+.status-card-container {
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
+  gap: 1rem;
+  margin-bottom: 1.5rem;
+}
+
+.stat-card {
+  background: rgba(30, 41, 59, 0.8);
+  border-radius: 0.6rem;
+  padding: 1.2rem;
+  backdrop-filter: blur(10px);
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  transition: transform 0.3s ease, box-shadow 0.3s ease;
+
+  &:hover {
+    transform: translateY(-5px);
+    box-shadow: 0 10px 20px rgba(37, 99, 235, 0.2);
+    border-color: rgba(37, 99, 235, 0.5);
+  }
+}
+
+.stat-title {
+  font-size: 0.9rem;
+  color: rgba(255, 255, 255, 0.7);
+  margin: 0 0 0.5rem 0;
+  font-weight: 500;
+}
+
+.stat-value {
+  font-size: 1.8rem;
+  font-weight: 600;
+  color: white;
+  margin-bottom: 0.3rem;
+}
+
+.stat-change {
+  display: flex;
+  align-items: center;
+  gap: 0.3rem;
+  font-size: 0.9rem;
+  font-weight: 500;
+
+  &.up {
+    color: #10B981;
+  }
+
+  &.down {
+    color: #F59E0B;
+  }
+
+  svg {
+    margin-top: 2px;
+  }
+}

+ 23 - 0
src/app/hr/status-card/status-card.spec.ts

@@ -0,0 +1,23 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+
+import { StatusCard } from './status-card';
+
+describe('StatusCard', () => {
+  let component: StatusCard;
+  let fixture: ComponentFixture<StatusCard>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [StatusCard]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(StatusCard);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 19 - 0
src/app/hr/status-card/status-card.ts

@@ -0,0 +1,19 @@
+// status-card.component.ts
+import { Component } from '@angular/core';
+import { CommonModule } from '@angular/common';
+
+@Component({
+  selector: 'app-status-card',
+  standalone: true,
+  imports: [CommonModule],
+  templateUrl: './status-card.html',
+  styleUrls: ['./status-card.scss']
+})
+export class StatusCard {
+  stats = [
+    { title: '待处理简历', value: 24, change: '+5', trend: 'up' },
+    { title: '已通过', value: 56, change: '+12', trend: 'up' },
+    { title: '已拒绝', value: 32, change: '-3', trend: 'down' },
+    { title: '面试安排', value: 18, change: '+8', trend: 'up' }
+  ];
+}

+ 67 - 0
src/app/interviewee-auth/auth.html

@@ -0,0 +1,67 @@
+<!-- auth.component.html -->
+<div class="auth-container">
+  <!-- 装饰元素 -->
+  <div class="decorator decorator-1"></div>
+  <div class="decorator decorator-2"></div>
+  
+  <div class="auth-header">
+    <h1 class="auth-title">{{ isLoginMode() ? '用户登录' : '用户注册' }}</h1>
+    <p class="auth-subtitle">{{ isLoginMode() ? '欢迎回到未来世界' : '加入我们的科技社区' }}</p>
+  </div>
+
+  <!-- 错误消息 -->
+  @if (errorMessage()) {
+    <div class="message error-message">
+      {{ errorMessage() }}
+    </div>
+  }
+
+  <!-- 成功消息 -->
+  @if (successMessage()) {
+    <div class="message success-message">
+      {{ successMessage() }}
+    </div>
+  }
+
+  <form class="auth-form" (ngSubmit)="onSubmit()">
+    <div class="form-group">
+      <label class="form-label" for="username">用户名</label>
+      <input 
+        class="form-input" 
+        id="username" 
+        type="text" 
+        [(ngModel)]="username" 
+        name="username" 
+        required
+        placeholder="输入您的用户名"
+      >
+    </div>
+
+    <div class="form-group">
+      <label class="form-label" for="password">密码</label>
+      <input 
+        class="form-input" 
+        id="password" 
+        type="password" 
+        [(ngModel)]="password" 
+        name="password" 
+        required
+        placeholder="输入您的密码"
+      >
+      @if (!isLoginMode()) {
+        <small style="color: #94a3b8; font-size: 0.8rem;">密码长度必须大于8个字符</small>
+      }
+    </div>
+
+    <button class="submit-btn" type="submit">
+      {{ isLoginMode() ? '登录' : '注册' }}
+    </button>
+  </form>
+
+  <div class="mode-toggle">
+    {{ isLoginMode() ? '没有账号?' : '已有账号?' }}
+    <a class="toggle-link" (click)="toggleMode()">
+      {{ isLoginMode() ? '立即注册' : '立即登录' }}
+    </a>
+  </div>
+</div>

+ 13 - 0
src/app/interviewee-auth/auth.routes.ts

@@ -0,0 +1,13 @@
+import { Routes } from '@angular/router';
+
+
+export const AuthRoutes: Routes = [
+  { 
+    path: '', 
+    loadComponent: () => import('./auth').then(m=>m.Auth)
+  },
+  {
+    path:'home',
+    loadChildren: () => import('../interviewer/home/home.routes').then(m => m.HomeRoutes),
+  }
+];

+ 223 - 0
src/app/interviewee-auth/auth.scss

@@ -0,0 +1,223 @@
+/* auth.component.css */
+:host {
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  min-height: 100vh;
+  background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
+  font-family: 'Inter', 'Alibaba PuHuiTi', sans-serif;
+  color: white;
+}
+
+.auth-container {
+  width: 100%;
+  max-width: 420px;
+  padding: 2.5rem;
+  background: rgba(30, 41, 59, 0.8);
+  border-radius: 1rem;
+  box-shadow: 0 0 30px rgba(37, 99, 235, 0.3);
+  border: 1px solid rgba(37, 99, 235, 0.2);
+  backdrop-filter: blur(10px);
+  position: relative;
+  overflow: hidden;
+}
+
+.auth-container::before {
+  content: '';
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  width: 200%;
+  height: 200%;
+  background: radial-gradient(circle, rgba(37, 99, 235, 0.1) 0%, transparent 70%);
+  animation: rotate 20s linear infinite;
+  z-index: -1;
+}
+
+@keyframes rotate {
+  from {
+    transform: rotate(0deg);
+  }
+  to {
+    transform: rotate(360deg);
+  }
+}
+
+.auth-header {
+  text-align: center;
+  margin-bottom: 2rem;
+}
+
+.auth-title {
+  font-size: 1.8rem;
+  font-weight: 600;
+  margin-bottom: 0.5rem;
+  background: linear-gradient(90deg, #2563EB, #7C3AED);
+  -webkit-background-clip: text;
+  background-clip: text;
+  color: transparent;
+}
+
+.auth-subtitle {
+  font-size: 0.9rem;
+  color: #94a3b8;
+}
+
+.auth-form {
+  display: flex;
+  flex-direction: column;
+  gap: 1.5rem;
+}
+
+.form-group {
+  display: flex;
+  flex-direction: column;
+  gap: 0.5rem;
+}
+
+.form-label {
+  font-size: 0.9rem;
+  color: #e2e8f0;
+  display: flex;
+  align-items: center;
+  gap: 0.5rem;
+}
+
+.form-label::before {
+  content: '>';
+  color: #7C3AED;
+  font-weight: bold;
+}
+
+.form-input {
+  padding: 0.8rem 1rem;
+  background: rgba(15, 23, 42, 0.5);
+  border: 1px solid rgba(37, 99, 235, 0.3);
+  border-radius: 0.5rem;
+  color: white;
+  font-family: inherit;
+  font-size: 1rem;
+  transition: all 0.3s ease;
+}
+
+.form-input:focus {
+  outline: none;
+  border-color: #2563EB;
+  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2);
+}
+
+.submit-btn {
+  padding: 0.8rem;
+  background: linear-gradient(90deg, #2563EB, #7C3AED);
+  color: white;
+  border: none;
+  border-radius: 0.5rem;
+  font-size: 1rem;
+  font-weight: 600;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  margin-top: 0.5rem;
+  position: relative;
+  overflow: hidden;
+}
+
+.submit-btn::after {
+  content: '';
+  position: absolute;
+  top: -50%;
+  left: -50%;
+  width: 200%;
+  height: 200%;
+  background: linear-gradient(
+    to bottom right,
+    rgba(255, 255, 255, 0.3) 0%,
+    rgba(255, 255, 255, 0) 60%
+  );
+  transform: rotate(30deg);
+  transition: all 0.3s ease;
+}
+
+.submit-btn:hover {
+  transform: translateY(-2px);
+  box-shadow: 0 5px 15px rgba(37, 99, 235, 0.4);
+}
+
+.submit-btn:hover::after {
+  left: 100%;
+}
+
+.submit-btn:active {
+  transform: translateY(0);
+}
+
+.mode-toggle {
+  text-align: center;
+  margin-top: 1.5rem;
+  font-size: 0.9rem;
+  color: #94a3b8;
+}
+
+.toggle-link {
+  color: #7C3AED;
+  cursor: pointer;
+  font-weight: 600;
+  text-decoration: none;
+  transition: color 0.3s ease;
+}
+
+.toggle-link:hover {
+  color: #2563EB;
+  text-decoration: underline;
+}
+
+.message {
+  padding: 0.8rem;
+  border-radius: 0.5rem;
+  margin-bottom: 1rem;
+  font-size: 0.9rem;
+  text-align: center;
+}
+
+.error-message {
+  background-color: rgba(245, 158, 11, 0.1);
+  border: 1px solid rgba(245, 158, 11, 0.3);
+  color: #F59E0B;
+}
+
+.success-message {
+  background-color: rgba(16, 185, 129, 0.1);
+  border: 1px solid rgba(16, 185, 129, 0.3);
+  color: #10B981;
+}
+
+/* 科幻风格的装饰元素 */
+.decorator {
+  position: absolute;
+  background: rgba(37, 99, 235, 0.1);
+  border: 1px solid rgba(37, 99, 235, 0.3);
+}
+
+.decorator-1 {
+  width: 100px;
+  height: 100px;
+  border-radius: 50%;
+  top: -50px;
+  right: -50px;
+}
+
+.decorator-2 {
+  width: 60px;
+  height: 60px;
+  border-radius: 10px;
+  bottom: -30px;
+  left: -30px;
+  transform: rotate(45deg);
+}
+
+/* 响应式设计 */
+@media (max-width: 480px) {
+  .auth-container {
+    padding: 1.5rem;
+    margin: 0 1rem;
+  }
+}

+ 24 - 0
src/app/interviewee-auth/auth.spec.ts

@@ -0,0 +1,24 @@
+import { ComponentFixture, TestBed } from '@angular/core/testing';
+import { provideHttpClient } from '@angular/common/http';
+import { Auth } from './auth';
+
+describe('Auth', () => {
+  let component: Auth;
+  let fixture: ComponentFixture<Auth>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [Auth],
+      providers: [provideHttpClient()]
+    })
+    .compileComponents();
+
+    fixture = TestBed.createComponent(Auth);
+    component = fixture.componentInstance;
+    fixture.detectChanges();
+  });
+
+  it('should create', () => {
+    expect(component).toBeTruthy();
+  });
+});

+ 81 - 0
src/app/interviewee-auth/auth.ts

@@ -0,0 +1,81 @@
+import { Component, signal } from '@angular/core';
+import { CommonModule } from '@angular/common';
+import { FormsModule } from '@angular/forms';
+import { Router, RouterModule } from '@angular/router';
+import { HttpClient, HttpClientModule } from '@angular/common/http';
+
+@Component({
+  selector: 'app-auth',
+  standalone: true,
+  imports: [CommonModule, FormsModule, RouterModule, HttpClientModule],
+  templateUrl: './auth.html',
+  styleUrls: ['./auth.scss']
+})
+export class Auth {
+  constructor(private router: Router, private http: HttpClient) {}
+
+  // 使用signal管理状态
+  isLoginMode = signal(true);
+  username = signal('');
+  password = signal('');
+  errorMessage = signal('');
+  successMessage = signal('');
+
+  // 切换登录/注册模式
+  toggleMode() {
+    this.isLoginMode.set(!this.isLoginMode());
+    this.errorMessage.set('');
+    this.successMessage.set('');
+  }
+
+  // 处理表单提交
+  onSubmit() {
+    if (this.isLoginMode()) {
+      this.handleLogin();
+    } else {
+      this.handleRegister();
+    }
+  }
+
+  // 登录逻辑
+  private handleLogin() {
+    this.http.post<any>('http://localhost:3000/api/login', {
+      username: this.username(),
+      password: this.password()
+    }).subscribe({
+      next: (response) => {
+        if (response.success) {
+          this.successMessage.set('登录成功! 欢迎回来,' + this.username());
+          this.errorMessage.set('');
+          this.router.navigate(['/intervieweeauth/home']);
+        } else {
+          this.errorMessage.set(response.message);
+        }
+      },
+      error: (error) => {
+        this.errorMessage.set('登录失败,请稍后再试');
+      }
+    });
+  }
+
+  // 注册逻辑
+  private handleRegister() {
+    this.http.post<any>('http://localhost:3000/api/register', {
+      username: this.username(),
+      password: this.password()
+    }).subscribe({
+      next: (response) => {
+        if (response.success) {
+          this.successMessage.set('注册成功! 您现在可以登录了');
+          this.errorMessage.set('');
+          this.isLoginMode.set(true); // 自动切换到登录模式
+        } else {
+          this.errorMessage.set(response.message);
+        }
+      },
+      error: (error) => {
+        this.errorMessage.set('注册失败,请稍后再试');
+      }
+    });
+  }
+}

+ 4 - 0
src/app/interviewee-auth/environment.ts

@@ -0,0 +1,4 @@
+export const environment = {
+  production: false,
+  apiUrl: 'http://localhost:3000/api'
+};

+ 104 - 0
src/app/interviewee-auth/server.js

@@ -0,0 +1,104 @@
+const express = require('express');
+const mysql = require('mysql2/promise');
+const bodyParser = require('body-parser');
+const cors = require('cors');
+
+const app = express();
+app.use(bodyParser.json());
+app.use(cors());
+
+// MySQL数据库配置
+const dbConfig = {
+  host: 'localhost',
+  user: 'auth',
+  password: '123456',
+  database: 'auth_interviewee',
+  waitForConnections: true,
+  connectionLimit: 10,
+  queueLimit: 0
+};
+
+// 创建连接池
+const pool = mysql.createPool(dbConfig);
+
+// 创建用户表(如果不存在)
+async function initializeDatabase() {
+  const connection = await pool.getConnection();
+  try {
+    await connection.query(`
+      CREATE TABLE IF NOT EXISTS users (
+        id INT AUTO_INCREMENT PRIMARY KEY,
+        username VARCHAR(255) NOT NULL UNIQUE,
+        password VARCHAR(255) NOT NULL,
+        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
+      )
+    `);
+    console.log('Database initialized');
+  } catch (error) {
+    console.error('Database initialization error:', error);
+  } finally {
+    connection.release();
+  }
+}
+
+initializeDatabase();
+
+// 登录接口
+app.post('/api/login', async (req, res) => {
+  const { username, password } = req.body;
+  
+  try {
+    const [rows] = await pool.query(
+      'SELECT * FROM users WHERE username = ? AND password = ?', 
+      [username, password]
+    );
+    
+    if (rows.length > 0) {
+      res.json({ success: true, message: '登录成功', user: rows[0] });
+    } else {
+      res.status(401).json({ success: false, message: '用户名或密码错误' });
+    }
+  } catch (error) {
+    res.status(500).json({ success: false, message: '服务器错误' });
+  }
+});
+
+// 注册接口
+app.post('/api/register', async (req, res) => {
+  const { username, password } = req.body;
+  
+  // 验证密码长度
+  if (password.length <= 8) {
+    return res.status(400).json({ success: false, message: '密码长度必须大于8个字符' });
+  }
+  
+  try {
+    const [result] = await pool.query(
+      'INSERT INTO users (username, password) VALUES (?, ?)',
+      [username, password]
+    );
+    
+    res.json({ success: true, message: '注册成功' });
+  } catch (error) {
+    if (error.code === 'ER_DUP_ENTRY') {
+      res.status(400).json({ success: false, message: '用户名已存在' });
+    } else {
+      res.status(500).json({ success: false, message: '注册失败' });
+    }
+  }
+});
+
+const PORT = 3000;
+
+app.listen(PORT, () => {
+  console.log(`Server running on http://localhost:${PORT}`);
+});
+// 测试数据库连接
+pool.getConnection()
+  .then(conn => {
+    console.log('Successfully connected to MySQL');
+    conn.release();
+  })
+  .catch(err => {
+    console.error('MySQL connection error:', err);
+  });

BIN=BIN
src/app/interviewer/home/asstes/user-avatar.png


+ 55 - 0
src/app/interviewer/home/company-filter/company-filter.html

@@ -0,0 +1,55 @@
+<!-- company-filter.html -->
+<div class="company-filter-container">
+  <div class="filter-controls">
+    <div class="filter-group">
+      <label for="industry">行业</label>
+      <select id="industry" [(ngModel)]="selectedIndustry" class="glass-select">
+        <option *ngFor="let industry of industries" [value]="industry">{{ industry }}</option>
+      </select>
+    </div>
+    
+    <div class="filter-group">
+      <label for="region">地区</label>
+      <select id="region" [(ngModel)]="selectedRegion" class="glass-select">
+        <option *ngFor="let region of regions" [value]="region">{{ region }}</option>
+      </select>
+    </div>
+    
+    <div class="filter-group">
+      <label>距离: {{ radius }} km</label>
+      <input type="range" min="1" max="20" [(ngModel)]="radius" class="range-slider">
+    </div>
+  </div>
+  
+  <div class="content-area">
+    <div class="company-list">
+      <div 
+        *ngFor="let company of filteredCompanies" 
+        class="company-card"
+        [class.highlighted]="company.highlighted"
+        (click)="highlightCompany(company)">
+        <div class="company-logo">
+          <img [src]="company.logo" [alt]="company.name + ' logo'">
+        </div>
+        <div class="company-info">
+          <h3>{{ company.name }}</h3>
+          <div class="meta">
+            <span class="industry">{{ company.industry }}</span>
+            <span class="rating">
+              <i class="icon-star"></i>
+              {{ company.rating }}
+            </span>
+          </div>
+          <p class="location">
+            <i class="icon-pin"></i>
+            {{ company.location }} ({{ company.region }})
+          </p>
+          <div class="distance">
+            <i class="icon-location"></i>
+            {{ company.distance }} km
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</div>

Algúns arquivos non se mostraron porque demasiados arquivos cambiaron neste cambio