@rangs/auth0-lib 0.0.2 → 0.0.4
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.
|
@@ -20,7 +20,7 @@ class RoleContextService {
|
|
|
20
20
|
this.permissionsService = permissionsService;
|
|
21
21
|
/** Sync from BroadcastChannel */
|
|
22
22
|
this.bc.onmessage = (ev) => {
|
|
23
|
-
if (!this.isSameContext(ev.data
|
|
23
|
+
if (!this.isSameContext(ev.data)) {
|
|
24
24
|
this.showCustomPopup();
|
|
25
25
|
}
|
|
26
26
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rangs-auth0-lib.mjs","sources":["../../../projects/auth0-lib/src/lib/services/role-context.service.ts","../../../projects/auth0-lib/src/lib/services/token.service.ts","../../../projects/auth0-lib/src/lib/auth.module.ts","../../../projects/auth0-lib/src/rangs-auth0-lib.ts"],"sourcesContent":["import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { RoleContextModel } from './role-context.model';\r\nimport { NgxPermissionsService } from 'ngx-permissions';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RoleContextService {\r\n\r\n private readonly STORAGE_KEY = 'im-role-context';\r\n private readonly bc = new BroadcastChannel('im-role-context-channel');\r\n\r\n // Store role context in signal (without permissions)\r\n private contextSignal = signal<RoleContextModel | null>(this.getStoredContext());\r\n context = this.contextSignal;\r\n\r\n /** For opening side Nav after tenant/role switch */\r\n private sidNav = new BehaviorSubject<RoleContextModel | null>(null);\r\n readonly sidNav$ = this.sidNav.asObservable();\r\n\r\n constructor(private permissionsService: NgxPermissionsService) {\r\n\r\n /** Sync from BroadcastChannel */\r\n this.bc.onmessage = (ev) => {\r\n if (!this.isSameContext(ev.data.ctx)) {\r\n this.showCustomPopup();\r\n }\r\n };\r\n\r\n /** Sync from LocalStorage events (multi-tab) */\r\n window.addEventListener('storage', (ev) => {\r\n if (ev.key === this.STORAGE_KEY) {\r\n const newCtx = ev.newValue ? JSON.parse(ev.newValue) : null;\r\n if (!this.isSameContext(newCtx)) {\r\n this.showCustomPopup();\r\n }\r\n }\r\n });\r\n\r\n // 🔥 IMPORTANT: Load permissions in memory — DO NOT save them\r\n effect(() => {\r\n const ctx = this.contextSignal();\r\n\r\n this.permissionsService.flushPermissions();\r\n\r\n if (ctx?.permissions?.length) {\r\n // Load only in memory, not persisted\r\n this.permissionsService.loadPermissions(ctx.permissions);\r\n }\r\n });\r\n }\r\n\r\n\r\n isSameContext(newCtx: RoleContextModel | null): boolean {\r\n const current = this.contextSignal();\r\n\r\n return !!current &&\r\n !!newCtx &&\r\n current.roleName === newCtx.roleName &&\r\n current.tenantId === newCtx.tenantId;\r\n}\r\n\r\n\r\n \r\n\r\n private showCustomPopup() {\r\n const modal = document.getElementById('roleChangeModal')!;\r\n modal.style.display = 'flex';\r\n\r\n const okBtn = document.getElementById('roleChangeOkBtn')!;\r\n okBtn.onclick = () => {\r\n window.location.href = window.location.origin;\r\n };\r\n }\r\n\r\n // Set role context WITHOUT saving permissions to storage\r\n setContext(ctx: RoleContextModel | null) {\r\n // Clone without permissions\r\n const saveCtx = ctx ? { ...ctx, permissions: undefined } : null;\r\n this.applyContext(saveCtx, true);\r\n\r\n // Permissions still applied in memory\r\n if (ctx?.permissions) {\r\n this.permissionsService.flushPermissions();\r\n this.permissionsService.loadPermissions(ctx.permissions);\r\n }\r\n\r\n // Notify subscribers\r\n this.sidNav.next(ctx);\r\n\r\n }\r\n\r\n clearContext() {\r\n this.permissionsService.flushPermissions();\r\n this.applyContext(null, true);\r\n }\r\n\r\n // Internal store + broadcast\r\n private applyContext(ctx: RoleContextModel | null, broadcast: boolean) {\r\n if (ctx) {\r\n const { permissions, ...storeOnly } = ctx;\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(storeOnly));\r\n } else {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n }\r\n\r\n this.contextSignal.set(ctx);\r\n\r\n if (broadcast) this.bc.postMessage(ctx);\r\n }\r\n\r\n // Load existing context (no permissions)\r\n private getStoredContext(): RoleContextModel | null {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n return raw ? JSON.parse(raw) : null;\r\n }\r\n\r\n // Role check used by directive\r\n hasAnyRole(roles: string[]) {\r\n return computed(() => {\r\n const currentRole = this.contextSignal()?.roleName?.toLowerCase();\r\n return roles.some(r => r.toLowerCase() === currentRole);\r\n });\r\n }\r\n \r\n notAnyRole(roles: string[]) {\r\n return computed(() => !this.hasAnyRole(roles)());\r\n }\r\n\r\n \r\n}","import { Injectable } from '@angular/core';\r\nimport { AuthService } from '@auth0/auth0-angular';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TokenService {\r\n\r\n constructor(private auth: AuthService) { }\r\n\r\n\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n return await firstValueFrom(this.auth.isAuthenticated$);\r\n }\r\n\r\n\r\n async getUserId(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.['user_id'] ?? null;\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return null;\r\n }\r\n }\r\n\r\n async getUserEmail(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n console.log(user);\r\n return user?.email ?? null;\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return null;\r\n }\r\n }\r\n\r\n async getUserFirstName(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.given_name ?? '';\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return '';\r\n }\r\n }\r\n async getUserLastName(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.family_name ?? '';\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return '';\r\n }\r\n }\r\n\r\n async getUserFullName(): Promise<string> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n const fullName = `${user?.family_name ?? ''} ${user?.given_name ?? ''}`.trim();\r\n return fullName || '';\r\n } catch (err) {\r\n console.warn('User not available:', err);\r\n return '';\r\n }\r\n }\r\n\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxPermissionsModule } from 'ngx-permissions';\r\nimport { AuthModule as OAuthModule } from '@auth0/auth0-angular';\r\nimport { RoleContextService,TokenService } from './services';\r\n\r\n@NgModule({\r\n imports: [\r\n NgxPermissionsModule,\r\n OAuthModule\r\n ],\r\n providers: [RoleContextService, TokenService]\r\n})\r\nexport class AuthModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","OAuthModule"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rangs-auth0-lib.mjs","sources":["../../../projects/auth0-lib/src/lib/services/role-context.service.ts","../../../projects/auth0-lib/src/lib/services/token.service.ts","../../../projects/auth0-lib/src/lib/auth.module.ts","../../../projects/auth0-lib/src/rangs-auth0-lib.ts"],"sourcesContent":["import { Injectable, signal, computed, effect } from '@angular/core';\r\nimport { RoleContextModel } from './role-context.model';\r\nimport { NgxPermissionsService } from 'ngx-permissions';\r\nimport { BehaviorSubject } from 'rxjs';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class RoleContextService {\r\n\r\n private readonly STORAGE_KEY = 'im-role-context';\r\n private readonly bc = new BroadcastChannel('im-role-context-channel');\r\n\r\n // Store role context in signal (without permissions)\r\n private contextSignal = signal<RoleContextModel | null>(this.getStoredContext());\r\n context = this.contextSignal;\r\n\r\n /** For opening side Nav after tenant/role switch */\r\n private sidNav = new BehaviorSubject<RoleContextModel | null>(null);\r\n readonly sidNav$ = this.sidNav.asObservable();\r\n\r\n constructor(private permissionsService: NgxPermissionsService) {\r\n\r\n /** Sync from BroadcastChannel */\r\n this.bc.onmessage = (ev) => {\r\n if (!this.isSameContext(ev.data)) {\r\n this.showCustomPopup();\r\n }\r\n };\r\n\r\n /** Sync from LocalStorage events (multi-tab) */\r\n window.addEventListener('storage', (ev) => {\r\n if (ev.key === this.STORAGE_KEY) {\r\n const newCtx = ev.newValue ? JSON.parse(ev.newValue) : null;\r\n if (!this.isSameContext(newCtx)) {\r\n this.showCustomPopup();\r\n }\r\n }\r\n });\r\n\r\n // 🔥 IMPORTANT: Load permissions in memory — DO NOT save them\r\n effect(() => {\r\n const ctx = this.contextSignal();\r\n\r\n this.permissionsService.flushPermissions();\r\n\r\n if (ctx?.permissions?.length) {\r\n // Load only in memory, not persisted\r\n this.permissionsService.loadPermissions(ctx.permissions);\r\n }\r\n });\r\n }\r\n\r\n\r\n isSameContext(newCtx: RoleContextModel | null): boolean {\r\n const current = this.contextSignal();\r\n\r\n return !!current &&\r\n !!newCtx &&\r\n current.roleName === newCtx.roleName &&\r\n current.tenantId === newCtx.tenantId;\r\n}\r\n\r\n\r\n \r\n\r\n private showCustomPopup() {\r\n const modal = document.getElementById('roleChangeModal')!;\r\n modal.style.display = 'flex';\r\n\r\n const okBtn = document.getElementById('roleChangeOkBtn')!;\r\n okBtn.onclick = () => {\r\n window.location.href = window.location.origin;\r\n };\r\n }\r\n\r\n // Set role context WITHOUT saving permissions to storage\r\n setContext(ctx: RoleContextModel | null) {\r\n // Clone without permissions\r\n const saveCtx = ctx ? { ...ctx, permissions: undefined } : null;\r\n this.applyContext(saveCtx, true);\r\n\r\n // Permissions still applied in memory\r\n if (ctx?.permissions) {\r\n this.permissionsService.flushPermissions();\r\n this.permissionsService.loadPermissions(ctx.permissions);\r\n }\r\n\r\n // Notify subscribers\r\n this.sidNav.next(ctx);\r\n\r\n }\r\n\r\n clearContext() {\r\n this.permissionsService.flushPermissions();\r\n this.applyContext(null, true);\r\n }\r\n\r\n // Internal store + broadcast\r\n private applyContext(ctx: RoleContextModel | null, broadcast: boolean) {\r\n if (ctx) {\r\n const { permissions, ...storeOnly } = ctx;\r\n localStorage.setItem(this.STORAGE_KEY, JSON.stringify(storeOnly));\r\n } else {\r\n localStorage.removeItem(this.STORAGE_KEY);\r\n }\r\n\r\n this.contextSignal.set(ctx);\r\n\r\n if (broadcast) this.bc.postMessage(ctx);\r\n }\r\n\r\n // Load existing context (no permissions)\r\n private getStoredContext(): RoleContextModel | null {\r\n const raw = localStorage.getItem(this.STORAGE_KEY);\r\n return raw ? JSON.parse(raw) : null;\r\n }\r\n\r\n // Role check used by directive\r\n hasAnyRole(roles: string[]) {\r\n return computed(() => {\r\n const currentRole = this.contextSignal()?.roleName?.toLowerCase();\r\n return roles.some(r => r.toLowerCase() === currentRole);\r\n });\r\n }\r\n \r\n notAnyRole(roles: string[]) {\r\n return computed(() => !this.hasAnyRole(roles)());\r\n }\r\n\r\n \r\n}","import { Injectable } from '@angular/core';\r\nimport { AuthService } from '@auth0/auth0-angular';\r\nimport { firstValueFrom } from 'rxjs';\r\n\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TokenService {\r\n\r\n constructor(private auth: AuthService) { }\r\n\r\n\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n return await firstValueFrom(this.auth.isAuthenticated$);\r\n }\r\n\r\n\r\n async getUserId(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.['user_id'] ?? null;\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return null;\r\n }\r\n }\r\n\r\n async getUserEmail(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n console.log(user);\r\n return user?.email ?? null;\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return null;\r\n }\r\n }\r\n\r\n async getUserFirstName(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.given_name ?? '';\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return '';\r\n }\r\n }\r\n async getUserLastName(): Promise<string | null> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n return user?.family_name ?? '';\r\n } catch (err) {\r\n console.warn('User ID not available:', err);\r\n return '';\r\n }\r\n }\r\n\r\n async getUserFullName(): Promise<string> {\r\n try {\r\n const user = await firstValueFrom(this.auth.user$);\r\n const fullName = `${user?.family_name ?? ''} ${user?.given_name ?? ''}`.trim();\r\n return fullName || '';\r\n } catch (err) {\r\n console.warn('User not available:', err);\r\n return '';\r\n }\r\n }\r\n\r\n\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { NgxPermissionsModule } from 'ngx-permissions';\r\nimport { AuthModule as OAuthModule } from '@auth0/auth0-angular';\r\nimport { RoleContextService,TokenService } from './services';\r\n\r\n@NgModule({\r\n imports: [\r\n NgxPermissionsModule,\r\n OAuthModule\r\n ],\r\n providers: [RoleContextService, TokenService]\r\n})\r\nexport class AuthModule { }\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","OAuthModule"],"mappings":";;;;;;;;MAQa,kBAAkB,CAAA;AAaT,IAAA,kBAAA;IAXH,WAAW,GAAG,iBAAiB;AAC/B,IAAA,EAAE,GAAG,IAAI,gBAAgB,CAAC,yBAAyB,CAAC;;IAG7D,aAAa,GAAG,MAAM,CAA0B,IAAI,CAAC,gBAAgB,EAAE,yDAAC;AAChF,IAAA,OAAO,GAAG,IAAI,CAAC,aAAa;;AAGpB,IAAA,MAAM,GAAG,IAAI,eAAe,CAA0B,IAAI,CAAC;AAC1D,IAAA,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;AAE7C,IAAA,WAAA,CAAoB,kBAAyC,EAAA;QAAzC,IAAA,CAAA,kBAAkB,GAAlB,kBAAkB;;QAGpC,IAAI,CAAC,EAAE,CAAC,SAAS,GAAG,CAAC,EAAE,KAAI;YACzB,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;gBAChC,IAAI,CAAC,eAAe,EAAE;YACxB;AACF,QAAA,CAAC;;QAGA,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,CAAC,EAAE,KAAI;YACxC,IAAI,EAAE,CAAC,GAAG,KAAK,IAAI,CAAC,WAAW,EAAE;gBAC/B,MAAM,MAAM,GAAG,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,CAAC,GAAG,IAAI;gBAC3D,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,EAAE;oBAC/B,IAAI,CAAC,eAAe,EAAE;gBACxB;YACF;AACF,QAAA,CAAC,CAAC;;QAGH,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,EAAE;AAEhC,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;AAE1C,YAAA,IAAI,GAAG,EAAE,WAAW,EAAE,MAAM,EAAE;;gBAE5B,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;YAC1D;AACF,QAAA,CAAC,CAAC;IACJ;AAGD,IAAA,aAAa,CAAC,MAA+B,EAAA;AAC5C,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,aAAa,EAAE;QAEpC,OAAO,CAAC,CAAC,OAAO;AACT,YAAA,CAAC,CAAC,MAAM;AACR,YAAA,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;AACpC,YAAA,OAAO,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;IAC7C;IAKU,eAAe,GAAA;QACrB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAE;AACzD,QAAA,KAAK,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM;QAE5B,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,iBAAiB,CAAE;AACzD,QAAA,KAAK,CAAC,OAAO,GAAG,MAAK;YACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM;AAC/C,QAAA,CAAC;IACH;;AAGA,IAAA,UAAU,CAAC,GAA4B,EAAA;;AAErC,QAAA,MAAM,OAAO,GAAG,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,WAAW,EAAE,SAAS,EAAE,GAAG,IAAI;AAC/D,QAAA,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC;;AAGhC,QAAA,IAAI,GAAG,EAAE,WAAW,EAAE;AACpB,YAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;YAC1C,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC,GAAG,CAAC,WAAW,CAAC;QAC1D;;AAGA,QAAA,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;IAEvB;IAEA,YAAY,GAAA;AACV,QAAA,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,EAAE;AAC1C,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC;IAC/B;;IAGQ,YAAY,CAAC,GAA4B,EAAE,SAAkB,EAAA;QACnE,IAAI,GAAG,EAAE;YACP,MAAM,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,GAAG,GAAG;AACzC,YAAA,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnE;aAAO;AACL,YAAA,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC;QAC3C;AAEA,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,CAAC;AAE3B,QAAA,IAAI,SAAS;AAAE,YAAA,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC;IACzC;;IAGQ,gBAAgB,GAAA;QACtB,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;AAClD,QAAA,OAAO,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI;IACrC;;AAGA,IAAA,UAAU,CAAC,KAAe,EAAA;QACxB,OAAO,QAAQ,CAAC,MAAK;YACnB,MAAM,WAAW,GAAG,IAAI,CAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE;AACjE,YAAA,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,KAAK,WAAW,CAAC;AACzD,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,KAAe,EAAA;AACxB,QAAA,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;IAClD;wGAxHW,kBAAkB,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA,qBAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cAFjB,MAAM,EAAA,CAAA;;4FAEP,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAH9B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCCY,YAAY,CAAA;AAEH,IAAA,IAAA;AAApB,IAAA,WAAA,CAAoB,IAAiB,EAAA;QAAjB,IAAA,CAAA,IAAI,GAAJ,IAAI;IAAiB;AAIzC,IAAA,MAAM,eAAe,GAAA;QACnB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC;IACzD;AAGA,IAAA,MAAM,SAAS,GAAA;AACb,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,OAAO,IAAI,GAAG,SAAS,CAAC,IAAI,IAAI;QAClC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;AAC3C,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,MAAM,YAAY,GAAA;AAChB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;AACjB,YAAA,OAAO,IAAI,EAAE,KAAK,IAAI,IAAI;QAC5B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;AAC3C,YAAA,OAAO,IAAI;QACb;IACF;AAEA,IAAA,MAAM,gBAAgB,GAAA;AACpB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,OAAO,IAAI,EAAE,UAAU,IAAI,EAAE;QAC/B;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;AAC3C,YAAA,OAAO,EAAE;QACX;IACF;AACA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,OAAO,IAAI,EAAE,WAAW,IAAI,EAAE;QAChC;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,wBAAwB,EAAE,GAAG,CAAC;AAC3C,YAAA,OAAO,EAAE;QACX;IACF;AAEA,IAAA,MAAM,eAAe,GAAA;AACnB,QAAA,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;AAClD,YAAA,MAAM,QAAQ,GAAG,CAAA,EAAG,IAAI,EAAE,WAAW,IAAI,EAAE,CAAA,CAAA,EAAI,IAAI,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE;YAC9E,OAAO,QAAQ,IAAI,EAAE;QACvB;QAAE,OAAO,GAAG,EAAE;AACZ,YAAA,OAAO,CAAC,IAAI,CAAC,qBAAqB,EAAE,GAAG,CAAC;AACxC,YAAA,OAAO,EAAE;QACX;IACF;wGA5DW,YAAY,EAAA,IAAA,EAAA,CAAA,EAAA,KAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAZ,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,YAAY,cAFX,MAAM,EAAA,CAAA;;4FAEP,YAAY,EAAA,UAAA,EAAA,CAAA;kBAHxB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE;AACb,iBAAA;;;MCKY,UAAU,CAAA;wGAAV,UAAU,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAV,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,YALf,oBAAoB;YACpBC,YAAW,CAAA,EAAA,CAAA;AAIN,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAU,aAFR,CAAC,kBAAkB,EAAE,YAAY,CAAC,YAHzC,oBAAoB;YACpBA,YAAW,CAAA,EAAA,CAAA;;4FAIN,UAAU,EAAA,UAAA,EAAA,CAAA;kBAPtB,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACN,oBAAA,OAAO,EAAE;wBACL,oBAAoB;wBACpBA;AACH,qBAAA;AACD,oBAAA,SAAS,EAAE,CAAC,kBAAkB,EAAE,YAAY;AAC/C,iBAAA;;;ACXD;;AAEG;;;;"}
|