@caltra/server 0.1.0 → 0.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/README.md +16 -0
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +3 -0
- package/dist/client.js.map +1 -1
- package/dist/client_authorizations.d.ts +12 -0
- package/dist/client_authorizations.d.ts.map +1 -0
- package/dist/client_authorizations.js +42 -0
- package/dist/client_authorizations.js.map +1 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +13 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -13,6 +13,22 @@ const workspace = await caltra.workspaces.get({
|
|
|
13
13
|
});
|
|
14
14
|
```
|
|
15
15
|
|
|
16
|
+
Create an origin-bound client authorization for an authenticated product user without exposing the
|
|
17
|
+
Caltra API key or client token to browser code:
|
|
18
|
+
|
|
19
|
+
```ts
|
|
20
|
+
const authorization = await caltra.clientAuthorizations.create({
|
|
21
|
+
origin: config.customerWebOrigin,
|
|
22
|
+
tenantUser: { externalId: user.id },
|
|
23
|
+
workspace: {
|
|
24
|
+
externalId: organization.id,
|
|
25
|
+
createIfMissing: { name: organization.name },
|
|
26
|
+
},
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
return { authorization_code: authorization.authorizationCode };
|
|
30
|
+
```
|
|
31
|
+
|
|
16
32
|
Without `createIfMissing`, `workspaces.get()` returns `null` when the external ID is unknown. With
|
|
17
33
|
`createIfMissing`, concurrent calls converge on the same workspace for the API key's Caltra
|
|
18
34
|
organization.
|
package/dist/client.d.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { CaltraServerClientOptions } from "./types.js";
|
|
2
|
+
import { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
|
|
2
3
|
import { CaltraWorkspacesClient } from "./workspaces.js";
|
|
3
4
|
/** Provides authenticated, server-only access to Caltra resources without exposing the API key. */
|
|
4
5
|
export declare class CaltraServerClient {
|
|
6
|
+
readonly clientAuthorizations: CaltraClientAuthorizationsClient;
|
|
5
7
|
readonly workspaces: CaltraWorkspacesClient;
|
|
6
8
|
constructor(options: CaltraServerClientOptions);
|
|
7
9
|
}
|
package/dist/client.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;gBAEhC,OAAO,EAAE,yBAAyB;
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,qBAAa,kBAAkB;IAC7B,QAAQ,CAAC,oBAAoB,EAAE,gCAAgC,CAAC;IAChE,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;gBAEhC,OAAO,EAAE,yBAAyB;CAW/C"}
|
package/dist/client.js
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
+
import { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
|
|
1
2
|
import { CaltraWorkspacesClient } from "./workspaces.js";
|
|
2
3
|
/** Provides authenticated, server-only access to Caltra resources without exposing the API key. */
|
|
3
4
|
export class CaltraServerClient {
|
|
5
|
+
clientAuthorizations;
|
|
4
6
|
workspaces;
|
|
5
7
|
constructor(options) {
|
|
6
8
|
const apiUrl = (options.apiUrl ?? "https://api.caltra.dev").replace(/\/+$/, "");
|
|
7
9
|
const fetchImplementation = options.fetch ?? globalThis.fetch.bind(globalThis);
|
|
8
10
|
this.workspaces = new CaltraWorkspacesClient(options.apiKey, apiUrl, fetchImplementation);
|
|
11
|
+
this.clientAuthorizations = new CaltraClientAuthorizationsClient(options.apiKey, apiUrl, fetchImplementation, this.workspaces);
|
|
9
12
|
}
|
|
10
13
|
}
|
|
11
14
|
//# sourceMappingURL=client.js.map
|
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAyB;IAE5C,YAAY,OAAkC;QAC5C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAEzD,mGAAmG;AACnG,MAAM,OAAO,kBAAkB;IACpB,oBAAoB,CAAmC;IACvD,UAAU,CAAyB;IAE5C,YAAY,OAAkC;QAC5C,MAAM,MAAM,GAAG,CAAC,OAAO,CAAC,MAAM,IAAI,wBAAwB,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAChF,MAAM,mBAAmB,GAAG,OAAO,CAAC,KAAK,IAAI,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC/E,IAAI,CAAC,UAAU,GAAG,IAAI,sBAAsB,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,mBAAmB,CAAC,CAAC;QAC1F,IAAI,CAAC,oBAAoB,GAAG,IAAI,gCAAgC,CAC9D,OAAO,CAAC,MAAM,EACd,MAAM,EACN,mBAAmB,EACnB,IAAI,CAAC,UAAU,CAChB,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { CaltraClientAuthorization, CaltraClientAuthorizationCreate } from "./types.js";
|
|
2
|
+
import type { CaltraWorkspacesClient } from "./workspaces.js";
|
|
3
|
+
/** Creates origin-bound browser authorizations without exposing Caltra credentials to the browser. */
|
|
4
|
+
export declare class CaltraClientAuthorizationsClient {
|
|
5
|
+
private readonly apiKey;
|
|
6
|
+
private readonly apiUrl;
|
|
7
|
+
private readonly fetchImplementation;
|
|
8
|
+
private readonly workspaces;
|
|
9
|
+
constructor(apiKey: string, apiUrl: string, fetchImplementation: typeof fetch, workspaces: CaltraWorkspacesClient);
|
|
10
|
+
create(input: CaltraClientAuthorizationCreate): Promise<CaltraClientAuthorization>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=client_authorizations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client_authorizations.d.ts","sourceRoot":"","sources":["../src/client_authorizations.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,yBAAyB,EACzB,+BAA+B,EAChC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAO9D,sGAAsG;AACtG,qBAAa,gCAAgC;IAEzC,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU;gBAHV,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EACd,mBAAmB,EAAE,OAAO,KAAK,EACjC,UAAU,EAAE,sBAAsB;IAG/C,MAAM,CAAC,KAAK,EAAE,+BAA+B,GAAG,OAAO,CAAC,yBAAyB,CAAC;CAwBzF"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { CaltraServerError } from "./error.js";
|
|
3
|
+
const ClientAuthorizationSchema = z.object({
|
|
4
|
+
authorization_code: z.string().min(1),
|
|
5
|
+
expires_at: z.iso.datetime(),
|
|
6
|
+
}).strict();
|
|
7
|
+
/** Creates origin-bound browser authorizations without exposing Caltra credentials to the browser. */
|
|
8
|
+
export class CaltraClientAuthorizationsClient {
|
|
9
|
+
apiKey;
|
|
10
|
+
apiUrl;
|
|
11
|
+
fetchImplementation;
|
|
12
|
+
workspaces;
|
|
13
|
+
constructor(apiKey, apiUrl, fetchImplementation, workspaces) {
|
|
14
|
+
this.apiKey = apiKey;
|
|
15
|
+
this.apiUrl = apiUrl;
|
|
16
|
+
this.fetchImplementation = fetchImplementation;
|
|
17
|
+
this.workspaces = workspaces;
|
|
18
|
+
}
|
|
19
|
+
async create(input) {
|
|
20
|
+
const workspace = await this.workspaces.get(input.workspace);
|
|
21
|
+
const headers = new Headers({ "content-type": "application/json" });
|
|
22
|
+
headers.set("authorization", `Bearer ${this.apiKey}`);
|
|
23
|
+
const response = await this.fetchImplementation(`${this.apiUrl}/server/v1/workspaces/${encodeURIComponent(workspace.id)}/client-authorizations`, {
|
|
24
|
+
body: JSON.stringify({
|
|
25
|
+
...(input.agentIds ? { agent_ids: input.agentIds } : {}),
|
|
26
|
+
origin: input.origin,
|
|
27
|
+
tenant_user: { external_id: input.tenantUser.externalId },
|
|
28
|
+
}),
|
|
29
|
+
headers,
|
|
30
|
+
method: "POST",
|
|
31
|
+
});
|
|
32
|
+
if (!response.ok)
|
|
33
|
+
throw await CaltraServerError.fromResponse(response);
|
|
34
|
+
const authorization = ClientAuthorizationSchema.parse(await response.json());
|
|
35
|
+
return {
|
|
36
|
+
authorizationCode: authorization.authorization_code,
|
|
37
|
+
expiresAt: new Date(authorization.expires_at),
|
|
38
|
+
workspace,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=client_authorizations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client_authorizations.js","sourceRoot":"","sources":["../src/client_authorizations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAO/C,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,kBAAkB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,UAAU,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC,MAAM,EAAE,CAAC;AAEZ,sGAAsG;AACtG,MAAM,OAAO,gCAAgC;IAExB;IACA;IACA;IACA;IAJnB,YACmB,MAAc,EACd,MAAc,EACd,mBAAiC,EACjC,UAAkC;QAHlC,WAAM,GAAN,MAAM,CAAQ;QACd,WAAM,GAAN,MAAM,CAAQ;QACd,wBAAmB,GAAnB,mBAAmB,CAAc;QACjC,eAAU,GAAV,UAAU,CAAwB;IAClD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,KAAsC;QACjD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC7D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;QACpE,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAC7C,GAAG,IAAI,CAAC,MAAM,yBAAyB,kBAAkB,CAAC,SAAS,CAAC,EAAE,CAAC,wBAAwB,EAC/F;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxD,MAAM,EAAE,KAAK,CAAC,MAAM;gBACpB,WAAW,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,UAAU,CAAC,UAAU,EAAE;aAC1D,CAAC;YACF,OAAO;YACP,MAAM,EAAE,MAAM;SACf,CACF,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,MAAM,iBAAiB,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QACvE,MAAM,aAAa,GAAG,yBAAyB,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7E,OAAO;YACL,iBAAiB,EAAE,aAAa,CAAC,kBAAkB;YACnD,SAAS,EAAE,IAAI,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC;YAC7C,SAAS;SACV,CAAC;IACJ,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export { CaltraServerClient } from "./client.js";
|
|
2
|
+
export { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
|
|
2
3
|
export { CaltraServerError } from "./error.js";
|
|
3
4
|
export { CaltraWorkspacesClient } from "./workspaces.js";
|
|
4
|
-
export type { CaltraServerClientOptions, CaltraServerProblem, CaltraServerWorkspace, CaltraWorkspaceCreateIfMissing, CaltraWorkspaceLookup, } from "./types.js";
|
|
5
|
+
export type { CaltraClientAuthorization, CaltraClientAuthorizationCreate, CaltraServerClientOptions, CaltraServerProblem, CaltraServerWorkspace, CaltraWorkspaceCreateIfMissing, CaltraWorkspaceLookup, } from "./types.js";
|
|
5
6
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AACzD,YAAY,EACV,yBAAyB,EACzB,+BAA+B,EAC/B,yBAAyB,EACzB,mBAAmB,EACnB,qBAAqB,EACrB,8BAA8B,EAC9B,qBAAqB,GACtB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { CaltraServerClient } from "./client.js";
|
|
2
|
+
export { CaltraClientAuthorizationsClient } from "./client_authorizations.js";
|
|
2
3
|
export { CaltraServerError } from "./error.js";
|
|
3
4
|
export { CaltraWorkspacesClient } from "./workspaces.js";
|
|
4
5
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,gCAAgC,EAAE,MAAM,4BAA4B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -8,6 +8,19 @@ export interface CaltraServerWorkspace {
|
|
|
8
8
|
id: string;
|
|
9
9
|
name: string;
|
|
10
10
|
}
|
|
11
|
+
export interface CaltraClientAuthorizationCreate {
|
|
12
|
+
agentIds?: string[];
|
|
13
|
+
origin: string;
|
|
14
|
+
tenantUser: {
|
|
15
|
+
externalId: string;
|
|
16
|
+
};
|
|
17
|
+
workspace: CaltraWorkspaceCreateIfMissing;
|
|
18
|
+
}
|
|
19
|
+
export interface CaltraClientAuthorization {
|
|
20
|
+
authorizationCode: string;
|
|
21
|
+
expiresAt: Date;
|
|
22
|
+
workspace: CaltraServerWorkspace;
|
|
23
|
+
}
|
|
11
24
|
export interface CaltraServerProblem {
|
|
12
25
|
code: string;
|
|
13
26
|
detail: string;
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,+BAA+B;IAC9C,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE;QAAE,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IACnC,SAAS,EAAE,8BAA8B,CAAC;CAC3C;AAED,MAAM,WAAW,yBAAyB;IACxC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,qBAAqB,CAAC;CAClC;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,OAAO,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,qBAAqB;IACpC,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,8BAA+B,SAAQ,qBAAqB;IAC3E,eAAe,EAAE;QAAE,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;CACnC"}
|