@mcp-abap-adt/interfaces 0.2.15 → 2.2.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.
- package/CHANGELOG.md +6 -0
- package/README.md +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/token/AuthType.d.ts +6 -1
- package/dist/token/AuthType.d.ts.map +1 -1
- package/dist/token/AuthType.js +6 -1
- package/dist/token/ITokenResult.d.ts +10 -0
- package/dist/token/ITokenResult.d.ts.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -7,6 +7,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
7
7
|
|
|
8
8
|
## [Unreleased]
|
|
9
9
|
|
|
10
|
+
## [2.2.0] - 2026-02-10
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
- `ITokenResult` now supports `expiresAt` and `tokenType` to handle non-JWT tokens.
|
|
14
|
+
- Added `AUTH_TYPE_SAML2_BEARER` to `OAuth2GrantType` for SAML 2.0 bearer exchanges.
|
|
15
|
+
|
|
10
16
|
## [0.2.15] - 2025-12-29
|
|
11
17
|
|
|
12
18
|
### Changed
|
package/README.md
CHANGED
|
@@ -165,6 +165,7 @@ This package is responsible for:
|
|
|
165
165
|
### Token Domain (`token/`)
|
|
166
166
|
- `ITokenProvider` - Token provider interface (stateful token lifecycle)
|
|
167
167
|
- `ITokenProviderOptions` - Options for token providers
|
|
168
|
+
- `ITokenResult` - Token result payload (supports `expiresAt` and `tokenType` for non-JWT tokens)
|
|
168
169
|
- `ITokenRefresher` - Token refresher interface for DI into connections
|
|
169
170
|
- Created by `AuthBroker.createTokenRefresher(destination)`
|
|
170
171
|
- Injected into `JwtAbapConnection` to enable automatic token refresh
|
package/dist/index.d.ts
CHANGED
|
@@ -27,7 +27,7 @@ export type { ISessionStorage } from './storage/ISessionStorage';
|
|
|
27
27
|
export type { StoreErrorCode } from './store/StoreErrorCodes';
|
|
28
28
|
export { STORE_ERROR_CODES } from './store/StoreErrorCodes';
|
|
29
29
|
export type { OAuth2GrantType } from './token/AuthType';
|
|
30
|
-
export { AUTH_TYPE_AUTHORIZATION_CODE, AUTH_TYPE_AUTHORIZATION_CODE_PKCE, AUTH_TYPE_CLIENT_CREDENTIALS, AUTH_TYPE_CLIENT_X509, AUTH_TYPE_PASSWORD, AUTH_TYPE_USER_TOKEN, } from './token/AuthType';
|
|
30
|
+
export { AUTH_TYPE_AUTHORIZATION_CODE, AUTH_TYPE_AUTHORIZATION_CODE_PKCE, AUTH_TYPE_CLIENT_CREDENTIALS, AUTH_TYPE_CLIENT_X509, AUTH_TYPE_PASSWORD, AUTH_TYPE_SAML2_BEARER, AUTH_TYPE_USER_TOKEN, } from './token/AuthType';
|
|
31
31
|
export type { ITokenProvider } from './token/ITokenProvider';
|
|
32
32
|
export type { ITokenProviderOptions } from './token/ITokenProviderOptions';
|
|
33
33
|
export type { ITokenRefresher } from './token/ITokenRefresher';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhE,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,YAAY,EACV,eAAe,EACf,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,cAAc,EACd,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,cAAc,WAAW,CAAC;AAE1B,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,YAAY,EAAE,UAAU,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAEhE,YAAY,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AACxE,YAAY,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AAC9C,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAElE,YAAY,EACV,eAAe,EACf,YAAY,GACb,MAAM,8BAA8B,CAAC;AACtC,YAAY,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAC5E,YAAY,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EACL,cAAc,EACd,mBAAmB,GACpB,MAAM,4BAA4B,CAAC;AAEpC,cAAc,WAAW,CAAC;AAE1B,YAAY,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,YAAY,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,YAAY,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAErD,YAAY,EAAE,gBAAgB,EAAE,MAAM,+BAA+B,CAAC;AAEtE,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAC7D,YAAY,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAE7D,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,YAAY,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EACL,4BAA4B,EAC5B,iCAAiC,EACjC,4BAA4B,EAC5B,qBAAqB,EACrB,kBAAkB,EAClB,sBAAsB,EACtB,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAE1B,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAC7D,YAAY,EAAE,qBAAqB,EAAE,MAAM,+BAA+B,CAAC;AAC3E,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,YAAY,EAAE,sBAAsB,EAAE,MAAM,iCAAiC,CAAC;AAC9E,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,YAAY,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAE7D,YAAY,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AACvE,YAAY,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,YAAY,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAC9E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mCAAmC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -20,7 +20,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
20
20
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
21
21
|
};
|
|
22
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
|
-
exports.AuthMethodPriority = exports.TOKEN_PROVIDER_ERROR_CODES = exports.AUTH_TYPE_USER_TOKEN = exports.AUTH_TYPE_PASSWORD = exports.AUTH_TYPE_CLIENT_X509 = exports.AUTH_TYPE_CLIENT_CREDENTIALS = exports.AUTH_TYPE_AUTHORIZATION_CODE_PKCE = exports.AUTH_TYPE_AUTHORIZATION_CODE = exports.STORE_ERROR_CODES = exports.LogLevel = exports.NETWORK_ERROR_CODES = exports.isNetworkError = exports.AdtObjectErrorCodes = void 0;
|
|
23
|
+
exports.AuthMethodPriority = exports.TOKEN_PROVIDER_ERROR_CODES = exports.AUTH_TYPE_USER_TOKEN = exports.AUTH_TYPE_SAML2_BEARER = exports.AUTH_TYPE_PASSWORD = exports.AUTH_TYPE_CLIENT_X509 = exports.AUTH_TYPE_CLIENT_CREDENTIALS = exports.AUTH_TYPE_AUTHORIZATION_CODE_PKCE = exports.AUTH_TYPE_AUTHORIZATION_CODE = exports.STORE_ERROR_CODES = exports.LogLevel = exports.NETWORK_ERROR_CODES = exports.isNetworkError = exports.AdtObjectErrorCodes = void 0;
|
|
24
24
|
var IAdtObject_1 = require("./adt/IAdtObject");
|
|
25
25
|
Object.defineProperty(exports, "AdtObjectErrorCodes", { enumerable: true, get: function () { return IAdtObject_1.AdtObjectErrorCodes; } });
|
|
26
26
|
var NetworkErrors_1 = require("./connection/NetworkErrors");
|
|
@@ -39,6 +39,7 @@ Object.defineProperty(exports, "AUTH_TYPE_AUTHORIZATION_CODE_PKCE", { enumerable
|
|
|
39
39
|
Object.defineProperty(exports, "AUTH_TYPE_CLIENT_CREDENTIALS", { enumerable: true, get: function () { return AuthType_1.AUTH_TYPE_CLIENT_CREDENTIALS; } });
|
|
40
40
|
Object.defineProperty(exports, "AUTH_TYPE_CLIENT_X509", { enumerable: true, get: function () { return AuthType_1.AUTH_TYPE_CLIENT_X509; } });
|
|
41
41
|
Object.defineProperty(exports, "AUTH_TYPE_PASSWORD", { enumerable: true, get: function () { return AuthType_1.AUTH_TYPE_PASSWORD; } });
|
|
42
|
+
Object.defineProperty(exports, "AUTH_TYPE_SAML2_BEARER", { enumerable: true, get: function () { return AuthType_1.AUTH_TYPE_SAML2_BEARER; } });
|
|
42
43
|
Object.defineProperty(exports, "AUTH_TYPE_USER_TOKEN", { enumerable: true, get: function () { return AuthType_1.AUTH_TYPE_USER_TOKEN; } });
|
|
43
44
|
var TokenProviderErrorCodes_1 = require("./token/TokenProviderErrorCodes");
|
|
44
45
|
Object.defineProperty(exports, "TOKEN_PROVIDER_ERROR_CODES", { enumerable: true, get: function () { return TokenProviderErrorCodes_1.TOKEN_PROVIDER_ERROR_CODES; } });
|
package/dist/token/AuthType.d.ts
CHANGED
|
@@ -31,8 +31,13 @@ export declare const AUTH_TYPE_USER_TOKEN: "user_token";
|
|
|
31
31
|
* Client X509 (mTLS) authentication
|
|
32
32
|
*/
|
|
33
33
|
export declare const AUTH_TYPE_CLIENT_X509: "client_x509";
|
|
34
|
+
/**
|
|
35
|
+
* SAML 2.0 Bearer Assertion grant type
|
|
36
|
+
* Used to exchange SAML assertions for OAuth2 access tokens
|
|
37
|
+
*/
|
|
38
|
+
export declare const AUTH_TYPE_SAML2_BEARER: "saml2_bearer";
|
|
34
39
|
/**
|
|
35
40
|
* Union type for all OAuth2 grant types
|
|
36
41
|
*/
|
|
37
|
-
export type OAuth2GrantType = typeof AUTH_TYPE_AUTHORIZATION_CODE | typeof AUTH_TYPE_AUTHORIZATION_CODE_PKCE | typeof AUTH_TYPE_PASSWORD | typeof AUTH_TYPE_CLIENT_CREDENTIALS | typeof AUTH_TYPE_USER_TOKEN | typeof AUTH_TYPE_CLIENT_X509;
|
|
42
|
+
export type OAuth2GrantType = typeof AUTH_TYPE_AUTHORIZATION_CODE | typeof AUTH_TYPE_AUTHORIZATION_CODE_PKCE | typeof AUTH_TYPE_PASSWORD | typeof AUTH_TYPE_CLIENT_CREDENTIALS | typeof AUTH_TYPE_USER_TOKEN | typeof AUTH_TYPE_CLIENT_X509 | typeof AUTH_TYPE_SAML2_BEARER;
|
|
38
43
|
//# sourceMappingURL=AuthType.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthType.d.ts","sourceRoot":"","sources":["../../src/token/AuthType.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,iCAAiC,EAC5C,yBAAkC,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAG,UAAmB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAG,YAAqB,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAG,aAAsB,CAAC;AAE5D;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,OAAO,4BAA4B,GACnC,OAAO,iCAAiC,GACxC,OAAO,kBAAkB,GACzB,OAAO,4BAA4B,GACnC,OAAO,oBAAoB,GAC3B,OAAO,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"AuthType.d.ts","sourceRoot":"","sources":["../../src/token/AuthType.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,iCAAiC,EAC5C,yBAAkC,CAAC;AAErC;;;GAGG;AACH,eAAO,MAAM,kBAAkB,EAAG,UAAmB,CAAC;AAEtD;;;GAGG;AACH,eAAO,MAAM,4BAA4B,EAAG,oBAA6B,CAAC;AAE1E;;GAEG;AACH,eAAO,MAAM,oBAAoB,EAAG,YAAqB,CAAC;AAE1D;;GAEG;AACH,eAAO,MAAM,qBAAqB,EAAG,aAAsB,CAAC;AAE5D;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAAG,cAAuB,CAAC;AAE9D;;GAEG;AACH,MAAM,MAAM,eAAe,GACvB,OAAO,4BAA4B,GACnC,OAAO,iCAAiC,GACxC,OAAO,kBAAkB,GACzB,OAAO,4BAA4B,GACnC,OAAO,oBAAoB,GAC3B,OAAO,qBAAqB,GAC5B,OAAO,sBAAsB,CAAC"}
|
package/dist/token/AuthType.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* Constants for different OAuth2 authentication flows (grant types)
|
|
6
6
|
*/
|
|
7
7
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
-
exports.AUTH_TYPE_CLIENT_X509 = exports.AUTH_TYPE_USER_TOKEN = exports.AUTH_TYPE_CLIENT_CREDENTIALS = exports.AUTH_TYPE_PASSWORD = exports.AUTH_TYPE_AUTHORIZATION_CODE_PKCE = exports.AUTH_TYPE_AUTHORIZATION_CODE = void 0;
|
|
8
|
+
exports.AUTH_TYPE_SAML2_BEARER = exports.AUTH_TYPE_CLIENT_X509 = exports.AUTH_TYPE_USER_TOKEN = exports.AUTH_TYPE_CLIENT_CREDENTIALS = exports.AUTH_TYPE_PASSWORD = exports.AUTH_TYPE_AUTHORIZATION_CODE_PKCE = exports.AUTH_TYPE_AUTHORIZATION_CODE = void 0;
|
|
9
9
|
/**
|
|
10
10
|
* Authorization Code grant type
|
|
11
11
|
* Standard OAuth2 flow with browser-based authorization
|
|
@@ -34,3 +34,8 @@ exports.AUTH_TYPE_USER_TOKEN = 'user_token';
|
|
|
34
34
|
* Client X509 (mTLS) authentication
|
|
35
35
|
*/
|
|
36
36
|
exports.AUTH_TYPE_CLIENT_X509 = 'client_x509';
|
|
37
|
+
/**
|
|
38
|
+
* SAML 2.0 Bearer Assertion grant type
|
|
39
|
+
* Used to exchange SAML assertions for OAuth2 access tokens
|
|
40
|
+
*/
|
|
41
|
+
exports.AUTH_TYPE_SAML2_BEARER = 'saml2_bearer';
|
|
@@ -22,5 +22,15 @@ export interface ITokenResult {
|
|
|
22
22
|
* If not provided, token expiration is determined from JWT exp claim
|
|
23
23
|
*/
|
|
24
24
|
expiresIn?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Token expiration time as absolute timestamp (milliseconds since epoch)
|
|
27
|
+
* Useful for non-JWT tokens (e.g. SAML assertions).
|
|
28
|
+
*/
|
|
29
|
+
expiresAt?: number;
|
|
30
|
+
/**
|
|
31
|
+
* Token format/type (helps consumers decide how to validate or parse).
|
|
32
|
+
* If omitted, defaults to JWT assumptions.
|
|
33
|
+
*/
|
|
34
|
+
tokenType?: 'jwt' | 'saml' | 'opaque';
|
|
25
35
|
}
|
|
26
36
|
//# sourceMappingURL=ITokenResult.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ITokenResult.d.ts","sourceRoot":"","sources":["../../src/token/ITokenResult.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"ITokenResult.d.ts","sourceRoot":"","sources":["../../src/token/ITokenResult.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAElD,MAAM,WAAW,YAAY;IAC3B;;OAEG;IACH,kBAAkB,EAAE,MAAM,CAAC;IAE3B;;OAEG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IAEtB;;OAEG;IACH,QAAQ,EAAE,eAAe,CAAC;IAE1B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,SAAS,CAAC,EAAE,KAAK,GAAG,MAAM,GAAG,QAAQ,CAAC;CACvC"}
|