@treeseed/sdk 0.1.1 → 0.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -354,8 +354,8 @@ You can see that usage in:
354
354
 
355
355
  - [`agent/src/agents/kernel/agent-kernel.ts`](/home/adrian/Projects/treeseed/agent/src/agents/kernel/agent-kernel.ts)
356
356
  - [`agent/src/agents/kernel/trigger-resolver.ts`](/home/adrian/Projects/treeseed/agent/src/agents/kernel/trigger-resolver.ts)
357
- - [`core/fixture/src/agents/planner.ts`](/home/adrian/Projects/treeseed/core/fixture/src/agents/planner.ts)
358
- - [`core/fixture/src/agents/notifier.ts`](/home/adrian/Projects/treeseed/core/fixture/src/agents/notifier.ts)
357
+ - [`planner.ts`](/home/adrian/Projects/treeseed/core/.fixtures/treeseed-fixtures/sites/working-site/src/agents/planner.ts)
358
+ - [`notifier.ts`](/home/adrian/Projects/treeseed/core/.fixtures/treeseed-fixtures/sites/working-site/src/agents/notifier.ts)
359
359
 
360
360
  Conceptually, `agent_cursor` is the answer to: "Where should this agent continue from next time?"
361
361
 
@@ -508,7 +508,7 @@ Content-backed operations need a repository root that contains `src/content`.
508
508
  3. `TREESEED_SDK_REPO_ROOT`
509
509
  4. auto-detection from the current working directory
510
510
 
511
- For package-local tests and fixture-driven development, the SDK also recognizes a package fixture root containing `fixture/src/content`.
511
+ For fixture-driven development, the SDK also recognizes the shared submodule fixture at `.fixtures/treeseed-fixtures/sites/working-site`.
512
512
 
513
513
  Example with an explicit root:
514
514
 
