@opencoredev/social-sdk 0.1.1 → 0.1.2
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 +4 -2
- package/package.json +1 -1
- package/dist/cli.d.ts +0 -14
- package/dist/cli.d.ts.map +0 -1
- package/dist/cli.js +0 -234
- package/dist/cli.js.map +0 -1
- package/dist/cloud/common.d.ts +0 -26
- package/dist/cloud/common.d.ts.map +0 -1
- package/dist/cloud/common.js +0 -307
- package/dist/cloud/common.js.map +0 -1
- package/dist/cloud/lifecycle.d.ts +0 -11
- package/dist/cloud/lifecycle.d.ts.map +0 -1
- package/dist/cloud/lifecycle.js +0 -108
- package/dist/cloud/lifecycle.js.map +0 -1
- package/dist/cloud/media.d.ts +0 -24
- package/dist/cloud/media.d.ts.map +0 -1
- package/dist/cloud/media.js +0 -97
- package/dist/cloud/media.js.map +0 -1
- package/dist/cloud/outcomes.d.ts +0 -10
- package/dist/cloud/outcomes.d.ts.map +0 -1
- package/dist/cloud/outcomes.js +0 -188
- package/dist/cloud/outcomes.js.map +0 -1
- package/dist/cloud/post-for-me.d.ts +0 -70
- package/dist/cloud/post-for-me.d.ts.map +0 -1
- package/dist/cloud/post-for-me.js +0 -326
- package/dist/cloud/post-for-me.js.map +0 -1
- package/dist/cloud/zernio.d.ts +0 -112
- package/dist/cloud/zernio.d.ts.map +0 -1
- package/dist/cloud/zernio.js +0 -542
- package/dist/cloud/zernio.js.map +0 -1
- package/dist/core/adapter.d.ts +0 -118
- package/dist/core/adapter.d.ts.map +0 -1
- package/dist/core/adapter.js +0 -4
- package/dist/core/adapter.js.map +0 -1
- package/dist/core/client.d.ts +0 -108
- package/dist/core/client.d.ts.map +0 -1
- package/dist/core/client.js +0 -893
- package/dist/core/client.js.map +0 -1
- package/dist/core/concurrency.d.ts +0 -10
- package/dist/core/concurrency.d.ts.map +0 -1
- package/dist/core/concurrency.js +0 -78
- package/dist/core/concurrency.js.map +0 -1
- package/dist/core/errors.d.ts +0 -45
- package/dist/core/errors.d.ts.map +0 -1
- package/dist/core/errors.js +0 -44
- package/dist/core/errors.js.map +0 -1
- package/dist/core/idempotency.d.ts +0 -34
- package/dist/core/idempotency.d.ts.map +0 -1
- package/dist/core/idempotency.js +0 -59
- package/dist/core/idempotency.js.map +0 -1
- package/dist/core/index.d.ts +0 -7
- package/dist/core/index.d.ts.map +0 -1
- package/dist/core/index.js +0 -7
- package/dist/core/index.js.map +0 -1
- package/dist/core/pagination.d.ts +0 -12
- package/dist/core/pagination.d.ts.map +0 -1
- package/dist/core/pagination.js +0 -81
- package/dist/core/pagination.js.map +0 -1
- package/dist/core/types.d.ts +0 -329
- package/dist/core/types.d.ts.map +0 -1
- package/dist/core/types.js +0 -7
- package/dist/core/types.js.map +0 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +0 -1
- package/dist/platforms/bluesky.d.ts +0 -132
- package/dist/platforms/bluesky.d.ts.map +0 -1
- package/dist/platforms/bluesky.js +0 -1049
- package/dist/platforms/bluesky.js.map +0 -1
- package/dist/platforms/instagram.d.ts +0 -63
- package/dist/platforms/instagram.d.ts.map +0 -1
- package/dist/platforms/instagram.js +0 -676
- package/dist/platforms/instagram.js.map +0 -1
- package/dist/platforms/linkedin.d.ts +0 -54
- package/dist/platforms/linkedin.d.ts.map +0 -1
- package/dist/platforms/linkedin.js +0 -580
- package/dist/platforms/linkedin.js.map +0 -1
- package/dist/platforms/threads.d.ts +0 -102
- package/dist/platforms/threads.d.ts.map +0 -1
- package/dist/platforms/threads.js +0 -571
- package/dist/platforms/threads.js.map +0 -1
- package/dist/platforms/tiktok.d.ts +0 -32
- package/dist/platforms/tiktok.d.ts.map +0 -1
- package/dist/platforms/tiktok.js +0 -511
- package/dist/platforms/tiktok.js.map +0 -1
- package/dist/platforms/x-engagement.d.ts +0 -17
- package/dist/platforms/x-engagement.d.ts.map +0 -1
- package/dist/platforms/x-engagement.js +0 -47
- package/dist/platforms/x-engagement.js.map +0 -1
- package/dist/platforms/x.d.ts +0 -82
- package/dist/platforms/x.d.ts.map +0 -1
- package/dist/platforms/x.js +0 -511
- package/dist/platforms/x.js.map +0 -1
- package/dist/platforms/youtube-upload.d.ts +0 -33
- package/dist/platforms/youtube-upload.d.ts.map +0 -1
- package/dist/platforms/youtube-upload.js +0 -281
- package/dist/platforms/youtube-upload.js.map +0 -1
- package/dist/platforms/youtube.d.ts +0 -55
- package/dist/platforms/youtube.d.ts.map +0 -1
- package/dist/platforms/youtube.js +0 -561
- package/dist/platforms/youtube.js.map +0 -1
- package/dist/server/connections.d.ts +0 -124
- package/dist/server/connections.d.ts.map +0 -1
- package/dist/server/connections.js +0 -334
- package/dist/server/connections.js.map +0 -1
- package/dist/server/credentials.d.ts +0 -52
- package/dist/server/credentials.d.ts.map +0 -1
- package/dist/server/credentials.js +0 -115
- package/dist/server/credentials.js.map +0 -1
- package/dist/server/index.d.ts +0 -5
- package/dist/server/index.d.ts.map +0 -1
- package/dist/server/index.js +0 -5
- package/dist/server/index.js.map +0 -1
- package/dist/server/oauth.d.ts +0 -48
- package/dist/server/oauth.d.ts.map +0 -1
- package/dist/server/oauth.js +0 -483
- package/dist/server/oauth.js.map +0 -1
- package/dist/server/webhooks.d.ts +0 -58
- package/dist/server/webhooks.d.ts.map +0 -1
- package/dist/server/webhooks.js +0 -198
- package/dist/server/webhooks.js.map +0 -1
- package/dist/testing/index.d.ts +0 -47
- package/dist/testing/index.d.ts.map +0 -1
- package/dist/testing/index.js +0 -413
- package/dist/testing/index.js.map +0 -1
- package/dist/testing.d.ts +0 -2
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -2
- package/dist/testing.js.map +0 -1
- package/dist/transport/binary.d.ts +0 -3
- package/dist/transport/binary.d.ts.map +0 -1
- package/dist/transport/binary.js +0 -30
- package/dist/transport/binary.js.map +0 -1
- package/dist/transport/budget.d.ts +0 -4
- package/dist/transport/budget.d.ts.map +0 -1
- package/dist/transport/budget.js +0 -27
- package/dist/transport/budget.js.map +0 -1
- package/dist/transport/http.d.ts +0 -44
- package/dist/transport/http.d.ts.map +0 -1
- package/dist/transport/http.js +0 -230
- package/dist/transport/http.js.map +0 -1
- package/dist/transport/json.d.ts +0 -3
- package/dist/transport/json.d.ts.map +0 -1
- package/dist/transport/json.js +0 -11
- package/dist/transport/json.js.map +0 -1
- package/dist/transport/upload.d.ts +0 -25
- package/dist/transport/upload.d.ts.map +0 -1
- package/dist/transport/upload.js +0 -133
- package/dist/transport/upload.js.map +0 -1
- package/dist/transport/validation.d.ts +0 -6
- package/dist/transport/validation.d.ts.map +0 -1
- package/dist/transport/validation.js +0 -24
- package/dist/transport/validation.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.js","sourceRoot":"","sources":["../../src/server/credentials.ts"],"names":[],"mappings":"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"}
|
package/dist/server/index.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
|
package/dist/server/index.js
DELETED
package/dist/server/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,kBAAkB,CAAC;AACjC,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC"}
|
package/dist/server/oauth.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import type { ConnectionAccount, ConnectionAttempt, ConnectionProvider } from "./connections.js";
|
|
2
|
-
export interface OAuthTokenSet {
|
|
3
|
-
readonly accessToken: string;
|
|
4
|
-
readonly refreshToken?: string;
|
|
5
|
-
readonly expiresAt?: string;
|
|
6
|
-
readonly scopes?: readonly string[];
|
|
7
|
-
readonly tokenType?: string;
|
|
8
|
-
}
|
|
9
|
-
export interface OAuthCredentialSink {
|
|
10
|
-
save(input: {
|
|
11
|
-
readonly account: ConnectionAccount;
|
|
12
|
-
readonly token: OAuthTokenSet;
|
|
13
|
-
readonly attempt: ConnectionAttempt;
|
|
14
|
-
}): Promise<void>;
|
|
15
|
-
}
|
|
16
|
-
export interface OAuthProviderOptions {
|
|
17
|
-
readonly clientId: string;
|
|
18
|
-
readonly clientSecret?: string;
|
|
19
|
-
readonly redirectUri?: string;
|
|
20
|
-
readonly fetch?: typeof globalThis.fetch;
|
|
21
|
-
readonly credentialSink?: OAuthCredentialSink;
|
|
22
|
-
/** Optional label for callers; the attempt's backend is always authoritative. */
|
|
23
|
-
readonly backend?: string;
|
|
24
|
-
readonly scopes?: readonly string[];
|
|
25
|
-
/** Explicit LinkedIn Marketing API version (YYYYMM). Required for LinkedIn OAuth. */
|
|
26
|
-
readonly linkedinApiVersion?: string;
|
|
27
|
-
/** Graph API version for Threads account discovery. */
|
|
28
|
-
readonly threadsApiVersion?: string;
|
|
29
|
-
/** Graph API version for Instagram Login account discovery. */
|
|
30
|
-
readonly instagramApiVersion?: string;
|
|
31
|
-
/** Maximum time for a single OAuth request. Defaults to ten seconds. */
|
|
32
|
-
readonly timeoutMs?: number;
|
|
33
|
-
/** Maximum response body size. Defaults to one MiB. */
|
|
34
|
-
readonly maxResponseBytes?: number;
|
|
35
|
-
}
|
|
36
|
-
type ProviderKind = "youtube" | "x" | "threads" | "tiktok" | "instagram" | "linkedin";
|
|
37
|
-
export declare function oauthProvider(kind: ProviderKind, options: OAuthProviderOptions): ConnectionProvider;
|
|
38
|
-
/** Exchange a short-lived Threads or Instagram Login token for a long-lived token. */
|
|
39
|
-
export declare function exchangeLongLivedOAuthToken(kind: "threads" | "instagram", options: OAuthProviderOptions, current: OAuthTokenSet): Promise<OAuthTokenSet>;
|
|
40
|
-
export declare const youtubeOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
41
|
-
export declare const xOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
42
|
-
export declare const threadsOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
43
|
-
export declare const tiktokOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
44
|
-
export declare const instagramOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
45
|
-
export declare const linkedinOAuth: (options: OAuthProviderOptions) => ConnectionProvider;
|
|
46
|
-
export declare function refreshOAuthToken(kind: ProviderKind, options: OAuthProviderOptions, current: OAuthTokenSet): Promise<OAuthTokenSet>;
|
|
47
|
-
export {};
|
|
48
|
-
//# sourceMappingURL=oauth.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.d.ts","sourceRoot":"","sources":["../../src/server/oauth.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,CAAC,KAAK,EAAE;QACV,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;QACpC,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;QAC9B,QAAQ,CAAC,OAAO,EAAE,iBAAiB,CAAC;KACrC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IACzC,QAAQ,CAAC,cAAc,CAAC,EAAE,mBAAmB,CAAC;IAC9C,iFAAiF;IACjF,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,uDAAuD;IACvD,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,+DAA+D;IAC/D,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,wEAAwE;IACxE,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,KAAK,YAAY,GAAG,SAAS,GAAG,GAAG,GAAG,SAAS,GAAG,QAAQ,GAAG,WAAW,GAAG,UAAU,CAAC;AAmWtF,wBAAgB,aAAa,CAC3B,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,oBAAoB,GAC5B,kBAAkB,CAwGpB;AA6LD,sFAAsF;AACtF,wBAAsB,2BAA2B,CAC/C,IAAI,EAAE,SAAS,GAAG,WAAW,EAC7B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAExB;AAED,eAAO,MAAM,YAAY,GAAI,SAAS,oBAAoB,uBAAsC,CAAC;AACjG,eAAO,MAAM,MAAM,GAAI,SAAS,oBAAoB,uBAAgC,CAAC;AACrF,eAAO,MAAM,YAAY,GAAI,SAAS,oBAAoB,uBAAsC,CAAC;AACjG,eAAO,MAAM,WAAW,GAAI,SAAS,oBAAoB,uBAAqC,CAAC;AAC/F,eAAO,MAAM,cAAc,GAAI,SAAS,oBAAoB,uBACvB,CAAC;AACtC,eAAO,MAAM,aAAa,GAAI,SAAS,oBAAoB,uBAAuC,CAAC;AAEnG,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,YAAY,EAClB,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,aAAa,GACrB,OAAO,CAAC,aAAa,CAAC,CAwDxB"}
|
package/dist/server/oauth.js
DELETED
|
@@ -1,483 +0,0 @@
|
|
|
1
|
-
import { SocialError } from "../core/errors.js";
|
|
2
|
-
import { connectedAccountRef } from "../core/types.js";
|
|
3
|
-
const configs = {
|
|
4
|
-
youtube: {
|
|
5
|
-
auth: "https://accounts.google.com/o/oauth2/v2/auth",
|
|
6
|
-
token: "https://oauth2.googleapis.com/token",
|
|
7
|
-
scopes: [
|
|
8
|
-
"openid",
|
|
9
|
-
"https://www.googleapis.com/auth/userinfo.profile",
|
|
10
|
-
"https://www.googleapis.com/auth/youtube.readonly",
|
|
11
|
-
],
|
|
12
|
-
scopeDelimiter: " ",
|
|
13
|
-
pkce: false,
|
|
14
|
-
clientKey: "client_id",
|
|
15
|
-
},
|
|
16
|
-
x: {
|
|
17
|
-
auth: "https://api.x.com/2/oauth2/authorize",
|
|
18
|
-
token: "https://api.x.com/2/oauth2/token",
|
|
19
|
-
scopes: ["tweet.read", "users.read", "offline.access"],
|
|
20
|
-
scopeDelimiter: " ",
|
|
21
|
-
pkce: true,
|
|
22
|
-
clientKey: "client_id",
|
|
23
|
-
},
|
|
24
|
-
threads: {
|
|
25
|
-
auth: "https://threads.net/oauth/authorize",
|
|
26
|
-
token: "https://graph.threads.net/oauth/access_token",
|
|
27
|
-
scopes: ["threads_basic", "threads_content_publish"],
|
|
28
|
-
scopeDelimiter: ",",
|
|
29
|
-
pkce: false,
|
|
30
|
-
clientKey: "client_id",
|
|
31
|
-
},
|
|
32
|
-
tiktok: {
|
|
33
|
-
auth: "https://www.tiktok.com/v2/auth/authorize/",
|
|
34
|
-
token: "https://open.tiktokapis.com/v2/oauth/token/",
|
|
35
|
-
scopes: ["user.info.basic", "video.publish"],
|
|
36
|
-
scopeDelimiter: ",",
|
|
37
|
-
pkce: true,
|
|
38
|
-
clientKey: "client_key",
|
|
39
|
-
},
|
|
40
|
-
instagram: {
|
|
41
|
-
auth: "https://www.instagram.com/oauth/authorize",
|
|
42
|
-
token: "https://api.instagram.com/oauth/access_token",
|
|
43
|
-
scopes: ["instagram_business_basic", "instagram_business_content_publish"],
|
|
44
|
-
scopeDelimiter: ",",
|
|
45
|
-
pkce: false,
|
|
46
|
-
clientKey: "client_id",
|
|
47
|
-
},
|
|
48
|
-
linkedin: {
|
|
49
|
-
auth: "https://www.linkedin.com/oauth/v2/authorization",
|
|
50
|
-
token: "https://www.linkedin.com/oauth/v2/accessToken",
|
|
51
|
-
scopes: ["openid", "profile", "w_member_social"],
|
|
52
|
-
scopeDelimiter: " ",
|
|
53
|
-
pkce: false,
|
|
54
|
-
clientKey: "client_id",
|
|
55
|
-
},
|
|
56
|
-
};
|
|
57
|
-
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
58
|
-
const DEFAULT_MAX_RESPONSE_BYTES = 1024 * 1024;
|
|
59
|
-
const webFetch = (...args) => globalThis.fetch(...args);
|
|
60
|
-
function fail(operation, message, code = "upstream_failure", cause) {
|
|
61
|
-
throw new SocialError({ code, operation, message, cause });
|
|
62
|
-
}
|
|
63
|
-
function asRecord(value, operation = "oauth.response") {
|
|
64
|
-
if (typeof value !== "object" || value === null || Array.isArray(value))
|
|
65
|
-
fail(operation, "OAuth provider returned an invalid response");
|
|
66
|
-
return value;
|
|
67
|
-
}
|
|
68
|
-
function requiredString(value, field, operation = "oauth.response") {
|
|
69
|
-
if (typeof value !== "string" || value.length === 0 || value.length > 8192)
|
|
70
|
-
fail(operation, `OAuth provider response is missing ${field}`);
|
|
71
|
-
return value;
|
|
72
|
-
}
|
|
73
|
-
function optionalString(value) {
|
|
74
|
-
return typeof value === "string" && value.length > 0 && value.length <= 8192 ? value : undefined;
|
|
75
|
-
}
|
|
76
|
-
function errorForResponse(status, operation) {
|
|
77
|
-
if (status === 401)
|
|
78
|
-
fail(operation, "OAuth authorization is no longer valid; reconnect the account", "reconnect_required");
|
|
79
|
-
if (status === 403)
|
|
80
|
-
fail(operation, "OAuth authorization does not include the required permission", "missing_permission");
|
|
81
|
-
if (status === 429)
|
|
82
|
-
throw new SocialError({
|
|
83
|
-
code: "rate_limited",
|
|
84
|
-
operation,
|
|
85
|
-
message: "OAuth provider rate limited the request",
|
|
86
|
-
upstreamStatus: status,
|
|
87
|
-
retryDisposition: { kind: "after-delay", delayMs: 1000 },
|
|
88
|
-
});
|
|
89
|
-
throw new SocialError({
|
|
90
|
-
code: "upstream_failure",
|
|
91
|
-
operation,
|
|
92
|
-
message: "OAuth provider request failed",
|
|
93
|
-
upstreamStatus: status,
|
|
94
|
-
});
|
|
95
|
-
}
|
|
96
|
-
async function readBounded(response, maxBytes, operation) {
|
|
97
|
-
if (!Number.isSafeInteger(maxBytes) || maxBytes < 1)
|
|
98
|
-
fail("oauth.config", "maxResponseBytes must be a positive safe integer", "invalid_input");
|
|
99
|
-
if (!response.body)
|
|
100
|
-
return "";
|
|
101
|
-
const reader = response.body.getReader();
|
|
102
|
-
const chunks = [];
|
|
103
|
-
let total = 0;
|
|
104
|
-
try {
|
|
105
|
-
for (;;) {
|
|
106
|
-
const part = await reader.read();
|
|
107
|
-
if (part.done)
|
|
108
|
-
break;
|
|
109
|
-
total += part.value.byteLength;
|
|
110
|
-
if (total > maxBytes) {
|
|
111
|
-
await reader.cancel();
|
|
112
|
-
fail(operation, "OAuth provider response exceeded the configured size limit", "upstream_failure");
|
|
113
|
-
}
|
|
114
|
-
chunks.push(part.value);
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
finally {
|
|
118
|
-
reader.releaseLock();
|
|
119
|
-
}
|
|
120
|
-
const merged = new Uint8Array(total);
|
|
121
|
-
let offset = 0;
|
|
122
|
-
for (const chunk of chunks) {
|
|
123
|
-
merged.set(chunk, offset);
|
|
124
|
-
offset += chunk.byteLength;
|
|
125
|
-
}
|
|
126
|
-
return new TextDecoder().decode(merged);
|
|
127
|
-
}
|
|
128
|
-
async function body(response, operation, maxBytes) {
|
|
129
|
-
const raw = await readBounded(response, maxBytes, operation);
|
|
130
|
-
if (!response.ok)
|
|
131
|
-
return errorForResponse(response.status, operation);
|
|
132
|
-
const contentType = response.headers.get("content-type")?.toLowerCase() ?? "";
|
|
133
|
-
if (raw.trim() === "")
|
|
134
|
-
fail(operation, "OAuth provider returned an empty response");
|
|
135
|
-
if (contentType.includes("application/json") ||
|
|
136
|
-
contentType.includes("+json") ||
|
|
137
|
-
raw.trimStart().startsWith("{")) {
|
|
138
|
-
try {
|
|
139
|
-
return asRecord(JSON.parse(raw), operation);
|
|
140
|
-
}
|
|
141
|
-
catch {
|
|
142
|
-
fail(operation, "OAuth provider returned malformed JSON");
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
if (contentType.includes("application/x-www-form-urlencoded")) {
|
|
146
|
-
const params = new URLSearchParams(raw);
|
|
147
|
-
if ([...params.keys()].length === 0)
|
|
148
|
-
fail(operation, "OAuth provider returned malformed form data");
|
|
149
|
-
return Object.fromEntries(params.entries());
|
|
150
|
-
}
|
|
151
|
-
fail(operation, "OAuth provider returned an unsupported response format");
|
|
152
|
-
}
|
|
153
|
-
function parseScopes(value) {
|
|
154
|
-
const scope = optionalString(value);
|
|
155
|
-
return scope === undefined ? undefined : scope.split(/[\s,]+/).filter(Boolean);
|
|
156
|
-
}
|
|
157
|
-
function tokenSet(data, operation = "oauth.token") {
|
|
158
|
-
const accessToken = requiredString(data["access_token"], "access_token", operation);
|
|
159
|
-
const expires = data["expires_in"];
|
|
160
|
-
let expiresAt;
|
|
161
|
-
if (expires !== undefined) {
|
|
162
|
-
const seconds = typeof expires === "number"
|
|
163
|
-
? expires
|
|
164
|
-
: typeof expires === "string" && /^\d+(?:\.\d+)?$/.test(expires)
|
|
165
|
-
? Number(expires)
|
|
166
|
-
: Number.NaN;
|
|
167
|
-
if (!Number.isFinite(seconds) || seconds < 0 || seconds > 31_536_000_000)
|
|
168
|
-
fail(operation, "OAuth provider returned an invalid token lifetime");
|
|
169
|
-
expiresAt = new Date(Date.now() + seconds * 1000).toISOString();
|
|
170
|
-
}
|
|
171
|
-
const refreshToken = optionalString(data["refresh_token"]);
|
|
172
|
-
const scopes = parseScopes(data["scope"]);
|
|
173
|
-
const tokenType = optionalString(data["token_type"]);
|
|
174
|
-
return {
|
|
175
|
-
accessToken,
|
|
176
|
-
...(refreshToken === undefined ? {} : { refreshToken }),
|
|
177
|
-
...(expiresAt === undefined ? {} : { expiresAt }),
|
|
178
|
-
...(scopes === undefined ? {} : { scopes }),
|
|
179
|
-
...(tokenType === undefined ? {} : { tokenType }),
|
|
180
|
-
};
|
|
181
|
-
}
|
|
182
|
-
function tokenResult(data, kind) {
|
|
183
|
-
const nested = kind === "tiktok" && data["data"] !== undefined ? asRecord(data["data"], "oauth.token") : data;
|
|
184
|
-
const token = tokenSet(nested);
|
|
185
|
-
const accountHint = optionalString(nested["user_id"]) ?? optionalString(nested["open_id"]);
|
|
186
|
-
return { token, ...(accountHint === undefined ? {} : { accountHint }) };
|
|
187
|
-
}
|
|
188
|
-
async function request(fetcher, url, init, operation, options) {
|
|
189
|
-
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
190
|
-
if (!Number.isSafeInteger(timeoutMs) || timeoutMs < 1)
|
|
191
|
-
fail("oauth.config", "timeoutMs must be a positive safe integer", "invalid_input");
|
|
192
|
-
const controller = new AbortController();
|
|
193
|
-
const timer = setTimeout(() => controller.abort(), timeoutMs);
|
|
194
|
-
let raceTimer;
|
|
195
|
-
try {
|
|
196
|
-
// AbortController handles standards-compliant fetch implementations; the
|
|
197
|
-
// race also bounds injected fetchers that ignore AbortSignal.
|
|
198
|
-
const timeout = new Promise((_, reject) => {
|
|
199
|
-
raceTimer = setTimeout(() => reject(new DOMException("OAuth request timed out", "AbortError")), timeoutMs);
|
|
200
|
-
});
|
|
201
|
-
const response = await Promise.race([
|
|
202
|
-
fetcher(url, { ...init, redirect: "error", signal: controller.signal }),
|
|
203
|
-
timeout,
|
|
204
|
-
]);
|
|
205
|
-
return await Promise.race([
|
|
206
|
-
body(response, operation, options.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES),
|
|
207
|
-
timeout,
|
|
208
|
-
]);
|
|
209
|
-
}
|
|
210
|
-
catch (error) {
|
|
211
|
-
if (error instanceof SocialError)
|
|
212
|
-
throw error;
|
|
213
|
-
if ((error instanceof DOMException && error.name === "AbortError") ||
|
|
214
|
-
(typeof error === "object" &&
|
|
215
|
-
error !== null &&
|
|
216
|
-
"name" in error &&
|
|
217
|
-
error.name === "AbortError"))
|
|
218
|
-
fail(operation, "OAuth provider request timed out", "timeout");
|
|
219
|
-
fail(operation, "OAuth provider request failed", "upstream_failure", error);
|
|
220
|
-
}
|
|
221
|
-
finally {
|
|
222
|
-
clearTimeout(timer);
|
|
223
|
-
if (raceTimer !== undefined)
|
|
224
|
-
clearTimeout(raceTimer);
|
|
225
|
-
}
|
|
226
|
-
fail("oauth.internal", "OAuth request did not produce a result");
|
|
227
|
-
}
|
|
228
|
-
function account(platform, backend, id, name) {
|
|
229
|
-
return { ref: connectedAccountRef({ backend, platform, accountId: id }), displayName: name };
|
|
230
|
-
}
|
|
231
|
-
function validateLinkedInVersion(value) {
|
|
232
|
-
if (value === undefined || !/^20\d{2}(0[1-9]|1[0-2])$/.test(value))
|
|
233
|
-
fail("oauth.config", "LinkedIn OAuth requires an explicit YYYYMM API version", "invalid_input");
|
|
234
|
-
return value;
|
|
235
|
-
}
|
|
236
|
-
function validateCallback(input) {
|
|
237
|
-
let callback;
|
|
238
|
-
try {
|
|
239
|
-
callback = new URL(input.callbackUrl);
|
|
240
|
-
}
|
|
241
|
-
catch {
|
|
242
|
-
fail("connections.complete", "OAuth callback URL is invalid", "invalid_input");
|
|
243
|
-
}
|
|
244
|
-
let expected;
|
|
245
|
-
try {
|
|
246
|
-
expected = new URL(input.attempt.redirectUri);
|
|
247
|
-
}
|
|
248
|
-
catch {
|
|
249
|
-
fail("connections.complete", "OAuth attempt redirect URI is invalid", "invalid_input");
|
|
250
|
-
}
|
|
251
|
-
if (callback.origin !== expected.origin ||
|
|
252
|
-
callback.pathname !== expected.pathname ||
|
|
253
|
-
callback.username ||
|
|
254
|
-
callback.password ||
|
|
255
|
-
callback.hash)
|
|
256
|
-
fail("connections.complete", "OAuth callback does not match the registered redirect", "unauthorized");
|
|
257
|
-
for (const [key, value] of expected.searchParams)
|
|
258
|
-
if (callback.searchParams.getAll(key).length !== 1 || callback.searchParams.get(key) !== value)
|
|
259
|
-
fail("connections.complete", "OAuth callback does not match the registered redirect", "unauthorized");
|
|
260
|
-
const states = callback.searchParams.getAll("state");
|
|
261
|
-
if (states.length !== 1 || states[0] !== input.attempt.state)
|
|
262
|
-
fail("connections.complete", "OAuth callback state did not match the authenticated attempt", "unauthorized");
|
|
263
|
-
return callback;
|
|
264
|
-
}
|
|
265
|
-
function providerIdentity(kind, hint, discovered) {
|
|
266
|
-
if (hint === undefined)
|
|
267
|
-
return;
|
|
268
|
-
const normalized = kind === "linkedin" ? `urn:li:person:${hint}` : hint;
|
|
269
|
-
if (!discovered.some((item) => item.ref.accountId === normalized || item.ref.accountId.endsWith(`:${hint}`)))
|
|
270
|
-
fail("oauth.identity", "OAuth token identity did not match the discovered account", "unauthorized");
|
|
271
|
-
}
|
|
272
|
-
export function oauthProvider(kind, options) {
|
|
273
|
-
const cfg = configs[kind];
|
|
274
|
-
if (!options.clientId.trim())
|
|
275
|
-
fail("oauth.config", "clientId is required", "invalid_input");
|
|
276
|
-
if (kind === "linkedin")
|
|
277
|
-
validateLinkedInVersion(options.linkedinApiVersion);
|
|
278
|
-
const fetcher = options.fetch ?? webFetch;
|
|
279
|
-
const scopes = options.scopes ?? cfg.scopes;
|
|
280
|
-
return {
|
|
281
|
-
async start(input) {
|
|
282
|
-
if (!input.platforms.includes(kind))
|
|
283
|
-
fail("connections.begin", `OAuth provider ${kind} cannot authorize the requested platforms`, "invalid_input");
|
|
284
|
-
if (options.redirectUri !== undefined && options.redirectUri !== input.redirectUri)
|
|
285
|
-
fail("connections.begin", "redirectUri does not match the configured OAuth callback", "invalid_input");
|
|
286
|
-
const url = new URL(cfg.auth);
|
|
287
|
-
url.searchParams.set(cfg.clientKey, options.clientId);
|
|
288
|
-
url.searchParams.set("redirect_uri", input.redirectUri);
|
|
289
|
-
url.searchParams.set("response_type", "code");
|
|
290
|
-
url.searchParams.set("scope", scopes.join(cfg.scopeDelimiter));
|
|
291
|
-
url.searchParams.set("state", input.state);
|
|
292
|
-
if (kind === "youtube") {
|
|
293
|
-
url.searchParams.set("access_type", "offline");
|
|
294
|
-
url.searchParams.set("prompt", "consent");
|
|
295
|
-
}
|
|
296
|
-
if (cfg.pkce) {
|
|
297
|
-
url.searchParams.set("code_challenge", input.codeChallenge);
|
|
298
|
-
url.searchParams.set("code_challenge_method", "S256");
|
|
299
|
-
}
|
|
300
|
-
return { authorizationUrl: url.toString() };
|
|
301
|
-
},
|
|
302
|
-
async complete(input) {
|
|
303
|
-
const callback = validateCallback(input);
|
|
304
|
-
const denied = callback.searchParams.get("error");
|
|
305
|
-
if (denied !== null) {
|
|
306
|
-
const cancelled = denied === "access_denied" ||
|
|
307
|
-
denied === "user_denied" ||
|
|
308
|
-
callback.searchParams.get("error_reason") === "user_denied";
|
|
309
|
-
fail("connections.complete", "OAuth authorization was cancelled or denied", cancelled ? "cancelled" : "unauthorized");
|
|
310
|
-
}
|
|
311
|
-
const code = callback.searchParams.get("code");
|
|
312
|
-
if (!code)
|
|
313
|
-
fail("connections.complete", "OAuth callback did not include an authorization code", "invalid_input");
|
|
314
|
-
const form = new URLSearchParams({
|
|
315
|
-
grant_type: "authorization_code",
|
|
316
|
-
code,
|
|
317
|
-
redirect_uri: input.attempt.redirectUri,
|
|
318
|
-
[cfg.clientKey]: options.clientId,
|
|
319
|
-
});
|
|
320
|
-
if (cfg.pkce)
|
|
321
|
-
form.set("code_verifier", input.attempt.codeVerifier);
|
|
322
|
-
if (options.clientSecret)
|
|
323
|
-
form.set("client_secret", options.clientSecret);
|
|
324
|
-
const raw = await request(fetcher, cfg.token, {
|
|
325
|
-
method: "POST",
|
|
326
|
-
headers: {
|
|
327
|
-
"content-type": "application/x-www-form-urlencoded",
|
|
328
|
-
accept: "application/json",
|
|
329
|
-
},
|
|
330
|
-
body: form,
|
|
331
|
-
}, "oauth.token", options);
|
|
332
|
-
let result = tokenResult(raw, kind);
|
|
333
|
-
if ((kind === "threads" || kind === "instagram") && options.clientSecret)
|
|
334
|
-
result = {
|
|
335
|
-
token: await exchangeLongLived(kind, options, result.token),
|
|
336
|
-
...(result.accountHint === undefined ? {} : { accountHint: result.accountHint }),
|
|
337
|
-
};
|
|
338
|
-
const accounts = await discover(kind, result.token, result.accountHint, input.attempt.backend, fetcher, options);
|
|
339
|
-
providerIdentity(kind, result.accountHint, accounts);
|
|
340
|
-
for (const item of accounts)
|
|
341
|
-
if (options.credentialSink)
|
|
342
|
-
await options.credentialSink.save({
|
|
343
|
-
account: item,
|
|
344
|
-
token: result.token,
|
|
345
|
-
attempt: input.attempt,
|
|
346
|
-
});
|
|
347
|
-
return accounts;
|
|
348
|
-
},
|
|
349
|
-
};
|
|
350
|
-
}
|
|
351
|
-
async function discover(kind, token, _hint, backend, fetcher, options) {
|
|
352
|
-
const auth = { Authorization: `Bearer ${token.accessToken}`, accept: "application/json" };
|
|
353
|
-
if (kind === "youtube") {
|
|
354
|
-
const data = await request(fetcher, "https://www.googleapis.com/youtube/v3/channels?part=id,snippet&mine=true", { headers: auth }, "youtube.account", options);
|
|
355
|
-
const items = Array.isArray(data["items"]) ? data["items"] : [];
|
|
356
|
-
return items.map((item) => {
|
|
357
|
-
const row = asRecord(item, "youtube.account");
|
|
358
|
-
const snippet = asRecord(row["snippet"] ?? {}, "youtube.account");
|
|
359
|
-
return account("youtube", backend, requiredString(row["id"], "channel id", "youtube.account"), typeof snippet["title"] === "string" ? snippet["title"] : "YouTube channel");
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
if (kind === "x") {
|
|
363
|
-
const data = await request(fetcher, "https://api.x.com/2/users/me", { headers: auth }, "x.account", options);
|
|
364
|
-
const row = asRecord(data["data"], "x.account");
|
|
365
|
-
return [
|
|
366
|
-
account("x", backend, requiredString(row["id"], "user id", "x.account"), typeof row["name"] === "string" ? row["name"] : "X account"),
|
|
367
|
-
];
|
|
368
|
-
}
|
|
369
|
-
if (kind === "threads") {
|
|
370
|
-
const version = options.threadsApiVersion ?? "v1.0";
|
|
371
|
-
if (!/^v\d+\.\d+$/.test(version))
|
|
372
|
-
fail("oauth.config", "Threads API version is invalid", "invalid_input");
|
|
373
|
-
const data = await request(fetcher, `https://graph.threads.net/${version}/me?fields=id,username`, { headers: auth }, "threads.account", options);
|
|
374
|
-
return [
|
|
375
|
-
account("threads", backend, requiredString(data["id"], "user id", "threads.account"), typeof data["username"] === "string" ? data["username"] : "Threads account"),
|
|
376
|
-
];
|
|
377
|
-
}
|
|
378
|
-
if (kind === "tiktok") {
|
|
379
|
-
const data = await request(fetcher, "https://open.tiktokapis.com/v2/user/info/?fields=open_id,display_name", { headers: auth }, "tiktok.account", options);
|
|
380
|
-
const row = asRecord(data["data"], "tiktok.account");
|
|
381
|
-
const user = asRecord(row["user"], "tiktok.account");
|
|
382
|
-
return [
|
|
383
|
-
account("tiktok", backend, requiredString(user["open_id"], "open_id", "tiktok.account"), typeof user["display_name"] === "string" ? user["display_name"] : "TikTok account"),
|
|
384
|
-
];
|
|
385
|
-
}
|
|
386
|
-
if (kind === "instagram") {
|
|
387
|
-
const version = options.instagramApiVersion ?? "v25.0";
|
|
388
|
-
if (!/^v\d+\.\d+$/.test(version))
|
|
389
|
-
fail("oauth.config", "Instagram API version is invalid", "invalid_input");
|
|
390
|
-
const data = await request(fetcher, `https://graph.instagram.com/${version}/me?fields=id,user_id,username`, { headers: auth }, "instagram.account", options);
|
|
391
|
-
return [
|
|
392
|
-
account("instagram", backend, requiredString(data["user_id"] ?? data["id"], "user id", "instagram.account"), typeof data["username"] === "string" ? data["username"] : "Instagram account"),
|
|
393
|
-
];
|
|
394
|
-
}
|
|
395
|
-
const version = validateLinkedInVersion(options.linkedinApiVersion);
|
|
396
|
-
const data = await request(fetcher, "https://api.linkedin.com/v2/userinfo", { headers: { ...auth, "LinkedIn-Version": version } }, "linkedin.account", options);
|
|
397
|
-
const subject = requiredString(data["sub"], "member id", "linkedin.account");
|
|
398
|
-
const member = account("linkedin", backend, `urn:li:person:${subject}`, typeof data["name"] === "string" ? data["name"] : "LinkedIn member");
|
|
399
|
-
let acl;
|
|
400
|
-
try {
|
|
401
|
-
acl = await request(fetcher, "https://api.linkedin.com/v2/organizationalEntityAcls?q=roleAssignee&projection=(elements*(organizationalTarget,role))", { headers: { ...auth, "LinkedIn-Version": version } }, "linkedin.organizations", options);
|
|
402
|
-
}
|
|
403
|
-
catch (error) {
|
|
404
|
-
// Member-only grants commonly cannot read organization ACLs. That is a known
|
|
405
|
-
// absence of organization evidence; transport and malformed responses still fail.
|
|
406
|
-
if (error instanceof SocialError && error.code === "missing_permission")
|
|
407
|
-
return [member];
|
|
408
|
-
throw error;
|
|
409
|
-
}
|
|
410
|
-
const elements = Array.isArray(acl["elements"]) ? acl["elements"] : [];
|
|
411
|
-
const organizations = elements.flatMap((entry) => {
|
|
412
|
-
const row = asRecord(entry, "linkedin.organizations");
|
|
413
|
-
const target = typeof row["organizationalTarget"] === "string" ? row["organizationalTarget"] : "";
|
|
414
|
-
const role = row["role"];
|
|
415
|
-
if ((role !== "ADMINISTRATOR" && role !== "DIRECT_SPONSORED_CONTENT_POSTER") ||
|
|
416
|
-
!/^urn:li:organization:[a-zA-Z0-9_-]+$/.test(target))
|
|
417
|
-
return [];
|
|
418
|
-
const id = target.slice("urn:li:organization:".length);
|
|
419
|
-
return [
|
|
420
|
-
account("linkedin", backend, `urn:li:organization:${id}`, `LinkedIn organization ${id}`),
|
|
421
|
-
];
|
|
422
|
-
});
|
|
423
|
-
return [member, ...organizations];
|
|
424
|
-
}
|
|
425
|
-
async function exchangeLongLived(kind, options, current) {
|
|
426
|
-
if (!options.clientSecret)
|
|
427
|
-
fail("oauth.exchange", "A clientSecret is required for long-lived token exchange", "invalid_config");
|
|
428
|
-
const endpoint = kind === "threads"
|
|
429
|
-
? "https://graph.threads.net/access_token"
|
|
430
|
-
: "https://graph.instagram.com/access_token";
|
|
431
|
-
const params = new URLSearchParams({
|
|
432
|
-
grant_type: kind === "threads" ? "th_exchange_token" : "ig_exchange_token",
|
|
433
|
-
client_secret: options.clientSecret,
|
|
434
|
-
access_token: current.accessToken,
|
|
435
|
-
});
|
|
436
|
-
return tokenSet(await request(options.fetch ?? webFetch, `${endpoint}?${params.toString()}`, { headers: { accept: "application/json" } }, `oauth.${kind}.exchange`, options), `oauth.${kind}.exchange`);
|
|
437
|
-
}
|
|
438
|
-
/** Exchange a short-lived Threads or Instagram Login token for a long-lived token. */
|
|
439
|
-
export async function exchangeLongLivedOAuthToken(kind, options, current) {
|
|
440
|
-
return exchangeLongLived(kind, options, current);
|
|
441
|
-
}
|
|
442
|
-
export const youtubeOAuth = (options) => oauthProvider("youtube", options);
|
|
443
|
-
export const xOAuth = (options) => oauthProvider("x", options);
|
|
444
|
-
export const threadsOAuth = (options) => oauthProvider("threads", options);
|
|
445
|
-
export const tiktokOAuth = (options) => oauthProvider("tiktok", options);
|
|
446
|
-
export const instagramOAuth = (options) => oauthProvider("instagram", options);
|
|
447
|
-
export const linkedinOAuth = (options) => oauthProvider("linkedin", options);
|
|
448
|
-
export async function refreshOAuthToken(kind, options, current) {
|
|
449
|
-
if (kind === "threads" || kind === "instagram") {
|
|
450
|
-
const endpoint = kind === "threads"
|
|
451
|
-
? "https://graph.threads.net/refresh_access_token"
|
|
452
|
-
: "https://graph.instagram.com/refresh_access_token";
|
|
453
|
-
const grant = kind === "threads" ? "th_refresh_token" : "ig_refresh_token";
|
|
454
|
-
const params = new URLSearchParams({ grant_type: grant, access_token: current.accessToken });
|
|
455
|
-
const next = tokenSet(await request(options.fetch ?? webFetch, `${endpoint}?${params.toString()}`, { headers: { accept: "application/json" } }, `oauth.${kind}.refresh`, options), `oauth.${kind}.refresh`);
|
|
456
|
-
return next.refreshToken
|
|
457
|
-
? next
|
|
458
|
-
: {
|
|
459
|
-
...next,
|
|
460
|
-
...(current.refreshToken === undefined ? {} : { refreshToken: current.refreshToken }),
|
|
461
|
-
};
|
|
462
|
-
}
|
|
463
|
-
if (!current.refreshToken)
|
|
464
|
-
fail("oauth.refresh", "No refresh token is available; reconnect the account", "reconnect_required");
|
|
465
|
-
const cfg = configs[kind];
|
|
466
|
-
const form = new URLSearchParams({
|
|
467
|
-
grant_type: "refresh_token",
|
|
468
|
-
refresh_token: current.refreshToken,
|
|
469
|
-
[cfg.clientKey]: options.clientId,
|
|
470
|
-
});
|
|
471
|
-
if (options.clientSecret)
|
|
472
|
-
form.set("client_secret", options.clientSecret);
|
|
473
|
-
const next = tokenSet(await request(options.fetch ?? webFetch, cfg.token, {
|
|
474
|
-
method: "POST",
|
|
475
|
-
headers: {
|
|
476
|
-
"content-type": "application/x-www-form-urlencoded",
|
|
477
|
-
accept: "application/json",
|
|
478
|
-
},
|
|
479
|
-
body: form,
|
|
480
|
-
}, "oauth.refresh", options), "oauth.refresh");
|
|
481
|
-
return next.refreshToken ? next : { ...next, refreshToken: current.refreshToken };
|
|
482
|
-
}
|
|
483
|
-
//# sourceMappingURL=oauth.js.map
|
package/dist/server/oauth.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"oauth.js","sourceRoot":"","sources":["../../src/server/oauth.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,mBAAmB,EAAiB,MAAM,kBAAkB,CAAC;AAiDtE,MAAM,OAAO,GAAyC;IACpD,OAAO,EAAE;QACP,IAAI,EAAE,8CAA8C;QACpD,KAAK,EAAE,qCAAqC;QAC5C,MAAM,EAAE;YACN,QAAQ;YACR,kDAAkD;YAClD,kDAAkD;SACnD;QACD,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,WAAW;KACvB;IACD,CAAC,EAAE;QACD,IAAI,EAAE,sCAAsC;QAC5C,KAAK,EAAE,kCAAkC;QACzC,MAAM,EAAE,CAAC,YAAY,EAAE,YAAY,EAAE,gBAAgB,CAAC;QACtD,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,WAAW;KACvB;IACD,OAAO,EAAE;QACP,IAAI,EAAE,qCAAqC;QAC3C,KAAK,EAAE,8CAA8C;QACrD,MAAM,EAAE,CAAC,eAAe,EAAE,yBAAyB,CAAC;QACpD,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,WAAW;KACvB;IACD,MAAM,EAAE;QACN,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,6CAA6C;QACpD,MAAM,EAAE,CAAC,iBAAiB,EAAE,eAAe,CAAC;QAC5C,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,IAAI;QACV,SAAS,EAAE,YAAY;KACxB;IACD,SAAS,EAAE;QACT,IAAI,EAAE,2CAA2C;QACjD,KAAK,EAAE,8CAA8C;QACrD,MAAM,EAAE,CAAC,0BAA0B,EAAE,oCAAoC,CAAC;QAC1E,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,WAAW;KACvB;IACD,QAAQ,EAAE;QACR,IAAI,EAAE,iDAAiD;QACvD,KAAK,EAAE,+CAA+C;QACtD,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,iBAAiB,CAAC;QAChD,cAAc,EAAE,GAAG;QACnB,IAAI,EAAE,KAAK;QACX,SAAS,EAAE,WAAW;KACvB;CACF,CAAC;AAEF,MAAM,kBAAkB,GAAG,MAAM,CAAC;AAClC,MAAM,0BAA0B,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,MAAM,QAAQ,GAAG,CAAC,GAAG,IAA8B,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;AAElF,SAAS,IAAI,CACX,SAAiB,EACjB,OAAe,EACf,OASuB,kBAAkB,EACzC,KAAe;IAEf,MAAM,IAAI,WAAW,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;AAC7D,CAAC;AACD,SAAS,QAAQ,CAAC,KAAc,EAAE,SAAS,GAAG,gBAAgB;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrE,IAAI,CAAC,SAAS,EAAE,6CAA6C,CAAC,CAAC;IACjE,OAAO,KAAgC,CAAC;AAC1C,CAAC;AACD,SAAS,cAAc,CAAC,KAAc,EAAE,KAAa,EAAE,SAAS,GAAG,gBAAgB;IACjF,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,IAAI;QACxE,IAAI,CAAC,SAAS,EAAE,sCAAsC,KAAK,EAAE,CAAC,CAAC;IACjE,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,cAAc,CAAC,KAAc;IACpC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnG,CAAC;AACD,SAAS,gBAAgB,CAAC,MAAc,EAAE,SAAiB;IACzD,IAAI,MAAM,KAAK,GAAG;QAChB,IAAI,CACF,SAAS,EACT,+DAA+D,EAC/D,oBAAoB,CACrB,CAAC;IACJ,IAAI,MAAM,KAAK,GAAG;QAChB,IAAI,CACF,SAAS,EACT,8DAA8D,EAC9D,oBAAoB,CACrB,CAAC;IACJ,IAAI,MAAM,KAAK,GAAG;QAChB,MAAM,IAAI,WAAW,CAAC;YACpB,IAAI,EAAE,cAAc;YACpB,SAAS;YACT,OAAO,EAAE,yCAAyC;YAClD,cAAc,EAAE,MAAM;YACtB,gBAAgB,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,IAAI,EAAE;SACzD,CAAC,CAAC;IACL,MAAM,IAAI,WAAW,CAAC;QACpB,IAAI,EAAE,kBAAkB;QACxB,SAAS;QACT,OAAO,EAAE,+BAA+B;QACxC,cAAc,EAAE,MAAM;KACvB,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,QAAkB,EAClB,QAAgB,EAChB,SAAiB;IAEjB,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,QAAQ,GAAG,CAAC;QACjD,IAAI,CAAC,cAAc,EAAE,kDAAkD,EAAE,eAAe,CAAC,CAAC;IAC5F,IAAI,CAAC,QAAQ,CAAC,IAAI;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;IACzC,MAAM,MAAM,GAAiB,EAAE,CAAC;IAChC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,SAAS,CAAC;YACR,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAC;YACjC,IAAI,IAAI,CAAC,IAAI;gBAAE,MAAM;YACrB,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;YAC/B,IAAI,KAAK,GAAG,QAAQ,EAAE,CAAC;gBACrB,MAAM,MAAM,CAAC,MAAM,EAAE,CAAC;gBACtB,IAAI,CACF,SAAS,EACT,4DAA4D,EAC5D,kBAAkB,CACnB,CAAC;YACJ,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,CAAC,WAAW,EAAE,CAAC;IACvB,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IACrC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;AAC1C,CAAC;AAED,KAAK,UAAU,IAAI,CACjB,QAAkB,EAClB,SAAiB,EACjB,QAAgB;IAEhB,MAAM,GAAG,GAAG,MAAM,WAAW,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;IACtE,MAAM,WAAW,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;IAC9E,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE;QAAE,IAAI,CAAC,SAAS,EAAE,2CAA2C,CAAC,CAAC;IACpF,IACE,WAAW,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACxC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC;QAC7B,GAAG,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAC/B,CAAC;QACD,IAAI,CAAC;YACH,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,SAAS,CAAC,CAAC;QAC9C,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;QAC5D,CAAC;IACH,CAAC;IACD,IAAI,WAAW,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,GAAG,CAAC,CAAC;QACxC,IAAI,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,KAAK,CAAC;YACjC,IAAI,CAAC,SAAS,EAAE,6CAA6C,CAAC,CAAC;QACjE,OAAO,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,SAAS,EAAE,wDAAwD,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,WAAW,CAAC,KAAc;IACjC,MAAM,KAAK,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;AACjF,CAAC;AACD,SAAS,QAAQ,CAAC,IAA6B,EAAE,SAAS,GAAG,aAAa;IACxE,MAAM,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,EAAE,cAAc,EAAE,SAAS,CAAC,CAAC;IACpF,MAAM,OAAO,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC;IACnC,IAAI,SAA6B,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,OAAO,GACX,OAAO,OAAO,KAAK,QAAQ;YACzB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC9D,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;gBACjB,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;QACnB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,GAAG,CAAC,IAAI,OAAO,GAAG,cAAc;YACtE,IAAI,CAAC,SAAS,EAAE,mDAAmD,CAAC,CAAC;QACvE,SAAS,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,GAAG,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAClE,CAAC;IACD,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAC3D,MAAM,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;IACrD,OAAO;QACL,WAAW;QACX,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC;QACvD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;QAC3C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC;AACJ,CAAC;AAKD,SAAS,WAAW,CAAC,IAA6B,EAAE,IAAkB;IACpE,MAAM,MAAM,GACV,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACjG,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC/B,MAAM,WAAW,GAAG,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,cAAc,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC;IAC3F,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AAC1E,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAqB,EACrB,GAAW,EACX,IAAiB,EACjB,SAAiB,EACjB,OAA6B;IAE7B,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAC;IAC1D,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,IAAI,SAAS,GAAG,CAAC;QACnD,IAAI,CAAC,cAAc,EAAE,2CAA2C,EAAE,eAAe,CAAC,CAAC;IACrF,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,SAAoD,CAAC;IACzD,IAAI,CAAC;QACH,yEAAyE;QACzE,8DAA8D;QAC9D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YAC/C,SAAS,GAAG,UAAU,CACpB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,YAAY,CAAC,yBAAyB,EAAE,YAAY,CAAC,CAAC,EACvE,SAAS,CACV,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAClC,OAAO,CAAC,GAAG,EAAE,EAAE,GAAG,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC;YACvE,OAAO;SACR,CAAC,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,IAAI,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,gBAAgB,IAAI,0BAA0B,CAAC;YACjF,OAAO;SACR,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,WAAW;YAAE,MAAM,KAAK,CAAC;QAC9C,IACE,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,CAAC;YAC9D,CAAC,OAAO,KAAK,KAAK,QAAQ;gBACxB,KAAK,KAAK,IAAI;gBACd,MAAM,IAAI,KAAK;gBACd,KAA4B,CAAC,IAAI,KAAK,YAAY,CAAC;YAEtD,IAAI,CAAC,SAAS,EAAE,kCAAkC,EAAE,SAAS,CAAC,CAAC;QACjE,IAAI,CAAC,SAAS,EAAE,+BAA+B,EAAE,kBAAkB,EAAE,KAAK,CAAC,CAAC;IAC9E,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;QACpB,IAAI,SAAS,KAAK,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACvD,CAAC;IACD,IAAI,CAAC,gBAAgB,EAAE,wCAAwC,CAAC,CAAC;AACnE,CAAC;AAED,SAAS,OAAO,CAAC,QAAkB,EAAE,OAAe,EAAE,EAAU,EAAE,IAAY;IAC5E,OAAO,EAAE,GAAG,EAAE,mBAAmB,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;AAC/F,CAAC;AACD,SAAS,uBAAuB,CAAC,KAAyB;IACxD,IAAI,KAAK,KAAK,SAAS,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC;QAChE,IAAI,CAAC,cAAc,EAAE,wDAAwD,EAAE,eAAe,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC;AACf,CAAC;AACD,SAAS,gBAAgB,CAAC,KAGzB;IACC,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,sBAAsB,EAAE,+BAA+B,EAAE,eAAe,CAAC,CAAC;IACjF,CAAC;IACD,IAAI,QAAa,CAAC;IAClB,IAAI,CAAC;QACH,QAAQ,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,sBAAsB,EAAE,uCAAuC,EAAE,eAAe,CAAC,CAAC;IACzF,CAAC;IACD,IACE,QAAQ,CAAC,MAAM,KAAK,QAAQ,CAAC,MAAM;QACnC,QAAQ,CAAC,QAAQ,KAAK,QAAQ,CAAC,QAAQ;QACvC,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,QAAQ;QACjB,QAAQ,CAAC,IAAI;QAEb,IAAI,CACF,sBAAsB,EACtB,uDAAuD,EACvD,cAAc,CACf,CAAC;IACJ,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,QAAQ,CAAC,YAAY;QAC9C,IAAI,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK;YAC5F,IAAI,CACF,sBAAsB,EACtB,uDAAuD,EACvD,cAAc,CACf,CAAC;IACN,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,KAAK;QAC1D,IAAI,CACF,sBAAsB,EACtB,8DAA8D,EAC9D,cAAc,CACf,CAAC;IACJ,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,SAAS,gBAAgB,CACvB,IAAkB,EAClB,IAAwB,EACxB,UAAwC;IAExC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO;IAC/B,MAAM,UAAU,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACxE,IACE,CAAC,UAAU,CAAC,IAAI,CACd,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,KAAK,UAAU,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC,CACvF;QAED,IAAI,CACF,gBAAgB,EAChB,2DAA2D,EAC3D,cAAc,CACf,CAAC;AACN,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,IAAkB,EAClB,OAA6B;IAE7B,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,CAAC,cAAc,EAAE,sBAAsB,EAAE,eAAe,CAAC,CAAC;IAC5F,IAAI,IAAI,KAAK,UAAU;QAAE,uBAAuB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC7E,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,IAAI,QAAQ,CAAC;IAC1C,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;IAC5C,OAAO;QACL,KAAK,CAAC,KAAK,CAAC,KAAK;YACf,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC;gBACjC,IAAI,CACF,mBAAmB,EACnB,kBAAkB,IAAI,2CAA2C,EACjE,eAAe,CAChB,CAAC;YACJ,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,OAAO,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW;gBAChF,IAAI,CACF,mBAAmB,EACnB,0DAA0D,EAC1D,eAAe,CAChB,CAAC;YACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC9B,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC;YACxD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;YAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC;YAC/D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;gBAC/C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC;YAC5C,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC;gBACb,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC5D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;YACxD,CAAC;YACD,OAAO,EAAE,gBAAgB,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC;QAC9C,CAAC;QACD,KAAK,CAAC,QAAQ,CAAC,KAAK;YAClB,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,CAAC;YACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAClD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,SAAS,GACb,MAAM,KAAK,eAAe;oBAC1B,MAAM,KAAK,aAAa;oBACxB,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,KAAK,aAAa,CAAC;gBAC9D,IAAI,CACF,sBAAsB,EACtB,6CAA6C,EAC7C,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,CACzC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,GAAG,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC/C,IAAI,CAAC,IAAI;gBACP,IAAI,CACF,sBAAsB,EACtB,sDAAsD,EACtD,eAAe,CAChB,CAAC;YACJ,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;gBAC/B,UAAU,EAAE,oBAAoB;gBAChC,IAAI;gBACJ,YAAY,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;gBACvC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,QAAQ;aAClC,CAAC,CAAC;YACH,IAAI,GAAG,CAAC,IAAI;gBAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACpE,IAAI,OAAO,CAAC,YAAY;gBAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;YAC1E,MAAM,GAAG,GAAG,MAAM,OAAO,CACvB,OAAO,EACP,GAAG,CAAC,KAAK,EACT;gBACE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;oBACnD,MAAM,EAAE,kBAAkB;iBAC3B;gBACD,IAAI,EAAE,IAAI;aACX,EACD,aAAa,EACb,OAAO,CACR,CAAC;YACF,IAAI,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACpC,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,CAAC,IAAI,OAAO,CAAC,YAAY;gBACtE,MAAM,GAAG;oBACP,KAAK,EAAE,MAAM,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC;oBAC3D,GAAG,CAAC,MAAM,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC;iBACjF,CAAC;YACJ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAC7B,IAAI,EACJ,MAAM,CAAC,KAAK,EACZ,MAAM,CAAC,WAAW,EAClB,KAAK,CAAC,OAAO,CAAC,OAAO,EACrB,OAAO,EACP,OAAO,CACR,CAAC;YACF,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;YACrD,KAAK,MAAM,IAAI,IAAI,QAAQ;gBACzB,IAAI,OAAO,CAAC,cAAc;oBACxB,MAAM,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC;wBAChC,OAAO,EAAE,IAAI;wBACb,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,OAAO,EAAE,KAAK,CAAC,OAAO;qBACvB,CAAC,CAAC;YACP,OAAO,QAAQ,CAAC;QAClB,CAAC;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,QAAQ,CACrB,IAAkB,EAClB,KAAoB,EACpB,KAAyB,EACzB,OAAe,EACf,OAAqB,EACrB,OAA6B;IAE7B,MAAM,IAAI,GAAG,EAAE,aAAa,EAAE,UAAU,KAAK,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC1F,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,0EAA0E,EAC1E,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,iBAAiB,EACjB,OAAO,CACR,CAAC;QACF,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YACxB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC,CAAC;YAC9C,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,iBAAiB,CAAC,CAAC;YAClE,OAAO,OAAO,CACZ,SAAS,EACT,OAAO,EACP,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,iBAAiB,CAAC,EAC1D,OAAO,OAAO,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAC5E,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,8BAA8B,EAC9B,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,WAAW,EACX,OAAO,CACR,CAAC;QACF,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC,CAAC;QAChD,OAAO;YACL,OAAO,CACL,GAAG,EACH,OAAO,EACP,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,WAAW,CAAC,EACjD,OAAO,GAAG,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,CAC5D;SACF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,OAAO,CAAC,iBAAiB,IAAI,MAAM,CAAC;QACpD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,gCAAgC,EAAE,eAAe,CAAC,CAAC;QAC1E,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,6BAA6B,OAAO,wBAAwB,EAC5D,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,iBAAiB,EACjB,OAAO,CACR,CAAC;QACF,OAAO;YACL,OAAO,CACL,SAAS,EACT,OAAO,EACP,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,iBAAiB,CAAC,EACxD,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAC5E;SACF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtB,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,uEAAuE,EACvE,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,gBAAgB,EAChB,OAAO,CACR,CAAC;QACF,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,gBAAgB,CAAC,CAAC;QACrD,OAAO;YACL,OAAO,CACL,QAAQ,EACR,OAAO,EACP,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAC5D,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,gBAAgB,CACnF;SACF,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC;QACvD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;YAC9B,IAAI,CAAC,cAAc,EAAE,kCAAkC,EAAE,eAAe,CAAC,CAAC;QAC5E,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,+BAA+B,OAAO,gCAAgC,EACtE,EAAE,OAAO,EAAE,IAAI,EAAE,EACjB,mBAAmB,EACnB,OAAO,CACR,CAAC;QACF,OAAO;YACL,OAAO,CACL,WAAW,EACX,OAAO,EACP,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,mBAAmB,CAAC,EAC7E,OAAO,IAAI,CAAC,UAAU,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAC9E;SACF,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,uBAAuB,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC;IACpE,MAAM,IAAI,GAAG,MAAM,OAAO,CACxB,OAAO,EACP,sCAAsC,EACtC,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EACrD,kBAAkB,EAClB,OAAO,CACR,CAAC;IACF,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,kBAAkB,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAG,OAAO,CACpB,UAAU,EACV,OAAO,EACP,iBAAiB,OAAO,EAAE,EAC1B,OAAO,IAAI,CAAC,MAAM,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,iBAAiB,CACpE,CAAC;IACF,IAAI,GAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,OAAO,CACjB,OAAO,EACP,uHAAuH,EACvH,EAAE,OAAO,EAAE,EAAE,GAAG,IAAI,EAAE,kBAAkB,EAAE,OAAO,EAAE,EAAE,EACrD,wBAAwB,EACxB,OAAO,CACR,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,6EAA6E;QAC7E,kFAAkF;QAClF,IAAI,KAAK,YAAY,WAAW,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB;YAAE,OAAO,CAAC,MAAM,CAAC,CAAC;QACzF,MAAM,KAAK,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,MAAM,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,wBAAwB,CAAC,CAAC;QACtD,MAAM,MAAM,GACV,OAAO,GAAG,CAAC,sBAAsB,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrF,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;QACzB,IACE,CAAC,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,iCAAiC,CAAC;YACxE,CAAC,sCAAsC,CAAC,IAAI,CAAC,MAAM,CAAC;YAEpD,OAAO,EAAE,CAAC;QACZ,MAAM,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC;QACvD,OAAO;YACL,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,uBAAuB,EAAE,EAAE,EAAE,yBAAyB,EAAE,EAAE,CAAC;SACzF,CAAC;IACJ,CAAC,CAAC,CAAC;IACH,OAAO,CAAC,MAAM,EAAE,GAAG,aAAa,CAAC,CAAC;AACpC,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAA6B,EAC7B,OAA6B,EAC7B,OAAsB;IAEtB,IAAI,CAAC,OAAO,CAAC,YAAY;QACvB,IAAI,CACF,gBAAgB,EAChB,0DAA0D,EAC1D,gBAAgB,CACjB,CAAC;IACJ,MAAM,QAAQ,GACZ,IAAI,KAAK,SAAS;QAChB,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,0CAA0C,CAAC;IACjD,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC;QACjC,UAAU,EAAE,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,mBAAmB;QAC1E,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,YAAY,EAAE,OAAO,CAAC,WAAW;KAClC,CAAC,CAAC;IACH,OAAO,QAAQ,CACb,MAAM,OAAO,CACX,OAAO,CAAC,KAAK,IAAI,QAAQ,EACzB,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAClC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAC3C,SAAS,IAAI,WAAW,EACxB,OAAO,CACR,EACD,SAAS,IAAI,WAAW,CACzB,CAAC;AACJ,CAAC;AAED,sFAAsF;AACtF,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAC/C,IAA6B,EAC7B,OAA6B,EAC7B,OAAsB;IAEtB,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjG,MAAM,CAAC,MAAM,MAAM,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AACrF,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;AACjG,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC/F,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,OAA6B,EAAE,EAAE,CAC9D,aAAa,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,OAA6B,EAAE,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;AAEnG,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAkB,EAClB,OAA6B,EAC7B,OAAsB;IAEtB,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/C,MAAM,QAAQ,GACZ,IAAI,KAAK,SAAS;YAChB,CAAC,CAAC,gDAAgD;YAClD,CAAC,CAAC,kDAAkD,CAAC;QACzD,MAAM,KAAK,GAAG,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,kBAAkB,CAAC;QAC3E,MAAM,MAAM,GAAG,IAAI,eAAe,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,YAAY,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7F,MAAM,IAAI,GAAG,QAAQ,CACnB,MAAM,OAAO,CACX,OAAO,CAAC,KAAK,IAAI,QAAQ,EACzB,GAAG,QAAQ,IAAI,MAAM,CAAC,QAAQ,EAAE,EAAE,EAClC,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,kBAAkB,EAAE,EAAE,EAC3C,SAAS,IAAI,UAAU,EACvB,OAAO,CACR,EACD,SAAS,IAAI,UAAU,CACxB,CAAC;QACF,OAAO,IAAI,CAAC,YAAY;YACtB,CAAC,CAAC,IAAI;YACN,CAAC,CAAC;gBACE,GAAG,IAAI;gBACP,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;aACtF,CAAC;IACR,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,YAAY;QACvB,IAAI,CACF,eAAe,EACf,sDAAsD,EACtD,oBAAoB,CACrB,CAAC;IACJ,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;QAC/B,UAAU,EAAE,eAAe;QAC3B,aAAa,EAAE,OAAO,CAAC,YAAY;QACnC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,QAAQ;KAClC,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,YAAY;QAAE,IAAI,CAAC,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,QAAQ,CACnB,MAAM,OAAO,CACX,OAAO,CAAC,KAAK,IAAI,QAAQ,EACzB,GAAG,CAAC,KAAK,EACT;QACE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE;YACP,cAAc,EAAE,mCAAmC;YACnD,MAAM,EAAE,kBAAkB;SAC3B;QACD,IAAI,EAAE,IAAI;KACX,EACD,eAAe,EACf,OAAO,CACR,EACD,eAAe,CAChB,CAAC;IACF,OAAO,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;AACpF,CAAC"}
|