@acorex-platform/framework-server 0.0.33 → 0.0.37

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 (207) hide show
  1. package/background-job/src/lib/schedule/background-job-schedule-scanner.service.d.ts.map +1 -1
  2. package/background-job/src/lib/schedule/background-job-schedule-scanner.service.js +29 -2
  3. package/background-job/src/lib/schedule/background-job-schedule-scanner.service.js.map +1 -1
  4. package/core/src/lib/runtime/runtime-authz.guard.d.ts +3 -2
  5. package/core/src/lib/runtime/runtime-authz.guard.d.ts.map +1 -1
  6. package/core/src/lib/runtime/runtime-authz.guard.js +7 -6
  7. package/core/src/lib/runtime/runtime-authz.guard.js.map +1 -1
  8. package/domain/seed/src/lib/category-companion-entity.builder.d.ts +1 -1
  9. package/domain/seed/src/lib/category-companion-entity.builder.d.ts.map +1 -1
  10. package/domain/seed/src/lib/category-companion-entity.builder.js +64 -0
  11. package/domain/seed/src/lib/category-companion-entity.builder.js.map +1 -1
  12. package/jql/schema/src/lib/generated/widget-data-types.bootstrap.js +1 -1
  13. package/jql/schema/src/lib/generated/widget-data-types.bootstrap.js.map +1 -1
  14. package/package.json +2 -2
  15. package/realtime/src/lib/auth/auth-security-alert-realtime.listener.d.ts +18 -0
  16. package/realtime/src/lib/auth/auth-security-alert-realtime.listener.d.ts.map +1 -0
  17. package/realtime/src/lib/auth/auth-security-alert-realtime.listener.js +90 -0
  18. package/realtime/src/lib/auth/auth-security-alert-realtime.listener.js.map +1 -0
  19. package/realtime/src/lib/delivery/socket-io-realtime.delivery.d.ts.map +1 -1
  20. package/realtime/src/lib/delivery/socket-io-realtime.delivery.js +9 -4
  21. package/realtime/src/lib/delivery/socket-io-realtime.delivery.js.map +1 -1
  22. package/realtime/src/lib/gateway/realtime-ws-auth.d.ts +1 -1
  23. package/realtime/src/lib/gateway/realtime-ws-auth.d.ts.map +1 -1
  24. package/realtime/src/lib/gateway/realtime-ws-auth.js +4 -2
  25. package/realtime/src/lib/gateway/realtime-ws-auth.js.map +1 -1
  26. package/realtime/src/lib/gateway/realtime.gateway.d.ts +1 -0
  27. package/realtime/src/lib/gateway/realtime.gateway.d.ts.map +1 -1
  28. package/realtime/src/lib/gateway/realtime.gateway.js +9 -2
  29. package/realtime/src/lib/gateway/realtime.gateway.js.map +1 -1
  30. package/realtime/src/lib/realtime.module.d.ts.map +1 -1
  31. package/realtime/src/lib/realtime.module.js +2 -0
  32. package/realtime/src/lib/realtime.module.js.map +1 -1
  33. package/realtime/src/lib/rooms/realtime-rooms.util.d.ts +8 -0
  34. package/realtime/src/lib/rooms/realtime-rooms.util.d.ts.map +1 -1
  35. package/realtime/src/lib/rooms/realtime-rooms.util.js +22 -0
  36. package/realtime/src/lib/rooms/realtime-rooms.util.js.map +1 -1
  37. package/realtime/src/lib/services/realtime-publisher.service.d.ts.map +1 -1
  38. package/realtime/src/lib/services/realtime-publisher.service.js +7 -1
  39. package/realtime/src/lib/services/realtime-publisher.service.js.map +1 -1
  40. package/realtime/src/lib/topics/realtime-topics.d.ts +1 -0
  41. package/realtime/src/lib/topics/realtime-topics.d.ts.map +1 -1
  42. package/realtime/src/lib/topics/realtime-topics.js +2 -1
  43. package/realtime/src/lib/topics/realtime-topics.js.map +1 -1
  44. package/realtime/src/lib/types/realtime.types.d.ts +19 -0
  45. package/realtime/src/lib/types/realtime.types.d.ts.map +1 -1
  46. package/realtime/src/lib/types/realtime.types.js.map +1 -1
  47. package/security/src/index.d.ts +4 -0
  48. package/security/src/index.d.ts.map +1 -1
  49. package/security/src/index.js +5 -0
  50. package/security/src/index.js.map +1 -1
  51. package/security/src/lib/auth/auth-cookie-response.util.d.ts.map +1 -1
  52. package/security/src/lib/auth/auth-cookie-response.util.js +4 -1
  53. package/security/src/lib/auth/auth-cookie-response.util.js.map +1 -1
  54. package/security/src/lib/auth/auth-cookie.service.d.ts +2 -0
  55. package/security/src/lib/auth/auth-cookie.service.d.ts.map +1 -1
  56. package/security/src/lib/auth/auth-cookie.service.js +17 -0
  57. package/security/src/lib/auth/auth-cookie.service.js.map +1 -1
  58. package/security/src/lib/auth/auth-csrf.middleware.d.ts +14 -0
  59. package/security/src/lib/auth/auth-csrf.middleware.d.ts.map +1 -0
  60. package/security/src/lib/auth/auth-csrf.middleware.js +60 -0
  61. package/security/src/lib/auth/auth-csrf.middleware.js.map +1 -0
  62. package/security/src/lib/auth/auth-identity-provider.source.d.ts +11 -0
  63. package/security/src/lib/auth/auth-identity-provider.source.d.ts.map +1 -1
  64. package/security/src/lib/auth/auth-identity-provider.source.js +6 -1
  65. package/security/src/lib/auth/auth-identity-provider.source.js.map +1 -1
  66. package/security/src/lib/auth/auth-local-credentials.service.d.ts +8 -0
  67. package/security/src/lib/auth/auth-local-credentials.service.d.ts.map +1 -1
  68. package/security/src/lib/auth/auth-local-credentials.service.js +41 -16
  69. package/security/src/lib/auth/auth-local-credentials.service.js.map +1 -1
  70. package/security/src/lib/auth/auth-max-device-sessions-policy.d.ts +14 -0
  71. package/security/src/lib/auth/auth-max-device-sessions-policy.d.ts.map +1 -0
  72. package/security/src/lib/auth/auth-max-device-sessions-policy.js +48 -0
  73. package/security/src/lib/auth/auth-max-device-sessions-policy.js.map +1 -0
  74. package/security/src/lib/auth/auth-runtime.handlers.d.ts +15 -3
  75. package/security/src/lib/auth/auth-runtime.handlers.d.ts.map +1 -1
  76. package/security/src/lib/auth/auth-runtime.handlers.js +51 -3
  77. package/security/src/lib/auth/auth-runtime.handlers.js.map +1 -1
  78. package/security/src/lib/auth/auth.config.d.ts +7 -0
  79. package/security/src/lib/auth/auth.config.d.ts.map +1 -1
  80. package/security/src/lib/auth/auth.config.js +8 -1
  81. package/security/src/lib/auth/auth.config.js.map +1 -1
  82. package/security/src/lib/auth/auth.events.d.ts +22 -0
  83. package/security/src/lib/auth/auth.events.d.ts.map +1 -1
  84. package/security/src/lib/auth/auth.events.js +3 -1
  85. package/security/src/lib/auth/auth.events.js.map +1 -1
  86. package/security/src/lib/auth/auth.service.d.ts +65 -5
  87. package/security/src/lib/auth/auth.service.d.ts.map +1 -1
  88. package/security/src/lib/auth/auth.service.js +311 -10
  89. package/security/src/lib/auth/auth.service.js.map +1 -1
  90. package/security/src/lib/auth/auth.types.d.ts +36 -0
  91. package/security/src/lib/auth/auth.types.d.ts.map +1 -1
  92. package/security/src/lib/auth/auth.types.js.map +1 -1
  93. package/security/src/lib/auth/device-session.service.d.ts +59 -1
  94. package/security/src/lib/auth/device-session.service.d.ts.map +1 -1
  95. package/security/src/lib/auth/device-session.service.js +299 -28
  96. package/security/src/lib/auth/device-session.service.js.map +1 -1
  97. package/security/src/lib/auth/jwt-auth.guard.d.ts +2 -1
  98. package/security/src/lib/auth/jwt-auth.guard.d.ts.map +1 -1
  99. package/security/src/lib/auth/jwt-auth.guard.js +4 -2
  100. package/security/src/lib/auth/jwt-auth.guard.js.map +1 -1
  101. package/security/src/lib/auth/login-attempt.service.d.ts +14 -3
  102. package/security/src/lib/auth/login-attempt.service.d.ts.map +1 -1
  103. package/security/src/lib/auth/login-attempt.service.js +35 -10
  104. package/security/src/lib/auth/login-attempt.service.js.map +1 -1
  105. package/security/src/lib/auth/request-meta.util.js +64 -11
  106. package/security/src/lib/auth/request-meta.util.js.map +1 -1
  107. package/security/src/lib/auth/token-revocation.constants.d.ts +9 -0
  108. package/security/src/lib/auth/token-revocation.constants.d.ts.map +1 -0
  109. package/security/src/lib/auth/token-revocation.constants.js +14 -0
  110. package/security/src/lib/auth/token-revocation.constants.js.map +1 -0
  111. package/security/src/lib/auth/token.service.d.ts +26 -1
  112. package/security/src/lib/auth/token.service.d.ts.map +1 -1
  113. package/security/src/lib/auth/token.service.js +105 -4
  114. package/security/src/lib/auth/token.service.js.map +1 -1
  115. package/security/src/lib/oauth/connect.controller.d.ts +81 -7
  116. package/security/src/lib/oauth/connect.controller.d.ts.map +1 -1
  117. package/security/src/lib/oauth/connect.controller.js +264 -36
  118. package/security/src/lib/oauth/connect.controller.js.map +1 -1
  119. package/security/src/lib/oauth/oauth-bff.util.d.ts +9 -0
  120. package/security/src/lib/oauth/oauth-bff.util.d.ts.map +1 -0
  121. package/security/src/lib/oauth/oauth-bff.util.js +30 -0
  122. package/security/src/lib/oauth/oauth-bff.util.js.map +1 -0
  123. package/security/src/lib/oauth/oauth-claims.util.d.ts +6 -0
  124. package/security/src/lib/oauth/oauth-claims.util.d.ts.map +1 -0
  125. package/security/src/lib/oauth/oauth-claims.util.js +36 -0
  126. package/security/src/lib/oauth/oauth-claims.util.js.map +1 -0
  127. package/security/src/lib/oauth/oauth-client-registry.service.d.ts +25 -0
  128. package/security/src/lib/oauth/oauth-client-registry.service.d.ts.map +1 -0
  129. package/security/src/lib/oauth/oauth-client-registry.service.js +201 -0
  130. package/security/src/lib/oauth/oauth-client-registry.service.js.map +1 -0
  131. package/security/src/lib/oauth/oauth-connect.exception-filter.d.ts +10 -0
  132. package/security/src/lib/oauth/oauth-connect.exception-filter.d.ts.map +1 -0
  133. package/security/src/lib/oauth/oauth-connect.exception-filter.js +59 -0
  134. package/security/src/lib/oauth/oauth-connect.exception-filter.js.map +1 -0
  135. package/security/src/lib/oauth/oauth-error.util.d.ts +23 -0
  136. package/security/src/lib/oauth/oauth-error.util.d.ts.map +1 -0
  137. package/security/src/lib/oauth/oauth-error.util.js +114 -0
  138. package/security/src/lib/oauth/oauth-error.util.js.map +1 -0
  139. package/security/src/lib/oauth/oauth-grant-store.interface.d.ts +16 -0
  140. package/security/src/lib/oauth/oauth-grant-store.interface.d.ts.map +1 -0
  141. package/security/src/lib/oauth/oauth-grant-store.interface.js +14 -0
  142. package/security/src/lib/oauth/oauth-grant-store.interface.js.map +1 -0
  143. package/security/src/lib/oauth/oauth-issuer.util.d.ts +7 -0
  144. package/security/src/lib/oauth/oauth-issuer.util.d.ts.map +1 -0
  145. package/security/src/lib/oauth/oauth-issuer.util.js +25 -0
  146. package/security/src/lib/oauth/oauth-issuer.util.js.map +1 -0
  147. package/security/src/lib/oauth/oauth-op.service.d.ts +35 -0
  148. package/security/src/lib/oauth/oauth-op.service.d.ts.map +1 -0
  149. package/security/src/lib/oauth/oauth-op.service.js +152 -0
  150. package/security/src/lib/oauth/oauth-op.service.js.map +1 -0
  151. package/security/src/lib/oauth/oauth-op.types.d.ts +73 -0
  152. package/security/src/lib/oauth/oauth-op.types.d.ts.map +1 -0
  153. package/security/src/lib/oauth/oauth-op.types.js +5 -0
  154. package/security/src/lib/oauth/oauth-op.types.js.map +1 -0
  155. package/security/src/lib/oauth/oauth-provider-hint.util.d.ts +8 -0
  156. package/security/src/lib/oauth/oauth-provider-hint.util.d.ts.map +1 -0
  157. package/security/src/lib/oauth/oauth-provider-hint.util.js +24 -0
  158. package/security/src/lib/oauth/oauth-provider-hint.util.js.map +1 -0
  159. package/security/src/lib/oauth/oauth-redis-oidc-adapter.d.ts +27 -0
  160. package/security/src/lib/oauth/oauth-redis-oidc-adapter.d.ts.map +1 -0
  161. package/security/src/lib/oauth/oauth-redis-oidc-adapter.js +159 -0
  162. package/security/src/lib/oauth/oauth-redis-oidc-adapter.js.map +1 -0
  163. package/security/src/lib/oauth/oauth-rp.service.d.ts +53 -0
  164. package/security/src/lib/oauth/oauth-rp.service.d.ts.map +1 -0
  165. package/security/src/lib/oauth/oauth-rp.service.js +371 -0
  166. package/security/src/lib/oauth/oauth-rp.service.js.map +1 -0
  167. package/security/src/lib/oauth/oauth-rp.types.d.ts +25 -0
  168. package/security/src/lib/oauth/oauth-rp.types.d.ts.map +1 -0
  169. package/security/src/lib/oauth/oauth-rp.types.js +5 -0
  170. package/security/src/lib/oauth/oauth-rp.types.js.map +1 -0
  171. package/security/src/lib/oauth/oidc-provider-engine.service.d.ts +25 -0
  172. package/security/src/lib/oauth/oidc-provider-engine.service.d.ts.map +1 -0
  173. package/security/src/lib/oauth/oidc-provider-engine.service.js +208 -0
  174. package/security/src/lib/oauth/oidc-provider-engine.service.js.map +1 -0
  175. package/security/src/lib/oauth/platform-oauth.service.d.ts +43 -14
  176. package/security/src/lib/oauth/platform-oauth.service.d.ts.map +1 -1
  177. package/security/src/lib/oauth/platform-oauth.service.js +177 -170
  178. package/security/src/lib/oauth/platform-oauth.service.js.map +1 -1
  179. package/security/src/lib/oauth/platform-oauth.types.d.ts +11 -3
  180. package/security/src/lib/oauth/platform-oauth.types.d.ts.map +1 -1
  181. package/security/src/lib/oauth/platform-oauth.types.js.map +1 -1
  182. package/security/src/lib/oauth/redis-oauth-grant-store.service.d.ts +22 -0
  183. package/security/src/lib/oauth/redis-oauth-grant-store.service.d.ts.map +1 -0
  184. package/security/src/lib/oauth/redis-oauth-grant-store.service.js +132 -0
  185. package/security/src/lib/oauth/redis-oauth-grant-store.service.js.map +1 -0
  186. package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.d.ts +14 -0
  187. package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.d.ts.map +1 -0
  188. package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.js +46 -0
  189. package/security/src/lib/oauth/testing/in-memory-oauth-grant-store.js.map +1 -0
  190. package/security/src/lib/oauth/testing/jest-empty-module.d.ts +4 -0
  191. package/security/src/lib/oauth/testing/jest-empty-module.d.ts.map +1 -0
  192. package/security/src/lib/oauth/testing/jest-empty-module.js +11 -0
  193. package/security/src/lib/oauth/testing/jest-empty-module.js.map +1 -0
  194. package/security/src/lib/oauth/testing/mock-oidc-provider.d.ts +49 -0
  195. package/security/src/lib/oauth/testing/mock-oidc-provider.d.ts.map +1 -0
  196. package/security/src/lib/oauth/testing/mock-oidc-provider.js +158 -0
  197. package/security/src/lib/oauth/testing/mock-oidc-provider.js.map +1 -0
  198. package/security/src/lib/security.module.d.ts.map +1 -1
  199. package/security/src/lib/security.module.js +31 -0
  200. package/security/src/lib/security.module.js.map +1 -1
  201. package/security/src/lib/session/backend-session.types.d.ts +2 -0
  202. package/security/src/lib/session/backend-session.types.d.ts.map +1 -1
  203. package/security/src/lib/session/backend-session.types.js.map +1 -1
  204. package/security/src/lib/session/optional-jwt-session.middleware.d.ts +6 -4
  205. package/security/src/lib/session/optional-jwt-session.middleware.d.ts.map +1 -1
  206. package/security/src/lib/session/optional-jwt-session.middleware.js +18 -7
  207. package/security/src/lib/session/optional-jwt-session.middleware.js.map +1 -1
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OAuthOpService = void 0;
4
+ const tslib_1 = require("tslib");
5
+ const common_1 = require("@nestjs/common");
6
+ const core_1 = require("@nestjs/core");
7
+ const crypto_1 = require("crypto");
8
+ const auth_identity_provider_source_1 = require("../auth/auth-identity-provider.source");
9
+ const oauth_client_registry_service_1 = require("./oauth-client-registry.service");
10
+ const oauth_rp_service_1 = require("./oauth-rp.service");
11
+ const oauth_grant_store_interface_1 = require("./oauth-grant-store.interface");
12
+ const platform_oauth_config_1 = require("./platform-oauth.config");
13
+ const oauth_error_util_1 = require("./oauth-error.util");
14
+ //#region ---- OAuth OP (Authorization Server) service ----
15
+ let OAuthOpService = class OAuthOpService {
16
+ constructor(grants, rp, clients, moduleRef) {
17
+ this.grants = grants;
18
+ this.rp = rp;
19
+ this.clients = clients;
20
+ this.moduleRef = moduleRef;
21
+ this.authorizationCodeTtlMs = platform_oauth_config_1.PLATFORM_OAUTH_CODE_TTL_MS;
22
+ }
23
+ async beginAuthorization(request) {
24
+ this.assertSupportedAuthorizeRequest(request);
25
+ const providerKey = request.provider.trim();
26
+ if (!providerKey) {
27
+ throw (0, oauth_error_util_1.oauthInvalidRequest)('identity_provider (or acr_values) is required.');
28
+ }
29
+ const broker = await this.requireBrokerConfig(providerKey);
30
+ const codeVerifier = request.codeVerifier?.trim() ||
31
+ (await this.grants.consumePkceVerifier(request.codeChallenge.trim())) ||
32
+ undefined;
33
+ const externalState = (0, crypto_1.randomBytes)(16).toString('hex');
34
+ const nonce = (0, crypto_1.randomBytes)(16).toString('hex');
35
+ await this.saveExternalState(externalState, {
36
+ codeChallenge: request.codeChallenge,
37
+ codeChallengeMethod: request.codeChallengeMethod,
38
+ codeVerifier,
39
+ redirectUri: request.redirectUri,
40
+ clientId: request.clientId,
41
+ provider: providerKey,
42
+ issuer: request.issuer.replace(/\/$/, ''),
43
+ nonce,
44
+ expiresAt: Date.now() + this.authorizationCodeTtlMs,
45
+ });
46
+ const callbackUrl = `${request.issuer.replace(/\/$/, '')}/connect/callback/${encodeURIComponent(providerKey)}`;
47
+ const externalUrl = this.rp.buildAuthorizationUrl(broker, callbackUrl, externalState, nonce);
48
+ return { externalState, externalUrl };
49
+ }
50
+ async issueCode(input) {
51
+ const code = (0, crypto_1.randomBytes)(24).toString('hex');
52
+ const expiresAt = input.expiresAt ?? Date.now() + this.authorizationCodeTtlMs;
53
+ await this.grants.saveCode(code, {
54
+ ...input,
55
+ expiresAt,
56
+ }, this.authorizationCodeTtlMs);
57
+ return code;
58
+ }
59
+ async consumeCode(input) {
60
+ const record = await this.grants.consumeCode(input.code);
61
+ if (!record || record.expiresAt < Date.now()) {
62
+ throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid or expired authorization code.');
63
+ }
64
+ this.clients.assertRedirectUri(input.clientId, input.redirectUri);
65
+ if (record.clientId !== input.clientId || record.redirectUri !== input.redirectUri) {
66
+ throw (0, oauth_error_util_1.oauthInvalidGrant)('Authorization code does not match client or redirect URI.');
67
+ }
68
+ const codeVerifier = input.codeVerifier?.trim() || record.codeVerifier?.trim();
69
+ if (!codeVerifier) {
70
+ throw (0, oauth_error_util_1.oauthInvalidGrant)('PKCE code_verifier is required.');
71
+ }
72
+ if (!this.verifyPkce(codeVerifier, record.codeChallenge, record.codeChallengeMethod)) {
73
+ throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid PKCE code verifier.');
74
+ }
75
+ return record;
76
+ }
77
+ async saveExternalState(state, record) {
78
+ const ttlMs = Math.max(1, record.expiresAt - Date.now());
79
+ await this.grants.saveState(state, record, ttlMs);
80
+ }
81
+ async consumeExternalState(state) {
82
+ const record = await this.grants.consumeState(state);
83
+ if (!record || record.expiresAt < Date.now()) {
84
+ throw (0, oauth_error_util_1.oauthInvalidGrant)('Invalid or expired OAuth state.');
85
+ }
86
+ return record;
87
+ }
88
+ async stagePkceVerifier(codeChallenge, codeVerifier) {
89
+ await this.grants.savePkceVerifier(codeChallenge, codeVerifier, this.authorizationCodeTtlMs);
90
+ }
91
+ async requireBrokerConfig(key) {
92
+ const catalog = this.resolveIdentityProviderCatalog();
93
+ const broker = catalog ? await catalog.getBrokerConfig(key) : null;
94
+ if (!broker) {
95
+ throw new common_1.ServiceUnavailableException({
96
+ statusCode: 503,
97
+ message: `Identity provider "${key}" is not enabled or is missing broker config ` +
98
+ '(clientId, clientSecret, authorizationUrl, tokenUrl). ' +
99
+ 'Configure it under Security → Identity Providers.',
100
+ error: 'IdentityProviderNotConfigured',
101
+ });
102
+ }
103
+ return broker;
104
+ }
105
+ resolveIdentityProviderCatalog() {
106
+ try {
107
+ return this.moduleRef.get(auth_identity_provider_source_1.AUTH_IDENTITY_PROVIDER_CATALOG, { strict: false });
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ assertSupportedAuthorizeRequest(request) {
114
+ if (request.responseType !== 'code') {
115
+ throw (0, oauth_error_util_1.oauthInvalidRequest)('Only response_type=code is supported.');
116
+ }
117
+ this.clients.assertClientId(request.clientId);
118
+ this.clients.assertRedirectUri(request.clientId, request.redirectUri);
119
+ this.clients.assertScopes(request.clientId, request.scope);
120
+ if (!request.redirectUri?.trim()) {
121
+ throw (0, oauth_error_util_1.oauthInvalidRequest)('redirect_uri is required.');
122
+ }
123
+ if (!request.issuer?.trim()) {
124
+ throw (0, oauth_error_util_1.oauthInvalidRequest)('issuer is required.');
125
+ }
126
+ if (!request.codeChallenge?.trim() || request.codeChallengeMethod !== 'S256') {
127
+ throw (0, oauth_error_util_1.oauthInvalidRequest)('PKCE S256 code_challenge is required.');
128
+ }
129
+ }
130
+ verifyPkce(codeVerifier, codeChallenge, method) {
131
+ if (method !== 'S256') {
132
+ return false;
133
+ }
134
+ const digest = (0, crypto_1.createHash)('sha256').update(codeVerifier).digest('base64url');
135
+ try {
136
+ return (0, crypto_1.timingSafeEqual)(Buffer.from(digest), Buffer.from(codeChallenge));
137
+ }
138
+ catch {
139
+ return false;
140
+ }
141
+ }
142
+ };
143
+ exports.OAuthOpService = OAuthOpService;
144
+ exports.OAuthOpService = OAuthOpService = tslib_1.__decorate([
145
+ (0, common_1.Injectable)(),
146
+ tslib_1.__metadata("design:paramtypes", [oauth_grant_store_interface_1.OAuthGrantStore,
147
+ oauth_rp_service_1.OAuthRpService,
148
+ oauth_client_registry_service_1.OAuthClientRegistryService,
149
+ core_1.ModuleRef])
150
+ ], OAuthOpService);
151
+ //#endregion
152
+ //# sourceMappingURL=oauth-op.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-op.service.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,73 @@
1
+ import type { VerifiedExternalOidcProfile } from './oauth-rp.types';
2
+ /**
3
+ * Internal record stored per issued authorization code.
4
+ * Must be safe for multi-instance deployments (no in-memory Map in final shape).
5
+ */
6
+ export interface OAuthCodeRecord {
7
+ codeChallenge: string;
8
+ codeChallengeMethod: string;
9
+ /** Server-side PKCE verifier (BFF); optional when SPA sends verifier at token exchange. */
10
+ codeVerifier?: string;
11
+ redirectUri: string;
12
+ clientId: string;
13
+ userId: string;
14
+ /**
15
+ * User/display data needed to mint tokens without re-calling the external IdP.
16
+ * (Kept intentionally because the legacy implementation stores it in the
17
+ * in-process authorization-code record.)
18
+ */
19
+ userName: string;
20
+ userTitle: string;
21
+ userEmail?: string;
22
+ userPicture?: string;
23
+ provider: string;
24
+ /**
25
+ * Token/ID-token replay protection context.
26
+ */
27
+ nonce?: string;
28
+ sessionId?: string;
29
+ /**
30
+ * Absolute expiration timestamp (epoch ms).
31
+ */
32
+ expiresAt: number;
33
+ }
34
+ /**
35
+ * State stored during browser redirect to an external IdP.
36
+ */
37
+ export interface OAuthExternalStateRecord {
38
+ codeChallenge: string;
39
+ codeChallengeMethod: string;
40
+ /** Server-side PKCE verifier when generated by `/connect/authorize/init`. */
41
+ codeVerifier?: string;
42
+ redirectUri: string;
43
+ clientId: string;
44
+ provider: string;
45
+ issuer: string;
46
+ nonce?: string;
47
+ expiresAt: number;
48
+ }
49
+ /**
50
+ * Registered OAuth/OIDC client definition.
51
+ * Seeded via tenant/application configuration in a later step.
52
+ */
53
+ export interface OAuthRegisteredClient {
54
+ clientId: string;
55
+ /**
56
+ * Whether the client is allowed to use PKCE public client flow only.
57
+ * Confidential/public determination is required by OAuth/OIDC metadata.
58
+ */
59
+ publicClient: boolean;
60
+ /** Required for confidential clients at the token endpoint (`client_secret`). */
61
+ clientSecret?: string;
62
+ redirectUris: string[];
63
+ postLogoutRedirectUris: string[];
64
+ allowedScopes: string[];
65
+ allowedGrantTypes: Array<'authorization_code' | 'refresh_token'>;
66
+ }
67
+ /**
68
+ * Normalized output from RP-side verified federation.
69
+ * This is kept as a separate alias so OP can consume RP output cleanly.
70
+ */
71
+ export interface VerifiedExternalProfileForLinking extends VerifiedExternalOidcProfile {
72
+ }
73
+ //# sourceMappingURL=oauth-op.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-op.types.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,2FAA2F;IAC3F,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf;;;;OAIG;IACH,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IAEf,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;CACnB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,YAAY,EAAE,OAAO,CAAC;IAEtB,iFAAiF;IACjF,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,sBAAsB,EAAE,MAAM,EAAE,CAAC;IACjC,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,iBAAiB,EAAE,KAAK,CAAC,oBAAoB,GAAG,eAAe,CAAC,CAAC;CAClE;AAED;;;GAGG;AACH,MAAM,WAAW,iCAAkC,SAAQ,2BAA2B;CAAG"}
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ //#region ---- OAuth OP (Authorization Server) types ----
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ //#endregion
5
+ //# sourceMappingURL=oauth-op.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-op.types.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-op.types.ts"],"names":[],"mappings":";AAAA,yDAAyD;;AAqFzD,YAAY"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolves the external IdP routing hint from authorize/init parameters.
3
+ *
4
+ * `identity_provider` is the canonical provider routing hint.
5
+ * `acr_values` is accepted only as a legacy alias when `identity_provider` is absent.
6
+ */
7
+ export declare function resolveOAuthProviderHint(input: Record<string, string | undefined>): string | undefined;
8
+ //# sourceMappingURL=oauth-provider-hint.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider-hint.util.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-provider-hint.util.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,wBAAgB,wBAAwB,CACtC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GACxC,MAAM,GAAG,SAAS,CAapB"}
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ //#region ---- OAuth provider hint resolution ----
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.resolveOAuthProviderHint = resolveOAuthProviderHint;
5
+ /**
6
+ * Resolves the external IdP routing hint from authorize/init parameters.
7
+ *
8
+ * `identity_provider` is the canonical provider routing hint.
9
+ * `acr_values` is accepted only as a legacy alias when `identity_provider` is absent.
10
+ */
11
+ function resolveOAuthProviderHint(input) {
12
+ const identityProvider = input['identity_provider']?.trim();
13
+ if (identityProvider) {
14
+ return identityProvider;
15
+ }
16
+ const legacyAcr = input['acr_values']?.trim();
17
+ if (legacyAcr) {
18
+ return legacyAcr;
19
+ }
20
+ const provider = input['provider']?.trim();
21
+ return provider || undefined;
22
+ }
23
+ //#endregion
24
+ //# sourceMappingURL=oauth-provider-hint.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-provider-hint.util.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-provider-hint.util.ts"],"names":[],"mappings":";AAAA,kDAAkD;;AAQlD,4DAeC;AArBD;;;;;GAKG;AACH,SAAgB,wBAAwB,CACtC,KAAyC;IAEzC,MAAM,gBAAgB,GAAG,KAAK,CAAC,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC;IAC5D,IAAI,gBAAgB,EAAE,CAAC;QACrB,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IAED,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,CAAC;IAC9C,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO,QAAQ,IAAI,SAAS,CAAC;AAC/B,CAAC;AAED,YAAY"}
@@ -0,0 +1,27 @@
1
+ type OidcAdapterPayload = Record<string, unknown> & {
2
+ consumed?: unknown;
3
+ };
4
+ /**
5
+ * Redis-backed oidc-provider adapter (multi-instance safe).
6
+ * Falls back to in-memory Map when Redis is unavailable (dev single instance).
7
+ */
8
+ export declare class OAuthRedisOidcAdapter {
9
+ private readonly redis;
10
+ private readonly localStore;
11
+ private readonly modelName;
12
+ constructor(name: string);
13
+ private key;
14
+ /** Secondary index: Session (and similar) `uid` → primary id. */
15
+ private uidKey;
16
+ private grantKey;
17
+ upsert(id: string, payload: OidcAdapterPayload, expiresIn: number): Promise<void>;
18
+ find(id: string): Promise<OidcAdapterPayload | undefined>;
19
+ findByUserCode(_userCode: string): Promise<OidcAdapterPayload | undefined>;
20
+ findByUid(uid: string): Promise<OidcAdapterPayload | undefined>;
21
+ private ensureRedis;
22
+ consume(id: string): Promise<void>;
23
+ destroy(id: string): Promise<void>;
24
+ revokeByGrantId(grantId: string): Promise<void>;
25
+ }
26
+ export {};
27
+ //# sourceMappingURL=oauth-redis-oidc-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-redis-oidc-adapter.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-redis-oidc-adapter.ts"],"names":[],"mappings":"AAIA,KAAK,kBAAkB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAyB3E;;;GAGG;AACH,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAe;IACrC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEvB,IAAI,EAAE,MAAM;IAcxB,OAAO,CAAC,GAAG;IAIX,iEAAiE;IACjE,OAAO,CAAC,MAAM;IAId,OAAO,CAAC,QAAQ;IAIV,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA2BjF,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAgBzD,cAAc,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;IAI1E,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,kBAAkB,GAAG,SAAS,CAAC;YAqBvD,WAAW;IASnB,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBlC,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAUlC,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;CAetD"}
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ //#region ---- oidc-provider Redis storage adapter ----
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.OAuthRedisOidcAdapter = void 0;
5
+ const tslib_1 = require("tslib");
6
+ const ioredis_1 = tslib_1.__importDefault(require("ioredis"));
7
+ function resolveOauthRedisConnection() {
8
+ const url = process.env['REDIS_URL']?.trim();
9
+ if (url) {
10
+ return { url };
11
+ }
12
+ const host = process.env['REDIS_HOST']?.trim();
13
+ const portRaw = Number(process.env['REDIS_PORT'] ?? 6379);
14
+ if (host) {
15
+ return { host, port: Number.isFinite(portRaw) ? portRaw : 6379 };
16
+ }
17
+ return null;
18
+ }
19
+ const GETDEL_SCRIPT = `
20
+ local v = redis.call('GET', KEYS[1])
21
+ if v then
22
+ redis.call('DEL', KEYS[1])
23
+ end
24
+ return v
25
+ `;
26
+ /**
27
+ * Redis-backed oidc-provider adapter (multi-instance safe).
28
+ * Falls back to in-memory Map when Redis is unavailable (dev single instance).
29
+ */
30
+ class OAuthRedisOidcAdapter {
31
+ constructor(name) {
32
+ this.localStore = new Map();
33
+ this.modelName = name;
34
+ const connection = resolveOauthRedisConnection();
35
+ if (!connection) {
36
+ this.redis = null;
37
+ return;
38
+ }
39
+ this.redis =
40
+ 'url' in connection
41
+ ? new ioredis_1.default(connection.url, { maxRetriesPerRequest: null, lazyConnect: true })
42
+ : new ioredis_1.default({ ...connection, maxRetriesPerRequest: null, lazyConnect: true });
43
+ }
44
+ key(id) {
45
+ return `axp:oidc:${this.modelName}:${id}`;
46
+ }
47
+ /** Secondary index: Session (and similar) `uid` → primary id. */
48
+ uidKey(uid) {
49
+ return `axp:oidc:${this.modelName}:uid:${uid}`;
50
+ }
51
+ grantKey(grantId) {
52
+ return `axp:oidc:grant:${grantId}:${this.modelName}`;
53
+ }
54
+ async upsert(id, payload, expiresIn) {
55
+ const key = this.key(id);
56
+ const value = JSON.stringify(payload);
57
+ const ttlMs = Math.max(1, expiresIn * 1000);
58
+ if (!this.redis) {
59
+ this.localStore.set(key, value);
60
+ if (typeof payload['uid'] === 'string' && payload['uid'].trim()) {
61
+ this.localStore.set(this.uidKey(payload['uid'].trim()), id);
62
+ }
63
+ return;
64
+ }
65
+ await this.ensureRedis();
66
+ await this.redis.set(key, value, 'PX', ttlMs);
67
+ if (typeof payload['uid'] === 'string' && payload['uid'].trim()) {
68
+ await this.redis.set(this.uidKey(payload['uid'].trim()), id, 'PX', ttlMs);
69
+ }
70
+ const grantId = typeof payload['grantId'] === 'string' ? payload['grantId'] : null;
71
+ if (grantId) {
72
+ await this.redis.sadd(this.grantKey(grantId), key);
73
+ await this.redis.pexpire(this.grantKey(grantId), ttlMs);
74
+ }
75
+ }
76
+ async find(id) {
77
+ const key = this.key(id);
78
+ if (this.redis) {
79
+ await this.ensureRedis();
80
+ }
81
+ const raw = this.redis
82
+ ? (await this.redis.get(key))
83
+ : (this.localStore.get(key) ?? null);
84
+ if (!raw) {
85
+ return undefined;
86
+ }
87
+ return JSON.parse(raw);
88
+ }
89
+ async findByUserCode(_userCode) {
90
+ return undefined;
91
+ }
92
+ async findByUid(uid) {
93
+ const normalized = uid.trim();
94
+ if (!normalized) {
95
+ return undefined;
96
+ }
97
+ const indexKey = this.uidKey(normalized);
98
+ if (this.redis) {
99
+ await this.ensureRedis();
100
+ }
101
+ const id = this.redis
102
+ ? (await this.redis.get(indexKey))
103
+ : (this.localStore.get(indexKey) ?? null);
104
+ if (!id) {
105
+ return undefined;
106
+ }
107
+ return this.find(id);
108
+ }
109
+ async ensureRedis() {
110
+ if (!this.redis) {
111
+ return;
112
+ }
113
+ if (this.redis.status === 'wait') {
114
+ await this.redis.connect();
115
+ }
116
+ }
117
+ async consume(id) {
118
+ const record = await this.find(id);
119
+ if (!record) {
120
+ return;
121
+ }
122
+ record.consumed = Math.floor(Date.now() / 1000);
123
+ const key = this.key(id);
124
+ const value = JSON.stringify(record);
125
+ if (!this.redis) {
126
+ this.localStore.set(key, value);
127
+ return;
128
+ }
129
+ const ttl = await this.redis.pttl(key);
130
+ if (ttl > 0) {
131
+ await this.redis.set(key, value, 'PX', ttl);
132
+ }
133
+ }
134
+ async destroy(id) {
135
+ const key = this.key(id);
136
+ if (!this.redis) {
137
+ this.localStore.delete(key);
138
+ return;
139
+ }
140
+ await this.redis.del(key);
141
+ }
142
+ async revokeByGrantId(grantId) {
143
+ if (!this.redis) {
144
+ for (const [key] of this.localStore) {
145
+ if (key.includes(grantId)) {
146
+ this.localStore.delete(key);
147
+ }
148
+ }
149
+ return;
150
+ }
151
+ const keys = await this.redis.smembers(this.grantKey(grantId));
152
+ if (keys.length > 0) {
153
+ await this.redis.del(...keys, this.grantKey(grantId));
154
+ }
155
+ }
156
+ }
157
+ exports.OAuthRedisOidcAdapter = OAuthRedisOidcAdapter;
158
+ //#endregion
159
+ //# sourceMappingURL=oauth-redis-oidc-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-redis-oidc-adapter.js","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-redis-oidc-adapter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,53 @@
1
+ import type { AuthIdentityProviderBrokerConfig } from '../auth/auth-identity-provider.source';
2
+ import type { VerifiedExternalOidcProfile } from './oauth-rp.types';
3
+ export declare class OAuthRpService {
4
+ private readonly logger;
5
+ private readonly jwksCache;
6
+ private readonly jwksTtlMs;
7
+ /**
8
+ * Builds external IdP authorization URL.
9
+ * This service is RP-only: no session/token issuance.
10
+ */
11
+ buildAuthorizationUrl(broker: AuthIdentityProviderBrokerConfig, callbackUrl: string, state: string, nonce?: string): string;
12
+ /**
13
+ * Exchanges external authorization code for token response.
14
+ * Returns raw id_token (if present) and access_token (for UserInfo fallback).
15
+ */
16
+ exchangeCode(broker: AuthIdentityProviderBrokerConfig, code: string, callbackUrl: string): Promise<{
17
+ idToken?: string;
18
+ accessToken: string;
19
+ }>;
20
+ /**
21
+ * Verifies external id_token using external JWKS (fetched from issuer).
22
+ * Validates audience + nonce (when expectedNonce is provided) and returns normalized profile.
23
+ * When JWKS is unreachable for Google (common corporate/geo blocks on
24
+ * `www.googleapis.com/.../certs`), falls back to Google `tokeninfo` over
25
+ * `oauth2.googleapis.com` which still cryptographically validates the JWT.
26
+ */
27
+ verifyAndNormalizeIdToken(rawJwt: string, _broker: AuthIdentityProviderBrokerConfig, expectedNonce?: string, expectedAudience?: string): Promise<VerifiedExternalOidcProfile>;
28
+ private verifyIdTokenWithJwks;
29
+ /**
30
+ * Google tokeninfo validates the ID Token when local JWKS download is blocked
31
+ * (e.g. 403 on www.googleapis.com/oauth2/v3/certs).
32
+ * Prefer POST body so long JWTs are not truncated in the query string.
33
+ */
34
+ private verifyGoogleIdTokenViaTokenInfo;
35
+ private assertNonce;
36
+ fetchUserInfo(accessToken: string, userInfoUrl: string): Promise<Partial<VerifiedExternalOidcProfile>>;
37
+ /**
38
+ * Resolves the OIDC issuer to compare against ID Token `iss`.
39
+ * Prefer configured `issuerUrl` — token endpoint origin is often wrong
40
+ * (Google: token at oauth2.googleapis.com, iss = accounts.google.com).
41
+ */
42
+ private resolveExpectedIssuer;
43
+ /**
44
+ * Google historically issues both `https://accounts.google.com` and `accounts.google.com`.
45
+ */
46
+ private issuersMatch;
47
+ private normalizeIssuerUrl;
48
+ private isGoogleIssuer;
49
+ private fetchJwksWithRotation;
50
+ private fetchJwks;
51
+ private fetchJwksFromUrl;
52
+ }
53
+ //# sourceMappingURL=oauth-rp.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"oauth-rp.service.d.ts","sourceRoot":"","sources":["../../../../../../../../libs/framework/server/security/src/lib/oauth/oauth-rp.service.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AA4BpE,qBACa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkE;IAE5F;;;OAGG;IACH,qBAAqB,CACnB,MAAM,EAAE,gCAAgC,EACxC,WAAW,EAAE,MAAM,EACnB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE,MAAM,GACb,MAAM;IAkBT;;;OAGG;IACG,YAAY,CAChB,MAAM,EAAE,gCAAgC,EACxC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC;IAkCrD;;;;;;OAMG;IACG,yBAAyB,CAC7B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,gCAAgC,EACzC,aAAa,CAAC,EAAE,MAAM,EACtB,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,2BAA2B,CAAC;YAoEzB,qBAAqB;IAoDnC;;;;OAIG;YACW,+BAA+B;IA+E7C,OAAO,CAAC,WAAW;IASb,aAAa,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,2BAA2B,CAAC,CAAC;IAuB5G;;;;OAIG;YACW,qBAAqB;IAwCnC;;OAEG;IACH,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,kBAAkB;IAW1B,OAAO,CAAC,cAAc;YAIR,qBAAqB;YA+BrB,SAAS;YA6BT,gBAAgB;CA0B/B"}