@@ -522,6 +522,12 @@ const sdk = new AgentSdk({
522
522
 
523
523
  ## Local Development
524
524
 
525
+ Initialize the shared fixtures submodule before running fixture-backed tests:
526
+
527
+ ```bash
528
+ git submodule update --init --recursive
529
+ ```
530
+
525
531
  ```bash
526
532
  npm ci
527
533
  npm run build
@@ -539,9 +545,7 @@ What each command does:
539
545
 
540
546
  ## Sample Fixture Site
541
547
 
542
- The canonical SDK sample fixture lives at `../fixtures/fixture-sdk-sample-site/template` in the TreeSeed workspace.
543
-
544
- The SDK package also keeps a mirrored local fixture at `sdk/fixture` so the standalone SDK repository can run its own tests and CI without depending on the larger workspace layout.
548
+ The canonical shared fixture lives in the pinned `treeseed-fixtures` submodule at `.fixtures/treeseed-fixtures/sites/working-site`.
545
549
 
546
550
  It serves three purposes at once:
547
551
 
@@ -556,10 +560,18 @@ import path from 'node:path';
556
560
  import { AgentSdk } from '@treeseed/sdk';
557
561
 
558
562
  const sdk = new AgentSdk({
559
- repoRoot: path.resolve('../fixtures/fixture-sdk-sample-site/template'),
563
+ repoRoot: path.resolve('.fixtures/treeseed-fixtures/sites/working-site'),
560
564
  });
561
565
  ```
562
566
 
563
567
  The fixture includes representative entries for pages, notes, questions, objectives, books, knowledge, people, and agents so local queries behave like a small real site instead of a synthetic stub.
564
568
 
565
- In the full TreeSeed workspace, tests prefer the workspace fixture under `fixtures/`. In the standalone SDK repository, tests fall back to `sdk/fixture`.
569
+ Shared fixture commands:
570
+
571
+ ```bash
572
+ npm run fixtures:resolve
573
+ npm run fixtures:check
574
+ ```
575
+
576
+ - `fixtures:resolve`: prints the active shared fixture root
577
+ - `fixtures:check`: verifies that the pinned shared fixture is initialized and usable
package/dist/runtime.js CHANGED
@@ -1,10 +1,44 @@
1
- import { existsSync } from "node:fs";
1
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
2
2
  import path from "node:path";
3
+ const DEFAULT_FIXTURE_ID = "treeseed-working-site";
4
+ function resolveSharedFixtureRoot(start) {
5
+ const fixturesRoot = process.env.TREESEED_FIXTURES_ROOT ? path.resolve(process.env.TREESEED_FIXTURES_ROOT) : path.join(start, ".fixtures", "treeseed-fixtures");
6
+ const requestedFixtureId = process.env.TREESEED_FIXTURE_ID?.trim() || DEFAULT_FIXTURE_ID;
7
+ const directRoot = path.join(fixturesRoot, "sites", "working-site");
8
+ const directManifestPath = path.join(directRoot, "fixture.manifest.json");
9
+ if (existsSync(path.join(directRoot, "src", "content")) && existsSync(directManifestPath)) {
10
+ return directRoot;
11
+ }
12
+ const sitesRoot = path.join(fixturesRoot, "sites");
13
+ if (!existsSync(sitesRoot)) {
14
+ return null;
15
+ }
16
+ for (const entry of readdirSync(sitesRoot, { withFileTypes: true }).filter((item) => item.isDirectory()).map((item) => item.name)) {
17
+ const fixtureRoot = path.join(sitesRoot, entry);
18
+ const manifestPath = path.join(fixtureRoot, "fixture.manifest.json");
19
+ if (!existsSync(manifestPath)) {
20
+ continue;
21
+ }
22
+ try {
23
+ const manifest = JSON.parse(readFileSync(manifestPath, "utf8"));
24
+ if (manifest.id === requestedFixtureId) {
25
+ const root = path.resolve(fixtureRoot, manifest.root ?? ".");
26
+ if (existsSync(path.join(root, "src", "content"))) {
27
+ return root;
28
+ }
29
+ }
30
+ } catch {
31
+ continue;
32
+ }
33
+ }
34
+ return null;
35
+ }
3
36
  function findContentRoot(start) {
4
37
  let current = path.resolve(start);
5
38
  for (; ; ) {
6
- if (existsSync(path.join(current, "fixture", "src", "content"))) {
7
- return path.join(current, "fixture");
39
+ const sharedFixtureRoot = resolveSharedFixtureRoot(current);
40
+ if (sharedFixtureRoot) {
41
+ return sharedFixtureRoot;
8
42
  }
9
43
  if (existsSync(path.join(current, "src", "content"))) {
10
44
  return current;
@@ -0,0 +1,129 @@
1
+ // scripts/build-dist.ts
2
+ import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { dirname as dirname2, extname as extname2, join, relative, resolve as resolve2 } from "node:path";
4
+ import { build } from "esbuild";
5
+ import ts from "typescript";
6
+
7
+ // scripts/package-tools.ts
8
+ import { dirname, extname, resolve } from "node:path";
9
+ import { fileURLToPath } from "node:url";
10
+ import { createRequire } from "node:module";
11
+ var require2 = createRequire(import.meta.url);
12
+ var scriptRoot = dirname(fileURLToPath(import.meta.url));
13
+ var packageCandidate = resolve(scriptRoot, "..");
14
+ var packageRoot = packageCandidate.endsWith("/dist") ? resolve(packageCandidate, "..") : packageCandidate;
15
+ var packageScriptRoot = packageCandidate.endsWith("/dist") ? resolve(packageCandidate, "scripts") : resolve(packageRoot, "scripts");
16
+
17
+ // scripts/build-dist.ts
18
+ var srcRoot = resolve2(packageRoot, "src");
19
+ var scriptsRoot = resolve2(packageRoot, "scripts");
20
+ var distRoot = resolve2(packageRoot, "dist");
21
+ var COPY_EXTENSIONS = /* @__PURE__ */ new Set([".d.js", ".json", ".md"]);
22
+ function walkFiles(root) {
23
+ const files = [];
24
+ for (const entry of readdirSync(root, { withFileTypes: true })) {
25
+ const fullPath = join(root, entry.name);
26
+ if (entry.isDirectory()) {
27
+ files.push(...walkFiles(fullPath));
28
+ continue;
29
+ }
30
+ files.push(fullPath);
31
+ }
32
+ return files;
33
+ }
34
+ function ensureDir(filePath) {
35
+ mkdirSync(dirname2(filePath), { recursive: true });
36
+ }
37
+ function rewriteRuntimeSpecifiers(contents) {
38
+ return contents.replace(/(['"`])(\.[^'"`\n]+)\.(mjs|ts)\1/g, "$1$2.js$1");
39
+ }
40
+ async function compileModule(filePath, sourceRoot, outputRoot) {
41
+ const relativePath = relative(sourceRoot, filePath);
42
+ const outputFile = resolve2(outputRoot, relativePath.replace(/\.(mjs|ts)$/u, ".js"));
43
+ ensureDir(outputFile);
44
+ await build({
45
+ entryPoints: [filePath],
46
+ outfile: outputFile,
47
+ platform: "node",
48
+ format: "esm",
49
+ bundle: false,
50
+ logLevel: "silent"
51
+ });
52
+ const builtSource = readFileSync(outputFile, "utf8");
53
+ writeFileSync(outputFile, rewriteRuntimeSpecifiers(builtSource), "utf8");
54
+ }
55
+ function copyAsset(filePath, sourceRoot, outputRoot) {
56
+ const outputFile = resolve2(outputRoot, relative(sourceRoot, filePath));
57
+ ensureDir(outputFile);
58
+ copyFileSync(filePath, outputFile);
59
+ if (outputFile.endsWith(".d.js")) {
60
+ const contents = readFileSync(outputFile, "utf8");
61
+ writeFileSync(outputFile, rewriteRuntimeSpecifiers(contents), "utf8");
62
+ }
63
+ }
64
+ function transpileScript(filePath) {
65
+ const source = readFileSync(filePath, "utf8");
66
+ const relativePath = relative(scriptsRoot, filePath);
67
+ if (relativePath === "fixture-tools.ts") {
68
+ return;
69
+ }
70
+ const outputFile = resolve2(distRoot, "scripts", relativePath.replace(/\.(mjs|ts)$/u, ".js"));
71
+ const transformed = extname2(filePath) === ".ts" ? ts.transpileModule(source, {
72
+ compilerOptions: {
73
+ module: ts.ModuleKind.ESNext,
74
+ target: ts.ScriptTarget.ES2022
75
+ }
76
+ }).outputText : source;
77
+ ensureDir(outputFile);
78
+ writeFileSync(outputFile, rewriteRuntimeSpecifiers(transformed), "utf8");
79
+ }
80
+ function emitDeclarations() {
81
+ const configPath = ts.findConfigFile(packageRoot, ts.sys.fileExists, "tsconfig.json");
82
+ if (!configPath) {
83
+ throw new Error("Unable to locate tsconfig.json for declaration build.");
84
+ }
85
+ const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
86
+ const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, packageRoot);
87
+ const program = ts.createProgram({
88
+ rootNames: parsed.fileNames,
89
+ options: {
90
+ ...parsed.options,
91
+ declaration: true,
92
+ emitDeclarationOnly: true,
93
+ declarationDir: distRoot,
94
+ noEmit: false
95
+ }
96
+ });
97
+ const result = program.emit();
98
+ if (result.emitSkipped) {
99
+ const diagnostics = ts.formatDiagnosticsWithColorAndContext(result.diagnostics, {
100
+ getCanonicalFileName: (fileName) => fileName,
101
+ getCurrentDirectory: () => process.cwd(),
102
+ getNewLine: () => "\n"
103
+ });
104
+ throw new Error(`Declaration build failed.
105
+ ${diagnostics}`);
106
+ }
107
+ }
108
+ rmSync(distRoot, { recursive: true, force: true });
109
+ for (const filePath of walkFiles(srcRoot)) {
110
+ const extension = extname2(filePath);
111
+ if (extension === ".ts") {
112
+ await compileModule(filePath, srcRoot, distRoot);
113
+ continue;
114
+ }
115
+ if (COPY_EXTENSIONS.has(extension)) {
116
+ copyAsset(filePath, srcRoot, distRoot);
117
+ }
118
+ }
119
+ for (const filePath of walkFiles(scriptsRoot)) {
120
+ const extension = extname2(filePath);
121
+ if (extension === ".ts" || extension === ".mjs") {
122
+ transpileScript(filePath);
123
+ }
124
+ }
125
+ emitDeclarations();
126
+ if (existsSync(resolve2(packageRoot, "README.md"))) {
127
+ copyFileSync(resolve2(packageRoot, "README.md"), resolve2(distRoot, "..", "README.md"));
128
+ }
129
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYnVpbGQtZGlzdC50cyIsICJwYWNrYWdlLXRvb2xzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgcGFja2FnZVJvb3QgfSBmcm9tICcuL3BhY2thZ2UtdG9vbHMudHMnO1xuXG5jb25zdCBzcmNSb290ID0gcmVzb2x2ZShwYWNrYWdlUm9vdCwgJ3NyYycpO1xuY29uc3Qgc2NyaXB0c1Jvb3QgPSByZXNvbHZlKHBhY2thZ2VSb290LCAnc2NyaXB0cycpO1xuY29uc3QgZGlzdFJvb3QgPSByZXNvbHZlKHBhY2thZ2VSb290LCAnZGlzdCcpO1xuXG5jb25zdCBDT1BZX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmQudHMnLCAnLmpzb24nLCAnLm1kJ10pO1xuXG5mdW5jdGlvbiB3YWxrRmlsZXMocm9vdCkge1xuXHRjb25zdCBmaWxlcyA9IFtdO1xuXHRmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKHJvb3QsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihyb290LCBlbnRyeS5uYW1lKTtcblx0XHRpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0ZmlsZXMucHVzaCguLi53YWxrRmlsZXMoZnVsbFBhdGgpKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0fVxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZURpcihmaWxlUGF0aCkge1xuXHRta2RpclN5bmMoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUnVudGltZVNwZWNpZmllcnMoY29udGVudHMpIHtcblx0cmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoLyhbJ1wiYF0pKFxcLlteJ1wiYFxcbl0rKVxcLihtanN8dHMpXFwxL2csICckMSQyLmpzJDEnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGlsZU1vZHVsZShmaWxlUGF0aCwgc291cmNlUm9vdCwgb3V0cHV0Um9vdCkge1xuXHRjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShzb3VyY2VSb290LCBmaWxlUGF0aCk7XG5cdGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlKG91dHB1dFJvb3QsIHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC4obWpzfHRzKSQvdSwgJy5qcycpKTtcblx0ZW5zdXJlRGlyKG91dHB1dEZpbGUpO1xuXG5cdGF3YWl0IGJ1aWxkKHtcblx0XHRlbnRyeVBvaW50czogW2ZpbGVQYXRoXSxcblx0XHRvdXRmaWxlOiBvdXRwdXRGaWxlLFxuXHRcdHBsYXRmb3JtOiAnbm9kZScsXG5cdFx0Zm9ybWF0OiAnZXNtJyxcblx0XHRidW5kbGU6IGZhbHNlLFxuXHRcdGxvZ0xldmVsOiAnc2lsZW50Jyxcblx0fSk7XG5cblx0Y29uc3QgYnVpbHRTb3VyY2UgPSByZWFkRmlsZVN5bmMob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcblx0d3JpdGVGaWxlU3luYyhvdXRwdXRGaWxlLCByZXdyaXRlUnVudGltZVNwZWNpZmllcnMoYnVpbHRTb3VyY2UpLCAndXRmOCcpO1xufVxuXG5mdW5jdGlvbiBjb3B5QXNzZXQoZmlsZVBhdGgsIHNvdXJjZVJvb3QsIG91dHB1dFJvb3QpIHtcblx0Y29uc3Qgb3V0cHV0RmlsZSA9IHJlc29sdmUob3V0cHV0Um9vdCwgcmVsYXRpdmUoc291cmNlUm9vdCwgZmlsZVBhdGgpKTtcblx0ZW5zdXJlRGlyKG91dHB1dEZpbGUpO1xuXHRjb3B5RmlsZVN5bmMoZmlsZVBhdGgsIG91dHB1dEZpbGUpO1xuXG5cdGlmIChvdXRwdXRGaWxlLmVuZHNXaXRoKCcuZC50cycpKSB7XG5cdFx0Y29uc3QgY29udGVudHMgPSByZWFkRmlsZVN5bmMob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcblx0XHR3cml0ZUZpbGVTeW5jKG91dHB1dEZpbGUsIHJld3JpdGVSdW50aW1lU3BlY2lmaWVycyhjb250ZW50cyksICd1dGY4Jyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNwaWxlU2NyaXB0KGZpbGVQYXRoKSB7XG5cdGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoc2NyaXB0c1Jvb3QsIGZpbGVQYXRoKTtcblx0aWYgKHJlbGF0aXZlUGF0aCA9PT0gJ2ZpeHR1cmUtdG9vbHMudHMnKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cdGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlKGRpc3RSb290LCAnc2NyaXB0cycsIHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC4obWpzfHRzKSQvdSwgJy5qcycpKTtcblx0Y29uc3QgdHJhbnNmb3JtZWQgPSBleHRuYW1lKGZpbGVQYXRoKSA9PT0gJy50cydcblx0XHQ/IHRzLnRyYW5zcGlsZU1vZHVsZShzb3VyY2UsIHtcblx0XHRcdFx0Y29tcGlsZXJPcHRpb25zOiB7XG5cdFx0XHRcdFx0bW9kdWxlOiB0cy5Nb2R1bGVLaW5kLkVTTmV4dCxcblx0XHRcdFx0XHR0YXJnZXQ6IHRzLlNjcmlwdFRhcmdldC5FUzIwMjIsXG5cdFx0XHRcdH0sXG5cdFx0XHR9KS5vdXRwdXRUZXh0XG5cdFx0OiBzb3VyY2U7XG5cblx0ZW5zdXJlRGlyKG91dHB1dEZpbGUpO1xuXHR3cml0ZUZpbGVTeW5jKG91dHB1dEZpbGUsIHJld3JpdGVSdW50aW1lU3BlY2lmaWVycyh0cmFuc2Zvcm1lZCksICd1dGY4Jyk7XG59XG5cbmZ1bmN0aW9uIGVtaXREZWNsYXJhdGlvbnMoKSB7XG5cdGNvbnN0IGNvbmZpZ1BhdGggPSB0cy5maW5kQ29uZmlnRmlsZShwYWNrYWdlUm9vdCwgdHMuc3lzLmZpbGVFeGlzdHMsICd0c2NvbmZpZy5qc29uJyk7XG5cdGlmICghY29uZmlnUGF0aCkge1xuXHRcdHRocm93IG5ldyBFcnJvcignVW5hYmxlIHRvIGxvY2F0ZSB0c2NvbmZpZy5qc29uIGZvciBkZWNsYXJhdGlvbiBidWlsZC4nKTtcblx0fVxuXG5cdGNvbnN0IGNvbmZpZ0ZpbGUgPSB0cy5yZWFkQ29uZmlnRmlsZShjb25maWdQYXRoLCB0cy5zeXMucmVhZEZpbGUpO1xuXHRjb25zdCBwYXJzZWQgPSB0cy5wYXJzZUpzb25Db25maWdGaWxlQ29udGVudChjb25maWdGaWxlLmNvbmZpZywgdHMuc3lzLCBwYWNrYWdlUm9vdCk7XG5cdGNvbnN0IHByb2dyYW0gPSB0cy5jcmVhdGVQcm9ncmFtKHtcblx0XHRyb290TmFtZXM6IHBhcnNlZC5maWxlTmFtZXMsXG5cdFx0b3B0aW9uczoge1xuXHRcdFx0Li4ucGFyc2VkLm9wdGlvbnMsXG5cdFx0XHRkZWNsYXJhdGlvbjogdHJ1ZSxcblx0XHRcdGVtaXREZWNsYXJhdGlvbk9ubHk6IHRydWUsXG5cdFx0XHRkZWNsYXJhdGlvbkRpcjogZGlzdFJvb3QsXG5cdFx0XHRub0VtaXQ6IGZhbHNlLFxuXHRcdH0sXG5cdH0pO1xuXG5cdGNvbnN0IHJlc3VsdCA9IHByb2dyYW0uZW1pdCgpO1xuXHRpZiAocmVzdWx0LmVtaXRTa2lwcGVkKSB7XG5cdFx0Y29uc3QgZGlhZ25vc3RpY3MgPSB0cy5mb3JtYXREaWFnbm9zdGljc1dpdGhDb2xvckFuZENvbnRleHQocmVzdWx0LmRpYWdub3N0aWNzLCB7XG5cdFx0XHRnZXRDYW5vbmljYWxGaWxlTmFtZTogKGZpbGVOYW1lKSA9PiBmaWxlTmFtZSxcblx0XHRcdGdldEN1cnJlbnREaXJlY3Rvcnk6ICgpID0+IHByb2Nlc3MuY3dkKCksXG5cdFx0XHRnZXROZXdMaW5lOiAoKSA9PiAnXFxuJyxcblx0XHR9KTtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYERlY2xhcmF0aW9uIGJ1aWxkIGZhaWxlZC5cXG4ke2RpYWdub3N0aWNzfWApO1xuXHR9XG59XG5cbnJtU3luYyhkaXN0Um9vdCwgeyByZWN1cnNpdmU6IHRydWUsIGZvcmNlOiB0cnVlIH0pO1xuXG5mb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdhbGtGaWxlcyhzcmNSb290KSkge1xuXHRjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKGZpbGVQYXRoKTtcblx0aWYgKGV4dGVuc2lvbiA9PT0gJy50cycpIHtcblx0XHRhd2FpdCBjb21waWxlTW9kdWxlKGZpbGVQYXRoLCBzcmNSb290LCBkaXN0Um9vdCk7XG5cdFx0Y29udGludWU7XG5cdH1cblxuXHRpZiAoQ09QWV9FWFRFTlNJT05TLmhhcyhleHRlbnNpb24pKSB7XG5cdFx0Y29weUFzc2V0KGZpbGVQYXRoLCBzcmNSb290LCBkaXN0Um9vdCk7XG5cdH1cbn1cblxuZm9yIChjb25zdCBmaWxlUGF0aCBvZiB3YWxrRmlsZXMoc2NyaXB0c1Jvb3QpKSB7XG5cdGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpO1xuXHRpZiAoZXh0ZW5zaW9uID09PSAnLnRzJyB8fCBleHRlbnNpb24gPT09ICcubWpzJykge1xuXHRcdHRyYW5zcGlsZVNjcmlwdChmaWxlUGF0aCk7XG5cdH1cbn1cblxuZW1pdERlY2xhcmF0aW9ucygpO1xuXG5pZiAoZXhpc3RzU3luYyhyZXNvbHZlKHBhY2thZ2VSb290LCAnUkVBRE1FLm1kJykpKSB7XG5cdGNvcHlGaWxlU3luYyhyZXNvbHZlKHBhY2thZ2VSb290LCAnUkVBRE1FLm1kJyksIHJlc29sdmUoZGlzdFJvb3QsICcuLicsICdSRUFETUUubWQnKSk7XG59XG4iLCAiaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGggfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBzcGF3biwgc3Bhd25TeW5jIH0gZnJvbSAnbm9kZTpjaGlsZF9wcm9jZXNzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5cbmNvbnN0IHJlcXVpcmUgPSBjcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7XG5jb25zdCBzY3JpcHRSb290ID0gZGlybmFtZShmaWxlVVJMVG9QYXRoKGltcG9ydC5tZXRhLnVybCkpO1xuY29uc3QgcGFja2FnZUNhbmRpZGF0ZSA9IHJlc29sdmUoc2NyaXB0Um9vdCwgJy4uJyk7XG5cbmV4cG9ydCBjb25zdCBwYWNrYWdlUm9vdCA9IHBhY2thZ2VDYW5kaWRhdGUuZW5kc1dpdGgoJy9kaXN0Jylcblx0PyByZXNvbHZlKHBhY2thZ2VDYW5kaWRhdGUsICcuLicpXG5cdDogcGFja2FnZUNhbmRpZGF0ZTtcbmV4cG9ydCBjb25zdCBwYWNrYWdlU2NyaXB0Um9vdCA9IHBhY2thZ2VDYW5kaWRhdGUuZW5kc1dpdGgoJy9kaXN0Jylcblx0PyByZXNvbHZlKHBhY2thZ2VDYW5kaWRhdGUsICdzY3JpcHRzJylcblx0OiByZXNvbHZlKHBhY2thZ2VSb290LCAnc2NyaXB0cycpO1xuXG5mdW5jdGlvbiByZXNvbHZlUGFja2FnZUJpbmFyeShwYWNrYWdlTmFtZSwgYmluTmFtZSA9IHBhY2thZ2VOYW1lKSB7XG5cdGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCk7XG5cdGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMocGFja2FnZUpzb25QYXRoLCAndXRmOCcpKTtcblx0Y29uc3QgYmluRmllbGQgPSBwYWNrYWdlSnNvbi5iaW47XG5cdGNvbnN0IHJlbGF0aXZlUGF0aCA9XG5cdFx0dHlwZW9mIGJpbkZpZWxkID09PSAnc3RyaW5nJ1xuXHRcdFx0PyBiaW5GaWVsZFxuXHRcdFx0OiBiaW5GaWVsZD8uW2Jpbk5hbWVdO1xuXG5cdGlmICghcmVsYXRpdmVQYXRoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBiaW5hcnkgXCIke2Jpbk5hbWV9XCIgZnJvbSBwYWNrYWdlIFwiJHtwYWNrYWdlTmFtZX1cIi5gKTtcblx0fVxuXG5cdHJldHVybiByZXNvbHZlKGRpcm5hbWUocGFja2FnZUpzb25QYXRoKSwgcmVsYXRpdmVQYXRoKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVBc3Ryb0JpbigpIHtcblx0cmV0dXJuIHJlc29sdmVQYWNrYWdlQmluYXJ5KCdhc3RybycsICdhc3RybycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVdyYW5nbGVyQmluKCkge1xuXHRyZXR1cm4gcmVzb2x2ZVBhY2thZ2VCaW5hcnkoJ3dyYW5nbGVyJywgJ3dyYW5nbGVyJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9kdWN0aW9uQnVpbGRFbnYoZXh0cmFFbnYgPSB7fSkge1xuXHRyZXR1cm4ge1xuXHRcdFRSRUVTRUVEX0xPQ0FMX0RFVl9NT0RFOiAnY2xvdWRmbGFyZScsXG5cdFx0VFJFRVNFRURfUFVCTElDX0ZPUk1TX0xPQ0FMX0JZUEFTU19UVVJOU1RJTEU6ICcnLFxuXHRcdFRSRUVTRUVEX0ZPUk1TX0xPQ0FMX0JZUEFTU19UVVJOU1RJTEU6ICcnLFxuXHRcdFRSRUVTRUVEX0ZPUk1TX0xPQ0FMX0JZUEFTU19DTE9VREZMQVJFX0dVQVJEUzogJycsXG5cdFx0VFJFRVNFRURfUFVCTElDX0RFVl9XQVRDSF9SRUxPQUQ6ICcnLFxuXHRcdC4uLmV4dHJhRW52LFxuXHR9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFja2FnZVNjcmlwdFBhdGgoc2NyaXB0TmFtZSkge1xuXHRpZiAoZXh0bmFtZShzY3JpcHROYW1lKSkge1xuXHRcdHJldHVybiByZXNvbHZlKHBhY2thZ2VTY3JpcHRSb290LCBzY3JpcHROYW1lKTtcblx0fVxuXG5cdGZvciAoY29uc3QgZXh0ZW5zaW9uIG9mIFsnLmpzJywgJy50cycsICcubWpzJ10pIHtcblx0XHRjb25zdCBjYW5kaWRhdGUgPSByZXNvbHZlKHBhY2thZ2VTY3JpcHRSb290LCBgJHtzY3JpcHROYW1lfSR7ZXh0ZW5zaW9ufWApO1xuXHRcdGlmIChleGlzdHNTeW5jKGNhbmRpZGF0ZSkpIHtcblx0XHRcdHJldHVybiBjYW5kaWRhdGU7XG5cdFx0fVxuXHR9XG5cblx0dGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcmVzb2x2ZSBwYWNrYWdlIHNjcmlwdCBcIiR7c2NyaXB0TmFtZX1cIi5gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bk5vZGVCaW5hcnkoYmluUGF0aCwgYXJncywgb3B0aW9ucyA9IHt9KSB7XG5cdGNvbnN0IHJlc3VsdCA9IHNwYXduU3luYyhwcm9jZXNzLmV4ZWNQYXRoLCBbYmluUGF0aCwgLi4uYXJnc10sIHtcblx0XHRzdGRpbzogb3B0aW9ucy5zdGRpbyA/PyAnaW5oZXJpdCcsXG5cdFx0Y3dkOiBvcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuXHRcdGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uKG9wdGlvbnMuZW52ID8/IHt9KSB9LFxuXHR9KTtcblxuXHRpZiAocmVzdWx0LnN0YXR1cyAhPT0gMCkge1xuXHRcdHByb2Nlc3MuZXhpdChyZXN1bHQuc3RhdHVzID8/IDEpO1xuXHR9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBydW5Ob2RlU2NyaXB0KHNjcmlwdFBhdGgsIGFyZ3MgPSBbXSwgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBydW5Ob2RlQmluYXJ5KHNjcmlwdFBhdGgsIGFyZ3MsIG9wdGlvbnMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3Bhd25Ob2RlQmluYXJ5KGJpblBhdGgsIGFyZ3MsIG9wdGlvbnMgPSB7fSkge1xuXHRyZXR1cm4gc3Bhd24ocHJvY2Vzcy5leGVjUGF0aCwgW2JpblBhdGgsIC4uLmFyZ3NdLCB7XG5cdFx0c3RkaW86IG9wdGlvbnMuc3RkaW8gPz8gJ2luaGVyaXQnLFxuXHRcdGN3ZDogb3B0aW9ucy5jd2QgPz8gcHJvY2Vzcy5jd2QoKSxcblx0XHRlbnY6IHsgLi4ucHJvY2Vzcy5lbnYsIC4uLihvcHRpb25zLmVudiA/PyB7fSkgfSxcblx0XHRkZXRhY2hlZDogb3B0aW9ucy5kZXRhY2hlZCA/PyBmYWxzZSxcblx0fSk7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiO0FBQUEsU0FBUyxjQUFjLFlBQVksV0FBVyxhQUFhLGNBQWMsUUFBUSxxQkFBcUI7QUFDdEcsU0FBUyxXQUFBQSxVQUFTLFdBQUFDLFVBQVMsTUFBTSxVQUFVLFdBQUFDLGdCQUFlO0FBQzFELFNBQVMsYUFBYTtBQUN0QixPQUFPLFFBQVE7OztBQ0RmLFNBQVMsU0FBUyxTQUFTLGVBQWU7QUFDMUMsU0FBUyxxQkFBcUI7QUFFOUIsU0FBUyxxQkFBcUI7QUFFOUIsSUFBTUMsV0FBVSxjQUFjLFlBQVksR0FBRztBQUM3QyxJQUFNLGFBQWEsUUFBUSxjQUFjLFlBQVksR0FBRyxDQUFDO0FBQ3pELElBQU0sbUJBQW1CLFFBQVEsWUFBWSxJQUFJO0FBRTFDLElBQU0sY0FBYyxpQkFBaUIsU0FBUyxPQUFPLElBQ3pELFFBQVEsa0JBQWtCLElBQUksSUFDOUI7QUFDSSxJQUFNLG9CQUFvQixpQkFBaUIsU0FBUyxPQUFPLElBQy9ELFFBQVEsa0JBQWtCLFNBQVMsSUFDbkMsUUFBUSxhQUFhLFNBQVM7OztBRFZqQyxJQUFNLFVBQVVDLFNBQVEsYUFBYSxLQUFLO0FBQzFDLElBQU0sY0FBY0EsU0FBUSxhQUFhLFNBQVM7QUFDbEQsSUFBTSxXQUFXQSxTQUFRLGFBQWEsTUFBTTtBQUU1QyxJQUFNLGtCQUFrQixvQkFBSSxJQUFJLENBQUMsU0FBUyxTQUFTLEtBQUssQ0FBQztBQUV6RCxT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Q3ZCLFVBQU0sY0FBYyxHQUFHLHFDQUFxQyxPQUFPLGFBQWE7QUFBQSxNQUMvRSxzQkFBc0IsQ0FBQyxhQUFhO0FBQUEsTUFDcEMscUJBQXFCLE1BQU0sUUFBUSxJQUFJO0FBQUEsTUFDdkMsWUFBWSxNQUFNO0FBQUEsSUFDbkIsQ0FBQztBQUNELFVBQU0sSUFBSSxNQUFNO0FBQUEsRUFBOEIsV0FBVyxFQUFFO0FBQUEsRUFDNUQ7QUFDRDtBQUVBLE9BQU8sVUFBVSxFQUFFLFdBQVcsTUFBTSxPQUFPLEtBQUssQ0FBQztBQUVqRCxXQUFXLFlBQVksVUFBVSxPQUFPLEdBQUc7QUFDMUMsUUFBTSxZQUFZQSxTQUFRLFFBQVE7QUFDbEMsTUFBSSxjQUFjLE9BQU87QUFDeEIsVUFBTSxjQUFjLFVBQVUsU0FBUyxRQUFRO0FBQy9DO0FBQUEsRUFDRDtBQUVBLE1BQUksZ0JBQWdCLElBQUksU0FBUyxHQUFHO0FBQ25DLGNBQVUsVUFBVSxTQUFTLFFBQVE7QUFBQSxFQUN0QztBQUNEO0FBRUEsV0FBVyxZQUFZLFVBQVUsV0FBVyxHQUFHO0FBQzlDLFFBQU0sWUFBWUEsU0FBUSxRQUFRO0FBQ2xDLE1BQUksY0FBYyxTQUFTLGNBQWMsUUFBUTtBQUNoRCxvQkFBZ0IsUUFBUTtBQUFBLEVBQ3pCO0FBQ0Q7QUFFQSxpQkFBaUI7QUFFakIsSUFBSSxXQUFXRixTQUFRLGFBQWEsV0FBVyxDQUFDLEdBQUc7QUFDbEQsZUFBYUEsU0FBUSxhQUFhLFdBQVcsR0FBR0EsU0FBUSxVQUFVLE1BQU0sV0FBVyxDQUFDO0FBQ3JGOyIsCiAgIm5hbWVzIjogWyJkaXJuYW1lIiwgImV4dG5hbWUiLCAicmVzb2x2ZSIsICJyZXF1aXJlIiwgInJlc29sdmUiLCAiZGlybmFtZSIsICJleHRuYW1lIl0KfQo=
@@ -52,6 +52,9 @@ function copyAsset(filePath, sourceRoot, outputRoot) {
52
52
  function transpileScript(filePath) {
53
53
  const source = readFileSync(filePath, 'utf8');
54
54
  const relativePath = relative(scriptsRoot, filePath);
55
+ if (relativePath === 'fixture-tools.ts') {
56
+ return;
57
+ }
55
58
  const outputFile = resolve(distRoot, 'scripts', relativePath.replace(/\.(mjs|ts)$/u, '.js'));
56
59
  const transformed = extname(filePath) === '.ts'
57
60
  ? ts.transpileModule(source, {
@@ -0,0 +1,5 @@
1
+ export declare const DEFAULT_FIXTURE_ID = "treeseed-working-site";
2
+ export declare function resolveFixturesRepoRoot(): string;
3
+ export declare function resolveSharedFixtureRoot(): string | null;
4
+ export declare function requireSharedFixtureRoot(): string;
5
+ export declare function checkSharedFixture(): string;
@@ -43,6 +43,7 @@ function scanDirectory(root) {
43
43
  }
44
44
  }
45
45
  }
46
+ run('npm', ['run', 'fixtures:check']);
46
47
  run('npm', ['run', 'build:dist']);
47
48
  scanDirectory(resolve(packageRoot, 'dist'));
48
49
  run('npm', ['run', 'test:unit']);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeseed/sdk",
3
- "version": "0.1.1",
3
+ "version": "0.1.2",
4
4
  "description": "Shared Treeseed SDK for content-backed and D1-backed object models.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {
@@ -34,6 +34,8 @@
34
34
  "test": "npm run test:unit",
35
35
  "test:unit": "vitest run --config ./vitest.config.ts",
36
36
  "test:smoke": "node ./scripts/run-ts.mjs ./scripts/test-smoke.ts",
37
+ "fixtures:resolve": "node ./scripts/run-ts.mjs ./scripts/fixture-tools.ts resolve",
38
+ "fixtures:check": "node ./scripts/run-ts.mjs ./scripts/fixture-tools.ts check",
37
39
  "verify": "npm run release:verify",
38
40
  "release:setup": "npm run setup:ci",
39
41
  "release:check-tag": "node ./scripts/run-ts.mjs ./scripts/assert-release-tag-version.ts",
@@ -1,126 +0,0 @@
1
- // scripts/build-dist.ts
2
- import { copyFileSync, existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
- import { dirname as dirname2, extname as extname2, join, relative, resolve as resolve2 } from "node:path";
4
- import { build } from "esbuild";
5
- import ts from "typescript";
6
-
7
- // scripts/package-tools.ts
8
- import { dirname, extname, resolve } from "node:path";
9
- import { fileURLToPath } from "node:url";
10
- import { createRequire } from "node:module";
11
- var require2 = createRequire(import.meta.url);
12
- var scriptRoot = dirname(fileURLToPath(import.meta.url));
13
- var packageCandidate = resolve(scriptRoot, "..");
14
- var packageRoot = packageCandidate.endsWith("/dist") ? resolve(packageCandidate, "..") : packageCandidate;
15
- var packageScriptRoot = packageCandidate.endsWith("/dist") ? resolve(packageCandidate, "scripts") : resolve(packageRoot, "scripts");
16
-
17
- // scripts/build-dist.ts
18
- var srcRoot = resolve2(packageRoot, "src");
19
- var scriptsRoot = resolve2(packageRoot, "scripts");
20
- var distRoot = resolve2(packageRoot, "dist");
21
- var COPY_EXTENSIONS = /* @__PURE__ */ new Set([".d.js", ".json", ".md"]);
22
- function walkFiles(root) {
23
- const files = [];
24
- for (const entry of readdirSync(root, { withFileTypes: true })) {
25
- const fullPath = join(root, entry.name);
26
- if (entry.isDirectory()) {
27
- files.push(...walkFiles(fullPath));
28
- continue;
29
- }
30
- files.push(fullPath);
31
- }
32
- return files;
33
- }
34
- function ensureDir(filePath) {
35
- mkdirSync(dirname2(filePath), { recursive: true });
36
- }
37
- function rewriteRuntimeSpecifiers(contents) {
38
- return contents.replace(/(['"`])(\.[^'"`\n]+)\.(mjs|ts)\1/g, "$1$2.js$1");
39
- }
40
- async function compileModule(filePath, sourceRoot, outputRoot) {
41
- const relativePath = relative(sourceRoot, filePath);
42
- const outputFile = resolve2(outputRoot, relativePath.replace(/\.(mjs|ts)$/u, ".js"));
43
- ensureDir(outputFile);
44
- await build({
45
- entryPoints: [filePath],
46
- outfile: outputFile,
47
- platform: "node",
48
- format: "esm",
49
- bundle: false,
50
- logLevel: "silent"
51
- });
52
- const builtSource = readFileSync(outputFile, "utf8");
53
- writeFileSync(outputFile, rewriteRuntimeSpecifiers(builtSource), "utf8");
54
- }
55
- function copyAsset(filePath, sourceRoot, outputRoot) {
56
- const outputFile = resolve2(outputRoot, relative(sourceRoot, filePath));
57
- ensureDir(outputFile);
58
- copyFileSync(filePath, outputFile);
59
- if (outputFile.endsWith(".d.js")) {
60
- const contents = readFileSync(outputFile, "utf8");
61
- writeFileSync(outputFile, rewriteRuntimeSpecifiers(contents), "utf8");
62
- }
63
- }
64
- function transpileScript(filePath) {
65
- const source = readFileSync(filePath, "utf8");
66
- const relativePath = relative(scriptsRoot, filePath);
67
- const outputFile = resolve2(distRoot, "scripts", relativePath.replace(/\.(mjs|ts)$/u, ".js"));
68
- const transformed = extname2(filePath) === ".ts" ? ts.transpileModule(source, {
69
- compilerOptions: {
70
- module: ts.ModuleKind.ESNext,
71
- target: ts.ScriptTarget.ES2022
72
- }
73
- }).outputText : source;
74
- ensureDir(outputFile);
75
- writeFileSync(outputFile, rewriteRuntimeSpecifiers(transformed), "utf8");
76
- }
77
- function emitDeclarations() {
78
- const configPath = ts.findConfigFile(packageRoot, ts.sys.fileExists, "tsconfig.json");
79
- if (!configPath) {
80
- throw new Error("Unable to locate tsconfig.json for declaration build.");
81
- }
82
- const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
83
- const parsed = ts.parseJsonConfigFileContent(configFile.config, ts.sys, packageRoot);
84
- const program = ts.createProgram({
85
- rootNames: parsed.fileNames,
86
- options: {
87
- ...parsed.options,
88
- declaration: true,
89
- emitDeclarationOnly: true,
90
- declarationDir: distRoot,
91
- noEmit: false
92
- }
93
- });
94
- const result = program.emit();
95
- if (result.emitSkipped) {
96
- const diagnostics = ts.formatDiagnosticsWithColorAndContext(result.diagnostics, {
97
- getCanonicalFileName: (fileName) => fileName,
98
- getCurrentDirectory: () => process.cwd(),
99
- getNewLine: () => "\n"
100
- });
101
- throw new Error(`Declaration build failed.
102
- ${diagnostics}`);
103
- }
104
- }
105
- rmSync(distRoot, { recursive: true, force: true });
106
- for (const filePath of walkFiles(srcRoot)) {
107
- const extension = extname2(filePath);
108
- if (extension === ".ts") {
109
- await compileModule(filePath, srcRoot, distRoot);
110
- continue;
111
- }
112
- if (COPY_EXTENSIONS.has(extension)) {
113
- copyAsset(filePath, srcRoot, distRoot);
114
- }
115
- }
116
- for (const filePath of walkFiles(scriptsRoot)) {
117
- const extension = extname2(filePath);
118
- if (extension === ".ts" || extension === ".mjs") {
119
- transpileScript(filePath);
120
- }
121
- }
122
- emitDeclarations();
123
- if (existsSync(resolve2(packageRoot, "README.md"))) {
124
- copyFileSync(resolve2(packageRoot, "README.md"), resolve2(distRoot, "..", "README.md"));
125
- }
126
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiYnVpbGQtZGlzdC50cyIsICJwYWNrYWdlLXRvb2xzLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZGRpclN5bmMsIHJlYWRGaWxlU3luYywgcm1TeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyBidWlsZCB9IGZyb20gJ2VzYnVpbGQnO1xuaW1wb3J0IHRzIGZyb20gJ3R5cGVzY3JpcHQnO1xuaW1wb3J0IHsgcGFja2FnZVJvb3QgfSBmcm9tICcuL3BhY2thZ2UtdG9vbHMudHMnO1xuXG5jb25zdCBzcmNSb290ID0gcmVzb2x2ZShwYWNrYWdlUm9vdCwgJ3NyYycpO1xuY29uc3Qgc2NyaXB0c1Jvb3QgPSByZXNvbHZlKHBhY2thZ2VSb290LCAnc2NyaXB0cycpO1xuY29uc3QgZGlzdFJvb3QgPSByZXNvbHZlKHBhY2thZ2VSb290LCAnZGlzdCcpO1xuXG5jb25zdCBDT1BZX0VYVEVOU0lPTlMgPSBuZXcgU2V0KFsnLmQudHMnLCAnLmpzb24nLCAnLm1kJ10pO1xuXG5mdW5jdGlvbiB3YWxrRmlsZXMocm9vdCkge1xuXHRjb25zdCBmaWxlcyA9IFtdO1xuXHRmb3IgKGNvbnN0IGVudHJ5IG9mIHJlYWRkaXJTeW5jKHJvb3QsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KSkge1xuXHRcdGNvbnN0IGZ1bGxQYXRoID0gam9pbihyb290LCBlbnRyeS5uYW1lKTtcblx0XHRpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0ZmlsZXMucHVzaCguLi53YWxrRmlsZXMoZnVsbFBhdGgpKTtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblx0XHRmaWxlcy5wdXNoKGZ1bGxQYXRoKTtcblx0fVxuXHRyZXR1cm4gZmlsZXM7XG59XG5cbmZ1bmN0aW9uIGVuc3VyZURpcihmaWxlUGF0aCkge1xuXHRta2RpclN5bmMoZGlybmFtZShmaWxlUGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xufVxuXG5mdW5jdGlvbiByZXdyaXRlUnVudGltZVNwZWNpZmllcnMoY29udGVudHMpIHtcblx0cmV0dXJuIGNvbnRlbnRzLnJlcGxhY2UoLyhbJ1wiYF0pKFxcLlteJ1wiYFxcbl0rKVxcLihtanN8dHMpXFwxL2csICckMSQyLmpzJDEnKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29tcGlsZU1vZHVsZShmaWxlUGF0aCwgc291cmNlUm9vdCwgb3V0cHV0Um9vdCkge1xuXHRjb25zdCByZWxhdGl2ZVBhdGggPSByZWxhdGl2ZShzb3VyY2VSb290LCBmaWxlUGF0aCk7XG5cdGNvbnN0IG91dHB1dEZpbGUgPSByZXNvbHZlKG91dHB1dFJvb3QsIHJlbGF0aXZlUGF0aC5yZXBsYWNlKC9cXC4obWpzfHRzKSQvdSwgJy5qcycpKTtcblx0ZW5zdXJlRGlyKG91dHB1dEZpbGUpO1xuXG5cdGF3YWl0IGJ1aWxkKHtcblx0XHRlbnRyeVBvaW50czogW2ZpbGVQYXRoXSxcblx0XHRvdXRmaWxlOiBvdXRwdXRGaWxlLFxuXHRcdHBsYXRmb3JtOiAnbm9kZScsXG5cdFx0Zm9ybWF0OiAnZXNtJyxcblx0XHRidW5kbGU6IGZhbHNlLFxuXHRcdGxvZ0xldmVsOiAnc2lsZW50Jyxcblx0fSk7XG5cblx0Y29uc3QgYnVpbHRTb3VyY2UgPSByZWFkRmlsZVN5bmMob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcblx0d3JpdGVGaWxlU3luYyhvdXRwdXRGaWxlLCByZXdyaXRlUnVudGltZVNwZWNpZmllcnMoYnVpbHRTb3VyY2UpLCAndXRmOCcpO1xufVxuXG5mdW5jdGlvbiBjb3B5QXNzZXQoZmlsZVBhdGgsIHNvdXJjZVJvb3QsIG91dHB1dFJvb3QpIHtcblx0Y29uc3Qgb3V0cHV0RmlsZSA9IHJlc29sdmUob3V0cHV0Um9vdCwgcmVsYXRpdmUoc291cmNlUm9vdCwgZmlsZVBhdGgpKTtcblx0ZW5zdXJlRGlyKG91dHB1dEZpbGUpO1xuXHRjb3B5RmlsZVN5bmMoZmlsZVBhdGgsIG91dHB1dEZpbGUpO1xuXG5cdGlmIChvdXRwdXRGaWxlLmVuZHNXaXRoKCcuZC50cycpKSB7XG5cdFx0Y29uc3QgY29udGVudHMgPSByZWFkRmlsZVN5bmMob3V0cHV0RmlsZSwgJ3V0ZjgnKTtcblx0XHR3cml0ZUZpbGVTeW5jKG91dHB1dEZpbGUsIHJld3JpdGVSdW50aW1lU3BlY2lmaWVycyhjb250ZW50cyksICd1dGY4Jyk7XG5cdH1cbn1cblxuZnVuY3Rpb24gdHJhbnNwaWxlU2NyaXB0KGZpbGVQYXRoKSB7XG5cdGNvbnN0IHNvdXJjZSA9IHJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0ZjgnKTtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmUoc2NyaXB0c1Jvb3QsIGZpbGVQYXRoKTtcblx0Y29uc3Qgb3V0cHV0RmlsZSA9IHJlc29sdmUoZGlzdFJvb3QsICdzY3JpcHRzJywgcmVsYXRpdmVQYXRoLnJlcGxhY2UoL1xcLihtanN8dHMpJC91LCAnLmpzJykpO1xuXHRjb25zdCB0cmFuc2Zvcm1lZCA9IGV4dG5hbWUoZmlsZVBhdGgpID09PSAnLnRzJ1xuXHRcdD8gdHMudHJhbnNwaWxlTW9kdWxlKHNvdXJjZSwge1xuXHRcdFx0XHRjb21waWxlck9wdGlvbnM6IHtcblx0XHRcdFx0XHRtb2R1bGU6IHRzLk1vZHVsZUtpbmQuRVNOZXh0LFxuXHRcdFx0XHRcdHRhcmdldDogdHMuU2NyaXB0VGFyZ2V0LkVTMjAyMixcblx0XHRcdFx0fSxcblx0XHRcdH0pLm91dHB1dFRleHRcblx0XHQ6IHNvdXJjZTtcblxuXHRlbnN1cmVEaXIob3V0cHV0RmlsZSk7XG5cdHdyaXRlRmlsZVN5bmMob3V0cHV0RmlsZSwgcmV3cml0ZVJ1bnRpbWVTcGVjaWZpZXJzKHRyYW5zZm9ybWVkKSwgJ3V0ZjgnKTtcbn1cblxuZnVuY3Rpb24gZW1pdERlY2xhcmF0aW9ucygpIHtcblx0Y29uc3QgY29uZmlnUGF0aCA9IHRzLmZpbmRDb25maWdGaWxlKHBhY2thZ2VSb290LCB0cy5zeXMuZmlsZUV4aXN0cywgJ3RzY29uZmlnLmpzb24nKTtcblx0aWYgKCFjb25maWdQYXRoKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCdVbmFibGUgdG8gbG9jYXRlIHRzY29uZmlnLmpzb24gZm9yIGRlY2xhcmF0aW9uIGJ1aWxkLicpO1xuXHR9XG5cblx0Y29uc3QgY29uZmlnRmlsZSA9IHRzLnJlYWRDb25maWdGaWxlKGNvbmZpZ1BhdGgsIHRzLnN5cy5yZWFkRmlsZSk7XG5cdGNvbnN0IHBhcnNlZCA9IHRzLnBhcnNlSnNvbkNvbmZpZ0ZpbGVDb250ZW50KGNvbmZpZ0ZpbGUuY29uZmlnLCB0cy5zeXMsIHBhY2thZ2VSb290KTtcblx0Y29uc3QgcHJvZ3JhbSA9IHRzLmNyZWF0ZVByb2dyYW0oe1xuXHRcdHJvb3ROYW1lczogcGFyc2VkLmZpbGVOYW1lcyxcblx0XHRvcHRpb25zOiB7XG5cdFx0XHQuLi5wYXJzZWQub3B0aW9ucyxcblx0XHRcdGRlY2xhcmF0aW9uOiB0cnVlLFxuXHRcdFx0ZW1pdERlY2xhcmF0aW9uT25seTogdHJ1ZSxcblx0XHRcdGRlY2xhcmF0aW9uRGlyOiBkaXN0Um9vdCxcblx0XHRcdG5vRW1pdDogZmFsc2UsXG5cdFx0fSxcblx0fSk7XG5cblx0Y29uc3QgcmVzdWx0ID0gcHJvZ3JhbS5lbWl0KCk7XG5cdGlmIChyZXN1bHQuZW1pdFNraXBwZWQpIHtcblx0XHRjb25zdCBkaWFnbm9zdGljcyA9IHRzLmZvcm1hdERpYWdub3N0aWNzV2l0aENvbG9yQW5kQ29udGV4dChyZXN1bHQuZGlhZ25vc3RpY3MsIHtcblx0XHRcdGdldENhbm9uaWNhbEZpbGVOYW1lOiAoZmlsZU5hbWUpID0+IGZpbGVOYW1lLFxuXHRcdFx0Z2V0Q3VycmVudERpcmVjdG9yeTogKCkgPT4gcHJvY2Vzcy5jd2QoKSxcblx0XHRcdGdldE5ld0xpbmU6ICgpID0+ICdcXG4nLFxuXHRcdH0pO1xuXHRcdHRocm93IG5ldyBFcnJvcihgRGVjbGFyYXRpb24gYnVpbGQgZmFpbGVkLlxcbiR7ZGlhZ25vc3RpY3N9YCk7XG5cdH1cbn1cblxucm1TeW5jKGRpc3RSb290LCB7IHJlY3Vyc2l2ZTogdHJ1ZSwgZm9yY2U6IHRydWUgfSk7XG5cbmZvciAoY29uc3QgZmlsZVBhdGggb2Ygd2Fsa0ZpbGVzKHNyY1Jvb3QpKSB7XG5cdGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUoZmlsZVBhdGgpO1xuXHRpZiAoZXh0ZW5zaW9uID09PSAnLnRzJykge1xuXHRcdGF3YWl0IGNvbXBpbGVNb2R1bGUoZmlsZVBhdGgsIHNyY1Jvb3QsIGRpc3RSb290KTtcblx0XHRjb250aW51ZTtcblx0fVxuXG5cdGlmIChDT1BZX0VYVEVOU0lPTlMuaGFzKGV4dGVuc2lvbikpIHtcblx0XHRjb3B5QXNzZXQoZmlsZVBhdGgsIHNyY1Jvb3QsIGRpc3RSb290KTtcblx0fVxufVxuXG5mb3IgKGNvbnN0IGZpbGVQYXRoIG9mIHdhbGtGaWxlcyhzY3JpcHRzUm9vdCkpIHtcblx0Y29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShmaWxlUGF0aCk7XG5cdGlmIChleHRlbnNpb24gPT09ICcudHMnIHx8IGV4dGVuc2lvbiA9PT0gJy5tanMnKSB7XG5cdFx0dHJhbnNwaWxlU2NyaXB0KGZpbGVQYXRoKTtcblx0fVxufVxuXG5lbWl0RGVjbGFyYXRpb25zKCk7XG5cbmlmIChleGlzdHNTeW5jKHJlc29sdmUocGFja2FnZVJvb3QsICdSRUFETUUubWQnKSkpIHtcblx0Y29weUZpbGVTeW5jKHJlc29sdmUocGFja2FnZVJvb3QsICdSRUFETUUubWQnKSwgcmVzb2x2ZShkaXN0Um9vdCwgJy4uJywgJ1JFQURNRS5tZCcpKTtcbn1cbiIsICJpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGRpcm5hbWUsIGV4dG5hbWUsIHJlc29sdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgZmlsZVVSTFRvUGF0aCB9IGZyb20gJ25vZGU6dXJsJztcbmltcG9ydCB7IHNwYXduLCBzcGF3blN5bmMgfSBmcm9tICdub2RlOmNoaWxkX3Byb2Nlc3MnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcblxuY29uc3QgcmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbmNvbnN0IHNjcmlwdFJvb3QgPSBkaXJuYW1lKGZpbGVVUkxUb1BhdGgoaW1wb3J0Lm1ldGEudXJsKSk7XG5jb25zdCBwYWNrYWdlQ2FuZGlkYXRlID0gcmVzb2x2ZShzY3JpcHRSb290LCAnLi4nKTtcblxuZXhwb3J0IGNvbnN0IHBhY2thZ2VSb290ID0gcGFja2FnZUNhbmRpZGF0ZS5lbmRzV2l0aCgnL2Rpc3QnKVxuXHQ/IHJlc29sdmUocGFja2FnZUNhbmRpZGF0ZSwgJy4uJylcblx0OiBwYWNrYWdlQ2FuZGlkYXRlO1xuZXhwb3J0IGNvbnN0IHBhY2thZ2VTY3JpcHRSb290ID0gcGFja2FnZUNhbmRpZGF0ZS5lbmRzV2l0aCgnL2Rpc3QnKVxuXHQ/IHJlc29sdmUocGFja2FnZUNhbmRpZGF0ZSwgJ3NjcmlwdHMnKVxuXHQ6IHJlc29sdmUocGFja2FnZVJvb3QsICdzY3JpcHRzJyk7XG5cbmZ1bmN0aW9uIHJlc29sdmVQYWNrYWdlQmluYXJ5KHBhY2thZ2VOYW1lLCBiaW5OYW1lID0gcGFja2FnZU5hbWUpIHtcblx0Y29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKGAke3BhY2thZ2VOYW1lfS9wYWNrYWdlLmpzb25gKTtcblx0Y29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhwYWNrYWdlSnNvblBhdGgsICd1dGY4JykpO1xuXHRjb25zdCBiaW5GaWVsZCA9IHBhY2thZ2VKc29uLmJpbjtcblx0Y29uc3QgcmVsYXRpdmVQYXRoID1cblx0XHR0eXBlb2YgYmluRmllbGQgPT09ICdzdHJpbmcnXG5cdFx0XHQ/IGJpbkZpZWxkXG5cdFx0XHQ6IGJpbkZpZWxkPy5bYmluTmFtZV07XG5cblx0aWYgKCFyZWxhdGl2ZVBhdGgpIHtcblx0XHR0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIGJpbmFyeSBcIiR7YmluTmFtZX1cIiBmcm9tIHBhY2thZ2UgXCIke3BhY2thZ2VOYW1lfVwiLmApO1xuXHR9XG5cblx0cmV0dXJuIHJlc29sdmUoZGlybmFtZShwYWNrYWdlSnNvblBhdGgpLCByZWxhdGl2ZVBhdGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZUFzdHJvQmluKCkge1xuXHRyZXR1cm4gcmVzb2x2ZVBhY2thZ2VCaW5hcnkoJ2FzdHJvJywgJ2FzdHJvJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlV3JhbmdsZXJCaW4oKSB7XG5cdHJldHVybiByZXNvbHZlUGFja2FnZUJpbmFyeSgnd3JhbmdsZXInLCAnd3JhbmdsZXInKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVByb2R1Y3Rpb25CdWlsZEVudihleHRyYUVudiA9IHt9KSB7XG5cdHJldHVybiB7XG5cdFx0VFJFRVNFRURfTE9DQUxfREVWX01PREU6ICdjbG91ZGZsYXJlJyxcblx0XHRUUkVFU0VFRF9QVUJMSUNfRk9STVNfTE9DQUxfQllQQVNTX1RVUk5TVElMRTogJycsXG5cdFx0VFJFRVNFRURfRk9STVNfTE9DQUxfQllQQVNTX1RVUk5TVElMRTogJycsXG5cdFx0VFJFRVNFRURfRk9STVNfTE9DQUxfQllQQVNTX0NMT1VERkxBUkVfR1VBUkRTOiAnJyxcblx0XHRUUkVFU0VFRF9QVUJMSUNfREVWX1dBVENIX1JFTE9BRDogJycsXG5cdFx0Li4uZXh0cmFFbnYsXG5cdH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYWNrYWdlU2NyaXB0UGF0aChzY3JpcHROYW1lKSB7XG5cdGlmIChleHRuYW1lKHNjcmlwdE5hbWUpKSB7XG5cdFx0cmV0dXJuIHJlc29sdmUocGFja2FnZVNjcmlwdFJvb3QsIHNjcmlwdE5hbWUpO1xuXHR9XG5cblx0Zm9yIChjb25zdCBleHRlbnNpb24gb2YgWycuanMnLCAnLnRzJywgJy5tanMnXSkge1xuXHRcdGNvbnN0IGNhbmRpZGF0ZSA9IHJlc29sdmUocGFja2FnZVNjcmlwdFJvb3QsIGAke3NjcmlwdE5hbWV9JHtleHRlbnNpb259YCk7XG5cdFx0aWYgKGV4aXN0c1N5bmMoY2FuZGlkYXRlKSkge1xuXHRcdFx0cmV0dXJuIGNhbmRpZGF0ZTtcblx0XHR9XG5cdH1cblxuXHR0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIHBhY2thZ2Ugc2NyaXB0IFwiJHtzY3JpcHROYW1lfVwiLmApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcnVuTm9kZUJpbmFyeShiaW5QYXRoLCBhcmdzLCBvcHRpb25zID0ge30pIHtcblx0Y29uc3QgcmVzdWx0ID0gc3Bhd25TeW5jKHByb2Nlc3MuZXhlY1BhdGgsIFtiaW5QYXRoLCAuLi5hcmdzXSwge1xuXHRcdHN0ZGlvOiBvcHRpb25zLnN0ZGlvID8/ICdpbmhlcml0Jyxcblx0XHRjd2Q6IG9wdGlvbnMuY3dkID8/IHByb2Nlc3MuY3dkKCksXG5cdFx0ZW52OiB7IC4uLnByb2Nlc3MuZW52LCAuLi4ob3B0aW9ucy5lbnYgPz8ge30pIH0sXG5cdH0pO1xuXG5cdGlmIChyZXN1bHQuc3RhdHVzICE9PSAwKSB7XG5cdFx0cHJvY2Vzcy5leGl0KHJlc3VsdC5zdGF0dXMgPz8gMSk7XG5cdH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1bk5vZGVTY3JpcHQoc2NyaXB0UGF0aCwgYXJncyA9IFtdLCBvcHRpb25zID0ge30pIHtcblx0cmV0dXJuIHJ1bk5vZGVCaW5hcnkoc2NyaXB0UGF0aCwgYXJncywgb3B0aW9ucyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGF3bk5vZGVCaW5hcnkoYmluUGF0aCwgYXJncywgb3B0aW9ucyA9IHt9KSB7XG5cdHJldHVybiBzcGF3bihwcm9jZXNzLmV4ZWNQYXRoLCBbYmluUGF0aCwgLi4uYXJnc10sIHtcblx0XHRzdGRpbzogb3B0aW9ucy5zdGRpbyA/PyAnaW5oZXJpdCcsXG5cdFx0Y3dkOiBvcHRpb25zLmN3ZCA/PyBwcm9jZXNzLmN3ZCgpLFxuXHRcdGVudjogeyAuLi5wcm9jZXNzLmVudiwgLi4uKG9wdGlvbnMuZW52ID8/IHt9KSB9LFxuXHRcdGRldGFjaGVkOiBvcHRpb25zLmRldGFjaGVkID8/IGZhbHNlLFxuXHR9KTtcbn1cbiJdLAogICJtYXBwaW5ncyI6ICI7QUFBQSxTQUFTLGNBQWMsWUFBWSxXQUFXLGFBQWEsY0FBYyxRQUFRLHFCQUFxQjtBQUN0RyxTQUFTLFdBQUFBLFVBQVMsV0FBQUMsVUFBUyxNQUFNLFVBQVUsV0FBQUMsZ0JBQWU7QUFDMUQsU0FBUyxhQUFhO0FBQ3RCLE9BQU8sUUFBUTs7O0FDRGYsU0FBUyxTQUFTLFNBQVMsZUFBZTtBQUMxQyxTQUFTLHFCQUFxQjtBQUU5QixTQUFTLHFCQUFxQjtBQUU5QixJQUFNQyxXQUFVLGNBQWMsWUFBWSxHQUFHO0FBQzdDLElBQU0sYUFBYSxRQUFRLGNBQWMsWUFBWSxHQUFHLENBQUM7QUFDekQsSUFBTSxtQkFBbUIsUUFBUSxZQUFZLElBQUk7QUFFMUMsSUFBTSxjQUFjLGlCQUFpQixTQUFTLE9BQU8sSUFDekQsUUFBUSxrQkFBa0IsSUFBSSxJQUM5QjtBQUNJLElBQU0sb0JBQW9CLGlCQUFpQixTQUFTLE9BQU8sSUFDL0QsUUFBUSxrQkFBa0IsU0FBUyxJQUNuQyxRQUFRLGFBQWEsU0FBUzs7O0FEVmpDLElBQU0sVUFBVUMsU0FBUSxhQUFhLEtBQUs7QUFDMUMsSUFBTSxjQUFjQSxTQUFRLGFBQWEsU0FBUztBQUNsRCxJQUFNLFdBQVdBLFNBQVEsYUFBYSxNQUFNO0FBRTVDLElBQU0sa0JBQWtCLG9CQUFJLElBQUksQ0FBQyxTQUFTLFNBQVMsS0FBSyxDQUFDO0FBRXpELFNBQVMsVUFBVSxNQUFNO0FBQ3hCLFFBQU0sUUFBUSxDQUFDO0FBQ2YsYUFBVyxTQUFTLFlBQVksTUFBTSxFQUFF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Q3ZDLFlBQVksTUFBTTtBQUFBLElBQ25CLENBQUM7QUFDRCxVQUFNLElBQUksTUFBTTtBQUFBLEVBQThCLFdBQVcsRUFBRTtBQUFBLEVBQzVEO0FBQ0Q7QUFFQSxPQUFPLFVBQVUsRUFBRSxXQUFXLE1BQU0sT0FBTyxLQUFLLENBQUM7QUFFakQsV0FBVyxZQUFZLFVBQVUsT0FBTyxHQUFHO0FBQzFDLFFBQU0sWUFBWUEsU0FBUSxRQUFRO0FBQ2xDLE1BQUksY0FBYyxPQUFPO0FBQ3hCLFVBQU0sY0FBYyxVQUFVLFNBQVMsUUFBUTtBQUMvQztBQUFBLEVBQ0Q7QUFFQSxNQUFJLGdCQUFnQixJQUFJLFNBQVMsR0FBRztBQUNuQyxjQUFVLFVBQVUsU0FBUyxRQUFRO0FBQUEsRUFDdEM7QUFDRDtBQUVBLFdBQVcsWUFBWSxVQUFVLFdBQVcsR0FBRztBQUM5QyxRQUFNLFlBQVlBLFNBQVEsUUFBUTtBQUNsQyxNQUFJLGNBQWMsU0FBUyxjQUFjLFFBQVE7QUFDaEQsb0JBQWdCLFFBQVE7QUFBQSxFQUN6QjtBQUNEO0FBRUEsaUJBQWlCO0FBRWpCLElBQUksV0FBV0YsU0FBUSxhQUFhLFdBQVcsQ0FBQyxHQUFHO0FBQ2xELGVBQWFBLFNBQVEsYUFBYSxXQUFXLEdBQUdBLFNBQVEsVUFBVSxNQUFNLFdBQVcsQ0FBQztBQUNyRjsiLAogICJuYW1lcyI6IFsiZGlybmFtZSIsICJleHRuYW1lIiwgInJlc29sdmUiLCAicmVxdWlyZSIsICJyZXNvbHZlIiwgImRpcm5hbWUiLCAiZXh0bmFtZSJdCn0K