@every-app/sdk 0.3.0-rc.9 → 0.3.1
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 +79 -74
- package/dist/cloudflare/catalogSettings.generated.d.ts +19 -6
- package/dist/cloudflare/catalogSettings.generated.d.ts.map +1 -1
- package/dist/cloudflare/catalogSettings.generated.js +43 -14
- package/dist/cloudflare/index.d.ts +1 -1
- package/dist/cloudflare/index.d.ts.map +1 -1
- package/dist/cloudflare/worker.d.ts +63 -9
- package/dist/cloudflare/worker.d.ts.map +1 -1
- package/dist/cloudflare/worker.js +45 -9
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/internal/aiDefault.d.ts +36 -79
- package/dist/internal/aiDefault.d.ts.map +1 -1
- package/dist/internal/aiDefault.js +47 -149
- package/dist/internal/aiProviders.d.ts +1 -1
- package/dist/internal/aiProviders.d.ts.map +1 -1
- package/dist/internal/aiProviders.js +2 -2
- package/dist/internal/appSettings.d.ts +140 -89
- package/dist/internal/appSettings.d.ts.map +1 -1
- package/dist/internal/appSettings.js +264 -156
- package/dist/internal/capabilities.d.ts +109 -503
- package/dist/internal/capabilities.d.ts.map +1 -1
- package/dist/internal/capabilities.js +30 -550
- package/dist/internal/catalog/commerce.js +1 -1
- package/dist/internal/catalog/index.d.ts +35 -0
- package/dist/internal/catalog/index.d.ts.map +1 -1
- package/dist/internal/catalog/infra.d.ts +35 -0
- package/dist/internal/catalog/infra.d.ts.map +1 -1
- package/dist/internal/catalog/infra.js +65 -0
- package/dist/internal/devProviders.d.ts +1 -19
- package/dist/internal/devProviders.d.ts.map +1 -1
- package/dist/internal/devProviders.js +7 -1
- package/dist/internal/events.d.ts +52 -1
- package/dist/internal/events.d.ts.map +1 -1
- package/dist/internal/events.js +66 -4
- package/dist/internal/gatewaySettings.d.ts +6 -16
- package/dist/internal/gatewaySettings.d.ts.map +1 -1
- package/dist/internal/gatewaySettings.js +5 -23
- package/dist/internal/index.d.ts +1 -0
- package/dist/internal/index.d.ts.map +1 -1
- package/dist/internal/index.js +1 -0
- package/dist/internal/mcpOAuth.d.ts +210 -0
- package/dist/internal/mcpOAuth.d.ts.map +1 -0
- package/dist/internal/mcpOAuth.js +735 -0
- package/dist/internal/oauthClient.d.ts +36 -44
- package/dist/internal/oauthClient.d.ts.map +1 -1
- package/dist/internal/oauthClient.js +30 -113
- package/dist/internal/oauthPresets.d.ts +356 -20
- package/dist/internal/oauthPresets.d.ts.map +1 -1
- package/dist/internal/oauthPresets.js +183 -861
- package/dist/internal/oauthScopes.d.ts +43 -155
- package/dist/internal/oauthScopes.d.ts.map +1 -1
- package/dist/internal/oauthScopes.js +82 -475
- package/dist/internal/oauthSpec.d.ts +28 -71
- package/dist/internal/oauthSpec.d.ts.map +1 -1
- package/dist/internal/oauthSpec.js +172 -448
- package/dist/internal/protocol.d.ts +24 -14
- package/dist/internal/protocol.d.ts.map +1 -1
- package/dist/internal/protocol.js +26 -7
- package/dist/internal/providerApps.d.ts +2 -2
- package/dist/internal/providerApps.js +2 -2
- package/dist/internal/providerRegistry.d.ts +5 -64
- package/dist/internal/providerRegistry.d.ts.map +1 -1
- package/dist/internal/providerRegistry.js +19 -118
- package/dist/internal/providerSpec.d.ts.map +1 -1
- package/dist/internal/providerSpec.js +14 -36
- package/dist/internal/remoteMcp.d.ts +191 -47
- package/dist/internal/remoteMcp.d.ts.map +1 -1
- package/dist/internal/remoteMcp.js +338 -133
- package/dist/internal/signInProviders.d.ts +1 -1
- package/dist/internal/signInProviders.d.ts.map +1 -1
- package/dist/internal/tools.d.ts +15 -8
- package/dist/internal/tools.d.ts.map +1 -1
- package/dist/internal/tools.js +9 -8
- package/dist/manifest.d.ts +96 -40
- package/dist/manifest.d.ts.map +1 -1
- package/dist/manifest.js +1 -1
- package/dist/server/ai.d.ts +1 -93
- package/dist/server/ai.d.ts.map +1 -1
- package/dist/server/ai.js +17 -111
- package/dist/server/attribution.d.ts +11 -1
- package/dist/server/attribution.d.ts.map +1 -1
- package/dist/server/attribution.js +7 -1
- package/dist/server/connectUrl.d.ts +5 -10
- package/dist/server/connectUrl.d.ts.map +1 -1
- package/dist/server/connectUrl.js +22 -14
- package/dist/server/context.d.ts +12 -14
- package/dist/server/context.d.ts.map +1 -1
- package/dist/server/context.js +23 -25
- package/dist/server/eventsEndpoint.d.ts +48 -0
- package/dist/server/eventsEndpoint.d.ts.map +1 -0
- package/dist/server/eventsEndpoint.js +145 -0
- package/dist/server/everyApp.d.ts +16 -26
- package/dist/server/everyApp.d.ts.map +1 -1
- package/dist/server/everyApp.js +22 -46
- package/dist/server/gatewayFetch.d.ts +1 -1
- package/dist/server/gatewayFetch.js +1 -1
- package/dist/server/index.d.ts +6 -9
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +4 -8
- package/dist/server/integrationFetch.d.ts +66 -72
- package/dist/server/integrationFetch.d.ts.map +1 -1
- package/dist/server/integrationFetch.js +120 -392
- package/dist/server/refusal.d.ts +0 -9
- package/dist/server/refusal.d.ts.map +1 -1
- package/dist/server/refusal.js +0 -22
- package/dist/server/tools.d.ts +18 -7
- package/dist/server/tools.d.ts.map +1 -1
- package/dist/server/tools.js +15 -5
- package/dist/server/toolsEndpoint.d.ts +2 -1
- package/dist/server/toolsEndpoint.d.ts.map +1 -1
- package/dist/server/toolsEndpoint.js +4 -3
- package/dist/server/webhooks.d.ts +56 -0
- package/dist/server/webhooks.d.ts.map +1 -0
- package/dist/server/webhooks.js +205 -0
- package/dist/testing/index.d.ts +2 -3
- package/dist/testing/index.d.ts.map +1 -1
- package/dist/testing/index.js +2 -6
- package/package.json +6 -1
- package/dist/server/aiBinding.d.ts +0 -68
- package/dist/server/aiBinding.d.ts.map +0 -1
- package/dist/server/aiBinding.js +0 -294
- package/dist/server/authorizeUrl.d.ts +0 -43
- package/dist/server/authorizeUrl.d.ts.map +0 -1
- package/dist/server/authorizeUrl.js +0 -106
- package/dist/server/emailBinding.d.ts +0 -72
- package/dist/server/emailBinding.d.ts.map +0 -1
- package/dist/server/emailBinding.js +0 -124
- package/dist/server/fromMcpTools.d.ts +0 -89
- package/dist/server/fromMcpTools.d.ts.map +0 -1
- package/dist/server/fromMcpTools.js +0 -192
|
@@ -1,45 +1,48 @@
|
|
|
1
|
-
import { type ApiKeyCapabilityId, type CapabilityId, type
|
|
1
|
+
import { type ApiKeyCapabilityId, type CapabilityId, type EmailCapabilityStatus, type OAuthPresetId } from "../internal/index.js";
|
|
2
2
|
import { type GatewayCallFor } from "./attribution.js";
|
|
3
3
|
import type { SetupInfo } from "./refusal.js";
|
|
4
4
|
export interface IntegrationFetchOptions {
|
|
5
5
|
/**
|
|
6
6
|
* The Worker env: the EVERY_APP_GATEWAY binding when deployed, or in local
|
|
7
7
|
* dev EVERYAPP_DEV and the provider's key (e.g. DATAFORSEO_API_KEY in
|
|
8
|
-
* `.dev.vars`)
|
|
8
|
+
* `.dev.vars`), or for an OAuth provider a token you obtained yourself
|
|
9
|
+
* (`GOOGLE_WORKSPACE_ACCESS_TOKEN`, {@link devAccessTokenName}).
|
|
9
10
|
*/
|
|
10
11
|
env: object;
|
|
11
12
|
/**
|
|
12
13
|
* A provider the app lists in its manifest's `capabilities`: one whose
|
|
13
|
-
* key the gateway holds, or
|
|
14
|
-
*
|
|
15
|
-
* registered on the gateway (
|
|
14
|
+
* key the gateway holds, or an OAuth provider whose connections it
|
|
15
|
+
* holds. The catalog's ids and the OAuth presets' complete; a provider
|
|
16
|
+
* registered on the gateway (an OAuth preset's row among them) is
|
|
16
17
|
* reached through the binding, which checks it. The `email` capability
|
|
17
18
|
* is sent with `sendEmail()` instead.
|
|
18
19
|
*/
|
|
19
|
-
provider: ApiKeyCapabilityId |
|
|
20
|
+
provider: ApiKeyCapabilityId | OAuthPresetId | (string & {});
|
|
20
21
|
/**
|
|
21
22
|
* Whom the call is for. Left out, the request `everyApp()` is serving
|
|
22
|
-
* (its
|
|
23
|
-
*
|
|
23
|
+
* (its person, while the identity is good) or the organization
|
|
24
|
+
* an event delivery runs under; outside both, `RequestContextError`.
|
|
24
25
|
* Explicitly: the inbound request, or `{ background: true,
|
|
25
26
|
* organizationId }` for work no person started (crons, Workflows,
|
|
26
27
|
* queues). A shared app's Worker must end up with one or the other
|
|
27
28
|
* ({@link AttributionError}).
|
|
29
|
+
*
|
|
30
|
+
* For an OAuth provider the call uses the connection of the person
|
|
31
|
+
* behind it, which they allowed this app to use. `{ background: true,
|
|
32
|
+
* userId }` names another member's connection instead (one who allowed
|
|
33
|
+
* this app), at any time, even while serving a different person: the
|
|
34
|
+
* call then carries that member and not the person being served. Only
|
|
35
|
+
* an organization's own app may.
|
|
28
36
|
*/
|
|
29
37
|
for?: GatewayCallFor;
|
|
30
|
-
/**
|
|
31
|
-
* For an OAuth provider the gateway holds connections for: whose
|
|
32
|
-
* connection the call uses, the person's (`user`, the default when a
|
|
33
|
-
* person is behind the call) or the organization's (`organization`,
|
|
34
|
-
* the default for background work). Sent as `x-everyapp-account`.
|
|
35
|
-
*/
|
|
36
|
-
account?: ConnectionAccount;
|
|
37
38
|
/**
|
|
38
39
|
* `true`: answer null instead of throwing `ConfigurationError` when the
|
|
39
40
|
* provider is unavailable (no binding, and in local dev not its
|
|
40
41
|
* settings in `.dev.vars`), so a feature that can do without it checks
|
|
41
42
|
* for null. A wrong provider id, a binding that isn't one, and an
|
|
42
|
-
* attribution mistake still throw.
|
|
43
|
+
* attribution mistake still throw. An OAuth provider is never
|
|
44
|
+
* unavailable this way: without a connection its calls answer
|
|
45
|
+
* `integration_not_connected`.
|
|
43
46
|
*/
|
|
44
47
|
optional?: boolean;
|
|
45
48
|
}
|
|
@@ -51,19 +54,20 @@ export interface IntegrationFetchOptions {
|
|
|
51
54
|
* sees the key. A refusal the gateway makes itself comes back as a response
|
|
52
55
|
* {@link gatewayRefusal} recognizes; anything else is the provider's answer.
|
|
53
56
|
*
|
|
54
|
-
* For an OAuth
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
57
|
+
* For an OAuth provider (`google-workspace`, `github`, ...) the gateway
|
|
58
|
+
* puts the token of the person's connection on the call, to the
|
|
59
|
+
* provider's API hosts only, once the person allowed this app to use it.
|
|
60
|
+
* Without a connection, or before they allowed this app, the answer is a
|
|
61
|
+
* 409 `integration_not_connected` refusal with the `connectPath` to send
|
|
62
|
+
* the person to ({@link connectUrl}).
|
|
60
63
|
*
|
|
61
|
-
* In local dev only, with no binding, the developer's own key
|
|
62
|
-
*
|
|
64
|
+
* In local dev only, with no binding, the developer's own key from
|
|
65
|
+
* `.dev.vars` reaches the provider directly, under the gateway's names:
|
|
63
66
|
* a catalog provider's from the catalog, a provider registered on the
|
|
64
67
|
* gateway from its spec in `.everyapp/providers/<id>.json` (`everyapp
|
|
65
68
|
* provider show <id> --save` writes it), put on the call as the gateway's
|
|
66
|
-
* spec says.
|
|
69
|
+
* spec says. An OAuth provider's calls carry a token you obtained
|
|
70
|
+
* yourself ({@link devAccessTokenName}), to its API hosts only.
|
|
67
71
|
*/
|
|
68
72
|
export declare function integrationFetch(options: IntegrationFetchOptions & {
|
|
69
73
|
optional: true;
|
|
@@ -92,70 +96,60 @@ export interface IntegrationStatus extends SetupInfo {
|
|
|
92
96
|
*/
|
|
93
97
|
export type EmailIntegrationStatus = IntegrationStatus & Pick<EmailCapabilityStatus, "sender" | "senders" | "provider">;
|
|
94
98
|
/**
|
|
95
|
-
* An OAuth
|
|
96
|
-
*
|
|
97
|
-
*
|
|
99
|
+
* An OAuth provider's status: as {@link IntegrationStatus}, plus the
|
|
100
|
+
* scopes the app's manifest lists, where the person connects or allows
|
|
101
|
+
* this app, and their connection once they allowed this app to use it.
|
|
102
|
+
* `configured` means the gateway holds the client; `ready` that a call
|
|
103
|
+
* for this person would go through.
|
|
98
104
|
*/
|
|
99
|
-
export
|
|
100
|
-
/** The
|
|
101
|
-
|
|
102
|
-
/**
|
|
103
|
-
* For a client with scope sets (`google-workspace`, `microsoft-365`): the
|
|
104
|
-
* set names the app's manifest entry declares, `[]` when the entry voids
|
|
105
|
-
* its grant (no `scopes`, or a set this gateway doesn't offer), in which
|
|
106
|
-
* case `ready` is false and no token call can complete.
|
|
107
|
-
*/
|
|
108
|
-
scopeSets?: readonly string[];
|
|
105
|
+
export type OAuthClientIntegrationStatus = IntegrationStatus & {
|
|
106
|
+
/** The provider's scopes as the app's `everyapp.config.ts` lists them. */
|
|
107
|
+
scopes: readonly string[];
|
|
109
108
|
/**
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
* ({@link
|
|
113
|
-
*
|
|
109
|
+
* Where the person connects the provider, or allows this app to use
|
|
110
|
+
* their connection to it: `/connect/<id>?app=<app>` on the Gateway
|
|
111
|
+
* ({@link connectUrl} builds the absolute URL); null when the app can't
|
|
112
|
+
* connect (the manifest doesn't list it, or the gateway holds no
|
|
113
|
+
* client).
|
|
114
114
|
*/
|
|
115
|
-
|
|
116
|
-
/** Slack's `user_scope` strings, when the sets name any. */
|
|
117
|
-
userScopes?: readonly string[];
|
|
115
|
+
connectPath: string | null;
|
|
118
116
|
/**
|
|
119
|
-
*
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* `
|
|
123
|
-
*
|
|
117
|
+
* The connection the call would use (the person's, or the member's
|
|
118
|
+
* `for: { background: true, userId }` names), or null when there is
|
|
119
|
+
* none or they haven't allowed this app to use it. `ready` false with
|
|
120
|
+
* `missingScopes` when it lacks a scope the app now lists, or the app
|
|
121
|
+
* lists one the person hasn't allowed it, and `reconnect` when the
|
|
122
|
+
* person has to go through `connectPath` again (missing scopes, or it
|
|
123
|
+
* expired).
|
|
124
124
|
*/
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
connectPath?: string;
|
|
128
|
-
/**
|
|
129
|
-
* The connection the caller's account would use (the person's, or the
|
|
130
|
-
* organization's for background work), or null when there is none yet;
|
|
131
|
-
* `reconnect` when it exists but lacks a set the app declares or has
|
|
132
|
-
* expired, so the person has to connect again.
|
|
133
|
-
*/
|
|
134
|
-
connection?: {
|
|
135
|
-
account: ConnectionAccount;
|
|
125
|
+
connection: {
|
|
126
|
+
/** The account's name at the provider (an email address, a login). */
|
|
136
127
|
label: string | null;
|
|
137
|
-
|
|
128
|
+
/** The scopes it holds, canonical. */
|
|
129
|
+
scopes: readonly string[];
|
|
138
130
|
ready: boolean;
|
|
139
|
-
|
|
131
|
+
missingScopes?: readonly string[];
|
|
132
|
+
reconnect?: true;
|
|
140
133
|
} | null;
|
|
141
|
-
}
|
|
142
|
-
/** The status of a capability: email's carries its senders, an OAuth
|
|
143
|
-
export type IntegrationStatusOf<P extends string> = P extends "email" ? EmailIntegrationStatus : P extends
|
|
134
|
+
};
|
|
135
|
+
/** The status of a capability: email's carries its senders, an OAuth provider's the connection. */
|
|
136
|
+
export type IntegrationStatusOf<P extends string> = P extends "email" ? EmailIntegrationStatus : P extends OAuthPresetId ? OAuthClientIntegrationStatus : IntegrationStatus;
|
|
144
137
|
/**
|
|
145
138
|
* Whether the app can use an integration right now, without calling the
|
|
146
139
|
* provider: show "an admin needs to set up DataForSEO" (or "sending isn't
|
|
147
|
-
* set up") up front instead of failing mid-task. An
|
|
148
|
-
*
|
|
140
|
+
* set up", or "connect Google") up front instead of failing mid-task. An
|
|
141
|
+
* OAuth provider's status carries the person's connection, once they
|
|
142
|
+
* allowed this app to use it, and where to connect or allow.
|
|
149
143
|
*/
|
|
150
144
|
export declare function integrationStatus<P extends CapabilityId | (string & {})>({ env, provider, for: explicitTarget, }: {
|
|
151
145
|
env: object;
|
|
152
146
|
provider: P;
|
|
153
147
|
/**
|
|
154
148
|
* Whom the status is for: the request being served (its person), so an
|
|
155
|
-
* OAuth provider's `connection` is that person's
|
|
156
|
-
*
|
|
157
|
-
*
|
|
158
|
-
*
|
|
149
|
+
* OAuth provider's `connection` is that person's, once they allowed
|
|
150
|
+
* this app; `{ background: true, userId }` that member's. Explicitly
|
|
151
|
+
* the inbound request or `{ background: true, organizationId, userId?
|
|
152
|
+
* }`, as on every call.
|
|
159
153
|
*/
|
|
160
154
|
for?: GatewayCallFor;
|
|
161
155
|
}): Promise<IntegrationStatusOf<P>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"integrationFetch.d.ts","sourceRoot":"","sources":["../../src/server/integrationFetch.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"integrationFetch.d.ts","sourceRoot":"","sources":["../../src/server/integrationFetch.ts"],"names":[],"mappings":"AAAA,OAAO,EAeL,KAAK,kBAAkB,EACvB,KAAK,YAAY,EACjB,KAAK,qBAAqB,EAE1B,KAAK,aAAa,EAKnB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAO9C,MAAM,WAAW,uBAAuB;IACtC;;;;;OAKG;IACH,GAAG,EAAE,MAAM,CAAC;IACZ;;;;;;;OAOG;IACH,QAAQ,EAAE,kBAAkB,GAAG,aAAa,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IAC7D;;;;;;;;;;;;;;;OAeG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;IACrB;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,uBAAuB,GAAG;IAAE,QAAQ,EAAE,IAAI,CAAA;CAAE,GACpD,OAAO,KAAK,GAAG,IAAI,CAAC;AACvB,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,uBAAuB,GAC/B,OAAO,KAAK,CAAC;AAgHhB;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAE3D;AAuLD,MAAM,WAAW,iBAAkB,SAAQ,SAAS;IAClD,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,2EAA2E;IAC3E,UAAU,EAAE,OAAO,CAAC;IACpB,8BAA8B;IAC9B,KAAK,EAAE,OAAO,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,MAAM,sBAAsB,GAAG,iBAAiB,GACpD,IAAI,CAAC,qBAAqB,EAAE,QAAQ,GAAG,SAAS,GAAG,UAAU,CAAC,CAAC;AAEjE;;;;;;GAMG;AACH,MAAM,MAAM,4BAA4B,GAAG,iBAAiB,GAAG;IAC7D,0EAA0E;IAC1E,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1B;;;;;;OAMG;IACH,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;;;;;;OAQG;IACH,UAAU,EAAE;QACV,sEAAsE;QACtE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,sCAAsC;QACtC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC;QAC1B,KAAK,EAAE,OAAO,CAAC;QACf,aAAa,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAClC,SAAS,CAAC,EAAE,IAAI,CAAC;KAClB,GAAG,IAAI,CAAC;CACV,CAAC;AAEF,mGAAmG;AACnG,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,MAAM,IAAI,CAAC,SAAS,OAAO,GACjE,sBAAsB,GACtB,CAAC,SAAS,aAAa,GACrB,4BAA4B,GAC5B,iBAAiB,CAAC;AAExB;;;;;;GAMG;AACH,wBAAsB,iBAAiB,CACrC,CAAC,SAAS,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,EACtC,EACA,GAAG,EACH,QAAQ,EACR,GAAG,EAAE,cAAc,GACpB,EAAE;IACD,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,CAAC,CAAC;IACZ;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,cAAc,CAAC;CACtB,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAWlC"}
|