@astris-labs/cli 0.1.3 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +74 -16
- package/package.json +9 -1
- package/src/client.mjs +20 -3
- package/src/commands.mjs +976 -143
- package/src/main.mjs +11 -1
- package/src/mcp-bridge.mjs +186 -0
- package/src/new.mjs +159 -0
- package/templates.json +1 -0
package/src/main.mjs
CHANGED
|
@@ -4,7 +4,9 @@ import { createInterface } from "node:readline";
|
|
|
4
4
|
import { Writable } from "node:stream";
|
|
5
5
|
import { fileURLToPath } from "node:url";
|
|
6
6
|
import { DEFAULT_BASE_URL } from "./client.mjs";
|
|
7
|
-
import {
|
|
7
|
+
import { mcp } from "./mcp-bridge.mjs";
|
|
8
|
+
import { newProject } from "./new.mjs";
|
|
9
|
+
import { accountExport, app, billing, compose, database, deploy, diagnose, domains, env, list, login, logout, logs, next, plans, preflight, project, restart, rollback, status, storage, usage, whoami } from "./commands.mjs";
|
|
8
10
|
|
|
9
11
|
const PROMPT = "Paste your Astris API key: ";
|
|
10
12
|
|
|
@@ -54,8 +56,10 @@ const handlers = new Map([
|
|
|
54
56
|
["restart", restart],
|
|
55
57
|
["logs", logs],
|
|
56
58
|
["list", list],
|
|
59
|
+
["project", project],
|
|
57
60
|
["usage", usage],
|
|
58
61
|
["plans", plans],
|
|
62
|
+
["billing", billing],
|
|
59
63
|
["whoami", whoami],
|
|
60
64
|
["next", next],
|
|
61
65
|
["rollback", rollback],
|
|
@@ -64,6 +68,8 @@ const handlers = new Map([
|
|
|
64
68
|
["app", app],
|
|
65
69
|
["preflight", preflight],
|
|
66
70
|
["export", accountExport],
|
|
71
|
+
["mcp", mcp],
|
|
72
|
+
["new", newProject],
|
|
67
73
|
]);
|
|
68
74
|
|
|
69
75
|
export const COMMANDS = [...handlers.keys()];
|
|
@@ -92,6 +98,7 @@ async function readStdin() {
|
|
|
92
98
|
|
|
93
99
|
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
94
100
|
const isEnvWithoutNames = process.argv[2] === "env" && !process.argv.slice(3).includes("--names");
|
|
101
|
+
const isMcp = process.argv[2] === "mcp";
|
|
95
102
|
const stdin = (isEnvWithoutNames || process.argv[2] === "login") && !process.stdin.isTTY ? await readStdin() : "";
|
|
96
103
|
const io = {
|
|
97
104
|
env: process.env,
|
|
@@ -100,7 +107,10 @@ if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToP
|
|
|
100
107
|
stdin,
|
|
101
108
|
stdout: process.stdout,
|
|
102
109
|
stderr: process.stderr,
|
|
110
|
+
cwd: process.cwd(),
|
|
111
|
+
templatesFile: fileURLToPath(new URL("../templates.json", import.meta.url)),
|
|
103
112
|
};
|
|
113
|
+
if (isMcp) io.stdin = process.stdin;
|
|
104
114
|
if (process.argv[2] === "login" && process.stdin.isTTY) io.readSecret = readSecret;
|
|
105
115
|
const code = await main(process.argv, io);
|
|
106
116
|
process.exit(code);
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { createInterface } from "node:readline";
|
|
2
|
+
import { DEFAULT_BASE_URL, redact } from "./client.mjs";
|
|
3
|
+
import { readApiKey } from "./key.mjs";
|
|
4
|
+
|
|
5
|
+
// The SDK server answers 406 to a POST that does not list both media types.
|
|
6
|
+
const MCP_ACCEPT = "application/json, text/event-stream";
|
|
7
|
+
|
|
8
|
+
export async function mcp(_args, io) {
|
|
9
|
+
let key;
|
|
10
|
+
try {
|
|
11
|
+
key = readApiKey(io.env);
|
|
12
|
+
} catch {
|
|
13
|
+
io.stderr.write("Run astris login.\n");
|
|
14
|
+
return { exitCode: 1 };
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const rl = createInterface({ input: io.stdin, crlfDelay: Infinity });
|
|
18
|
+
let readFailed = false;
|
|
19
|
+
const onReadError = () => {
|
|
20
|
+
readFailed = true;
|
|
21
|
+
rl.close();
|
|
22
|
+
};
|
|
23
|
+
io.stdin.on("error", onReadError);
|
|
24
|
+
rl.on("error", onReadError);
|
|
25
|
+
|
|
26
|
+
try {
|
|
27
|
+
for await (const line of rl) {
|
|
28
|
+
if (line.trim() === "") {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
let parsed;
|
|
33
|
+
try {
|
|
34
|
+
parsed = JSON.parse(line);
|
|
35
|
+
} catch {
|
|
36
|
+
io.stdout.write(
|
|
37
|
+
redact(
|
|
38
|
+
JSON.stringify({
|
|
39
|
+
jsonrpc: "2.0",
|
|
40
|
+
id: null,
|
|
41
|
+
error: { code: -32700, message: "Parse error" },
|
|
42
|
+
}) + "\n",
|
|
43
|
+
key,
|
|
44
|
+
),
|
|
45
|
+
);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
const isPlainObject = typeof parsed === "object" && parsed !== null && !Array.isArray(parsed);
|
|
50
|
+
const isNotification = isPlainObject && !Object.hasOwn(parsed, "id");
|
|
51
|
+
|
|
52
|
+
if (isNotification) {
|
|
53
|
+
try {
|
|
54
|
+
const response = await io.fetchImpl(DEFAULT_BASE_URL + "/mcp", {
|
|
55
|
+
method: "POST",
|
|
56
|
+
redirect: "manual",
|
|
57
|
+
headers: {
|
|
58
|
+
Authorization: "Bearer " + key,
|
|
59
|
+
"content-type": "application/json",
|
|
60
|
+
accept: MCP_ACCEPT,
|
|
61
|
+
},
|
|
62
|
+
body: line,
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
if (response.status === 401) {
|
|
66
|
+
io.stderr.write("Run astris login.\n");
|
|
67
|
+
} else if (response.status !== 202) {
|
|
68
|
+
io.stderr.write("A notification was refused.\n");
|
|
69
|
+
}
|
|
70
|
+
} catch {
|
|
71
|
+
io.stderr.write("The request failed.\n");
|
|
72
|
+
}
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const requestId =
|
|
77
|
+
isPlainObject &&
|
|
78
|
+
(typeof parsed.id === "string" || typeof parsed.id === "number" || parsed.id === null)
|
|
79
|
+
? parsed.id
|
|
80
|
+
: null;
|
|
81
|
+
|
|
82
|
+
try {
|
|
83
|
+
const response = await io.fetchImpl(DEFAULT_BASE_URL + "/mcp", {
|
|
84
|
+
method: "POST",
|
|
85
|
+
redirect: "manual",
|
|
86
|
+
headers: {
|
|
87
|
+
Authorization: "Bearer " + key,
|
|
88
|
+
"content-type": "application/json",
|
|
89
|
+
accept: MCP_ACCEPT,
|
|
90
|
+
},
|
|
91
|
+
body: line,
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
// The server answers JSON. A stream could stay open, so refuse it before reading the body.
|
|
95
|
+
if ((response.headers.get("content-type") ?? "").toLowerCase().includes("text/event-stream")) {
|
|
96
|
+
await response.body?.cancel();
|
|
97
|
+
io.stdout.write(
|
|
98
|
+
redact(
|
|
99
|
+
JSON.stringify({
|
|
100
|
+
jsonrpc: "2.0",
|
|
101
|
+
id: requestId,
|
|
102
|
+
error: { code: -32603, message: "Internal error" },
|
|
103
|
+
}) + "\n",
|
|
104
|
+
key,
|
|
105
|
+
),
|
|
106
|
+
);
|
|
107
|
+
io.stderr.write("The request failed.\n");
|
|
108
|
+
continue;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const text = await response.text();
|
|
112
|
+
|
|
113
|
+
if (response.status === 401) {
|
|
114
|
+
io.stderr.write("Run astris login.\n");
|
|
115
|
+
if (text !== "") {
|
|
116
|
+
try {
|
|
117
|
+
const parsed_body = JSON.parse(text);
|
|
118
|
+
if (typeof parsed_body === "object" && parsed_body !== null) {
|
|
119
|
+
io.stdout.write(redact(JSON.stringify(parsed_body) + "\n", key));
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
} catch {
|
|
123
|
+
// Fall through to synthesized error
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
io.stdout.write(
|
|
127
|
+
redact(
|
|
128
|
+
JSON.stringify({
|
|
129
|
+
jsonrpc: "2.0",
|
|
130
|
+
id: requestId,
|
|
131
|
+
error: { code: -32001, message: "Unauthorized" },
|
|
132
|
+
}) + "\n",
|
|
133
|
+
key,
|
|
134
|
+
),
|
|
135
|
+
);
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
if (text !== "") {
|
|
140
|
+
try {
|
|
141
|
+
const parsed_body = JSON.parse(text);
|
|
142
|
+
io.stdout.write(redact(JSON.stringify(parsed_body) + "\n", key));
|
|
143
|
+
continue;
|
|
144
|
+
} catch {
|
|
145
|
+
// Fall through to error handling
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
io.stdout.write(
|
|
150
|
+
redact(
|
|
151
|
+
JSON.stringify({
|
|
152
|
+
jsonrpc: "2.0",
|
|
153
|
+
id: requestId,
|
|
154
|
+
error: { code: -32603, message: "Internal error" },
|
|
155
|
+
}) + "\n",
|
|
156
|
+
key,
|
|
157
|
+
),
|
|
158
|
+
);
|
|
159
|
+
io.stderr.write("The request failed.\n");
|
|
160
|
+
} catch {
|
|
161
|
+
io.stdout.write(
|
|
162
|
+
redact(
|
|
163
|
+
JSON.stringify({
|
|
164
|
+
jsonrpc: "2.0",
|
|
165
|
+
id: requestId,
|
|
166
|
+
error: { code: -32603, message: "Internal error" },
|
|
167
|
+
}) + "\n",
|
|
168
|
+
key,
|
|
169
|
+
),
|
|
170
|
+
);
|
|
171
|
+
io.stderr.write("The request failed.\n");
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
} catch {
|
|
175
|
+
readFailed = true;
|
|
176
|
+
} finally {
|
|
177
|
+
io.stdin.removeListener("error", onReadError);
|
|
178
|
+
rl.removeListener("error", onReadError);
|
|
179
|
+
rl.close();
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
if (readFailed) {
|
|
183
|
+
io.stderr.write("Could not read the next line.\n");
|
|
184
|
+
}
|
|
185
|
+
return { exitCode: 0 };
|
|
186
|
+
}
|
package/src/new.mjs
ADDED
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import { lstatSync, mkdirSync, readdirSync, readFileSync, realpathSync, rmSync, writeFileSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
const SENTENCE = {
|
|
6
|
+
refused: "Those arguments were refused. Check the flags and send them again.",
|
|
7
|
+
notEmpty: "That directory is not empty. Choose a new or empty directory.",
|
|
8
|
+
noBundle: "This install has no templates. Run the CLI from npm: npx @astris-labs/cli new <template>.",
|
|
9
|
+
damaged: "The templates in this install are damaged. Install the CLI again.",
|
|
10
|
+
};
|
|
11
|
+
|
|
12
|
+
const NAME = /^[a-z0-9][a-z0-9-]*$/;
|
|
13
|
+
|
|
14
|
+
// One row per template on main: the database it needs (or null) and the
|
|
15
|
+
// apps it deploys, each with its name and its extra deploy flags. A new
|
|
16
|
+
// template adds its row here (T-556).
|
|
17
|
+
const DOCKERFILE = " --build dockerfile --dockerfile Dockerfile";
|
|
18
|
+
export const NEXT_STEPS = new Map([
|
|
19
|
+
["fastapi-postgres", { database: "postgres", apps: [{ name: "<name>", flags: "" }] }],
|
|
20
|
+
["go-dockerfile", { database: null, apps: [{ name: "<name>", flags: DOCKERFILE }] }],
|
|
21
|
+
["nextjs-postgres", { database: "postgres", apps: [{ name: "<name>", flags: DOCKERFILE }] }],
|
|
22
|
+
[
|
|
23
|
+
"node-worker-cron",
|
|
24
|
+
{
|
|
25
|
+
database: "postgres",
|
|
26
|
+
apps: [
|
|
27
|
+
{ name: "<name>-worker", id: "<worker app id>", flags: ' --kind worker --command "node worker.mjs"' },
|
|
28
|
+
{ name: "<name>-cron", id: "<cron app id>", flags: ' --kind cron --command "node heartbeat.mjs" --schedule "*/5 * * * *"' },
|
|
29
|
+
],
|
|
30
|
+
},
|
|
31
|
+
],
|
|
32
|
+
]);
|
|
33
|
+
|
|
34
|
+
// Reads templates/<name>/ into { name: { files: [{ path, exec, body }] } },
|
|
35
|
+
// bodies in base64. npm drops nested .gitignore and .npmrc files from a
|
|
36
|
+
// tarball, so the templates travel as this one JSON file (T-556).
|
|
37
|
+
export function bundleTemplates(dir) {
|
|
38
|
+
let names;
|
|
39
|
+
try {
|
|
40
|
+
names = readdirSync(dir).sort();
|
|
41
|
+
} catch {
|
|
42
|
+
throw new Error(`templates folder not found: ${dir}`);
|
|
43
|
+
}
|
|
44
|
+
const bundle = {};
|
|
45
|
+
for (const name of names) {
|
|
46
|
+
if (!lstatSync(path.join(dir, name)).isDirectory()) throw new Error(`not a directory: ${name}`);
|
|
47
|
+
const files = [];
|
|
48
|
+
const walk = (rel) => {
|
|
49
|
+
for (const entry of readdirSync(path.join(dir, name, rel)).sort()) {
|
|
50
|
+
const relPath = rel === "" ? entry : `${rel}/${entry}`;
|
|
51
|
+
const st = lstatSync(path.join(dir, name, relPath));
|
|
52
|
+
if (st.isDirectory()) walk(relPath);
|
|
53
|
+
else if (st.isFile()) files.push({ path: relPath, exec: (st.mode & 0o111) !== 0, body: readFileSync(path.join(dir, name, relPath)).toString("base64") });
|
|
54
|
+
else throw new Error(`not a file or a directory: ${name}/${relPath}`);
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
walk("");
|
|
58
|
+
bundle[name] = { files };
|
|
59
|
+
}
|
|
60
|
+
return bundle;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function safePath(value) {
|
|
64
|
+
if (typeof value !== "string" || value === "" || value.includes("\\") || value.startsWith("/") || /^[A-Za-z]:/.test(value)) return false;
|
|
65
|
+
return value.split("/").every((segment) => segment !== "" && segment !== "." && segment !== "..");
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
function validFiles(template) {
|
|
69
|
+
const files = template?.files;
|
|
70
|
+
if (!Array.isArray(files)) return null;
|
|
71
|
+
const seen = new Set();
|
|
72
|
+
for (const file of files) {
|
|
73
|
+
if (!safePath(file?.path) || typeof file.body !== "string" || typeof file.exec !== "boolean") return null;
|
|
74
|
+
seen.add(file.path);
|
|
75
|
+
}
|
|
76
|
+
// Two entries that clash (the same path twice, or "a" beside "a/b") would
|
|
77
|
+
// fail half way through the writes, so they are refused before the first.
|
|
78
|
+
if (seen.size !== files.length) return null;
|
|
79
|
+
for (const file of files) {
|
|
80
|
+
const parts = file.path.split("/");
|
|
81
|
+
for (let i = 1; i < parts.length; i++) if (seen.has(parts.slice(0, i).join("/"))) return null;
|
|
82
|
+
}
|
|
83
|
+
return files;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
function nextSteps(name) {
|
|
87
|
+
const row = NEXT_STEPS.get(name) ?? { database: null, apps: [{ name: "<name>", flags: "" }] };
|
|
88
|
+
const lines = ["Next:", "1. Push this folder to a Git repository of your own."];
|
|
89
|
+
for (const app of row.apps) {
|
|
90
|
+
lines.push(`${lines.length}. astris deploy --project <project name> --name ${app.name} --git-url <repository URL> --branch main${app.flags}`);
|
|
91
|
+
}
|
|
92
|
+
if (row.database !== null) {
|
|
93
|
+
lines.push(`${lines.length}. astris database create --project <project id> --kind ${row.database} --name <name>-db`, " Build DATABASE_URL from its answer. Astris shows the password only once.");
|
|
94
|
+
for (const app of row.apps) {
|
|
95
|
+
const id = app.id ?? "<app id>";
|
|
96
|
+
lines.push(`${lines.length - 1}. Set DATABASE_URL with astris env --app ${id}, then run astris deploy --app ${id}.`);
|
|
97
|
+
}
|
|
98
|
+
lines.push(" astris env replaces every variable on the app, so send all of them in one call.");
|
|
99
|
+
}
|
|
100
|
+
return lines.join("\n");
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function refuse(io, sentence) {
|
|
104
|
+
io.stderr.write(`${sentence}\n`);
|
|
105
|
+
return { exitCode: 1 };
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// astris new <template> [dir]: writes one bundled template into a new or
|
|
109
|
+
// empty directory. Local only: no key, no request.
|
|
110
|
+
export async function newProject(args, io) {
|
|
111
|
+
if (args.length > 2 || args.some((word) => word.startsWith("-"))) return refuse(io, SENTENCE.refused);
|
|
112
|
+
let bundle;
|
|
113
|
+
try {
|
|
114
|
+
bundle = JSON.parse(readFileSync(io.templatesFile, "utf8"));
|
|
115
|
+
} catch (error) {
|
|
116
|
+
return refuse(io, error?.code === "ENOENT" ? SENTENCE.noBundle : SENTENCE.damaged);
|
|
117
|
+
}
|
|
118
|
+
if (bundle === null || typeof bundle !== "object" || Array.isArray(bundle)) return refuse(io, SENTENCE.damaged);
|
|
119
|
+
const names = Object.keys(bundle).filter((key) => NAME.test(key)).sort();
|
|
120
|
+
const [name, dirArg] = args;
|
|
121
|
+
if (name === undefined || !NAME.test(name) || !Object.hasOwn(bundle, name)) {
|
|
122
|
+
return refuse(io, `Name one of these templates: ${names.join(", ")}.`);
|
|
123
|
+
}
|
|
124
|
+
const files = validFiles(bundle[name]);
|
|
125
|
+
if (files === null) return refuse(io, SENTENCE.damaged);
|
|
126
|
+
|
|
127
|
+
const shown = dirArg ?? name;
|
|
128
|
+
const target = path.resolve(io.cwd ?? process.cwd(), shown);
|
|
129
|
+
let st = null;
|
|
130
|
+
try {
|
|
131
|
+
st = lstatSync(target);
|
|
132
|
+
} catch {
|
|
133
|
+
st = null;
|
|
134
|
+
}
|
|
135
|
+
if (st !== null && (!st.isDirectory() || readdirSync(target).length > 0)) return refuse(io, SENTENCE.notEmpty);
|
|
136
|
+
mkdirSync(target, { recursive: true });
|
|
137
|
+
for (const file of files) {
|
|
138
|
+
const dest = path.join(target, ...file.path.split("/"));
|
|
139
|
+
mkdirSync(path.dirname(dest), { recursive: true });
|
|
140
|
+
writeFileSync(dest, Buffer.from(file.body, "base64"), { flag: "wx", mode: file.exec ? 0o755 : 0o644 });
|
|
141
|
+
}
|
|
142
|
+
io.stdout.write(`Wrote ${files.length} files to ${shown}.\n${nextSteps(name)}\n`);
|
|
143
|
+
return { exitCode: 0 };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// npm runs these from cli/: prepack "node src/new.mjs --bundle", postpack
|
|
147
|
+
// "node src/new.mjs --unbundle".
|
|
148
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(fileURLToPath(import.meta.url))) {
|
|
149
|
+
const cliDir = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..");
|
|
150
|
+
const out = path.join(cliDir, "templates.json");
|
|
151
|
+
if (process.argv[2] === "--bundle") {
|
|
152
|
+
writeFileSync(out, JSON.stringify(bundleTemplates(path.join(cliDir, "..", "templates"))));
|
|
153
|
+
} else if (process.argv[2] === "--unbundle") {
|
|
154
|
+
rmSync(out, { force: true });
|
|
155
|
+
} else {
|
|
156
|
+
process.stderr.write("Use --bundle or --unbundle.\n");
|
|
157
|
+
process.exit(1);
|
|
158
|
+
}
|
|
159
|
+
}
|
package/templates.json
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"fastapi-postgres":{"files":[{"path":".env.example","exec":false,"body":"IyBTZXQgdGhpcyBvbiB0aGUgYXBwIHdpdGggdGhlIGVudiB0b29sLiBOZXZlciBjb21taXQgYSB2YWx1ZS4KREFUQUJBU0VfVVJMPQo="},{"path":".gitignore","exec":false,"body":"LmVudgpfX3B5Y2FjaGVfXy8KLnZlbnYvCg=="},{"path":".python-version","exec":false,"body":"My4xMgo="},{"path":"README.md","exec":false,"body":"IyBGYXN0QVBJICsgUG9zdGdyZXMgc3RhcnRlcgoKQSBzbWFsbCBGYXN0QVBJIGFwcCB3aXRoIG9uZSBQb3N0Z3JlcyB0YWJsZSwgYG5vdGVzYC4gSXQgaGFzIHRocmVlIHJvdXRlczogYEdFVCAvaGVhbHRoYCwgYEdFVCAvbm90ZXNgLCBhbmQgYFBPU1QgL25vdGVzYCB3aXRoIGB7ImJvZHkiOiAiLi4uIn1gLgoKIyMgRGVwbG95IG9uIEFzdHJpcwoKR2l2ZSB0aGVzZSBzdGVwcyB0byB5b3VyIEFJIGNvZGluZyB0b29sLiBJdCBydW5zIHRoZW0gd2l0aCB0aGUgQXN0cmlzIE1DUC4KCjEuIERlcGxveSB0aGUgR2l0IFVSTCBvZiB0aGlzIHJlcG9zaXRvcnkgd2l0aCBubyBgYnVpbGRgIGFuZCB3aXRoIGBwb3J0YCAzMDAwLiBLZWVwIHRoZSBgYXBwX2lkYCB0aGF0IHRoZSBhbnN3ZXIgZ2l2ZXMuCjIuIENyZWF0ZSBhIFBvc3RncmVzIGRhdGFiYXNlIGluIHRoZSBzYW1lIHByb2plY3QuIEtlZXAgdGhlIGhvc3QsIHBvcnQsIHVzZXIsIHBhc3N3b3JkIGFuZCBkYXRhYmFzZSBuYW1lIGZyb20gdGhlIGFuc3dlci4gQXN0cmlzIHNob3dzIHRoZSBwYXNzd29yZCBvbmx5IG9uY2UuCjMuIFNldCBgREFUQUJBU0VfVVJMYCBvbiB0aGUgYXBwIHdpdGggYGVudmA6IGBwb3N0Z3Jlc3FsOi8vPHVzZXI+OjxwYXNzd29yZD5APGhvc3Q+Ojxwb3J0Pi88ZGF0YWJhc2U+YC4gYGVudmAgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gc2VuZCBhbnkgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBzYW1lIGNhbGwuCjQuIERlcGxveSB0aGUgc2FtZSBgYXBwX2lkYCBhZ2Fpbi4gVGhlbiBjaGVjayBgc3RhdHVzYCB1bnRpbCBpdCBzaG93cyB0aGF0IHRoZSBkZXBsb3kgaXMgZG9uZS4KNS4gQmluZCBhIGRvbWFpbiBhbmQgb3BlbiBgaHR0cHM6Ly88aG9zdG5hbWU+L2hlYWx0aGAuIFRoZSBhbnN3ZXIgaXMgYHsic3RhdHVzIjogIm9rIiwgImRhdGFiYXNlIjogIm9rIn1gLgoKS2VlcCB0aGUgcGFzc3dvcmQgb3V0IG9mIHlvdXIgZmlsZXMgYW5kIGNvbW1pdHMuIEl0IGJlbG9uZ3Mgb25seSBpbiB0aGUgYXBwJ3MgdmFyaWFibGVzLgoKIyMgUnVuIGl0IG9uIHlvdXIgY29tcHV0ZXIKClNldCBgREFUQUJBU0VfVVJMYCB0byBhIFBvc3RncmVzIGRhdGFiYXNlIHRoYXQgeW91IHJ1bi4gVGhlbiBydW4gYHBpcCBpbnN0YWxsIC1yIHJlcXVpcmVtZW50cy50eHRgIGFuZCBgcHl0aG9uIG1haW4ucHlgLiBUaGUgYXBwIGxpc3RlbnMgb24gZXZlcnkgaW50ZXJmYWNlLCBvbiB0aGUgcG9ydCBpbiBgUE9SVGAsIG9yIG9uIDMwMDAgd2hlbiBgUE9SVGAgaXMgbm90IHNldC4gVW50aWwgYERBVEFCQVNFX1VSTGAgaXMgc2V0LCBgL2hlYWx0aGAgYW5zd2VycyB3aXRoIHN0YXR1cyA1MDMuCgpUbyBjaGFuZ2UgYSBkZXBlbmRlbmN5LCBlZGl0IGByZXF1aXJlbWVudHMuaW5gLCB0aGVuIHJ1biBgdXYgcGlwIGNvbXBpbGUgcmVxdWlyZW1lbnRzLmluIC0tcHl0aG9uLXZlcnNpb24gMy4xMiAtbyByZXF1aXJlbWVudHMudHh0YC4K"},{"path":"main.py","exec":false,"body":"aW1wb3J0IG9zCmZyb20gY29udGV4dGxpYiBpbXBvcnQgY29udGV4dG1hbmFnZXIKCmltcG9ydCBwc3ljb3BnCmltcG9ydCB1dmljb3JuCmZyb20gZmFzdGFwaSBpbXBvcnQgRmFzdEFQSSwgSFRUUEV4Y2VwdGlvbgpmcm9tIGZhc3RhcGkucmVzcG9uc2VzIGltcG9ydCBKU09OUmVzcG9uc2UKZnJvbSBweWRhbnRpYyBpbXBvcnQgQmFzZU1vZGVsCgphcHAgPSBGYXN0QVBJKCkKCkNSRUFURV9UQUJMRSA9ICIiIgpDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBub3RlcyAoCiAgICBpZCBTRVJJQUwgUFJJTUFSWSBLRVksCiAgICBib2R5IFRFWFQgTk9UIE5VTEwsCiAgICBjcmVhdGVkX2F0IFRJTUVTVEFNUFRaIE5PVCBOVUxMIERFRkFVTFQgbm93KCkKKQoiIiIKCgpjbGFzcyBOb3RlSW4oQmFzZU1vZGVsKToKICAgIGJvZHk6IHN0cgoKCkBjb250ZXh0bWFuYWdlcgpkZWYgY29ubmVjdCgpOgogICAgIyBSZWFkIHBlciByZXF1ZXN0LCBub3QgYXQgaW1wb3J0OiB0aGUgZmlyc3QgZGVwbG95IHJ1bnMgYmVmb3JlIERBVEFCQVNFX1VSTCBpcyBzZXQuCiAgICB1cmwgPSBvcy5lbnZpcm9uLmdldCgiREFUQUJBU0VfVVJMIikKICAgIGlmIG5vdCB1cmw6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iREFUQUJBU0VfVVJMIGlzIG5vdCBzZXQiKQogICAgdHJ5OgogICAgICAgIGNvbm4gPSBwc3ljb3BnLmNvbm5lY3QodXJsLCBjb25uZWN0X3RpbWVvdXQ9NSkKICAgIGV4Y2VwdCBwc3ljb3BnLk9wZXJhdGlvbmFsRXJyb3I6CiAgICAgICAgcmFpc2UgSFRUUEV4Y2VwdGlvbihzdGF0dXNfY29kZT01MDMsIGRldGFpbD0iZGF0YWJhc2UgdW5yZWFjaGFibGUiKSBmcm9tIE5vbmUKICAgIHdpdGggY29ubjoKICAgICAgICBjb25uLmV4ZWN1dGUoQ1JFQVRFX1RBQkxFKQogICAgICAgIHlpZWxkIGNvbm4KCgpAYXBwLmdldCgiL2hlYWx0aCIpCmRlZiBoZWFsdGgoKToKICAgIGlmIG5vdCBvcy5lbnZpcm9uLmdldCgiREFUQUJBU0VfVVJMIik6CiAgICAgICAgcmV0dXJuIEpTT05SZXNwb25zZSh7InN0YXR1cyI6ICJlcnJvciIsICJkYXRhYmFzZSI6ICJub3QgY29uZmlndXJlZCJ9LCBzdGF0dXNfY29kZT01MDMpCiAgICB0cnk6CiAgICAgICAgd2l0aCBjb25uZWN0KCkgYXMgY29ubjoKICAgICAgICAgICAgY29ubi5leGVjdXRlKCJTRUxFQ1QgMSIpCiAgICBleGNlcHQgKEhUVFBFeGNlcHRpb24sIHBzeWNvcGcuRXJyb3IpOgogICAgICAgIHJldHVybiBKU09OUmVzcG9uc2UoeyJzdGF0dXMiOiAiZXJyb3IiLCAiZGF0YWJhc2UiOiAidW5yZWFjaGFibGUifSwgc3RhdHVzX2NvZGU9NTAzKQogICAgcmV0dXJuIHsic3RhdHVzIjogIm9rIiwgImRhdGFiYXNlIjogIm9rIn0KCgpAYXBwLmdldCgiL25vdGVzIikKZGVmIGxpc3Rfbm90ZXMoKToKICAgIHdpdGggY29ubmVjdCgpIGFzIGNvbm46CiAgICAgICAgcm93cyA9IGNvbm4uZXhlY3V0ZSgiU0VMRUNUIGlkLCBib2R5LCBjcmVhdGVkX2F0IEZST00gbm90ZXMgT1JERVIgQlkgaWQiKS5mZXRjaGFsbCgpCiAgICByZXR1cm4gW3siaWQiOiByWzBdLCAiYm9keSI6IHJbMV0sICJjcmVhdGVkX2F0IjogclsyXS5pc29mb3JtYXQoKX0gZm9yIHIgaW4gcm93c10KCgpAYXBwLnBvc3QoIi9ub3RlcyIsIHN0YXR1c19jb2RlPTIwMSkKZGVmIGNyZWF0ZV9ub3RlKG5vdGU6IE5vdGVJbik6CiAgICB3aXRoIGNvbm5lY3QoKSBhcyBjb25uOgogICAgICAgIHJvdyA9IGNvbm4uZXhlY3V0ZSgKICAgICAgICAgICAgIklOU0VSVCBJTlRPIG5vdGVzIChib2R5KSBWQUxVRVMgKCVzKSBSRVRVUk5JTkcgaWQsIGJvZHksIGNyZWF0ZWRfYXQiLAogICAgICAgICAgICAobm90ZS5ib2R5LCksCiAgICAgICAgKS5mZXRjaG9uZSgpCiAgICByZXR1cm4geyJpZCI6IHJvd1swXSwgImJvZHkiOiByb3dbMV0sICJjcmVhdGVkX2F0Ijogcm93WzJdLmlzb2Zvcm1hdCgpfQoKCmlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CiAgICB1dmljb3JuLnJ1bihhcHAsIGhvc3Q9IjAuMC4wLjAiLCBwb3J0PWludChvcy5lbnZpcm9uLmdldCgiUE9SVCIsICIzMDAwIikpKQo="},{"path":"requirements.in","exec":false,"body":"ZmFzdGFwaQp1dmljb3JuCnBzeWNvcGdbYmluYXJ5XQo="},{"path":"requirements.txt","exec":false,"body":"IyBMb2NrZmlsZS4gUmVnZW5lcmF0ZSB3aXRoOiB1diBwaXAgY29tcGlsZSByZXF1aXJlbWVudHMuaW4gLS1weXRob24tdmVyc2lvbiAzLjEyIC1vIHJlcXVpcmVtZW50cy50eHQKYW5ub3RhdGVkLWRvYz09MC4wLjUKICAgICMgdmlhIGZhc3RhcGkKYW5ub3RhdGVkLXR5cGVzPT0wLjguMAogICAgIyB2aWEgcHlkYW50aWMKYW55aW89PTQuMTUuMQogICAgIyB2aWEgc3RhcmxldHRlCmNsaWNrPT04LjUuMAogICAgIyB2aWEgdXZpY29ybgpmYXN0YXBpPT0wLjE2MS4xCiAgICAjIHZpYSAtciByZXF1aXJlbWVudHMuaW4KaDExPT0wLjE2LjAKICAgICMgdmlhIHV2aWNvcm4KaWRuYT09My4yMAogICAgIyB2aWEgYW55aW8Kb3BlbnRlbGVtZXRyeS1hcGk9PTEuNDUuMQogICAgIyB2aWEgZmFzdGFwaQpwc3ljb3BnPT0zLjMuNgogICAgIyB2aWEgLXIgcmVxdWlyZW1lbnRzLmluCnBzeWNvcGctYmluYXJ5PT0zLjMuNgogICAgIyB2aWEgcHN5Y29wZwpweWRhbnRpYz09Mi4xNC4xCiAgICAjIHZpYSBmYXN0YXBpCnB5ZGFudGljLWNvcmU9PTIuNTAuMQogICAgIyB2aWEgcHlkYW50aWMKc3RhcmxldHRlPT0xLjkuMAogICAgIyB2aWEgZmFzdGFwaQp0eXBpbmctZXh0ZW5zaW9ucz09NC4xNi4wCiAgICAjIHZpYQogICAgIyAgIGFueWlvCiAgICAjICAgZmFzdGFwaQogICAgIyAgIG9wZW50ZWxlbWV0cnktYXBpCiAgICAjICAgcHN5Y29wZwogICAgIyAgIHB5ZGFudGljCiAgICAjICAgcHlkYW50aWMtY29yZQogICAgIyAgIHN0YXJsZXR0ZQogICAgIyAgIHR5cGluZy1pbnNwZWN0aW9uCnR5cGluZy1pbnNwZWN0aW9uPT0wLjQuNAogICAgIyB2aWEKICAgICMgICBmYXN0YXBpCiAgICAjICAgcHlkYW50aWMKdXZpY29ybj09MC41NC4wCiAgICAjIHZpYSAtciByZXF1aXJlbWVudHMuaW4K"}]},"go-dockerfile":{"files":[{"path":"Dockerfile","exec":false,"body":"IyBCdWlsZCBzdGFnZTogY29tcGlsZSBhIHN0YXRpYyBiaW5hcnkgd2l0aCB0aGUgR28gdG9vbGNoYWluLgpGUk9NIGdvbGFuZzoxLjI0LWFscGluZSBBUyBidWlsZApXT1JLRElSIC9zcmMKIyBUaGUgd2hvbGUgbW9kdWxlLCBzbyBwYWNrYWdlcyBpbiBzdWJmb2xkZXJzIGJ1aWxkIHRvby4gV2hlbiB0aGUgbW9kdWxlIGdldHMKIyBhIGRlcGVuZGVuY3ksIGdvLnN1bSBjb21lcyB3aXRoIGl0LgpDT1BZIC4gLgpSVU4gQ0dPX0VOQUJMRUQ9MCBnbyBidWlsZCAtdHJpbXBhdGggLWxkZmxhZ3M9Ii1zIC13IiAtbyAvb3V0L3NlcnZlciAuCgojIFJ1biBzdGFnZTogbm8gc2hlbGwsIG5vIHBhY2thZ2UgbWFuYWdlciwgYSBub24tcm9vdCB1c2VyLgpGUk9NIGdjci5pby9kaXN0cm9sZXNzL3N0YXRpYy1kZWJpYW4xMjpub25yb290CkNPUFkgLS1mcm9tPWJ1aWxkIC9vdXQvc2VydmVyIC9zZXJ2ZXIKVVNFUiA2NTUzMjo2NTUzMgpFWFBPU0UgMzAwMApFTlRSWVBPSU5UIFsiL3NlcnZlciJdCg=="},{"path":"README.md","exec":false,"body":"IyBHbyB3ZWIgc2VydmljZSAoRG9ja2VyZmlsZSkKCkEgc21hbGwgR28gd2ViIHNlcnZpY2UgdGhhdCBBc3RyaXMgYnVpbGRzIGZyb20gaXRzIG93biBEb2NrZXJmaWxlLiBJdCByZWFkcyBgUE9SVGAsIGxpc3RlbnMgb24gZXZlcnkgaW50ZXJmYWNlLCBhbmQgYW5zd2VycyBgR0VUIC9oZWFsdGhgIHdpdGggYHsib2siOnRydWV9YC4gVGhlIGltYWdlIHJ1bnMgYXMgYSBub24tcm9vdCB1c2VyLgoKU3RlcHMgZm9yIHlvdXIgY29kaW5nIGFnZW50OgoKMS4gQ29weSB0aGlzIGZvbGRlciB0byB0aGUgcm9vdCBvZiBhIG5ldyBHaXQgcmVwb3NpdG9yeSBvZiB5b3VyIG93biwgYW5kIHB1c2ggaXQgdG8gR2l0SHViLgoyLiBEZXBsb3kgaXQgd2l0aCB0aGUgQXN0cmlzIGBkZXBsb3lgIHRvb2w6IHlvdXIgcHJvamVjdCBuYW1lLCBhbiBhcHAgbmFtZSwgdGhlIHJlcG9zaXRvcnkncyBgZ2l0X3VybGAsIGl0cyBgYnJhbmNoYCwgYGJ1aWxkX3BhdGhgIGAiLyJgLCBgYnVpbGRgIGAiZG9ja2VyZmlsZSJgLCBgZG9ja2VyZmlsZWAgYCJEb2NrZXJmaWxlImAsIGFuZCBgd2FpdGAgYHRydWVgLgozLiBJZiB5b3UgcGFzcyBhIGBwb3J0YCBvdGhlciB0aGFuIDMwMDAsIHNldCB0aGUgdmFyaWFibGUgYFBPUlRgIHRvIHRoZSBzYW1lIG51bWJlciB3aXRoIHRoZSBgZW52YCB0b29sLCB0aGVuIGRlcGxveSBhZ2Fpbi4gYGVudmAgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gc2VuZCBhbnkgb3RoZXIgdmFyaWFibGVzIGluIHRoZSBzYW1lIGNhbGwuCjQuIE9wZW4gYGh0dHBzOi8vPGFwcD4uYXN0cmlzLmxpdmUvaGVhbHRoYCBhbmQgY2hlY2sgdGhhdCBpdCBhbnN3ZXJzIGB7Im9rIjp0cnVlfWAuCjUuIEFkZCB5b3VyIG93biByb3V0ZXMgaW4gYG1haW4uZ29gLCBjb21taXQsIHB1c2gsIGFuZCBkZXBsb3kgYWdhaW4gd2l0aCB0aGUgYXBwJ3MgYGFwcF9pZGAuCgpUaGUgbW9kdWxlIGhhcyBubyBkZXBlbmRlbmNpZXMuIFdoZW4geW91IGFkZCBvbmUsIHJ1biBgZ28gbW9kIHRpZHlgIGFuZCBjb21taXQgdGhlIGBnby5zdW1gIGZpbGUgaXQgd3JpdGVzLiBUaGUgRG9ja2VyZmlsZSBjb3BpZXMgdGhlIHdob2xlIGZvbGRlciwgc28gYGdvLnN1bWAgcmVhY2hlcyB0aGUgYnVpbGQgd2l0aCBubyBjaGFuZ2UgdG8gdGhlIERvY2tlcmZpbGUuCg=="},{"path":"go.mod","exec":false,"body":"bW9kdWxlIGV4YW1wbGUuY29tL2dvLWRvY2tlcmZpbGUKCmdvIDEuMjQK"},{"path":"main.go","exec":false,"body":"Ly8gQSBtaW5pbWFsIHdlYiBzZXJ2aWNlIGZvciBBc3RyaXM6IGl0IHJlYWRzIFBPUlQsIGJpbmRzIDAuMC4wLjAgYW5kIGFuc3dlcnMKLy8gR0VUIC9oZWFsdGguCnBhY2thZ2UgbWFpbgoKaW1wb3J0ICgKCSJsb2ciCgkibmV0IgoJIm5ldC9odHRwIgoJIm9zIgoJInRpbWUiCikKCmZ1bmMgbWFpbigpIHsKCXBvcnQgOj0gb3MuR2V0ZW52KCJQT1JUIikKCWlmIHBvcnQgPT0gIiIgewoJCXBvcnQgPSAiMzAwMCIKCX0KCgltdXggOj0gaHR0cC5OZXdTZXJ2ZU11eCgpCgltdXguSGFuZGxlRnVuYygiR0VUIC9oZWFsdGgiLCBmdW5jKHcgaHR0cC5SZXNwb25zZVdyaXRlciwgciAqaHR0cC5SZXF1ZXN0KSB7CgkJdy5IZWFkZXIoKS5TZXQoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIikKCQlfLCBfID0gdy5Xcml0ZShbXWJ5dGUoYHsib2siOnRydWV9YCkpCgl9KQoJbXV4LkhhbmRsZUZ1bmMoIkdFVCAveyR9IiwgZnVuYyh3IGh0dHAuUmVzcG9uc2VXcml0ZXIsIHIgKmh0dHAuUmVxdWVzdCkgewoJCXcuSGVhZGVyKCkuU2V0KCJDb250ZW50LVR5cGUiLCAidGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCIpCgkJXywgXyA9IHcuV3JpdGUoW11ieXRlKCJIZWxsbyBmcm9tIEFzdHJpcy5cbiIpKQoJfSkKCglzZXJ2ZXIgOj0gJmh0dHAuU2VydmVyewoJCUFkZHI6ICAgICAgICAgICAgICBuZXQuSm9pbkhvc3RQb3J0KCIwLjAuMC4wIiwgcG9ydCksCgkJSGFuZGxlcjogICAgICAgICAgIG11eCwKCQlSZWFkSGVhZGVyVGltZW91dDogMTAgKiB0aW1lLlNlY29uZCwKCX0KCWxvZy5QcmludGYoImxpc3RlbmluZyBvbiAlcyIsIHNlcnZlci5BZGRyKQoJbG9nLkZhdGFsKHNlcnZlci5MaXN0ZW5BbmRTZXJ2ZSgpKQp9Cg=="}]},"nextjs-postgres":{"files":[{"path":".dockerignore","exec":false,"body":"LmdpdApub2RlX21vZHVsZXMKLm5leHQKLmVudgouZW52LioK"},{"path":".env.example","exec":false,"body":"REFUQUJBU0VfVVJMPQo="},{"path":".gitignore","exec":false,"body":"bm9kZV9tb2R1bGVzCi5uZXh0Ci5lbnYKLmVudi4qCiEuZW52LmV4YW1wbGUK"},{"path":"Dockerfile","exec":false,"body":"RlJPTSBub2RlOjIyLWJvb2t3b3JtLXNsaW0gQVMgYnVpbGRlcgpXT1JLRElSIC9hcHAKQ09QWSBwYWNrYWdlLmpzb24gcG5wbS1sb2NrLnlhbWwgLi8KUlVOIGNvcmVwYWNrIHBucG0gaW5zdGFsbCAtLWZyb3plbi1sb2NrZmlsZQpDT1BZIC4gLgpSVU4gbWtkaXIgLXAgcHVibGljClJVTiBjb3JlcGFjayBwbnBtIHJ1biBidWlsZAoKRlJPTSBub2RlOjIyLWJvb2t3b3JtLXNsaW0KV09SS0RJUiAvYXBwCkVOViBOT0RFX0VOVj1wcm9kdWN0aW9uCkVOViBIT1NUTkFNRT0wLjAuMC4wCkVOViBQT1JUPTMwMDAKQ09QWSAtLWZyb209YnVpbGRlciAtLWNob3duPW5vZGU6bm9kZSAvYXBwLy5uZXh0L3N0YW5kYWxvbmUgLi8KQ09QWSAtLWZyb209YnVpbGRlciAtLWNob3duPW5vZGU6bm9kZSAvYXBwLy5uZXh0L3N0YXRpYyAuLy5uZXh0L3N0YXRpYwpDT1BZIC0tZnJvbT1idWlsZGVyIC0tY2hvd249bm9kZTpub2RlIC9hcHAvcHVibGljIC4vcHVibGljClVTRVIgbm9kZQpFWFBPU0UgMzAwMApDTUQgWyJub2RlIiwgInNlcnZlci5qcyJdCg=="},{"path":"README.md","exec":false,"body":"IyBOZXh0LmpzICsgUG9zdGdyZXMgc3RhcnRlcgoKQSBzbWFsbCBOZXh0LmpzIGFwcCB3aXRoIG9uZSBQb3N0Z3JlcyB0YWJsZS4gRWFjaCB2aXNpdCB0byB0aGUgaG9tZSBwYWdlIGFkZHMgYSByb3cgYW5kIHNob3dzIHRoZSBjb3VudC4gYC9oZWFsdGhgIGFuc3dlcnMgYHsib2siOnRydWV9YCBhbmQgZG9lcyBub3QgdXNlIHRoZSBkYXRhYmFzZS4KCiMjIERlcGxveSBvbiBBc3RyaXMKCkFzayB5b3VyIGNvZGluZyBhZ2VudCB0byBydW4gdGhlc2Ugc3RlcHMgd2l0aCB0aGUgQXN0cmlzIE1DUC4KCjEuIENyZWF0ZSBhIFBvc3RncmVzIGRhdGFiYXNlIHdpdGggdGhlIGBkYXRhYmFzZWAgdG9vbDogYGFjdGlvbmAgY3JlYXRlLCBga2luZGAgcG9zdGdyZXMsIHlvdXIgcHJvamVjdCBuYW1lIGFuZCBhIGRhdGFiYXNlIG5hbWUuIEtlZXAgdGhlIGFuc3dlciwgYmVjYXVzZSBBc3RyaXMgc2hvd3MgdGhlIHBhc3N3b3JkIG9ubHkgb25jZS4KMi4gRGVwbG95IHRoZSBhcHAgd2l0aCB0aGUgYGRlcGxveWAgdG9vbDogYGdpdF91cmxgIGh0dHBzOi8vZ2l0aHViLmNvbS9hc3RyaXMtbGFicy90ZW1wbGF0ZS1uZXh0anMtcG9zdGdyZXMsIGBicmFuY2hgIG1haW4sIGBidWlsZGAgZG9ja2VyZmlsZSwgYGRvY2tlcmZpbGVgIERvY2tlcmZpbGUsIHRoZSBzYW1lIHByb2plY3QgYW5kIGFuIGFwcCBuYW1lLgozLiBTZXQgYERBVEFCQVNFX1VSTGAgd2l0aCB0aGUgYGVudmAgdG9vbC4gQnVpbGQgaXQgZnJvbSB0aGUgZGF0YWJhc2UgYW5zd2VyOiBgcG9zdGdyZXM6Ly88dXNlcj46PHBhc3N3b3JkPkA8aG9zdD46PHBvcnQ+LzxkYXRhYmFzZT5gLiBgZW52YCByZXBsYWNlcyBldmVyeSB2YXJpYWJsZSBvbiB0aGUgYXBwLCBzbyBzZW5kIGFueSBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgY2FsbC4KNC4gUmVzdGFydCB0aGUgYXBwIHdpdGggdGhlIGByZXN0YXJ0YCB0b29sLCBzbyB0aGF0IGl0IHJlYWRzIHRoZSBuZXcgdmFyaWFibGUuCjUuIEJpbmQgYW4gYWRkcmVzcyB3aXRoIHRoZSBgZG9tYWluc2AgdG9vbCwgdGhlbiBvcGVuIGl0LgoKS2VlcCB0aGUgcGFzc3dvcmQgb3V0IG9mIHlvdXIgZmlsZXMgYW5kIGNvbW1pdHMuIEl0IGJlbG9uZ3Mgb25seSBpbiB0aGUgYXBwJ3MgdmFyaWFibGVzLgoKIyMgUnVuIGl0IG9uIHlvdXIgY29tcHV0ZXIKClNldCBgREFUQUJBU0VfVVJMYCB0byBhIFBvc3RncmVzIGRhdGFiYXNlIHRoYXQgeW91IHJ1biwgdGhlbiBydW4gYHBucG0gaW5zdGFsbGAgYW5kIGBwbnBtIGRldmAuCg=="},{"path":"app/health/route.js","exec":false,"body":"Ly8gQW5zd2VycyB3aXRob3V0IHRoZSBkYXRhYmFzZSwgc28gYSBkZXBsb3kgaXMgaGVhbHRoeSBiZWZvcmUgREFUQUJBU0VfVVJMIGlzIHNldC4KZXhwb3J0IGNvbnN0IGR5bmFtaWMgPSAiZm9yY2UtZHluYW1pYyI7CgpleHBvcnQgZnVuY3Rpb24gR0VUKCkgewogIHJldHVybiBSZXNwb25zZS5qc29uKHsgb2s6IHRydWUgfSk7Cn0K"},{"path":"app/layout.js","exec":false,"body":"ZXhwb3J0IGNvbnN0IG1ldGFkYXRhID0geyB0aXRsZTogIk5leHQuanMgKyBQb3N0Z3JlcyBvbiBBc3RyaXMiIH07CgpleHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBSb290TGF5b3V0KHsgY2hpbGRyZW4gfSkgewogIHJldHVybiAoCiAgICA8aHRtbCBsYW5nPSJlbiI+CiAgICAgIDxib2R5PntjaGlsZHJlbn08L2JvZHk+CiAgICA8L2h0bWw+CiAgKTsKfQo="},{"path":"app/page.js","exec":false,"body":"aW1wb3J0IHsgZ2V0UG9vbCB9IGZyb20gIi4uL2xpYi9kYiI7CmltcG9ydCB7IHJlY29yZFZpc2l0IH0gZnJvbSAiLi4vbGliL3Zpc2l0cyI7CgpleHBvcnQgY29uc3QgZHluYW1pYyA9ICJmb3JjZS1keW5hbWljIjsKCmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIEhvbWUoKSB7CiAgaWYgKCFwcm9jZXNzLmVudi5EQVRBQkFTRV9VUkwpIHsKICAgIHJldHVybiAoCiAgICAgIDxtYWluPgogICAgICAgIDxoMT5OZXh0LmpzICsgUG9zdGdyZXMgb24gQXN0cmlzPC9oMT4KICAgICAgICA8cD5TZXQgREFUQUJBU0VfVVJMIG9uIHRoaXMgYXBwLCB0aGVuIHJlc3RhcnQgaXQuPC9wPgogICAgICA8L21haW4+CiAgICApOwogIH0KICBjb25zdCBjb3VudCA9IGF3YWl0IHJlY29yZFZpc2l0KGdldFBvb2woKSk7CiAgcmV0dXJuICgKICAgIDxtYWluPgogICAgICA8aDE+TmV4dC5qcyArIFBvc3RncmVzIG9uIEFzdHJpczwvaDE+CiAgICAgIDxwPlZpc2l0czoge2NvdW50fTwvcD4KICAgIDwvbWFpbj4KICApOwp9Cg=="},{"path":"lib/db.js","exec":false,"body":"aW1wb3J0IHBnIGZyb20gInBnIjsKCi8vIE9uZSBwb29sIHBlciBzZXJ2ZXIgcHJvY2Vzcy4gREFUQUJBU0VfVVJMIGlzIHJlYWQgb24gdGhlIGZpcnN0IHF1ZXJ5LCBzbyB0aGUKLy8gYnVpbGQgYW5kIC9oZWFsdGggcnVuIHdpdGhvdXQgaXQuCmxldCBwb29sOwoKZXhwb3J0IGNvbnN0IGdldFBvb2wgPSAoKSA9PiB7CiAgcG9vbCA/Pz0gbmV3IHBnLlBvb2woeyBjb25uZWN0aW9uU3RyaW5nOiBwcm9jZXNzLmVudi5EQVRBQkFTRV9VUkwsIG1heDogNSB9KTsKICByZXR1cm4gcG9vbDsKfTsK"},{"path":"lib/visits.js","exec":false,"body":"Ly8gUmVjb3JkcyBvbmUgdmlzaXQgYW5kIHJldHVybnMgaG93IG1hbnkgdGhlcmUgYXJlLiBgZGJgIGlzIGFueXRoaW5nIHdpdGgKLy8gcXVlcnkoc3FsLCBwYXJhbXMpIHRoYXQgYW5zd2VycyB7IHJvd3MgfTogYSBwZyBQb29sIG9yIGEgUEdsaXRlIGNsaWVudC4KZXhwb3J0IGNvbnN0IHJlY29yZFZpc2l0ID0gYXN5bmMgKGRiKSA9PiB7CiAgYXdhaXQgZGIucXVlcnkoCiAgICAiY3JlYXRlIHRhYmxlIGlmIG5vdCBleGlzdHMgdmlzaXRzIChpZCBzZXJpYWwgcHJpbWFyeSBrZXksIHZpc2l0ZWRfYXQgdGltZXN0YW1wdHogbm90IG51bGwgZGVmYXVsdCBub3coKSkiLAogICk7CiAgYXdhaXQgZGIucXVlcnkoImluc2VydCBpbnRvIHZpc2l0cyBkZWZhdWx0IHZhbHVlcyIpOwogIGNvbnN0IHsgcm93cyB9ID0gYXdhaXQgZGIucXVlcnkoInNlbGVjdCBjb3VudCgqKTo6aW50IGFzIGNvdW50IGZyb20gdmlzaXRzIik7CiAgcmV0dXJuIHJvd3NbMF0uY291bnQ7Cn07Cg=="},{"path":"next.config.mjs","exec":false,"body":"LyoqIEB0eXBlIHtpbXBvcnQoIm5leHQiKS5OZXh0Q29uZmlnfSAqLwpjb25zdCBuZXh0Q29uZmlnID0geyBvdXRwdXQ6ICJzdGFuZGFsb25lIiB9OwoKZXhwb3J0IGRlZmF1bHQgbmV4dENvbmZpZzsK"},{"path":"package.json","exec":false,"body":"ewogICJuYW1lIjogIm5leHRqcy1wb3N0Z3JlcyIsCiAgInZlcnNpb24iOiAiMC4xLjAiLAogICJwcml2YXRlIjogdHJ1ZSwKICAic2NyaXB0cyI6IHsKICAgICJkZXYiOiAibmV4dCBkZXYiLAogICAgImJ1aWxkIjogIm5leHQgYnVpbGQiLAogICAgInN0YXJ0IjogIm5leHQgc3RhcnQgLUggMC4wLjAuMCIKICB9LAogICJkZXBlbmRlbmNpZXMiOiB7CiAgICAibmV4dCI6ICIxNi40LjEiLAogICAgInBnIjogIjguMjMuMCIsCiAgICAicmVhY3QiOiAiMTkuMy4wIiwKICAgICJyZWFjdC1kb20iOiAiMTkuMy4wIgogIH0sCiAgImVuZ2luZXMiOiB7CiAgICAibm9kZSI6ICI+PTIyIgogIH0sCiAgInBhY2thZ2VNYW5hZ2VyIjogInBucG1AMTAuMzMuMyIKfQo="},{"path":"pnpm-lock.yaml","exec":false,"body":"bG9ja2ZpbGVWZXJzaW9uOiAnOS4wJwoKc2V0dGluZ3M6CiAgYXV0b0luc3RhbGxQZWVyczogdHJ1ZQogIGV4Y2x1ZGVMaW5rc0Zyb21Mb2NrZmlsZTogZmFsc2UKCmltcG9ydGVyczoKCiAgLjoKICAgIGRlcGVuZGVuY2llczoKICAgICAgbmV4dDoKICAgICAgICBzcGVjaWZpZXI6IDE2LjQuMQogICAgICAgIHZlcnNpb246IDE2LjQuMShyZWFjdC1kb21AMTkuMy4wKHJlYWN0QDE5LjMuMCkpKHJlYWN0QDE5LjMuMCkKICAgICAgcGc6CiAgICAgICAgc3BlY2lmaWVyOiA4LjIzLjAKICAgICAgICB2ZXJzaW9uOiA4LjIzLjAKICAgICAgcmVhY3Q6CiAgICAgICAgc3BlY2lmaWVyOiAxOS4zLjAKICAgICAgICB2ZXJzaW9uOiAxOS4zLjAKICAgICAgcmVhY3QtZG9tOgogICAgICAgIHNwZWNpZmllcjogMTkuMy4wCiAgICAgICAgdmVyc2lvbjogMTkuMy4wKHJlYWN0QDE5LjMuMCkKCnBhY2thZ2VzOgoKICAnQGVtbmFwaS9ydW50aW1lQDEuMTEuMyc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWHo0VHB5a2k3WHlycGJVSzFqUjFBaGRBZGFYeWhoWTRsWjNuZUxvZG1ocHVXZnkyUEFRTjVCNDZzQWlVNGxpT1hHTGtIeXBuL3FVK2p2ZldTQ1lZTEE9PX0KCiAgJ0BpbWcvY29sb3VyQDEuMS4wJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1UZDc2cTdqNTdvL3RMVmRnUzc0NmNZQVJmU3l4azhpRWZSeGV3TDloNE9NelloYlc0VEFjcHBsMG1UNGV5cVhkZGg2TC9qd29NNzVtbzdpeGEvcENlUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTE4J30KCiAgJ0BpbWcvc2hhcnAtZGFyd2luLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItUVJVbEZRMFd4dmRXeXFxRy9XdEkzaXVwZkQ1ckJ6bUNIWFNkUHNZOTFzQXRWdFRvN1E0Y2I2ek9jY1ozZ3FFcWtyMGYxQXMxZWhMcW1FcERzUmYrbGc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2Rhcndpbl0KCiAgJ0BpbWcvc2hhcnAtZGFyd2luLXg2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLStCUjI1NVJoRGxweWdVcE9jL0pkdDFuVDZEUTNYRy9FUm81d2JjZE9mNVEzMjBkS3RQQ0tQTFIxTEpzOVZHWFJhTWE4bDF1VWEwdGtDTk9YaUF4WlV3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQGltZy9zaGFycC1mcmVlYnNkLXdhc20zMkAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVkvejkxbkVaNHVJQlg1WDNuZlRvdmpVOWxITktGWWJMMmxwSENMVk5tWFFLMDNWSVp2WEJCdDBLeGJQR3AyU2RHU0YrMm1RVTRlK2hRYVdPdDg2aUF3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIG9zOiBbZnJlZWJzZF0KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4tYXJtNjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTVSODluQllpUmRVbFNXSnhQaE8rR1Z0YVh6WFN4S25SdS94cU1uM0tUQTNMOUVCOU95L1ArTm4yZjJ2bGhQdVVkeS9adXNiMkRhcmJ5VHBHQ2ZFRHV3PT19CiAgICBjcHU6IFthcm02NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWlSMk9LSDgweWkwVStkVXBseWgzL3hkcEZ2cHM2WWtDd3NYZW5JSnhxeFIxdjlvK3h0S1RHYlM5SDdjcHMrMlZ4amM4QjFqOTZwNzVObVRHaklodHBRPT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2Rhcndpbl0KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm02NEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWTNkZ1gvNmxFMlFoUWIrR3h5MFdaeGZnOU1FbS9KQmphbVpwUzJJa2xQN3hJUW9LTjRoekFtN0tjTVZHdGFWRHQzbmVFOU9LQkM3dkFmb25BL0xyMUE9PX0KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm1AMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxtUnRUc09IdXZNMit3bE8yRGIzN2R4NU1pWmhCMEZ2U3VuY2l3NDhZamRPa1p6OUtBaVJibTh1amVNT0ExSU5xbWVpNU5hcEZ4WUVLMUQxWlNpZG13PT19CiAgICBjcHU6IFthcm1dCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXBwYzY0QDEuMy40JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1MZTZib0I4VGFpME5pcytnSXhJcEt4NjhVRFZWSXFkUjhUaW41WWYxejJMSkpRTERKdkNEUnFSdStqQzJxQ29EK2VJb21vbm1Pd0I0c21CUnhmVnBZUT09fQogICAgY3B1OiBbcHBjNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWFIa2tJRUhQUmRRRWVnSk4yME1MbUd0eFlEOVIyd1FyM0N3cGRkbnU1K1lLTXQ2VXpheDdTOWg1Z3BaVG84d3lyR3VaU2xmUTYzT2V2TDVtVHlPQzdRPT19CiAgICBjcHU6IFtyaXNjdjY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcmEvbUI2TWlrRVNEVU83WWcrTWk5NWJGQmI5R3NPYlVSdWhuT3YzT3FrbmpHZTlzWnJHOHRDZTlxMHhTSUdydExndmd3MGdLbkZXY0s0YmxTZ1FPdVE9PX0KICAgIGNwdTogW3MzOTB4XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUdKLy9TU1hibndTRGVzMDJ1bUIzbkRKTEZjUXp3OGExOFY4ZnlocXI2dFY1MTV0T0VNZEltamp4ajFBb2FmTVJ6NTZGM1BIZ2Z0bmoxUUVLU1Uxemt3PT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NEAxLjMuNCc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItaHZ1bEZ3dGpVY2Fnc2lzNkJCeEh3R0Z3V29OWmpnWW1VTEdWclpjeWZOYmpBOGhLSUxiUnhHZzE1Lzd3NUhEeVhIWFVvcy9qNmJhQVdxbkN5UTJEV0E9PX0KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFttdXNsXQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC14NjRAMS4zLjQnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTZ6WEtlRS9wMzlJMUFtQTNjSkczNWV5QkdOcU5kZExuVVhqaHdCbnNHakZQV3FmNVZLa0RCRXFhRWtQRG9URXRreHdpMnZ2OFRjcjJtRHlQNFNvN0ZnPT19CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLWxpbnV4LWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItTFlWeDVKVHNPTTJDQnpteHJlaCtubDY0LzNINlhiMDlpU0xrbnFINDd6MlQyREZGeERlRkxQNXk0ZEp3ZTZIN3VHUWxIUHlFRXRJcXlvM0RZc1J3ZFE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1hcm1AMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1MRWFYSzJXZFhWSzV5a2N3MGJ1V3lQTXNtTExMMnZwSExENnlyTlNXK0pHRUwzQlpQQTR0cEtONmlhTWM0QXhUVEFvYVgvc1Uxck9MNTFsY0l6NDhaUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFthcm1dCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1wcGM2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVFWeEFBcThldlZSSTlpYTJ2cWd3cm1XdWNuNURmditKZFd6ajc1cEQ4b21ITFBTUDdmOHAyME84anh6akNjdUNFUUVPdFlPWlVtWDFoa2laMGtkZXZBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3BwYzY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXgtcmlzY3Y2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUx0ZHJlWGd1YWF2S09EUElmeko0a2ZmeDdVTnQxb213dEswcmNoNEVCYmJTVFhQbnhXbVlTYXlYZExKdzBmSnpROTdrSHQxZ0wveWg0dHZVK25DeVJRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3Jpc2N2NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW2dsaWJjXQoKICAnQGltZy9zaGFycC1saW51eC1zMzkweEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVVaYXNUT0ZpWXpvdFRzR09DdTQyQmZVelA2VHU2RG8vOTQ3aVJtMVJzTEt2bGxseHdHY240Uk4yN0xpYkdXY2VpeDRZK1BtdzNqc25UY0NRSWdXanFBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3MzOTB4XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXgteDY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItU3hGdExUZUpJbmhBQTlRODM2a3V4MnZaTmVPQlFFeDY1OHF2YmJvWlNjcjB3SUFSeW0zSWNHbVc3S3BWRDVzYlZnME9qeSt1ZEZRZGF5WUlaeW9Ob2c9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbeDY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BpbWcvc2hhcnAtbGludXhtdXNsLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItOUhiTWNsbUkxemxOa0ZSczN6OS9lQnREamZEMHNHbHJYMXo2YjFxd21pRlk1RWxETGg0QkMwTFBCZFZwN3oxRFhGaUtsSWN6bmYrWmxzdVp6THhRcWc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLWxpbnV4bXVzbC14NjRAMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi00S09waHFCMDM1SHJWZHFMWmZDZ016ekVSclFra3pPd1JobDRPQWtSTzFZQ2xkYmFGanlTWE1hSzUzNE1vMFYrTG5kbmxKaytzYlV5TGVVMFVMeUQxQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAaW1nL3NoYXJwLXdhc20zMkAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVB0c2dhMXN1NHRReCtMTEYxRUNTOVU2bno1a21yWEtvNlhWYnRSNDhLZTNaUnh4Z2FXQnU3SUR0RWUxcXVvOGhpdXB3bTZXRnF4VmxYYVNmN0lJTkdRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KCiAgJ0BpbWcvc2hhcnAtd2ViY29udGFpbmVycy13YXNtMzJAMC4zNS41JzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1oZmhGL0Ztb1F5VFVrQTBiSUtGT3R3NTM2QlFTZUJNZTZCRjZReVdsclB4VDc1NCtURkxhWjdzS0tUZnZ2TTB5SmdLZ2FZVHduRkNJWi9HdUR3NVNVQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBjcHU6IFt3YXNtMzJdCgogICdAaW1nL3NoYXJwLXdpbjMyLWFybTY0QDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItWDR0N2crN1pBNURLYmxDQkVYR2pVcXFlbWo0dmN6SU5HLzV2aUZ3QUw4aDROM3FZZXlqd2RDdlJMSGk0RWRPVUkrMlo3VUZscDFWTStwL0F1RXRtNlE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0yMC45LjAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW3dpbjMyXQoKICAnQGltZy9zaGFycC13aW4zMi1pYTMyQDAuMzUuNSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItNVptODJMb0JjNDNuaHdOeWJabEc3WTFLTy8vWmhzbjMwNmZRbDI5Wk91U3RITEdUbzNCV0w4M3EzY3puWDBwb3hTQU11WUwxT24vQkhCeGtCZUtyNkE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiBeMjAuOS4wfQogICAgY3B1OiBbaWEzMl0KICAgIG9zOiBbd2luMzJdCgogICdAaW1nL3NoYXJwLXdpbjMyLXg2NEAwLjM1LjUnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXg3NmVIMHZFaUhsY01RdThZOEllbm50YUFDdGRkcFQ2VzB3bVh0V3JuS2NuS0k3TUU1RGRncWhBRDZTRVdPRWwxdjJ6RHZrWkRoRkE5S25VUndwZnFnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MjAuOS4wJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbd2luMzJdCgogICdAbmV4dC9lbnZAMTYuNC4xJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01c1VVcnJTdnMvMi8yTG5Mb2VzeWJNR3gxMkV0UEI0NmZkWjZSaEF3MFhER1NQeFUyTEZ5UUJCN3l1RWlPRkZKUEttQlk2K3EyalRyMS9BTWJucDAvZz09fQoKICAnQG5leHQvc3djLWRhcndpbi1hcm02NEAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVUraFE1R2ozZnB6ZjRmdmVUSUYzZHBVRlloYVNXOHZIaGRBbmJpSW9telh6Zzdib3JlWUZnQnFwcmVwWEZ0VzRzdythVHR0aU5tZzBnZXcvaUZOaGJnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtkYXJ3aW5dCgogICdAbmV4dC9zd2MtZGFyd2luLXg2NEAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLS9ocUMzVjFYTFVqaE1BU2YvV3JpZEtkTzlGWG9FZ04zSEJXbXRLYmowME1QZ25sdHV0ZnJhV0ozYllUcENSSWdFSXBiakp5T1ZMcFlnQWhoL0JrZGNRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbZGFyd2luXQoKICAnQG5leHQvc3djLWxpbnV4LWFybTY0LWdudUAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUdIem5jSGJjYVM5Zzk1a2N2VE50S1FXM2FDTG9SK3hjM0ptN3Fya3BrMVIrRDJCak1ISVB5dlFHUlBLQ2RNWDk1QnNILzQyMWpCVUswNnE5dEV3emp3PT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFtsaW51eF0KICAgIGxpYmM6IFtnbGliY10KCiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1tdXNsQDE2LjQuMSc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItMVN1SnlEeFcvUFI5ZEhKYXQvWlJnY1lMaHVTWisxcHNQNERsS2IydEtJdVhianlncXBMckpXUlNxK29uWlFCdjhMY21VNjdFSXJtYjZjM1hUYUpManc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTAnfQogICAgY3B1OiBbYXJtNjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAbmV4dC9zd2MtbGludXgteDY0LWdudUAxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUlzdG5nMWhNR3A5VEdPNGxVcWVLTGQ3ME1QTi9PT2t1Y1ZUUDJObWorZ0xrd0JnbVBxVXc4Q0pZQkNDN25ibC9CLzIzYkJDY2pDSTVIc2g2aGF6QzFBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbbGludXhdCiAgICBsaWJjOiBbZ2xpYmNdCgogICdAbmV4dC9zd2MtbGludXgteDY0LW11c2xAMTYuNC4xJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1hU0M5d01OaVpSUkZWcFBrUFdCelJ3TFF4SUdtL0NpUWNYeUZGMVhOY2dvZGIrdU14ZGs3YVNTR0dwRFhDYm52WmRmNGl0akh4cE9kNWg3aTd6YWlZdz09fQogICAgZW5naW5lczoge25vZGU6ICc+PSAxMCd9CiAgICBjcHU6IFt4NjRdCiAgICBvczogW2xpbnV4XQogICAgbGliYzogW211c2xdCgogICdAbmV4dC9zd2Mtd2luMzItYXJtNjQtbXN2Y0AxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXQvbXl2d0ZEbHlwTVVqUnZiQmY4cUxQeXVhQjBpWFlZZEJ0d010NkRNNmYrNjB3dEdyNGJTWWhvbGRQcU5lVjVWVVhaaHJwTXdmemE4MjlrbWhTM2lBPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW2FybTY0XQogICAgb3M6IFt3aW4zMl0KCiAgJ0BuZXh0L3N3Yy13aW4zMi14NjQtbXN2Y0AxNi40LjEnOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLTZJQ3FQbzlhd0NrcnRZTlBod2t4MXVVN3JsRldyWlJySWJvREhTMkxVK2p2MDg4VUJZUXRtSjI1aDZwQ3AyNy8rRlpqRjZCUTRUZTRFcnVneU1ldUJnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49IDEwJ30KICAgIGNwdTogW3g2NF0KICAgIG9zOiBbd2luMzJdCgogICdAc3djL2hlbHBlcnNAMC41LjIzJzoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01bFNzTU9UWFVSZVBnbERmdnVBUVVxa0dlazlIZzJra3NPWWF5Mm0wK1hSKytiMk5XWUwvNHNXeXV2VkJJczhvS25KYXhrZGk5d2hhTC9zcU4xM2Fmdz09fQoKICBiYXNlbGluZS1icm93c2VyLW1hcHBpbmdAMi4xMS4zMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1iMGs3d1hsV2pwdUwvVXhiL3BZbHBqWTBlajVCakFtdXJ0UFVrM2VSR3Vsb0k0eWpLMzJtOFRpS1VRODFsMXB0Y0xqS1MvS0gyK3VxSW9sWnRpMXg0UT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTYuMC4wJ30KICAgIGhhc0JpbjogdHJ1ZQoKICBjYW5pdXNlLWxpdGVAMS4wLjMwMDAxODE5OgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxGVXFJSUF3cHpzSXVldm5LbnNSOXFuU3RCY2d6UFNoVFg2MWxCd045dUZra2Y4bzh6TGllYkVqYlc4QVl0WmlGKzFZS0RXZmR0L3BXRHRNdUc4WHdnPT19CgogIGNsaWVudC1vbmx5QDAuMC4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUlWM091MGpTTXpacmQzcFo0OG5Ma1Q5REE3QWcxcG5QemFpUWhwVzdjM1JiY3FxenZ6elZ1K0w4Z2ZxTXAvOElNMk1RdFNpcWFDeHJyY2Z1OEk4ck1BPT19CgogIGRldGVjdC1saWJjQDIuMS4yOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUJ0ajJCT09PODNvM1d5SDU5ZThNZ1hzeEVRVmNhcmtVT3BFWXJ1YkIwdXJ3bk4xMHlRMzY0cnNpQnlVMTFuWmxxV1labTA1aS9vZjdpbzRtemloQnRRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49OCd9CgogIG5hbm9pZEAzLjMuMjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItdUtkZzJHM0dOQ0tRbjlieVlPcHhiR3FyVDJmR081S1J0NUovOGIzcG9rOHJUNnF4R1dGNmh4TXlKaUVZdEFmK0ZWeVl1RDloUmFEcVg1dVBGWUo0WlE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiBeMTAgfHwgXjEyIHx8IF4xMy43IHx8IF4xNCB8fCA+PTE1LjAuMX0KICAgIGhhc0JpbjogdHJ1ZQoKICBuZXh0QDE2LjQuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi11YzY1N1Y2MkUzNGZPSTZXNU50RzlJendzUGNtczBaNjBncnoyTUpHdGdsZ0QrcFRGbk50NFl3MlB6YVU2MjJ0Zlg0dmhyRGdMWnppY0UyWWxoSTIwUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBoYXNCaW46IHRydWUKICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgICdAb3BlbnRlbGVtZXRyeS9hcGknOiBeMS4xLjAKICAgICAgJ0BwbGF5d3JpZ2h0L3Rlc3QnOiBeMS41MS4xCiAgICAgIGJhYmVsLXBsdWdpbi1yZWFjdC1jb21waWxlcjogJyonCiAgICAgIHJlYWN0OiBeMTguMi4wIHx8IDE5LjAuMC1yYy1kZTY4ZDJmNC0yMDI0MTIwNCB8fCBeMTkuMC4wCiAgICAgIHJlYWN0LWRvbTogXjE4LjIuMCB8fCAxOS4wLjAtcmMtZGU2OGQyZjQtMjAyNDEyMDQgfHwgXjE5LjAuMAogICAgICBzYXNzOiBeMS4zLjAKICAgIHBlZXJEZXBlbmRlbmNpZXNNZXRhOgogICAgICAnQG9wZW50ZWxlbWV0cnkvYXBpJzoKICAgICAgICBvcHRpb25hbDogdHJ1ZQogICAgICAnQHBsYXl3cmlnaHQvdGVzdCc6CiAgICAgICAgb3B0aW9uYWw6IHRydWUKICAgICAgYmFiZWwtcGx1Z2luLXJlYWN0LWNvbXBpbGVyOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCiAgICAgIHNhc3M6CiAgICAgICAgb3B0aW9uYWw6IHRydWUKCiAgcGctY2xvdWRmbGFyZUAxLjQuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi02UFFic0ZXWmNwOUVtSkV3eTVjR1EyTGErQU1XcFA0NmxnYmI4WCtVL1hzSElVd2VZRE5DcGV1S2NrNVJ4TDJNZFZGaTdrcmJiRWk1blg0Wmg3SmhyUT09fQoKICBwZy1jb25uZWN0aW9uLXN0cmluZ0AyLjE0LjE6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcVIza0dOUEJMcENOdHowZXZiS0EwWS9NUkZYd1NTZFQrcFRKdllwL2JYVGNSZVpidlgxa3pGMEl5VGMxUW54cUY3QVpiT2VCaE5MOFI1bVlRWlYvTUE9PX0KCiAgcGctaW50OEAxLjAuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1XQ3RhYlM2dDNjOFNrcERCVWxiMWtqT3M3bDY2eHNHZEtwSVBac2c0d1IrQjMrdTlVQXVtMm9kU3NGOXRudnhnODBoNFp4TFdNeTRwUmpPc0ZJcVFwdz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQuMC4wJ30KCiAgcGctcG9vbEAzLjE0LjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItZ0t0UGtGZFFQVTNEa3Nvb1ZMaTlMc2paeHJzQlVaSXBhKzdhVngrTFY1cE5oMEt6UDRabGV1ZDJwbytDb25yeGJ1WEdCSjZIZmVyNmhkZ3BJQnBCYXc9PX0KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHBnOiAnPj04LjAnCgogIHBnLXByb3RvY29sQDEuMTYuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1wOVZPRk1pSEIvWmJKQVRldGJnKzk5UHhzc1RWU1FSbnl1UFNRNjdtTjErMUtCT2paYVo4M1pRemx0bnhQaEp3U3NDM253VmpKMTBEVkpsZXJiRnpMZz09fQoKICBwZy10eXBlc0AyLjIuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1xVEFBbHJFc2w4czRPaUVRWTY5d0R2Y01JZFFONndkejVvalFpT3k2WVJNdXlueGVuT04wTzVvQ3BKSTZsc2hjNnNjZ0FZOHF2SjJPbi9wK0NYWTBHQT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQnfQoKICBwZ0A4LjIzLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItSXAyRVFDbmdvd0pMR09mQ3drRmhQWFU3L2xqbGhuNlJ4bG15NFhZZkwyWSt2eVJNNTkrOHVSMnhxUldLZFltYlhteENGT0FtS3hCdVNVQ2RGMzRxTGc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTYuMC4wJ30KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHBnLW5hdGl2ZTogJz49My4wLjEnCiAgICBwZWVyRGVwZW5kZW5jaWVzTWV0YToKICAgICAgcGctbmF0aXZlOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHBncGFzc0AxLjAuNToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1GZFc5ci9qUVpoU2VvaHMxWjNzSTF5eEZRTkZ2TWNubWZ1ajRXQk1VVHhPckF5TE1hVGNFMWFBTUJpVGxiTU5hWHZCQ1F1VmkwUjdoZDh1ZERTUDd1Zz09fQoKICBwaWNvY29sb3JzQDEuMS4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLXhjZUgyc25odGI1TTlsaXFEc21FdzU2bGUzNzZtVFprRVgvakViL1J4TkZ5ZWdOdWw3ZU5zbENYUDlGRGovTGN1MFg4S0V5TWNlUDJudHBhSHJERVZBPT19CgogIHBvc3Rjc3NAOC41LjIzOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLWc1MDU4NnpyNGJabXdGaVRsZmxNdThFMGJEVGI1STVnZXJ0Z3dBS21zZFVsVFFJaFp0dW56VWxEMVdTendjVldQb0FWcHNyQTZ2bGZDRDdvWHZSd2dnPT19CiAgICBlbmdpbmVzOiB7bm9kZTogXjEwIHx8IF4xMiB8fCA+PTE0fQoKICBwb3N0Z3Jlcy1hcnJheUAyLjAuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1WcFpyVXFVNUE2OWVReVcyYzVDQTFqdExlY0NzTjJVL2JENlZpbHJGRFdxNSs1VUlFVk83bmF6UzNURWNIZjF6dVBZTy9zcUd2VXZXNjJnODZSWFp1QT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTQnfQoKICBwb3N0Z3Jlcy1ieXRlYUAxLjAuMToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi01KzVIcVhuc1pQRTY1SUpaU01rWnRVUkFSWmVsZWwyb1hVRU84ckg4M1ZTL2h4SDV2djF1SHF1UGc1d1pzOHlNQWZkdjk3MUlVK2tjUFVjemk3TlZCUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHBvc3RncmVzLWRhdGVAMS4wLjc6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItc3VEbWpMVlFnNzhuTUsyVVo0NTRoQUcrT0FXK0hRUFo2bisrVE5EVVgrTDArdVVsTHl3bm94SktEb3U1MVptK3pUQ2pyQ2wwTnE2SjlDNWhQOXZLL1E9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0wLjEwLjAnfQoKICBwb3N0Z3Jlcy1pbnRlcnZhbEAxLjIuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi05WmhYS00vcnczNTBOMW92dVdIYkd4bkdoL1NOSjRjbnhIaU0wcnhFNFZONDF3c2c4UDh6V245aHYvYnVLMDBSUDRXdmxPeXIvUkJEaXB0eXhWYmtaUT09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHJlYWN0LWRvbUAxOS4zLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItSkRrOGRnaWY1MU9qRm9ERTcwK09UOUlDeVlyKzY5SGxtaWhOd3AxK05zZmJuYTN0NXNJaUNhOVpKa3REbVE0LzFiL3JuMjZoSUFSMnVZWERNcjVyMFE9PX0KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgIHJlYWN0OiBeMTkuMy4wCgogIHJlYWN0QDE5LjMuMDoKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1FOExVY2J0Qld0MjBiYmwyWW9IZng0WkRCZHhWVGZPS3RDWm45Y0RTSjRsNi9udW9BcGNwSUJjajQ3dDJ3Wm9WWDhnMlpIdU1IYmlTaGdDUjFUNVNvZz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTAuMTAuMCd9CgogIHNjaGVkdWxlckAwLjI4LjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItanVvcmZDbUlrSXc4dFQrcDVCWFNtNlBKalFGL3ljRVltS3l6VVJDSXQvUmFaSWhMK1B1bGJROVl1MnoxSGRPSkRkcURUbHhBMSt4S0JtSFhKc2N6QXc9PX0KCiAgc2VtdmVyQDcuOC41OgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLVk3L0tEc2I4TGpvb1pwd2FxR3l1bE82RFFsa3NnQ25jY2hIR2src1pJWTRTQnZVb2NNQkVGSDVVcjFmSTRkVitKdmwwdzZjanZ1Y2FJaTQwcHVSaW9BPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MTAnfQogICAgaGFzQmluOiB0cnVlCgogIHNoYXJwQDAuMzUuNToKICAgIHJlc29sdXRpb246IHtpbnRlZ3JpdHk6IHNoYTUxMi1Zd240T256R3VrcDdDRE1ycDA4UlE1MFlLbXV3RzQ3YnJaZ0lWUFR2QmFhQWZRbFJseWdyUnFTcnhkQ2lMOU0rTGx6TEJpSjY4SVIxUXF2ekh5akM3Zz09fQogICAgZW5naW5lczoge25vZGU6ICc+PTIwLjkuMCd9CiAgICBwZWVyRGVwZW5kZW5jaWVzOgogICAgICAnQHR5cGVzL25vZGUnOiAnKicKICAgIHBlZXJEZXBlbmRlbmNpZXNNZXRhOgogICAgICAnQHR5cGVzL25vZGUnOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHNvdXJjZS1tYXAtanNAMS4yLjI6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItS0dqLzhZNDN4MzVhWlZEdHQrSjRtSzFob0xHSFVMTVlmU2tPREpOUWpOREMzb1cxUHFQb3hNd28wcExVc1dNL1VFR3pPTi9OeGVIeXdFZk5YTlAzVnc9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0wLjEwLjAnfQoKICBzcGxpdDJANC4yLjA6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItVWNqY0pPV2tuck5rRjZQTFg4M3FjSE02S0hnVktOa1Y2Mlk4YTV1WURWdjl5ZEdRVndBSE1LcUhkSmplMVZUV3BsakcwV1lwQ0RockNkQU9ZSDRUV2c9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTAueCd9CgogIHN0eWxlZC1qc3hANS4xLjY6CiAgICByZXNvbHV0aW9uOiB7aW50ZWdyaXR5OiBzaGE1MTItcVNWeURUZU1vdGR2UVlvSFdMTkd3UkZKSEMraStadmRCUllvc09GZ0MrV2cxdng0ZnJOMi9SRy9OQTdTWXFxdktOTGYzOVAyTFNSQTJwdTZuMFhZWkE9PX0KICAgIGVuZ2luZXM6IHtub2RlOiAnPj0gMTIuMC4wJ30KICAgIHBlZXJEZXBlbmRlbmNpZXM6CiAgICAgICdAYmFiZWwvY29yZSc6ICcqJwogICAgICBiYWJlbC1wbHVnaW4tbWFjcm9zOiAnKicKICAgICAgcmVhY3Q6ICc+PSAxNi44LjAgfHwgMTcueC54IHx8IF4xOC4wLjAtMCB8fCBeMTkuMC4wLTAnCiAgICBwZWVyRGVwZW5kZW5jaWVzTWV0YToKICAgICAgJ0BiYWJlbC9jb3JlJzoKICAgICAgICBvcHRpb25hbDogdHJ1ZQogICAgICBiYWJlbC1wbHVnaW4tbWFjcm9zOgogICAgICAgIG9wdGlvbmFsOiB0cnVlCgogIHRzbGliQDIuOC4xOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLW9KRnU5NEhRYitLVmR1U1VRTDd3bnBtcW5mbUxzT0EvbkFoNmI2RUgwd0NFb0swL21QZVhVNmMzd0tEVjgzTWtPdUhQUkh0U1hLS1U5OUlCYXpTLzJ3PT19CgogIHh0ZW5kQDQuMC4yOgogICAgcmVzb2x1dGlvbjoge2ludGVncml0eTogc2hhNTEyLUxLWVUxaUFYSlhVZ0FYbjlVUmppdStNV2h5VVhIc3ZmcDdtY3VZbTlkU1VLSzAvQ2p0clV3RkF4RDgyL21DV2J0THNHakZJYWQwd0lzb2Q0enJUQUVRPT19CiAgICBlbmdpbmVzOiB7bm9kZTogJz49MC40J30KCnNuYXBzaG90czoKCiAgJ0BlbW5hcGkvcnVudGltZUAxLjExLjMnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICB0c2xpYjogMi44LjEKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL2NvbG91ckAxLjEuMCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1kYXJ3aW4tYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi1hcm02NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1kYXJ3aW4teDY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4teDY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWZyZWVic2Qtd2FzbTMyQDAuMzUuNSc6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgICdAaW1nL3NoYXJwLXdhc20zMic6IDAuMzUuNQogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4tYXJtNjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1kYXJ3aW4teDY0QDEuMy40JzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtNjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm1AMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1wcGM2NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXg2NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NEAxLjMuNCc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC14NjRAMS4zLjQnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BpbWcvc2hhcnAtbGludXgtYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LWFybTY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LWFybUAwLjM1LjUnOgogICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtJzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LXBwYzY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1wcGM2NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eC1yaXNjdjY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1yaXNjdjY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLWxpbnV4LXMzOTB4QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1zMzkweCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eC14NjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXg2NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eG11c2wtYXJtNjRAMC4zNS41JzoKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NCc6IDEuMy40CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC1saW51eG11c2wteDY0QDAuMzUuNSc6CiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eG11c2wteDY0JzogMS4zLjQKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLXdhc20zMkAwLjM1LjUnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICAnQGVtbmFwaS9ydW50aW1lJzogMS4xMS4zCiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13ZWJjb250YWluZXJzLXdhc20zMkAwLjM1LjUnOgogICAgZGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC13YXNtMzInOiAwLjM1LjUKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAaW1nL3NoYXJwLXdpbjMyLWFybTY0QDAuMzUuNSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13aW4zMi1pYTMyQDAuMzUuNSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQGltZy9zaGFycC13aW4zMi14NjRAMC4zNS41JzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9lbnZAMTYuNC4xJzoge30KCiAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjRAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2MtZGFyd2luLXg2NEAxNi40LjEnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BuZXh0L3N3Yy1saW51eC1hcm02NC1nbnVAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbEAxNi40LjEnOgogICAgb3B0aW9uYWw6IHRydWUKCiAgJ0BuZXh0L3N3Yy1saW51eC14NjQtZ251QDE2LjQuMSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQG5leHQvc3djLWxpbnV4LXg2NC1tdXNsQDE2LjQuMSc6CiAgICBvcHRpb25hbDogdHJ1ZQoKICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmNAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAbmV4dC9zd2Mtd2luMzIteDY0LW1zdmNAMTYuNC4xJzoKICAgIG9wdGlvbmFsOiB0cnVlCgogICdAc3djL2hlbHBlcnNAMC41LjIzJzoKICAgIGRlcGVuZGVuY2llczoKICAgICAgdHNsaWI6IDIuOC4xCgogIGJhc2VsaW5lLWJyb3dzZXItbWFwcGluZ0AyLjExLjMxOiB7fQoKICBjYW5pdXNlLWxpdGVAMS4wLjMwMDAxODE5OiB7fQoKICBjbGllbnQtb25seUAwLjAuMToge30KCiAgZGV0ZWN0LWxpYmNAMi4xLjI6CiAgICBvcHRpb25hbDogdHJ1ZQoKICBuYW5vaWRAMy4zLjIwOiB7fQoKICBuZXh0QDE2LjQuMShyZWFjdC1kb21AMTkuMy4wKHJlYWN0QDE5LjMuMCkpKHJlYWN0QDE5LjMuMCk6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgICdAbmV4dC9lbnYnOiAxNi40LjEKICAgICAgJ0Bzd2MvaGVscGVycyc6IDAuNS4yMwogICAgICBiYXNlbGluZS1icm93c2VyLW1hcHBpbmc6IDIuMTEuMzEKICAgICAgY2FuaXVzZS1saXRlOiAxLjAuMzAwMDE4MTkKICAgICAgcG9zdGNzczogOC41LjIzCiAgICAgIHJlYWN0OiAxOS4zLjAKICAgICAgcmVhY3QtZG9tOiAxOS4zLjAocmVhY3RAMTkuMy4wKQogICAgICBzdHlsZWQtanN4OiA1LjEuNihyZWFjdEAxOS4zLjApCiAgICBvcHRpb25hbERlcGVuZGVuY2llczoKICAgICAgJ0BuZXh0L3N3Yy1kYXJ3aW4tYXJtNjQnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy1kYXJ3aW4teDY0JzogMTYuNC4xCiAgICAgICdAbmV4dC9zd2MtbGludXgtYXJtNjQtZ251JzogMTYuNC4xCiAgICAgICdAbmV4dC9zd2MtbGludXgtYXJtNjQtbXVzbCc6IDE2LjQuMQogICAgICAnQG5leHQvc3djLWxpbnV4LXg2NC1nbnUnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy1saW51eC14NjQtbXVzbCc6IDE2LjQuMQogICAgICAnQG5leHQvc3djLXdpbjMyLWFybTY0LW1zdmMnOiAxNi40LjEKICAgICAgJ0BuZXh0L3N3Yy13aW4zMi14NjQtbXN2Yyc6IDE2LjQuMQogICAgICBzaGFycDogMC4zNS41CiAgICB0cmFuc2l0aXZlUGVlckRlcGVuZGVuY2llczoKICAgICAgLSAnQGJhYmVsL2NvcmUnCiAgICAgIC0gJ0B0eXBlcy9ub2RlJwogICAgICAtIGJhYmVsLXBsdWdpbi1tYWNyb3MKCiAgcGctY2xvdWRmbGFyZUAxLjQuMToKICAgIG9wdGlvbmFsOiB0cnVlCgogIHBnLWNvbm5lY3Rpb24tc3RyaW5nQDIuMTQuMToge30KCiAgcGctaW50OEAxLjAuMToge30KCiAgcGctcG9vbEAzLjE0LjAocGdAOC4yMy4wKToKICAgIGRlcGVuZGVuY2llczoKICAgICAgcGc6IDguMjMuMAoKICBwZy1wcm90b2NvbEAxLjE2LjE6IHt9CgogIHBnLXR5cGVzQDIuMi4wOgogICAgZGVwZW5kZW5jaWVzOgogICAgICBwZy1pbnQ4OiAxLjAuMQogICAgICBwb3N0Z3Jlcy1hcnJheTogMi4wLjAKICAgICAgcG9zdGdyZXMtYnl0ZWE6IDEuMC4xCiAgICAgIHBvc3RncmVzLWRhdGU6IDEuMC43CiAgICAgIHBvc3RncmVzLWludGVydmFsOiAxLjIuMAoKICBwZ0A4LjIzLjA6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgIHBnLWNvbm5lY3Rpb24tc3RyaW5nOiAyLjE0LjEKICAgICAgcGctcG9vbDogMy4xNC4wKHBnQDguMjMuMCkKICAgICAgcGctcHJvdG9jb2w6IDEuMTYuMQogICAgICBwZy10eXBlczogMi4yLjAKICAgICAgcGdwYXNzOiAxLjAuNQogICAgb3B0aW9uYWxEZXBlbmRlbmNpZXM6CiAgICAgIHBnLWNsb3VkZmxhcmU6IDEuNC4xCgogIHBncGFzc0AxLjAuNToKICAgIGRlcGVuZGVuY2llczoKICAgICAgc3BsaXQyOiA0LjIuMAoKICBwaWNvY29sb3JzQDEuMS4xOiB7fQoKICBwb3N0Y3NzQDguNS4yMzoKICAgIGRlcGVuZGVuY2llczoKICAgICAgbmFub2lkOiAzLjMuMjAKICAgICAgcGljb2NvbG9yczogMS4xLjEKICAgICAgc291cmNlLW1hcC1qczogMS4yLjIKCiAgcG9zdGdyZXMtYXJyYXlAMi4wLjA6IHt9CgogIHBvc3RncmVzLWJ5dGVhQDEuMC4xOiB7fQoKICBwb3N0Z3Jlcy1kYXRlQDEuMC43OiB7fQoKICBwb3N0Z3Jlcy1pbnRlcnZhbEAxLjIuMDoKICAgIGRlcGVuZGVuY2llczoKICAgICAgeHRlbmQ6IDQuMC4yCgogIHJlYWN0LWRvbUAxOS4zLjAocmVhY3RAMTkuMy4wKToKICAgIGRlcGVuZGVuY2llczoKICAgICAgcmVhY3Q6IDE5LjMuMAogICAgICBzY2hlZHVsZXI6IDAuMjguMAoKICByZWFjdEAxOS4zLjA6IHt9CgogIHNjaGVkdWxlckAwLjI4LjA6IHt9CgogIHNlbXZlckA3LjguNToKICAgIG9wdGlvbmFsOiB0cnVlCgogIHNoYXJwQDAuMzUuNToKICAgIGRlcGVuZGVuY2llczoKICAgICAgJ0BpbWcvY29sb3VyJzogMS4xLjAKICAgICAgZGV0ZWN0LWxpYmM6IDIuMS4yCiAgICAgIHNlbXZlcjogNy44LjUKICAgIG9wdGlvbmFsRGVwZW5kZW5jaWVzOgogICAgICAnQGltZy9zaGFycC1kYXJ3aW4tYXJtNjQnOiAwLjM1LjUKICAgICAgJ0BpbWcvc2hhcnAtZGFyd2luLXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1mcmVlYnNkLXdhc20zMic6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWRhcndpbi1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtZGFyd2luLXg2NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtYXJtJzogMS4zLjQKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXgtcHBjNjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXJpc2N2NjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4LXMzOTB4JzogMS4zLjQKICAgICAgJ0BpbWcvc2hhcnAtbGlidmlwcy1saW51eC14NjQnOiAxLjMuNAogICAgICAnQGltZy9zaGFycC1saWJ2aXBzLWxpbnV4bXVzbC1hcm02NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpYnZpcHMtbGludXhtdXNsLXg2NCc6IDEuMy40CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LWFybSc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1hcm02NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1wcGM2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eC1yaXNjdjY0JzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LXMzOTB4JzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLWxpbnV4LXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC1saW51eG11c2wtYXJtNjQnOiAwLjM1LjUKICAgICAgJ0BpbWcvc2hhcnAtbGludXhtdXNsLXg2NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13ZWJjb250YWluZXJzLXdhc20zMic6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13aW4zMi1hcm02NCc6IDAuMzUuNQogICAgICAnQGltZy9zaGFycC13aW4zMi1pYTMyJzogMC4zNS41CiAgICAgICdAaW1nL3NoYXJwLXdpbjMyLXg2NCc6IDAuMzUuNQogICAgb3B0aW9uYWw6IHRydWUKCiAgc291cmNlLW1hcC1qc0AxLjIuMjoge30KCiAgc3BsaXQyQDQuMi4wOiB7fQoKICBzdHlsZWQtanN4QDUuMS42KHJlYWN0QDE5LjMuMCk6CiAgICBkZXBlbmRlbmNpZXM6CiAgICAgIGNsaWVudC1vbmx5OiAwLjAuMQogICAgICByZWFjdDogMTkuMy4wCgogIHRzbGliQDIuOC4xOiB7fQoKICB4dGVuZEA0LjAuMjoge30K"}]},"node-worker-cron":{"files":[{"path":".env.example","exec":false,"body":"REFUQUJBU0VfVVJMPQo="},{"path":"README.md","exec":false,"body":"IyBOb2RlIHdvcmtlciBhbmQgY3JvbiBqb2IKClR3byBzbWFsbCBhcHBzIHRoYXQgcnVuIGJlc2lkZSB5b3VyIHdlYiBhcHAgYW5kIHNoYXJlIGl0cyBQb3N0Z3JlcyBkYXRhYmFzZS4gVGhlIHdvcmtlciB0YWtlcyBqb2JzIGZyb20gYSBgam9ic2AgdGFibGUsIG9uZSBhdCBhIHRpbWUuIFRoZSBjcm9uIGpvYiB3cml0ZXMgYSByb3cgdG8gYSBgaGVhcnRiZWF0c2AgdGFibGUgb24gdGhlIHNjaGVkdWxlIGluIHN0ZXAgMy4KCk5laXRoZXIgYXBwIGhhcyBhIHB1YmxpYyBhZGRyZXNzIG9yIG9wZW5zIGEgcG9ydC4gRWFjaCBhcHAgY3JlYXRlcyBpdHMgdGFibGUgb24gaXRzIGZpcnN0IHJ1bi4KCiMjIERlcGxveSB3aXRoIHRoZSBBc3RyaXMgTUNQCgpDb3B5IHRoZXNlIGZpbGVzIHRvIHRoZSByb290IG9mIHlvdXIgb3duIHJlcG9zaXRvcnkgYW5kIHB1c2ggaXQuIEluIHRoZSBjYWxscyBiZWxvdywgcmVwbGFjZSBgT1dORVIvUkVQT2Agd2l0aCB0aGF0IHJlcG9zaXRvcnkuIElmIHRoZSBmaWxlcyBhcmUgaW4gYSBzdWJmb2xkZXIsIGFkZCBgImJ1aWxkX3BhdGgiOiAiLzxzdWJmb2xkZXI+ImAgdG8gYm90aCBkZXBsb3kgY2FsbHMuCgoxLiBDcmVhdGUgdGhlIGRhdGFiYXNlLiBJZiB5b3VyIHdlYiBhcHAgYWxyZWFkeSBoYXMgb25lLCBza2lwIHRoaXMgc3RlcCBhbmQgdXNlIHRoYXQgZGF0YWJhc2UuCgpgYGBqc29uCnsidG9vbCI6ICJkYXRhYmFzZSIsICJhcmd1bWVudHMiOiB7ImFjdGlvbiI6ICJjcmVhdGUiLCAicHJvamVjdCI6ICJteS1wcm9qZWN0IiwgIm5hbWUiOiAibWFpbi1kYiIsICJraW5kIjogInBvc3RncmVzIn19CmBgYAoKQnVpbGQgYERBVEFCQVNFX1VSTGAgZnJvbSB0aGUgcmVzdWx0OiBgcG9zdGdyZXM6Ly88dXNlcj46PHBhc3N3b3JkPkA8aG9zdD46PHBvcnQ+LzxkYXRhYmFzZT5gLiBBc3RyaXMgc2hvd3MgdGhlIHBhc3N3b3JkIG9ubHkgaW4gdGhpcyByZXN1bHQsIHNvIGtlZXAgaXQgbm93LgoKMi4gRGVwbG95IHRoZSB3b3JrZXIuCgpgYGBqc29uCnsidG9vbCI6ICJkZXBsb3kiLCAiYXJndW1lbnRzIjogeyJwcm9qZWN0IjogIm15LXByb2plY3QiLCAibmFtZSI6ICJqb2JzLXdvcmtlciIsICJnaXRfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9PV05FUi9SRVBPIiwgImJyYW5jaCI6ICJtYWluIiwgImtpbmQiOiAid29ya2VyIiwgImNvbW1hbmQiOiAibm9kZSB3b3JrZXIubWpzIn19CmBgYAoKMy4gRGVwbG95IHRoZSBjcm9uIGpvYi4gVGhlIHNjaGVkdWxlIGhhcyBmaXZlIGZpZWxkcy4KCmBgYGpzb24KeyJ0b29sIjogImRlcGxveSIsICJhcmd1bWVudHMiOiB7InByb2plY3QiOiAibXktcHJvamVjdCIsICJuYW1lIjogImpvYnMtY3JvbiIsICJnaXRfdXJsIjogImh0dHBzOi8vZ2l0aHViLmNvbS9PV05FUi9SRVBPIiwgImJyYW5jaCI6ICJtYWluIiwgImtpbmQiOiAiY3JvbiIsICJjb21tYW5kIjogIm5vZGUgaGVhcnRiZWF0Lm1qcyIsICJzY2hlZHVsZSI6ICIqLzUgKiAqICogKiJ9fQpgYGAKCjQuIFNldCBgREFUQUJBU0VfVVJMYCBvbiB0aGUgd29ya2VyLCB3aXRoIHRoZSBhcHAgaWQgdGhhdCBzdGVwIDIgcmV0dXJucy4gVGhlIGBlbnZgIGNhbGwgcmVwbGFjZXMgZXZlcnkgdmFyaWFibGUgb24gdGhlIGFwcCwgc28gaWYgdGhlIGFwcCBoYXMgb3RoZXIgdmFyaWFibGVzLCBzZW5kIHRoZW0gaW4gdGhlIHNhbWUgY2FsbC4gVGhlbiBkZXBsb3kgdGhlIHdvcmtlciBhZ2FpbiwgYmVjYXVzZSBhIG5ldyB2YWx1ZSBhcHBsaWVzIG9ubHkgYXQgdGhlIG5leHQgZGVwbG95LgoKYGBganNvbgp7InRvb2wiOiAiZW52IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIldPUktFUl9BUFBfSUQiLCAidmFyaWFibGVzIjogeyJEQVRBQkFTRV9VUkwiOiAicG9zdGdyZXM6Ly9VU0VSOlBBU1NXT1JEQEhPU1Q6NTQzMi9EQVRBQkFTRSJ9fX0KYGBgCgpgYGBqc29uCnsidG9vbCI6ICJkZXBsb3kiLCAiYXJndW1lbnRzIjogeyJhcHBfaWQiOiAiV09SS0VSX0FQUF9JRCJ9fQpgYGAKCjUuIERvIHRoZSBzYW1lIGZvciB0aGUgY3JvbiBqb2IsIHdpdGggdGhlIGFwcCBpZCB0aGF0IHN0ZXAgMyByZXR1cm5zLgoKYGBganNvbgp7InRvb2wiOiAiZW52IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIkNST05fQVBQX0lEIiwgInZhcmlhYmxlcyI6IHsiREFUQUJBU0VfVVJMIjogInBvc3RncmVzOi8vVVNFUjpQQVNTV09SREBIT1NUOjU0MzIvREFUQUJBU0UifX19CmBgYAoKYGBganNvbgp7InRvb2wiOiAiZGVwbG95IiwgImFyZ3VtZW50cyI6IHsiYXBwX2lkIjogIkNST05fQVBQX0lEIn19CmBgYAoKNi4gSWYgeW91ciB3ZWIgYXBwIGRvZXMgbm90IGhhdmUgYERBVEFCQVNFX1VSTGAgeWV0LCBzZXQgdGhlIHNhbWUgdmFsdWUgb24gaXQuIFNlbmQgYWxsIG9mIGl0cyBvdGhlciB2YXJpYWJsZXMgaW4gdGhlIHNhbWUgYGVudmAgY2FsbCwgdGhlbiBkZXBsb3kgaXQgYWdhaW4uCgojIyBRdWV1ZSBhIGpvYiBmcm9tIHlvdXIgd2ViIGFwcAoKYGBgc3FsCklOU0VSVCBJTlRPIGpvYnMgKGtpbmQsIHBheWxvYWQpIFZBTFVFUyAoJ3NlbmQtd2VsY29tZS1lbWFpbCcsICd7InVzZXJfaWQiOiA0Mn0nKTsKYGBgCgpUaGUgd29ya2VyIG1hcmtzIHRoZSBqb2IgYHJ1bm5pbmdgLCB0aGVuIGBkb25lYC4gSWYgdGhlIGpvYiBmYWlscywgdGhlIHdvcmtlciBtYXJrcyBpdCBgZmFpbGVkYCBhbmQgc3RvcmVzIHRoZSBlcnJvci4gUHV0IHlvdXIgb3duIHdvcmsgaW4gdGhlIGBoYW5kbGVgIGZ1bmN0aW9uIGluIGB3b3JrZXIubWpzYC4KCiMjIFdoYXQgcnVucyB3aGVyZQoKLSBgd29ya2VyLm1qc2AgaXMgdGhlIHByb2Nlc3Mgb2YgdGhlIHdvcmtlciBhcHAuCi0gYGhlYXJ0YmVhdC5tanNgIGlzIHRoZSBjcm9uIGNvbW1hbmQuIEl0IHJ1bnMgb24gdGhlIHNjaGVkdWxlLCBpbnNpZGUgdGhlIGNvbnRhaW5lciBvZiB0aGUgY3JvbiBhcHAuCi0gYGtlZXBhbGl2ZS5tanNgIGlzIHRoZSBzdGFydCBvZiB0aGUgY3JvbiBhcHAuIEl0IG9ubHkga2VlcHMgdGhlIGNvbnRhaW5lciBydW5uaW5nLCBzbyB0aGF0IHRoZSBzY2hlZHVsZSBjYW4gcnVuIGluc2lkZSBpdC4KLSBgc3FsLm1qc2AgaG9sZHMgZXZlcnkgU1FMIHN0YXRlbWVudC4K"},{"path":"heartbeat.mjs","exec":false,"body":"Ly8gVGhlIGNyb24gY29tbWFuZDogd3JpdGVzIG9uZSBoZWFydGJlYXRzIHJvdywgdGhlbiBleGl0cy4KaW1wb3J0IHBnIGZyb20gInBnIjsKaW1wb3J0IHsgSEVBUlRCRUFULCBTQ0hFTUEgfSBmcm9tICIuL3NxbC5tanMiOwoKY29uc3QgdXJsID0gcHJvY2Vzcy5lbnYuREFUQUJBU0VfVVJMOwppZiAoIXVybCkgewogIGNvbnNvbGUuZXJyb3IoIkRBVEFCQVNFX1VSTCBpcyBub3Qgc2V0LiBTZXQgaXQgb24gdGhpcyBhcHAsIHRoZW4gZGVwbG95IGFnYWluLiIpOwogIHByb2Nlc3MuZXhpdCgxKTsKfQoKY29uc3QgY2xpZW50ID0gbmV3IHBnLkNsaWVudCh7IGNvbm5lY3Rpb25TdHJpbmc6IHVybCB9KTsKYXdhaXQgY2xpZW50LmNvbm5lY3QoKTsKdHJ5IHsKICBhd2FpdCBjbGllbnQucXVlcnkoU0NIRU1BKTsKICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IGNsaWVudC5xdWVyeShIRUFSVEJFQVQpOwogIGNvbnNvbGUubG9nKGBoZWFydGJlYXQgJHtyb3dzWzBdLmlkfSBhdCAke3Jvd3NbMF0uYXQudG9JU09TdHJpbmcoKX1gKTsKfSBmaW5hbGx5IHsKICBhd2FpdCBjbGllbnQuZW5kKCk7Cn0K"},{"path":"keepalive.mjs","exec":false,"body":"Ly8gVGhlIGNyb24gYXBwJ3Mgc3RhcnQuIFRoZSBzY2hlZHVsZSBydW5zIGl0cyBjb21tYW5kIGluc2lkZSB0aGlzIHJ1bm5pbmcKLy8gY29udGFpbmVyLCBzbyB0aGUgY29udGFpbmVyIG11c3Qgc3RheSB1cC4gVGhpcyBkb2VzIG5vIHdvcmsgYW5kIG9wZW5zIG5vIHBvcnQuCmNvbnN0IHRpbWVyID0gc2V0SW50ZXJ2YWwoKCkgPT4ge30sIDEgPDwgMzApOwpwcm9jZXNzLm9uKCJTSUdURVJNIiwgKCkgPT4gewogIGNsZWFySW50ZXJ2YWwodGltZXIpOwogIHByb2Nlc3MuZXhpdCgwKTsKfSk7CmNvbnNvbGUubG9nKCJ3YWl0aW5nIGZvciB0aGUgc2NoZWR1bGUiKTsK"},{"path":"package-lock.json","exec":false,"body":"ewogICJuYW1lIjogIm5vZGUtd29ya2VyLWNyb24iLAogICJsb2NrZmlsZVZlcnNpb24iOiAzLAogICJyZXF1aXJlcyI6IHRydWUsCiAgInBhY2thZ2VzIjogewogICAgIiI6IHsKICAgICAgIm5hbWUiOiAibm9kZS13b3JrZXItY3JvbiIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInBnIjogIl44LjEzLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIjIyIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZyI6IHsKICAgICAgInZlcnNpb24iOiAiOC4yMy4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BnLy0vcGctOC4yMy4xLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLWFMOTZBSEFOdFdqUExET0xxbmh4K25ncDkrVUs3RVRFVThWSnJEQ0d2c1NTaS9tR0xjV1lzUzZIZXJnN2xtYUJKZTR1d3JmcXNhN2dURUZhU2l6RG9RPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZy1jb25uZWN0aW9uLXN0cmluZyI6ICJeMi4xNC4xIiwKICAgICAgICAicGctcG9vbCI6ICJeMy4xNC4wIiwKICAgICAgICAicGctcHJvdG9jb2wiOiAiXjEuMTYuMSIsCiAgICAgICAgInBnLXR5cGVzIjogIjIuMi4wIiwKICAgICAgICAicGdwYXNzIjogIjEuMC41IgogICAgICB9LAogICAgICAiZW5naW5lcyI6IHsKICAgICAgICAibm9kZSI6ICI+PSAxNi4wLjAiCiAgICAgIH0sCiAgICAgICJvcHRpb25hbERlcGVuZGVuY2llcyI6IHsKICAgICAgICAicGctY2xvdWRmbGFyZSI6ICJeMS40LjEiCiAgICAgIH0sCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZy1uYXRpdmUiOiAiPj0zLjAuMSIKICAgICAgfSwKICAgICAgInBlZXJEZXBlbmRlbmNpZXNNZXRhIjogewogICAgICAgICJwZy1uYXRpdmUiOiB7CiAgICAgICAgICAib3B0aW9uYWwiOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZy1jbG91ZGZsYXJlIjogewogICAgICAidmVyc2lvbiI6ICIxLjQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1jbG91ZGZsYXJlLy0vcGctY2xvdWRmbGFyZS0xLjQuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi02UFFic0ZXWmNwOUVtSkV3eTVjR1EyTGErQU1XcFA0NmxnYmI4WCtVL1hzSElVd2VZRE5DcGV1S2NrNVJ4TDJNZFZGaTdrcmJiRWk1blg0Wmg3SmhyUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgIm9wdGlvbmFsIjogdHJ1ZQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctY29ubmVjdGlvbi1zdHJpbmciOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMTQuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1jb25uZWN0aW9uLXN0cmluZy8tL3BnLWNvbm5lY3Rpb24tc3RyaW5nLTIuMTQuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1xUjNrR05QQkxwQ050ejBldmJLQTBZL01SRlh3U1NkVCtwVEp2WXAvYlhUY1JlWmJ2WDFrekYwSXlUYzFRbnhxRjdBWmJPZUJoTkw4UjVtWVFaVi9NQT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctaW50OCI6IHsKICAgICAgInZlcnNpb24iOiAiMS4wLjEiLAogICAgICAicmVzb2x2ZWQiOiAiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvcGctaW50OC8tL3BnLWludDgtMS4wLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItV0N0YWJTNnQzYzhTa3BEQlVsYjFrak9zN2w2NnhzR2RLcElQWnNnNHdSK0IzK3U5VUF1bTJvZFNzRjl0bnZ4ZzgwaDRaeExXTXk0cFJqT3NGSXFRcHc9PSIsCiAgICAgICJsaWNlbnNlIjogIklTQyIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NC4wLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3BnLXBvb2wiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjMuMTQuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1wb29sLy0vcGctcG9vbC0zLjE0LjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItZ0t0UGtGZFFQVTNEa3Nvb1ZMaTlMc2paeHJzQlVaSXBhKzdhVngrTFY1cE5oMEt6UDRabGV1ZDJwbytDb25yeGJ1WEdCSjZIZmVyNmhkZ3BJQnBCYXc9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJwZWVyRGVwZW5kZW5jaWVzIjogewogICAgICAgICJwZyI6ICI+PTguMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctcHJvdG9jb2wiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMTYuMSIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wZy1wcm90b2NvbC8tL3BnLXByb3RvY29sLTEuMTYuMS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1wOVZPRk1pSEIvWmJKQVRldGJnKzk5UHhzc1RWU1FSbnl1UFNRNjdtTjErMUtCT2paYVo4M1pRemx0bnhQaEp3U3NDM253VmpKMTBEVkpsZXJiRnpMZz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIgogICAgfSwKICAgICJub2RlX21vZHVsZXMvcGctdHlwZXMiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMi4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BnLXR5cGVzLy0vcGctdHlwZXMtMi4yLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItcVRBQWxyRXNsOHM0T2lFUVk2OXdEdmNNSWRRTjZ3ZHo1b2pRaU95NllSTXV5bnhlbk9OME81b0NwSkk2bHNoYzZzY2dBWThxdkoyT24vcCtDWFkwR0E9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJkZXBlbmRlbmNpZXMiOiB7CiAgICAgICAgInBnLWludDgiOiAiMS4wLjEiLAogICAgICAgICJwb3N0Z3Jlcy1hcnJheSI6ICJ+Mi4wLjAiLAogICAgICAgICJwb3N0Z3Jlcy1ieXRlYSI6ICJ+MS4wLjAiLAogICAgICAgICJwb3N0Z3Jlcy1kYXRlIjogIn4xLjAuNCIsCiAgICAgICAgInBvc3RncmVzLWludGVydmFsIjogIl4xLjEuMCIKICAgICAgfSwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj00IgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wZ3Bhc3MiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC41IiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3BncGFzcy8tL3BncGFzcy0xLjAuNS50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1GZFc5ci9qUVpoU2VvaHMxWjNzSTF5eEZRTkZ2TWNubWZ1ajRXQk1VVHhPckF5TE1hVGNFMWFBTUJpVGxiTU5hWHZCQ1F1VmkwUjdoZDh1ZERTUDd1Zz09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImRlcGVuZGVuY2llcyI6IHsKICAgICAgICAic3BsaXQyIjogIl40LjEuMCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcG9zdGdyZXMtYXJyYXkiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjIuMC4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc3RncmVzLWFycmF5Ly0vcG9zdGdyZXMtYXJyYXktMi4wLjAudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItVnBaclVxVTVBNjllUXlXMmM1Q0ExanRMZWNDc04yVS9iRDZWaWxyRkRXcTUrNVVJRVZPN25helMzVEVjSGYxenVQWU8vc3FHdlV2VzYyZzg2UlhadUE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49NCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMvcG9zdGdyZXMtYnl0ZWEiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjEuMC4xIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Bvc3RncmVzLWJ5dGVhLy0vcG9zdGdyZXMtYnl0ZWEtMS4wLjEudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItNSs1SHFYbnNaUEU2NUlKWlNNa1p0VVJBUlplbGVsMm9YVUVPOHJIODNWUy9oeEg1dnYxdUhxdVBnNXdaczh5TUFmZHY5NzFJVStrY1BVY3ppN05WQlE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9wb3N0Z3Jlcy1kYXRlIjogewogICAgICAidmVyc2lvbiI6ICIxLjAuNyIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wb3N0Z3Jlcy1kYXRlLy0vcG9zdGdyZXMtZGF0ZS0xLjAuNy50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1zdURtakxWUWc3OG5NSzJVWjQ1NGhBRytPQVcrSFFQWjZuKytUTkRVWCtMMCt1VWxMeXdub3hKS0RvdTUxWm0relRDanJDbDBOcTZKOUM1aFA5dksvUT09IiwKICAgICAgImxpY2Vuc2UiOiAiTUlUIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0wLjEwLjAiCiAgICAgIH0KICAgIH0sCiAgICAibm9kZV9tb2R1bGVzL3Bvc3RncmVzLWludGVydmFsIjogewogICAgICAidmVyc2lvbiI6ICIxLjIuMCIsCiAgICAgICJyZXNvbHZlZCI6ICJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy9wb3N0Z3Jlcy1pbnRlcnZhbC8tL3Bvc3RncmVzLWludGVydmFsLTEuMi4wLnRneiIsCiAgICAgICJpbnRlZ3JpdHkiOiAic2hhNTEyLTlaaFhLTS9ydzM1ME4xb3Z1V0hiR3huR2gvU05KNGNueEhpTTByeEU0Vk40MXdzZzhQOHpXbjlodi9idUswMFJQNFd2bE95ci9SQkRpcHR5eFZia1pRPT0iLAogICAgICAibGljZW5zZSI6ICJNSVQiLAogICAgICAiZGVwZW5kZW5jaWVzIjogewogICAgICAgICJ4dGVuZCI6ICJeNC4wLjAiCiAgICAgIH0sCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC4xMC4wIgogICAgICB9CiAgICB9LAogICAgIm5vZGVfbW9kdWxlcy9zcGxpdDIiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMi4wIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3NwbGl0Mi8tL3NwbGl0Mi00LjIuMC50Z3oiLAogICAgICAiaW50ZWdyaXR5IjogInNoYTUxMi1VY2pjSk9Xa25yTmtGNlBMWDgzcWNITTZLSGdWS05rVjYyWThhNXVZRFZ2OXlkR1FWd0FITUtxSGRKamUxVlRXcGxqRzBXWXBDRGhyQ2RBT1lINFRXZz09IiwKICAgICAgImxpY2Vuc2UiOiAiSVNDIiwKICAgICAgImVuZ2luZXMiOiB7CiAgICAgICAgIm5vZGUiOiAiPj0gMTAueCIKICAgICAgfQogICAgfSwKICAgICJub2RlX21vZHVsZXMveHRlbmQiOiB7CiAgICAgICJ2ZXJzaW9uIjogIjQuMC4yIiwKICAgICAgInJlc29sdmVkIjogImh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3h0ZW5kLy0veHRlbmQtNC4wLjIudGd6IiwKICAgICAgImludGVncml0eSI6ICJzaGE1MTItTEtZVTFpQVhKWFVnQVhuOVVSaml1K01XaHlVWEhzdmZwN21jdVltOWRTVUtLMC9DanRyVXdGQXhEODIvbUNXYnRMc0dqRklhZDB3SXNvZDR6clRBRVE9PSIsCiAgICAgICJsaWNlbnNlIjogIk1JVCIsCiAgICAgICJlbmdpbmVzIjogewogICAgICAgICJub2RlIjogIj49MC40IgogICAgICB9CiAgICB9CiAgfQp9Cg=="},{"path":"package.json","exec":false,"body":"ewogICJuYW1lIjogIm5vZGUtd29ya2VyLWNyb24iLAogICJwcml2YXRlIjogdHJ1ZSwKICAidHlwZSI6ICJtb2R1bGUiLAogICJlbmdpbmVzIjogewogICAgIm5vZGUiOiAiMjIiCiAgfSwKICAic2NyaXB0cyI6IHsKICAgICJzdGFydCI6ICJub2RlIGtlZXBhbGl2ZS5tanMiCiAgfSwKICAiZGVwZW5kZW5jaWVzIjogewogICAgInBnIjogIl44LjEzLjAiCiAgfQp9Cg=="},{"path":"sql.mjs","exec":false,"body":"Ly8gU1FMIG9ubHksIHNvIGVhY2ggc3RhdGVtZW50IGNhbiBiZSByZWFkIGFuZCB0ZXN0ZWQgd2l0aG91dCBhIGRhdGFiYXNlIGRyaXZlci4KCi8vIEJvdGggdGFibGVzIGFyZSBjcmVhdGVkIGlmIG1pc3NpbmcsIHNvIGV2ZXJ5IHByb2Nlc3MgY2FuIHJ1biB0aGlzIGF0IHN0YXJ0LgpleHBvcnQgY29uc3QgU0NIRU1BID0gYApDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBqb2JzICgKICBpZCBiaWdzZXJpYWwgUFJJTUFSWSBLRVksCiAga2luZCB0ZXh0IE5PVCBOVUxMLAogIHBheWxvYWQganNvbmIgTk9UIE5VTEwgREVGQVVMVCAne30nOjpqc29uYiwKICBzdGF0dXMgdGV4dCBOT1QgTlVMTCBERUZBVUxUICdxdWV1ZWQnLAogIGNyZWF0ZWRfYXQgdGltZXN0YW1wdHogTk9UIE5VTEwgREVGQVVMVCBub3coKSwKICBzdGFydGVkX2F0IHRpbWVzdGFtcHR6LAogIGZpbmlzaGVkX2F0IHRpbWVzdGFtcHR6LAogIGVycm9yIHRleHQKKTsKQ1JFQVRFIElOREVYIElGIE5PVCBFWElTVFMgam9ic19xdWV1ZWQgT04gam9icyAoY3JlYXRlZF9hdCkgV0hFUkUgc3RhdHVzID0gJ3F1ZXVlZCc7CkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIGhlYXJ0YmVhdHMgKAogIGlkIGJpZ3NlcmlhbCBQUklNQVJZIEtFWSwKICBhdCB0aW1lc3RhbXB0eiBOT1QgTlVMTCBERUZBVUxUIG5vdygpCik7CmA7CgovLyBUYWtlcyB0aGUgb2xkZXN0IHF1ZXVlZCBqb2IgYW5kIG1hcmtzIGl0IHJ1bm5pbmcuIFNLSVAgTE9DS0VEIGxldHMgc2V2ZXJhbAovLyB3b3JrZXJzIHJ1biBhdCBvbmNlIHdpdGhvdXQgdGFraW5nIHRoZSBzYW1lIGpvYi4KZXhwb3J0IGNvbnN0IENMQUlNID0gYApVUERBVEUgam9icyBTRVQgc3RhdHVzID0gJ3J1bm5pbmcnLCBzdGFydGVkX2F0ID0gbm93KCkKV0hFUkUgaWQgPSAoCiAgU0VMRUNUIGlkIEZST00gam9icyBXSEVSRSBzdGF0dXMgPSAncXVldWVkJwogIE9SREVSIEJZIGNyZWF0ZWRfYXQsIGlkCiAgRk9SIFVQREFURSBTS0lQIExPQ0tFRAogIExJTUlUIDEKKQpSRVRVUk5JTkcgaWQsIGtpbmQsIHBheWxvYWQKYDsKCi8vICQxIGpvYiBpZCwgJDIgJ2RvbmUnIG9yICdmYWlsZWQnLCAkMyBlcnJvciB0ZXh0IG9yIG51bGwuCmV4cG9ydCBjb25zdCBGSU5JU0ggPSBgClVQREFURSBqb2JzIFNFVCBzdGF0dXMgPSAkMiwgZmluaXNoZWRfYXQgPSBub3coKSwgZXJyb3IgPSAkMyBXSEVSRSBpZCA9ICQxCmA7CgpleHBvcnQgY29uc3QgSEVBUlRCRUFUID0gYElOU0VSVCBJTlRPIGhlYXJ0YmVhdHMgREVGQVVMVCBWQUxVRVMgUkVUVVJOSU5HIGlkLCBhdGA7Cg=="},{"path":"worker.mjs","exec":false,"body":"Ly8gVGhlIHdvcmtlciBhcHAncyBwcm9jZXNzOiB0YWtlcyBqb2JzIGZyb20gdGhlIGpvYnMgdGFibGUgb25lIGF0IGEgdGltZS4KLy8gSXQgb3BlbnMgbm8gcG9ydDsgQXN0cmlzIGdpdmVzIGEgd29ya2VyIGFwcCBubyBwdWJsaWMgYWRkcmVzcy4KaW1wb3J0IHBnIGZyb20gInBnIjsKaW1wb3J0IHsgQ0xBSU0sIEZJTklTSCwgU0NIRU1BIH0gZnJvbSAiLi9zcWwubWpzIjsKCmNvbnN0IHVybCA9IHByb2Nlc3MuZW52LkRBVEFCQVNFX1VSTDsKaWYgKCF1cmwpIHsKICBjb25zb2xlLmVycm9yKCJEQVRBQkFTRV9VUkwgaXMgbm90IHNldC4gU2V0IGl0IG9uIHRoaXMgYXBwLCB0aGVuIGRlcGxveSBhZ2Fpbi4iKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KCmNvbnN0IHBvb2wgPSBuZXcgcGcuUG9vbCh7IGNvbm5lY3Rpb25TdHJpbmc6IHVybCwgbWF4OiAyIH0pOwovLyBBbiBpZGxlIGNvbm5lY3Rpb24gdGhhdCBkcm9wcyBpcyByZXBvcnRlZCBoZXJlOyB0aGUgbmV4dCBxdWVyeSBvcGVucyBhIG5ldyBvbmUuCnBvb2wub24oImVycm9yIiwgKGVycm9yKSA9PiBjb25zb2xlLmVycm9yKCJ3b3JrZXI6IiwgU3RyaW5nKGVycm9yKSkpOwpsZXQgc3RvcHBpbmcgPSBmYWxzZTsKcHJvY2Vzcy5vbigiU0lHVEVSTSIsICgpID0+IHsKICBzdG9wcGluZyA9IHRydWU7Cn0pOwoKY29uc3Qgc2xlZXAgPSAobXMpID0+IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIG1zKSk7CgovLyBQdXQgeW91ciBvd24gd29yayBoZXJlLCBvbmUgYnJhbmNoIHBlciBqb2Iga2luZC4KY29uc3QgaGFuZGxlID0gYXN5bmMgKGpvYikgPT4gewogIGNvbnNvbGUubG9nKGBqb2IgJHtqb2IuaWR9ICR7am9iLmtpbmR9YCwgSlNPTi5zdHJpbmdpZnkoam9iLnBheWxvYWQpKTsKfTsKCmF3YWl0IHBvb2wucXVlcnkoU0NIRU1BKTsKY29uc29sZS5sb2coIndvcmtlciBzdGFydGVkIik7Ci8vIEEgam9iIHdob3NlIHdvcmtlciBzdG9wcGVkIG1pZC1qb2Igc3RheXMgJ3J1bm5pbmcnLiBUbyBydW4gaXQgYWdhaW4sIHB1dCBpdAovLyBiYWNrIGJ5IGlkIG9uY2UgeW91IGtub3cgbm8gd29ya2VyIHN0aWxsIHJ1bnMgaXQ6Ci8vIFVQREFURSBqb2JzIFNFVCBzdGF0dXMgPSAncXVldWVkJyBXSEVSRSBpZCA9IDxpZD4gQU5EIHN0YXR1cyA9ICdydW5uaW5nJzsKY29uc3Qgc3RlcCA9IGFzeW5jICgpID0+IHsKICBjb25zdCB7IHJvd3MgfSA9IGF3YWl0IHBvb2wucXVlcnkoQ0xBSU0pOwogIGNvbnN0IGpvYiA9IHJvd3NbMF07CiAgaWYgKCFqb2IpIHJldHVybiBmYWxzZTsKICB0cnkgewogICAgYXdhaXQgaGFuZGxlKGpvYik7CiAgICBhd2FpdCBwb29sLnF1ZXJ5KEZJTklTSCwgW2pvYi5pZCwgImRvbmUiLCBudWxsXSk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIGF3YWl0IHBvb2wucXVlcnkoRklOSVNILCBbam9iLmlkLCAiZmFpbGVkIiwgU3RyaW5nKGVycm9yKS5zbGljZSgwLCAxMDAwKV0pOwogIH0KICByZXR1cm4gdHJ1ZTsKfTsKCndoaWxlICghc3RvcHBpbmcpIHsKICB0cnkgewogICAgaWYgKCEoYXdhaXQgc3RlcCgpKSkgYXdhaXQgc2xlZXAoMjAwMCk7CiAgfSBjYXRjaCAoZXJyb3IpIHsKICAgIC8vIEEgbG9zdCBkYXRhYmFzZSBjb25uZWN0aW9uOiB3YWl0LCB0aGVuIHRyeSBhZ2Fpbi4KICAgIGNvbnNvbGUuZXJyb3IoIndvcmtlcjoiLCBTdHJpbmcoZXJyb3IpKTsKICAgIGF3YWl0IHNsZWVwKDUwMDApOwogIH0KfQphd2FpdCBwb29sLmVuZCgpOwpjb25zb2xlLmxvZygid29ya2VyIHN0b3BwZWQiKTsK"}]}}
|