aril 1.2.17 → 2.0.1-dev.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/boot/bridge/src/mfe-bridge.d.ts +42 -2
  2. package/boot/config/apps/index.d.ts +7 -1
  3. package/boot/config/apps/src/custom-reuse-outlet.component.d.ts +37 -0
  4. package/boot/config/apps/src/custom-route-reuse-strategy.class.d.ts +156 -0
  5. package/boot/config/apps/src/nav-link-context-menu.service.d.ts +33 -0
  6. package/boot/config/apps/src/nav-link.directive.d.ts +29 -0
  7. package/boot/config/apps/src/nav.service.d.ts +198 -0
  8. package/boot/config/apps/src/route-close.service.d.ts +9 -0
  9. package/boot/config/apps/src/safe-navigate.d.ts +17 -0
  10. package/boot/config/apps/src/tab-aware-url-serializer.d.ts +22 -0
  11. package/boot/config/plugins/src/getNgZone.d.ts +9 -1
  12. package/boot/mfe/src/app.component.d.ts +15 -4
  13. package/boot/mfe/src/isolated-location-strategy.d.ts +57 -0
  14. package/esm2022/boot/bridge/src/mfe-bridge.mjs +36 -5
  15. package/esm2022/boot/config/api/src/api.service.mjs +12 -3
  16. package/esm2022/boot/config/apps/index.mjs +8 -2
  17. package/esm2022/boot/config/apps/src/apps.service.mjs +14 -6
  18. package/esm2022/boot/config/apps/src/custom-reuse-outlet.component.mjs +207 -0
  19. package/esm2022/boot/config/apps/src/custom-route-reuse-strategy.class.mjs +540 -0
  20. package/esm2022/boot/config/apps/src/nav-link-context-menu.service.mjs +105 -0
  21. package/esm2022/boot/config/apps/src/nav-link.directive.mjs +45 -0
  22. package/esm2022/boot/config/apps/src/nav.service.mjs +675 -0
  23. package/esm2022/boot/config/apps/src/route-close.service.mjs +19 -0
  24. package/esm2022/boot/config/apps/src/safe-navigate.mjs +50 -0
  25. package/esm2022/boot/config/apps/src/tab-aware-url-serializer.mjs +50 -0
  26. package/esm2022/boot/config/plugins/src/getNgZone.mjs +13 -5
  27. package/esm2022/boot/host/src/app.component.mjs +1 -2
  28. package/esm2022/boot/host/src/bootstrap.mjs +22 -7
  29. package/esm2022/boot/mfe/src/app.component.mjs +143 -39
  30. package/esm2022/boot/mfe/src/bootstrap.mjs +197 -20
  31. package/esm2022/boot/mfe/src/isolated-location-strategy.mjs +142 -0
  32. package/esm2022/keycloak/src/auth.interceptor.mjs +17 -2
  33. package/esm2022/provider/src/prodiveHost.mjs +3 -5
  34. package/esm2022/provider/src/prodiveHostRouter.mjs +88 -9
  35. package/esm2022/theme/layout/app/expandableMenu/expandable-menu.component.mjs +81 -19
  36. package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +6 -4
  37. package/esm2022/theme/layout/app/general-search/general-search.component.mjs +4 -4
  38. package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +6 -4
  39. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +422 -20
  40. package/esm2022/theme/layout/app/layout/mfe.layout.component.mjs +24 -35
  41. package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +6 -4
  42. package/esm2022/theme/layout/app/static-sidebar/static-sidebar.component.mjs +85 -27
  43. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +3 -3
  44. package/esm2022/theme/layout/service/breadcrumb-publisher.service.mjs +86 -0
  45. package/esm2022/theme/layout/service/tab-session.service.mjs +126 -0
  46. package/esm2022/ui/table/src/table.component.mjs +10 -10
  47. package/esm2022/ui-business/ref-value/src/ref-value.component.mjs +15 -7
  48. package/esm2022/util/sync-active-tab-route/src/sync-active-tab-route.directive.mjs +29 -9
  49. package/fesm2022/aril-app.component-s14ruALV.mjs +183 -0
  50. package/fesm2022/aril-app.component-s14ruALV.mjs.map +1 -0
  51. package/fesm2022/aril-boot-bridge.mjs +35 -4
  52. package/fesm2022/aril-boot-bridge.mjs.map +1 -1
  53. package/fesm2022/aril-boot-config-api.mjs +11 -2
  54. package/fesm2022/aril-boot-config-api.mjs.map +1 -1
  55. package/fesm2022/aril-boot-config-apps.mjs +1678 -10
  56. package/fesm2022/aril-boot-config-apps.mjs.map +1 -1
  57. package/fesm2022/aril-boot-config-plugins.mjs +12 -4
  58. package/fesm2022/aril-boot-config-plugins.mjs.map +1 -1
  59. package/fesm2022/aril-boot-host.mjs +21 -7
  60. package/fesm2022/aril-boot-host.mjs.map +1 -1
  61. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs +183 -0
  62. package/fesm2022/aril-boot-mfe-app.component-a34GeuUv.mjs.map +1 -0
  63. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs +631 -0
  64. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KFO_X7yR.mjs.map +1 -0
  65. package/fesm2022/aril-boot-mfe.mjs +5 -3
  66. package/fesm2022/aril-boot-mfe.mjs.map +1 -1
  67. package/fesm2022/aril-keycloak.mjs +16 -1
  68. package/fesm2022/aril-keycloak.mjs.map +1 -1
  69. package/fesm2022/aril-provider.mjs +90 -12
  70. package/fesm2022/aril-provider.mjs.map +1 -1
  71. package/fesm2022/aril-theme-layout.mjs +2630 -2017
  72. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  73. package/fesm2022/aril-ui-business-ref-value.mjs +14 -6
  74. package/fesm2022/aril-ui-business-ref-value.mjs.map +1 -1
  75. package/fesm2022/aril-ui-table.mjs +9 -9
  76. package/fesm2022/aril-ui-table.mjs.map +1 -1
  77. package/fesm2022/aril-util-sync-active-tab-route.mjs +28 -8
  78. package/fesm2022/aril-util-sync-active-tab-route.mjs.map +1 -1
  79. package/fesm2022/aril.mjs +354 -25
  80. package/fesm2022/aril.mjs.map +1 -1
  81. package/keycloak/src/auth.interceptor.d.ts +7 -0
  82. package/package.json +188 -188
  83. package/provider/src/prodiveHost.d.ts +1 -0
  84. package/theme/layout/app/expandableMenu/expandable-menu.component.d.ts +21 -4
  85. package/theme/layout/app/expandableMenu/expandable-menu.component.html +19 -5
  86. package/theme/layout/app/expandableMenu/expandable-menu.component.ts +69 -9
  87. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +1 -0
  88. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +3 -1
  89. package/theme/layout/app/general-search/general-search.component.html +2 -1
  90. package/theme/layout/app/general-search/general-search.component.ts +2 -2
  91. package/theme/layout/app/history/history-sidebar.component.html +3 -1
  92. package/theme/layout/app/history/history-sidebar.component.ts +3 -1
  93. package/theme/layout/app/layout/app.layout.component.d.ts +105 -5
  94. package/theme/layout/app/layout/app.layout.component.html +102 -1
  95. package/theme/layout/app/layout/app.layout.component.scss +372 -0
  96. package/theme/layout/app/layout/app.layout.component.ts +452 -13
  97. package/theme/layout/app/layout/mfe.layout.component.d.ts +7 -5
  98. package/theme/layout/app/layout/mfe.layout.component.ts +13 -39
  99. package/theme/layout/app/site-map/site-map-sidebar.component.html +1 -0
  100. package/theme/layout/app/site-map/site-map-sidebar.component.ts +3 -1
  101. package/theme/layout/app/static-sidebar/static-sidebar.component.d.ts +26 -5
  102. package/theme/layout/app/static-sidebar/static-sidebar.component.html +11 -5
  103. package/theme/layout/app/static-sidebar/static-sidebar.component.ts +68 -13
  104. package/theme/layout/app/topbar/app.topbar.component.html +0 -1
  105. package/theme/layout/app/topbar/app.topbar.component.scss +1 -1
  106. package/theme/layout/service/breadcrumb-publisher.service.d.ts +24 -0
  107. package/theme/layout/service/breadcrumb-publisher.service.ts +95 -0
  108. package/theme/layout/service/tab-session.service.d.ts +52 -0
  109. package/theme/layout/service/tab-session.service.ts +138 -0
  110. package/theme/styles/layout/_breadcrumb.scss +95 -0
  111. package/theme/styles/layout/_content.scss +2 -2
  112. package/ui/table/src/table.component.d.ts +2 -2
  113. package/ui-business/ref-value/src/ref-value.component.d.ts +4 -2
  114. package/util/sync-active-tab-route/src/sync-active-tab-route.directive.d.ts +15 -2
  115. package/boot/config/apps/src/reuse-strategy.d.ts +0 -4
  116. package/esm2022/boot/config/apps/src/reuse-strategy.mjs +0 -9
  117. package/esm2022/theme/layout/app/breadcrumb/app.breadcrumb.component.mjs +0 -107
  118. package/fesm2022/aril-app.component-wxP3y8dg.mjs +0 -81
  119. package/fesm2022/aril-app.component-wxP3y8dg.mjs.map +0 -1
  120. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs +0 -80
  121. package/fesm2022/aril-boot-mfe-app.component-7IjAmjz0.mjs.map +0 -1
  122. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs +0 -315
  123. package/fesm2022/aril-boot-mfe-aril-boot-mfe-KXDpUyv7.mjs.map +0 -1
  124. package/theme/layout/app/breadcrumb/app.breadcrumb.component.d.ts +0 -25
  125. package/theme/layout/app/breadcrumb/app.breadcrumb.component.html +0 -8
  126. package/theme/layout/app/breadcrumb/app.breadcrumb.component.ts +0 -127
