@wizzlethorpe/vaults 0.5.0 → 0.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,413 @@
1
+ import { createInterface } from "node:readline/promises";
2
+ import { stdin, stdout } from "node:process";
3
+ import { createServer } from "node:http";
4
+ import { spawn } from "node:child_process";
5
+ import { loadConfig, saveConfig } from "../config.js";
6
+ // Fixed port for the one-shot CLI OAuth dance. Reuses `vaults preview`'s
7
+ // default port (4173) so a single registered redirect URI covers both
8
+ // `vaults patreon configure` (this command) AND any visitor-login testing
9
+ // the user does during local preview. Mutually exclusive with a running
10
+ // `vaults preview` since both bind the port; that's fine in practice
11
+ // (you configure before previewing).
12
+ const OAUTH_PORT = 4173;
13
+ const OAUTH_REDIRECT_URI = `http://localhost:${OAUTH_PORT}/auth/patreon/callback`;
14
+ const OAUTH_TIMEOUT_MS = 5 * 60 * 1000; // 5 minutes is plenty for the user to click Approve
15
+ /**
16
+ * `vaults patreon configure` — prompts for Patreon OAuth app credentials and
17
+ * the campaign ID, stores them on `.vaultrc.json`. The client secret rides
18
+ * here too so subsequent `vaults push` can re-upload it as the
19
+ * `PATREON_CLIENT_SECRET` Wrangler secret (mirrors how sessionSecret works).
20
+ *
21
+ * Each creator must register their own Patreon OAuth client at
22
+ * patreon.com/portal/registration; we can't ship a shared one because
23
+ * the redirect URI must be pre-registered per app and Patreon rate-limits
24
+ * + bills per app.
25
+ */
26
+ export async function patreonConfigure(vaultPath) {
27
+ const cfg = await loadConfig(vaultPath, {});
28
+ const existing = cfg.patreon;
29
+ if (!stdin.isTTY) {
30
+ throw new Error("vaults patreon configure must be run interactively (need to prompt for client_id/secret).");
31
+ }
32
+ console.log("Patreon OAuth setup");
33
+ console.log("=".repeat(50));
34
+ console.log("");
35
+ if (!existing) {
36
+ console.log("Each Wizzlethorpe Vaults deploy needs its own Patreon OAuth app.");
37
+ console.log("Register one at: https://www.patreon.com/portal/registration");
38
+ console.log("");
39
+ console.log("When prompted for redirect URIs, register both:");
40
+ console.log(" 1. Your deploy URL + /auth/patreon/callback");
41
+ console.log(" e.g. https://your-vault.pages.dev/auth/patreon/callback");
42
+ console.log(" https://your-custom-domain.com/auth/patreon/callback");
43
+ console.log(` 2. ${OAUTH_REDIRECT_URI}`);
44
+ console.log(" (covers this CLI's one-shot setup AND `vaults preview` testing)");
45
+ console.log("");
46
+ }
47
+ else {
48
+ console.log("Updating existing Patreon configuration. Press Enter to keep current values.");
49
+ console.log("");
50
+ }
51
+ const rl = createInterface({ input: stdin, output: stdout });
52
+ try {
53
+ const clientId = (await rl.question(`Patreon client ID${existing ? ` [${maskMid(existing.clientId)}]` : ""}: `)).trim() || existing?.clientId || "";
54
+ if (!clientId)
55
+ throw new Error("Client ID is required.");
56
+ const clientSecret = (await rl.question(`Patreon client secret${existing ? " [keep existing]" : ""}: `)).trim() || existing?.clientSecret || "";
57
+ if (!clientSecret)
58
+ throw new Error("Client secret is required.");
59
+ // Auto-detect path: open a browser to Patreon, exchange the resulting
60
+ // code for a one-shot creator token, fetch /v2/campaigns + tiers,
61
+ // discard the token. The default is yes — finding the campaign ID by
62
+ // hand is real friction.
63
+ const wantsAutoAns = (await rl.question(`Auto-detect your campaign + tier list via Patreon OAuth? [Y/n] `)).trim().toLowerCase();
64
+ const wantsAuto = wantsAutoAns !== "n" && wantsAutoAns !== "no";
65
+ let campaignId = "";
66
+ let detectedTiers = [];
67
+ if (wantsAuto) {
68
+ console.log("");
69
+ const detected = await oauthFetchCampaignAndTiers(clientId, clientSecret, rl);
70
+ campaignId = detected.campaignId;
71
+ detectedTiers = detected.tiers;
72
+ console.log("");
73
+ console.log(`Detected campaign: ${campaignId}`);
74
+ if (detectedTiers.length > 0) {
75
+ console.log(`Detected tiers (${detectedTiers.length}):`);
76
+ for (const t of detectedTiers) {
77
+ console.log(` ${t.id} ${formatAmount(t.amountCents).padStart(8)} ${t.title}`);
78
+ }
79
+ }
80
+ else {
81
+ console.log("No published tiers found on this campaign.");
82
+ }
83
+ }
84
+ else {
85
+ campaignId = (await rl.question(`Patreon campaign ID${existing ? ` [${existing.campaignId}]` : ""}: `)).trim() || existing?.campaignId || "";
86
+ if (!campaignId)
87
+ throw new Error("Campaign ID is required.");
88
+ }
89
+ // Walk non-default roles and prompt for tier mapping. If we have the
90
+ // tier list (from auto-detect), show a numbered menu. Otherwise prompt
91
+ // for the bare ID. Either way, an existing mapping is the default
92
+ // and "skip" leaves the role password-only.
93
+ const protectedRoles = cfg.roles.slice(1);
94
+ const newTiers = { ...(existing?.tiers ?? {}) };
95
+ if (protectedRoles.length > 0) {
96
+ console.log("");
97
+ console.log("Map roles to Patreon tiers. Press Enter to skip a role (password-only).");
98
+ for (const role of protectedRoles) {
99
+ const current = newTiers[role];
100
+ if (detectedTiers.length > 0) {
101
+ console.log("");
102
+ console.log(` Role: ${role}${current ? ` (currently → tier ${current})` : ""}`);
103
+ for (let i = 0; i < detectedTiers.length; i++) {
104
+ const t = detectedTiers[i];
105
+ console.log(` ${i + 1}. ${t.title} (${formatAmount(t.amountCents)}, id ${t.id})`);
106
+ }
107
+ console.log(` 0. None — keep ${role} password-only`);
108
+ const ans = (await rl.question(` Pick [0-${detectedTiers.length}]${current ? ` (Enter = keep)` : ""}: `)).trim();
109
+ if (ans === "" && current)
110
+ continue; // keep existing
111
+ if (ans === "" || ans === "0") {
112
+ delete newTiers[role];
113
+ continue;
114
+ }
115
+ const idx = parseInt(ans, 10);
116
+ if (isNaN(idx) || idx < 1 || idx > detectedTiers.length) {
117
+ console.log(` (skipped — '${ans}' is not a number in range)`);
118
+ continue;
119
+ }
120
+ newTiers[role] = detectedTiers[idx - 1].id;
121
+ }
122
+ else {
123
+ const ans = (await rl.question(` Tier ID for '${role}'${current ? ` [${current}]` : " (Enter to skip)"}: `)).trim() || current || "";
124
+ if (!ans) {
125
+ delete newTiers[role];
126
+ continue;
127
+ }
128
+ if (!/^[0-9]+$/.test(ans)) {
129
+ console.log(` (skipped — tier IDs are numeric)`);
130
+ continue;
131
+ }
132
+ newTiers[role] = ans;
133
+ }
134
+ }
135
+ }
136
+ cfg.patreon = {
137
+ clientId,
138
+ clientSecret,
139
+ campaignId,
140
+ ...(Object.keys(newTiers).length > 0 ? { tiers: newTiers } : {}),
141
+ };
142
+ await saveConfig(vaultPath, cfg);
143
+ console.log("");
144
+ console.log("Saved Patreon configuration.");
145
+ if (Object.keys(newTiers).length > 0) {
146
+ console.log("Tier mappings:");
147
+ for (const [role, tier] of Object.entries(newTiers)) {
148
+ console.log(` ${role.padEnd(16)} → tier ${tier}`);
149
+ }
150
+ }
151
+ else {
152
+ console.log("No tier mappings yet — run `vaults patreon link <role> <tier-id>` to add some.");
153
+ }
154
+ console.log("Run `vaults push` to upload the client secret to Cloudflare.");
155
+ }
156
+ finally {
157
+ rl.close();
158
+ }
159
+ }
160
+ function formatAmount(cents) {
161
+ return `$${(cents / 100).toFixed(cents % 100 === 0 ? 0 : 2)}/mo`;
162
+ }
163
+ /**
164
+ * One-shot OAuth dance to fetch the creator's campaign + tier list.
165
+ * Spins up a local HTTP server on OAUTH_PORT (must be pre-registered as a
166
+ * redirect URI on the Patreon app), opens the user's browser to the
167
+ * authorize URL, awaits the callback, exchanges the code for an access
168
+ * token, fetches /v2/campaigns + /v2/campaigns/{id}?include=tiers, then
169
+ * discards the token. The user's only persistent state is the campaign
170
+ * ID + tier list saved in `.vaultrc.json`.
171
+ */
172
+ async function oauthFetchCampaignAndTiers(clientId, clientSecret, rl) {
173
+ const state = cryptoRandomState();
174
+ const authorize = new URL("https://www.patreon.com/oauth2/authorize");
175
+ authorize.searchParams.set("response_type", "code");
176
+ authorize.searchParams.set("client_id", clientId);
177
+ authorize.searchParams.set("redirect_uri", OAUTH_REDIRECT_URI);
178
+ authorize.searchParams.set("scope", "campaigns identity");
179
+ authorize.searchParams.set("state", state);
180
+ const codePromise = listenForCallback(state);
181
+ console.log("Opening browser to Patreon for authorisation…");
182
+ console.log("If the browser doesn't open, paste this URL:");
183
+ console.log(` ${authorize.toString()}`);
184
+ console.log("");
185
+ tryOpenBrowser(authorize.toString());
186
+ const code = await codePromise;
187
+ // Exchange code → access token
188
+ const tokenRes = await fetch("https://www.patreon.com/api/oauth2/token", {
189
+ method: "POST",
190
+ headers: { "Content-Type": "application/x-www-form-urlencoded" },
191
+ body: new URLSearchParams({
192
+ grant_type: "authorization_code",
193
+ code,
194
+ client_id: clientId,
195
+ client_secret: clientSecret,
196
+ redirect_uri: OAUTH_REDIRECT_URI,
197
+ }).toString(),
198
+ });
199
+ if (!tokenRes.ok) {
200
+ const txt = await tokenRes.text().catch(() => "");
201
+ throw new Error(`Patreon token exchange failed (${tokenRes.status}): ${txt.slice(0, 200)}`);
202
+ }
203
+ const tokenData = await tokenRes.json();
204
+ const accessToken = tokenData.access_token;
205
+ if (!accessToken)
206
+ throw new Error("Patreon token response had no access_token.");
207
+ // List campaigns owned by the creator (v2 requires explicit fields).
208
+ const campaignsRes = await fetch("https://www.patreon.com/api/oauth2/v2/campaigns?fields%5Bcampaign%5D=creation_name,vanity,patron_count", { headers: { Authorization: `Bearer ${accessToken}` } });
209
+ if (!campaignsRes.ok) {
210
+ throw new Error(`/v2/campaigns failed (${campaignsRes.status}). Make sure the OAuth client has the 'campaigns' scope.`);
211
+ }
212
+ const campaignsBody = await campaignsRes.json();
213
+ const campaigns = campaignsBody.data ?? [];
214
+ if (campaigns.length === 0) {
215
+ throw new Error("No campaigns found on this Patreon account. Are you signed in as the creator?");
216
+ }
217
+ let chosen;
218
+ if (campaigns.length === 1) {
219
+ chosen = campaigns[0];
220
+ }
221
+ else {
222
+ console.log("");
223
+ console.log("This account owns multiple campaigns. Pick one:");
224
+ campaigns.forEach((c, i) => {
225
+ const label = c.attributes.creation_name || c.attributes.vanity || `campaign ${c.id}`;
226
+ console.log(` ${i + 1}. ${label} (id ${c.id}, ${c.attributes.patron_count ?? "?"} patrons)`);
227
+ });
228
+ while (true) {
229
+ const ans = (await rl.question(`Pick [1-${campaigns.length}]: `)).trim();
230
+ const idx = parseInt(ans, 10);
231
+ if (!isNaN(idx) && idx >= 1 && idx <= campaigns.length) {
232
+ chosen = campaigns[idx - 1];
233
+ break;
234
+ }
235
+ }
236
+ }
237
+ // Fetch tier list for the chosen campaign.
238
+ const tiersUrl = `https://www.patreon.com/api/oauth2/v2/campaigns/${chosen.id}`
239
+ + `?include=tiers&fields%5Btier%5D=title,amount_cents,published`;
240
+ const tiersRes = await fetch(tiersUrl, { headers: { Authorization: `Bearer ${accessToken}` } });
241
+ if (!tiersRes.ok) {
242
+ throw new Error(`/v2/campaigns/${chosen.id} failed (${tiersRes.status}).`);
243
+ }
244
+ const tiersBody = await tiersRes.json();
245
+ const tiers = (tiersBody.included ?? [])
246
+ // Only show currently-published tiers; unpublished ones can't gate access.
247
+ .filter((it) => it.type === "tier" && it.attributes?.published !== false)
248
+ .map((it) => ({
249
+ id: it.id,
250
+ title: it.attributes.title ?? "(untitled)",
251
+ amountCents: it.attributes.amount_cents ?? 0,
252
+ }))
253
+ // Sort ascending by amount so the menu reads low → high.
254
+ .sort((a, b) => a.amountCents - b.amountCents);
255
+ return { campaignId: chosen.id, tiers };
256
+ }
257
+ function listenForCallback(expectedState) {
258
+ return new Promise((resolve, reject) => {
259
+ const server = createServer((req, res) => {
260
+ const url = new URL(req.url ?? "/", `http://localhost:${OAUTH_PORT}`);
261
+ // Patreon redirects to the path we registered; ignore everything else
262
+ // (favicon probes, etc.) so a confused request doesn't tear down the
263
+ // OAuth dance mid-flight.
264
+ if (url.pathname !== "/auth/patreon/callback") {
265
+ res.writeHead(404).end();
266
+ return;
267
+ }
268
+ const code = url.searchParams.get("code");
269
+ const state = url.searchParams.get("state");
270
+ const err = url.searchParams.get("error");
271
+ if (err) {
272
+ res.writeHead(400, { "Content-Type": "text/html" });
273
+ res.end(`<html><body style="font-family: system-ui; padding: 2rem;"><h2>Patreon authorisation failed</h2><p>${escapeHtml(err)}</p></body></html>`);
274
+ server.close();
275
+ clearTimeout(timer);
276
+ reject(new Error(`Patreon returned error: ${err}`));
277
+ return;
278
+ }
279
+ if (!code || state !== expectedState) {
280
+ res.writeHead(400, { "Content-Type": "text/html" });
281
+ res.end(`<html><body style="font-family: system-ui; padding: 2rem;"><h2>Bad callback</h2><p>Missing code or state mismatch.</p></body></html>`);
282
+ server.close();
283
+ clearTimeout(timer);
284
+ reject(new Error("Missing code or state mismatch."));
285
+ return;
286
+ }
287
+ res.writeHead(200, { "Content-Type": "text/html" });
288
+ res.end(`<html><body style="font-family: system-ui; padding: 2rem; text-align: center;"><h2>✓ Authorised</h2><p>You can close this window and return to the CLI.</p></body></html>`);
289
+ server.close();
290
+ clearTimeout(timer);
291
+ resolve(code);
292
+ });
293
+ server.on("error", (e) => {
294
+ reject(new Error(`Couldn't bind localhost:${OAUTH_PORT} (${e.message}). Another process may be using it.`));
295
+ });
296
+ server.listen(OAUTH_PORT, "127.0.0.1");
297
+ const timer = setTimeout(() => {
298
+ server.close();
299
+ reject(new Error(`Patreon OAuth timed out after ${OAUTH_TIMEOUT_MS / 60_000} minutes.`));
300
+ }, OAUTH_TIMEOUT_MS);
301
+ });
302
+ }
303
+ function tryOpenBrowser(url) {
304
+ // Best-effort. WSL falls back to wslview/xdg-open if installed; pure
305
+ // headless boxes silently no-op and the user copy-pastes the URL.
306
+ const cmd = process.platform === "darwin" ? "open"
307
+ : process.platform === "win32" ? "cmd"
308
+ : "xdg-open";
309
+ const args = process.platform === "win32" ? ["/c", "start", "", url] : [url];
310
+ try {
311
+ const proc = spawn(cmd, args, { detached: true, stdio: "ignore" });
312
+ proc.unref();
313
+ proc.on("error", () => { });
314
+ }
315
+ catch { /* swallow */ }
316
+ }
317
+ function cryptoRandomState() {
318
+ // 16 random bytes → 32 hex chars; collision-resistant enough for a
319
+ // one-shot CSRF nonce that lives for at most 5 minutes.
320
+ const bytes = new Uint8Array(16);
321
+ crypto.getRandomValues(bytes);
322
+ return Array.from(bytes, (b) => b.toString(16).padStart(2, "0")).join("");
323
+ }
324
+ function escapeHtml(s) {
325
+ return String(s).replace(/[&<>]/g, (c) => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;" }[c]));
326
+ }
327
+ export async function patreonLink(role, tierId, vaultPath) {
328
+ const cfg = await loadConfig(vaultPath, {});
329
+ if (!cfg.patreon) {
330
+ throw new Error("Patreon is not configured yet. Run `vaults patreon configure` first.");
331
+ }
332
+ if (!cfg.roles.includes(role)) {
333
+ throw new Error(`Role '${role}' does not exist (have: ${cfg.roles.join(", ")}).`);
334
+ }
335
+ if (cfg.roles[0] === role) {
336
+ throw new Error(`'${role}' is the default role; it doesn't gate access, so a tier mapping has no effect.`);
337
+ }
338
+ if (!/^[0-9]+$/.test(tierId.trim())) {
339
+ throw new Error(`Tier ID looks wrong: '${tierId}'. Patreon tier IDs are numeric.`);
340
+ }
341
+ cfg.patreon.tiers = { ...(cfg.patreon.tiers ?? {}), [role]: tierId.trim() };
342
+ await saveConfig(vaultPath, cfg);
343
+ console.log(`Linked role '${role}' → Patreon tier ${tierId.trim()}.`);
344
+ console.log(` Patrons whose pledge grants this tier can now sign in to '${role}'`);
345
+ console.log(` via the Sign in with Patreon button (alongside the existing password).`);
346
+ }
347
+ export async function patreonUnlink(role, vaultPath) {
348
+ const cfg = await loadConfig(vaultPath, {});
349
+ if (!cfg.patreon?.tiers || !(role in cfg.patreon.tiers)) {
350
+ throw new Error(`Role '${role}' has no Patreon tier mapping.`);
351
+ }
352
+ delete cfg.patreon.tiers[role];
353
+ if (Object.keys(cfg.patreon.tiers).length === 0)
354
+ delete cfg.patreon.tiers;
355
+ await saveConfig(vaultPath, cfg);
356
+ console.log(`Unlinked role '${role}' from its Patreon tier. Password access still works.`);
357
+ }
358
+ export async function patreonClear(vaultPath) {
359
+ const cfg = await loadConfig(vaultPath, {});
360
+ if (!cfg.patreon) {
361
+ console.log("No Patreon configuration to clear.");
362
+ return;
363
+ }
364
+ if (stdin.isTTY) {
365
+ const rl = createInterface({ input: stdin, output: stdout });
366
+ try {
367
+ const ans = (await rl.question("Remove the Patreon block (clientId, clientSecret, campaignId, all tier mappings)? [y/N] ")).trim().toLowerCase();
368
+ if (ans !== "y" && ans !== "yes") {
369
+ console.log("Cancelled.");
370
+ return;
371
+ }
372
+ }
373
+ finally {
374
+ rl.close();
375
+ }
376
+ }
377
+ delete cfg.patreon;
378
+ await saveConfig(vaultPath, cfg);
379
+ console.log("Removed Patreon configuration. Run `vaults push --rotate-secret` if you also want");
380
+ console.log("to invalidate any sessions that were issued via the Patreon path.");
381
+ }
382
+ export async function patreonStatus(vaultPath) {
383
+ const cfg = await loadConfig(vaultPath, {});
384
+ if (!cfg.patreon) {
385
+ console.log("Patreon: not configured. Run `vaults patreon configure` to enable.");
386
+ return;
387
+ }
388
+ const { clientId, campaignId, tiers } = cfg.patreon;
389
+ console.log(`Patreon: configured`);
390
+ console.log(` client ID: ${maskMid(clientId)}`);
391
+ console.log(` campaign ID: ${campaignId}`);
392
+ console.log(` tier mappings:`);
393
+ if (!tiers || Object.keys(tiers).length === 0) {
394
+ console.log(` (none) — Sign in with Patreon won't be offered.`);
395
+ return;
396
+ }
397
+ for (const role of cfg.roles) {
398
+ const tier = tiers[role];
399
+ if (tier)
400
+ console.log(` ${role.padEnd(16)} → tier ${tier}`);
401
+ }
402
+ const orphans = Object.keys(tiers).filter((r) => !cfg.roles.includes(r));
403
+ for (const role of orphans) {
404
+ console.log(` ${role.padEnd(16)} → tier ${tiers[role]} (role no longer exists)`);
405
+ }
406
+ }
407
+ /** Show the first 4 + last 4 chars of a long secret-ish identifier. */
408
+ function maskMid(s) {
409
+ if (s.length <= 12)
410
+ return "***";
411
+ return s.slice(0, 4) + "…" + s.slice(-4);
412
+ }
413
+ //# sourceMappingURL=patreon.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"patreon.js","sourceRoot":"","sources":["../../src/commands/patreon.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAEtD,yEAAyE;AACzE,sEAAsE;AACtE,0EAA0E;AAC1E,wEAAwE;AACxE,qEAAqE;AACrE,qCAAqC;AACrC,MAAM,UAAU,GAAG,IAAI,CAAC;AACxB,MAAM,kBAAkB,GAAG,oBAAoB,UAAU,wBAAwB,CAAC;AAClF,MAAM,gBAAgB,GAAG,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC,oDAAoD;AAE5F;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,SAAiB;IACtD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC;IAE7B,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,2FAA2F,CAAC,CAAC;IAC/G,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CAAC,kEAAkE,CAAC,CAAC;QAChF,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;QAC5E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;QAC7D,OAAO,CAAC,GAAG,CAAC,+DAA+D,CAAC,CAAC;QAC7E,OAAO,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC;QAC/E,OAAO,CAAC,GAAG,CAAC,QAAQ,kBAAkB,EAAE,CAAC,CAAC;QAC1C,OAAO,CAAC,GAAG,CAAC,sEAAsE,CAAC,CAAC;QACpF,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,8EAA8E,CAAC,CAAC;QAC5F,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7D,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CACjC,oBAAoB,QAAQ,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAC3E,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,EAAE,QAAQ,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;QAEzD,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CACrC,wBAAwB,QAAQ,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,IAAI,CAC/D,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,EAAE,YAAY,IAAI,EAAE,CAAC;QAC1C,IAAI,CAAC,YAAY;YAAE,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;QAEjE,sEAAsE;QACtE,kEAAkE;QAClE,qEAAqE;QACrE,yBAAyB;QACzB,MAAM,YAAY,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CACrC,iEAAiE,CAClE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,YAAY,KAAK,GAAG,IAAI,YAAY,KAAK,IAAI,CAAC;QAEhE,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,aAAa,GAAW,EAAE,CAAC;QAC/B,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,QAAQ,EAAE,YAAY,EAAE,EAAE,CAAC,CAAC;YAC9E,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;YACjC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC;YAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,sBAAsB,UAAU,EAAE,CAAC,CAAC;YAChD,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,GAAG,CAAC,mBAAmB,aAAa,CAAC,MAAM,IAAI,CAAC,CAAC;gBACzD,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;oBAC9B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;gBACnF,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CAAC,4CAA4C,CAAC,CAAC;YAC5D,CAAC;QACH,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC7B,sBAAsB,QAAQ,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CACtE,CAAC,CAAC,IAAI,EAAE,IAAI,QAAQ,EAAE,UAAU,IAAI,EAAE,CAAC;YACxC,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;QAC/D,CAAC;QAED,qEAAqE;QACrE,uEAAuE;QACvE,kEAAkE;QAClE,4CAA4C;QAC5C,MAAM,cAAc,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAA2B,EAAE,GAAG,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,OAAO,CAAC,GAAG,CAAC,yEAAyE,CAAC,CAAC;YACvF,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;gBAClC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;gBAC/B,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBAChB,OAAO,CAAC,GAAG,CAAC,WAAW,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,uBAAuB,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;oBAClF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;wBAC9C,MAAM,CAAC,GAAG,aAAa,CAAC,CAAC,CAAE,CAAC;wBAC5B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;oBACvF,CAAC;oBACD,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,gBAAgB,CAAC,CAAC;oBACxD,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,aAAa,CAAC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;oBAClH,IAAI,GAAG,KAAK,EAAE,IAAI,OAAO;wBAAE,SAAS,CAAC,gBAAgB;oBACrD,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;wBAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;oBACnE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;oBAC9B,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,IAAI,GAAG,GAAG,aAAa,CAAC,MAAM,EAAE,CAAC;wBACxD,OAAO,CAAC,GAAG,CAAC,mBAAmB,GAAG,6BAA6B,CAAC,CAAC;wBACjE,SAAS;oBACX,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,GAAG,aAAa,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC,EAAE,CAAC;gBAC9C,CAAC;qBAAM,CAAC;oBACN,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC5B,kBAAkB,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,kBAAkB,IAAI,CAC7E,CAAC,CAAC,IAAI,EAAE,IAAI,OAAO,IAAI,EAAE,CAAC;oBAC3B,IAAI,CAAC,GAAG,EAAE,CAAC;wBAAC,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC;wBAAC,SAAS;oBAAC,CAAC;oBAC9C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;wBAC1B,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAC;wBACpD,SAAS;oBACX,CAAC;oBACD,QAAQ,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC;gBACvB,CAAC;YACH,CAAC;QACH,CAAC;QAED,GAAG,CAAC,OAAO,GAAG;YACZ,QAAQ;YACR,YAAY;YACZ,UAAU;YACV,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACjE,CAAC;QACF,MAAM,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;QAC5C,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;YAC9B,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,gFAAgF,CAAC,CAAC;QAChG,CAAC;QACD,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC9E,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC;AAID,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACnE,CAAC;AAED;;;;;;;;GAQG;AACH,KAAK,UAAU,0BAA0B,CACvC,QAAgB,EAChB,YAAoB,EACpB,EAAsC;IAEtC,MAAM,KAAK,GAAG,iBAAiB,EAAE,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,0CAA0C,CAAC,CAAC;IACtE,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IACpD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IAClD,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,kBAAkB,CAAC,CAAC;IAC/D,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,oBAAoB,CAAC,CAAC;IAC1D,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAE3C,MAAM,WAAW,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,+CAA+C,CAAC,CAAC;IAC7D,OAAO,CAAC,GAAG,CAAC,8CAA8C,CAAC,CAAC;IAC5D,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;IAErC,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC;IAE/B,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,0CAA0C,EAAE;QACvE,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;QAChE,IAAI,EAAE,IAAI,eAAe,CAAC;YACxB,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,SAAS,EAAE,QAAQ;YACnB,aAAa,EAAE,YAAY;YAC3B,YAAY,EAAE,kBAAkB;SACjC,CAAC,CAAC,QAAQ,EAAE;KACd,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,kCAAkC,QAAQ,CAAC,MAAM,MAAM,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9F,CAAC;IACD,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+B,CAAC;IACrE,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,CAAC;IAC3C,IAAI,CAAC,WAAW;QAAE,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;IAEjF,qEAAqE;IACrE,MAAM,YAAY,GAAG,MAAM,KAAK,CAC9B,wGAAwG,EACxG,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,EAAE,CACxD,CAAC;IACF,IAAI,CAAC,YAAY,CAAC,EAAE,EAAE,CAAC;QACrB,MAAM,IAAI,KAAK,CAAC,yBAAyB,YAAY,CAAC,MAAM,0DAA0D,CAAC,CAAC;IAC1H,CAAC;IAED,MAAM,aAAa,GAAG,MAAM,YAAY,CAAC,IAAI,EAA2B,CAAC;IACzE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,IAAI,EAAE,CAAC;IAC3C,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;IACnG,CAAC;IAED,IAAI,MAAgB,CAAC;IACrB,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,SAAS,CAAC,CAAC,CAAE,CAAC;IACzB,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC;QAC/D,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;YACzB,MAAM,KAAK,GAAG,CAAC,CAAC,UAAU,CAAC,aAAa,IAAI,CAAC,CAAC,UAAU,CAAC,MAAM,IAAI,YAAY,CAAC,CAAC,EAAE,EAAE,CAAC;YACtF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,UAAU,CAAC,YAAY,IAAI,GAAG,WAAW,CAAC,CAAC;QACjG,CAAC,CAAC,CAAC;QACH,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,SAAS,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACzE,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,SAAS,CAAC,MAAM,EAAE,CAAC;gBACvD,MAAM,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAE,CAAC;gBAC7B,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IAED,2CAA2C;IAC3C,MAAM,QAAQ,GAAG,mDAAmD,MAAM,CAAC,EAAE,EAAE;UAC3E,8DAA8D,CAAC;IACnE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,WAAW,EAAE,EAAE,EAAE,CAAC,CAAC;IAChG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,iBAAiB,MAAM,CAAC,EAAE,YAAY,QAAQ,CAAC,MAAM,IAAI,CAAC,CAAC;IAC7E,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,IAAI,EAA+B,CAAC;IACrE,MAAM,KAAK,GAAW,CAAC,SAAS,CAAC,QAAQ,IAAI,EAAE,CAAC;QAC9C,2EAA2E;SAC1E,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,MAAM,IAAI,EAAE,CAAC,UAAU,EAAE,SAAS,KAAK,KAAK,CAAC;SACxE,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACZ,EAAE,EAAE,EAAE,CAAC,EAAE;QACT,KAAK,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,IAAI,YAAY;QAC1C,WAAW,EAAE,EAAE,CAAC,UAAU,CAAC,YAAY,IAAI,CAAC;KAC7C,CAAC,CAAC;QACH,yDAAyD;SACxD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAEjD,OAAO,EAAE,UAAU,EAAE,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC;AAC1C,CAAC;AAED,SAAS,iBAAiB,CAAC,aAAqB;IAC9C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,MAAM,MAAM,GAAG,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;YACvC,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,GAAG,EAAE,oBAAoB,UAAU,EAAE,CAAC,CAAC;YACtE,sEAAsE;YACtE,qEAAqE;YACrE,0BAA0B;YAC1B,IAAI,GAAG,CAAC,QAAQ,KAAK,wBAAwB,EAAE,CAAC;gBAC9C,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;gBACzB,OAAO;YACT,CAAC;YACD,MAAM,IAAI,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;YAC1C,MAAM,KAAK,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,GAAG,EAAE,CAAC;gBACR,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,sGAAsG,UAAU,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;gBACnJ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,GAAG,EAAE,CAAC,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,IAAI,CAAC,IAAI,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;gBACrC,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;gBACpD,GAAG,CAAC,GAAG,CAAC,sIAAsI,CAAC,CAAC;gBAChJ,MAAM,CAAC,KAAK,EAAE,CAAC;gBACf,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC,CAAC;gBACrD,OAAO;YACT,CAAC;YACD,GAAG,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,WAAW,EAAE,CAAC,CAAC;YACpD,GAAG,CAAC,GAAG,CAAC,2KAA2K,CAAC,CAAC;YACrL,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE;YACvB,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,UAAU,KAAM,CAAW,CAAC,OAAO,qCAAqC,CAAC,CAAC,CAAC;QACzH,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QAEvC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC5B,MAAM,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,KAAK,CAAC,iCAAiC,gBAAgB,GAAG,MAAM,WAAW,CAAC,CAAC,CAAC;QAC3F,CAAC,EAAE,gBAAgB,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,cAAc,CAAC,GAAW;IACjC,qEAAqE;IACrE,kEAAkE;IAClE,MAAM,GAAG,GAAG,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM;QAChD,CAAC,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK;YACpC,CAAC,CAAC,UAAU,CAAC;IACjB,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,EAAE,CAAC;QACb,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAe,CAAC,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC,CAAC,aAAa,CAAC,CAAC;AAC3B,CAAC;AAED,SAAS,iBAAiB;IACxB,mEAAmE;IACnE,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC;IACjC,MAAM,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAAY,EAAE,MAAc,EAAE,SAAiB;IAC/E,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC1F,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,2BAA2B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpF,CAAC;IACD,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC1B,MAAM,IAAI,KAAK,CAAC,IAAI,IAAI,iFAAiF,CAAC,CAAC;IAC7G,CAAC;IACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,yBAAyB,MAAM,kCAAkC,CAAC,CAAC;IACrF,CAAC;IAED,GAAG,CAAC,OAAO,CAAC,KAAK,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IAC5E,MAAM,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,gBAAgB,IAAI,oBAAoB,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;IACtE,OAAO,CAAC,GAAG,CAAC,+DAA+D,IAAI,GAAG,CAAC,CAAC;IACpF,OAAO,CAAC,GAAG,CAAC,0EAA0E,CAAC,CAAC;AAC1F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,IAAY,EAAE,SAAiB;IACjE,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,IAAI,CAAC,CAAC,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,SAAS,IAAI,gCAAgC,CAAC,CAAC;IACjE,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC/B,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC;IAC1E,MAAM,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,kBAAkB,IAAI,uDAAuD,CAAC,CAAC;AAC7F,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,SAAiB;IAClD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO;IACT,CAAC;IACD,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;QAChB,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;QAC7D,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CAC5B,0FAA0F,CAC3F,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;gBAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;QAC1E,CAAC;gBAAS,CAAC;YAAC,EAAE,CAAC,KAAK,EAAE,CAAC;QAAC,CAAC;IAC3B,CAAC;IACD,OAAO,GAAG,CAAC,OAAO,CAAC;IACnB,MAAM,UAAU,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;IACjC,OAAO,CAAC,GAAG,CAAC,mFAAmF,CAAC,CAAC;IACjG,OAAO,CAAC,GAAG,CAAC,mEAAmE,CAAC,CAAC;AACnF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,SAAiB;IACnD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,oEAAoE,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IACD,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,mBAAmB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACpD,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,EAAE,CAAC,CAAC;IAC7C,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9C,OAAO,CAAC,GAAG,CAAC,qDAAqD,CAAC,CAAC;QACnE,OAAO;IACT,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC;QAC7B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,IAAI;YAAE,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IACzE,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;QAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACtF,CAAC;AACH,CAAC;AAED,uEAAuE;AACvE,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,CAAC,CAAC,MAAM,IAAI,EAAE;QAAE,OAAO,KAAK,CAAC;IACjC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3C,CAAC"}
@@ -31,6 +31,9 @@ export async function preview(vaultPath, opts) {
31
31
  // Multi-role builds need SESSION_SECRET so the auth middleware can sign
32
32
  // cookies. Reuse the secret in .vaultrc.json (the one prod also uses) so a
33
33
  // logged-in browser session survives across `vaults preview` ↔ `vaults push`.
34
+ // When Patreon is configured, PATREON_CLIENT_SECRET also needs to be in
35
+ // scope so the /auth/patreon/callback handler can exchange codes for
36
+ // tokens — otherwise the visitor gets "Patreon login is misconfigured".
34
37
  // Wrangler resolves Functions/ relative to cwd, so we must run with the
35
38
  // output dir as cwd and pass "." rather than the absolute path.
36
39
  const wranglerArgs = ["wrangler", "pages", "dev", ".", `--port=${port}`, "--compatibility-date=2024-12-01"];
@@ -43,6 +46,10 @@ export async function preview(vaultPath, opts) {
43
46
  console.log("Generated SESSION_SECRET (saved to .vaultrc.json).");
44
47
  }
45
48
  wranglerArgs.push(`--binding=SESSION_SECRET=${secret}`);
49
+ if (cfg.patreon?.clientSecret) {
50
+ wranglerArgs.push(`--binding=PATREON_CLIENT_SECRET=${cfg.patreon.clientSecret}`);
51
+ console.log(` Patreon login active; sign-in flows through localhost:${port}/auth/patreon/callback`);
52
+ }
46
53
  console.log(` multi-role build; sign in at http://localhost:${port}/login.html`);
47
54
  }
48
55
  console.log(`\n Starting wrangler pages dev on port ${port}...`);
@@ -1 +1 @@
1
- {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"preview.js","sourceRoot":"","sources":["../../src/commands/preview.ts"],"names":[],"mappings":"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"}
@@ -52,6 +52,13 @@ export async function push(vaultPath, opts) {
52
52
  }
53
53
  await wranglerSecret(cfg.projectName, "SESSION_SECRET", secret);
54
54
  }
55
+ // Upload the Patreon client secret as a separate Wrangler secret. We do
56
+ // this on every push (not just first) so a `vaults patreon configure`
57
+ // that updates the secret without rotating the session also takes
58
+ // effect — Wrangler's secret put is idempotent for the same value.
59
+ if (cfg.patreon?.clientSecret) {
60
+ await wranglerSecret(cfg.projectName, "PATREON_CLIENT_SECRET", cfg.patreon.clientSecret);
61
+ }
55
62
  await wranglerDeploy(outputDir, cfg.projectName);
56
63
  }
57
64
  // ── First-push bootstrap ─────────────────────────────────────────────────
@@ -1 +1 @@
1
- {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"push.js","sourceRoot":"","sources":["../../src/commands/push.ts"],"names":[],"mappings":"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"}