@sendbird/cli 0.0.0-stage → 0.4.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/.claude-plugin/plugin.json +11 -0
- package/.codex-plugin/plugin.json +39 -0
- package/LICENSE +13 -0
- package/NOTICE.md +1105 -0
- package/PROVENANCE.md +15 -0
- package/README.md +44 -2
- package/dist/acl.d.ts +2 -0
- package/dist/acl.js +12 -0
- package/dist/acl.js.map +1 -0
- package/dist/billing-plan.d.ts +68 -0
- package/dist/billing-plan.js +235 -0
- package/dist/billing-plan.js.map +1 -0
- package/dist/browser.d.ts +1 -0
- package/dist/browser.js +20 -0
- package/dist/browser.js.map +1 -0
- package/dist/calls-catalog.d.ts +79 -0
- package/dist/calls-catalog.js +322 -0
- package/dist/calls-catalog.js.map +1 -0
- package/dist/calls-credits.d.ts +31 -0
- package/dist/calls-credits.js +224 -0
- package/dist/calls-credits.js.map +1 -0
- package/dist/calls-trial.d.ts +45 -0
- package/dist/calls-trial.js +77 -0
- package/dist/calls-trial.js.map +1 -0
- package/dist/calls.d.ts +10 -0
- package/dist/calls.js +470 -0
- package/dist/calls.js.map +1 -0
- package/dist/catalog.d.ts +67 -0
- package/dist/catalog.js +784 -0
- package/dist/catalog.js.map +1 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.js +502 -0
- package/dist/cli.js.map +1 -0
- package/dist/core.d.ts +86 -0
- package/dist/core.js +531 -0
- package/dist/core.js.map +1 -0
- package/dist/diagnostics.d.ts +206 -0
- package/dist/diagnostics.js +664 -0
- package/dist/diagnostics.js.map +1 -0
- package/dist/discovery.d.ts +703 -0
- package/dist/discovery.js +846 -0
- package/dist/discovery.js.map +1 -0
- package/dist/docs.d.ts +31 -0
- package/dist/docs.js +139 -0
- package/dist/docs.js.map +1 -0
- package/dist/features.d.ts +131 -0
- package/dist/features.js +227 -0
- package/dist/features.js.map +1 -0
- package/dist/generated-api.d.ts +116 -0
- package/dist/generated-api.js +118 -0
- package/dist/generated-api.js.map +1 -0
- package/dist/human-format.d.ts +40 -0
- package/dist/human-format.js +205 -0
- package/dist/human-format.js.map +1 -0
- package/dist/human-list.d.ts +2 -0
- package/dist/human-list.js +368 -0
- package/dist/human-list.js.map +1 -0
- package/dist/human-output.d.ts +10 -0
- package/dist/human-output.js +1351 -0
- package/dist/human-output.js.map +1 -0
- package/dist/human-pro.d.ts +3 -0
- package/dist/human-pro.js +201 -0
- package/dist/human-pro.js.map +1 -0
- package/dist/human-progress.d.ts +5 -0
- package/dist/human-progress.js +49 -0
- package/dist/human-progress.js.map +1 -0
- package/dist/local.d.ts +42 -0
- package/dist/local.js +707 -0
- package/dist/local.js.map +1 -0
- package/dist/oauth-callback.d.ts +3 -0
- package/dist/oauth-callback.js +66 -0
- package/dist/oauth-callback.js.map +1 -0
- package/dist/oauth-lock.d.ts +6 -0
- package/dist/oauth-lock.js +212 -0
- package/dist/oauth-lock.js.map +1 -0
- package/dist/oauth.d.ts +32 -0
- package/dist/oauth.js +493 -0
- package/dist/oauth.js.map +1 -0
- package/dist/presentation.d.ts +208 -0
- package/dist/presentation.js +156 -0
- package/dist/presentation.js.map +1 -0
- package/dist/pro-api-catalog.d.ts +24 -0
- package/dist/pro-api-catalog.js +619 -0
- package/dist/pro-api-catalog.js.map +1 -0
- package/dist/pro-api.d.ts +10 -0
- package/dist/pro-api.js +338 -0
- package/dist/pro-api.js.map +1 -0
- package/dist/project.d.ts +34 -0
- package/dist/project.js +62 -0
- package/dist/project.js.map +1 -0
- package/dist/recovery.d.ts +41 -0
- package/dist/recovery.js +417 -0
- package/dist/recovery.js.map +1 -0
- package/dist/runner.d.ts +47 -0
- package/dist/runner.js +603 -0
- package/dist/runner.js.map +1 -0
- package/dist/sdk-catalog.d.ts +69 -0
- package/dist/sdk-catalog.js +527 -0
- package/dist/sdk-catalog.js.map +1 -0
- package/dist/sdk-config.d.ts +19 -0
- package/dist/sdk-config.js +85 -0
- package/dist/sdk-config.js.map +1 -0
- package/dist/sdk-dto.d.ts +244 -0
- package/dist/sdk-dto.js +98 -0
- package/dist/sdk-dto.js.map +1 -0
- package/dist/sdk-limits.d.ts +2 -0
- package/dist/sdk-limits.js +3 -0
- package/dist/sdk-limits.js.map +1 -0
- package/dist/sdk-node-file-reader.d.ts +6 -0
- package/dist/sdk-node-file-reader.js +38 -0
- package/dist/sdk-node-file-reader.js.map +1 -0
- package/dist/sdk-pro-catalog.d.ts +22 -0
- package/dist/sdk-pro-catalog.js +234 -0
- package/dist/sdk-pro-catalog.js.map +1 -0
- package/dist/sdk-pro-runtime.d.ts +31 -0
- package/dist/sdk-pro-runtime.js +293 -0
- package/dist/sdk-pro-runtime.js.map +1 -0
- package/dist/sdk-query.d.ts +10 -0
- package/dist/sdk-query.js +29 -0
- package/dist/sdk-query.js.map +1 -0
- package/dist/sdk-runtime.d.ts +15 -0
- package/dist/sdk-runtime.js +685 -0
- package/dist/sdk-runtime.js.map +1 -0
- package/dist/sdk-worker.d.ts +1 -0
- package/dist/sdk-worker.js +26 -0
- package/dist/sdk-worker.js.map +1 -0
- package/dist/sdk.d.ts +29 -0
- package/dist/sdk.js +346 -0
- package/dist/sdk.js.map +1 -0
- package/dist/search-engine.d.ts +17 -0
- package/dist/search-engine.js +54 -0
- package/dist/search-engine.js.map +1 -0
- package/dist/search-intents.d.ts +2 -0
- package/dist/search-intents.js +106 -0
- package/dist/search-intents.js.map +1 -0
- package/dist/search.d.ts +7 -0
- package/dist/search.js +58 -0
- package/dist/search.js.map +1 -0
- package/dist/secret-output.d.ts +2 -0
- package/dist/secret-output.js +108 -0
- package/dist/secret-output.js.map +1 -0
- package/dist/shell.d.ts +3 -0
- package/dist/shell.js +14 -0
- package/dist/shell.js.map +1 -0
- package/dist/skills.d.ts +210 -0
- package/dist/skills.js +374 -0
- package/dist/skills.js.map +1 -0
- package/dist/value-semantics.d.ts +70 -0
- package/dist/value-semantics.js +173 -0
- package/dist/value-semantics.js.map +1 -0
- package/dist/version.d.ts +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/dist/windows.d.ts +4 -0
- package/dist/windows.js +136 -0
- package/dist/windows.js.map +1 -0
- package/dist/workflows.d.ts +228 -0
- package/dist/workflows.js +1207 -0
- package/dist/workflows.js.map +1 -0
- package/package.json +90 -4
- package/plugin.json +25 -0
- package/references/agent-guide.json +199 -0
- package/references/commands.md +247 -0
- package/references/dashboard-inventory.json +14796 -0
- package/references/docs-index.json +5329 -0
- package/references/sdk-commands.json +15065 -0
- package/references/workflows.json +1246 -0
- package/skills/sendbird/SKILL.md +96 -0
- package/skills/sendbird/agents/openai.yaml +4 -0
- package/skills/sendbird/references/build-chat-app.md +50 -0
- package/skills/sendbird/references/client-guide.md +34 -0
- package/skills/sendbird/references/client-plugin-bridge.md +77 -0
- package/skills/sendbird/references/client-plugin-install.md +39 -0
- package/skills/sendbird/references/operational-checks.md +35 -0
- package/skills/sendbird/references/pro-capabilities.md +52 -0
- package/skills/sendbird/scripts/client-guide.mjs +283 -0
- package/skills/sendbird/scripts/client-plugin-bridge.mjs +703 -0
- package/skills/sendbird-setup/SKILL.md +18 -0
- package/skills/sendbird-setup/agents/openai.yaml +4 -0
- package/skills/sendbird-setup/references/onboarding.md +73 -0
- package/skills/sendbird-setup/scripts/install-cli.mjs +447 -0
- package/skills/sendbird-setup/scripts/npm-run.mjs +34 -0
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/** Optional second step after Calls activation. Never turn a follow-up failure
|
|
2
|
+
* into a failed app creation/registration that encourages repeating the write. */
|
|
3
|
+
import { CliError } from "./core.js";
|
|
4
|
+
import { beforeCallsCredits, callsCreditDefinitions } from "./calls-credits.js";
|
|
5
|
+
export async function followCallsTrial(opts, t, activationConfirmed, claim) {
|
|
6
|
+
const next = [
|
|
7
|
+
{
|
|
8
|
+
argv: [
|
|
9
|
+
"sendbird",
|
|
10
|
+
...(opts.profile ? ["--profile", opts.profile] : []),
|
|
11
|
+
"--org-id",
|
|
12
|
+
opts.orgId,
|
|
13
|
+
"calls",
|
|
14
|
+
"credits",
|
|
15
|
+
"list",
|
|
16
|
+
"--json",
|
|
17
|
+
],
|
|
18
|
+
reason: "Inspect voucher history/status before recovery. Do not repeat app creation or activation.",
|
|
19
|
+
},
|
|
20
|
+
];
|
|
21
|
+
let claiming = false;
|
|
22
|
+
try {
|
|
23
|
+
if (!(await activationConfirmed()))
|
|
24
|
+
return {
|
|
25
|
+
status: "skipped",
|
|
26
|
+
note: "Calls activation is not confirmed. Inspect app state before requesting a trial; do not repeat app creation or activation.",
|
|
27
|
+
next,
|
|
28
|
+
};
|
|
29
|
+
// Read-only eligibility checks before offering consent. Claim rechecks them
|
|
30
|
+
// after consent because another session may have issued a voucher meanwhile.
|
|
31
|
+
await beforeCallsCredits(callsCreditDefinitions[1], t, opts.orgId);
|
|
32
|
+
if (opts.claimTrial !== true && !(await opts.confirmTrial()))
|
|
33
|
+
return {
|
|
34
|
+
status: "declined",
|
|
35
|
+
note: "Free Calls trial was not requested. App creation/activation remains accepted.",
|
|
36
|
+
next,
|
|
37
|
+
};
|
|
38
|
+
claiming = true;
|
|
39
|
+
const result = await claim();
|
|
40
|
+
return {
|
|
41
|
+
status: "accepted",
|
|
42
|
+
note: "Free trial request accepted separately from app creation/activation. Inspect voucher status and expiry; this does not prove call availability.",
|
|
43
|
+
result,
|
|
44
|
+
next,
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
catch (error) {
|
|
48
|
+
if (!claiming && error instanceof Error && error.name === "ExitPromptError")
|
|
49
|
+
return {
|
|
50
|
+
status: "declined",
|
|
51
|
+
note: "Trial confirmation was cancelled. App creation/activation remains accepted; no trial was requested.",
|
|
52
|
+
next,
|
|
53
|
+
};
|
|
54
|
+
if (!claiming &&
|
|
55
|
+
error instanceof CliError &&
|
|
56
|
+
["E_CAPABILITY", "E_PERMISSION"].includes(error.code))
|
|
57
|
+
return {
|
|
58
|
+
status: "skipped",
|
|
59
|
+
code: error.code,
|
|
60
|
+
note: "Free trial not requested: this account/organization is not eligible (OWNER, self-service, supported Chat plan and no voucher history required). Existing, expired or depleted vouchers prevent another trial.",
|
|
61
|
+
next,
|
|
62
|
+
};
|
|
63
|
+
// Never echo upstream errors: URLs, tokens and private bodies may be present.
|
|
64
|
+
return {
|
|
65
|
+
status: "failed",
|
|
66
|
+
code: error instanceof CliError ? error.code : "E_INTERNAL",
|
|
67
|
+
mutation_state: claiming
|
|
68
|
+
? error instanceof CliError
|
|
69
|
+
? (error.mutationState ?? "unknown")
|
|
70
|
+
: "unknown"
|
|
71
|
+
: "not_attempted",
|
|
72
|
+
note: "App creation/activation remains accepted. The credit step failed; inspect voucher history before recovery. A trial request can create a voucher even when activation fails. Do not retry automatically.",
|
|
73
|
+
next,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=calls-trial.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls-trial.js","sourceRoot":"","sources":["../src/calls-trial.ts"],"names":[],"mappings":"AAAA;kFACkF;AAClF,OAAO,EAAE,QAAQ,EAAkB,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAGhF,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,IAAa,EACb,CAAY,EACZ,mBAA2C,EAC3C,KAA6B;IAE7B,MAAM,IAAI,GAAG;QACX;YACE,IAAI,EAAE;gBACJ,UAAU;gBACV,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpD,UAAU;gBACV,IAAI,CAAC,KAAM;gBACX,OAAO;gBACP,SAAS;gBACT,MAAM;gBACN,QAAQ;aACT;YACD,MAAM,EACJ,2FAA2F;SAC9F;KACF,CAAC;IACF,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC;QACH,IAAI,CAAC,CAAC,MAAM,mBAAmB,EAAE,CAAC;YAChC,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,2HAA2H;gBACjI,IAAI;aACL,CAAC;QACJ,4EAA4E;QAC5E,6EAA6E;QAC7E,MAAM,kBAAkB,CAAC,sBAAsB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,YAAa,EAAE,CAAC;YAC3D,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,+EAA+E;gBACrF,IAAI;aACL,CAAC;QACJ,QAAQ,GAAG,IAAI,CAAC;QAChB,MAAM,MAAM,GAAG,MAAM,KAAK,EAAE,CAAC;QAC7B,OAAO;YACL,MAAM,EAAE,UAAU;YAClB,IAAI,EAAE,gJAAgJ;YACtJ,MAAM;YACN,IAAI;SACL,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,QAAQ,IAAI,KAAK,YAAY,KAAK,IAAI,KAAK,CAAC,IAAI,KAAK,iBAAiB;YACzE,OAAO;gBACL,MAAM,EAAE,UAAU;gBAClB,IAAI,EAAE,qGAAqG;gBAC3G,IAAI;aACL,CAAC;QACJ,IACE,CAAC,QAAQ;YACT,KAAK,YAAY,QAAQ;YACzB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YAErD,OAAO;gBACL,MAAM,EAAE,SAAS;gBACjB,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,IAAI,EAAE,+MAA+M;gBACrN,IAAI;aACL,CAAC;QACJ,8EAA8E;QAC9E,OAAO;YACL,MAAM,EAAE,QAAQ;YAChB,IAAI,EAAE,KAAK,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;YAC3D,cAAc,EAAE,QAAQ;gBACtB,CAAC,CAAC,KAAK,YAAY,QAAQ;oBACzB,CAAC,CAAC,CAAC,KAAK,CAAC,aAAa,IAAI,SAAS,CAAC;oBACpC,CAAC,CAAC,SAAS;gBACb,CAAC,CAAC,eAAe;YACnB,IAAI,EAAE,yMAAyM;YAC/M,IAAI;SACL,CAAC;IACJ,CAAC;AACH,CAAC"}
|
package/dist/calls.d.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Request, type Transport } from "./core.js";
|
|
2
|
+
import type { Options } from "./runner.js";
|
|
3
|
+
import type { Definition } from "./catalog.js";
|
|
4
|
+
export declare function callsApplicationState(value: unknown): unknown;
|
|
5
|
+
export declare function callsResponse(d: Definition, value: unknown): unknown;
|
|
6
|
+
export declare function prepareCalls(d: Definition, r: Request, opts: Options, allowFcmMetadata?: boolean): Request;
|
|
7
|
+
export declare function callsSecrets(d: Definition, value: unknown): string[];
|
|
8
|
+
export declare function callsPreview(r: Request): Request;
|
|
9
|
+
export declare function beforeCalls(d: Definition, r: Request, t: Transport): Promise<void>;
|
|
10
|
+
export declare function callsReadback(d: Definition, r: Request, t: Transport, value: unknown): Promise<unknown>;
|
package/dist/calls.js
ADDED
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { openSync, closeSync, fstatSync, readSync, constants } from "node:fs";
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
import { CliError, encodeSegment, request, redact, secretValues, } from "./core.js";
|
|
4
|
+
import { callsPushListSchema, callsActivationStateSchema, } from "./calls-catalog.js";
|
|
5
|
+
function reject(message) {
|
|
6
|
+
throw new CliError("E_VALIDATION", message, 2);
|
|
7
|
+
}
|
|
8
|
+
// Gate get_detail proxies Soda, whose Calls flag lives in attrs. App-list
|
|
9
|
+
// entries use a different DTO. Never assume a missing/conflicting flag is false.
|
|
10
|
+
export function callsApplicationState(value) {
|
|
11
|
+
if (!value || typeof value !== "object")
|
|
12
|
+
return value;
|
|
13
|
+
const app = value;
|
|
14
|
+
const attrs = app.attrs && typeof app.attrs === "object"
|
|
15
|
+
? app.attrs
|
|
16
|
+
: {};
|
|
17
|
+
const calls = attrs.sendbird_calls && typeof attrs.sendbird_calls === "object"
|
|
18
|
+
? attrs.sendbird_calls
|
|
19
|
+
: {};
|
|
20
|
+
const top = typeof app.is_calls_enabled === "boolean" ? app.is_calls_enabled : null;
|
|
21
|
+
const nested = typeof calls.enabled === "boolean" ? calls.enabled : null;
|
|
22
|
+
const conflict = top !== null && nested !== null && top !== nested;
|
|
23
|
+
return {
|
|
24
|
+
app_id: app.app_id,
|
|
25
|
+
push_enabled: typeof app.push_enabled === "boolean" ? app.push_enabled : null,
|
|
26
|
+
is_calls_enabled: conflict ? null : (nested ?? top),
|
|
27
|
+
calls_flag_source: conflict
|
|
28
|
+
? "conflict"
|
|
29
|
+
: nested !== null
|
|
30
|
+
? "attrs.sendbird_calls.enabled"
|
|
31
|
+
: top !== null
|
|
32
|
+
? "is_calls_enabled"
|
|
33
|
+
: "unknown",
|
|
34
|
+
...(typeof app.region === "string" ? { region: app.region } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
export function callsResponse(d, value) {
|
|
38
|
+
return d.name === "calls settings push get"
|
|
39
|
+
? callsApplicationState(value)
|
|
40
|
+
: value;
|
|
41
|
+
}
|
|
42
|
+
export function prepareCalls(d, r, opts, allowFcmMetadata = false) {
|
|
43
|
+
if (["chat push create", "chat push update"].includes(d.name)) {
|
|
44
|
+
// The Dashboard uses the same multipart credential contract for Chat and
|
|
45
|
+
// Calls. Adapt only the provider name for local parsing, never the wire path.
|
|
46
|
+
const parts = r.path.split("/");
|
|
47
|
+
parts[5] =
|
|
48
|
+
parts[5] === "apns"
|
|
49
|
+
? "apns_voip"
|
|
50
|
+
: parts[5] === "fcm"
|
|
51
|
+
? "fcm_voip"
|
|
52
|
+
: "huawei_voip";
|
|
53
|
+
const prepared = prepareCalls({ ...d, name: d.name.replace(/^chat/, "calls") }, { ...r, path: parts.join("/") }, opts, true);
|
|
54
|
+
return { ...prepared, path: r.path };
|
|
55
|
+
}
|
|
56
|
+
if (!d.name.startsWith("calls "))
|
|
57
|
+
return r;
|
|
58
|
+
if (opts.secretOutput)
|
|
59
|
+
reject("Calls settings and credentials cannot be exported as unredacted responses");
|
|
60
|
+
if (d.name === "calls activate")
|
|
61
|
+
return { ...r, body: { organization_uid: opts.orgId } };
|
|
62
|
+
const body = { ...r.body };
|
|
63
|
+
if (d.name === "calls settings webhook set" &&
|
|
64
|
+
body.url !== undefined &&
|
|
65
|
+
body.url !== "") {
|
|
66
|
+
try {
|
|
67
|
+
const u = new URL(String(body.url));
|
|
68
|
+
if (!["https:", "http:"].includes(u.protocol) || u.username || u.password)
|
|
69
|
+
reject("Webhook URL must be HTTP(S) without embedded credentials");
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
reject("Webhook URL must be HTTP(S) without embedded credentials");
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
if (d.name === "calls settings general set" &&
|
|
76
|
+
body.direct_call_recording_timestamp_timezone !== undefined &&
|
|
77
|
+
body.direct_call_recording_timestamp_timezone !== "") {
|
|
78
|
+
try {
|
|
79
|
+
new Intl.DateTimeFormat("en", {
|
|
80
|
+
timeZone: String(body.direct_call_recording_timestamp_timezone),
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
reject("Use a supported recording timezone, for example UTC or Asia/Seoul");
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
if (d.name === "calls settings webhook set" &&
|
|
88
|
+
body.enabled === true &&
|
|
89
|
+
body.url === "")
|
|
90
|
+
reject("Enabling a Webhook requires a nonempty URL");
|
|
91
|
+
if (!["calls push create", "calls push update"].includes(d.name))
|
|
92
|
+
return r;
|
|
93
|
+
const type = r.path.split("/")[5];
|
|
94
|
+
const apns = type === "apns_voip" || type === "calls_apns_remote";
|
|
95
|
+
const fcm = type === "fcm_voip";
|
|
96
|
+
// Multipart has no JSON null value. Do not turn a requested clear into
|
|
97
|
+
// the literal sound filename "null" or guess a provider-specific reset.
|
|
98
|
+
if ((apns || fcm) && body.push_sound === null)
|
|
99
|
+
reject("APNs and FCM multipart push_sound must be a string; null clearing is not supported");
|
|
100
|
+
const allowed = apns
|
|
101
|
+
? [
|
|
102
|
+
"format",
|
|
103
|
+
"environment",
|
|
104
|
+
"apns_bundle_id",
|
|
105
|
+
"apns_key_id",
|
|
106
|
+
"apns_team_id",
|
|
107
|
+
"apns_cert_password",
|
|
108
|
+
"push_sound",
|
|
109
|
+
]
|
|
110
|
+
: fcm
|
|
111
|
+
? ["push_sound"]
|
|
112
|
+
: ["huawei_app_id", "huawei_app_secret", "push_sound"];
|
|
113
|
+
if (Object.keys(body).some((key) => !allowed.includes(key)))
|
|
114
|
+
reject("Push payload contains fields for a different provider");
|
|
115
|
+
if (!apns && !fcm) {
|
|
116
|
+
if (opts.credentialFile)
|
|
117
|
+
reject("Huawei uses a private JSON body, not --credential-file");
|
|
118
|
+
if (d.method === "POST" && (!body.huawei_app_id || !body.huawei_app_secret))
|
|
119
|
+
reject("Huawei creation requires huawei_app_id and huawei_app_secret in --body-file");
|
|
120
|
+
if (d.method === "PUT" && body.huawei_app_secret !== undefined)
|
|
121
|
+
reject("Dashboard Huawei updates do not replace the secret; create a new configuration instead");
|
|
122
|
+
if (!Object.keys(body).length)
|
|
123
|
+
reject("Supply a Huawei setting to update");
|
|
124
|
+
return r;
|
|
125
|
+
}
|
|
126
|
+
if (apns) {
|
|
127
|
+
if (!body.format || !body.environment)
|
|
128
|
+
reject("APNs requires format p8|p12 and environment production|development");
|
|
129
|
+
if (body.format === "p8" &&
|
|
130
|
+
(!body.apns_key_id || !body.apns_team_id || !body.apns_bundle_id))
|
|
131
|
+
reject("p8 requires apns_key_id, apns_team_id, and apns_bundle_id");
|
|
132
|
+
if (body.format === "p12" &&
|
|
133
|
+
["apns_key_id", "apns_team_id", "apns_bundle_id"].some((k) => body[k] !== undefined))
|
|
134
|
+
reject("p8 identifiers do not apply to p12");
|
|
135
|
+
}
|
|
136
|
+
if (!opts.credentialFile) {
|
|
137
|
+
if (allowFcmMetadata &&
|
|
138
|
+
fcm &&
|
|
139
|
+
d.method === "PUT" &&
|
|
140
|
+
typeof body.push_sound === "string")
|
|
141
|
+
return { ...r, body, multipart: true };
|
|
142
|
+
if (d.method === "PUT" && apns) {
|
|
143
|
+
if (body.apns_cert_password !== undefined)
|
|
144
|
+
reject("Certificate passwords apply only to an uploaded certificate");
|
|
145
|
+
return apnsPayload(r, body);
|
|
146
|
+
}
|
|
147
|
+
reject("Supply --credential-file for APNs or FCM credentials");
|
|
148
|
+
}
|
|
149
|
+
const bytes = readCredential(opts.credentialFile);
|
|
150
|
+
if (fcm) {
|
|
151
|
+
try {
|
|
152
|
+
const data = JSON.parse(bytes.toString("utf8"));
|
|
153
|
+
if (data.type !== "service_account" ||
|
|
154
|
+
typeof data.private_key !== "string" ||
|
|
155
|
+
!data.private_key.includes("BEGIN PRIVATE KEY") ||
|
|
156
|
+
!data.client_email ||
|
|
157
|
+
!data.project_id)
|
|
158
|
+
reject("Supply an FCM service-account JSON credential");
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
reject("Supply an FCM service-account JSON credential");
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
else if (body.format === "p8" &&
|
|
165
|
+
!bytes.toString("utf8").includes("BEGIN PRIVATE KEY"))
|
|
166
|
+
reject("Supply a p8 private key for format p8");
|
|
167
|
+
const ext = fcm ? "json" : String(body.format);
|
|
168
|
+
const file = new File([new Uint8Array(bytes)], `credential.${ext}`, {
|
|
169
|
+
type: fcm ? "application/json" : "application/octet-stream",
|
|
170
|
+
});
|
|
171
|
+
const prepared = apns
|
|
172
|
+
? apnsPayload(r, body)
|
|
173
|
+
: { ...r, body, multipart: true };
|
|
174
|
+
return {
|
|
175
|
+
...prepared,
|
|
176
|
+
files: { [fcm ? "service_account_key" : "apns_cert"]: file },
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
function readCredential(path) {
|
|
180
|
+
let fd;
|
|
181
|
+
try {
|
|
182
|
+
// Nonblocking open prevents a mistaken FIFO/device path from hanging the
|
|
183
|
+
// CLI before confirmation. Validate the same descriptor that is read.
|
|
184
|
+
fd = openSync(path, constants.O_RDONLY | constants.O_NONBLOCK);
|
|
185
|
+
const info = fstatSync(fd);
|
|
186
|
+
const limit = 1024 * 1024;
|
|
187
|
+
if (!info.isFile() || info.size === 0 || info.size > limit)
|
|
188
|
+
reject("Credential must be a nonempty regular file at most 1 MiB");
|
|
189
|
+
// Bound reads as well as stat size: a file can grow after the size check.
|
|
190
|
+
const buffer = Buffer.alloc(limit + 1);
|
|
191
|
+
let offset = 0;
|
|
192
|
+
while (offset < buffer.length) {
|
|
193
|
+
const count = readSync(fd, buffer, offset, buffer.length - offset, null);
|
|
194
|
+
if (!count)
|
|
195
|
+
break;
|
|
196
|
+
offset += count;
|
|
197
|
+
}
|
|
198
|
+
if (!offset || offset > limit)
|
|
199
|
+
reject("Credential must be a nonempty regular file at most 1 MiB");
|
|
200
|
+
return buffer.subarray(0, offset);
|
|
201
|
+
}
|
|
202
|
+
catch (error) {
|
|
203
|
+
if (error instanceof CliError)
|
|
204
|
+
throw error;
|
|
205
|
+
return reject("Cannot read the credential file");
|
|
206
|
+
}
|
|
207
|
+
finally {
|
|
208
|
+
if (fd !== undefined)
|
|
209
|
+
closeSync(fd);
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
function apnsPayload(r, body) {
|
|
213
|
+
const payload = { ...body };
|
|
214
|
+
payload[payload.format === "p8" ? "apns_environment" : "apns_cert_env_type"] =
|
|
215
|
+
payload.environment;
|
|
216
|
+
if (payload.format === "p8")
|
|
217
|
+
payload.apns_auth_type = "token";
|
|
218
|
+
delete payload.format;
|
|
219
|
+
delete payload.environment;
|
|
220
|
+
return { ...r, body: payload, multipart: true };
|
|
221
|
+
}
|
|
222
|
+
export function callsSecrets(d, value) {
|
|
223
|
+
if (d.name.startsWith("calls settings webhook ") &&
|
|
224
|
+
value &&
|
|
225
|
+
typeof value === "object") {
|
|
226
|
+
return Object.entries(value).flatMap(([k, v]) => k === "url" && typeof v === "string" ? [v] : callsSecrets(d, v));
|
|
227
|
+
}
|
|
228
|
+
return [];
|
|
229
|
+
}
|
|
230
|
+
export function callsPreview(r) {
|
|
231
|
+
return r.files
|
|
232
|
+
? {
|
|
233
|
+
...r,
|
|
234
|
+
files: Object.fromEntries(Object.keys(r.files).map((k) => [k, "[REDACTED]"])),
|
|
235
|
+
}
|
|
236
|
+
: r;
|
|
237
|
+
}
|
|
238
|
+
export async function beforeCalls(d, r, t) {
|
|
239
|
+
if (d.name === "calls activate") {
|
|
240
|
+
const identity = await request(t, {
|
|
241
|
+
method: "GET",
|
|
242
|
+
path: "/dashboard/auth/verify2/",
|
|
243
|
+
});
|
|
244
|
+
const verified = z
|
|
245
|
+
.object({
|
|
246
|
+
organization: z.object({ uid: z.string() }).optional(),
|
|
247
|
+
organizations: z.array(z.object({ uid: z.string() })).optional(),
|
|
248
|
+
role: z.object({ permissions: z.array(z.string()) }),
|
|
249
|
+
})
|
|
250
|
+
.safeParse(identity);
|
|
251
|
+
if (!verified.success)
|
|
252
|
+
throw new CliError("E_SCHEMA", "Calls activation identity is unavailable; no registration was sent", 8);
|
|
253
|
+
const who = verified.data;
|
|
254
|
+
const org = who.organization?.uid ??
|
|
255
|
+
(who.organizations?.length === 1 ? who.organizations[0].uid : undefined);
|
|
256
|
+
if (org !== r.body.organization_uid)
|
|
257
|
+
throw new CliError("E_CONTEXT", "Calls activation requires the authenticated organization", 5);
|
|
258
|
+
if (!who.role.permissions.includes("organization.applications.all"))
|
|
259
|
+
throw new CliError("E_PERMISSION", "Calls activation requires organization.applications.all", 4);
|
|
260
|
+
const raw = await request(t, {
|
|
261
|
+
method: "GET",
|
|
262
|
+
path: `/dashboard/applications/${encodeSegment(r.appId)}/get_detail/`,
|
|
263
|
+
appId: r.appId,
|
|
264
|
+
});
|
|
265
|
+
const parsed = callsActivationStateSchema.safeParse(callsApplicationState(raw));
|
|
266
|
+
if (!parsed.success ||
|
|
267
|
+
parsed.data.app_id !== r.appId ||
|
|
268
|
+
!parsed.data.region ||
|
|
269
|
+
parsed.data.is_calls_enabled === null)
|
|
270
|
+
throw new CliError("E_SCHEMA", "Calls activation state or region is unavailable; no registration was sent", 8);
|
|
271
|
+
if (parsed.data.is_calls_enabled)
|
|
272
|
+
throw new CliError("E_CAPABILITY", "Calls is already enabled; inspect calls settings push get instead of activating again", 5);
|
|
273
|
+
// Resolve the immutable region from this exact app, never a profile default.
|
|
274
|
+
// Gate remains authoritative for organization eligibility and regional support.
|
|
275
|
+
r.body.sendbird_region = parsed.data.region;
|
|
276
|
+
return;
|
|
277
|
+
}
|
|
278
|
+
if ((d.name.startsWith("calls push ") ||
|
|
279
|
+
/^chat push (create|update|delete)$/.test(d.name)) &&
|
|
280
|
+
d.method !== "GET") {
|
|
281
|
+
const isCalls = d.name.startsWith("calls ");
|
|
282
|
+
const state = await request(t, {
|
|
283
|
+
method: "GET",
|
|
284
|
+
path: `/dashboard/applications/${encodeSegment(r.appId)}/get_detail/`,
|
|
285
|
+
appId: r.appId,
|
|
286
|
+
});
|
|
287
|
+
if (!state ||
|
|
288
|
+
typeof state !== "object" ||
|
|
289
|
+
state.app_id !== r.appId)
|
|
290
|
+
throw new CliError("E_SCHEMA", "Push application identity is unavailable; no credential change was sent", 8);
|
|
291
|
+
const app = callsApplicationState(state);
|
|
292
|
+
// Removing an existing credential does not enable Push or Calls. Keep
|
|
293
|
+
// the identity preflight and server ACL, but permit cleanup when disabled.
|
|
294
|
+
if (d.method !== "DELETE" &&
|
|
295
|
+
(app.push_enabled !== true || (isCalls && app.is_calls_enabled !== true)))
|
|
296
|
+
throw new CliError("E_CAPABILITY", isCalls
|
|
297
|
+
? "Calls or shared Push is disabled or unknown; inspect calls settings push get. No credential change was sent"
|
|
298
|
+
: "Shared Push is disabled or unknown; inspect chat push enabled get. No credential change was sent", 5);
|
|
299
|
+
if (d.method === "PUT" &&
|
|
300
|
+
!r.files &&
|
|
301
|
+
/\/(apns|apns_voip|calls_apns_remote)\//.test(r.path)) {
|
|
302
|
+
// Dashboard allows metadata-only updates but requires a certificate when
|
|
303
|
+
// switching p8/p12. Find the actual configuration before permitting that
|
|
304
|
+
// path; do not infer its format from user flags or the first page alone.
|
|
305
|
+
const path = r.path.slice(0, r.path.lastIndexOf("/"));
|
|
306
|
+
const id = decodeURIComponent(r.path.split("/").at(-1));
|
|
307
|
+
let token;
|
|
308
|
+
const seen = new Set();
|
|
309
|
+
for (let page = 0; page < 10; page++) {
|
|
310
|
+
const data = callsPushListSchema.safeParse(await request(t, {
|
|
311
|
+
method: "GET",
|
|
312
|
+
path,
|
|
313
|
+
appId: r.appId,
|
|
314
|
+
query: { paginated: true, limit: 100, ...(token ? { token } : {}) },
|
|
315
|
+
}));
|
|
316
|
+
if (!data.success)
|
|
317
|
+
throw new CliError("E_SCHEMA", "Cannot verify the current APNs credential format; no update was sent", 8);
|
|
318
|
+
const config = data.data.push_configurations.find((item) => item.id === id);
|
|
319
|
+
if (config) {
|
|
320
|
+
if (typeof config.apns_key_id !== "string" ||
|
|
321
|
+
typeof config.apns_team_id !== "string")
|
|
322
|
+
throw new CliError("E_SCHEMA", "Current APNs format is unknown; upload a certificate or inspect the Dashboard", 8);
|
|
323
|
+
const tokenBased = !!(config.apns_key_id && config.apns_team_id);
|
|
324
|
+
if (tokenBased !== (r.body?.apns_auth_type === "token"))
|
|
325
|
+
reject("Switching APNs p8/p12 requires --credential-file");
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
328
|
+
const next = data.data.next;
|
|
329
|
+
if (!next)
|
|
330
|
+
throw new CliError("E_NOT_FOUND", "APNs credential was not found; no update was sent", 3);
|
|
331
|
+
if (seen.has(next))
|
|
332
|
+
throw new CliError("E_SCHEMA", "Push pagination cursor repeated; no update was sent", 8);
|
|
333
|
+
seen.add(next);
|
|
334
|
+
token = next;
|
|
335
|
+
}
|
|
336
|
+
throw new CliError("E_VALIDATION", "APNs format was not resolved within ten pages; inspect the credential before retrying", 2);
|
|
337
|
+
}
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (!d.name.startsWith("calls settings ") || d.method === "GET")
|
|
341
|
+
return;
|
|
342
|
+
const current = await request(t, {
|
|
343
|
+
...r,
|
|
344
|
+
method: "GET",
|
|
345
|
+
body: undefined,
|
|
346
|
+
files: undefined,
|
|
347
|
+
multipart: undefined,
|
|
348
|
+
...(d.name === "calls settings webhook set"
|
|
349
|
+
? { query: { display_all_webhook_categories: true } }
|
|
350
|
+
: {}),
|
|
351
|
+
});
|
|
352
|
+
if (!d.response.safeParse(current).success)
|
|
353
|
+
throw new CliError("E_SCHEMA", "Current Calls settings changed; no update was sent", 8);
|
|
354
|
+
const key = d.name.split(" ")[2].replaceAll("-", "_");
|
|
355
|
+
const setting = current && typeof current === "object"
|
|
356
|
+
? current[key]
|
|
357
|
+
: undefined;
|
|
358
|
+
if (!setting || typeof setting !== "object")
|
|
359
|
+
throw new CliError("E_SCHEMA", "Current Calls settings are unavailable; no update was sent", 8);
|
|
360
|
+
const values = setting;
|
|
361
|
+
if (key === "webhook" &&
|
|
362
|
+
(r.body?.enabled ?? values.enabled) === true &&
|
|
363
|
+
!(typeof (r.body?.url ?? values.url) === "string" &&
|
|
364
|
+
String(r.body?.url ?? values.url).trim()))
|
|
365
|
+
reject("Enabling a Webhook requires a nonempty URL; no change was sent");
|
|
366
|
+
if (key === "general" &&
|
|
367
|
+
r.body?.relay_method !== undefined &&
|
|
368
|
+
typeof values.direct_call_cloud_recording_enabled !== "boolean")
|
|
369
|
+
reject("Recording state is unknown; no relay change was sent");
|
|
370
|
+
if (key === "general" &&
|
|
371
|
+
r.body?.relay_method !== undefined &&
|
|
372
|
+
values.direct_call_cloud_recording_enabled === true)
|
|
373
|
+
reject("Dashboard locks relay changes while direct-call recording is enabled; disable recording in a separate confirmed operation first");
|
|
374
|
+
}
|
|
375
|
+
export async function callsReadback(d, r, t, value) {
|
|
376
|
+
if (!d.name.startsWith("calls ") || d.method === "GET")
|
|
377
|
+
return value;
|
|
378
|
+
if (d.name.startsWith("calls credits "))
|
|
379
|
+
return value;
|
|
380
|
+
if (d.name === "calls activate") {
|
|
381
|
+
const note = "Registration was accepted. Registration itself does not claim trial credits or purchase credits; an optional credit follow-up is reported separately. Activation is not proof of a successful call.";
|
|
382
|
+
try {
|
|
383
|
+
const raw = await request(t, {
|
|
384
|
+
method: "GET",
|
|
385
|
+
path: `/dashboard/applications/${encodeSegment(r.appId)}/get_detail/`,
|
|
386
|
+
appId: r.appId,
|
|
387
|
+
});
|
|
388
|
+
const activation = callsActivationStateSchema.parse(callsApplicationState(raw));
|
|
389
|
+
if (activation.app_id !== r.appId)
|
|
390
|
+
throw new CliError("E_SCHEMA", "Activation app identity mismatch", 8);
|
|
391
|
+
return {
|
|
392
|
+
acknowledgement: value,
|
|
393
|
+
readback: {
|
|
394
|
+
status: activation.is_calls_enabled === true ? "matches" : "mismatch",
|
|
395
|
+
activation,
|
|
396
|
+
note,
|
|
397
|
+
},
|
|
398
|
+
};
|
|
399
|
+
}
|
|
400
|
+
catch (e) {
|
|
401
|
+
return {
|
|
402
|
+
acknowledgement: value,
|
|
403
|
+
readback: {
|
|
404
|
+
status: "unavailable",
|
|
405
|
+
code: e instanceof CliError ? e.code : "E_SCHEMA",
|
|
406
|
+
note,
|
|
407
|
+
},
|
|
408
|
+
};
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
// A successful write remains accepted. A later failed GET must not suggest
|
|
412
|
+
// resending the write. Preserve the acknowledgement and report readback state.
|
|
413
|
+
if (value &&
|
|
414
|
+
typeof value === "object" &&
|
|
415
|
+
typeof value.push_configurations === "string")
|
|
416
|
+
value = {
|
|
417
|
+
...value,
|
|
418
|
+
push_configurations: "[REDACTED]",
|
|
419
|
+
};
|
|
420
|
+
const acknowledgement = {
|
|
421
|
+
...(d.name.startsWith("calls push ")
|
|
422
|
+
? { push_type: r.path.split("/")[5] }
|
|
423
|
+
: {}),
|
|
424
|
+
...(value && typeof value === "object"
|
|
425
|
+
? value
|
|
426
|
+
: { acknowledgement: value }),
|
|
427
|
+
...(d.name.startsWith("calls push ") && d.method !== "POST"
|
|
428
|
+
? { configuration_id: decodeURIComponent(r.path.split("/").at(-1)) }
|
|
429
|
+
: {}),
|
|
430
|
+
};
|
|
431
|
+
try {
|
|
432
|
+
const isPush = d.name.startsWith("calls push ");
|
|
433
|
+
const path = isPush && d.method !== "POST"
|
|
434
|
+
? r.path.slice(0, r.path.lastIndexOf("/"))
|
|
435
|
+
: r.path;
|
|
436
|
+
const read = await request(t, {
|
|
437
|
+
method: "GET",
|
|
438
|
+
path,
|
|
439
|
+
appId: r.appId,
|
|
440
|
+
query: isPush ? { paginated: true, limit: 100 } : undefined,
|
|
441
|
+
});
|
|
442
|
+
const parsed = (isPush ? callsPushListSchema : d.response).safeParse(read);
|
|
443
|
+
if (!parsed.success)
|
|
444
|
+
throw new CliError("E_SCHEMA", "Readback schema changed", 8);
|
|
445
|
+
return {
|
|
446
|
+
...acknowledgement,
|
|
447
|
+
readback: {
|
|
448
|
+
status: "read_completed",
|
|
449
|
+
settings: redact(parsed.data, [
|
|
450
|
+
...secretValues(read),
|
|
451
|
+
...callsSecrets(d, read),
|
|
452
|
+
]),
|
|
453
|
+
note: isPush
|
|
454
|
+
? "First page only; absence is not proof of deletion. Follow the list cursor."
|
|
455
|
+
: "Compare these settings to your requested values; acknowledgement alone is not a verified match.",
|
|
456
|
+
},
|
|
457
|
+
};
|
|
458
|
+
}
|
|
459
|
+
catch (e) {
|
|
460
|
+
return {
|
|
461
|
+
...acknowledgement,
|
|
462
|
+
readback: {
|
|
463
|
+
status: "unavailable",
|
|
464
|
+
code: e instanceof CliError ? e.code : "E_INTERNAL",
|
|
465
|
+
note: "Write was accepted; read settings/list before retrying. No automatic retry was sent.",
|
|
466
|
+
},
|
|
467
|
+
};
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=calls.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"calls.js","sourceRoot":"","sources":["../src/calls.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAC9E,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,QAAQ,EACR,aAAa,EACb,OAAO,EACP,MAAM,EACN,YAAY,GAGb,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,oBAAoB,CAAC;AAI5B,SAAS,MAAM,CAAC,OAAe;IAC7B,MAAM,IAAI,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACjD,CAAC;AACD,0EAA0E;AAC1E,iFAAiF;AACjF,MAAM,UAAU,qBAAqB,CAAC,KAAc;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IACtD,MAAM,GAAG,GAAG,KAAgC,CAAC;IAC7C,MAAM,KAAK,GACT,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;QACxC,CAAC,CAAE,GAAG,CAAC,KAAiC;QACxC,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,KAAK,GACT,KAAK,CAAC,cAAc,IAAI,OAAO,KAAK,CAAC,cAAc,KAAK,QAAQ;QAC9D,CAAC,CAAE,KAAK,CAAC,cAA0C;QACnD,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,GAAG,GACP,OAAO,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;IAC1E,MAAM,MAAM,GAAG,OAAO,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC;IACzE,MAAM,QAAQ,GAAG,GAAG,KAAK,IAAI,IAAI,MAAM,KAAK,IAAI,IAAI,GAAG,KAAK,MAAM,CAAC;IACnE,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,MAAM;QAClB,YAAY,EACV,OAAO,GAAG,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI;QACjE,gBAAgB,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,CAAC;QACnD,iBAAiB,EAAE,QAAQ;YACzB,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,MAAM,KAAK,IAAI;gBACf,CAAC,CAAC,8BAA8B;gBAChC,CAAC,CAAC,GAAG,KAAK,IAAI;oBACZ,CAAC,CAAC,kBAAkB;oBACpB,CAAC,CAAC,SAAS;QACjB,GAAG,CAAC,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAClE,CAAC;AACJ,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,CAAa,EAAE,KAAc;IACzD,OAAO,CAAC,CAAC,IAAI,KAAK,yBAAyB;QACzC,CAAC,CAAC,qBAAqB,CAAC,KAAK,CAAC;QAC9B,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,CAAa,EACb,CAAU,EACV,IAAa,EACb,gBAAgB,GAAG,KAAK;IAExB,IAAI,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9D,yEAAyE;QACzE,8EAA8E;QAC9E,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAChC,KAAK,CAAC,CAAC,CAAC;YACN,KAAK,CAAC,CAAC,CAAC,KAAK,MAAM;gBACjB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK;oBAClB,CAAC,CAAC,UAAU;oBACZ,CAAC,CAAC,aAAa,CAAC;QACtB,MAAM,QAAQ,GAAG,YAAY,CAC3B,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,EAChD,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC/B,IAAI,EACJ,IAAI,CACL,CAAC;QACF,OAAO,EAAE,GAAG,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3C,IAAI,IAAI,CAAC,YAAY;QACnB,MAAM,CACJ,2EAA2E,CAC5E,CAAC;IACJ,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB;QAC7B,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IAC1D,MAAM,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,IACE,CAAC,CAAC,IAAI,KAAK,4BAA4B;QACvC,IAAI,CAAC,GAAG,KAAK,SAAS;QACtB,IAAI,CAAC,GAAG,KAAK,EAAE,EACf,CAAC;QACD,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,QAAQ;gBACvE,MAAM,CAAC,0DAA0D,CAAC,CAAC;QACvE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,0DAA0D,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IACD,IACE,CAAC,CAAC,IAAI,KAAK,4BAA4B;QACvC,IAAI,CAAC,wCAAwC,KAAK,SAAS;QAC3D,IAAI,CAAC,wCAAwC,KAAK,EAAE,EACpD,CAAC;QACD,IAAI,CAAC;YACH,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;gBAC5B,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,wCAAwC,CAAC;aAChE,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CACJ,mEAAmE,CACpE,CAAC;QACJ,CAAC;IACH,CAAC;IACD,IACE,CAAC,CAAC,IAAI,KAAK,4BAA4B;QACvC,IAAI,CAAC,OAAO,KAAK,IAAI;QACrB,IAAI,CAAC,GAAG,KAAK,EAAE;QAEf,MAAM,CAAC,4CAA4C,CAAC,CAAC;IACvD,IAAI,CAAC,CAAC,mBAAmB,EAAE,mBAAmB,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC;QAAE,OAAO,CAAC,CAAC;IAC3E,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,IAAI,GAAG,IAAI,KAAK,WAAW,IAAI,IAAI,KAAK,mBAAmB,CAAC;IAClE,MAAM,GAAG,GAAG,IAAI,KAAK,UAAU,CAAC;IAChC,uEAAuE;IACvE,wEAAwE;IACxE,IAAI,CAAC,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,KAAK,IAAI;QAC3C,MAAM,CACJ,oFAAoF,CACrF,CAAC;IACJ,MAAM,OAAO,GAAG,IAAI;QAClB,CAAC,CAAC;YACE,QAAQ;YACR,aAAa;YACb,gBAAgB;YAChB,aAAa;YACb,cAAc;YACd,oBAAoB;YACpB,YAAY;SACb;QACH,CAAC,CAAC,GAAG;YACH,CAAC,CAAC,CAAC,YAAY,CAAC;YAChB,CAAC,CAAC,CAAC,eAAe,EAAE,mBAAmB,EAAE,YAAY,CAAC,CAAC;IAC3D,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACzD,MAAM,CAAC,uDAAuD,CAAC,CAAC;IAClE,IAAI,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;QAClB,IAAI,IAAI,CAAC,cAAc;YACrB,MAAM,CAAC,wDAAwD,CAAC,CAAC;QACnE,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;YACzE,MAAM,CACJ,6EAA6E,CAC9E,CAAC;QACJ,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,CAAC,iBAAiB,KAAK,SAAS;YAC5D,MAAM,CACJ,wFAAwF,CACzF,CAAC;QACJ,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM;YAAE,MAAM,CAAC,mCAAmC,CAAC,CAAC;QAC3E,OAAO,CAAC,CAAC;IACX,CAAC;IACD,IAAI,IAAI,EAAE,CAAC;QACT,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,WAAW;YACnC,MAAM,CACJ,oEAAoE,CACrE,CAAC;QACJ,IACE,IAAI,CAAC,MAAM,KAAK,IAAI;YACpB,CAAC,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC;YAEjE,MAAM,CAAC,2DAA2D,CAAC,CAAC;QACtE,IACE,IAAI,CAAC,MAAM,KAAK,KAAK;YACrB,CAAC,aAAa,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC,IAAI,CACpD,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAC7B;YAED,MAAM,CAAC,oCAAoC,CAAC,CAAC;IACjD,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,CAAC;QACzB,IACE,gBAAgB;YAChB,GAAG;YACH,CAAC,CAAC,MAAM,KAAK,KAAK;YAClB,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ;YAEnC,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK,IAAI,IAAI,EAAE,CAAC;YAC/B,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS;gBACvC,MAAM,CAAC,6DAA6D,CAAC,CAAC;YACxE,OAAO,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAC9B,CAAC;QACD,MAAM,CAAC,sDAAsD,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAClD,IAAI,GAAG,EAAE,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;YAChD,IACE,IAAI,CAAC,IAAI,KAAK,iBAAiB;gBAC/B,OAAO,IAAI,CAAC,WAAW,KAAK,QAAQ;gBACpC,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,mBAAmB,CAAC;gBAC/C,CAAC,IAAI,CAAC,YAAY;gBAClB,CAAC,IAAI,CAAC,UAAU;gBAEhB,MAAM,CAAC,+CAA+C,CAAC,CAAC;QAC5D,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,CAAC,+CAA+C,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;SAAM,IACL,IAAI,CAAC,MAAM,KAAK,IAAI;QACpB,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;QAErD,MAAM,CAAC,uCAAuC,CAAC,CAAC;IAClD,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,GAAG,EAAE,EAAE;QAClE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,0BAA0B;KAC5D,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,IAAI;QACnB,CAAC,CAAC,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC;QACtB,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IACpC,OAAO;QACL,GAAG,QAAQ;QACX,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE;KAC7D,CAAC;AACJ,CAAC;AACD,SAAS,cAAc,CAAC,IAAY;IAClC,IAAI,EAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,yEAAyE;QACzE,sEAAsE;QACtE,EAAE,GAAG,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/D,MAAM,IAAI,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;QAC1B,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,KAAK,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,KAAK;YACxD,MAAM,CAAC,0DAA0D,CAAC,CAAC;QACrE,0EAA0E;QAC1E,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACvC,IAAI,MAAM,GAAG,CAAC,CAAC;QACf,OAAO,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC;YAC9B,MAAM,KAAK,GAAG,QAAQ,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,GAAG,MAAM,EAAE,IAAI,CAAC,CAAC;YACzE,IAAI,CAAC,KAAK;gBAAE,MAAM;YAClB,MAAM,IAAI,KAAK,CAAC;QAClB,CAAC;QACD,IAAI,CAAC,MAAM,IAAI,MAAM,GAAG,KAAK;YAC3B,MAAM,CAAC,0DAA0D,CAAC,CAAC;QACrE,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IACpC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,QAAQ;YAAE,MAAM,KAAK,CAAC;QAC3C,OAAO,MAAM,CAAC,iCAAiC,CAAC,CAAC;IACnD,CAAC;YAAS,CAAC;QACT,IAAI,EAAE,KAAK,SAAS;YAAE,SAAS,CAAC,EAAE,CAAC,CAAC;IACtC,CAAC;AACH,CAAC;AAED,SAAS,WAAW,CAAC,CAAU,EAAE,IAA6B;IAC5D,MAAM,OAAO,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IAC5B,OAAO,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,oBAAoB,CAAC;QAC1E,OAAO,CAAC,WAAW,CAAC;IACtB,IAAI,OAAO,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,CAAC,cAAc,GAAG,OAAO,CAAC;IAC9D,OAAO,OAAO,CAAC,MAAM,CAAC;IACtB,OAAO,OAAO,CAAC,WAAW,CAAC;IAC3B,OAAO,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;AAClD,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAa,EAAE,KAAc;IACxD,IACE,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,yBAAyB,CAAC;QAC5C,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ,EACzB,CAAC;QACD,OAAO,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAC9C,CAAC,KAAK,KAAK,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,EAAE,CAAC,CAAC,CAChE,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AACD,MAAM,UAAU,YAAY,CAAC,CAAU;IACrC,OAAO,CAAC,CAAC,KAAK;QACZ,CAAC,CAAC;YACE,GAAG,CAAC;YACJ,KAAK,EAAE,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC,CAAC,CAChB;SACrC;QACH,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,CAAa,EAAE,CAAU,EAAE,CAAY;IACvE,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAChC,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAChC,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC;aACf,MAAM,CAAC;YACN,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,QAAQ,EAAE;YACtD,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE;YAChE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC;SACrD,CAAC;aACD,SAAS,CAAC,QAAQ,CAAC,CAAC;QACvB,IAAI,CAAC,QAAQ,CAAC,OAAO;YACnB,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,oEAAoE,EACpE,CAAC,CACF,CAAC;QACJ,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC1B,MAAM,GAAG,GACP,GAAG,CAAC,YAAY,EAAE,GAAG;YACrB,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAC3E,IAAI,GAAG,KAAK,CAAC,CAAC,IAAK,CAAC,gBAAgB;YAClC,MAAM,IAAI,QAAQ,CAChB,WAAW,EACX,0DAA0D,EAC1D,CAAC,CACF,CAAC;QACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,+BAA+B,CAAC;YACjE,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,yDAAyD,EACzD,CAAC,CACF,CAAC;QACJ,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAC3B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,2BAA2B,aAAa,CAAC,CAAC,CAAC,KAAM,CAAC,cAAc;YACtE,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,0BAA0B,CAAC,SAAS,CACjD,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAC;QACF,IACE,CAAC,MAAM,CAAC,OAAO;YACf,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK;YAC9B,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM;YACnB,MAAM,CAAC,IAAI,CAAC,gBAAgB,KAAK,IAAI;YAErC,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,2EAA2E,EAC3E,CAAC,CACF,CAAC;QACJ,IAAI,MAAM,CAAC,IAAI,CAAC,gBAAgB;YAC9B,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,uFAAuF,EACvF,CAAC,CACF,CAAC;QACJ,6EAA6E;QAC7E,gFAAgF;QAChF,CAAC,CAAC,IAAK,CAAC,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,IACE,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;QAC/B,oCAAoC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpD,CAAC,CAAC,MAAM,KAAK,KAAK,EAClB,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAC7B,MAAM,EAAE,KAAK;YACb,IAAI,EAAE,2BAA2B,aAAa,CAAC,CAAC,CAAC,KAAM,CAAC,cAAc;YACtE,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC,CAAC;QACH,IACE,CAAC,KAAK;YACN,OAAO,KAAK,KAAK,QAAQ;YACxB,KAAiC,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK;YAErD,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,yEAAyE,EACzE,CAAC,CACF,CAAC;QACJ,MAAM,GAAG,GAAG,qBAAqB,CAAC,KAAK,CAA4B,CAAC;QACpE,sEAAsE;QACtE,2EAA2E;QAC3E,IACE,CAAC,CAAC,MAAM,KAAK,QAAQ;YACrB,CAAC,GAAG,CAAC,YAAY,KAAK,IAAI,IAAI,CAAC,OAAO,IAAI,GAAG,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC;YAEzE,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,OAAO;gBACL,CAAC,CAAC,6GAA6G;gBAC/G,CAAC,CAAC,kGAAkG,EACtG,CAAC,CACF,CAAC;QACJ,IACE,CAAC,CAAC,MAAM,KAAK,KAAK;YAClB,CAAC,CAAC,CAAC,KAAK;YACR,wCAAwC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EACrD,CAAC;YACD,yEAAyE;YACzE,yEAAyE;YACzE,yEAAyE;YACzE,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,MAAM,EAAE,GAAG,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC;YACzD,IAAI,KAAyB,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,mBAAmB,CAAC,SAAS,CACxC,MAAM,OAAO,CAAC,CAAC,EAAE;oBACf,MAAM,EAAE,KAAK;oBACb,IAAI;oBACJ,KAAK,EAAE,CAAC,CAAC,KAAK;oBACd,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE;iBACpE,CAAC,CACH,CAAC;gBACF,IAAI,CAAC,IAAI,CAAC,OAAO;oBACf,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,sEAAsE,EACtE,CAAC,CACF,CAAC;gBACJ,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAC/C,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CACzB,CAAC;gBACF,IAAI,MAAM,EAAE,CAAC;oBACX,IACE,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ;wBACtC,OAAO,MAAM,CAAC,YAAY,KAAK,QAAQ;wBAEvC,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,+EAA+E,EAC/E,CAAC,CACF,CAAC;oBACJ,MAAM,UAAU,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC;oBACjE,IAAI,UAAU,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,KAAK,OAAO,CAAC;wBACrD,MAAM,CAAC,kDAAkD,CAAC,CAAC;oBAC7D,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAC5B,IAAI,CAAC,IAAI;oBACP,MAAM,IAAI,QAAQ,CAChB,aAAa,EACb,mDAAmD,EACnD,CAAC,CACF,CAAC;gBACJ,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;oBAChB,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,qDAAqD,EACrD,CAAC,CACF,CAAC;gBACJ,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;gBACf,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YACD,MAAM,IAAI,QAAQ,CAChB,cAAc,EACd,uFAAuF,EACvF,CAAC,CACF,CAAC;QACJ,CAAC;QACD,OAAO;IACT,CAAC;IACD,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO;IACxE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;QAC/B,GAAG,CAAC;QACJ,MAAM,EAAE,KAAK;QACb,IAAI,EAAE,SAAS;QACf,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,SAAS;QACpB,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,4BAA4B;YACzC,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE,8BAA8B,EAAE,IAAI,EAAE,EAAE;YACrD,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC;IACH,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,OAAO;QACxC,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,oDAAoD,EACpD,CAAC,CACF,CAAC;IACJ,MAAM,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IACtD,MAAM,OAAO,GACX,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACpC,CAAC,CAAE,OAAmC,CAAC,GAAG,CAAC;QAC3C,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;QACzC,MAAM,IAAI,QAAQ,CAChB,UAAU,EACV,4DAA4D,EAC5D,CAAC,CACF,CAAC;IACJ,MAAM,MAAM,GAAG,OAAkC,CAAC;IAClD,IACE,GAAG,KAAK,SAAS;QACjB,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,IAAI;QAC5C,CAAC,CACC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;YAC/C,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CACzC;QAED,MAAM,CAAC,gEAAgE,CAAC,CAAC;IAE3E,IACE,GAAG,KAAK,SAAS;QACjB,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,SAAS;QAClC,OAAO,MAAM,CAAC,mCAAmC,KAAK,SAAS;QAE/D,MAAM,CAAC,sDAAsD,CAAC,CAAC;IACjE,IACE,GAAG,KAAK,SAAS;QACjB,CAAC,CAAC,IAAI,EAAE,YAAY,KAAK,SAAS;QAClC,MAAM,CAAC,mCAAmC,KAAK,IAAI;QAEnD,MAAM,CACJ,iIAAiI,CAClI,CAAC;AACN,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,CAAa,EACb,CAAU,EACV,CAAY,EACZ,KAAc;IAEd,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,KAAK;QAAE,OAAO,KAAK,CAAC;IACrE,IAAI,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,gBAAgB,CAAC;QAAE,OAAO,KAAK,CAAC;IACtD,IAAI,CAAC,CAAC,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAChC,MAAM,IAAI,GACR,qMAAqM,CAAC;QACxM,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;gBAC3B,MAAM,EAAE,KAAK;gBACb,IAAI,EAAE,2BAA2B,aAAa,CAAC,CAAC,CAAC,KAAM,CAAC,cAAc;gBACtE,KAAK,EAAE,CAAC,CAAC,KAAK;aACf,CAAC,CAAC;YACH,MAAM,UAAU,GAAG,0BAA0B,CAAC,KAAK,CACjD,qBAAqB,CAAC,GAAG,CAAC,CAC3B,CAAC;YACF,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,CAAC,KAAK;gBAC/B,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,kCAAkC,EAAE,CAAC,CAAC,CAAC;YACxE,OAAO;gBACL,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE;oBACR,MAAM,EAAE,UAAU,CAAC,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU;oBACrE,UAAU;oBACV,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,OAAO;gBACL,eAAe,EAAE,KAAK;gBACtB,QAAQ,EAAE;oBACR,MAAM,EAAE,aAAa;oBACrB,IAAI,EAAE,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;oBACjD,IAAI;iBACL;aACF,CAAC;QACJ,CAAC;IACH,CAAC;IACD,2EAA2E;IAC3E,+EAA+E;IAC/E,IACE,KAAK;QACL,OAAO,KAAK,KAAK,QAAQ;QACzB,OAAQ,KAAiC,CAAC,mBAAmB,KAAK,QAAQ;QAE1E,KAAK,GAAG;YACN,GAAI,KAAiC;YACrC,mBAAmB,EAAE,YAAY;SAClC,CAAC;IACJ,MAAM,eAAe,GAAG;QACtB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;YAClC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE;YACrC,CAAC,CAAC,EAAE,CAAC;QACP,GAAG,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ;YACpC,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC;QAC/B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YACzD,CAAC,CAAC,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAE,CAAC,EAAE;YACrE,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;IACF,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;QAChD,MAAM,IAAI,GACR,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAC3B,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAC1C,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QACb,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,CAAC,EAAE;YAC5B,MAAM,EAAE,KAAK;YACb,IAAI;YACJ,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,SAAS;SAC5D,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,CAAC,OAAO;YACjB,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,yBAAyB,EAAE,CAAC,CAAC,CAAC;QAC/D,OAAO;YACL,GAAG,eAAe;YAClB,QAAQ,EAAE;gBACR,MAAM,EAAE,gBAAgB;gBACxB,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE;oBAC5B,GAAG,YAAY,CAAC,IAAI,CAAC;oBACrB,GAAG,YAAY,CAAC,CAAC,EAAE,IAAI,CAAC;iBACzB,CAAC;gBACF,IAAI,EAAE,MAAM;oBACV,CAAC,CAAC,4EAA4E;oBAC9E,CAAC,CAAC,iGAAiG;aACtG;SACF,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO;YACL,GAAG,eAAe;YAClB,QAAQ,EAAE;gBACR,MAAM,EAAE,aAAa;gBACrB,IAAI,EAAE,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY;gBACnD,IAAI,EAAE,sFAAsF;aAC7F;SACF,CAAC;IACJ,CAAC;AACH,CAAC"}
|