@@ -1 +1 @@
1
- {"version":3,"file":"aril-boot-config-apps.mjs","sources":["../../projects/aril/boot/config/apps/src/route-permissions.ts","../../projects/aril/boot/config/apps/src/auth.guard.ts","../../projects/aril/boot/config/apps/src/showdowDOMWrapper.ts","../../projects/aril/boot/config/apps/src/apps.service.ts","../../projects/aril/boot/config/apps/src/interfaces.ts","../../projects/aril/boot/config/apps/src/reuse-strategy.ts","../../projects/aril/boot/config/apps/aril-boot-config-apps.ts"],"sourcesContent":["import { PluginMenuItem } from './interfaces';\r\n\r\nconst routePermissions = new Map<string, string[]>();\r\n\r\nexport function setRoutePermissions(menuItems: PluginMenuItem[]): void {\r\n\troutePermissions.clear();\r\n\tbuildPermissionsMap(menuItems);\r\n}\r\n\r\nexport function getRoutePermissions(url: string): string[] | undefined {\r\n\tconst normalizedUrl = url.split('?')[0].replace(/^\\//, '');\r\n return routePermissions.get(normalizedUrl);\r\n}\r\n\r\nfunction buildPermissionsMap(items: PluginMenuItem[]): void {\r\n\tfor (const item of items) {\r\n\t\tif (item.routerLink && item.permittedRoles?.length) {\r\n\t\t\tconst normalized = item.routerLink.replace(/^\\//, '');\r\n\t\t\troutePermissions.set(normalized, item.permittedRoles);\r\n\t\t}\r\n\r\n\t\tif (item.items?.length) {\r\n\t\t\tbuildPermissionsMap(item.items);\r\n\t\t}\r\n\t}\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\n\r\nimport { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular';\r\n\r\nimport { getRoutePermissions } from './route-permissions';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthGuard extends KeycloakAuthGuard {\r\n\tconstructor() {\r\n\t\tsuper(inject(Router), inject(KeycloakService));\r\n\t}\r\n\r\n\toverride async isAccessAllowed(\r\n\t\troute: ActivatedRouteSnapshot,\r\n\t\tstate: RouterStateSnapshot\r\n\t): Promise<boolean | UrlTree> {\r\n\t\tif (!this.authenticated) {\r\n\t\t\tawait this.keycloakAngular.login({ redirectUri: window.location.href });\r\n\t\t}\r\n\r\n\t\tconst permittedRoles = getRoutePermissions(state.url);\r\n\r\n\t\tif (permittedRoles?.length) {\r\n\t\t\tconst hasRole = permittedRoles.some((role) => this.roles.includes(role));\r\n\t\t\tif (!hasRole) {\r\n\t\t\t\treturn this.router.createUrlTree(['/forbidden']);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.authenticated;\r\n\t}\r\n}\r\n","import { Component, ElementRef, OnInit, Renderer2, ViewChild, ViewEncapsulation, inject } from '@angular/core';\r\n\r\nimport { WebComponentWrapper } from '@angular-architects/module-federation-tools';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\ttemplate: '<div #vc></div>',\r\n\tencapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ShadowDOMWrapperComponent extends WebComponentWrapper implements OnInit {\r\n\t@ViewChild('vc', { read: ElementRef, static: true }) override vc!: ElementRef;\r\n\r\n\tprivate renderer = inject(Renderer2);\r\n\r\n\tngOnInit(): void {\r\n\t\tconst shadowRoot = this.vc.nativeElement.parentNode;\r\n\t\tconst styleUrls = this['route'].snapshot.data.styleUrls || [];\r\n\r\n\t\t// Inject styles into the Shadow DOM\r\n\t\tstyleUrls.forEach((url: string) => {\r\n\t\t\tconst link = this.renderer.createElement('link');\r\n\t\t\tlink.setAttribute('rel', 'stylesheet');\r\n\t\t\tlink.setAttribute('type', 'text/css');\r\n\t\t\tlink.setAttribute('href', url);\r\n\t\t\tthis.renderer.appendChild(shadowRoot, link);\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { Router, Routes } from '@angular/router';\r\n\r\nimport {\r\n\tWebComponentWrapper,\r\n\tWebComponentWrapperOptions,\r\n\tstartsWith\r\n} from '@angular-architects/module-federation-tools';\r\nimport { KeycloakService } from 'keycloak-angular';\r\nimport { Observable, catchError, map, of } from 'rxjs';\r\n\r\nimport { ForbiddenComponent, NotFoundComponent } from 'aril/boot/pages';\r\n\r\nimport { AuthGuard } from './auth.guard';\r\nimport { AppsDTO, ExtensionConfig, PluginConfig, PluginMenuItem } from './interfaces';\r\nimport { setRoutePermissions } from './route-permissions';\r\nimport { ShadowDOMWrapperComponent } from './showdowDOMWrapper';\r\n\r\nexport interface MicroAppInitResult {\r\n\tmenuItems: PluginMenuItem[];\r\n\tplugins: Record<string, ExtensionConfig>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MicroAppService {\r\n\tprivate readonly router = inject(Router);\r\n\tprivate readonly keycloak = inject(KeycloakService);\r\n\r\n\tprivate userRoles: string[] = [];\r\n\r\n\tinit(httpClient: HttpClient, hostAPI: string): Observable<MicroAppInitResult> {\r\n\t\tthis.userRoles = this.keycloak.getUserRoles();\r\n\t\treturn httpClient\r\n\t\t\t.get<AppsDTO>(isDevMode() ? './assets/local-configs/app.local.json' : hostAPI + '/ui-sidebar-configs')\r\n\t\t\t.pipe(\r\n\t\t\t\tmap((apps) => {\r\n\t\t\t\t\tsetRoutePermissions(apps.menuItems);\r\n\t\t\t\t\tconst routes = this.buildRoutes([...apps.modules, ...apps.plugins]);\r\n\r\n\t\t\t\t\tthis.router.resetConfig([\r\n\t\t\t\t\t\t...this.router.config,\r\n\t\t\t\t\t\t...routes,\r\n\t\t\t\t\t\t{ path: 'forbidden', component: ForbiddenComponent },\r\n\t\t\t\t\t\t{ path: '**', component: NotFoundComponent }\r\n\t\t\t\t\t]);\r\n\r\n\t\t\t\t\tconst filteredMenuItems = this.filterMenuItemsByRole(apps.menuItems);\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tmenuItems: [\r\n\t\t\t\t\t\t\t{ root: true, label: { tr: 'Anasayfa', en: 'Home' }, icon: 'pi pi-fw pi-home', routerLink: '/' } as PluginMenuItem,\r\n\t\t\t\t\t\t\t...filteredMenuItems\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tplugins: apps.extensions || {}\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\tconsole.log('Error Micro Apps Loading', err);\r\n\t\t\t\t\treturn of<MicroAppInitResult>({ menuItems: [], plugins: {} });\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n\tbuildRoutes(options: PluginConfig[]): Routes {\r\n\t\tconst routes: Routes = options.map((options) => {\r\n\t\t\treturn {\r\n\t\t\t\tmatcher: startsWith(options.remoteName),\r\n\t\t\t\tcomponent: options.shadowDomPassive ? WebComponentWrapper : ShadowDOMWrapperComponent,\r\n\t\t\t\tdata: options as WebComponentWrapperOptions,\r\n\t\t\t\tcanActivate: [AuthGuard]\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\treturn routes;\r\n\t}\r\n\r\n\tprivate filterMenuItemsByRole(items: PluginMenuItem[]): PluginMenuItem[] {\r\n\t\treturn items.reduce<PluginMenuItem[]>((acc, item) => {\r\n\t\t\tif (!this.hasPermission(item.permittedRoles)) {\r\n\t\t\t\treturn acc;\r\n\t\t\t}\r\n\r\n\t\t\tconst filteredItem = { ...item };\r\n\r\n\t\t\tif (filteredItem.items?.length) {\r\n\t\t\t\tfilteredItem.items = this.filterMenuItemsByRole(filteredItem.items);\r\n\r\n\t\t\t\tif (!filteredItem.items.length && !filteredItem.routerLink) {\r\n\t\t\t\t\treturn acc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tacc.push(filteredItem);\r\n\t\t\treturn acc;\r\n\t\t}, []);\r\n\t}\r\n\r\n\tprivate hasPermission(permittedRoles?: string[]): boolean {\r\n\t\tif (!permittedRoles?.length) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn permittedRoles.some((role) => this.userRoles.includes(role));\r\n\t}\r\n}\r\n","import { MenuItemCommandEvent } from 'primeng/api';\r\n\r\nimport { WebComponentWrapperOptions } from '@angular-architects/module-federation-tools';\r\n\r\nexport enum Apps {\r\n\tTHOR = 'thor',\r\n\tCRM = 'crm',\r\n\tWDM = 'wdm',\r\n\tBILLING = 'billing',\r\n\tPAYMENT = 'payment',\r\n\tYEAP = 'yeap',\r\n\tMW = 'mw',\r\n\tLENA = 'lena',\r\n\tHES = 'hes',\r\n\tCTS = 'cts',\r\n\tSIS = 'sis',\r\n\tMNG = 'mng',\r\n\tMDM = 'mdm',\r\n\tSTATE_MACHINE = 'state-machine',\r\n\tREPORT = 'report',\r\n\tLGC = 'lgc',\r\n\tDMS = 'dms'\r\n}\r\n\r\nexport interface AppsDTO {\r\n\tversion: number;\r\n\tmodules: PluginConfig[];\r\n\tplugins: PluginConfig[];\r\n\textensions: Record<string, ExtensionConfig>;\r\n\tmenuItems: PluginMenuItem[];\r\n}\r\n\r\nexport interface ExtensionConfig {\r\n\toptions: PluginConfig;\r\n}\r\n\r\nexport type PluginConfig = WebComponentWrapperOptions & {\r\n\tid?: string;\r\n\tremoteName: string;\r\n\tshadowDomPassive: boolean;\r\n\tpermittedRoles?: string[];\r\n};\r\n\r\nexport interface MenuItemAction {\r\n\tmethod?: 'GET' | 'POST';\r\n\turl: string;\r\n\tbody?: any;\r\n\tsuccessRoute: string;\r\n\tsuccessRouteResponseKey?: string;\r\n}\r\n\r\nexport interface PluginMenuItem {\r\n\trouterLink?: string;\r\n\ticon?: string;\r\n\tlabel: {\r\n\t\t[languageCode: string]: string;\r\n\t};\r\n\titems?: PluginMenuItem[];\r\n\tpermittedRoles?: string[];\r\n\taction?: MenuItemAction;\r\n\r\n\t// UI fields\r\n\tseparator?: boolean;\r\n\troot?: boolean;\r\n\tpath?: string;\r\n\tdisabled?: boolean;\r\n\tcommand?(event: MenuItemCommandEvent): void;\r\n}\r\n","import { ActivatedRouteSnapshot, BaseRouteReuseStrategy } from '@angular/router';\r\n\r\nexport class ArilReuseStrategy extends BaseRouteReuseStrategy {\r\n\toverride shouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\r\n\t\tif (curr.firstChild?.routeConfig?.data?.['remoteEntry'] === future.firstChild?.routeConfig?.data?.['remoteEntry'])\r\n\t\t\treturn false;\r\n\r\n\t\treturn future?.routeConfig === curr?.routeConfig && JSON.stringify(future?.params) === JSON.stringify(curr?.params);\r\n\t}\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aril-boot-config-apps.mjs","sources":["../../projects/aril/boot/config/apps/src/route-permissions.ts","../../projects/aril/boot/config/apps/src/auth.guard.ts","../../projects/aril/boot/config/apps/src/custom-reuse-outlet.component.ts","../../projects/aril/boot/config/apps/src/showdowDOMWrapper.ts","../../projects/aril/boot/config/apps/src/apps.service.ts","../../projects/aril/boot/config/apps/src/interfaces.ts","../../projects/aril/boot/config/apps/src/route-close.service.ts","../../projects/aril/boot/config/apps/src/custom-route-reuse-strategy.class.ts","../../projects/aril/boot/config/apps/src/safe-navigate.ts","../../projects/aril/boot/config/apps/src/nav.service.ts","../../projects/aril/boot/config/apps/src/nav-link-context-menu.service.ts","../../projects/aril/boot/config/apps/src/nav-link.directive.ts","../../projects/aril/boot/config/apps/src/tab-aware-url-serializer.ts","../../projects/aril/boot/config/apps/aril-boot-config-apps.ts"],"sourcesContent":["import { PluginMenuItem } from './interfaces';\r\n\r\nconst routePermissions = new Map<string, string[]>();\r\n\r\nexport function setRoutePermissions(menuItems: PluginMenuItem[]): void {\r\n\troutePermissions.clear();\r\n\tbuildPermissionsMap(menuItems);\r\n}\r\n\r\nexport function getRoutePermissions(url: string): string[] | undefined {\r\n\tconst normalizedUrl = url.split('?')[0].replace(/^\\//, '');\r\n return routePermissions.get(normalizedUrl);\r\n}\r\n\r\nfunction buildPermissionsMap(items: PluginMenuItem[]): void {\r\n\tfor (const item of items) {\r\n\t\tif (item.routerLink && item.permittedRoles?.length) {\r\n\t\t\tconst normalized = item.routerLink.replace(/^\\//, '');\r\n\t\t\troutePermissions.set(normalized, item.permittedRoles);\r\n\t\t}\r\n\r\n\t\tif (item.items?.length) {\r\n\t\t\tbuildPermissionsMap(item.items);\r\n\t\t}\r\n\t}\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Router, RouterStateSnapshot, UrlTree } from '@angular/router';\r\n\r\nimport { KeycloakAuthGuard, KeycloakService } from 'keycloak-angular';\r\n\r\nimport { getRoutePermissions } from './route-permissions';\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class AuthGuard extends KeycloakAuthGuard {\r\n\tconstructor() {\r\n\t\tsuper(inject(Router), inject(KeycloakService));\r\n\t}\r\n\r\n\toverride async isAccessAllowed(\r\n\t\troute: ActivatedRouteSnapshot,\r\n\t\tstate: RouterStateSnapshot\r\n\t): Promise<boolean | UrlTree> {\r\n\t\tif (!this.authenticated) {\r\n\t\t\tawait this.keycloakAngular.login({ redirectUri: window.location.href });\r\n\t\t}\r\n\r\n\t\tconst permittedRoles = getRoutePermissions(state.url);\r\n\r\n\t\tif (permittedRoles?.length) {\r\n\t\t\tconst hasRole = permittedRoles.some((role) => this.roles.includes(role));\r\n\t\t\tif (!hasRole) {\r\n\t\t\t\treturn this.router.createUrlTree(['/forbidden']);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn this.authenticated;\r\n\t}\r\n}\r\n","import {\r\n AfterContentInit,\r\n AfterViewInit,\r\n Component,\r\n ElementRef,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport {\r\n LoadRemoteModuleOptions,\r\n loadRemoteModule,\r\n} from '@angular-architects/module-federation-runtime';\r\n\r\nexport type WebComponentWrapperOptions = LoadRemoteModuleOptions & {\r\n elementName: string;\r\n};\r\n\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'mft-wc-wrapper',\r\n template: '<div #vc></div>',\r\n})\r\n// eslint-disable-next-line @angular-eslint/component-class-suffix\r\nexport class ArilWebComponentWrapper implements OnInit, AfterContentInit, AfterViewInit, OnChanges, OnDestroy {\r\n @ViewChild('vc', { read: ElementRef, static: true })\r\n vc?: ElementRef;\r\n\r\n @Input() options?: WebComponentWrapperOptions;\r\n @Input() props?: { [prop: string]: unknown };\r\n @Input() events?: { [event: string]: (event: Event) => void };\r\n\r\n element?: HTMLElement;\r\n private isDestroyed = false;\r\n // setupEvents tarafından bağlanan listener'ları izleriz — ngOnDestroy/yeniden bind sırasında\r\n // doğru şekilde kaldırılmaları için.\r\n private registeredEvents: { name: string; handler: (e: Event) => void }[] = [];\r\n private routeSub?: { unsubscribe(): void };\r\n // Route reuse stratejisi ile wrapper arasındaki sözleşme:\r\n // - `needsRestore`: strategy retrieve sırasında set eder; ngAfterViewInit element'i view'a ekler.\r\n // - `propsUpdated`: restore sonrası populateProps çağrısının ngOnChanges ile çakışmasını\r\n // engellemek için kullanılır (idempotency flag).\r\n needsRestore = false;\r\n propsUpdated = false;\r\n\r\n constructor(private route: ActivatedRoute) {}\r\n\r\n ngOnInit(): void {\r\n // Component tekrar eklendiğinde (reuse durumunda)\r\n // Element restore işlemini dene (view hazır olmayabilir, o durumda ngAfterViewInit'te tekrar denenecek)\r\n if (this.element) {\r\n console.log('[ArilWC] ngOnInit: Element mevcut, restore deneniyor...');\r\n // setTimeout ile bir sonraki tick'te dene (view henüz hazır olmayabilir)\r\n setTimeout(() => {\r\n this.restoreElement();\r\n }, 0);\r\n }\r\n }\r\n\r\n ngOnChanges(): void {\r\n if (!this.element || this.isDestroyed) return;\r\n\r\n this.populateProps();\r\n }\r\n\r\n private populateProps() {\r\n if (!this.element || !this.props) return;\r\n\r\n // Custom element'e dinamik prop set ediyoruz; HTMLElement bunun için index signature\r\n // taşımıyor, bu yüzden Record cast'i ile yazıyoruz.\r\n const target = this.element as HTMLElement & Record<string, unknown>;\r\n for (const prop in this.props) {\r\n target[prop] = this.props[prop];\r\n }\r\n }\r\n\r\n private setupEvents() {\r\n if (!this.element) return;\r\n // İdempotent: önce eski listener'ları kaldır, sonra yenilerini bağla.\r\n this.teardownEvents();\r\n if (!this.events) return;\r\n\r\n for (const event in this.events) {\r\n const handler = this.events[event];\r\n this.element.addEventListener(event, handler);\r\n this.registeredEvents.push({ name: event, handler });\r\n }\r\n }\r\n\r\n private teardownEvents() {\r\n if (!this.element) {\r\n this.registeredEvents = [];\r\n return;\r\n }\r\n for (const { name, handler } of this.registeredEvents) {\r\n this.element.removeEventListener(name, handler);\r\n }\r\n this.registeredEvents = [];\r\n }\r\n\r\n private restoreElement(): void {\r\n if (!this.element) {\r\n console.warn('restoreElement: element yok');\r\n return;\r\n }\r\n\r\n if (!this.vc?.nativeElement) {\r\n console.warn('restoreElement: vc.nativeElement yok, tekrar denenecek');\r\n // View henüz hazır değilse, bir sonraki lifecycle hook'ta tekrar dene\r\n return;\r\n }\r\n\r\n // Hidden container'dan element'i al\r\n const hiddenContainer = this.getHiddenContainer();\r\n \r\n if (hiddenContainer.contains(this.element)) {\r\n // Element hidden container'da, geri al\r\n hiddenContainer.removeChild(this.element);\r\n this.vc.nativeElement.appendChild(this.element);\r\n this.populateProps();\r\n console.log('Web component hidden container\\'dan geri alındı ve DOM\\'a eklendi');\r\n } else if (!this.vc.nativeElement.contains(this.element)) {\r\n // Element başka bir yerdeyse veya hiçbir yerde değilse, direkt ekle\r\n if (this.element.parentNode) {\r\n this.element.parentNode.removeChild(this.element);\r\n }\r\n this.vc.nativeElement.appendChild(this.element);\r\n this.populateProps();\r\n console.log('Web component DOM\\'a geri eklendi');\r\n } else {\r\n // Element zaten DOM'da, sadece props'ları güncelle\r\n this.populateProps();\r\n console.log('Web component zaten DOM\\'da, props güncellendi');\r\n }\r\n }\r\n\r\n private getHiddenContainer(): HTMLElement {\r\n const slot = globalThis as typeof globalThis & { __arilWebComponentHiddenContainer?: HTMLElement };\r\n let container = slot.__arilWebComponentHiddenContainer;\r\n if (!container) {\r\n container = document.createElement('div');\r\n container.style.display = 'none';\r\n container.style.position = 'absolute';\r\n container.style.left = '-9999px';\r\n container.style.top = '-9999px';\r\n container.style.visibility = 'hidden';\r\n document.body.appendChild(container);\r\n slot.__arilWebComponentHiddenContainer = container;\r\n }\r\n return container;\r\n }\r\n\r\n async ngAfterContentInit() {\r\n const options =\r\n this.options ?? (this.route.snapshot.data as WebComponentWrapperOptions);\r\n\r\n if (!options) {\r\n console.warn('Web component options bulunamadı');\r\n return;\r\n }\r\n\r\n // Eğer element zaten varsa (reuse durumunda), restore işlemi ngAfterViewInit'te yapılacak\r\n if (this.element) {\r\n return;\r\n }\r\n\r\n try {\r\n await loadRemoteModule(options);\r\n\r\n this.element = document.createElement(options.elementName);\r\n\r\n // Tab izolasyonu için tab kimliğini element'e attribute olarak yaz. MFE bootstrap.ts\r\n // `connectedCallback`'te bu attribute'u okuyup kendine ait yeni bir Angular Application\r\n // yaratır → her tab kendi Injector + Router'ına sahip olur. Subscribe ile sonraki\r\n // `_tab` değişimlerini de yakala (firstCheckForRoute replaceUrl sonrası).\r\n this.routeSub = this.route.queryParams.subscribe((params) => {\r\n const tabId = (params['_tab'] as string | undefined) ?? '';\r\n if (tabId && this.element && this.element.getAttribute('aril-tab-id') !== tabId) {\r\n this.element.setAttribute('aril-tab-id', tabId);\r\n }\r\n });\r\n\r\n this.populateProps();\r\n this.setupEvents();\r\n\r\n if (this.vc?.nativeElement) {\r\n this.vc.nativeElement.appendChild(this.element);\r\n }\r\n } catch (error) {\r\n console.error('Web component yüklenirken hata:', error);\r\n }\r\n }\r\n\r\n ngAfterViewInit(): void {\r\n // View hazır olduğunda, eğer element varsa (reuse durumunda) restore et\r\n if (this.element) {\r\n console.log('ngAfterViewInit: Element mevcut, restore deneniyor...');\r\n\r\n // Strategy `needsRestore` flag'i set etmişse: element hidden container'dan çıkarılmış\r\n // ama view henüz hazır olmadığı için view'a eklenememiş. Şimdi ekle.\r\n if (this.needsRestore) {\r\n this.needsRestore = false;\r\n if (this.vc?.nativeElement && !this.vc.nativeElement.contains(this.element)) {\r\n this.vc.nativeElement.appendChild(this.element);\r\n this.populateProps();\r\n this.propsUpdated = true;\r\n console.log('Web component element component view\\'a eklendi (ngAfterViewInit)');\r\n }\r\n } else if (!this.propsUpdated) {\r\n // Normal restore işlemi (eğer props güncellenmemişse)\r\n this.restoreElement();\r\n this.propsUpdated = true;\r\n } else {\r\n // Element zaten view'da, sadece props'ları güncelle\r\n this.populateProps();\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy(): void {\r\n // Route reuse stratejisi kullanıldığında, component destroy edilmez\r\n // Route reuse stratejisi store() metodunda element'i hidden container'a taşıyacak.\r\n // Yine de gerçekten destroy edildiğimiz senaryolarda (farklı remote, tab cleanup vs.)\r\n // event listener'ları + queryParams subscription sızdırmamak için kaldırırız.\r\n this.teardownEvents();\r\n this.routeSub?.unsubscribe();\r\n this.routeSub = undefined;\r\n this.isDestroyed = true;\r\n }\r\n}\r\n","import { Component, ElementRef, OnInit, Renderer2, ViewChild, ViewEncapsulation, inject } from '@angular/core';\r\n\r\nimport { WebComponentWrapper } from '@angular-architects/module-federation-tools';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\ttemplate: '<div #vc></div>',\r\n\tencapsulation: ViewEncapsulation.ShadowDom\r\n})\r\nexport class ShadowDOMWrapperComponent extends WebComponentWrapper implements OnInit {\r\n\t@ViewChild('vc', { read: ElementRef, static: true }) override vc!: ElementRef;\r\n\r\n\tprivate renderer = inject(Renderer2);\r\n\r\n\tngOnInit(): void {\r\n\t\tconst shadowRoot = this.vc.nativeElement.parentNode;\r\n\t\tconst styleUrls = this['route'].snapshot.data.styleUrls || [];\r\n\r\n\t\t// Inject styles into the Shadow DOM\r\n\t\tstyleUrls.forEach((url: string) => {\r\n\t\t\tconst link = this.renderer.createElement('link');\r\n\t\t\tlink.setAttribute('rel', 'stylesheet');\r\n\t\t\tlink.setAttribute('type', 'text/css');\r\n\t\t\tlink.setAttribute('href', url);\r\n\t\t\tthis.renderer.appendChild(shadowRoot, link);\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject, isDevMode } from '@angular/core';\r\nimport { Router, Routes } from '@angular/router';\r\n\r\nimport {\r\n\tWebComponentWrapperOptions,\r\n\tstartsWith\r\n} from '@angular-architects/module-federation-tools';\r\nimport { KeycloakService } from 'keycloak-angular';\r\nimport { Observable, catchError, map, of } from 'rxjs';\r\n\r\nimport { ForbiddenComponent, NotFoundComponent } from 'aril/boot/pages';\r\n\r\nimport { AuthGuard } from './auth.guard';\r\nimport { ArilWebComponentWrapper } from './custom-reuse-outlet.component';\r\nimport { AppsDTO, ExtensionConfig, PluginConfig, PluginMenuItem } from './interfaces';\r\nimport { setRoutePermissions } from './route-permissions';\r\nimport { ShadowDOMWrapperComponent } from './showdowDOMWrapper';\r\n\r\nexport interface MicroAppInitResult {\r\n\tmenuItems: PluginMenuItem[];\r\n\tplugins: Record<string, ExtensionConfig>;\r\n}\r\n\r\n@Injectable({ providedIn: 'root' })\r\nexport class MicroAppService {\r\n\tprivate readonly router = inject(Router);\r\n\tprivate readonly keycloak = inject(KeycloakService);\r\n\r\n\tprivate userRoles: string[] = [];\r\n\r\n\tinit(httpClient: HttpClient, hostAPI: string): Observable<MicroAppInitResult> {\r\n\t\tthis.userRoles = this.keycloak.getUserRoles();\r\n\t\treturn httpClient\r\n\t\t\t.get<AppsDTO>(isDevMode() ? './assets/local-configs/app.local.json' : hostAPI + '/ui-sidebar-configs')\r\n\t\t\t.pipe(\r\n\t\t\t\tmap((apps) => {\r\n\t\t\t\t\tsetRoutePermissions(apps.menuItems);\r\n\t\t\t\t\tconst routes = this.buildRoutes([...apps.modules, ...apps.plugins]);\r\n\r\n\t\t\t\t\tthis.router.resetConfig([\r\n\t\t\t\t\t\t...this.router.config,\r\n\t\t\t\t\t\t...routes,\r\n\t\t\t\t\t\t{ path: 'forbidden', component: ForbiddenComponent },\r\n\t\t\t\t\t\t{ path: '**', component: NotFoundComponent }\r\n\t\t\t\t\t]);\r\n\r\n\t\t\t\t\tconst filteredMenuItems = this.filterMenuItemsByRole(apps.menuItems);\r\n\t\t\t\t\treturn {\r\n\t\t\t\t\t\tmenuItems: [\r\n\t\t\t\t\t\t\t{ root: true, label: { tr: 'Anasayfa', en: 'Home' }, icon: 'pi pi-fw pi-home', routerLink: '/' } as PluginMenuItem,\r\n\t\t\t\t\t\t\t...filteredMenuItems\r\n\t\t\t\t\t\t],\r\n\t\t\t\t\t\tplugins: apps.extensions || {}\r\n\t\t\t\t\t};\r\n\t\t\t\t}),\r\n\t\t\t\tcatchError((err) => {\r\n\t\t\t\t\tconsole.log('Error Micro Apps Loading', err);\r\n\t\t\t\t\treturn of<MicroAppInitResult>({ menuItems: [], plugins: {} });\r\n\t\t\t\t})\r\n\t\t\t);\r\n\t}\r\n\r\n\tbuildRoutes(options: PluginConfig[]): Routes {\r\n\t\tconst routes: Routes = options.map((opt) => {\r\n\t\t\tif (!opt.remoteName) {\r\n\t\t\t\t// `remoteName` boşsa Strategy `getRouteKey` doğru tab key üretemiyor → tab izolasyonu\r\n\t\t\t\t// silent kırılıyordu. Fail-fast: config hatasını boot-time'da yakala, runtime'da\r\n\t\t\t\t// kullanıcı boş tab'lar görmesin.\r\n\t\t\t\tthrow new Error(\r\n\t\t\t\t\t`[MicroAppService.buildRoutes] PluginConfig.remoteName eksik. ` +\r\n\t\t\t\t\t`Route oluşturulamaz — config kontrol et: ${JSON.stringify(opt)}`\r\n\t\t\t\t);\r\n\t\t\t}\r\n\t\t\treturn {\r\n\t\t\t\tmatcher: startsWith(opt.remoteName),\r\n\t\t\t\tcomponent: opt.shadowDomPassive ? ArilWebComponentWrapper : ShadowDOMWrapperComponent,\r\n\t\t\t\tdata: opt as WebComponentWrapperOptions,\r\n\t\t\t\tcanActivate: [AuthGuard]\r\n\t\t\t};\r\n\t\t});\r\n\r\n\t\treturn routes;\r\n\t}\r\n\r\n\tprivate filterMenuItemsByRole(items: PluginMenuItem[]): PluginMenuItem[] {\r\n\t\treturn items.reduce<PluginMenuItem[]>((acc, item) => {\r\n\t\t\tif (!this.hasPermission(item.permittedRoles)) {\r\n\t\t\t\treturn acc;\r\n\t\t\t}\r\n\r\n\t\t\tconst filteredItem = { ...item };\r\n\r\n\t\t\tif (filteredItem.items?.length) {\r\n\t\t\t\tfilteredItem.items = this.filterMenuItemsByRole(filteredItem.items);\r\n\r\n\t\t\t\tif (!filteredItem.items.length && !filteredItem.routerLink) {\r\n\t\t\t\t\treturn acc;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\tacc.push(filteredItem);\r\n\t\t\treturn acc;\r\n\t\t}, []);\r\n\t}\r\n\r\n\tprivate hasPermission(permittedRoles?: string[]): boolean {\r\n\t\tif (!permittedRoles?.length) {\r\n\t\t\treturn true;\r\n\t\t}\r\n\t\treturn permittedRoles.some((role) => this.userRoles.includes(role));\r\n\t}\r\n}\r\n","import { MenuItemCommandEvent } from 'primeng/api';\r\n\r\nimport { WebComponentWrapperOptions } from '@angular-architects/module-federation-tools';\r\n\r\nexport enum Apps {\r\n\tTHOR = 'thor',\r\n\tCRM = 'crm',\r\n\tWDM = 'wdm',\r\n\tBILLING = 'billing',\r\n\tPAYMENT = 'payment',\r\n\tYEAP = 'yeap',\r\n\tMW = 'mw',\r\n\tLENA = 'lena',\r\n\tHES = 'hes',\r\n\tCTS = 'cts',\r\n\tSIS = 'sis',\r\n\tMNG = 'mng',\r\n\tMDM = 'mdm',\r\n\tSTATE_MACHINE = 'state-machine',\r\n\tREPORT = 'report',\r\n\tLGC = 'lgc',\r\n\tDMS = 'dms'\r\n}\r\n\r\nexport interface AppsDTO {\r\n\tversion: number;\r\n\tmodules: PluginConfig[];\r\n\tplugins: PluginConfig[];\r\n\textensions: Record<string, ExtensionConfig>;\r\n\tmenuItems: PluginMenuItem[];\r\n}\r\n\r\nexport interface ExtensionConfig {\r\n\toptions: PluginConfig;\r\n}\r\n\r\nexport type PluginConfig = WebComponentWrapperOptions & {\r\n\tid?: string;\r\n\tremoteName: string;\r\n\tshadowDomPassive: boolean;\r\n\tpermittedRoles?: string[];\r\n};\r\n\r\nexport interface MenuItemAction {\r\n\tmethod?: 'GET' | 'POST';\r\n\turl: string;\r\n\tbody?: any;\r\n\tsuccessRoute: string;\r\n\tsuccessRouteResponseKey?: string;\r\n}\r\n\r\nexport interface PluginMenuItem {\r\n\trouterLink?: string;\r\n\ticon?: string;\r\n\tlabel: {\r\n\t\t[languageCode: string]: string;\r\n\t};\r\n\titems?: PluginMenuItem[];\r\n\tpermittedRoles?: string[];\r\n\taction?: MenuItemAction;\r\n\r\n\t// UI fields\r\n\tseparator?: boolean;\r\n\troot?: boolean;\r\n\tpath?: string;\r\n\tdisabled?: boolean;\r\n\tcommand?(event: MenuItemCommandEvent): void;\r\n}\r\n","import { Injectable, signal } from '@angular/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class RouteCloseService {\r\n deleteRoute = signal<{ key: string | null }>({ key: null });\r\n deleteStoredRoute(key: string) {\r\n this.deleteRoute.update(() => ({ key }));\r\n }\r\n}\r\n","import { ComponentRef, DestroyRef, ElementRef, Injectable, OnDestroy, effect, inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, DetachedRouteHandle, RouteReuseStrategy } from '@angular/router';\r\n\r\nimport { PluginConfig } from './interfaces';\r\nimport { RouteCloseService } from './route-close.service';\r\n\r\n/**\r\n * Angular Router `DetachedRouteHandle`'ı resmi olarak opaque (`{}`) bir type.\r\n * Internal shape'i public API'da yok, ama biz preserve/restore için componentRef'e\r\n * erişmemiz gerekiyor. Bu yüzden internal yapıyı minimal şekilde modelliyoruz.\r\n */\r\ntype InternalDetachedRouteHandle = DetachedRouteHandle & {\r\n\tcomponentRef?: ComponentRef<unknown>;\r\n};\r\n\r\n/**\r\n * ArilWebComponentWrapper instance'ında strategy'nin gözleyeceği alanlar.\r\n * Wrapper'a doğrudan bağımlı olmamak için duck-typing ile minimal interface.\r\n * `needsRestore` ve `propsUpdated` bayrakları wrapper ile strategy arasındaki sözleşme:\r\n * strategy `retrieve` sırasında set eder, wrapper `ngAfterViewInit`'te tüketir.\r\n */\r\ntype WrapperInstance = {\r\n\telement?: HTMLElement;\r\n\tvc?: ElementRef<HTMLElement>;\r\n\tpropsUpdated?: boolean;\r\n\tneedsRestore?: boolean;\r\n};\r\n\r\ninterface PreservedCustomEl {\r\n\tel: HTMLElement;\r\n\tplaceholder: Comment;\r\n}\r\n\r\n/**\r\n * Tab-bazlı navigation için custom `RouteReuseStrategy`.\r\n *\r\n * ## Tab izolasyonu (`_tab` query param)\r\n * `NavService` her tab'a unique `tabId` üretir ve URL'e `?_tab=<tabId>` query param\r\n * ekler. Strategy bu param'ı route key'in parçası yapar:\r\n * - Matcher (web component) route'lar: `mfe:${remoteName}:${tabId}`\r\n * - Normal route'lar: `pathFromRoot` + tüm queryParams (zaten `_tab` dahil)\r\n *\r\n * Sonuç: aynı sayfanın iki tab'i `storedRoutes` üzerinde farklı slot'lara yazılır\r\n * → bağımsız componentRef'ler, bağımsız state. `shouldReuseRoute` matcher karşılaştırması\r\n * `tabId` farkını da dikkate alır — tab değişiminde fresh component oluşur.\r\n *\r\n * ## Mimari: iki bağımsız instance\r\n * Bu strategy hem `aril/boot/host/src/bootstrap.ts`'te hem her MFE remote'unun\r\n * `aril/boot/mfe/src/bootstrap.ts`'inde provider olarak veriliyor. Class\r\n * `providedIn: 'root'` olduğu için **her root injector'da AYRI instance** yaşar.\r\n * İki instance bağımsız `storedRoutes` map'i tutar ve birbirinden habersizdir:\r\n *\r\n * - **Host instance**: matcher route'ları yönetir; key `mfe:${remoteName}:${tabId}`.\r\n * Tab kapanıp `mfe:wdm:abc123` silindiğinde effect remote'a ait `#0/wdm/...`\r\n * prefix'li VE `_tab=abc123` içeren child key'leri de temizler.\r\n * - **MFE instance** (her remote'un kendi içinde): normal route'lar için çalışır.\r\n * Query params zaten `getRouteKey` çıktısına dahil olduğu için tab izolasyonu\r\n * doğal olarak gelir — ek özel davranış gerekmez.\r\n *\r\n * ## Plugin custom element preservation\r\n * `preserveCustomElementsInTree` detached view'daki `<md-search>` gibi custom\r\n * element'leri hidden container'a taşır — element document'tan ayrılmaz, Angular\r\n * Elements `disconnectedCallback` 10ms destroy timer'ı tetiklenmez, plugin\r\n * componentRef'i ve dahili state'i (form input, search sonuçları) korunur.\r\n *\r\n * ## Bilinen sınırlamalar\r\n * - `shouldDetach` matcher route'lar için tabId yokken false döner (tabsız orphan\r\n * handle oluşmasın), diğer durumlarda `true` — tüm detached route'lar cache'lenir.\r\n * Memory leak'i sınırlamak için `NavService` tab sayısını `MAX_TABS` ile kısıtlar\r\n * ve son tab kapatıldığında effect remote'un tüm child key'lerini temizler. Yine de\r\n * tab içinde açılan detail/edit gibi parametreli alt sayfaların handle'ları, parent\r\n * tab kapanana kadar storedRoutes'ta kalır.\r\n */\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class CustomRouteReuseStrategy implements RouteReuseStrategy, OnDestroy {\r\n\trouteCloseService: RouteCloseService = inject(RouteCloseService);\r\n\tstoredRoutes: Record<string, DetachedRouteHandle> = {};\r\n\r\n\t/**\r\n\t * `(detachedTree as any).__arilPreservedCustomEls = [...]` runtime property\r\n\t * eklemek yerine handle'ı key olarak kullanan bir WeakMap tutuyoruz —\r\n\t * type-safe ve handle GC'ye uğradığında bellek otomatik temizlenir.\r\n\t */\r\n\tprivate preservedCustomEls = new WeakMap<DetachedRouteHandle, PreservedCustomEl[]>();\r\n\r\n\tconstructor() {\r\n\t\teffect(() => {\r\n\t\t\tconst key = this.routeCloseService.deleteRoute().key;\r\n\t\t\tif (!key) return;\r\n\t\t\tconsole.log(`[Strategy] cleanup tetiklendi key=\"${key}\" storedKeys=[${Object.keys(this.storedRoutes).join(',')}]`);\r\n\t\t\tthis.processCleanupKey(key);\r\n\r\n\t\t\t// Cross-injector yayın: `RouteCloseService` `providedIn: 'root'` olduğu için host ve\r\n\t\t\t// her MFE remote'unda AYRI instance yaşar. Host'tan tetiklenen cleanup MFE strategy'sini\r\n\t\t\t// otomatik uyandırmaz. Window event ile sinyal yayınlayıp MFE strategy'sinin kendi\r\n\t\t\t// `storedRoutes`'unu temizlemesini sağlıyoruz (aksi takdirde MFE'de hidden container'a\r\n\t\t\t// taşınmış plugin element'leri orphan kalır).\r\n\t\t\tif (key.startsWith('mfe:')) {\r\n\t\t\t\tconst parsed = this.parseMatcherKey(key);\r\n\t\t\t\tif (parsed) {\r\n\t\t\t\t\twindow.dispatchEvent(\r\n\t\t\t\t\t\tnew CustomEvent('aril:remote-cleanup', {\r\n\t\t\t\t\t\t\tdetail: { remoteName: parsed.remoteName, tabId: parsed.tabId }\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\t// Karşı yönde (cross-injector): host strategy'nin yayınladığı `aril:remote-cleanup`\r\n\t\t// event'ini her MFE strategy instance'ı yakalar, kendi `storedRoutes`'undaki o remote'a\r\n\t\t// (ve varsa o tabId'ye) ait key'leri temizler. Host strategy de bu listener'a sahip\r\n\t\t// ama kendi `#0/${remoteName}/...` key'leri olmadığı için no-op çalışır (güvenli).\r\n\t\tconst cleanupHandler = (e: Event): void => {\r\n\t\t\tconst detail = (e as CustomEvent<{ remoteName?: string; tabId?: string | null }>).detail;\r\n\t\t\tconst remoteName = detail?.remoteName;\r\n\t\t\tif (!remoteName) return;\r\n\t\t\tconst tabId = detail?.tabId ?? null;\r\n\t\t\tconst prefix = `#0/${remoteName}`;\r\n\t\t\tconst keys = Object.keys(this.storedRoutes).filter((k) => {\r\n\t\t\t\tif (!k.startsWith(prefix)) return false;\r\n\t\t\t\t// tabId verildiyse SADECE o tab'a ait child handle'ları temizle. Aksi takdirde\r\n\t\t\t\t// aynı remote'un başka tab'lerinin state'i de yanlışlıkla silinir.\r\n\t\t\t\tif (tabId && !k.includes(`_tab=${tabId}`)) return false;\r\n\t\t\t\treturn true;\r\n\t\t\t});\r\n\t\t\tif (!keys.length) return;\r\n\t\t\tconsole.log(`[Strategy] cross-injector cleanup remoteName=\"${remoteName}\" tabId=\"${tabId ?? '*'}\" keys=[${keys.join(',')}]`);\r\n\t\t\tfor (const k of keys) {\r\n\t\t\t\tthis.cleanupStoredHandle(this.storedRoutes[k]);\r\n\t\t\t\tdelete this.storedRoutes[k];\r\n\t\t\t}\r\n\t\t};\r\n\t\twindow.addEventListener('aril:remote-cleanup', cleanupHandler);\r\n\t\t// Strategy `providedIn: 'root'` → root injector destroy edildiğinde listener'ı kaldır.\r\n\t\t// Pratikte uzun ömürlü ama test ortamı ve gelecekteki iframe vb. multi-window\r\n\t\t// senaryolarda orphan listener bırakmamak için defensive.\r\n\t\tinject(DestroyRef).onDestroy(() => window.removeEventListener('aril:remote-cleanup', cleanupHandler));\r\n\t}\r\n\r\n\t/**\r\n\t * Injector destroy edildiğinde — hibrit modda her tab'ın child `EnvironmentInjector`'ı tab\r\n\t * kapanınca `destroy()` edilir; bu strategy `providedIn:'root'` olduğundan child injector'da\r\n\t * (root-scope) materialize olmuş instance da yıkılır — `storedRoutes`'ta kalan TÜM detached\r\n\t * handle'ları temizler. Aksi halde `preserveCustomElementsInTree` ile hidden container'a\r\n\t * taşınmış plugin custom element'leri (örn. `<md-search>`) orphan kalır (memory leak): MFE\r\n\t * internal route key'leri `_tab` taşımadığı için `aril:remote-cleanup` cross-injector temizliği\r\n\t * onlara ulaşamaz. Injector-destroy bazlı bu süpürme garantili ve idempotenttir.\r\n\t */\r\n\tngOnDestroy(): void {\r\n\t\tconst keys = Object.keys(this.storedRoutes);\r\n\t\tif (keys.length) console.log(`[Strategy] ngOnDestroy → ${keys.length} stored handle temizleniyor (tab kapandı)`);\r\n\t\tfor (const key of keys) {\r\n\t\t\tthis.cleanupStoredHandle(this.storedRoutes[key]);\r\n\t\t\tdelete this.storedRoutes[key];\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Verilen key için direct + child cleanup uygular. Effect içinden ayrıştırılmış helper.\r\n\t */\r\n\tprivate processCleanupKey(key: string): void {\r\n\t\t// Doğrudan eşleşen key varsa onu sil.\r\n\t\tif (this.storedRoutes[key]) {\r\n\t\t\tconsole.log(`[Strategy] cleanup → direct match \"${key}\"`);\r\n\t\t\tthis.cleanupStoredHandle(this.storedRoutes[key]);\r\n\t\t\tdelete this.storedRoutes[key];\r\n\t\t}\r\n\r\n\t\t// Matcher key silindiğinde (`mfe:wdm:abc` gibi) o remote'a ait — varsa o tab'a ait —\r\n\t\t// internal route handle'larını da temizle. Convention: matcher key\r\n\t\t// `mfe:${remoteName}` veya `mfe:${remoteName}:${tabId}`, normal key'ler\r\n\t\t// `#0/${remoteName}/...?...&_tab=${tabId}` formatında.\r\n\t\tif (key.startsWith('mfe:')) {\r\n\t\t\tconst parsed = this.parseMatcherKey(key);\r\n\t\t\tif (!parsed) return;\r\n\t\t\tconst { remoteName, tabId } = parsed;\r\n\t\t\tconst prefix = `#0/${remoteName}`;\r\n\t\t\tfor (const k of Object.keys(this.storedRoutes)) {\r\n\t\t\t\tif (!k.startsWith(prefix)) continue;\r\n\t\t\t\t// tabId verildiyse sadece o tab'a ait child handle'ları temizle\r\n\t\t\t\tif (tabId && !k.includes(`_tab=${tabId}`)) continue;\r\n\t\t\t\tconsole.log(`[Strategy] cleanup → child match \"${k}\"`);\r\n\t\t\t\tthis.cleanupStoredHandle(this.storedRoutes[k]);\r\n\t\t\t\tdelete this.storedRoutes[k];\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * `mfe:${remoteName}` veya `mfe:${remoteName}:${tabId}` formatındaki matcher key'i parse eder.\r\n\t * tabId yoksa `null` döner (geriye dönük uyumluluk: legacy çağrılar tabId vermeyebilir).\r\n\t */\r\n\tprivate parseMatcherKey(key: string): { remoteName: string; tabId: string | null } | null {\r\n\t\tif (!key.startsWith('mfe:')) return null;\r\n\t\tconst tail = key.substring(4);\r\n\t\tconst colonIdx = tail.indexOf(':');\r\n\t\treturn {\r\n\t\t\tremoteName: colonIdx === -1 ? tail : tail.substring(0, colonIdx),\r\n\t\t\ttabId: colonIdx === -1 ? null : tail.substring(colonIdx + 1)\r\n\t\t};\r\n\t}\r\n\r\n\t/**\r\n\t * Stored handle'ı tamamen temizle: hidden container'daki preserved element'leri (plugin\r\n\t * custom element'leri + ArilWebComponentWrapper'ın `<app-xxx>` element'i) DOM'dan kaldır,\r\n\t * sonra Angular `componentRef.destroy()` ile view tree'sini destroy et.\r\n\t *\r\n\t * `componentRef.destroy()` tek başına yeterli değil: Angular sadece view tree'sini bilir,\r\n\t * bizim `preserveCustomElementsInTree` ve `preserveWebComponentElement` ile hidden\r\n\t * container'a manuel taşınan element'lerden haberi yoktur → onlar orphan kalır.\r\n\t */\r\n\tprivate cleanupStoredHandle(handle: DetachedRouteHandle | null | undefined): void {\r\n\t\tif (!handle) return; // Angular Router'ın `store(route, null)` ile bıraktığı orphan key'ler için defensive guard.\r\n\t\tconst hiddenContainer = this.getHiddenContainer();\r\n\r\n\t\t// 1. preserveCustomElementsInTree ile taşınan plugin element'leri (örn. <md-search>)\r\n\t\tconst preserved = this.preservedCustomEls.get(handle);\r\n\t\tif (preserved) {\r\n\t\t\tfor (const { el } of preserved) {\r\n\t\t\t\tif (hiddenContainer.contains(el)) {\r\n\t\t\t\t\thiddenContainer.removeChild(el);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.preservedCustomEls.delete(handle);\r\n\t\t}\r\n\r\n\t\t// 2. preserveWebComponentElement ile taşınan wrapper element'i (örn. <app-wdm>)\r\n\t\tconst componentRef = (handle as InternalDetachedRouteHandle).componentRef;\r\n\t\tconst instance = componentRef?.instance as WrapperInstance | undefined;\r\n\t\tif (instance?.element) {\r\n\t\t\t// Flag'i temizle ki removeChild sonrası tetiklenen disconnectedCallback Application'ı\r\n\t\t\t// gerçekten destroy etsin — aksi halde MFEAppElement orphan kalır (memory leak).\r\n\t\t\tdelete (instance.element as HTMLElement & { __arilPreserveDuringDetach?: boolean }).__arilPreserveDuringDetach;\r\n\t\t\tif (hiddenContainer.contains(instance.element)) {\r\n\t\t\t\thiddenContainer.removeChild(instance.element);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\t// 3. Angular view tree'sini destroy et\r\n\t\tcomponentRef?.destroy();\r\n\t}\r\n\r\n\t/**\r\n\t * Matcher (MFE) route'lar için tabId zorunlu. `getTabIdFromRoute` URL queryParams +\r\n\t * history.state'i okur. Hiçbir kaynak tabId vermezse (ilk navigation interim'i) detach\r\n\t * edilmez; `firstCheckForRoute` `_tab` ekleyip yeniden navigate edecek.\r\n\t */\r\n\tshouldDetach(route: ActivatedRouteSnapshot): boolean {\r\n\t\tif (this.isMatcherRoute(route) && !this.getTabIdFromRoute(route)) {\r\n\t\t\tconsole.log(`[Strategy] shouldDetach key=\"${this.getRouteKey(route)}\" → false (matcher route, tabId yok)`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst routeKey = this.getRouteKey(route);\r\n\t\tconsole.log(`[Strategy] shouldDetach key=\"${routeKey}\" → true`);\r\n\t\treturn true;\r\n\t}\r\n\r\n\tstore(route: ActivatedRouteSnapshot, detachedTree: DetachedRouteHandle): void {\r\n\t\tconst routeKey = this.getRouteKey(route);\r\n\t\tconsole.log(`[Strategy] store key=\"${routeKey}\" handle=`, !!detachedTree);\r\n\t\tif (!detachedTree) {\r\n\t\t\tdelete this.storedRoutes[routeKey];\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tif (this.isMatcherRoute(route) && !this.getTabIdFromRoute(route)) {\r\n\t\t\tconsole.log(`[Strategy] store SKIP key=\"${routeKey}\" (matcher route, tabId yok)`);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.storedRoutes[routeKey] = detachedTree;\r\n\t\tthis.preserveWebComponentElement(detachedTree);\r\n\t\tthis.preserveCustomElementsInTree(detachedTree);\r\n\t}\r\n\r\n\tshouldAttach(route: ActivatedRouteSnapshot): boolean {\r\n\t\tif (this.isMatcherRoute(route) && !this.getTabIdFromRoute(route)) {\r\n\t\t\tconsole.log(`[Strategy] shouldAttach key=\"${this.getRouteKey(route)}\" → false (matcher route, tabId yok)`);\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tconst routeKey = this.getRouteKey(route);\r\n\t\tconst shouldAttach = !!this.storedRoutes[routeKey];\r\n\t\tconsole.log(`[Strategy] shouldAttach key=\"${routeKey}\" → ${shouldAttach} (storedKeys=[${Object.keys(this.storedRoutes).join(',')}])`);\r\n\t\treturn shouldAttach;\r\n\t}\r\n\r\n\tretrieve(route: ActivatedRouteSnapshot): DetachedRouteHandle | null {\r\n\t\tif (this.isMatcherRoute(route) && !this.getTabIdFromRoute(route)) {\r\n\t\t\treturn null;\r\n\t\t}\r\n\t\tconst routeKey = this.getRouteKey(route);\r\n\t\tconst handle = this.storedRoutes[routeKey];\r\n\t\tconsole.log(`[Strategy] retrieve key=\"${routeKey}\" → ${handle ? 'HAS' : 'NULL'}`);\r\n\t\tif (handle) {\r\n\t\t\tthis.restoreWebComponentElement(handle);\r\n\t\t\tthis.restoreCustomElementsInTree(handle);\r\n\t\t}\r\n\t\treturn handle || null;\r\n\t}\r\n\r\n\t/**\r\n\t * Web component element'ini hidden container'a taşır (state korunması için).\r\n\t *\r\n\t * Element'e `__arilPreserveDuringDetach` flag'i yazılır: `removeChild` + `appendChild`\r\n\t * arasında MFE custom element'in `disconnectedCallback`'i tetikleniyor; flag oradaki\r\n\t * destroy timer'ını **deterministic** şekilde bypass eder. Eskiden 50ms hardcoded timer\r\n\t * yarış koşulu üretiyordu (yavaş cihazlarda Application istemsiz destroy oluyordu).\r\n\t */\r\n\tprivate preserveWebComponentElement(detachedTree: DetachedRouteHandle): void {\r\n\t\ttry {\r\n\t\t\tconst componentRef = (detachedTree as InternalDetachedRouteHandle).componentRef;\r\n\t\t\tif (!componentRef) return;\r\n\r\n\t\t\tconst componentInstance = componentRef.instance as WrapperInstance | undefined;\r\n\t\t\tif (!componentInstance?.element) return;\r\n\r\n\t\t\tconst element = componentInstance.element as HTMLElement & { __arilPreserveDuringDetach?: boolean };\r\n\t\t\tconst hiddenContainer = this.getHiddenContainer();\r\n\r\n\t\t\t// Flag — disconnectedCallback bunu okuyup destroy'ı atlayacak. removeChild'tan\r\n\t\t\t// ÖNCE set ediliyor ki callback ilk tetiklendiğinde flag yerinde olsun.\r\n\t\t\telement.__arilPreserveDuringDetach = true;\r\n\r\n\t\t\t// Eğer element zaten bir parent'a sahipse, ondan ayır\r\n\t\t\tif (element.parentNode && element.parentNode !== hiddenContainer) {\r\n\t\t\t\telement.parentNode.removeChild(element);\r\n\t\t\t}\r\n\r\n\t\t\t// Hidden container'a ekle (eğer zaten orada değilse)\r\n\t\t\tif (!hiddenContainer.contains(element)) {\r\n\t\t\t\thiddenContainer.appendChild(element);\r\n\t\t\t\tconsole.log('Web component element hidden container\\'a taşındı (state korunuyor)');\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn('Web component element preserve edilirken hata:', error);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Web component element'ini hidden container'dan çıkar ve component view'a eklemeyi dene.\r\n\t *\r\n\t * `__arilPreserveDuringDetach` flag'i temizlenir — eğer bu retrieve sonrası element\r\n\t * gerçek anlamda destroy edilirse `disconnectedCallback` flag yok kabul edip Application\r\n\t * cleanup'ını yürütecek.\r\n\t */\r\n\tprivate restoreWebComponentElement(detachedTree: DetachedRouteHandle): void {\r\n\t\ttry {\r\n\t\t\tconst componentRef = (detachedTree as InternalDetachedRouteHandle).componentRef;\r\n\t\t\tif (!componentRef) return;\r\n\r\n\t\t\tconst componentInstance = componentRef.instance as WrapperInstance | undefined;\r\n\t\t\tif (!componentInstance?.element) return;\r\n\r\n\t\t\tconst element = componentInstance.element as HTMLElement & { __arilPreserveDuringDetach?: boolean };\r\n\t\t\tconst hiddenContainer = this.getHiddenContainer();\r\n\r\n\t\t\t// Eğer element hidden container'da ise, çıkar\r\n\t\t\tif (hiddenContainer.contains(element)) {\r\n\t\t\t\thiddenContainer.removeChild(element);\r\n\t\t\t\tdelete element.__arilPreserveDuringDetach;\r\n\t\t\t\tconsole.log('Web component element hidden container\\'dan çıkarıldı');\r\n\r\n\t\t\t\t// Component view'ın native element'ine eklemeyi dene\r\n\t\t\t\tconst tryRestore = (): boolean => {\r\n\t\t\t\t\tconst vc = componentInstance.vc;\r\n\t\t\t\t\tif (vc?.nativeElement) {\r\n\t\t\t\t\t\tvc.nativeElement.appendChild(element);\r\n\t\t\t\t\t\tconsole.log('Web component element component view\\'a eklendi (retrieve sırasında)');\r\n\t\t\t\t\t\t// Props'ları güncellemek için flag set et (component kendi populateProps'unu çağıracak)\r\n\t\t\t\t\t\tcomponentInstance.propsUpdated = false;\r\n\t\t\t\t\t\treturn true;\r\n\t\t\t\t\t}\r\n\t\t\t\t\treturn false;\r\n\t\t\t\t};\r\n\r\n\t\t\t\t// Hemen dene\r\n\t\t\t\tif (!tryRestore()) {\r\n\t\t\t\t\t// View henüz hazır değilse, bir sonraki tick'te tekrar dene\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tif (!tryRestore()) {\r\n\t\t\t\t\t\t\t// Hala başarısızsa, flag set et (ngAfterViewInit'te tekrar denenecek)\r\n\t\t\t\t\t\t\tcomponentInstance.needsRestore = true;\r\n\t\t\t\t\t\t\tconsole.log('Web component element restore edilecek (view hazır değil, ngAfterViewInit\\'te tekrar denenecek)');\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, 0);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn('Web component element restore edilirken hata:', error);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Global hidden container'ı oluşturur veya döndürür\r\n\t */\r\n\tprivate getHiddenContainer(): HTMLElement {\r\n\t\tconst slot = globalThis as typeof globalThis & { __arilWebComponentHiddenContainer?: HTMLElement };\r\n\t\tlet container = slot.__arilWebComponentHiddenContainer;\r\n\t\tif (!container) {\r\n\t\t\tcontainer = document.createElement('div');\r\n\t\t\tcontainer.style.display = 'none';\r\n\t\t\tcontainer.style.position = 'absolute';\r\n\t\t\tcontainer.style.left = '-9999px';\r\n\t\t\tcontainer.style.top = '-9999px';\r\n\t\t\tcontainer.style.visibility = 'hidden';\r\n\t\t\tdocument.body.appendChild(container);\r\n\t\t\tslot.__arilWebComponentHiddenContainer = container;\r\n\t\t}\r\n\t\treturn container;\r\n\t}\r\n\r\n\t/**\r\n\t * Detached route view'ı içindeki plugin/MFE custom element'lerini (tag adında `-`\r\n\t * bulunan ve `customElements`'a kayıtlı olanları) hidden container'a taşır ve\r\n\t * yerlerine birer Comment placeholder bırakır. Element document'tan ayrılmaz,\r\n\t * Angular Elements `disconnectedCallback` 10ms destroy timer'ı kanat çırpmaz —\r\n\t * dolayısıyla plugin'in `ComponentRef` ve dahili state'i (form değerleri, search\r\n\t * sonuçları vs.) sonraki retrieve'e kadar korunur.\r\n\t */\r\n\tprivate preserveCustomElementsInTree(detachedTree: DetachedRouteHandle): void {\r\n\t\ttry {\r\n\t\t\tconst componentRef = (detachedTree as InternalDetachedRouteHandle).componentRef;\r\n\t\t\tconst rootEl = componentRef?.location?.nativeElement as HTMLElement | undefined;\r\n\t\t\tif (!rootEl) return;\r\n\r\n\t\t\tconst hiddenContainer = this.getHiddenContainer();\r\n\t\t\tconst all = rootEl.querySelectorAll('*');\r\n\t\t\tconst preservedList: PreservedCustomEl[] = [];\r\n\r\n\t\t\tfor (const el of Array.from(all)) {\r\n\t\t\t\tconst tag = el.tagName.toLowerCase();\r\n\t\t\t\tif (!tag.includes('-')) continue;\r\n\t\t\t\tif (!window.customElements?.get(tag)) continue;\r\n\r\n\t\t\t\tconst node = el as HTMLElement;\r\n\t\t\t\tconst placeholder = document.createComment(`aril-preserved:${tag}`);\r\n\t\t\t\tnode.parentNode?.insertBefore(placeholder, node);\r\n\t\t\t\thiddenContainer.appendChild(node);\r\n\t\t\t\tpreservedList.push({ el: node, placeholder });\r\n\t\t\t}\r\n\r\n\t\t\tif (preservedList.length) {\r\n\t\t\t\tthis.preservedCustomEls.set(detachedTree, preservedList);\r\n\t\t\t\tconsole.log(`[Strategy] preserveCustomElementsInTree: ${preservedList.length} element taşındı`);\r\n\t\t\t}\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn('Custom element preserve edilirken hata:', error);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * preserveCustomElementsInTree ile taşınan custom element'leri orijinal\r\n\t * placeholder'larının yerine geri koyar.\r\n\t */\r\n\tprivate restoreCustomElementsInTree(detachedTree: DetachedRouteHandle): void {\r\n\t\ttry {\r\n\t\t\tconst preservedList = this.preservedCustomEls.get(detachedTree);\r\n\t\t\tif (!preservedList?.length) return;\r\n\r\n\t\t\tfor (const { el, placeholder } of preservedList) {\r\n\t\t\t\tif (placeholder.parentNode) {\r\n\t\t\t\t\tplaceholder.parentNode.replaceChild(el, placeholder);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// Placeholder ağaçtan koparılmış — parent view tamamen destroy edilmiş olabilir\r\n\t\t\t\t\t// (örn. remote tab kapanmış). Element'i hidden container'da bırakmamak için cleanup.\r\n\t\t\t\t\tconsole.warn('[Strategy] restore: placeholder parent yok, custom element cleanup ediliyor', el.tagName);\r\n\t\t\t\t\tif (el.parentNode === this.getHiddenContainer()) {\r\n\t\t\t\t\t\tthis.getHiddenContainer().removeChild(el);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\tthis.preservedCustomEls.delete(detachedTree);\r\n\t\t\tconsole.log(`[Strategy] restoreCustomElementsInTree: ${preservedList.length} element geri yerleştirildi`);\r\n\t\t} catch (error) {\r\n\t\t\tconsole.warn('Custom element restore edilirken hata:', error);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isMatcherRoute(route: ActivatedRouteSnapshot | null): boolean {\r\n\t\treturn !!route?.routeConfig?.matcher;\r\n\t}\r\n\r\n\tprivate getRemoteName(route: ActivatedRouteSnapshot | null): string | null {\r\n\t\treturn (route?.routeConfig?.data as PluginConfig | undefined)?.remoteName ?? null;\r\n\t}\r\n\r\n\t/**\r\n\t * URL `?_tab=<tabId>` query param'ını oku — `NavService` her tab için unique değer üretir.\r\n\t * `IsolatedLocationStrategy` sayesinde host Router'a tabsız navigation gelmez, sadece\r\n\t * `tabState({_tab})`'lı tab tıklamaları gelir → `route.queryParams['_tab']` her zaman dolu.\r\n\t */\r\n\tprivate getTabIdFromRoute(route: ActivatedRouteSnapshot | null): string | null {\r\n\t\tconst v = route?.queryParams?.['_tab'];\r\n\t\treturn typeof v === 'string' && v.length > 0 ? v : null;\r\n\t}\r\n\r\n\t/**\r\n\t * Route key'ini oluşturur. Matcher (web component) route'lar için remoteName + tabId\r\n\t * bazlı key kullanılır — aynı remote'un her tab'i ayrı MFE custom element instance'ına\r\n\t * sahiptir (bağımsız state).\r\n\t *\r\n\t * Normal route'lar için `pathFromRoot` üzerinden tam yol üretilir, ardından query params\r\n\t * eklenir (zaten `_tab` dahil) — nested boş-path (`path: ''`) child route'larının aynı `\"\"`\r\n\t * key'iyle çakışmasını engeller ve aynı path'in iki tab'i farklı key alır.\r\n\t */\r\n\tprivate getRouteKey(route: ActivatedRouteSnapshot): string {\r\n\t\tif (this.isMatcherRoute(route)) {\r\n\t\t\tconst remoteName = this.getRemoteName(route);\r\n\t\t\tif (remoteName) {\r\n\t\t\t\tconst tabId = this.getTabIdFromRoute(route);\r\n\t\t\t\treturn tabId ? `mfe:${remoteName}:${tabId}` : `mfe:${remoteName}`;\r\n\t\t\t}\r\n\t\t}\r\n\t\t// Tam path: kök → intermediate → self. Boş segmentleri index ile koruyarak hiyerarşi\r\n\t\t// pozisyonunu key'e dahil ederiz (kardeş empty-path route'lar farklı key alır).\r\n\t\tconst fullPath = route.pathFromRoot\r\n\t\t\t.map((r, i) => {\r\n\t\t\t\tconst seg = r.url.map((s) => s.path).join('/');\r\n\t\t\t\treturn seg.length > 0 ? seg : `#${i}`;\r\n\t\t\t})\r\n\t\t\t.join('/');\r\n\t\tconst queryParams = this.serializeQueryParams(route.queryParams);\r\n\t\tconst fragment = route.fragment ? '#' + route.fragment : '';\r\n\r\n\t\treturn fullPath + queryParams + fragment;\r\n\t}\r\n\r\n\t/**\r\n\t * Query param'ları URL-safe şekilde serileştirir. `URLSearchParams` constructor'una\r\n\t * doğrudan object verirsek array değerler `?ids=1,2,3` gibi tek key olarak yazılır;\r\n\t * Angular Router'ın `?ids=1&ids=2&ids=3` davranışıyla uyumsuz olabilir. `append` ile\r\n\t * her array elemanı ayrı entry olur ve null/undefined değerler atlanır.\r\n\t */\r\n\tprivate serializeQueryParams(params: ActivatedRouteSnapshot['queryParams']): string {\r\n\t\t// `sort()` ile determinism — aynı sayfanın farklı insertion-order'lı queryParams'ı\r\n\t\t// (deep link share, server-side render, JS-generated URL'ler) aynı route key üretir.\r\n\t\t// Aksi takdirde `?b=1&a=2` ve `?a=2&b=1` iki ayrı handle olarak cache'lenir → tab\r\n\t\t// izolasyonu aynı sayfanın iki ayrı instance'ını açar.\r\n\t\tconst keys = Object.keys(params).sort();\r\n\t\tif (!keys.length) return '';\r\n\t\tconst out = new URLSearchParams();\r\n\t\tfor (const k of keys) {\r\n\t\t\tconst v = params[k];\r\n\t\t\tif (v == null) continue;\r\n\t\t\tif (Array.isArray(v)) {\r\n\t\t\t\tv.forEach((vv) => vv != null && out.append(k, String(vv)));\r\n\t\t\t} else {\r\n\t\t\t\tout.append(k, String(v));\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst str = out.toString();\r\n\t\treturn str ? '?' + str : '';\r\n\t}\r\n\r\n\tshouldReuseRoute(future: ActivatedRouteSnapshot, curr: ActivatedRouteSnapshot): boolean {\r\n\t\tconst futureMatcher = this.isMatcherRoute(future);\r\n\t\tconst currMatcher = this.isMatcherRoute(curr);\r\n\r\n\t\tif (futureMatcher && currMatcher) {\r\n\t\t\tconst fr = this.getRemoteName(future);\r\n\t\t\tconst cr = this.getRemoteName(curr);\r\n\t\t\tconst ft = this.getTabIdFromRoute(future);\r\n\t\t\tconst ct = this.getTabIdFromRoute(curr);\r\n\t\t\t// Aynı remote olsa bile farklı tab'lerse fresh component instantiate edilmeli —\r\n\t\t\t// aksi takdirde iki tab tek componentRef'i paylaşır ve state izolasyonu kaybolur.\r\n\t\t\tconst shouldReuse = !!fr && fr === cr && ft === ct;\r\n\t\t\tconsole.log(`[Strategy] shouldReuseRoute matcher → ${shouldReuse}. future=${fr}/${ft} curr=${cr}/${ct}`);\r\n\t\t\treturn shouldReuse;\r\n\t\t}\r\n\r\n\t\tif (futureMatcher !== currMatcher) {\r\n\t\t\tconsole.log('[Strategy] shouldReuseRoute mixed → false');\r\n\t\t\treturn false;\r\n\t\t}\r\n\r\n\t\tconst shouldReuse = future.routeConfig === curr.routeConfig;\r\n\t\tconst futureKey = this.getRouteKey(future);\r\n\t\tconst currKey = this.getRouteKey(curr);\r\n\t\tconst futureComp = future.routeConfig?.component?.name ?? future.component?.name ?? 'none';\r\n\t\tconst currComp = curr.routeConfig?.component?.name ?? curr.component?.name ?? 'none';\r\n\t\tconsole.log(\r\n\t\t\t`[Strategy] shouldReuseRoute normal → ${shouldReuse}. future=\"${futureKey}\"(${futureComp}) curr=\"${currKey}\"(${currComp})`\r\n\t\t);\r\n\t\treturn shouldReuse;\r\n\t}\r\n}\r\n","import { NavigationBehaviorOptions, Router } from '@angular/router';\r\n\r\n/**\r\n * `Router.navigateByUrl` wrapper'ı — `AbortError`'ı caller için \"navigation cancelled\"\r\n * sinyali olarak değerlendirip Promise'i `false` ile resolve eder.\r\n *\r\n * **Neden**: Angular Router pending bir navigation cycle aktifken yeni `navigateByUrl`\r\n * çağrılırsa, eski cycle'ı **kasıtlı olarak iptal eder** (\"son navigation kazanır\" semantiği)\r\n * ve eski Promise'ı `AbortError: Transition was skipped` ile reject eder. Bu hata değil,\r\n * Router'ın akış kontrolüdür — eski navigation zaten anlamsız çünkü kullanıcı yeni bir\r\n * hedefe yöneldi. Caller'ın bu rejection'ı silently handle etmesi BEKLENİR. Aksi halde\r\n * \"Uncaught (in promise) AbortError\" console gürültüsü oluşur.\r\n *\r\n * Bu helper bütün NavService + MFE bootstrap relay + AppLayoutComponent çağrılarını\r\n * tek noktadan tutarlı handle eder. Diğer hata türleri (`NavigationError`, runtime exception)\r\n * normal şekilde reject edilir — gerçekten beklenmeyen sorunlar yutulmaz.\r\n */\r\nexport function safeNavigate(\r\n\trouter: Router,\r\n\turl: string,\r\n\textras?: NavigationBehaviorOptions\r\n): Promise<boolean> {\r\n\treturn router.navigateByUrl(url, extras).catch((err: unknown) => {\r\n\t\t// Yalnızca \"iptal\" semantiği false ile resolve edilir — genuine hatalar (guard reject,\r\n\t\t// runtime exception, network down) rethrow edilir ki global `ErrorHandler` veya caller\r\n\t\t// `.catch` zinciri yakalasın. Silent yutmak production debug'ı imkansızlaştırıyordu.\r\n\t\tif (isCancelledNavigation(err)) {\r\n\t\t\treturn false;\r\n\t\t}\r\n\t\tthrow err;\r\n\t});\r\n}\r\n\r\n/**\r\n * Angular Router cycle iptali pek çok şekilde rejection üretebilir:\r\n * - `Error` instance'ı, `name='AbortError'` veya plain `name='Error'`\r\n * - `message` 'Transition was skipped' veya 'Navigation Cancel' içerir\r\n * - `code` numerik `NavigationCancellationCode` (Router 16+)\r\n * Tüm bu varyasyonları \"iptal edildi, normal\" olarak yorumlayıp yutarız.\r\n */\r\nfunction isCancelledNavigation(err: unknown): boolean {\r\n\tif (!err || typeof err !== 'object') return false;\r\n\tconst e = err as { name?: string; message?: string; code?: number };\r\n\tif (e.name === 'AbortError') return true;\r\n\tif (typeof e.message === 'string') {\r\n\t\tconst m = e.message;\r\n\t\tif (m.includes('Transition was skipped') || m.includes('NavigationCancel')) return true;\r\n\t}\r\n\t// Angular Router NavigationCancellationCode enum: SupersededByNewNavigation = 2\r\n\tif (typeof e.code === 'number' && e.code === 2) return true;\r\n\treturn false;\r\n}\r\n","import { Injectable, inject, signal } from '@angular/core';\r\nimport { takeUntilDestroyed, toSignal } from '@angular/core/rxjs-interop';\r\nimport { NavigationEnd, Router } from '@angular/router';\r\n\r\nimport { MessageService } from 'primeng/api';\r\n\r\nimport { TranslocoService } from '@ngneat/transloco';\r\nimport { filter, map, tap } from 'rxjs/operators';\r\n\r\nimport { PluginMenuItem } from './interfaces';\r\nimport { RouteCloseService } from './route-close.service';\r\nimport { safeNavigate } from './safe-navigate';\r\n\r\n/**\r\n * `tabId` her tab'ı tekil kılan kimliktir; aynı `navLink` (path) altında birden fazla\r\n * bağımsız tab açılabilmesini sağlar. NavService Router'a navigation yaparken URL'e\r\n * `_tab=<tabId>` query param ekler ve `extras.state._tab` ile history state'e yazar.\r\n * `TabAwareUrlSerializer` adres çubuğundan `_tab`'i strip eder; Router internal\r\n * `queryParams` korunur → `CustomRouteReuseStrategy.getRouteKey` doğru tab key türetir.\r\n *\r\n * **Önemli**: `NavItem.navLink` HER ZAMAN CLEAN URL (no `_tab`). Hem display hem\r\n * `activeRoute()` ile karşılaştırma için kullanılır. Tab kimliği `tabId` üzerinden\r\n * yönetilir (`activeTabId` signal).\r\n */\r\nexport interface NavItem {\r\n\ttabId: string;\r\n\tnavLink: string;\r\n\tnavName: string;\r\n\t/**\r\n\t * Menu item'dan gelen icon class'ı (örn. 'pi pi-bolt'). Verilmezse layout `getTabIcon`\r\n\t * menu config'inden longest-prefix match ile lookup yapar; o da bulamazsa generic ikona düşer.\r\n\t */\r\n\ticon?: string;\r\n\t/**\r\n\t * Tab sabitleme — Chrome-vari pinning. Sabit tab'lar tab bar'ın **soluna** sıralanır,\r\n\t * kompakt gösterilir (yalnız icon, başlık + close button gizli), `closeOthers`/`closeToRight`/\r\n\t * `closeAll` çağrılarından korunur. Drag & drop'ta pinned ↔ normal sınırı geçilemez.\r\n\t */\r\n\tpinned?: boolean;\r\n}\r\n\r\n/**\r\n * Router'a verilecek URL'e `_tab` query param ekler. Tab navLink'leri CLEAN saklandığı\r\n * için her navigation'da bu helper'la `_tab` eklenir. UrlSerializer serialize sırasında\r\n * `_tab`'i strip eder → adres çubuğunda görünmez ama Router internal queryParams'ında\r\n * kalır → strategy doğru çalışır.\r\n *\r\n * Path'in başında leading slash garanti edilir (Router URL formatına uygunluk için).\r\n */\r\nfunction withTabId(rawNavLink: string, tabId: string): string {\r\n\tconst { path, query, fragment } = splitUrl(rawNavLink ?? '');\r\n\tconst params = new URLSearchParams(query);\r\n\tparams.set('_tab', tabId);\r\n\treturn `${path}?${params.toString()}${fragment}`;\r\n}\r\n\r\n/**\r\n * NavLink'i clean formatta normalize eder: leading slash garantisi, query string'ten\r\n * `_tab` strip, fragment korunur. `activeRoute()` UrlSerializer override'ı sayesinde\r\n * clean URL döner; tab storage da clean olmalı ki karşılaştırma çalışsın.\r\n */\r\nfunction cleanNavLink(rawNavLink: string): string {\r\n\tconst { path, query, fragment } = splitUrl(rawNavLink ?? '');\r\n\tif (!query) return path + fragment;\r\n\tconst params = new URLSearchParams(query);\r\n\tparams.delete('_tab');\r\n\tconst remaining = params.toString();\r\n\treturn remaining ? `${path}?${remaining}${fragment}` : path + fragment;\r\n}\r\n\r\n/**\r\n * URL string'ini path/query/fragment olarak parçalar. Fragment (`#`) ilk önce ayrılır\r\n * ki query (`?`) içindeki `#` ile karışmasın. Path'in başına leading slash garanti\r\n * edilir (Router URL formatı için zorunlu).\r\n *\r\n * `URL` constructor'ı relative URL ile çalışmaz, manuel split `URLSearchParams`'a\r\n * uygun temiz query string verir. Fragment olduğu gibi (öncesinde `#` ile) döner.\r\n */\r\nfunction splitUrl(raw: string): { path: string; query: string; fragment: string } {\r\n\tconst fragmentIdx = raw.indexOf('#');\r\n\tconst fragment = fragmentIdx >= 0 ? raw.slice(fragmentIdx) : '';\r\n\tconst beforeFragment = fragmentIdx >= 0 ? raw.slice(0, fragmentIdx) : raw;\r\n\tconst queryIdx = beforeFragment.indexOf('?');\r\n\tlet path = queryIdx >= 0 ? beforeFragment.slice(0, queryIdx) : beforeFragment;\r\n\tconst query = queryIdx >= 0 ? beforeFragment.slice(queryIdx + 1) : '';\r\n\tif (!path.startsWith('/')) path = '/' + path;\r\n\treturn { path, query, fragment };\r\n}\r\n\r\n/** Router'a verilen extras.state objesi — `_tab`'i history state'inde tutar. */\r\nfunction tabState(tabId: string): { state: Record<string, unknown> } {\r\n\treturn { state: { _tab: tabId } };\r\n}\r\n\r\n/**\r\n * NavLink'in remote (ilk path segment) adını döndürür. Query param'lardan ve leading\r\n * slash'tan etkilenmez — `/mw/app-management?_tab=abc` → `mw`.\r\n */\r\nfunction extractRemoteName(navLink: string | undefined): string | null {\r\n\tif (!navLink) return null;\r\n\tlet path = navLink.split('?')[0];\r\n\tif (path.startsWith('/')) path = path.slice(1);\r\n\treturn path.split('/')[0] || null;\r\n}\r\n\r\n@Injectable({\r\n\tprovidedIn: 'root'\r\n})\r\nexport class NavService {\r\n\trouter: Router = inject(Router);\r\n\trouteCloseService: RouteCloseService = inject(RouteCloseService);\r\n\tprivate readonly messageService: MessageService = inject(MessageService);\r\n\tprivate readonly translocoService: TranslocoService = inject(TranslocoService);\r\n\r\n\t// i18n çevirileri lazy (async HTTP) yüklenir; `firstCheckForRoute`/`openHomeTab` çeviri\r\n\t// yüklenmeden `translate('tab.home')` ederse raw key (\"tab.home\") kalır. Çeviri yüklenince\r\n\t// fallback-isimli tab'ları (özellikle anasayfa) menüyle revize et → \"Anasayfa\" yerine oturur.\r\n\tprivate readonly i18nReloadSub = this.translocoService.events$\r\n\t\t.pipe(\r\n\t\t\t// Yalnız root/global i18n (scope YOK) yüklenince reconcile et — 'tab.home' orada.\r\n\t\t\t// Feature lazy scope'ları (her MFE sayfası kendi scope'unu yükler) gereksiz menü-DFS\r\n\t\t\t// tetiklemesin; reconcile yalnız home/menü adlarının bağlı olduğu global çeviri içindir.\r\n\t\t\tfilter((e) => e.type === 'translationLoadSuccess' && !e.payload?.scope),\r\n\t\t\ttakeUntilDestroyed()\r\n\t\t)\r\n\t\t.subscribe(() => this.reconcileTabsWithMenu());\r\n\r\n\tfirstCheckForRoute = false;\r\n\t/**\r\n\t * Aynı anda açık olabilecek tab sayısı tavanı. Tab bar'ın UX'i ve `CustomRouteReuseStrategy`\r\n\t * `storedRoutes` birikimi için üst sınır. Aşılırsa yeni navigasyon engellenir.\r\n\t */\r\n\tprivate readonly MAX_TABS = 20;\r\n\r\n\t/** RFC4122 v4 UUID — collision-free, internal state taşımaz. */\r\n\tprivate generateTabId(): string {\r\n\t\treturn crypto.randomUUID();\r\n\t}\r\n\r\n\t/**\r\n\t * Menu items'i NavService'ten almak için provider. `aril/boot/bridge`'i doğrudan import\r\n\t * etmek ng-packagr'da `aril/boot/bridge → aril/boot/config/apps` döngüsü tetikliyordu\r\n\t * (bridge `PluginMenuItem` type'ını import ediyor). Bunun yerine host shell\r\n\t * (`AppLayoutComponent`) `setMenuItemsProvider(() => bridge.hostMenuItems())` ile bağlar.\r\n\t * Provider yoksa label/icon resolve'u atlanır, URL segment fallback'i devreye girer.\r\n\t */\r\n\tprivate menuItemsProvider: (() => PluginMenuItem[]) | null = null;\r\n\tsetMenuItemsProvider(provider: () => PluginMenuItem[]): void {\r\n\t\tthis.menuItemsProvider = provider;\r\n\t\t// Provider geç set edildiyse (örn. shell layout NavigationEnd'den sonra mount oldu),\r\n\t\t// activeRoutes'ta default/fallback isimle eklenmiş ilk tab'ı menüyle revize et.\r\n\t\tthis.reconcileTabsWithMenu();\r\n\t}\r\n\r\n\t/**\r\n\t * Host shell anasayfa NavItem'ını sağlar — `AppLayoutComponent.homeNavItem` (menüdeki\r\n\t * `root: true` öğesinden türetilir: navLink/navName/icon). Tüm tab'lar kapatıldığında\r\n\t * liste boş kalmasın diye `openHomeTab` bunu kullanır; provider yoksa `/` + i18n fallback.\r\n\t */\r\n\tprivate homeNavItemProvider: (() => NavItem) | null = null;\r\n\tsetHomeNavItemProvider(provider: () => NavItem): void {\r\n\t\tthis.homeNavItemProvider = provider;\r\n\t\t// Refresh/ilk açılış path'inde fallback (\"Page\") isim/ikonla eklenmiş anasayfa tab'ı\r\n\t\t// varsa, provider hazır olunca menüyle (home dahil) revize et.\r\n\t\tthis.reconcileTabsWithMenu();\r\n\t}\r\n\r\n\t/**\r\n\t * URL adres çubuğundan görülen aktif route — `TabAwareUrlSerializer` `_tab`'i strip\r\n\t * ettiği için bu CLEAN URL'dir (ör. `/crm/address-management/search`). Tab navLink'leri\r\n\t * de clean saklandığı için `r.navLink === activeRoute()` doğrudan karşılaştırılır.\r\n\t */\r\n\tactiveRoute = toSignal<string>(\r\n\t\tthis.router.events.pipe(\r\n\t\t\tfilter((e) => e instanceof NavigationEnd),\r\n\t\t\ttap((e) => {\r\n\t\t\t\t// Her NavigationEnd'de history state'ten aktif tabId'yi okuyup signal'a yaz.\r\n\t\t\t\t// `extras.state` ile yapılan navigation'larda Angular history.state'e `_tab`'i koyar;\r\n\t\t\t\t// browser back/forward navigasyonlarında da history.state korunur.\r\n\t\t\t\tconst tabIdFromState = (window.history.state as Record<string, unknown> | null)?.['_tab'];\r\n\t\t\t\tif (typeof tabIdFromState === 'string' && tabIdFromState.length > 0) {\r\n\t\t\t\t\tthis.activeTabId.set(tabIdFromState);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tconst currentUrl = (e as NavigationEnd).urlAfterRedirects || (e as NavigationEnd).url;\r\n\r\n\t\t\t\t// NOT: Aktif tab'ın navLink'ini güncelleme `syncActiveTabNavLinkForTab` ile\r\n\t\t\t\t// `bridge.activeMFEUrl` üzerinden yapılır (kaynağa-bağlı, cross-tab safe).\r\n\r\n\t\t\t\t// Tab `activeRoutes`'ta YOKSA türet: (a) ilk açılış/refresh deep-link, VEYA\r\n\t\t\t\t// (b) browser back/forward ile KAPATILMIŞ tab'ın history entry'sine dönüş\r\n\t\t\t\t// (kapatma host history'yi silmez → geri tuşu o URL'e gider, tab yeniden açılmalı).\r\n\t\t\t\t// Bilinen tab (normal tıklama / yeni tab / açık tab'a geri) → yalnız activeTabId\r\n\t\t\t\t// güncellenir (yukarıda), mevcut tab'a focus; türetme yapılmaz.\r\n\t\t\t\tconst knownTab =\r\n\t\t\t\t\ttypeof tabIdFromState === 'string' &&\r\n\t\t\t\t\ttabIdFromState.length > 0 &&\r\n\t\t\t\t\tthis.activeRoutes().some((r) => r.tabId === tabIdFromState);\r\n\t\t\t\tif (!knownTab) {\r\n\t\t\t\t\t// Refresh sonrası deep link → URL'den nav item türet ve activeRoutes'a ekle.\r\n\t\t\t\t\t// URL'de `_tab` yoksa (UrlSerializer strip ettiği için adres çubuğundan paylaşılan\r\n\t\t\t\t\t// link `_tab` taşımaz) yeni tabId üret + history state'e yaz; navigateByUrl\r\n\t\t\t\t\t// çağrısı ile state injekte ederiz, adres çubuğu temiz kalır.\r\n\t\t\t\t\tif (currentUrl) {\r\n\t\t\t\t\t\tconst stateTabId = (window.history.state as Record<string, unknown> | null)?.['_tab'];\r\n\t\t\t\t\t\tconst navLink = cleanNavLink(currentUrl);\r\n\t\t\t\t\t\t// İlk navigation'da (F5/açılış) gelen URL zaten activeRoutes'taki bir tab ile\r\n\t\t\t\t\t\t// eşleşiyorsa (özellikle restore edilmiş pinned tab) YENİ tab TÜRETME — o tab'ı\r\n\t\t\t\t\t\t// kullan. F5 sonrası Angular initial navigation `history.state._tab`'ı koruMAZ →\r\n\t\t\t\t\t\t// `knownTab` yakalayamaz; navLink eşleşmesi restore-duplicate'ini önler. Yalnız ilk\r\n\t\t\t\t\t\t// check'te + state'te `_tab` yokken: sonraki navigationlarda kasıtlı duplicate tab ve\r\n\t\t\t\t\t\t// browser-back ile kapatılan tab'ın re-derive davranışı korunur.\r\n\t\t\t\t\t\tconst existing =\r\n\t\t\t\t\t\t\t!this.firstCheckForRoute && !stateTabId\r\n\t\t\t\t\t\t\t\t? this.activeRoutes().find((r) => r.navLink === navLink)\r\n\t\t\t\t\t\t\t\t: undefined;\r\n\t\t\t\t\t\tlet tabId =\r\n\t\t\t\t\t\t\ttypeof stateTabId === 'string' && stateTabId.length > 0 ? stateTabId : existing?.tabId ?? '';\r\n\t\t\t\t\t\tlet needsStateInject = false;\r\n\t\t\t\t\t\tif (!tabId) {\r\n\t\t\t\t\t\t\ttabId = this.generateTabId();\r\n\t\t\t\t\t\t\tneedsStateInject = true;\r\n\t\t\t\t\t\t} else if (existing) {\r\n\t\t\t\t\t\t\t// Eşleşen tab'ın `tabId`'sini URL/state'e yansıt — adres çubuğu `_tab` taşımadığı\r\n\t\t\t\t\t\t\t// için RouteReuse `mfe:<remote>:<tabId>` key tutarlılığı state inject ister.\r\n\t\t\t\t\t\t\tneedsStateInject = true;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tthis.activeTabId.set(tabId);\r\n\t\t\t\t\t\tif (!existing) {\r\n\t\t\t\t\t\t\tconst menuInfo = this.resolveNavInfoFromMenu(navLink);\r\n\t\t\t\t\t\t\tconst fallbackName = (): string => {\r\n\t\t\t\t\t\t\t\tlet path = navLink;\r\n\t\t\t\t\t\t\t\tif (path.startsWith('/')) path = path.slice(1);\r\n\t\t\t\t\t\t\t\tconst parts = path.split('/').filter((s) => s.length > 0);\r\n\t\t\t\t\t\t\t\tconst last = parts[parts.length - 1] || 'Page';\r\n\t\t\t\t\t\t\t\treturn last.charAt(0).toUpperCase() + last.slice(1).replace(/-/g, ' ');\r\n\t\t\t\t\t\t\t};\r\n\t\t\t\t\t\t\tthis.addToActiveRoutes({\r\n\t\t\t\t\t\t\t\ttabId,\r\n\t\t\t\t\t\t\t\tnavLink,\r\n\t\t\t\t\t\t\t\tnavName: menuInfo?.navName || fallbackName(),\r\n\t\t\t\t\t\t\t\ticon: menuInfo?.icon\r\n\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tif (needsStateInject) {\r\n\t\t\t\t\t\t\t// Mevcut navigation cycle bitiminden SONRA yeni navigation tetikle —\r\n\t\t\t\t\t\t\t// `queueMicrotask` Router'ın navigation kuyruğu finalize olmadan çalışıp\r\n\t\t\t\t\t\t\t// `AbortError: Transition was skipped`'a yol açıyordu. `setTimeout(0)` macrotask\r\n\t\t\t\t\t\t\t// ile current cycle biter, Router idle olur. `this.navigate` zaten AbortError'ı\r\n\t\t\t\t\t\t\t// yutuyor — concurrent navigation race'leri sessizce iptal edilir.\r\n\t\t\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\t\t\tsafeNavigate(this.router, withTabId(navLink, tabId), {\r\n\t\t\t\t\t\t\t\t\treplaceUrl: true,\r\n\t\t\t\t\t\t\t\t\tstate: { _tab: tabId }\r\n\t\t\t\t\t\t\t\t}).catch(() => {/* refresh-path noise: caller yok, silent */});\r\n\t\t\t\t\t\t\t}, 0);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tthis.firstCheckForRoute = true;\r\n\t\t\t\t}\r\n\t\t\t}),\r\n\t\t\tmap((w) => (w as NavigationEnd).urlAfterRedirects || (w as NavigationEnd).url)\r\n\t\t)\r\n\t);\r\n\r\n\tactiveRoutes = signal<NavItem[]>([]);\r\n\t/** History state'ten okunan aktif tab kimliği — `isActive(tab) = tab.tabId === activeTabId()`. */\r\n\tactiveTabId = signal<string>('');\r\n\r\n\t/**\r\n\t * Chrome bookmark click davranışı: aktif tab'ın navLink/navName'i güncellenir,\r\n\t * o tab'a navigate edilir. Yeni tab açılmaz. Mevcut tab'ın `tabId`'si KORUNUR —\r\n\t * Router'a `?_tab=tabId` ile navigate edilir, history state'e yazılır; navLink\r\n\t * storage'da CLEAN saklanır.\r\n\t */\r\n\tnavigateInCurrentTab(navItem: NavItem): void {\r\n\t\tconst idx = this.findActiveTabIndex();\r\n\t\tif (idx === -1) {\r\n\t\t\t// Aktif tab yok — fallback olarak yeni tab aç.\r\n\t\t\tthis.openInNewTabAndFocus(navItem);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst existingTab = this.activeRoutes()[idx];\r\n\t\tconst tabId = existingTab.tabId;\r\n\t\tconst newNavLink = cleanNavLink(navItem.navLink);\r\n\t\t// Aynı navLink'e tıklama → yine de navigate et (`onSameUrlNavigation: 'reload'`).\r\n\t\tif (existingTab.navLink === newNavLink) {\r\n\t\t\tsafeNavigate(this.router, withTabId(newNavLink, tabId), tabState(tabId));\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tthis.activeRoutes.update((routes) => {\r\n\t\t\tconst next = [...routes];\r\n\t\t\t// Mevcut tab'ın `tabId` VE `pinned` durumu korunur — menüden gelen navItem `pinned`\r\n\t\t\t// taşımaz; `{ ...navItem }` ile ezilirse sabitlenmiş tab unpin olurdu (tab içeriğini\r\n\t\t\t// değiştirmek sabitlemeyi bozmamalı).\r\n\t\t\tnext[idx] = { ...navItem, tabId, navLink: newNavLink, pinned: existingTab.pinned };\r\n\t\t\treturn next;\r\n\t\t});\r\n\t\tsafeNavigate(this.router, withTabId(newNavLink, tabId), tabState(tabId));\r\n\t}\r\n\r\n\t/**\r\n\t * Arka planda yeni tab aç — aktif tab değişmez, navigate edilmez. `tabId` her zaman\r\n\t * yeni üretilir (ya da caller verdiyse o kullanılır), exists check YOKTUR; aynı path\r\n\t * birden fazla tab'da bağımsız yaşayabilir.\r\n\t */\r\n\topenInBackgroundTab(navItem: NavItem): void {\r\n\t\tif (this.activeRoutes().length >= this.MAX_TABS) {\r\n\t\t\tthis.notifyMaxTabsReached();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst tabId = navItem.tabId || this.generateTabId();\r\n\t\tconst navLink = cleanNavLink(navItem.navLink);\r\n\t\tthis.activeRoutes.update((val) => [...val, { ...navItem, tabId, navLink }]);\r\n\t}\r\n\r\n\t/**\r\n\t * Yeni tab aç ve o tab'a geç. Exists check YOK — aynı path'in iki ayrı tab'i kabul edilir;\r\n\t * her tab kendi `tabId`'siyle ayrı componentRef instantiate eder.\r\n\t */\r\n\topenInNewTabAndFocus(navItem: NavItem): void {\r\n\t\tif (this.activeRoutes().length >= this.MAX_TABS) {\r\n\t\t\tthis.notifyMaxTabsReached();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst tabId = navItem.tabId || this.generateTabId();\r\n\t\tconst navLink = cleanNavLink(navItem.navLink);\r\n\t\tthis.activeRoutes.update((val) => [...val, { ...navItem, tabId, navLink }]);\r\n\t\tsafeNavigate(this.router, withTabId(navLink, tabId), tabState(tabId));\r\n\t}\r\n\r\n\t/** Programatik tab ekleme; activeRoute observable refresh path'i bunu kullanır. */\r\n\taddToActiveRoutes(navItem: NavItem): void {\r\n\t\tif (this.activeRoutes().length >= this.MAX_TABS) {\r\n\t\t\t// Programmatic çağrı — toast göstermek yerine sessizce return.\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst tabId = navItem.tabId || this.generateTabId();\r\n\t\tconst navLink = cleanNavLink(navItem.navLink);\r\n\t\t// Signal change detection reference identity ile çalışır — yeni array dön.\r\n\t\tthis.activeRoutes.update((val) => [...val, { ...navItem, tabId, navLink }]);\r\n\t}\r\n\r\n\t/**\r\n\t * Aktif tab'ı `activeTabId` üzerinden bulur. Aynı `navLink`'in birden fazla tab'i\r\n\t * olabileceği için navLink karşılaştırması ambiguous; tabId tek doğru kimlik.\r\n\t */\r\n\tprivate findActiveTabIndex(): number {\r\n\t\tconst tabId = this.activeTabId();\r\n\t\tif (!tabId) return -1;\r\n\t\treturn this.activeRoutes().findIndex((r) => r.tabId === tabId);\r\n\t}\r\n\r\n\t/** Tab limiti aşıldığında kullanıcıyı toast ile bilgilendirir. */\r\n\tprivate notifyMaxTabsReached(): void {\r\n\t\tthis.messageService.add({\r\n\t\t\tseverity: 'warn',\r\n\t\t\tsummary: this.translocoService.translate('tab.maxReachedSummary', { max: this.MAX_TABS }),\r\n\t\t\tdetail: this.translocoService.translate('tab.maxReachedDetail'),\r\n\t\t\tkey: 'toast-root'\r\n\t\t});\r\n\t}\r\n\r\n\t/** Anasayfa navLink'i — host menü root item'ından (yoksa '/'), clean format. */\r\n\tprivate homeNavLink(): string {\r\n\t\treturn cleanNavLink(this.homeNavItemProvider?.().navLink || '/');\r\n\t}\r\n\r\n\t/** Verilen tab anasayfaya mı ait. */\r\n\tprivate isHomeTab(item: NavItem): boolean {\r\n\t\treturn item.navLink === this.homeNavLink();\r\n\t}\r\n\r\n\t/**\r\n\t * Anasayfa tab'ı açıp ona navigate eder — tab listesi HİÇ boş kalmamalı (en az 1 tab).\r\n\t * NavItem host menü root item'ından gelir; yoksa `/` + i18n fallback ('tab.home', 'pi pi-home').\r\n\t */\r\n\tprivate openHomeTab(): Promise<boolean> {\r\n\t\tconst base = this.homeNavItemProvider?.();\r\n\t\tconst navLink = cleanNavLink(base?.navLink || '/');\r\n\t\tconst tabId = this.generateTabId();\r\n\t\tconst home: NavItem = {\r\n\t\t\ttabId,\r\n\t\t\tnavLink,\r\n\t\t\tnavName: base?.navName || this.translocoService.translate('tab.home'),\r\n\t\t\ticon: base?.icon || 'pi pi-home'\r\n\t\t};\r\n\t\tthis.activeRoutes.update((val) => [...val, home]);\r\n\t\treturn safeNavigate(this.router, withTabId(navLink, tabId), tabState(tabId));\r\n\t}\r\n\r\n\tcloseNavigation(navItem: NavItem): void {\r\n\t\t// `tabId` ile bul — aynı path'in birden fazla tab'i olabileceği için `navLink`\r\n\t\t// karşılaştırması ambiguous olur, kimlik bazlı arama tek doğru yöntem.\r\n\t\tconst idx = this.activeRoutes().findIndex((r) => r.tabId === navItem.tabId);\r\n\t\tconsole.log(`[NavService] closeNavigation tabId=\"${navItem.tabId}\" navLink=\"${navItem.navLink}\" index=${idx}`);\r\n\t\tif (idx === -1) return;\r\n\r\n\t\tconst closedItem = this.activeRoutes()[idx];\r\n\t\t// Son kalan tab anasayfaysa kapatma — her zaman en az 1 (anasayfa) tab açık kalmalı.\r\n\t\tif (this.activeRoutes().length === 1 && this.isHomeTab(closedItem)) return;\r\n\t\t// Signal change detection reference identity ile çalışır — yeni array dön.\r\n\t\tthis.activeRoutes.update((val) => val.filter((_, i) => i !== idx));\r\n\r\n\t\tconst cleanup = (): void => this.cleanupTabHandle(closedItem);\r\n\t\tconst closingActiveTab = this.activeTabId() === closedItem.tabId;\r\n\r\n\t\tif (closingActiveTab) {\r\n\t\t\t// Aktif tab kapatılıyor — başka tab'a (veya home'a) navigate edip cleanup'ı SONRA tetikle.\r\n\t\t\t// Aksi takdirde strategy henüz `store('mfe:${remoteName}:${tabId}', handle)`'i yapmadan\r\n\t\t\t// `deleteStoredRoute` çağrılır ve cleanup boş hit eder; ardından detach tamamlanınca\r\n\t\t\t// element hidden container'da orphan kalır (race condition).\r\n\t\t\tconst remaining = this.activeRoutes();\r\n\t\t\tconst willNavigateItem = remaining.length > 0 ? remaining[idx] || remaining[idx - 1] : null;\r\n\t\t\tif (willNavigateItem) {\r\n\t\t\t\tsafeNavigate(\r\n\t\t\t\t\tthis.router,\r\n\t\t\t\t\twithTabId(willNavigateItem.navLink, willNavigateItem.tabId),\r\n\t\t\t\t\ttabState(willNavigateItem.tabId)\r\n\t\t\t\t).finally(cleanup);\r\n\t\t\t} else {\r\n\t\t\t\t// Hiç tab kalmadı — boş bırakma, anasayfa tab'ı aç (en az 1 tab kuralı).\r\n\t\t\t\tthis.openHomeTab().finally(cleanup);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\t// Aktif değildi — navigation gerekmez. Ancak arka planda açılıp (`openInBackgroundTab`)\r\n\t\t\t// hiç görüntülenmemiş tab henüz Router tarafından `store()` edilmemiş olabilir; cleanup'ı\r\n\t\t\t// bir microtask geciktirip olası store cycle'ına fırsat veriyoruz (orphan handle önlemi).\r\n\t\t\tvoid Promise.resolve().then(cleanup);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Bir tab hariç diğer tüm tab'ları kapatır. Aktif tab kapatılanlardan ise `keepItem`'a geçer.\r\n\t * **Sabit tab'lar korunur** (Chrome davranışı) — pinned olanlar her zaman açık kalır.\r\n\t */\r\n\tcloseOthers(keepItem: NavItem): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tconst toClose = all.filter((r) => r.tabId !== keepItem.tabId && !r.pinned);\r\n\t\tif (toClose.length === 0) return;\r\n\t\tconst survivorIds = new Set([keepItem.tabId, ...all.filter((r) => r.pinned).map((r) => r.tabId)]);\r\n\t\tthis.activeRoutes.set(all.filter((r) => survivorIds.has(r.tabId)));\r\n\t\tconst cleanupAll = (): void => toClose.forEach((t) => this.cleanupTabHandle(t));\r\n\t\tif (this.activeTabId() !== keepItem.tabId) {\r\n\t\t\tsafeNavigate(\r\n\t\t\t\tthis.router,\r\n\t\t\t\twithTabId(keepItem.navLink, keepItem.tabId),\r\n\t\t\t\ttabState(keepItem.tabId)\r\n\t\t\t).finally(cleanupAll);\r\n\t\t} else {\r\n\t\t\tcleanupAll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Verilen tab'ın sağındaki tüm tab'ları kapatır. **Sabit tab'lar korunur** —\r\n\t * pinned bir tab sağda olsa bile kapatılmaz (Chrome davranışı).\r\n\t */\r\n\tcloseToRight(item: NavItem): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tconst idx = all.findIndex((r) => r.tabId === item.tabId);\r\n\t\tif (idx === -1) return;\r\n\t\tconst toClose = all.slice(idx + 1).filter((r) => !r.pinned);\r\n\t\tif (toClose.length === 0) return;\r\n\t\tconst toCloseIds = new Set(toClose.map((r) => r.tabId));\r\n\t\tthis.activeRoutes.set(all.filter((r) => !toCloseIds.has(r.tabId)));\r\n\t\tconst activeWasClosed = toClose.some((r) => r.tabId === this.activeTabId());\r\n\t\tconst cleanupAll = (): void => toClose.forEach((t) => this.cleanupTabHandle(t));\r\n\t\tif (activeWasClosed) {\r\n\t\t\tsafeNavigate(\r\n\t\t\t\tthis.router,\r\n\t\t\t\twithTabId(item.navLink, item.tabId),\r\n\t\t\t\ttabState(item.tabId)\r\n\t\t\t).finally(cleanupAll);\r\n\t\t} else {\r\n\t\t\tcleanupAll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Sabit olmayan tüm tab'ları kapatır. **Sabit tab'lar korunur** — kullanıcı \"Tümünü Kapat\"\r\n\t * isterse bile pinned tab'lar açık kalır (Chrome davranışı). Hiç pinned tab yoksa ana sayfaya\r\n\t * navigate edilir.\r\n\t */\r\n\tcloseAll(): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tif (all.length === 0) return;\r\n\t\tconst toClose = all.filter((r) => !r.pinned);\r\n\t\tif (toClose.length === 0) return;\r\n\t\tconst survivors = all.filter((r) => r.pinned);\r\n\t\tthis.activeRoutes.set(survivors);\r\n\t\tconst cleanupAll = (): void => toClose.forEach((t) => this.cleanupTabHandle(t));\r\n\t\t// Aktif tab kapatılanlardan ise: ya bir pinned tab'a geç (yaşıyorsa), yoksa ana sayfaya.\r\n\t\tconst activeWasClosed = toClose.some((r) => r.tabId === this.activeTabId());\r\n\t\tif (activeWasClosed) {\r\n\t\t\tif (survivors.length > 0) {\r\n\t\t\t\tconst target = survivors[0];\r\n\t\t\t\tsafeNavigate(this.router, withTabId(target.navLink, target.tabId), tabState(target.tabId)).finally(cleanupAll);\r\n\t\t\t} else {\r\n\t\t\t\t// Pinned survivor yok — boş bırakma, anasayfa tab'ı aç (en az 1 tab kuralı).\r\n\t\t\t\tthis.openHomeTab().finally(cleanupAll);\r\n\t\t\t}\r\n\t\t} else {\r\n\t\t\tcleanupAll();\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Tab sabitleme toggle — Chrome-vari pinning. Pinned tab'lar tab bar'ın **soluna** taşınır\r\n\t * (insertion sırasını koruyarak), kompakt görünür, `closeOthers`/`closeToRight`/`closeAll`\r\n\t * çağrılarından korunur. Aynı pinned tıklanırsa sabitlemeyi kaldırır → normal alanın **sonuna**\r\n\t * taşınır.\r\n\t */\r\n\ttogglePin(item: NavItem): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tconst idx = all.findIndex((r) => r.tabId === item.tabId);\r\n\t\tif (idx === -1) return;\r\n\t\tconst target = all[idx];\r\n\t\tconst newPinned = !target.pinned;\r\n\t\t// Önce target'ı array'den çıkar, sonra pinned/normal bloğunun **sonuna** ekle.\r\n\t\t// Bu Chrome davranışı: pinlenince pinned bloğun sonuna (en sağa), unpinlenince normal\r\n\t\t// bloğun başına (pinned'in hemen sağına).\r\n\t\tconst without = all.filter((_, i) => i !== idx);\r\n\t\tconst pinnedSegment = without.filter((r) => r.pinned);\r\n\t\tconst normalSegment = without.filter((r) => !r.pinned);\r\n\t\tconst updated: NavItem = { ...target, pinned: newPinned };\r\n\t\t// Pin → pinned bloğun sonuna; unpin → normal bloğun başına. Her iki durumda da `updated`,\r\n\t\t// pinned ve normal segmentlerin SINIRINA yerleşir (pozisyon aynı) → tek ifade yeterli.\r\n\t\tconst next = [...pinnedSegment, updated, ...normalSegment];\r\n\t\tthis.activeRoutes.set(next);\r\n\t}\r\n\r\n\t/** Sıradaki tab'a (circular) geçer. */\r\n\tgoToNextTab(): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tif (all.length === 0) return;\r\n\t\tconst idx = this.findActiveTabIndex();\r\n\t\tconst nextIdx = idx === -1 ? 0 : (idx + 1) % all.length;\r\n\t\tconst target = all[nextIdx];\r\n\t\tsafeNavigate(this.router, withTabId(target.navLink, target.tabId), tabState(target.tabId));\r\n\t}\r\n\r\n\t/** Önceki tab'a (circular) geçer. */\r\n\tgoToPrevTab(): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tif (all.length === 0) return;\r\n\t\tconst idx = this.findActiveTabIndex();\r\n\t\tconst prevIdx = idx === -1 ? all.length - 1 : (idx - 1 + all.length) % all.length;\r\n\t\tconst target = all[prevIdx];\r\n\t\tsafeNavigate(this.router, withTabId(target.navLink, target.tabId), tabState(target.tabId));\r\n\t}\r\n\r\n\t/** Index'teki tab'a geçer (Alt+1..9 için 0-tabanlı index). */\r\n\tgoToTabByIndex(index: number): void {\r\n\t\tconst all = this.activeRoutes();\r\n\t\tif (index < 0 || index >= all.length) return;\r\n\t\tconst target = all[index];\r\n\t\tsafeNavigate(this.router, withTabId(target.navLink, target.tabId), tabState(target.tabId));\r\n\t}\r\n\r\n\t/**\r\n\t * Verilen tab'a navigate — UI'dan (tab tıklama) çağrılır. Router'a `_tab` ile URL ve\r\n\t * `extras.state` ile tabId verir; UrlSerializer adres çubuğunu temiz tutar.\r\n\t */\r\n\tnavigateToTab(item: NavItem): void {\r\n\t\tif (!item?.navLink || !item?.tabId) return;\r\n\t\tconst url = withTabId(item.navLink, item.tabId);\r\n\t\tconsole.log(`[NavService] navigateToTab tabId=\"${item.tabId}\" navLink=\"${item.navLink}\" → url=\"${url}\"`);\r\n\t\tsafeNavigate(this.router, url, tabState(item.tabId));\r\n\t}\r\n\r\n\t/**\r\n\t * Belirli bir tab'ın `navLink`'ini ve (varsa) `navName`'ini günceller. **Kaynağa-bağlı**\r\n\t * (per-tab) sync — caller hangi tab'ın URL'i olduğunu söyler, NavService aktif tab\r\n\t * varsayımında bulunmaz. Hidden container'daki async MFE NavigationEnd'leri aktif tab'ın\r\n\t * state'ini KONTAMİNE EDEMEZ.\r\n\t *\r\n\t * `title` parametresi MFE Router deepest route'unun `Route.title` veya `data.tabName`\r\n\t * değerinden gelir → kullanıcı detail/edit gibi sub-sayfalara navigate olduğunda tab\r\n\t * adı dinamik güncellenir. `title` undefined ise tab.navName değişmez (statik kalır).\r\n\t *\r\n\t * AppLayoutComponent effect'ten `bridge.activeMFEUrl` (`{tabId, url, title}`) ile çağrılır.\r\n\t */\r\n\tsyncActiveTabNavLinkForTab(tabId: string, rawUrl: string, title?: string): void {\r\n\t\tif (!tabId || !rawUrl) return;\r\n\t\tconst cleanUrl = cleanNavLink(rawUrl);\r\n\t\tconst target = this.activeRoutes().find((t) => t.tabId === tabId);\r\n\t\tif (!target) return;\r\n\t\tconst linkChanged = target.navLink !== cleanUrl;\r\n\t\tconst nameChanged = !!title && target.navName !== title;\r\n\t\tif (!linkChanged && !nameChanged) return;\r\n\t\tconst newNavLink = linkChanged ? cleanUrl : target.navLink;\r\n\t\tconst newName = nameChanged ? title! : target.navName;\r\n\t\tconsole.log(\r\n\t\t\t`[NavService] syncActiveTabNavLinkForTab tab=\"${tabId}\" ` +\r\n\t\t\t`navLink \"${target.navLink}\" → \"${newNavLink}\" name \"${target.navName}\" → \"${newName}\"`\r\n\t\t);\r\n\t\tthis.activeRoutes.update((routes) =>\r\n\t\t\troutes.map((t) => (t.tabId === tabId ? { ...t, navLink: newNavLink, navName: newName } : t))\r\n\t\t);\r\n\t}\r\n\r\n\t/**\r\n\t * Tab context-menu \"Yinele\" (Chrome \"Duplicate\"): mevcut tab'ın path'i kopyalanır, yeni bir\r\n\t * `tabId` üretilir ve yeni tab oluşturulur. Strategy `_tab` query param'ını route key'in\r\n\t * parçası yaptığı için yeni tab bağımsız `storedRoutes` slot'una yazılır → bağımsız\r\n\t * componentRef + state. Mevcut tab korunur, kullanıcı her ikisinde de bağımsız çalışabilir.\r\n\t */\r\n\tduplicateTab(item: NavItem): void {\r\n\t\tif (!item?.navLink) return;\r\n\t\tif (this.activeRoutes().length >= this.MAX_TABS) {\r\n\t\t\tthis.notifyMaxTabsReached();\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst newTabId = this.generateTabId();\r\n\t\tconst newNavLink = cleanNavLink(item.navLink);\r\n\t\tthis.activeRoutes.update((val) => [\r\n\t\t\t...val,\r\n\t\t\t{ ...item, tabId: newTabId, navLink: newNavLink }\r\n\t\t]);\r\n\t\tsafeNavigate(this.router, withTabId(newNavLink, newTabId), tabState(newTabId));\r\n\t}\r\n\r\n\treorderActiveRoutes(newRoutes: NavItem[]): void {\r\n\t\t// Pinned/normal sınırı koruması — sabit tab'lar tab bar'ın solunda (insertion sırasıyla),\r\n\t\t// normal tab'lar sağında kalır. CDK drag drop bir tab'ı yanlış segmente düşürürse\r\n\t\t// burada otomatik düzeltilir. Segment içi sıra korunur.\r\n\t\tconst pinned = newRoutes.filter((r) => r.pinned);\r\n\t\tconst normal = newRoutes.filter((r) => !r.pinned);\r\n\t\tthis.activeRoutes.set([...pinned, ...normal]);\r\n\t}\r\n\r\n\t/**\r\n\t * Menu config'inden navLink'e karşılık gelen item'i longest-prefix match ile bulup\r\n\t * aktif dilde label + icon döner. Adres çubuğuna URL yapıştırarak deep link açıldığında\r\n\t * tab'ın menüden açılan tab'la aynı görünüme sahip olmasını sağlar.\r\n\t *\r\n\t * Lookup `menuItemsProvider` üzerinden — host shell `setMenuItemsProvider` ile\r\n\t * `bridge.hostMenuItems()`'a bağlar. Provider yoksa veya eşleşme yoksa `null` döner ve\r\n\t * caller URL segment fallback'ine düşer.\r\n\t */\r\n\tprivate resolveNavInfoFromMenu(navLink: string): { navName: string; icon?: string } | null {\r\n\t\t// Anasayfa (menüdeki `root` öğesi) çoğu zaman `routerLink` ile eşleşmez (routerLink'i `/`\r\n\t\t// veya boş olabilir, longest-prefix match'e takılmaz) → `/` için fallback \"Page\" + jenerik\r\n\t\t// ikon dönerdi. Home provider varsa ad/ikonu doğrudan oradan (root item'dan) çöz.\r\n\t\tif (this.homeNavItemProvider) {\r\n\t\t\tconst home = this.homeNavItemProvider();\r\n\t\t\t// Anasayfa navLink eşleşiyorsa dön — menü boş/geç yüklendiyse ya da menüde `root` öğesi\r\n\t\t\t// yoksa navName/icon boş gelebilir; i18n ('tab.home') + ev ikonu fallback ile asla\r\n\t\t\t// menü-segment fallback'ine (\"Page\") düşme.\r\n\t\t\tif (navLink === cleanNavLink(home.navLink || '/')) {\r\n\t\t\t\treturn {\r\n\t\t\t\t\tnavName: home.navName || this.translocoService.translate('tab.home'),\r\n\t\t\t\t\ticon: home.icon || 'pi pi-home'\r\n\t\t\t\t};\r\n\t\t\t}\r\n\t\t}\r\n\t\tconst items = this.menuItemsProvider?.();\r\n\t\tif (!items?.length) return null;\r\n\t\tconst path = navLink.split('?')[0];\r\n\t\tconst matched = this.findMenuItemForRoute(items, path);\r\n\t\tif (!matched) return null;\r\n\t\tconst lang = this.translocoService.getActiveLang();\r\n\t\tconst label = matched.label as Record<string, string> | undefined;\r\n\t\tconst navName = label?.[lang] || label?.['tr'] || label?.['en'] || '';\r\n\t\tif (!navName) return null;\r\n\t\treturn { navName, icon: matched.icon };\r\n\t}\r\n\r\n\t/**\r\n\t * Menü/i18n yüklenince tab'ları (özellikle anasayfa) menüyle revize eder — refresh/ilk açılış\r\n\t * path'inde tab fallback isim/iconla eklenmiş olabilir (menü veya çeviri o anda hazır değildi).\r\n\t * Tetikleyiciler: `setMenuItemsProvider`/`setHomeNavItemProvider`, `translationLoadSuccess`\r\n\t * event'i ve host shell menü signal'i değişimi (`AppLayoutComponent` effect). Public — host\r\n\t * layout menü async yüklenince çağırır ki anasayfa adı `tab.home` fallback'inde takılmasın.\r\n\t */\r\n\treconcileTabsWithMenu(): void {\r\n\t\tconst tabs = this.activeRoutes();\r\n\t\tif (!tabs.length) return;\r\n\t\tlet changed = false;\r\n\t\tconst next = tabs.map((t) => {\r\n\t\t\tconst info = this.resolveNavInfoFromMenu(t.navLink);\r\n\t\t\tif (!info) return t;\r\n\t\t\tif (t.navName === info.navName && t.icon === info.icon) return t;\r\n\t\t\tchanged = true;\r\n\t\t\treturn { ...t, navName: info.navName, icon: info.icon };\r\n\t\t});\r\n\t\tif (changed) this.activeRoutes.set(next);\r\n\t}\r\n\r\n\t/**\r\n\t * Menu ağacında verilen path için en spesifik (longest routerLink prefix) eşleşmeyi bulur.\r\n\t * `mw/app-management/view-app` için hem `mw` hem `mw/app-management/view-app` eşleşse,\r\n\t * daha uzun olan kazanır → leaf menu item'ın label/icon'u kullanılır.\r\n\t *\r\n\t * Path leading slash içerebilir (Router URL formatı), menu config routerLink'leri\r\n\t * genelde leading slash'sız (`mw/meters`); ikisini normalize edip karşılaştırırız.\r\n\t */\r\n\tprivate findMenuItemForRoute(items: PluginMenuItem[], path: string): PluginMenuItem | undefined {\r\n\t\tconst normalize = (p: string): string => (p.startsWith('/') ? p.slice(1) : p);\r\n\t\tconst normalizedPath = normalize(path);\r\n\t\tlet best: { length: number; item: PluginMenuItem } | undefined;\r\n\t\tconst visit = (list: PluginMenuItem[]): void => {\r\n\t\t\tfor (const it of list) {\r\n\t\t\t\tif (it.routerLink) {\r\n\t\t\t\t\tconst r = normalize(it.routerLink);\r\n\t\t\t\t\tif (r && (normalizedPath === r || normalizedPath.startsWith(r + '/'))) {\r\n\t\t\t\t\t\tconst length = r.length;\r\n\t\t\t\t\t\tif (!best || length > best.length) best = { length, item: it };\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\tif (it.items?.length) visit(it.items);\r\n\t\t\t}\r\n\t\t};\r\n\t\tvisit(items);\r\n\t\treturn best?.item;\r\n\t}\r\n\r\n\t/**\r\n\t * Bir tab'ın stored route handle'ını strategy'den temizler. Key formatı\r\n\t * `mfe:${remoteName}:${tabId}` — strategy `processCleanupKey` matcher key'inden hem\r\n\t * MFE custom element handle'ını hem o tab'a ait child route handle'larını düşürür.\r\n\t */\r\n\tprivate cleanupTabHandle(item: NavItem): void {\r\n\t\tconst remoteName = extractRemoteName(item.navLink);\r\n\t\tif (!remoteName || !item.tabId) return;\r\n\t\tconsole.log(`[NavService] cleanupTabHandle remoteName=\"${remoteName}\" tabId=\"${item.tabId}\"`);\r\n\t\tthis.routeCloseService.deleteStoredRoute(`mfe:${remoteName}:${item.tabId}`);\r\n\t}\r\n}\r\n","import { Injectable, inject } from '@angular/core';\r\n\r\nimport { ContextMenu } from 'primeng/contextmenu';\r\n\r\nimport { TranslocoService } from '@ngneat/transloco';\r\n\r\nimport { NavItem, NavService } from './nav.service';\r\n\r\n/**\r\n * Cross-injector singleton slot. `NavLinkContextMenuService` `providedIn: 'root'` olduğu\r\n * için host ve her MFE remote'unda AYRI instance yaşar — `register(cm)` sadece host\r\n * shell'de çağrılır, MFE'lerden gelen `open(...)` çağrıları kendi instance'ında `cm`\r\n * bulamaz. Bu yüzden register sırasında host instance'ı global slot'a yazar; MFE\r\n * instance'ları `cm` null ise bu slot üzerinden host'a delege eder.\r\n *\r\n * `bridge` modülündeki `__arilMfeBridge__` ile aynı pattern.\r\n */\r\nconst SLOT = '__arilNavLinkContextMenuOpen';\r\nconst COMMAND_SLOT = '__arilNavCommand';\r\ntype GlobalOpenFn = (event: MouseEvent, navItem: NavItem) => void;\r\ntype GlobalCommandFn = (navItem: NavItem) => void;\r\ntype GlobalSlotHost = { [SLOT]?: GlobalOpenFn; [COMMAND_SLOT]?: GlobalCommandFn };\r\n\r\n/**\r\n * Tab navigasyonu yapan tüm linkli yapılar için ortak sağ-tık context menu servisi.\r\n * Tek bir global PrimeNG `ContextMenu` instance'ı host shell (`AppLayoutComponent`)\r\n * template'inde yaşar; her sayfa kendi `ContextMenu` enstantiate etmek yerine bu\r\n * service üzerinden `open(event, navItem)` çağırır.\r\n *\r\n * Servis hangi link tıklandıysa onun `NavItem`'iyle menü modelini yeniden inşa eder\r\n * ve `cm.show(event)` ile açar — tüm tüketiciler için tek source-of-truth.\r\n *\r\n * **Kayıt sözleşmesi**: shell mount olunca `register(cm)` çağırır. MFE'lerden gelen\r\n * çağrılar global slot üzerinden host'a delege edilir.\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NavLinkContextMenuService {\r\n\tprivate readonly navService = inject(NavService);\r\n\tprivate readonly translocoService = inject(TranslocoService);\r\n\tprivate cm: ContextMenu | null = null;\r\n\r\n\tregister(cm: ContextMenu): void {\r\n\t\tthis.cm = cm;\r\n\t\t// MFE'lerden gelen open çağrıları için cross-injector slot kur — bu instance'ın\r\n\t\t// `openLocal`'ını sarmalayan bir function global slot'a yazılır.\r\n\t\tconst slotHost = globalThis as unknown as GlobalSlotHost;\r\n\t\tslotHost[SLOT] = (event, navItem) => this.openLocal(event, navItem);\r\n\t\t// Programatik \"yeni tab aç ve geç\" — MFE'lerden (eski `window.open('#'+url,'_blank')`\r\n\t\t// yerine) host NavService'e delege için cross-injector slot.\r\n\t\tslotHost[COMMAND_SLOT] = (navItem) => this.navService.openInNewTabAndFocus(navItem);\r\n\t}\r\n\r\n\topen(event: MouseEvent, navItem: NavItem): void {\r\n\t\t// Kendi cm'imiz varsa (host instance) doğrudan aç\r\n\t\tif (this.cm) {\r\n\t\t\tthis.openLocal(event, navItem);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\t// MFE instance: global slot üzerinden host'a delege\r\n\t\tconst slotHost = globalThis as unknown as GlobalSlotHost;\r\n\t\tconst hostOpen = slotHost[SLOT];\r\n\t\tif (hostOpen) {\r\n\t\t\thostOpen(event, navItem);\r\n\t\t}\r\n\t}\r\n\r\n\t/**\r\n\t * Programatik \"yeni tab aç ve geç\" — MFE component'lerinden çağrılır (eski\r\n\t * `window.open('#'+url,'_blank')` yerine). Host instance'ta (`cm` set) doğrudan\r\n\t * `NavService.openInNewTabAndFocus`'u çağırır; MFE instance'ında `__arilNavCommand`\r\n\t * global slot'u üzerinden host'a delege eder. Host shell henüz mount olmadıysa\r\n\t * (slot boş) sessizce no-op olur.\r\n\t */\r\n\topenInNewTabAndFocus(navItem: NavItem): void {\r\n\t\tif (this.cm) {\r\n\t\t\tthis.navService.openInNewTabAndFocus(navItem);\r\n\t\t\treturn;\r\n\t\t}\r\n\t\tconst slotHost = globalThis as unknown as GlobalSlotHost;\r\n\t\tconst hostCommand = slotHost[COMMAND_SLOT];\r\n\t\tif (hostCommand) {\r\n\t\t\thostCommand(navItem);\r\n\t\t}\r\n\t}\r\n\r\n\tprivate openLocal(event: MouseEvent, navItem: NavItem): void {\r\n\t\tif (!this.cm) return;\r\n\t\tconst t = (key: string): string => this.translocoService.translate(key);\r\n\t\tthis.cm.model = [\r\n\t\t\t{\r\n\t\t\t\tlabel: t('navLink.openHere'),\r\n\t\t\t\ticon: 'pi pi-arrow-right',\r\n\t\t\t\tcommand: () => this.navService.navigateInCurrentTab(navItem)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: t('navLink.openInNewTab'),\r\n\t\t\t\ticon: 'pi pi-external-link',\r\n\t\t\t\tcommand: () => this.navService.openInBackgroundTab(navItem)\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tlabel: t('navLink.openInNewTabAndFocus'),\r\n\t\t\t\ticon: 'pi pi-clone',\r\n\t\t\t\tcommand: () => this.navService.openInNewTabAndFocus(navItem)\r\n\t\t\t}\r\n\t\t];\r\n\t\tthis.cm.show(event);\r\n\t}\r\n}\r\n","import { Directive, HostListener, Input, inject } from '@angular/core';\r\n\r\nimport { NavLinkContextMenuService } from './nav-link-context-menu.service';\r\nimport { NavItem } from './nav.service';\r\n\r\n/**\r\n * Linkli her HTML elementine sağ-tık → tab context menüsü ekleyen directive.\r\n *\r\n * **Kullanım**: navLink/navName (ve opsiyonel icon) bilgisini object literal olarak verin:\r\n * ```html\r\n * <a [attr.href]=\"'#/' + path\"\r\n * [arilNavLink]=\"{ tabId: '', navLink: path, navName: 'Sayfa Adı', icon: 'pi pi-cog' }\"\r\n * (click)=\"...\">\r\n * ```\r\n *\r\n * Sağ tık → \"Bu sekmede aç / Yeni sekmede aç / Yeni sekmede aç ve geç\" menüsü açılır;\r\n * komutlar `NavService` üzerinden ilgili tab eylemini tetikler. Ctrl+Click / Middle Click\r\n * gibi mevcut shortcut'lar değişmez — bu menü onlara klavye/fare bilgisi olmayan\r\n * kullanıcılar için keşfedilebilir bir alternatif.\r\n */\r\n@Directive({\r\n\tstandalone: true,\r\n\tselector: '[arilNavLink]'\r\n})\r\nexport class NavLinkDirective {\r\n\t/**\r\n\t * Optional çünkü site-map gibi conditional yapılarda template binding'i `node.routerLink ? {...} : null`\r\n\t * şeklinde çalışıyor — required işaretlemek `null/undefined` durumunda TS hatası verir. Boş veya\r\n\t * `navLink`'i olmayan navItem için `onContextMenu` no-op çalışır.\r\n\t */\r\n\t@Input('arilNavLink') navItem?: NavItem | null;\r\n\r\n\tprivate readonly contextMenuService = inject(NavLinkContextMenuService);\r\n\r\n\t@HostListener('contextmenu', ['$event'])\r\n\tonContextMenu(event: MouseEvent): void {\r\n\t\tif (!this.navItem?.navLink) return;\r\n\t\tevent.preventDefault();\r\n\t\tthis.contextMenuService.open(event, this.navItem);\r\n\t}\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { DefaultUrlSerializer, UrlTree } from '@angular/router';\r\n\r\n/**\r\n * `_tab` query param'ını adres çubuğunda gizleyen `UrlSerializer`. Param Router'ın\r\n * internal `UrlTree.queryParams`'ında korunur (parse imzasız, default davranış);\r\n * sadece `serialize` çıktısı üzerinden — yani `Router.url`, `NavigationEnd.urlAfterRedirects`\r\n * ve browser address bar — `_tab` strip edilir.\r\n *\r\n * **Sonuç**: `CustomRouteReuseStrategy.getRouteKey` `route.queryParams['_tab']`'ı\r\n * normal şekilde okumaya devam eder (parse path'inde değişiklik yok), ama kullanıcının\r\n * gördüğü URL temizdir.\r\n *\r\n * **NavService etkisi**: `activeRoute()` artık `_tab` taşımaz. Aktif tab tespiti\r\n * `activeTabId` signal'i üzerinden yapılmalı (NavService bunu `window.history.state`'ten\r\n * okur — `navigateByUrl(url, { state: { _tab } })` ile her navigation'da set edilir).\r\n */\r\n@Injectable({ providedIn: 'root' })\r\nexport class TabAwareUrlSerializer extends DefaultUrlSerializer {\r\n\t/** `parse` default davranışla bırakıldı — input URL'inde `_tab` varsa korunur (refresh deep link). */\r\n\r\n\toverride serialize(tree: UrlTree): string {\r\n\t\t// Default serialize'ı tut, sonra `_tab`'ı string seviyesinde (split/filter) çıkar.\r\n\t\t// `URLSearchParams` round-trip'inden KAÇINIYORUZ: diğer query param'ların Angular\r\n\t\t// encoding'ini bozar (örn. `a%20b` → `a+b`) ve bu string `Router.url`/`NavigationEnd`\r\n\t\t// olarak kullanıldığı için `cleanNavLink` karşılaştırmaları kaçabilirdi. Diğer param'lara\r\n\t\t// HİÇ dokunmuyoruz — yalnız `_tab` segment'ini düşürüyoruz.\r\n\t\tconst url = super.serialize(tree);\r\n\t\tif (!url.includes('_tab=')) return url;\r\n\r\n\t\tconst fragmentIdx = url.indexOf('#');\r\n\t\tconst fragment = fragmentIdx >= 0 ? url.slice(fragmentIdx) : '';\r\n\t\tconst beforeFragment = fragmentIdx >= 0 ? url.slice(0, fragmentIdx) : url;\r\n\r\n\t\tconst queryIdx = beforeFragment.indexOf('?');\r\n\t\tif (queryIdx < 0) return url;\r\n\r\n\t\tconst path = beforeFragment.slice(0, queryIdx);\r\n\t\tconst query = beforeFragment\r\n\t\t\t.slice(queryIdx + 1)\r\n\t\t\t.split('&')\r\n\t\t\t.filter((p) => p !== '_tab' && !p.startsWith('_tab='))\r\n\t\t\t.join('&');\r\n\t\treturn query ? `${path}?${query}${fragment}` : `${path}${fragment}`;\r\n\t}\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["map"],"mappings":";;;;;;;;;;;;;;AAEA,MAAM,gBAAgB,GAAG,IAAI,GAAG,EAAoB,CAAC;AAE/C,SAAU,mBAAmB,CAAC,SAA2B,EAAA;IAC9D,gBAAgB,CAAC,KAAK,EAAE,CAAC;IACzB,mBAAmB,CAAC,SAAS,CAAC,CAAC;AAChC,CAAC;AAEK,SAAU,mBAAmB,CAAC,GAAW,EAAA;AAC9C,IAAA,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAC1D,IAAA,OAAO,gBAAgB,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;AAC7C,CAAC;AAED,SAAS,mBAAmB,CAAC,KAAuB,EAAA;AACnD,IAAA,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACzB,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE;AACnD,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACtD,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;SACtD;AAED,QAAA,IAAI,IAAI,CAAC,KAAK,EAAE,MAAM,EAAE;AACvB,YAAA,mBAAmB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SAChC;KACD;AACF;;ACjBM,MAAO,SAAU,SAAQ,iBAAiB,CAAA;AAC/C,IAAA,WAAA,GAAA;QACC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC;KAC/C;AAEQ,IAAA,MAAM,eAAe,CAC7B,KAA6B,EAC7B,KAA0B,EAAA;AAE1B,QAAA,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE;AACxB,YAAA,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;SACxE;QAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;AAEtD,QAAA,IAAI,cAAc,EAAE,MAAM,EAAE;YAC3B,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;YACzE,IAAI,CAAC,OAAO,EAAE;gBACb,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC;aACjD;SACD;QAED,OAAO,IAAI,CAAC,aAAa,CAAC;KAC1B;8GAvBW,SAAS,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAT,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,SAAS,cADI,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,SAAS,EAAA,UAAA,EAAA,CAAA;kBADrB,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACmBlC;MACa,uBAAuB,CAAA;AAqBlC,IAAA,WAAA,CAAoB,KAAqB,EAAA;QAArB,IAAK,CAAA,KAAA,GAAL,KAAK,CAAgB;QAZjC,IAAW,CAAA,WAAA,GAAG,KAAK,CAAC;;;QAGpB,IAAgB,CAAA,gBAAA,GAAoD,EAAE,CAAC;;;;;QAM/E,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;QACrB,IAAY,CAAA,YAAA,GAAG,KAAK,CAAC;KAEwB;IAE7C,QAAQ,GAAA;;;AAGN,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,CAAC,GAAG,CAAC,yDAAyD,CAAC,CAAC;;YAEvE,UAAU,CAAC,MAAK;gBACd,IAAI,CAAC,cAAc,EAAE,CAAC;aACvB,EAAE,CAAC,CAAC,CAAC;SACP;KACF;IAED,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,WAAW;YAAE,OAAO;QAE9C,IAAI,CAAC,aAAa,EAAE,CAAC;KACtB;IAEO,aAAa,GAAA;QACnB,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;;;AAIzC,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAgD,CAAC;AACrE,QAAA,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,EAAE;YAC7B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACjC;KACF;IAEO,WAAW,GAAA;QACjB,IAAI,CAAC,IAAI,CAAC,OAAO;YAAE,OAAO;;QAE1B,IAAI,CAAC,cAAc,EAAE,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;AAEzB,QAAA,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;YAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACnC,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;AAC9C,YAAA,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;SACtD;KACF;IAEO,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;YAC3B,OAAO;SACR;QACD,KAAK,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,gBAAgB,EAAE;YACrD,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACjD;AACD,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE,CAAC;KAC5B;IAEO,cAAc,GAAA;AACpB,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE;AACjB,YAAA,OAAO,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;YAC5C,OAAO;SACR;AAED,QAAA,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE;AAC3B,YAAA,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAC;;YAEvE,OAAO;SACR;;AAGD,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAElD,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;;AAE1C,YAAA,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;SAClF;AAAM,aAAA,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;;AAExD,YAAA,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;gBAC3B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACnD;YACD,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,mCAAmC,CAAC,CAAC;SAClD;aAAM;;YAEL,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,YAAA,OAAO,CAAC,GAAG,CAAC,gDAAgD,CAAC,CAAC;SAC/D;KACF;IAEO,kBAAkB,GAAA;QACxB,MAAM,IAAI,GAAG,UAAqF,CAAC;AACnG,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,iCAAiC,CAAC;QACvD,IAAI,CAAC,SAAS,EAAE;AACd,YAAA,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1C,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,YAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;AACtC,YAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;AACjC,YAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;AAChC,YAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;AACtC,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iCAAiC,GAAG,SAAS,CAAC;SACpD;AACD,QAAA,OAAO,SAAS,CAAC;KAClB;AAED,IAAA,MAAM,kBAAkB,GAAA;AACtB,QAAA,MAAM,OAAO,GACX,IAAI,CAAC,OAAO,IAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAmC,CAAC;QAE3E,IAAI,CAAC,OAAO,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;YACjD,OAAO;SACR;;AAGD,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;YAChB,OAAO;SACR;AAED,QAAA,IAAI;AACF,YAAA,MAAM,gBAAgB,CAAC,OAAO,CAAC,CAAC;YAEhC,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC,aAAa,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;;;;;AAM3D,YAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,MAAM,KAAI;gBAC1D,MAAM,KAAK,GAAI,MAAM,CAAC,MAAM,CAAwB,IAAI,EAAE,CAAC;AAC3D,gBAAA,IAAI,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,CAAC,KAAK,KAAK,EAAE;oBAC/E,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,aAAa,EAAE,KAAK,CAAC,CAAC;iBACjD;AACH,aAAC,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,EAAE,CAAC;YACrB,IAAI,CAAC,WAAW,EAAE,CAAC;AAEnB,YAAA,IAAI,IAAI,CAAC,EAAE,EAAE,aAAa,EAAE;gBAC1B,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;aACjD;SACF;QAAC,OAAO,KAAK,EAAE;AACd,YAAA,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;SACzD;KACF;IAED,eAAe,GAAA;;AAEb,QAAA,IAAI,IAAI,CAAC,OAAO,EAAE;AAChB,YAAA,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;;;AAIrE,YAAA,IAAI,IAAI,CAAC,YAAY,EAAE;AACrB,gBAAA,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;gBAC1B,IAAI,IAAI,CAAC,EAAE,EAAE,aAAa,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;oBAC3E,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;oBAChD,IAAI,CAAC,aAAa,EAAE,CAAC;AACrB,oBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;AACzB,oBAAA,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;iBAClF;aACF;AAAM,iBAAA,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE;;gBAE7B,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,gBAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;aAC1B;iBAAM;;gBAEL,IAAI,CAAC,aAAa,EAAE,CAAC;aACtB;SACF;KACF;IAED,WAAW,GAAA;;;;;QAKT,IAAI,CAAC,cAAc,EAAE,CAAC;AACtB,QAAA,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,CAAC;AAC7B,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS,CAAC;AAC1B,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;KACzB;8GA5MU,uBAAuB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,cAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAvB,uBAAuB,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,SAAA,EAAA,KAAA,EAAA,OAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,IAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACT,UAAU,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJzB,iBAAiB,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,CAAA,EAAA;;2FAGhB,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBANnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;;AAET,oBAAA,QAAQ,EAAE,gBAAgB;AAC1B,oBAAA,QAAQ,EAAE,iBAAiB;AAC5B,iBAAA,CAAA;mFAIC,EAAE,EAAA,CAAA;sBADD,SAAS;uBAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;gBAG1C,OAAO,EAAA,CAAA;sBAAf,KAAK;gBACG,KAAK,EAAA,CAAA;sBAAb,KAAK;gBACG,MAAM,EAAA,CAAA;sBAAd,KAAK;;;ACxBF,MAAO,yBAA0B,SAAQ,mBAAmB,CAAA;AALlE,IAAA,WAAA,GAAA;;AAQS,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC;AAerC,KAAA;IAbA,QAAQ,GAAA;QACP,MAAM,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,aAAa,CAAC,UAAU,CAAC;AACpD,QAAA,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;;AAG9D,QAAA,SAAS,CAAC,OAAO,CAAC,CAAC,GAAW,KAAI;YACjC,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;AACvC,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;AACtC,YAAA,IAAI,CAAC,YAAY,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YAC/B,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;AAC7C,SAAC,CAAC,CAAC;KACH;8GAjBW,yBAAyB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAzB,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,IAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,IAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,IAAA,EACZ,UAAU,EAAA,MAAA,EAAA,IAAA,EAAA,CAAA,EAAA,eAAA,EAAA,IAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAJzB,iBAAiB,EAAA,QAAA,EAAA,IAAA,EAAA,aAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;;2FAGf,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBALrC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,iBAAiB;oBAC3B,aAAa,EAAE,iBAAiB,CAAC,SAAS;AAC1C,iBAAA,CAAA;8BAE8D,EAAE,EAAA,CAAA;sBAA/D,SAAS;uBAAC,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;;;MCevC,eAAe,CAAA;AAD5B,IAAA,WAAA,GAAA;AAEkB,QAAA,IAAA,CAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;AACxB,QAAA,IAAA,CAAA,QAAQ,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;QAE5C,IAAS,CAAA,SAAA,GAAa,EAAE,CAAC;AAmFjC,KAAA;IAjFA,IAAI,CAAC,UAAsB,EAAE,OAAe,EAAA;QAC3C,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;AAC9C,QAAA,OAAO,UAAU;AACf,aAAA,GAAG,CAAU,SAAS,EAAE,GAAG,uCAAuC,GAAG,OAAO,GAAG,qBAAqB,CAAC;AACrG,aAAA,IAAI,CACJ,GAAG,CAAC,CAAC,IAAI,KAAI;AACZ,YAAA,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AACpC,YAAA,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AAEpE,YAAA,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC;AACvB,gBAAA,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM;AACrB,gBAAA,GAAG,MAAM;AACT,gBAAA,EAAE,IAAI,EAAE,WAAW,EAAE,SAAS,EAAE,kBAAkB,EAAE;AACpD,gBAAA,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,EAAE;AAC5C,aAAA,CAAC,CAAC;YAEH,MAAM,iBAAiB,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACrE,OAAO;AACN,gBAAA,SAAS,EAAE;oBACV,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,GAAG,EAAoB;AAClH,oBAAA,GAAG,iBAAiB;AACpB,iBAAA;AACD,gBAAA,OAAO,EAAE,IAAI,CAAC,UAAU,IAAI,EAAE;aAC9B,CAAC;AACH,SAAC,CAAC,EACF,UAAU,CAAC,CAAC,GAAG,KAAI;AAClB,YAAA,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,GAAG,CAAC,CAAC;AAC7C,YAAA,OAAO,EAAE,CAAqB,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;SAC9D,CAAC,CACF,CAAC;KACH;AAED,IAAA,WAAW,CAAC,OAAuB,EAAA;QAClC,MAAM,MAAM,GAAW,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,KAAI;AAC1C,YAAA,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE;;;;gBAIpB,MAAM,IAAI,KAAK,CACd,CAA+D,6DAAA,CAAA;oBAC/D,CAA4C,yCAAA,EAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA,CAAE,CACjE,CAAC;aACF;YACD,OAAO;AACN,gBAAA,OAAO,EAAE,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC;gBACnC,SAAS,EAAE,GAAG,CAAC,gBAAgB,GAAG,uBAAuB,GAAG,yBAAyB;AACrF,gBAAA,IAAI,EAAE,GAAiC;gBACvC,WAAW,EAAE,CAAC,SAAS,CAAC;aACxB,CAAC;AACH,SAAC,CAAC,CAAC;AAEH,QAAA,OAAO,MAAM,CAAC;KACd;AAEO,IAAA,qBAAqB,CAAC,KAAuB,EAAA;QACpD,OAAO,KAAK,CAAC,MAAM,CAAmB,CAAC,GAAG,EAAE,IAAI,KAAI;YACnD,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE;AAC7C,gBAAA,OAAO,GAAG,CAAC;aACX;AAED,YAAA,MAAM,YAAY,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;AAEjC,YAAA,IAAI,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE;gBAC/B,YAAY,CAAC,KAAK,GAAG,IAAI,CAAC,qBAAqB,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;AAEpE,gBAAA,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC3D,oBAAA,OAAO,GAAG,CAAC;iBACX;aACD;AAED,YAAA,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACvB,YAAA,OAAO,GAAG,CAAC;SACX,EAAE,EAAE,CAAC,CAAC;KACP;AAEO,IAAA,aAAa,CAAC,cAAyB,EAAA;AAC9C,QAAA,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE;AAC5B,YAAA,OAAO,IAAI,CAAC;SACZ;AACD,QAAA,OAAO,cAAc,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;KACpE;8GAtFW,eAAe,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAf,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,eAAe,cADF,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,eAAe,EAAA,UAAA,EAAA,CAAA;kBAD3B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ICpBtB,KAkBX;AAlBD,CAAA,UAAY,IAAI,EAAA;AACf,IAAA,IAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,IAAA,CAAA,SAAA,CAAA,GAAA,SAAmB,CAAA;AACnB,IAAA,IAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,IAAA,CAAA,IAAA,CAAA,GAAA,IAAS,CAAA;AACT,IAAA,IAAA,CAAA,MAAA,CAAA,GAAA,MAAa,CAAA;AACb,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,eAAA,CAAA,GAAA,eAA+B,CAAA;AAC/B,IAAA,IAAA,CAAA,QAAA,CAAA,GAAA,QAAiB,CAAA;AACjB,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACX,IAAA,IAAA,CAAA,KAAA,CAAA,GAAA,KAAW,CAAA;AACZ,CAAC,EAlBW,IAAI,KAAJ,IAAI,GAkBf,EAAA,CAAA,CAAA;;MCjBY,iBAAiB,CAAA;AAH9B,IAAA,WAAA,GAAA;QAIE,IAAW,CAAA,WAAA,GAAG,MAAM,CAAyB,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;AAI7D,KAAA;AAHC,IAAA,iBAAiB,CAAC,GAAW,EAAA;AAC3B,QAAA,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;KAC1C;8GAJU,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAjB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,iBAAiB,cAFhB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEP,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBAH7B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA,CAAA;;;AC6BD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCG;MAIU,wBAAwB,CAAA;AAWpC,IAAA,WAAA,GAAA;AAVA,QAAA,IAAA,CAAA,iBAAiB,GAAsB,MAAM,CAAC,iBAAiB,CAAC,CAAC;QACjE,IAAY,CAAA,YAAA,GAAwC,EAAE,CAAC;AAEvD;;;;AAIG;AACK,QAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,OAAO,EAA4C,CAAC;QAGpF,MAAM,CAAC,MAAK;YACX,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC;AACrD,YAAA,IAAI,CAAC,GAAG;gBAAE,OAAO;YACjB,OAAO,CAAC,GAAG,CAAC,CAAA,mCAAA,EAAsC,GAAG,CAAiB,cAAA,EAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAG,CAAA,CAAA,CAAC,CAAC;AACnH,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC;;;;;;AAO5B,YAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;gBACzC,IAAI,MAAM,EAAE;AACX,oBAAA,MAAM,CAAC,aAAa,CACnB,IAAI,WAAW,CAAC,qBAAqB,EAAE;AACtC,wBAAA,MAAM,EAAE,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE;AAC9D,qBAAA,CAAC,CACF,CAAC;iBACF;aACD;AACF,SAAC,CAAC,CAAC;;;;;AAMH,QAAA,MAAM,cAAc,GAAG,CAAC,CAAQ,KAAU;AACzC,YAAA,MAAM,MAAM,GAAI,CAAiE,CAAC,MAAM,CAAC;AACzF,YAAA,MAAM,UAAU,GAAG,MAAM,EAAE,UAAU,CAAC;AACtC,YAAA,IAAI,CAAC,UAAU;gBAAE,OAAO;AACxB,YAAA,MAAM,KAAK,GAAG,MAAM,EAAE,KAAK,IAAI,IAAI,CAAC;AACpC,YAAA,MAAM,MAAM,GAAG,CAAM,GAAA,EAAA,UAAU,EAAE,CAAC;AAClC,YAAA,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAI;AACxD,gBAAA,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,oBAAA,OAAO,KAAK,CAAC;;;gBAGxC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAC;AAAE,oBAAA,OAAO,KAAK,CAAC;AACxD,gBAAA,OAAO,IAAI,CAAC;AACb,aAAC,CAAC,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,MAAM;gBAAE,OAAO;AACzB,YAAA,OAAO,CAAC,GAAG,CAAC,iDAAiD,UAAU,CAAA,SAAA,EAAY,KAAK,IAAI,GAAG,CAAW,QAAA,EAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;AAC7H,YAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;gBACrB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aAC5B;AACF,SAAC,CAAC;AACF,QAAA,MAAM,CAAC,gBAAgB,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC;;;;AAI/D,QAAA,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,CAAC,MAAM,MAAM,CAAC,mBAAmB,CAAC,qBAAqB,EAAE,cAAc,CAAC,CAAC,CAAC;KACtG;AAED;;;;;;;;AAQG;IACH,WAAW,GAAA;QACV,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC5C,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,CAAA,yBAAA,EAA4B,IAAI,CAAC,MAAM,CAA2C,yCAAA,CAAA,CAAC,CAAC;AACjH,QAAA,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;YACvB,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SAC9B;KACD;AAED;;AAEG;AACK,IAAA,iBAAiB,CAAC,GAAW,EAAA;;AAEpC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE;AAC3B,YAAA,OAAO,CAAC,GAAG,CAAC,sCAAsC,GAAG,CAAA,CAAA,CAAG,CAAC,CAAC;YAC1D,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;AACjD,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;SAC9B;;;;;AAMD,QAAA,IAAI,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;AACzC,YAAA,IAAI,CAAC,MAAM;gBAAE,OAAO;AACpB,YAAA,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;AACrC,YAAA,MAAM,MAAM,GAAG,CAAM,GAAA,EAAA,UAAU,EAAE,CAAC;AAClC,YAAA,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;AAC/C,gBAAA,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,SAAS;;gBAEpC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA,KAAA,EAAQ,KAAK,CAAA,CAAE,CAAC;oBAAE,SAAS;AACpD,gBAAA,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAA,CAAA,CAAG,CAAC,CAAC;gBACvD,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;AAC/C,gBAAA,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;aAC5B;SACD;KACD;AAED;;;AAGG;AACK,IAAA,eAAe,CAAC,GAAW,EAAA;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,MAAM,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;QACzC,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO;AACN,YAAA,UAAU,EAAE,QAAQ,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC;AAChE,YAAA,KAAK,EAAE,QAAQ,KAAK,CAAC,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC;SAC5D,CAAC;KACF;AAED;;;;;;;;AAQG;AACK,IAAA,mBAAmB,CAAC,MAA8C,EAAA;AACzE,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO;AACpB,QAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;QAGlD,MAAM,SAAS,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtD,IAAI,SAAS,EAAE;AACd,YAAA,KAAK,MAAM,EAAE,EAAE,EAAE,IAAI,SAAS,EAAE;AAC/B,gBAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE;AACjC,oBAAA,eAAe,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;iBAChC;aACD;AACD,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;SACvC;;AAGD,QAAA,MAAM,YAAY,GAAI,MAAsC,CAAC,YAAY,CAAC;AAC1E,QAAA,MAAM,QAAQ,GAAG,YAAY,EAAE,QAAuC,CAAC;AACvE,QAAA,IAAI,QAAQ,EAAE,OAAO,EAAE;;;AAGtB,YAAA,OAAQ,QAAQ,CAAC,OAAkE,CAAC,0BAA0B,CAAC;YAC/G,IAAI,eAAe,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AAC/C,gBAAA,eAAe,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;aAC9C;SACD;;QAGD,YAAY,EAAE,OAAO,EAAE,CAAC;KACxB;AAED;;;;AAIG;AACH,IAAA,YAAY,CAAC,KAA6B,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;AACjE,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAsC,oCAAA,CAAA,CAAC,CAAC;AAC3G,YAAA,OAAO,KAAK,CAAC;SACb;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACzC,QAAA,OAAO,CAAC,GAAG,CAAC,gCAAgC,QAAQ,CAAA,QAAA,CAAU,CAAC,CAAC;AAChE,QAAA,OAAO,IAAI,CAAC;KACZ;IAED,KAAK,CAAC,KAA6B,EAAE,YAAiC,EAAA;QACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,CAAyB,sBAAA,EAAA,QAAQ,CAAW,SAAA,CAAA,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;QAC1E,IAAI,CAAC,YAAY,EAAE;AAClB,YAAA,OAAO,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;YACnC,OAAO;SACP;AACD,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;AACjE,YAAA,OAAO,CAAC,GAAG,CAAC,8BAA8B,QAAQ,CAAA,4BAAA,CAA8B,CAAC,CAAC;YAClF,OAAO;SACP;AACD,QAAA,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,GAAG,YAAY,CAAC;AAC3C,QAAA,IAAI,CAAC,2BAA2B,CAAC,YAAY,CAAC,CAAC;AAC/C,QAAA,IAAI,CAAC,4BAA4B,CAAC,YAAY,CAAC,CAAC;KAChD;AAED,IAAA,YAAY,CAAC,KAA6B,EAAA;AACzC,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;AACjE,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,6BAAA,EAAgC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAsC,oCAAA,CAAA,CAAC,CAAC;AAC3G,YAAA,OAAO,KAAK,CAAC;SACb;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,YAAY,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,CAAA,6BAAA,EAAgC,QAAQ,CAAO,IAAA,EAAA,YAAY,CAAiB,cAAA,EAAA,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAI,EAAA,CAAA,CAAC,CAAC;AACtI,QAAA,OAAO,YAAY,CAAC;KACpB;AAED,IAAA,QAAQ,CAAC,KAA6B,EAAA;AACrC,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,EAAE;AACjE,YAAA,OAAO,IAAI,CAAC;SACZ;QACD,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;AAC3C,QAAA,OAAO,CAAC,GAAG,CAAC,CAA4B,yBAAA,EAAA,QAAQ,OAAO,MAAM,GAAG,KAAK,GAAG,MAAM,CAAA,CAAE,CAAC,CAAC;QAClF,IAAI,MAAM,EAAE;AACX,YAAA,IAAI,CAAC,0BAA0B,CAAC,MAAM,CAAC,CAAC;AACxC,YAAA,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,CAAC;SACzC;QACD,OAAO,MAAM,IAAI,IAAI,CAAC;KACtB;AAED;;;;;;;AAOG;AACK,IAAA,2BAA2B,CAAC,YAAiC,EAAA;AACpE,QAAA,IAAI;AACH,YAAA,MAAM,YAAY,GAAI,YAA4C,CAAC,YAAY,CAAC;AAChF,YAAA,IAAI,CAAC,YAAY;gBAAE,OAAO;AAE1B,YAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAuC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,EAAE,OAAO;gBAAE,OAAO;AAExC,YAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAiE,CAAC;AACpG,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;;AAIlD,YAAA,OAAO,CAAC,0BAA0B,GAAG,IAAI,CAAC;;YAG1C,IAAI,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,UAAU,KAAK,eAAe,EAAE;AACjE,gBAAA,OAAO,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;aACxC;;YAGD,IAAI,CAAC,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACvC,gBAAA,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACrC,gBAAA,OAAO,CAAC,GAAG,CAAC,qEAAqE,CAAC,CAAC;aACnF;SACD;QAAC,OAAO,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,gDAAgD,EAAE,KAAK,CAAC,CAAC;SACtE;KACD;AAED;;;;;;AAMG;AACK,IAAA,0BAA0B,CAAC,YAAiC,EAAA;AACnE,QAAA,IAAI;AACH,YAAA,MAAM,YAAY,GAAI,YAA4C,CAAC,YAAY,CAAC;AAChF,YAAA,IAAI,CAAC,YAAY;gBAAE,OAAO;AAE1B,YAAA,MAAM,iBAAiB,GAAG,YAAY,CAAC,QAAuC,CAAC;YAC/E,IAAI,CAAC,iBAAiB,EAAE,OAAO;gBAAE,OAAO;AAExC,YAAA,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAiE,CAAC;AACpG,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;;AAGlD,YAAA,IAAI,eAAe,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE;AACtC,gBAAA,eAAe,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;gBACrC,OAAO,OAAO,CAAC,0BAA0B,CAAC;AAC1C,gBAAA,OAAO,CAAC,GAAG,CAAC,uDAAuD,CAAC,CAAC;;gBAGrE,MAAM,UAAU,GAAG,MAAc;AAChC,oBAAA,MAAM,EAAE,GAAG,iBAAiB,CAAC,EAAE,CAAC;AAChC,oBAAA,IAAI,EAAE,EAAE,aAAa,EAAE;AACtB,wBAAA,EAAE,CAAC,aAAa,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;AACtC,wBAAA,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;;AAEpF,wBAAA,iBAAiB,CAAC,YAAY,GAAG,KAAK,CAAC;AACvC,wBAAA,OAAO,IAAI,CAAC;qBACZ;AACD,oBAAA,OAAO,KAAK,CAAC;AACd,iBAAC,CAAC;;AAGF,gBAAA,IAAI,CAAC,UAAU,EAAE,EAAE;;oBAElB,UAAU,CAAC,MAAK;AACf,wBAAA,IAAI,CAAC,UAAU,EAAE,EAAE;;AAElB,4BAAA,iBAAiB,CAAC,YAAY,GAAG,IAAI,CAAC;AACtC,4BAAA,OAAO,CAAC,GAAG,CAAC,iGAAiG,CAAC,CAAC;yBAC/G;qBACD,EAAE,CAAC,CAAC,CAAC;iBACN;aACD;SACD;QAAC,OAAO,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,+CAA+C,EAAE,KAAK,CAAC,CAAC;SACrE;KACD;AAED;;AAEG;IACK,kBAAkB,GAAA;QACzB,MAAM,IAAI,GAAG,UAAqF,CAAC;AACnG,QAAA,IAAI,SAAS,GAAG,IAAI,CAAC,iCAAiC,CAAC;QACvD,IAAI,CAAC,SAAS,EAAE;AACf,YAAA,SAAS,GAAG,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;AAC1C,YAAA,SAAS,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;AACjC,YAAA,SAAS,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC;AACtC,YAAA,SAAS,CAAC,KAAK,CAAC,IAAI,GAAG,SAAS,CAAC;AACjC,YAAA,SAAS,CAAC,KAAK,CAAC,GAAG,GAAG,SAAS,CAAC;AAChC,YAAA,SAAS,CAAC,KAAK,CAAC,UAAU,GAAG,QAAQ,CAAC;AACtC,YAAA,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;AACrC,YAAA,IAAI,CAAC,iCAAiC,GAAG,SAAS,CAAC;SACnD;AACD,QAAA,OAAO,SAAS,CAAC;KACjB;AAED;;;;;;;AAOG;AACK,IAAA,4BAA4B,CAAC,YAAiC,EAAA;AACrE,QAAA,IAAI;AACH,YAAA,MAAM,YAAY,GAAI,YAA4C,CAAC,YAAY,CAAC;AAChF,YAAA,MAAM,MAAM,GAAG,YAAY,EAAE,QAAQ,EAAE,aAAwC,CAAC;AAChF,YAAA,IAAI,CAAC,MAAM;gBAAE,OAAO;AAEpB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAClD,MAAM,GAAG,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;YACzC,MAAM,aAAa,GAAwB,EAAE,CAAC;YAE9C,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBACjC,MAAM,GAAG,GAAG,EAAE,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC;AACrC,gBAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;oBAAE,SAAS;gBACjC,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,CAAC,GAAG,CAAC;oBAAE,SAAS;gBAE/C,MAAM,IAAI,GAAG,EAAiB,CAAC;gBAC/B,MAAM,WAAW,GAAG,QAAQ,CAAC,aAAa,CAAC,CAAkB,eAAA,EAAA,GAAG,CAAE,CAAA,CAAC,CAAC;gBACpE,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;AACjD,gBAAA,eAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;gBAClC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC;aAC9C;AAED,YAAA,IAAI,aAAa,CAAC,MAAM,EAAE;gBACzB,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;gBACzD,OAAO,CAAC,GAAG,CAAC,CAAA,yCAAA,EAA4C,aAAa,CAAC,MAAM,CAAkB,gBAAA,CAAA,CAAC,CAAC;aAChG;SACD;QAAC,OAAO,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,yCAAyC,EAAE,KAAK,CAAC,CAAC;SAC/D;KACD;AAED;;;AAGG;AACK,IAAA,2BAA2B,CAAC,YAAiC,EAAA;AACpE,QAAA,IAAI;YACH,MAAM,aAAa,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;YAChE,IAAI,CAAC,aAAa,EAAE,MAAM;gBAAE,OAAO;YAEnC,KAAK,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,IAAI,aAAa,EAAE;AAChD,gBAAA,IAAI,WAAW,CAAC,UAAU,EAAE;oBAC3B,WAAW,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;iBACrD;qBAAM;;;oBAGN,OAAO,CAAC,IAAI,CAAC,6EAA6E,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC;oBACxG,IAAI,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,kBAAkB,EAAE,EAAE;wBAChD,IAAI,CAAC,kBAAkB,EAAE,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;qBAC1C;iBACD;aACD;AACD,YAAA,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;YAC7C,OAAO,CAAC,GAAG,CAAC,CAAA,wCAAA,EAA2C,aAAa,CAAC,MAAM,CAA6B,2BAAA,CAAA,CAAC,CAAC;SAC1G;QAAC,OAAO,KAAK,EAAE;AACf,YAAA,OAAO,CAAC,IAAI,CAAC,wCAAwC,EAAE,KAAK,CAAC,CAAC;SAC9D;KACD;AAEO,IAAA,cAAc,CAAC,KAAoC,EAAA;AAC1D,QAAA,OAAO,CAAC,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC;KACrC;AAEO,IAAA,aAAa,CAAC,KAAoC,EAAA;QACzD,OAAQ,KAAK,EAAE,WAAW,EAAE,IAAiC,EAAE,UAAU,IAAI,IAAI,CAAC;KAClF;AAED;;;;AAIG;AACK,IAAA,iBAAiB,CAAC,KAAoC,EAAA;QAC7D,MAAM,CAAC,GAAG,KAAK,EAAE,WAAW,GAAG,MAAM,CAAC,CAAC;AACvC,QAAA,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;KACxD;AAED;;;;;;;;AAQG;AACK,IAAA,WAAW,CAAC,KAA6B,EAAA;AAChD,QAAA,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE;YAC/B,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;YAC7C,IAAI,UAAU,EAAE;gBACf,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;AAC5C,gBAAA,OAAO,KAAK,GAAG,OAAO,UAAU,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,GAAG,CAAO,IAAA,EAAA,UAAU,EAAE,CAAC;aAClE;SACD;;;AAGD,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY;AACjC,aAAA,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAI;YACb,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAC/C,YAAA,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,GAAG,GAAG,CAAI,CAAA,EAAA,CAAC,EAAE,CAAC;AACvC,SAAC,CAAC;aACD,IAAI,CAAC,GAAG,CAAC,CAAC;QACZ,MAAM,WAAW,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;AACjE,QAAA,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,GAAG,GAAG,GAAG,KAAK,CAAC,QAAQ,GAAG,EAAE,CAAC;AAE5D,QAAA,OAAO,QAAQ,GAAG,WAAW,GAAG,QAAQ,CAAC;KACzC;AAED;;;;;AAKG;AACK,IAAA,oBAAoB,CAAC,MAA6C,EAAA;;;;;QAKzE,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACxC,IAAI,CAAC,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,EAAE,CAAC;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,eAAe,EAAE,CAAC;AAClC,QAAA,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE;AACrB,YAAA,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;YACpB,IAAI,CAAC,IAAI,IAAI;gBAAE,SAAS;AACxB,YAAA,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE;gBACrB,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,IAAI,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;aAC3D;iBAAM;gBACN,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;aACzB;SACD;AACD,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC;QAC3B,OAAO,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,CAAC;KAC5B;IAED,gBAAgB,CAAC,MAA8B,EAAE,IAA4B,EAAA;QAC5E,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,WAAW,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;AAE9C,QAAA,IAAI,aAAa,IAAI,WAAW,EAAE;YACjC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;YACtC,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YACpC,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;;;AAGxC,YAAA,MAAM,WAAW,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACnD,YAAA,OAAO,CAAC,GAAG,CAAC,CAAA,sCAAA,EAAyC,WAAW,CAAY,SAAA,EAAA,EAAE,CAAI,CAAA,EAAA,EAAE,SAAS,EAAE,CAAA,CAAA,EAAI,EAAE,CAAA,CAAE,CAAC,CAAC;AACzG,YAAA,OAAO,WAAW,CAAC;SACnB;AAED,QAAA,IAAI,aAAa,KAAK,WAAW,EAAE;AAClC,YAAA,OAAO,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC;AACzD,YAAA,OAAO,KAAK,CAAC;SACb;QAED,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,KAAK,IAAI,CAAC,WAAW,CAAC;QAC5D,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AACvC,QAAA,MAAM,UAAU,GAAG,MAAM,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC;AAC3F,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,SAAS,EAAE,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,IAAI,IAAI,MAAM,CAAC;AACrF,QAAA,OAAO,CAAC,GAAG,CACV,CAAA,qCAAA,EAAwC,WAAW,CAAa,UAAA,EAAA,SAAS,CAAK,EAAA,EAAA,UAAU,WAAW,OAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA,CAAG,CAC1H,CAAC;AACF,QAAA,OAAO,WAAW,CAAC;KACnB;8GA7fW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAxB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,cAFxB,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEN,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAHpC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE,MAAM;AAClB,iBAAA,CAAA;;;ACzED;;;;;;;;;;;;;;AAcG;SACa,YAAY,CAC3B,MAAc,EACd,GAAW,EACX,MAAkC,EAAA;AAElC,IAAA,OAAO,MAAM,CAAC,aAAa,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,KAAI;;;;AAI/D,QAAA,IAAI,qBAAqB,CAAC,GAAG,CAAC,EAAE;AAC/B,YAAA,OAAO,KAAK,CAAC;SACb;AACD,QAAA,MAAM,GAAG,CAAC;AACX,KAAC,CAAC,CAAC;AACJ,CAAC;AAED;;;;;;AAMG;AACH,SAAS,qBAAqB,CAAC,GAAY,EAAA;AAC1C,IAAA,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;AAAE,QAAA,OAAO,KAAK,CAAC;IAClD,MAAM,CAAC,GAAG,GAAyD,CAAC;AACpE,IAAA,IAAI,CAAC,CAAC,IAAI,KAAK,YAAY;AAAE,QAAA,OAAO,IAAI,CAAC;AACzC,IAAA,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,EAAE;AAClC,QAAA,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC;AACpB,QAAA,IAAI,CAAC,CAAC,QAAQ,CAAC,wBAAwB,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,kBAAkB,CAAC;AAAE,YAAA,OAAO,IAAI,CAAC;KACxF;;IAED,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC;AAAE,QAAA,OAAO,IAAI,CAAC;AAC5D,IAAA,OAAO,KAAK,CAAC;AACd;;ACVA;;;;;;;AAOG;AACH,SAAS,SAAS,CAAC,UAAkB,EAAE,KAAa,EAAA;AACnD,IAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;AAC7D,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAA,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC1B,OAAO,CAAA,EAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAC,QAAQ,EAAE,CAAA,EAAG,QAAQ,CAAA,CAAE,CAAC;AAClD,CAAC;AAED;;;;AAIG;AACH,SAAS,YAAY,CAAC,UAAkB,EAAA;AACvC,IAAA,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,QAAQ,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC;AAC7D,IAAA,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,GAAG,QAAQ,CAAC;AACnC,IAAA,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;AAC1C,IAAA,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AACtB,IAAA,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;AACpC,IAAA,OAAO,SAAS,GAAG,CAAA,EAAG,IAAI,CAAI,CAAA,EAAA,SAAS,CAAG,EAAA,QAAQ,EAAE,GAAG,IAAI,GAAG,QAAQ,CAAC;AACxE,CAAC;AAED;;;;;;;AAOG;AACH,SAAS,QAAQ,CAAC,GAAW,EAAA;IAC5B,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACrC,IAAA,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;IAChE,MAAM,cAAc,GAAG,WAAW,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC;IAC1E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC7C,IAAI,IAAI,GAAG,QAAQ,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,GAAG,cAAc,CAAC;IAC9E,MAAM,KAAK,GAAG,QAAQ,IAAI,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;AACtE,IAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,QAAA,IAAI,GAAG,GAAG,GAAG,IAAI,CAAC;AAC7C,IAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;AAClC,CAAC;AAED;AACA,SAAS,QAAQ,CAAC,KAAa,EAAA;IAC9B,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;AACnC,CAAC;AAED;;;AAGG;AACH,SAAS,iBAAiB,CAAC,OAA2B,EAAA;AACrD,IAAA,IAAI,CAAC,OAAO;AAAE,QAAA,OAAO,IAAI,CAAC;IAC1B,IAAI,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACjC,IAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,QAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAC/C,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;AACnC,CAAC;MAKY,UAAU,CAAA;AAHvB,IAAA,WAAA,GAAA;AAIC,QAAA,IAAA,CAAA,MAAM,GAAW,MAAM,CAAC,MAAM,CAAC,CAAC;AAChC,QAAA,IAAA,CAAA,iBAAiB,GAAsB,MAAM,CAAC,iBAAiB,CAAC,CAAC;AAChD,QAAA,IAAA,CAAA,cAAc,GAAmB,MAAM,CAAC,cAAc,CAAC,CAAC;AACxD,QAAA,IAAA,CAAA,gBAAgB,GAAqB,MAAM,CAAC,gBAAgB,CAAC,CAAC;;;;AAK9D,QAAA,IAAA,CAAA,aAAa,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO;aAC5D,IAAI;;;;QAIJ,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,wBAAwB,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,CAAC,EACvE,kBAAkB,EAAE,CACpB;aACA,SAAS,CAAC,MAAM,IAAI,CAAC,qBAAqB,EAAE,CAAC,CAAC;QAEhD,IAAkB,CAAA,kBAAA,GAAG,KAAK,CAAC;AAC3B;;;AAGG;QACc,IAAQ,CAAA,QAAA,GAAG,EAAE,CAAC;AAO/B;;;;;;AAMG;QACK,IAAiB,CAAA,iBAAA,GAAoC,IAAI,CAAC;AAQlE;;;;AAIG;QACK,IAAmB,CAAA,mBAAA,GAA2B,IAAI,CAAC;AAQ3D;;;;AAIG;AACH,QAAA,IAAA,CAAA,WAAW,GAAG,QAAQ,CACrB,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CACtB,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,aAAa,CAAC,EACzC,GAAG,CAAC,CAAC,CAAC,KAAI;;;;YAIT,MAAM,cAAc,GAAI,MAAM,CAAC,OAAO,CAAC,KAAwC,GAAG,MAAM,CAAC,CAAC;YAC1F,IAAI,OAAO,cAAc,KAAK,QAAQ,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE;AACpE,gBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;aACrC;YAED,MAAM,UAAU,GAAI,CAAmB,CAAC,iBAAiB,IAAK,CAAmB,CAAC,GAAG,CAAC;;;;;;;;AAUtF,YAAA,MAAM,QAAQ,GACb,OAAO,cAAc,KAAK,QAAQ;gBAClC,cAAc,CAAC,MAAM,GAAG,CAAC;AACzB,gBAAA,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,cAAc,CAAC,CAAC;YAC7D,IAAI,CAAC,QAAQ,EAAE;;;;;gBAKd,IAAI,UAAU,EAAE;oBACf,MAAM,UAAU,GAAI,MAAM,CAAC,OAAO,CAAC,KAAwC,GAAG,MAAM,CAAC,CAAC;AACtF,oBAAA,MAAM,OAAO,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;;;;;;;oBAOzC,MAAM,QAAQ,GACb,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,UAAU;AACtC,0BAAE,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC;0BACtD,SAAS,CAAC;oBACd,IAAI,KAAK,GACR,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC,GAAG,UAAU,GAAG,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC;oBAC9F,IAAI,gBAAgB,GAAG,KAAK,CAAC;oBAC7B,IAAI,CAAC,KAAK,EAAE;AACX,wBAAA,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;wBAC7B,gBAAgB,GAAG,IAAI,CAAC;qBACxB;yBAAM,IAAI,QAAQ,EAAE;;;wBAGpB,gBAAgB,GAAG,IAAI,CAAC;qBACxB;AACD,oBAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;oBAC5B,IAAI,CAAC,QAAQ,EAAE;wBACd,MAAM,QAAQ,GAAG,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,CAAC;wBACtD,MAAM,YAAY,GAAG,MAAa;4BACjC,IAAI,IAAI,GAAG,OAAO,CAAC;AACnB,4BAAA,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC;AAAE,gCAAA,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;4BAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC1D,4BAAA,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,IAAI,MAAM,CAAC;4BAC/C,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;AACxE,yBAAC,CAAC;wBACF,IAAI,CAAC,iBAAiB,CAAC;4BACtB,KAAK;4BACL,OAAO;AACP,4BAAA,OAAO,EAAE,QAAQ,EAAE,OAAO,IAAI,YAAY,EAAE;4BAC5C,IAAI,EAAE,QAAQ,EAAE,IAAI;AACpB,yBAAA,CAAC,CAAC;qBACH;oBACD,IAAI,gBAAgB,EAAE;;;;;;wBAMrB,UAAU,CAAC,MAAK;4BACf,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE;AACpD,gCAAA,UAAU,EAAE,IAAI;AAChB,gCAAA,KAAK,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE;6BACtB,CAAC,CAAC,KAAK,CAAC,MAAmD,GAAC,CAAC,CAAC;yBAC/D,EAAE,CAAC,CAAC,CAAC;qBACN;iBACD;AACD,gBAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC;aAC/B;AACF,SAAC,CAAC,EACFA,KAAG,CAAC,CAAC,CAAC,KAAM,CAAmB,CAAC,iBAAiB,IAAK,CAAmB,CAAC,GAAG,CAAC,CAC9E,CACD,CAAC;AAEF,QAAA,IAAA,CAAA,YAAY,GAAG,MAAM,CAAY,EAAE,CAAC,CAAC;;AAErC,QAAA,IAAA,CAAA,WAAW,GAAG,MAAM,CAAS,EAAE,CAAC,CAAC;AA8cjC,KAAA;;IAllBQ,aAAa,GAAA;AACpB,QAAA,OAAO,MAAM,CAAC,UAAU,EAAE,CAAC;KAC3B;AAUD,IAAA,oBAAoB,CAAC,QAAgC,EAAA;AACpD,QAAA,IAAI,CAAC,iBAAiB,GAAG,QAAQ,CAAC;;;QAGlC,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC7B;AAQD,IAAA,sBAAsB,CAAC,QAAuB,EAAA;AAC7C,QAAA,IAAI,CAAC,mBAAmB,GAAG,QAAQ,CAAC;;;QAGpC,IAAI,CAAC,qBAAqB,EAAE,CAAC;KAC7B;AAwGD;;;;;AAKG;AACH,IAAA,oBAAoB,CAAC,OAAgB,EAAA;AACpC,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACtC,QAAA,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE;;AAEf,YAAA,IAAI,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YACnC,OAAO;SACP;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;AAC7C,QAAA,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC;QAChC,MAAM,UAAU,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;;AAEjD,QAAA,IAAI,WAAW,CAAC,OAAO,KAAK,UAAU,EAAE;AACvC,YAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YACzE,OAAO;SACP;QACD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KAAI;AACnC,YAAA,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC;;;;YAIzB,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,CAAC;AACnF,YAAA,OAAO,IAAI,CAAC;AACb,SAAC,CAAC,CAAC;AACH,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;KACzE;AAED;;;;AAIG;AACH,IAAA,mBAAmB,CAAC,OAAgB,EAAA;QACnC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;YAChD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;SACP;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;KAC5E;AAED;;;AAGG;AACH,IAAA,oBAAoB,CAAC,OAAgB,EAAA;QACpC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;YAChD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;SACP;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AAC5E,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;KACtE;;AAGD,IAAA,iBAAiB,CAAC,OAAgB,EAAA;QACjC,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;;YAEhD,OAAO;SACP;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,OAAO,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;;QAE9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;KAC5E;AAED;;;AAGG;IACK,kBAAkB,GAAA;AACzB,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;AACjC,QAAA,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,CAAC,CAAC;AACtB,QAAA,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;KAC/D;;IAGO,oBAAoB,GAAA;AAC3B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACvB,YAAA,QAAQ,EAAE,MAAM;AAChB,YAAA,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,uBAAuB,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;YACzF,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,sBAAsB,CAAC;AAC/D,YAAA,GAAG,EAAE,YAAY;AACjB,SAAA,CAAC,CAAC;KACH;;IAGO,WAAW,GAAA;AAClB,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,CAAC;KACjE;;AAGO,IAAA,SAAS,CAAC,IAAa,EAAA;QAC9B,OAAO,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC;KAC3C;AAED;;;AAGG;IACK,WAAW,GAAA;AAClB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,IAAI,CAAC;QAC1C,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,IAAI,GAAG,CAAC,CAAC;AACnD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;AACnC,QAAA,MAAM,IAAI,GAAY;YACrB,KAAK;YACL,OAAO;AACP,YAAA,OAAO,EAAE,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;AACrE,YAAA,IAAI,EAAE,IAAI,EAAE,IAAI,IAAI,YAAY;SAChC,CAAC;AACF,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC;AAClD,QAAA,OAAO,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;KAC7E;AAED,IAAA,eAAe,CAAC,OAAgB,EAAA;;;QAG/B,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;AAC5E,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,oCAAA,EAAuC,OAAO,CAAC,KAAK,CAAc,WAAA,EAAA,OAAO,CAAC,OAAO,CAAA,QAAA,EAAW,GAAG,CAAA,CAAE,CAAC,CAAC;QAC/G,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO;QAEvB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,GAAG,CAAC,CAAC;;AAE5C,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;YAAE,OAAO;;QAE3E,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QAEnE,MAAM,OAAO,GAAG,MAAY,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,gBAAgB,GAAG,IAAI,CAAC,WAAW,EAAE,KAAK,UAAU,CAAC,KAAK,CAAC;QAEjE,IAAI,gBAAgB,EAAE;;;;;AAKrB,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YACtC,MAAM,gBAAgB,GAAG,SAAS,CAAC,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC;YAC5F,IAAI,gBAAgB,EAAE;AACrB,gBAAA,YAAY,CACX,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,KAAK,CAAC,EAC3D,QAAQ,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAChC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACnB;iBAAM;;gBAEN,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACpC;SACD;aAAM;;;;YAIN,KAAK,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SACrC;KACD;AAED;;;AAGG;AACH,IAAA,WAAW,CAAC,QAAiB,EAAA;AAC5B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,QAAQ,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC3E,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AACjC,QAAA,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAClG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,UAAU,GAAG,MAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,IAAI,CAAC,WAAW,EAAE,KAAK,QAAQ,CAAC,KAAK,EAAE;AAC1C,YAAA,YAAY,CACX,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC,EAC3C,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CACxB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACtB;aAAM;AACN,YAAA,UAAU,EAAE,CAAC;SACb;KACD;AAED;;;AAGG;AACH,IAAA,YAAY,CAAC,IAAa,EAAA;AACzB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAChC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO;QACvB,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC5D,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AACjC,QAAA,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACnE,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,MAAM,UAAU,GAAG,MAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;QAChF,IAAI,eAAe,EAAE;AACpB,YAAA,YAAY,CACX,IAAI,CAAC,MAAM,EACX,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,EACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CACpB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;SACtB;aAAM;AACN,YAAA,UAAU,EAAE,CAAC;SACb;KACD;AAED;;;;AAIG;IACH,QAAQ,GAAA;AACP,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAChC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AAC7B,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAC7C,QAAA,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AACjC,QAAA,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AAC9C,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,MAAY,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;;QAEhF,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5E,IAAI,eAAe,EAAE;AACpB,YAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACzB,gBAAA,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;AAC5B,gBAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aAC/G;iBAAM;;gBAEN,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;aACvC;SACD;aAAM;AACN,YAAA,UAAU,EAAE,CAAC;SACb;KACD;AAED;;;;;AAKG;AACH,IAAA,SAAS,CAAC,IAAa,EAAA;AACtB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAChC,QAAA,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO;AACvB,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;AACxB,QAAA,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;;;;AAIjC,QAAA,MAAM,OAAO,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC;AAChD,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACtD,QAAA,MAAM,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACvD,MAAM,OAAO,GAAY,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC;;;QAG1D,MAAM,IAAI,GAAG,CAAC,GAAG,aAAa,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC,CAAC;AAC3D,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KAC5B;;IAGD,WAAW,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAChC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACtC,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC;AACxD,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3F;;IAGD,WAAW,GAAA;AACV,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;AAChC,QAAA,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;AAC7B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,kBAAkB,EAAE,CAAC;AACtC,QAAA,MAAM,OAAO,GAAG,GAAG,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;AAClF,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5B,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3F;;AAGD,IAAA,cAAc,CAAC,KAAa,EAAA;AAC3B,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QAChC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,IAAI,GAAG,CAAC,MAAM;YAAE,OAAO;AAC7C,QAAA,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1B,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;KAC3F;AAED;;;AAGG;AACH,IAAA,aAAa,CAAC,IAAa,EAAA;QAC1B,IAAI,CAAC,IAAI,EAAE,OAAO,IAAI,CAAC,IAAI,EAAE,KAAK;YAAE,OAAO;AAC3C,QAAA,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;AAChD,QAAA,OAAO,CAAC,GAAG,CAAC,CAAA,kCAAA,EAAqC,IAAI,CAAC,KAAK,CAAc,WAAA,EAAA,IAAI,CAAC,OAAO,CAAA,SAAA,EAAY,GAAG,CAAA,CAAA,CAAG,CAAC,CAAC;AACzG,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;KACrD;AAED;;;;;;;;;;;AAWG;AACH,IAAA,0BAA0B,CAAC,KAAa,EAAE,MAAc,EAAE,KAAc,EAAA;AACvE,QAAA,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAAE,OAAO;AAC9B,QAAA,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC;AAClE,QAAA,IAAI,CAAC,MAAM;YAAE,OAAO;AACpB,QAAA,MAAM,WAAW,GAAG,MAAM,CAAC,OAAO,KAAK,QAAQ,CAAC;QAChD,MAAM,WAAW,GAAG,CAAC,CAAC,KAAK,IAAI,MAAM,CAAC,OAAO,KAAK,KAAK,CAAC;AACxD,QAAA,IAAI,CAAC,WAAW,IAAI,CAAC,WAAW;YAAE,OAAO;AACzC,QAAA,MAAM,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC;AAC3D,QAAA,MAAM,OAAO,GAAG,WAAW,GAAG,KAAM,GAAG,MAAM,CAAC,OAAO,CAAC;AACtD,QAAA,OAAO,CAAC,GAAG,CACV,CAAA,6CAAA,EAAgD,KAAK,CAAI,EAAA,CAAA;AACzD,YAAA,CAAA,SAAA,EAAY,MAAM,CAAC,OAAO,CAAA,KAAA,EAAQ,UAAU,CAAA,QAAA,EAAW,MAAM,CAAC,OAAO,CAAA,KAAA,EAAQ,OAAO,CAAA,CAAA,CAAG,CACvF,CAAC;QACF,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,MAAM,KAC/B,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,KAAK,KAAK,KAAK,GAAG,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAC5F,CAAC;KACF;AAED;;;;;AAKG;AACH,IAAA,YAAY,CAAC,IAAa,EAAA;QACzB,IAAI,CAAC,IAAI,EAAE,OAAO;YAAE,OAAO;QAC3B,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,EAAE;YAChD,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC5B,OAAO;SACP;AACD,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,GAAG,KAAK;AACjC,YAAA,GAAG,GAAG;YACN,EAAE,GAAG,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,EAAE;AACjD,SAAA,CAAC,CAAC;AACH,QAAA,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,CAAC,UAAU,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC;KAC/E;AAED,IAAA,mBAAmB,CAAC,SAAoB,EAAA;;;;AAIvC,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC;AACjD,QAAA,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;AAClD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;KAC9C;AAED;;;;;;;;AAQG;AACK,IAAA,sBAAsB,CAAC,OAAe,EAAA;;;;AAI7C,QAAA,IAAI,IAAI,CAAC,mBAAmB,EAAE;AAC7B,YAAA,MAAM,IAAI,GAAG,IAAI,CAAC,mBAAmB,EAAE,CAAC;;;;YAIxC,IAAI,OAAO,KAAK,YAAY,CAAC,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,EAAE;gBAClD,OAAO;AACN,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,UAAU,CAAC;AACpE,oBAAA,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,YAAY;iBAC/B,CAAC;aACF;SACD;AACD,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,iBAAiB,IAAI,CAAC;QACzC,IAAI,CAAC,KAAK,EAAE,MAAM;AAAE,YAAA,OAAO,IAAI,CAAC;QAChC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AACvD,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;QAC1B,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,aAAa,EAAE,CAAC;AACnD,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,KAA2C,CAAC;QAClE,MAAM,OAAO,GAAG,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;AACtE,QAAA,IAAI,CAAC,OAAO;AAAE,YAAA,OAAO,IAAI,CAAC;QAC1B,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;KACvC;AAED;;;;;;AAMG;IACH,qBAAqB,GAAA;AACpB,QAAA,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QACzB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,KAAI;YAC3B,MAAM,IAAI,GAAG,IAAI,CAAC,sBAAsB,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC;AACpB,YAAA,IAAI,CAAC,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;AAAE,gBAAA,OAAO,CAAC,CAAC;YACjE,OAAO,GAAG,IAAI,CAAC;AACf,YAAA,OAAO,EAAE,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;AACzD,SAAC,CAAC,CAAC;AACH,QAAA,IAAI,OAAO;AAAE,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;KACzC;AAED;;;;;;;AAOG;IACK,oBAAoB,CAAC,KAAuB,EAAE,IAAY,EAAA;AACjE,QAAA,MAAM,SAAS,GAAG,CAAC,CAAS,MAAc,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;AAC9E,QAAA,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AACvC,QAAA,IAAI,IAA0D,CAAC;AAC/D,QAAA,MAAM,KAAK,GAAG,CAAC,IAAsB,KAAU;AAC9C,YAAA,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE;AACtB,gBAAA,IAAI,EAAE,CAAC,UAAU,EAAE;oBAClB,MAAM,CAAC,GAAG,SAAS,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC;AACnC,oBAAA,IAAI,CAAC,KAAK,cAAc,KAAK,CAAC,IAAI,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,EAAE;AACtE,wBAAA,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC;AACxB,wBAAA,IAAI,CAAC,IAAI,IAAI,MAAM,GAAG,IAAI,CAAC,MAAM;4BAAE,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;qBAC/D;iBACD;AACD,gBAAA,IAAI,EAAE,CAAC,KAAK,EAAE,MAAM;AAAE,oBAAA,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;aACtC;AACF,SAAC,CAAC;QACF,KAAK,CAAC,KAAK,CAAC,CAAC;QACb,OAAO,IAAI,EAAE,IAAI,CAAC;KAClB;AAED;;;;AAIG;AACK,IAAA,gBAAgB,CAAC,IAAa,EAAA;QACrC,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AACnD,QAAA,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,OAAO;QACvC,OAAO,CAAC,GAAG,CAAC,CAA6C,0CAAA,EAAA,UAAU,CAAY,SAAA,EAAA,IAAI,CAAC,KAAK,CAAG,CAAA,CAAA,CAAC,CAAC;AAC9F,QAAA,IAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,CAAA,IAAA,EAAO,UAAU,CAAA,CAAA,EAAI,IAAI,CAAC,KAAK,CAAA,CAAE,CAAC,CAAC;KAC5E;8GA5mBW,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAV,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,cAFV,MAAM,EAAA,CAAA,CAAA,EAAA;;2FAEN,UAAU,EAAA,UAAA,EAAA,CAAA;kBAHtB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACX,oBAAA,UAAU,EAAE,MAAM;AAClB,iBAAA,CAAA;;;ACnGD;;;;;;;;AAQG;AACH,MAAM,IAAI,GAAG,8BAA8B,CAAC;AAC5C,MAAM,YAAY,GAAG,kBAAkB,CAAC;AAKxC;;;;;;;;;;;AAWG;MAEU,yBAAyB,CAAA;AADtC,IAAA,WAAA,GAAA;AAEkB,QAAA,IAAA,CAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AAChC,QAAA,IAAA,CAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAE,CAAA,EAAA,GAAuB,IAAI,CAAC;AAoEtC,KAAA;AAlEA,IAAA,QAAQ,CAAC,EAAe,EAAA;AACvB,QAAA,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;;;QAGb,MAAM,QAAQ,GAAG,UAAuC,CAAC;AACzD,QAAA,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;;;AAGpE,QAAA,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;KACpF;IAED,IAAI,CAAC,KAAiB,EAAE,OAAgB,EAAA;;AAEvC,QAAA,IAAI,IAAI,CAAC,EAAE,EAAE;AACZ,YAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;YAC/B,OAAO;SACP;;QAED,MAAM,QAAQ,GAAG,UAAuC,CAAC;AACzD,QAAA,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;QAChC,IAAI,QAAQ,EAAE;AACb,YAAA,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;SACzB;KACD;AAED;;;;;;AAMG;AACH,IAAA,oBAAoB,CAAC,OAAgB,EAAA;AACpC,QAAA,IAAI,IAAI,CAAC,EAAE,EAAE;AACZ,YAAA,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC;YAC9C,OAAO;SACP;QACD,MAAM,QAAQ,GAAG,UAAuC,CAAC;AACzD,QAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC3C,IAAI,WAAW,EAAE;YAChB,WAAW,CAAC,OAAO,CAAC,CAAC;SACrB;KACD;IAEO,SAAS,CAAC,KAAiB,EAAE,OAAgB,EAAA;QACpD,IAAI,CAAC,IAAI,CAAC,EAAE;YAAE,OAAO;AACrB,QAAA,MAAM,CAAC,GAAG,CAAC,GAAW,KAAa,IAAI,CAAC,gBAAgB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACxE,QAAA,IAAI,CAAC,EAAE,CAAC,KAAK,GAAG;AACf,YAAA;AACC,gBAAA,KAAK,EAAE,CAAC,CAAC,kBAAkB,CAAC;AAC5B,gBAAA,IAAI,EAAE,mBAAmB;gBACzB,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC;AAC5D,aAAA;AACD,YAAA;AACC,gBAAA,KAAK,EAAE,CAAC,CAAC,sBAAsB,CAAC;AAChC,gBAAA,IAAI,EAAE,qBAAqB;gBAC3B,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC3D,aAAA;AACD,YAAA;AACC,gBAAA,KAAK,EAAE,CAAC,CAAC,8BAA8B,CAAC;AACxC,gBAAA,IAAI,EAAE,aAAa;gBACnB,OAAO,EAAE,MAAM,IAAI,CAAC,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC;AAC5D,aAAA;SACD,CAAC;AACF,QAAA,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;KACpB;8GAtEW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAAzB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,yBAAyB,cADZ,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBADrC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;AC9BlC;;;;;;;;;;;;;;AAcG;MAKU,gBAAgB,CAAA;AAJ7B,IAAA,WAAA,GAAA;AAYkB,QAAA,IAAA,CAAA,kBAAkB,GAAG,MAAM,CAAC,yBAAyB,CAAC,CAAC;AAQxE,KAAA;AALA,IAAA,aAAa,CAAC,KAAiB,EAAA;AAC9B,QAAA,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO;YAAE,OAAO;QACnC,KAAK,CAAC,cAAc,EAAE,CAAC;QACvB,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;KAClD;8GAfW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA,CAAA,EAAA;kGAAhB,gBAAgB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,CAAA,aAAA,EAAA,SAAA,CAAA,EAAA,EAAA,IAAA,EAAA,EAAA,SAAA,EAAA,EAAA,aAAA,EAAA,uBAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA;;2FAAhB,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAJ5B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,IAAI;AAChB,oBAAA,QAAQ,EAAE,eAAe;AACzB,iBAAA,CAAA;8BAOsB,OAAO,EAAA,CAAA;sBAA5B,KAAK;uBAAC,aAAa,CAAA;gBAKpB,aAAa,EAAA,CAAA;sBADZ,YAAY;uBAAC,aAAa,EAAE,CAAC,QAAQ,CAAC,CAAA;;;AC/BxC;;;;;;;;;;;;;AAaG;AAEG,MAAO,qBAAsB,SAAQ,oBAAoB,CAAA;;AAGrD,IAAA,SAAS,CAAC,IAAa,EAAA;;;;;;QAM/B,MAAM,GAAG,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAClC,QAAA,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC;AAAE,YAAA,OAAO,GAAG,CAAC;QAEvC,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AACrC,QAAA,MAAM,QAAQ,GAAG,WAAW,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC;QAChE,MAAM,cAAc,GAAG,WAAW,IAAI,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC,GAAG,GAAG,CAAC;QAE1E,MAAM,QAAQ,GAAG,cAAc,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC;AAAE,YAAA,OAAO,GAAG,CAAC;QAE7B,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,cAAc;AAC1B,aAAA,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;aACnB,KAAK,CAAC,GAAG,CAAC;AACV,aAAA,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;aACrD,IAAI,CAAC,GAAG,CAAC,CAAC;AACZ,QAAA,OAAO,KAAK,GAAG,CAAG,EAAA,IAAI,IAAI,KAAK,CAAA,EAAG,QAAQ,CAAE,CAAA,GAAG,CAAA,EAAG,IAAI,CAAG,EAAA,QAAQ,EAAE,CAAC;KACpE;8GA1BW,qBAAqB,EAAA,IAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA;AAArB,IAAA,SAAA,IAAA,CAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA,CAAA,EAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE,CAAA;;;ACjBlC;;AAEG;;;;"}
@@ -16,12 +16,20 @@ import { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';
16
16
  import { HttpBackendService } from 'aril/http';
17
17
  import { provideHost, provideHostRouter } from 'aril/provider';
18
18
 
19
+ /**
20
+ * Host shell'in NgZone'unu MFE/plugin Application'a inject eder (paylaşımlı zone).
21
+ *
22
+ * `hostNgZone` host bootstrap'inde (`AppComponent` constructor'ında `inject(NgZone)`)
23
+ * set ediliyor. `getNgZone()` MFE/plugin bootstrap zamanında çağrılıyor → o anda
24
+ * `hostNgZone` set edilmiş olmalı. Set edilmemişse explicit error: silent `undefined`
25
+ * provider DI hatası "no provider for NgZone" gibi yanıltıcı bir mesajla patlardı.
26
+ */
19
27
  const getNgZone = () => {
20
- if (bridge.hostNgZone) {
21
- return { provide: NgZone, useValue: bridge.hostNgZone };
28
+ if (!bridge.hostNgZone) {
29
+ throw new Error('[getNgZone] bridge.hostNgZone henüz set edilmedi. ' +
30
+ 'Host shell bootstrap tamamlanmadan MFE/plugin getNgZone() çağıramaz.');
22
31
  }
23
- else
24
- return [];
32
+ return { provide: NgZone, useValue: bridge.hostNgZone };
25
33
  };
26
34
 
27
35
  class FactoryClass {
@@ -1 +1 @@
1
- {"version":3,"file":"aril-boot-config-plugins.mjs","sources":["../../projects/aril/boot/config/plugins/src/getNgZone.ts","../../projects/aril/boot/config/plugins/src/interfaces.ts","../../projects/aril/boot/config/plugins/src/plugins.service.ts","../../projects/aril/boot/config/plugins/aril-boot-config-plugins.ts"],"sourcesContent":["import { NgZone } from '@angular/core';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\n\r\nexport const getNgZone = () => {\r\n\tif (bridge.hostNgZone) {\r\n\t\treturn { provide: NgZone, useValue: bridge.hostNgZone };\r\n\t} else return [];\r\n};\r\n","import { LoadRemoteModuleScriptOptions } from '@angular-architects/module-federation';\r\n\r\ninterface PluginItem {\r\n\toptions: LoadRemoteModuleScriptOptions & { elementName: string };\r\n\tprops: { [key in string]: any };\r\n\tevents: { [key in string]: Function };\r\n}\r\n\r\nexport type PluginConfigs = { [key in string]: PluginItem };\r\n\r\nexport class FactoryClass {}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig, Type, importProvidersFrom, isDevMode } from '@angular/core';\r\nimport { createCustomElement } from '@angular/elements';\r\nimport { createApplication } from '@angular/platform-browser';\r\n\r\nimport { PrimeNGConfig } from 'primeng/api';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { ConfirmPopupModule } from 'primeng/confirmpopup';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { ToastModule } from 'primeng/toast';\r\n\r\nimport { TranslocoService } from '@ngneat/transloco';\r\nimport { firstValueFrom, tap } from 'rxjs';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { API_CONFIGS, ApiConfigsFactory } from 'aril/boot/config/api';\r\nimport { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';\r\nimport { HttpBackendService } from 'aril/http';\r\nimport { provideHost, provideHostRouter } from 'aril/provider';\r\n\r\nimport { getNgZone } from './getNgZone';\r\nimport { FactoryClass, PluginConfigs } from './interfaces';\r\n\r\nexport const PLUGINS = new FactoryClass() as FactoryClass & PluginConfigs;\r\n\r\nexport function loadPlugins(): () => void {\r\n\treturn () => {\r\n\t\ttry {\r\n\t\t\tconst pluginsData = bridge.pluginJson();\r\n\t\t\tObject.assign(PLUGINS, pluginsData);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.log('Error Plugins Loading', err);\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport async function bootPlugin(selector: string, component: Type<any>) {\r\n\tif (customElements.get(selector)) return;\r\n\r\n\tconst config: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideHost(selector as any), // todo refactor\r\n\t\t\tprovideHostRouter(),\r\n\t\t\timportProvidersFrom(\r\n\t\t\t\tConfirmDialogModule,\r\n\t\t\t\tConfirmPopupModule,\r\n\t\t\t\tDialogModule,\r\n\t\t\t\tMessagesModule,\r\n\t\t\t\tToastModule\r\n\t\t\t),\r\n\t\t\tgetNgZone(),\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpBackend: { httpClient: HttpClient },\r\n\t\t\t\t\ttranslocoService: TranslocoService,\r\n\t\t\t\t\tprimeNgConfig: PrimeNGConfig\r\n\t\t\t\t) => {\r\n\t\t\t\t\treturn () => {\r\n\t\t\t\t\t\tconst activeLang: LanguageCode = (localStorage.getItem('lang') as LanguageCode) ?? LanguageCode.TR;\r\n\r\n\t\t\t\t\t\ttranslocoService.setActiveLang(activeLang);\r\n\r\n\t\t\t\t\t\tif (!activeLang?.length) {\r\n\t\t\t\t\t\t\tconsole.warn('No language selected');\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (activeLang === LanguageCode.TR) {\r\n\t\t\t\t\t\t\tprimeNgConfig.setTranslation(TR_TRANSLATIONS);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst observable$ = httpBackend.httpClient\r\n\t\t\t\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t\t\t\t.pipe(\r\n\t\t\t\t\t\t\t\ttap((configs) => {\r\n\t\t\t\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\treturn firstValueFrom(observable$);\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tdeps: [HttpBackendService, TranslocoService, PrimeNGConfig],\r\n\t\t\t\tmulti: true\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tconst appRef = await createApplication(config);\r\n\tconst plugin = createCustomElement(component, { injector: appRef.injector });\r\n\r\n\tcustomElements.define(selector, plugin);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;AAIO,MAAM,SAAS,GAAG,MAAK;AAC7B,IAAA,IAAI,MAAM,CAAC,UAAU,EAAE;QACtB,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;KACxD;;AAAM,QAAA,OAAO,EAAE,CAAC;AAClB;;MCEa,YAAY,CAAA;AAAG;;ACef,MAAA,OAAO,GAAG,IAAI,YAAY,GAAmC;SAE1D,WAAW,GAAA;AAC1B,IAAA,OAAO,MAAK;AACX,QAAA,IAAI;AACH,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,UAAU,EAAE,CAAC;AACxC,YAAA,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;SACpC;QAAC,OAAO,GAAG,EAAE;AACb,YAAA,OAAO,CAAC,GAAG,CAAC,uBAAuB,EAAE,GAAG,CAAC,CAAC;SAC1C;AACF,KAAC,CAAC;AACH,CAAC;AAEM,eAAe,UAAU,CAAC,QAAgB,EAAE,SAAoB,EAAA;AACtE,IAAA,IAAI,cAAc,CAAC,GAAG,CAAC,QAAQ,CAAC;QAAE,OAAO;AAEzC,IAAA,MAAM,MAAM,GAAsB;AACjC,QAAA,SAAS,EAAE;AACV,YAAA,mBAAmB,CAAC,EAAE,UAAU,EAAE,gBAAgB,EAAE,CAAC;AACrD,YAAA,WAAW,CAAC,QAAe,CAAC;AAC5B,YAAA,iBAAiB,EAAE;YACnB,mBAAmB,CAClB,mBAAmB,EACnB,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,CACX;AACD,YAAA,SAAS,EAAE;AACX,YAAA;AACC,gBAAA,OAAO,EAAE,eAAe;gBACxB,UAAU,EAAE,CACX,WAAuC,EACvC,gBAAkC,EAClC,aAA4B,KACzB;AACH,oBAAA,OAAO,MAAK;AACX,wBAAA,MAAM,UAAU,GAAkB,YAAY,CAAC,OAAO,CAAC,MAAM,CAAkB,IAAI,YAAY,CAAC,EAAE,CAAC;AAEnG,wBAAA,gBAAgB,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;AAE3C,wBAAA,IAAI,CAAC,UAAU,EAAE,MAAM,EAAE;AACxB,4BAAA,OAAO,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;4BACrC,OAAO;yBACP;AAED,wBAAA,IAAI,UAAU,KAAK,YAAY,CAAC,EAAE,EAAE;AACnC,4BAAA,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC;yBAC9C;AAED,wBAAA,MAAM,WAAW,GAAG,WAAW,CAAC,UAAU;6BACxC,GAAG,CAAoB,SAAS,EAAE,GAAG,uCAAuC,GAAG,YAAY,CAAC;AAC5F,6BAAA,IAAI,CACJ,GAAG,CAAC,CAAC,OAAO,KAAI;4BACf,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,CAAC,CAAC;yBAC3C,CAAC,CACF,CAAC;AAEH,wBAAA,OAAO,cAAc,CAAC,WAAW,CAAC,CAAC;AACpC,qBAAC,CAAC;iBACF;AACD,gBAAA,IAAI,EAAE,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,aAAa,CAAC;AAC3D,gBAAA,KAAK,EAAE,IAAI;AACX,aAAA;AACD,SAAA;KACD,CAAC;AAEF,IAAA,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAC/C,IAAA,MAAM,MAAM,GAAG,mBAAmB,CAAC,SAAS,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;AAE7E,IAAA,cAAc,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AACzC;;AChGA;;AAEG;;;;"}
1
+ {"version":3,"file":"aril-boot-config-plugins.mjs","sources":["../../projects/aril/boot/config/plugins/src/getNgZone.ts","../../projects/aril/boot/config/plugins/src/interfaces.ts","../../projects/aril/boot/config/plugins/src/plugins.service.ts","../../projects/aril/boot/config/plugins/aril-boot-config-plugins.ts"],"sourcesContent":["import { NgZone } from '@angular/core';\r\n\r\nimport { bridge } from 'aril/boot/bridge';\r\n\r\n/**\r\n * Host shell'in NgZone'unu MFE/plugin Application'a inject eder (paylaşımlı zone).\r\n *\r\n * `hostNgZone` host bootstrap'inde (`AppComponent` constructor'ında `inject(NgZone)`)\r\n * set ediliyor. `getNgZone()` MFE/plugin bootstrap zamanında çağrılıyor → o anda\r\n * `hostNgZone` set edilmiş olmalı. Set edilmemişse explicit error: silent `undefined`\r\n * provider DI hatası \"no provider for NgZone\" gibi yanıltıcı bir mesajla patlardı.\r\n */\r\nexport const getNgZone = () => {\r\n\tif (!bridge.hostNgZone) {\r\n\t\tthrow new Error(\r\n\t\t\t'[getNgZone] bridge.hostNgZone henüz set edilmedi. ' +\r\n\t\t\t'Host shell bootstrap tamamlanmadan MFE/plugin getNgZone() çağıramaz.'\r\n\t\t);\r\n\t}\r\n\treturn { provide: NgZone, useValue: bridge.hostNgZone };\r\n};\r\n","import { LoadRemoteModuleScriptOptions } from '@angular-architects/module-federation';\r\n\r\ninterface PluginItem {\r\n\toptions: LoadRemoteModuleScriptOptions & { elementName: string };\r\n\tprops: { [key in string]: any };\r\n\tevents: { [key in string]: Function };\r\n}\r\n\r\nexport type PluginConfigs = { [key in string]: PluginItem };\r\n\r\nexport class FactoryClass {}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig, Type, importProvidersFrom, isDevMode } from '@angular/core';\r\nimport { createCustomElement } from '@angular/elements';\r\nimport { createApplication } from '@angular/platform-browser';\r\n\r\nimport { PrimeNGConfig } from 'primeng/api';\r\nimport { ConfirmDialogModule } from 'primeng/confirmdialog';\r\nimport { ConfirmPopupModule } from 'primeng/confirmpopup';\r\nimport { DialogModule } from 'primeng/dialog';\r\nimport { MessagesModule } from 'primeng/messages';\r\nimport { ToastModule } from 'primeng/toast';\r\n\r\nimport { TranslocoService } from '@ngneat/transloco';\r\nimport { firstValueFrom, tap } from 'rxjs';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { API_CONFIGS, ApiConfigsFactory } from 'aril/boot/config/api';\r\nimport { LanguageCode, TR_TRANSLATIONS } from 'aril/boot/config/translate';\r\nimport { HttpBackendService } from 'aril/http';\r\nimport { provideHost, provideHostRouter } from 'aril/provider';\r\n\r\nimport { getNgZone } from './getNgZone';\r\nimport { FactoryClass, PluginConfigs } from './interfaces';\r\n\r\nexport const PLUGINS = new FactoryClass() as FactoryClass & PluginConfigs;\r\n\r\nexport function loadPlugins(): () => void {\r\n\treturn () => {\r\n\t\ttry {\r\n\t\t\tconst pluginsData = bridge.pluginJson();\r\n\t\t\tObject.assign(PLUGINS, pluginsData);\r\n\t\t} catch (err) {\r\n\t\t\tconsole.log('Error Plugins Loading', err);\r\n\t\t}\r\n\t};\r\n}\r\n\r\nexport async function bootPlugin(selector: string, component: Type<any>) {\r\n\tif (customElements.get(selector)) return;\r\n\r\n\tconst config: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideHost(selector as any), // todo refactor\r\n\t\t\tprovideHostRouter(),\r\n\t\t\timportProvidersFrom(\r\n\t\t\t\tConfirmDialogModule,\r\n\t\t\t\tConfirmPopupModule,\r\n\t\t\t\tDialogModule,\r\n\t\t\t\tMessagesModule,\r\n\t\t\t\tToastModule\r\n\t\t\t),\r\n\t\t\tgetNgZone(),\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpBackend: { httpClient: HttpClient },\r\n\t\t\t\t\ttranslocoService: TranslocoService,\r\n\t\t\t\t\tprimeNgConfig: PrimeNGConfig\r\n\t\t\t\t) => {\r\n\t\t\t\t\treturn () => {\r\n\t\t\t\t\t\tconst activeLang: LanguageCode = (localStorage.getItem('lang') as LanguageCode) ?? LanguageCode.TR;\r\n\r\n\t\t\t\t\t\ttranslocoService.setActiveLang(activeLang);\r\n\r\n\t\t\t\t\t\tif (!activeLang?.length) {\r\n\t\t\t\t\t\t\tconsole.warn('No language selected');\r\n\t\t\t\t\t\t\treturn;\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (activeLang === LanguageCode.TR) {\r\n\t\t\t\t\t\t\tprimeNgConfig.setTranslation(TR_TRANSLATIONS);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst observable$ = httpBackend.httpClient\r\n\t\t\t\t\t\t\t.get<ApiConfigsFactory>(isDevMode() ? './assets/local-configs/api.local.json' : './api.json')\r\n\t\t\t\t\t\t\t.pipe(\r\n\t\t\t\t\t\t\t\ttap((configs) => {\r\n\t\t\t\t\t\t\t\t\tObject.assign(API_CONFIGS, { ...configs });\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\treturn firstValueFrom(observable$);\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tdeps: [HttpBackendService, TranslocoService, PrimeNGConfig],\r\n\t\t\t\tmulti: true\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tconst appRef = await createApplication(config);\r\n\tconst plugin = createCustomElement(component, { injector: appRef.injector });\r\n\r\n\tcustomElements.define(selector, plugin);\r\n}\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
@@ -1,14 +1,15 @@
1
+ import { Location } from '@angular/common';
1
2
  import { HttpClient } from '@angular/common/http';
2
3
  import * as i0 from '@angular/core';
3
4
  import { inject, NgZone, Component, APP_INITIALIZER } from '@angular/core';
4
5
  import { bootstrapApplication } from '@angular/platform-browser';
5
- import { provideRouter, withComponentInputBinding, withHashLocation, withViewTransitions, withRouterConfig, RouteReuseStrategy, Router } from '@angular/router';
6
+ import { provideRouter, withComponentInputBinding, withHashLocation, withRouterConfig, RouteReuseStrategy, UrlSerializer, Router } from '@angular/router';
6
7
  import { KeycloakService } from 'keycloak-angular';
7
8
  import { createBaseAppConfig, HOST_I18N_FOLDER } from 'aril/boot/base';
8
9
  import * as i3 from 'aril/boot/bridge';
9
10
  import { bridge } from 'aril/boot/bridge';
10
11
  import { loadApiConfigs, loadInitData } from 'aril/boot/config/api';
11
- import { ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';
12
+ import { CustomRouteReuseStrategy, TabAwareUrlSerializer, MicroAppService } from 'aril/boot/config/apps';
12
13
  import { loadPlugins } from 'aril/boot/config/plugins';
13
14
  import { i18nFolderName } from 'aril/i18n';
14
15
  import * as i1 from 'aril/theme/layout';
@@ -22,7 +23,6 @@ class AppComponent {
22
23
  this.bridgeSvc = bridgeSvc;
23
24
  this.bridgeSvc.mirrorToWindow();
24
25
  this.bridgeSvc.activeHost.set(appName);
25
- this.bridgeSvc.isHostMode.set(true);
26
26
  this.bridgeSvc.hostNgZone = inject(NgZone);
27
27
  this.pubSubService.subscribe('menuModeChanged', (data) => {
28
28
  const menuMode = data?.custom;
@@ -64,13 +64,27 @@ const boot = (_appName, routes) => {
64
64
  const appConfig = {
65
65
  providers: [
66
66
  createBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),
67
- provideRouter(routes, withComponentInputBinding(), withHashLocation(), withViewTransitions(), withRouterConfig({ onSameUrlNavigation: 'reload' })),
68
- { provide: RouteReuseStrategy, useClass: ArilReuseStrategy },
67
+ provideRouter(routes, withComponentInputBinding(), withHashLocation(), withRouterConfig({ onSameUrlNavigation: 'reload' })),
68
+ // `useExisting`: `CustomRouteReuseStrategy` `providedIn: 'root'` olduğu için root injector'da
69
+ // zaten bir instance var. Router'a aynı instance'ı bağlamak ileride class'a doğrudan
70
+ // erişmek isteyen tüketiciler (örn. test hook'ları, debug paneli) için tek-instance
71
+ // garantisi sağlar.
72
+ {
73
+ provide: RouteReuseStrategy,
74
+ useExisting: CustomRouteReuseStrategy
75
+ },
76
+ // `_tab` query param'ı address bar'dan strip eder; Router internal `queryParams`'ı korur.
77
+ {
78
+ provide: UrlSerializer,
79
+ useExisting: TabAwareUrlSerializer
80
+ },
69
81
  {
70
82
  provide: APP_INITIALIZER,
71
- useFactory: (httpClient, keycloak, router, folderName, microAppService) => {
83
+ useFactory: (httpClient, keycloak, router, folderName, microAppService, location) => {
72
84
  if (router)
73
85
  bridge.hostRouter = router;
86
+ if (location)
87
+ bridge.hostLocation = location;
74
88
  const runLoadApiConfigs = loadApiConfigs(httpClient, keycloak, folderName, microAppService);
75
89
  const runLoadInitData = loadInitData(httpClient);
76
90
  const runLoadPlugins = loadPlugins();
@@ -81,7 +95,7 @@ const boot = (_appName, routes) => {
81
95
  };
82
96
  },
83
97
  multi: true,
84
- deps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService]
98
+ deps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService, Location]
85
99
  }
86
100
  ]
87
101
  };
@@ -1 +1 @@
1
- {"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["import { Component, NgZone, inject } from '@angular/core';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate readonly layoutService: LayoutService,\r\n\t\tprivate readonly pubSubService: PubSubService,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\tthis.bridgeSvc.mirrorToWindow();\r\n\t\tthis.bridgeSvc.activeHost.set(appName);\r\n\t\tthis.bridgeSvc.isHostMode.set(true);\r\n\t\tthis.bridgeSvc.hostNgZone = inject(NgZone);\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig,\r\n\twithViewTransitions\r\n} from '@angular/router';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { loadApiConfigs, loadInitData } from 'aril/boot/config/api';\r\nimport { Apps, ArilReuseStrategy, MicroAppService } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { i18nFolderName } from 'aril/i18n';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithViewTransitions(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t{ provide: RouteReuseStrategy, useClass: ArilReuseStrategy },\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) bridge.hostRouter = router;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadInitData = loadInitData(httpClient);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\tawait runLoadInitData();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService]\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tbootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aril-boot-host.mjs","sources":["../../projects/aril/boot/host/src/app.component.ts","../../projects/aril/boot/host/src/bootstrap.ts","../../projects/aril/boot/host/aril-boot-host.ts"],"sourcesContent":["import { Component, NgZone, inject } from '@angular/core';\r\n\r\nimport { MfeBridge } from 'aril/boot/bridge';\r\nimport { AppLayoutComponent, LayoutService } from 'aril/theme/layout';\r\nimport { PubSubService } from 'aril/util/pub-sub';\r\n\r\nimport { appName } from './bootstrap';\r\n\r\ntype MenuMode = 'static' | 'expandable';\r\n\r\n@Component({\r\n\tstandalone: true,\r\n\tselector: 'aril-root',\r\n\ttemplate: ` <app-layout></app-layout> `,\r\n\timports: [AppLayoutComponent]\r\n})\r\nexport class AppComponent {\r\n\tconstructor(\r\n\t\tprivate readonly layoutService: LayoutService,\r\n\t\tprivate readonly pubSubService: PubSubService,\r\n\t\tprivate readonly bridgeSvc: MfeBridge\r\n\t) {\r\n\t\tthis.bridgeSvc.mirrorToWindow();\r\n\t\tthis.bridgeSvc.activeHost.set(appName);\r\n\t\tthis.bridgeSvc.hostNgZone = inject(NgZone);\r\n\r\n\t\tthis.pubSubService.subscribe('menuModeChanged', (data) => {\r\n\t\t\tconst menuMode = data?.custom;\r\n\r\n\t\t\tif (menuMode && (menuMode === 'static' || menuMode === 'expandable')) {\r\n\t\t\t\tthis.layoutService.config.update((config) => {\r\n\t\t\t\t\tconst newConfig = {\r\n\t\t\t\t\t\t...config,\r\n\t\t\t\t\t\tmenuMode: menuMode as MenuMode\r\n\t\t\t\t\t};\r\n\t\t\t\t\treturn newConfig;\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (menuMode === 'static') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = true;\r\n\t\t\t\t} else if (menuMode === 'expandable') {\r\n\t\t\t\t\tthis.layoutService.state.staticSidebarVisible = false;\r\n\t\t\t\t}\r\n\r\n\t\t\t\t// Always close mobile menu on mode change\r\n\t\t\t\tthis.layoutService.state.staticMenuMobileActive = false;\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n}\r\n","import { Location } from '@angular/common';\r\nimport { HttpClient } from '@angular/common/http';\r\nimport { APP_INITIALIZER, ApplicationConfig } from '@angular/core';\r\nimport { bootstrapApplication } from '@angular/platform-browser';\r\nimport {\r\n\tRouteReuseStrategy,\r\n\tRouter,\r\n\tRoutes,\r\n\tUrlSerializer,\r\n\tprovideRouter,\r\n\twithComponentInputBinding,\r\n\twithHashLocation,\r\n\twithRouterConfig\r\n} from '@angular/router';\r\n\r\nimport { KeycloakService } from 'keycloak-angular';\r\n\r\nimport { HOST_I18N_FOLDER, createBaseAppConfig } from 'aril/boot/base';\r\nimport { bridge } from 'aril/boot/bridge';\r\nimport { loadApiConfigs, loadInitData } from 'aril/boot/config/api';\r\nimport { Apps, CustomRouteReuseStrategy, MicroAppService, TabAwareUrlSerializer } from 'aril/boot/config/apps';\r\nimport { loadPlugins } from 'aril/boot/config/plugins';\r\nimport { i18nFolderName } from 'aril/i18n';\r\n\r\nimport { AppComponent } from './app.component';\r\n\r\nexport var appName: Apps;\r\n\r\nexport const boot = (_appName: Apps, routes: Routes) => {\r\n\tappName = _appName;\r\n\tconst appConfig: ApplicationConfig = {\r\n\t\tproviders: [\r\n\t\t\tcreateBaseAppConfig({ i18nFolder: HOST_I18N_FOLDER }),\r\n\t\t\tprovideRouter(\r\n\t\t\t\troutes,\r\n\t\t\t\twithComponentInputBinding(),\r\n\t\t\t\twithHashLocation(),\r\n\t\t\t\twithRouterConfig({ onSameUrlNavigation: 'reload' })\r\n\t\t\t),\r\n\t\t\t// `useExisting`: `CustomRouteReuseStrategy` `providedIn: 'root'` olduğu için root injector'da\r\n\t\t\t// zaten bir instance var. Router'a aynı instance'ı bağlamak ileride class'a doğrudan\r\n\t\t\t// erişmek isteyen tüketiciler (örn. test hook'ları, debug paneli) için tek-instance\r\n\t\t\t// garantisi sağlar.\r\n\t\t\t{\r\n\t\t\t\tprovide: RouteReuseStrategy,\r\n\t\t\t\tuseExisting: CustomRouteReuseStrategy\r\n\t\t\t},\r\n\t\t\t// `_tab` query param'ı address bar'dan strip eder; Router internal `queryParams`'ı korur.\r\n\t\t\t{\r\n\t\t\t\tprovide: UrlSerializer,\r\n\t\t\t\tuseExisting: TabAwareUrlSerializer\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\tprovide: APP_INITIALIZER,\r\n\t\t\t\tuseFactory: (\r\n\t\t\t\t\thttpClient: HttpClient,\r\n\t\t\t\t\tkeycloak: KeycloakService,\r\n\t\t\t\t\trouter: Router,\r\n\t\t\t\t\tfolderName: typeof i18nFolderName,\r\n\t\t\t\t\tmicroAppService: MicroAppService,\r\n\t\t\t\t\tlocation: Location\r\n\t\t\t\t) => {\r\n\t\t\t\t\tif (router) bridge.hostRouter = router;\r\n\t\t\t\t\tif (location) bridge.hostLocation = location;\r\n\r\n\t\t\t\t\tconst runLoadApiConfigs = loadApiConfigs(\r\n\t\t\t\t\t\thttpClient,\r\n\t\t\t\t\t\tkeycloak,\r\n\t\t\t\t\t\tfolderName as unknown as string,\r\n\t\t\t\t\t\tmicroAppService\r\n\t\t\t\t\t);\r\n\t\t\t\t\tconst runLoadInitData = loadInitData(httpClient);\r\n\t\t\t\t\tconst runLoadPlugins = loadPlugins();\r\n\t\t\t\t\treturn async () => {\r\n\t\t\t\t\t\tawait runLoadApiConfigs();\r\n\t\t\t\t\t\tawait runLoadInitData();\r\n\t\t\t\t\t\trunLoadPlugins();\r\n\t\t\t\t\t};\r\n\t\t\t\t},\r\n\t\t\t\tmulti: true,\r\n\t\t\t\tdeps: [HttpClient, KeycloakService, Router, i18nFolderName, MicroAppService, Location]\r\n\t\t\t}\r\n\t\t]\r\n\t};\r\n\r\n\tbootstrapApplication(AppComponent, appConfig).catch((err) => console.error(err));\r\n};\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}