experimental-agent 0.0.2 → 0.0.4
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 +13 -2
- package/dist/agent-workflow.d.mts +11 -3
- package/dist/agent-workflow.d.ts +11 -3
- package/dist/agent-workflow.js +1921 -1144
- package/dist/agent-workflow.mjs +7 -3
- package/dist/chunk-3ODWQVIA.mjs +12 -0
- package/dist/chunk-64THY7Y7.mjs +155 -0
- package/dist/chunk-GSRJYPWF.mjs +284 -0
- package/dist/chunk-HJGPUEFC.mjs +42 -0
- package/dist/chunk-JCPQQWIK.mjs +2057 -0
- package/dist/chunk-JEE2FQ4O.mjs +844 -0
- package/dist/chunk-T7PMZLOX.mjs +79 -0
- package/dist/chunk-TQRCSTCF.mjs +103 -0
- package/dist/chunk-VBLZWXVE.mjs +318 -0
- package/dist/{types-DPXFq_r6.d.ts → client-6g79J0s3.d.mts} +866 -31
- package/dist/{types-DPXFq_r6.d.mts → client-6g79J0s3.d.ts} +866 -31
- package/dist/client-SREKHM6I.mjs +15 -0
- package/dist/client.d.mts +37 -0
- package/dist/client.d.ts +37 -0
- package/dist/client.js +58 -0
- package/dist/client.mjs +30 -0
- package/dist/{client-HUG4HT5L.mjs → handler-36FM5H35.mjs} +4 -5
- package/dist/index.d.mts +3 -4
- package/dist/index.d.ts +3 -4
- package/dist/index.js +3102 -1438
- package/dist/index.mjs +720 -147
- package/dist/lifecycle-workflow.d.mts +3 -10
- package/dist/lifecycle-workflow.d.ts +3 -10
- package/dist/lifecycle-workflow.js +170 -1246
- package/dist/lifecycle-workflow.mjs +5 -41
- package/dist/local-fs-handlers-P4WGW3QY.mjs +235 -0
- package/dist/next/loader.d.mts +14 -0
- package/dist/next/loader.d.ts +14 -0
- package/dist/next/loader.js +206 -0
- package/dist/next/loader.mjs +103 -0
- package/dist/next.d.mts +34 -0
- package/dist/next.d.ts +34 -0
- package/dist/next.js +329 -0
- package/dist/next.mjs +224 -0
- package/dist/process-manager-JAKAXROL.mjs +10 -0
- package/dist/{client-4Y3UPWFR.mjs → sandbox-QAPGBVYM.mjs} +4 -3
- package/dist/storage-Q376OZH3.mjs +20 -0
- package/dist/{vercel-2CFDMEHB.mjs → vercel-LLXAHKVJ.mjs} +3 -1
- package/dist/vercel-sdk-VHKEX2GQ.mjs +8 -0
- package/package.json +32 -19
- package/dist/chunk-24DJSI7C.mjs +0 -374
- package/dist/chunk-4RGMKC2M.mjs +0 -755
- package/dist/chunk-6ICYKNCC.mjs +0 -284
- package/dist/chunk-PGYYQ3WZ.mjs +0 -1088
- package/dist/client-BBpD9kKL.d.ts +0 -193
- package/dist/client-BGJViybU.d.mts +0 -193
- package/dist/lifecycle-workflow-steps-HHN46ZAD.mjs +0 -20
- package/dist/local-BYPFRMLZ.mjs +0 -282
- package/dist/process-manager-H2HF6G4G.mjs +0 -153
- package/dist/sandbox-BFA4ECEQ.mjs +0 -10
- package/dist/storage-2U2QFNWI.mjs +0 -27
- /package/dist/{chunk-36X6L7SK.mjs → chunk-TAXLUVIC.mjs} +0 -0
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import {
|
|
2
|
+
package_default
|
|
3
|
+
} from "../chunk-T7PMZLOX.mjs";
|
|
4
|
+
import "../chunk-3ODWQVIA.mjs";
|
|
5
|
+
|
|
6
|
+
// src/next/loader.ts
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import { parseSync } from "@swc/core";
|
|
9
|
+
var PACKAGE_NAME = package_default.name;
|
|
10
|
+
var AGENT_PROTOCOL_VERSION = "v1";
|
|
11
|
+
var TYPESCRIPT_EXT_REGEX = /\.(ts|tsx|mts|cts)$/;
|
|
12
|
+
function agentRpcLoader(source) {
|
|
13
|
+
const { debug } = this.getOptions();
|
|
14
|
+
const log = debug ? (...args) => console.log("[agent-loader]", ...args) : () => void 0;
|
|
15
|
+
log("processing:", this.resourcePath);
|
|
16
|
+
if (!source.includes(PACKAGE_NAME)) {
|
|
17
|
+
log("skipping - no package name");
|
|
18
|
+
return source;
|
|
19
|
+
}
|
|
20
|
+
const filename = this.resourcePath;
|
|
21
|
+
const isTypeScript = TYPESCRIPT_EXT_REGEX.test(filename);
|
|
22
|
+
let ast;
|
|
23
|
+
try {
|
|
24
|
+
ast = parseSync(source, {
|
|
25
|
+
syntax: isTypeScript ? "typescript" : "ecmascript",
|
|
26
|
+
tsx: filename.endsWith(".tsx"),
|
|
27
|
+
jsx: filename.endsWith(".jsx")
|
|
28
|
+
});
|
|
29
|
+
} catch {
|
|
30
|
+
return source;
|
|
31
|
+
}
|
|
32
|
+
const agentExports = findAgentExports(ast);
|
|
33
|
+
if (agentExports.length === 0) {
|
|
34
|
+
log("skipping - no agent exports");
|
|
35
|
+
return source;
|
|
36
|
+
}
|
|
37
|
+
log("found agent exports:", agentExports);
|
|
38
|
+
const fileDir = path.dirname(filename);
|
|
39
|
+
const srcIndex = filename.lastIndexOf(`${path.sep}src${path.sep}`);
|
|
40
|
+
if (srcIndex === -1) {
|
|
41
|
+
log("skipping - no src dir found");
|
|
42
|
+
return source;
|
|
43
|
+
}
|
|
44
|
+
const srcDir = filename.substring(0, srcIndex + 4);
|
|
45
|
+
const appDir = path.join(srcDir, "app");
|
|
46
|
+
const stepsPath = path.join(
|
|
47
|
+
appDir,
|
|
48
|
+
".well-known",
|
|
49
|
+
"agent",
|
|
50
|
+
AGENT_PROTOCOL_VERSION,
|
|
51
|
+
"steps.js"
|
|
52
|
+
);
|
|
53
|
+
let relativePath = path.relative(fileDir, stepsPath).replace(/\\/g, "/");
|
|
54
|
+
if (!(relativePath.startsWith("./") || relativePath.startsWith("../"))) {
|
|
55
|
+
relativePath = `./${relativePath}`;
|
|
56
|
+
}
|
|
57
|
+
const initCalls = agentExports.map((name) => {
|
|
58
|
+
const initName = `__init${name[0].toUpperCase()}${name.slice(1)}`;
|
|
59
|
+
return `${initName}(${name});`;
|
|
60
|
+
}).join("\n");
|
|
61
|
+
const initImports = agentExports.map((name) => `__init${name[0].toUpperCase()}${name.slice(1)}`).join(", ");
|
|
62
|
+
log("injecting init calls for:", agentExports);
|
|
63
|
+
return `${source}
|
|
64
|
+
import { ${initImports} } from "${relativePath}";
|
|
65
|
+
${initCalls}`;
|
|
66
|
+
}
|
|
67
|
+
function findAgentExports(ast) {
|
|
68
|
+
let agentLocalName = null;
|
|
69
|
+
for (const item of ast.body) {
|
|
70
|
+
if (item.type === "ImportDeclaration" && item.source.value === PACKAGE_NAME) {
|
|
71
|
+
for (const specifier of item.specifiers) {
|
|
72
|
+
if (specifier.type === "ImportSpecifier") {
|
|
73
|
+
const imported = specifier.imported?.type === "Identifier" ? specifier.imported.value : specifier.local.value;
|
|
74
|
+
if (imported === "agent") {
|
|
75
|
+
agentLocalName = specifier.local.value;
|
|
76
|
+
break;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
if (!agentLocalName) {
|
|
83
|
+
return [];
|
|
84
|
+
}
|
|
85
|
+
const exports = [];
|
|
86
|
+
for (const item of ast.body) {
|
|
87
|
+
if (item.type === "ExportDeclaration" && item.declaration) {
|
|
88
|
+
const decl = item.declaration;
|
|
89
|
+
if (decl.type === "VariableDeclaration") {
|
|
90
|
+
for (const declarator of decl.declarations) {
|
|
91
|
+
if (declarator.id.type === "Identifier" && declarator.init?.type === "CallExpression" && declarator.init.callee.type === "Identifier" && declarator.init.callee.value === agentLocalName) {
|
|
92
|
+
exports.push(declarator.id.value);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
return exports;
|
|
99
|
+
}
|
|
100
|
+
export {
|
|
101
|
+
agentRpcLoader as default
|
|
102
|
+
};
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vc3JjL25leHQvbG9hZGVyLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IHR5cGUgTW9kdWxlLCBwYXJzZVN5bmMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgcGtnIGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIjtcblxudHlwZSBMb2FkZXJPcHRpb25zID0ge1xuICBkZWJ1Zz86IGJvb2xlYW47XG59O1xuXG50eXBlIExvYWRlckNvbnRleHQgPSB7XG4gIHJlc291cmNlUGF0aDogc3RyaW5nO1xuICBnZXRPcHRpb25zKCk6IExvYWRlck9wdGlvbnM7XG59O1xuXG5jb25zdCBQQUNLQUdFX05BTUUgPSBwa2cubmFtZTtcbmNvbnN0IEFHRU5UX1BST1RPQ09MX1ZFUlNJT04gPSBcInYxXCI7XG5jb25zdCBUWVBFU0NSSVBUX0VYVF9SRUdFWCA9IC9cXC4odHN8dHN4fG10c3xjdHMpJC87XG5cbi8qKlxuICogV2VicGFjay9UdXJib3BhY2sgbG9hZGVyIHRoYXQgd2lyZXMgdXAgYWdlbnQucnBjIGJ5IHJlcXVpcmluZyBzdGVwcy5qc1xuICogYXQgdGhlIEVORCBvZiB0aGUgZmlsZS4gVXNpbmcgcmVxdWlyZSgpIGF2b2lkcyBpbXBvcnQgaG9pc3RpbmcgaXNzdWVzLlxuICovXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBhZ2VudFJwY0xvYWRlcihcbiAgdGhpczogTG9hZGVyQ29udGV4dCxcbiAgc291cmNlOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgZGVidWcgfSA9IHRoaXMuZ2V0T3B0aW9ucygpO1xuICBjb25zdCBsb2cgPSBkZWJ1Z1xuICAgID8gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4gY29uc29sZS5sb2coXCJbYWdlbnQtbG9hZGVyXVwiLCAuLi5hcmdzKVxuICAgIDogKCkgPT4gdW5kZWZpbmVkO1xuXG4gIGxvZyhcInByb2Nlc3Npbmc6XCIsIHRoaXMucmVzb3VyY2VQYXRoKTtcblxuICBpZiAoIXNvdXJjZS5pbmNsdWRlcyhQQUNLQUdFX05BTUUpKSB7XG4gICAgbG9nKFwic2tpcHBpbmcgLSBubyBwYWNrYWdlIG5hbWVcIik7XG4gICAgcmV0dXJuIHNvdXJjZTtcbiAgfVxuXG4gIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5yZXNvdXJjZVBhdGg7XG4gIGNvbnN0IGlzVHlwZVNjcmlwdCA9IFRZUEVTQ1JJUFRfRVhUX1JFR0VYLnRlc3QoZmlsZW5hbWUpO1xuXG4gIGxldCBhc3Q6IE1vZHVsZTtcbiAgdHJ5IHtcbiAgICBhc3QgPSBwYXJzZVN5bmMoc291cmNlLCB7XG4gICAgICBzeW50YXg6IGlzVHlwZVNjcmlwdCA/IFwidHlwZXNjcmlwdFwiIDogXCJlY21hc2NyaXB0XCIsXG4gICAgICB0c3g6IGZpbGVuYW1lLmVuZHNXaXRoKFwiLnRzeFwiKSxcbiAgICAgIGpzeDogZmlsZW5hbWUuZW5kc1dpdGgoXCIuanN4XCIpLFxuICAgIH0pO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgY29uc3QgYWdlbnRFeHBvcnRzID0gZmluZEFnZW50RXhwb3J0cyhhc3QpO1xuICBpZiAoYWdlbnRFeHBvcnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZyhcInNraXBwaW5nIC0gbm8gYWdlbnQgZXhwb3J0c1wiKTtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgbG9nKFwiZm91bmQgYWdlbnQgZXhwb3J0czpcIiwgYWdlbnRFeHBvcnRzKTtcblxuICAvLyBDYWxjdWxhdGUgcGF0aCB0byBzdGVwcy5qc1xuICBjb25zdCBmaWxlRGlyID0gcGF0aC5kaXJuYW1lKGZpbGVuYW1lKTtcbiAgY29uc3Qgc3JjSW5kZXggPSBmaWxlbmFtZS5sYXN0SW5kZXhPZihgJHtwYXRoLnNlcH1zcmMke3BhdGguc2VwfWApO1xuICBpZiAoc3JjSW5kZXggPT09IC0xKSB7XG4gICAgbG9nKFwic2tpcHBpbmcgLSBubyBzcmMgZGlyIGZvdW5kXCIpO1xuICAgIHJldHVybiBzb3VyY2U7XG4gIH1cblxuICBjb25zdCBzcmNEaXIgPSBmaWxlbmFtZS5zdWJzdHJpbmcoMCwgc3JjSW5kZXggKyA0KTtcbiAgY29uc3QgYXBwRGlyID0gcGF0aC5qb2luKHNyY0RpciwgXCJhcHBcIik7XG4gIGNvbnN0IHN0ZXBzUGF0aCA9IHBhdGguam9pbihcbiAgICBhcHBEaXIsXG4gICAgXCIud2VsbC1rbm93blwiLFxuICAgIFwiYWdlbnRcIixcbiAgICBBR0VOVF9QUk9UT0NPTF9WRVJTSU9OLFxuICAgIFwic3RlcHMuanNcIlxuICApO1xuICBsZXQgcmVsYXRpdmVQYXRoID0gcGF0aC5yZWxhdGl2ZShmaWxlRGlyLCBzdGVwc1BhdGgpLnJlcGxhY2UoL1xcXFwvZywgXCIvXCIpO1xuXG4gIGlmICghKHJlbGF0aXZlUGF0aC5zdGFydHNXaXRoKFwiLi9cIikgfHwgcmVsYXRpdmVQYXRoLnN0YXJ0c1dpdGgoXCIuLi9cIikpKSB7XG4gICAgcmVsYXRpdmVQYXRoID0gYC4vJHtyZWxhdGl2ZVBhdGh9YDtcbiAgfVxuXG4gIC8vIEltcG9ydCB0aGUgaW5pdCBmdW5jdGlvbiBmcm9tIHN0ZXBzLmpzIGFuZCBjYWxsIGl0IGZvciBlYWNoIGFnZW50XG4gIC8vIHN0ZXBzLmpzIG5vIGxvbmdlciBpbXBvcnRzIHRoZSBhZ2VudCwgc28gbm8gY2lyY3VsYXIgZGVwZW5kZW5jeVxuICBjb25zdCBpbml0Q2FsbHMgPSBhZ2VudEV4cG9ydHNcbiAgICAubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCBpbml0TmFtZSA9IGBfX2luaXQke25hbWVbMF0udG9VcHBlckNhc2UoKX0ke25hbWUuc2xpY2UoMSl9YDtcbiAgICAgIHJldHVybiBgJHtpbml0TmFtZX0oJHtuYW1lfSk7YDtcbiAgICB9KVxuICAgIC5qb2luKFwiXFxuXCIpO1xuXG4gIGNvbnN0IGluaXRJbXBvcnRzID0gYWdlbnRFeHBvcnRzXG4gICAgLm1hcCgobmFtZSkgPT4gYF9faW5pdCR7bmFtZVswXS50b1VwcGVyQ2FzZSgpfSR7bmFtZS5zbGljZSgxKX1gKVxuICAgIC5qb2luKFwiLCBcIik7XG5cbiAgbG9nKFwiaW5qZWN0aW5nIGluaXQgY2FsbHMgZm9yOlwiLCBhZ2VudEV4cG9ydHMpO1xuICByZXR1cm4gYCR7c291cmNlfVxuaW1wb3J0IHsgJHtpbml0SW1wb3J0c30gfSBmcm9tIFwiJHtyZWxhdGl2ZVBhdGh9XCI7XG4ke2luaXRDYWxsc31gO1xufVxuXG5mdW5jdGlvbiBmaW5kQWdlbnRFeHBvcnRzKGFzdDogTW9kdWxlKTogc3RyaW5nW10ge1xuICBsZXQgYWdlbnRMb2NhbE5hbWU6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhc3QuYm9keSkge1xuICAgIGlmIChcbiAgICAgIGl0ZW0udHlwZSA9PT0gXCJJbXBvcnREZWNsYXJhdGlvblwiICYmXG4gICAgICBpdGVtLnNvdXJjZS52YWx1ZSA9PT0gUEFDS0FHRV9OQU1FXG4gICAgKSB7XG4gICAgICBmb3IgKGNvbnN0IHNwZWNpZmllciBvZiBpdGVtLnNwZWNpZmllcnMpIHtcbiAgICAgICAgaWYgKHNwZWNpZmllci50eXBlID09PSBcIkltcG9ydFNwZWNpZmllclwiKSB7XG4gICAgICAgICAgY29uc3QgaW1wb3J0ZWQgPVxuICAgICAgICAgICAgc3BlY2lmaWVyLmltcG9ydGVkPy50eXBlID09PSBcIklkZW50aWZpZXJcIlxuICAgICAgICAgICAgICA/IHNwZWNpZmllci5pbXBvcnRlZC52YWx1ZVxuICAgICAgICAgICAgICA6IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcblxuICAgICAgICAgIGlmIChpbXBvcnRlZCA9PT0gXCJhZ2VudFwiKSB7XG4gICAgICAgICAgICBhZ2VudExvY2FsTmFtZSA9IHNwZWNpZmllci5sb2NhbC52YWx1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmICghYWdlbnRMb2NhbE5hbWUpIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICBjb25zdCBleHBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gIGZvciAoY29uc3QgaXRlbSBvZiBhc3QuYm9keSkge1xuICAgIGlmIChpdGVtLnR5cGUgPT09IFwiRXhwb3J0RGVjbGFyYXRpb25cIiAmJiBpdGVtLmRlY2xhcmF0aW9uKSB7XG4gICAgICBjb25zdCBkZWNsID0gaXRlbS5kZWNsYXJhdGlvbjtcbiAgICAgIGlmIChkZWNsLnR5cGUgPT09IFwiVmFyaWFibGVEZWNsYXJhdGlvblwiKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGVjbGFyYXRvciBvZiBkZWNsLmRlY2xhcmF0aW9ucykge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIGRlY2xhcmF0b3IuaWQudHlwZSA9PT0gXCJJZGVudGlmaWVyXCIgJiZcbiAgICAgICAgICAgIGRlY2xhcmF0b3IuaW5pdD8udHlwZSA9PT0gXCJDYWxsRXhwcmVzc2lvblwiICYmXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmluaXQuY2FsbGVlLnR5cGUgPT09IFwiSWRlbnRpZmllclwiICYmXG4gICAgICAgICAgICBkZWNsYXJhdG9yLmluaXQuY2FsbGVlLnZhbHVlID09PSBhZ2VudExvY2FsTmFtZVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgZXhwb3J0cy5wdXNoKGRlY2xhcmF0b3IuaWQudmFsdWUpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBleHBvcnRzO1xufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7O0FBQUEsWUFBWSxVQUFVO0FBQ3RCLFNBQXNCLGlCQUFpQjtBQVl2QyxJQUFNLGVBQWUsZ0JBQUk7QUFDekIsSUFBTSx5QkFBeUI7QUFDL0IsSUFBTSx1QkFBdUI7QUFNZCxTQUFSLGVBRUwsUUFDUTtBQUNSLFFBQU0sRUFBRSxNQUFNLElBQUksS0FBSyxXQUFXO0FBQ2xDLFFBQU0s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
|
package/dist/next.d.mts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NextConfig } from 'next';
|
|
2
|
+
|
|
3
|
+
type WithAgentConfig = {
|
|
4
|
+
/** Enable debug logging */
|
|
5
|
+
debug?: boolean;
|
|
6
|
+
};
|
|
7
|
+
type WorkflowConfigFn = (phase: string, ctx: {
|
|
8
|
+
defaultConfig: NextConfig;
|
|
9
|
+
}) => Promise<NextConfig>;
|
|
10
|
+
type NextConfigInput = NextConfig | ((phase: string, ctx: {
|
|
11
|
+
defaultConfig: NextConfig;
|
|
12
|
+
}) => Promise<NextConfig>);
|
|
13
|
+
/**
|
|
14
|
+
* Next.js plugin that configures agent support.
|
|
15
|
+
*
|
|
16
|
+
* - Detects agents and generates RPC steps with "use step" in .well-known/agent/v1/
|
|
17
|
+
* - Generates AGENT_SECRET for secure RPC calls
|
|
18
|
+
* - Wraps withWorkflow for workflow support
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // next.config.ts
|
|
23
|
+
* import { withAgent } from "experimental-agent/next";
|
|
24
|
+
*
|
|
25
|
+
* // Option 1: withAgent handles everything (recommended)
|
|
26
|
+
* export default withAgent({});
|
|
27
|
+
*
|
|
28
|
+
* // Option 2: Compose with other plugins
|
|
29
|
+
* export default withAgent(withSomeOtherPlugin({}));
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare function withAgent(configOrFn: NextConfigInput, agentConfig?: WithAgentConfig): WorkflowConfigFn;
|
|
33
|
+
|
|
34
|
+
export { type WithAgentConfig, withAgent };
|
package/dist/next.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { NextConfig } from 'next';
|
|
2
|
+
|
|
3
|
+
type WithAgentConfig = {
|
|
4
|
+
/** Enable debug logging */
|
|
5
|
+
debug?: boolean;
|
|
6
|
+
};
|
|
7
|
+
type WorkflowConfigFn = (phase: string, ctx: {
|
|
8
|
+
defaultConfig: NextConfig;
|
|
9
|
+
}) => Promise<NextConfig>;
|
|
10
|
+
type NextConfigInput = NextConfig | ((phase: string, ctx: {
|
|
11
|
+
defaultConfig: NextConfig;
|
|
12
|
+
}) => Promise<NextConfig>);
|
|
13
|
+
/**
|
|
14
|
+
* Next.js plugin that configures agent support.
|
|
15
|
+
*
|
|
16
|
+
* - Detects agents and generates RPC steps with "use step" in .well-known/agent/v1/
|
|
17
|
+
* - Generates AGENT_SECRET for secure RPC calls
|
|
18
|
+
* - Wraps withWorkflow for workflow support
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```ts
|
|
22
|
+
* // next.config.ts
|
|
23
|
+
* import { withAgent } from "experimental-agent/next";
|
|
24
|
+
*
|
|
25
|
+
* // Option 1: withAgent handles everything (recommended)
|
|
26
|
+
* export default withAgent({});
|
|
27
|
+
*
|
|
28
|
+
* // Option 2: Compose with other plugins
|
|
29
|
+
* export default withAgent(withSomeOtherPlugin({}));
|
|
30
|
+
* ```
|
|
31
|
+
*/
|
|
32
|
+
declare function withAgent(configOrFn: NextConfigInput, agentConfig?: WithAgentConfig): WorkflowConfigFn;
|
|
33
|
+
|
|
34
|
+
export { type WithAgentConfig, withAgent };
|
package/dist/next.js
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
|
|
30
|
+
// src/next/index.ts
|
|
31
|
+
var next_exports = {};
|
|
32
|
+
__export(next_exports, {
|
|
33
|
+
withAgent: () => withAgent
|
|
34
|
+
});
|
|
35
|
+
module.exports = __toCommonJS(next_exports);
|
|
36
|
+
var crypto = __toESM(require("crypto"));
|
|
37
|
+
var fs = __toESM(require("fs"));
|
|
38
|
+
var path = __toESM(require("path"));
|
|
39
|
+
|
|
40
|
+
// package.json
|
|
41
|
+
var package_default = {
|
|
42
|
+
name: "experimental-agent",
|
|
43
|
+
version: "0.0.4",
|
|
44
|
+
main: "./dist/index.js",
|
|
45
|
+
module: "./dist/index.mjs",
|
|
46
|
+
types: "./dist/index.d.ts",
|
|
47
|
+
sideEffects: true,
|
|
48
|
+
license: "MIT",
|
|
49
|
+
files: [
|
|
50
|
+
"dist/**"
|
|
51
|
+
],
|
|
52
|
+
exports: {
|
|
53
|
+
".": {
|
|
54
|
+
types: "./dist/index.d.ts",
|
|
55
|
+
import: "./dist/index.mjs",
|
|
56
|
+
require: "./dist/index.js"
|
|
57
|
+
},
|
|
58
|
+
"./next": {
|
|
59
|
+
types: "./dist/next.d.ts",
|
|
60
|
+
import: "./dist/next.mjs",
|
|
61
|
+
require: "./dist/next.js"
|
|
62
|
+
},
|
|
63
|
+
"./next/loader": {
|
|
64
|
+
types: "./dist/next/loader.d.ts",
|
|
65
|
+
import: "./dist/next/loader.mjs",
|
|
66
|
+
require: "./dist/next/loader.js"
|
|
67
|
+
},
|
|
68
|
+
"./client": {
|
|
69
|
+
types: "./dist/client.d.ts",
|
|
70
|
+
import: "./dist/client.mjs",
|
|
71
|
+
require: "./dist/client.js"
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
scripts: {
|
|
75
|
+
build: "tsup",
|
|
76
|
+
dev: "tsup --watch",
|
|
77
|
+
clean: "rm -rf .turbo && rm -rf node_modules && rm -rf dist",
|
|
78
|
+
release: "pnpm build && npm publish",
|
|
79
|
+
typecheck: "tsc --noEmit",
|
|
80
|
+
test: "vitest run",
|
|
81
|
+
"test:watch": "vitest"
|
|
82
|
+
},
|
|
83
|
+
dependencies: {
|
|
84
|
+
"@hono/node-server": "^1.19.9",
|
|
85
|
+
"@swc/core": "^1.10.0",
|
|
86
|
+
"@vercel/oidc": "^3.1.0",
|
|
87
|
+
"better-all": "^0.0.5",
|
|
88
|
+
errore: "^0.8.2",
|
|
89
|
+
"fast-deep-equal": "^3.1.3",
|
|
90
|
+
glob: "^11.0.0",
|
|
91
|
+
hono: "^4.11.6",
|
|
92
|
+
sandbox: "^1.0.18",
|
|
93
|
+
ulid: "^3.0.2",
|
|
94
|
+
zod: "^4.3.6"
|
|
95
|
+
},
|
|
96
|
+
devDependencies: {
|
|
97
|
+
"@agent/tsconfig": "workspace:*",
|
|
98
|
+
"@types/node": "^20.11.24",
|
|
99
|
+
dotenv: "^17.2.3",
|
|
100
|
+
next: "^16.0.0",
|
|
101
|
+
tsup: "^8.0.2",
|
|
102
|
+
"type-fest": "^5.4.2",
|
|
103
|
+
typescript: "5.5.4",
|
|
104
|
+
vitest: "^3.0.0"
|
|
105
|
+
},
|
|
106
|
+
peerDependencies: {
|
|
107
|
+
ai: "^6.0.0",
|
|
108
|
+
workflow: "https://workflow-docs-7evupb64d.vercel.sh/workflow.tgz"
|
|
109
|
+
},
|
|
110
|
+
publishConfig: {
|
|
111
|
+
access: "public"
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// src/next/index.ts
|
|
116
|
+
var PACKAGE_NAME = package_default.name;
|
|
117
|
+
var AGENT_PROTOCOL_VERSION = "v1";
|
|
118
|
+
var FILE_EXT_REGEX = /\.(ts|tsx|js|jsx)$/;
|
|
119
|
+
var AGENT_EXPORT_REGEX = /export\s+const\s+(\w+)\s*=\s*agent\s*\(/g;
|
|
120
|
+
var DEFAULT_WORKFLOW_DIRS = ["pages", "app", "src/pages", "src/app"];
|
|
121
|
+
function shortHash(str) {
|
|
122
|
+
let hash = 0;
|
|
123
|
+
for (let i = 0; i < str.length; i++) {
|
|
124
|
+
const char = str.charCodeAt(i);
|
|
125
|
+
hash = (hash << 5) - hash + char;
|
|
126
|
+
hash &= hash;
|
|
127
|
+
}
|
|
128
|
+
return Math.abs(hash).toString(36).slice(0, 6);
|
|
129
|
+
}
|
|
130
|
+
function getAppDir(cwd) {
|
|
131
|
+
const srcAppDir = path.join(cwd, "src", "app");
|
|
132
|
+
if (fs.existsSync(srcAppDir)) {
|
|
133
|
+
return "src/app";
|
|
134
|
+
}
|
|
135
|
+
return "app";
|
|
136
|
+
}
|
|
137
|
+
function detectAgents(cwd, debug) {
|
|
138
|
+
const agents = [];
|
|
139
|
+
const dirsToScan = [path.join(cwd, "src"), cwd];
|
|
140
|
+
function scanDir(dir) {
|
|
141
|
+
if (!fs.existsSync(dir)) {
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
const entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
145
|
+
for (const entry of entries) {
|
|
146
|
+
const fullPath = path.join(dir, entry.name);
|
|
147
|
+
if (entry.isDirectory() && !entry.name.startsWith(".") && entry.name !== "node_modules" && entry.name !== "src") {
|
|
148
|
+
scanDir(fullPath);
|
|
149
|
+
} else if (entry.isFile() && FILE_EXT_REGEX.test(entry.name)) {
|
|
150
|
+
try {
|
|
151
|
+
const content = fs.readFileSync(fullPath, "utf-8");
|
|
152
|
+
if (content.includes(PACKAGE_NAME) && content.includes("agent(")) {
|
|
153
|
+
const exportMatches = content.matchAll(AGENT_EXPORT_REGEX);
|
|
154
|
+
for (const match of exportMatches) {
|
|
155
|
+
agents.push({
|
|
156
|
+
exportName: match[1],
|
|
157
|
+
filePath: fullPath,
|
|
158
|
+
uniqueId: ""
|
|
159
|
+
// Will be set after all agents are found
|
|
160
|
+
});
|
|
161
|
+
if (debug) {
|
|
162
|
+
console.log(
|
|
163
|
+
`[withAgent] Found agent: ${match[1]} in ${fullPath}`
|
|
164
|
+
);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
} catch {
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
for (const dir of dirsToScan) {
|
|
174
|
+
scanDir(dir);
|
|
175
|
+
}
|
|
176
|
+
const nameCounts = /* @__PURE__ */ new Map();
|
|
177
|
+
for (const agent of agents) {
|
|
178
|
+
nameCounts.set(
|
|
179
|
+
agent.exportName,
|
|
180
|
+
(nameCounts.get(agent.exportName) || 0) + 1
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
for (const agent of agents) {
|
|
184
|
+
const count = nameCounts.get(agent.exportName) ?? 0;
|
|
185
|
+
if (count > 1) {
|
|
186
|
+
agent.uniqueId = `${agent.exportName}_${shortHash(agent.filePath)}`;
|
|
187
|
+
} else {
|
|
188
|
+
agent.uniqueId = agent.exportName;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return agents;
|
|
192
|
+
}
|
|
193
|
+
function generateAgentFiles(agents, outputDir, _cwd, debug) {
|
|
194
|
+
if (agents.length === 0) {
|
|
195
|
+
if (debug) {
|
|
196
|
+
console.log("[withAgent] No agents found, skipping generation");
|
|
197
|
+
}
|
|
198
|
+
return;
|
|
199
|
+
}
|
|
200
|
+
if (!fs.existsSync(outputDir)) {
|
|
201
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
202
|
+
}
|
|
203
|
+
const rpcFunctions = agents.map((a) => {
|
|
204
|
+
let agentRelPath = path.relative(outputDir, a.filePath).replace(/\\/g, "/");
|
|
205
|
+
if (!agentRelPath.startsWith(".")) {
|
|
206
|
+
agentRelPath = `./${agentRelPath}`;
|
|
207
|
+
}
|
|
208
|
+
return `
|
|
209
|
+
export const ${a.uniqueId}Rpc = async (params) => {
|
|
210
|
+
"use step";
|
|
211
|
+
const { ${a.exportName} } = await import("${agentRelPath}");
|
|
212
|
+
const res = await ${a.exportName}.handler(params);
|
|
213
|
+
if (res instanceof Response) {
|
|
214
|
+
return res.json();
|
|
215
|
+
}
|
|
216
|
+
return res;
|
|
217
|
+
};`;
|
|
218
|
+
}).join("\n");
|
|
219
|
+
const initFunctions = agents.map(
|
|
220
|
+
(a) => `
|
|
221
|
+
export function __init${a.exportName[0].toUpperCase()}${a.exportName.slice(
|
|
222
|
+
1
|
|
223
|
+
)}(agent) {
|
|
224
|
+
agent.rpc = ${a.uniqueId}Rpc;
|
|
225
|
+
}`
|
|
226
|
+
).join("\n");
|
|
227
|
+
const stepsContent = `// Auto-generated by withAgent - do not edit
|
|
228
|
+
${rpcFunctions}
|
|
229
|
+
${initFunctions}
|
|
230
|
+
`;
|
|
231
|
+
const stepsPath = path.join(outputDir, "steps.js");
|
|
232
|
+
fs.writeFileSync(stepsPath, stepsContent);
|
|
233
|
+
const routeContent = `// Auto-generated by withAgent - triggers workflow discovery
|
|
234
|
+
import "./steps.js";
|
|
235
|
+
export function GET() {
|
|
236
|
+
return new Response("ok");
|
|
237
|
+
}
|
|
238
|
+
`;
|
|
239
|
+
const routePath = path.join(outputDir, "route.js");
|
|
240
|
+
fs.writeFileSync(routePath, routeContent);
|
|
241
|
+
const gitignorePath = path.join(outputDir, ".gitignore");
|
|
242
|
+
if (!fs.existsSync(gitignorePath)) {
|
|
243
|
+
fs.writeFileSync(gitignorePath, "*\n");
|
|
244
|
+
}
|
|
245
|
+
if (debug) {
|
|
246
|
+
console.log(`[withAgent] Generated agent files at ${outputDir}`);
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
function withAgent(configOrFn, agentConfig) {
|
|
250
|
+
const debug = agentConfig?.debug ?? false;
|
|
251
|
+
const cwd = process.cwd();
|
|
252
|
+
const appDir = getAppDir(cwd);
|
|
253
|
+
const agentDir = `${appDir}/.well-known/agent/${AGENT_PROTOCOL_VERSION}`;
|
|
254
|
+
const agents = detectAgents(cwd, debug);
|
|
255
|
+
const outputDir = path.join(cwd, agentDir);
|
|
256
|
+
generateAgentFiles(agents, outputDir, cwd, debug);
|
|
257
|
+
const agentFilePaths = agents.map((a) => a.filePath);
|
|
258
|
+
const loaderPath = require.resolve("./next/loader");
|
|
259
|
+
if (debug) {
|
|
260
|
+
console.log("[withAgent] loader path:", loaderPath);
|
|
261
|
+
console.log("[withAgent] agent files:", agentFilePaths);
|
|
262
|
+
console.log("[withAgent] agent dir:", agentDir);
|
|
263
|
+
}
|
|
264
|
+
const agentPathRegex = agentFilePaths.length > 0 ? new RegExp(
|
|
265
|
+
`${agentFilePaths.map(
|
|
266
|
+
(p) => path.relative(cwd, p).replace(/\\/g, "/").replace(/[.*+?^${}()|[\]\\]/g, "\\$&")
|
|
267
|
+
).join("|")}$`
|
|
268
|
+
) : null;
|
|
269
|
+
let withWorkflow;
|
|
270
|
+
try {
|
|
271
|
+
withWorkflow = require("workflow/next").withWorkflow;
|
|
272
|
+
} catch {
|
|
273
|
+
console.warn(
|
|
274
|
+
"[withAgent] workflow/next not found. Make sure workflow is installed."
|
|
275
|
+
);
|
|
276
|
+
return typeof configOrFn === "function" ? configOrFn : async () => configOrFn;
|
|
277
|
+
}
|
|
278
|
+
const baseConfigFn = withWorkflow(configOrFn, {
|
|
279
|
+
workflows: {
|
|
280
|
+
dirs: [...DEFAULT_WORKFLOW_DIRS, agentDir]
|
|
281
|
+
}
|
|
282
|
+
});
|
|
283
|
+
return async (phase, ctx) => {
|
|
284
|
+
const nextConfig = await baseConfigFn(phase, ctx);
|
|
285
|
+
if (!process.env.AGENT_SECRET) {
|
|
286
|
+
nextConfig.env = {
|
|
287
|
+
...nextConfig.env,
|
|
288
|
+
AGENT_SECRET: crypto.randomUUID()
|
|
289
|
+
};
|
|
290
|
+
if (debug) {
|
|
291
|
+
console.log("[withAgent] Generated AGENT_SECRET");
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
if (!agentPathRegex || agentFilePaths.length === 0) {
|
|
295
|
+
return nextConfig;
|
|
296
|
+
}
|
|
297
|
+
const rules = nextConfig.turbopack?.rules || {};
|
|
298
|
+
for (const key of ["*.ts", "*.tsx", "*.js", "*.jsx"]) {
|
|
299
|
+
const existingRule = rules[key];
|
|
300
|
+
if (!existingRule) {
|
|
301
|
+
continue;
|
|
302
|
+
}
|
|
303
|
+
rules[key] = {
|
|
304
|
+
...existingRule,
|
|
305
|
+
loaders: [loaderPath, ...existingRule.loaders || []],
|
|
306
|
+
condition: {
|
|
307
|
+
any: [existingRule.condition, { path: agentPathRegex }]
|
|
308
|
+
}
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
const existingWebpack = nextConfig.webpack;
|
|
312
|
+
nextConfig.webpack = (webpackConfig, context) => {
|
|
313
|
+
webpackConfig.module.rules.push({
|
|
314
|
+
test: (resourcePath) => agentFilePaths.includes(resourcePath),
|
|
315
|
+
use: [{ loader: loaderPath }]
|
|
316
|
+
});
|
|
317
|
+
return existingWebpack?.(webpackConfig, context) ?? webpackConfig;
|
|
318
|
+
};
|
|
319
|
+
if (debug) {
|
|
320
|
+
console.log("[withAgent] Added agent loader to turbopack rules");
|
|
321
|
+
}
|
|
322
|
+
return nextConfig;
|
|
323
|
+
};
|
|
324
|
+
}
|
|
325
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
326
|
+
0 && (module.exports = {
|
|
327
|
+
withAgent
|
|
328
|
+
});
|
|
329
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL25leHQvaW5kZXgudHMiLCAiLi4vcGFja2FnZS5qc29uIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgKiBhcyBjcnlwdG8gZnJvbSBcIm5vZGU6Y3J5cHRvXCI7XG5pbXBvcnQgKiBhcyBmcyBmcm9tIFwibm9kZTpmc1wiO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tIFwibm9kZTpwYXRoXCI7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgfSBmcm9tIFwibmV4dFwiO1xuaW1wb3J0IHBrZyBmcm9tIFwiLi4vLi4vcGFja2FnZS5qc29uXCI7XG5cbmV4cG9ydCB0eXBlIFdpdGhBZ2VudENvbmZpZyA9IHtcbiAgLyoqIEVuYWJsZSBkZWJ1ZyBsb2dnaW5nICovXG4gIGRlYnVnPzogYm9vbGVhbjtcbn07XG5cbmNvbnN0IFBBQ0tBR0VfTkFNRSA9IHBrZy5uYW1lO1xuY29uc3QgQUdFTlRfUFJPVE9DT0xfVkVSU0lPTiA9IFwidjFcIjtcbmNvbnN0IEZJTEVfRVhUX1JFR0VYID0gL1xcLih0c3x0c3h8anN8anN4KSQvO1xuY29uc3QgQUdFTlRfRVhQT1JUX1JFR0VYID0gL2V4cG9ydFxccytjb25zdFxccysoXFx3KylcXHMqPVxccyphZ2VudFxccypcXCgvZztcbmNvbnN0IERFRkFVTFRfV09SS0ZMT1dfRElSUyA9IFtcInBhZ2VzXCIsIFwiYXBwXCIsIFwic3JjL3BhZ2VzXCIsIFwic3JjL2FwcFwiXTtcblxudHlwZSBEZXRlY3RlZEFnZW50ID0ge1xuICBleHBvcnROYW1lOiBzdHJpbmc7XG4gIGZpbGVQYXRoOiBzdHJpbmc7XG4gIC8qKiBVbmlxdWUgaWRlbnRpZmllcjogZXhwb3J0TmFtZSBvciBleHBvcnROYW1lX2hhc2ggaWYgZHVwbGljYXRlcyBleGlzdCAqL1xuICB1bmlxdWVJZDogc3RyaW5nO1xufTtcblxuZnVuY3Rpb24gc2hvcnRIYXNoKHN0cjogc3RyaW5nKTogc3RyaW5nIHtcbiAgbGV0IGhhc2ggPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGNoYXIgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQml0d2lzZU9wZXJhdG9yczogaW50ZW50aW9uYWwgaGFzaCBjb21wdXRhdGlvblxuICAgIGhhc2ggPSAoaGFzaCA8PCA1KSAtIGhhc2ggKyBjaGFyO1xuICAgIC8vIGJpb21lLWlnbm9yZSBsaW50L3N1c3BpY2lvdXMvbm9CaXR3aXNlT3BlcmF0b3JzOiBjb252ZXJ0IHRvIDMyLWJpdCBpbnRlZ2VyXG4gICAgaGFzaCAmPSBoYXNoO1xuICB9XG4gIHJldHVybiBNYXRoLmFicyhoYXNoKS50b1N0cmluZygzNikuc2xpY2UoMCwgNik7XG59XG5cbi8qKlxuICogRGV0ZWN0cyB3aGV0aGVyIHRoZSBwcm9qZWN0IHVzZXMgc3JjL2FwcCBvciBhcHAgZGlyZWN0b3J5IHN0cnVjdHVyZS5cbiAqIFJldHVybnMgdGhlIGFwcCBkaXJlY3RvcnkgcGF0aCByZWxhdGl2ZSB0byBjd2QuXG4gKi9cbmZ1bmN0aW9uIGdldEFwcERpcihjd2Q6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHNyY0FwcERpciA9IHBhdGguam9pbihjd2QsIFwic3JjXCIsIFwiYXBwXCIpO1xuICBpZiAoZnMuZXhpc3RzU3luYyhzcmNBcHBEaXIpKSB7XG4gICAgcmV0dXJuIFwic3JjL2FwcFwiO1xuICB9XG4gIHJldHVybiBcImFwcFwiO1xufVxuXG4vKipcbiAqIFNjYW5zIGZvciBhZ2VudCBleHBvcnRzIGluIHRoZSBwcm9qZWN0LlxuICovXG5mdW5jdGlvbiBkZXRlY3RBZ2VudHMoY3dkOiBzdHJpbmcsIGRlYnVnOiBib29sZWFuKTogRGV0ZWN0ZWRBZ2VudFtdIHtcbiAgY29uc3QgYWdlbnRzOiBEZXRlY3RlZEFnZW50W10gPSBbXTtcblxuICBjb25zdCBkaXJzVG9TY2FuID0gW3BhdGguam9pbihjd2QsIFwic3JjXCIpLCBjd2RdO1xuXG4gIGZ1bmN0aW9uIHNjYW5EaXIoZGlyOiBzdHJpbmcpIHtcbiAgICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGVudHJpZXMgPSBmcy5yZWFkZGlyU3luYyhkaXIsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGZ1bGxQYXRoID0gcGF0aC5qb2luKGRpciwgZW50cnkubmFtZSk7XG4gICAgICBpZiAoXG4gICAgICAgIGVudHJ5LmlzRGlyZWN0b3J5KCkgJiZcbiAgICAgICAgIWVudHJ5Lm5hbWUuc3RhcnRzV2l0aChcIi5cIikgJiZcbiAgICAgICAgZW50cnkubmFtZSAhPT0gXCJub2RlX21vZHVsZXNcIiAmJlxuICAgICAgICBlbnRyeS5uYW1lICE9PSBcInNyY1wiXG4gICAgICApIHtcbiAgICAgICAgc2NhbkRpcihmdWxsUGF0aCk7XG4gICAgICB9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpICYmIEZJTEVfRVhUX1JFR0VYLnRlc3QoZW50cnkubmFtZSkpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZ1bGxQYXRoLCBcInV0Zi04XCIpO1xuICAgICAgICAgIGlmIChjb250ZW50LmluY2x1ZGVzKFBBQ0tBR0VfTkFNRSkgJiYgY29udGVudC5pbmNsdWRlcyhcImFnZW50KFwiKSkge1xuICAgICAgICAgICAgY29uc3QgZXhwb3J0TWF0Y2hlcyA9IGNvbnRlbnQubWF0Y2hBbGwoQUdFTlRfRVhQT1JUX1JFR0VYKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZXhwb3J0TWF0Y2hlcykge1xuICAgICAgICAgICAgICBhZ2VudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgZXhwb3J0TmFtZTogbWF0Y2hbMV0sXG4gICAgICAgICAgICAgICAgZmlsZVBhdGg6IGZ1bGxQYXRoLFxuICAgICAgICAgICAgICAgIHVuaXF1ZUlkOiBcIlwiLCAvLyBXaWxsIGJlIHNldCBhZnRlciBhbGwgYWdlbnRzIGFyZSBmb3VuZFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgaWYgKGRlYnVnKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgICAgICAgICBgW3dpdGhBZ2VudF0gRm91bmQgYWdlbnQ6ICR7bWF0Y2hbMV19IGluICR7ZnVsbFBhdGh9YFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIElnbm9yZSByZWFkIGVycm9yc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChjb25zdCBkaXIgb2YgZGlyc1RvU2Nhbikge1xuICAgIHNjYW5EaXIoZGlyKTtcbiAgfVxuXG4gIC8vIEFzc2lnbiB1bmlxdWUgSURzIC0gYWRkIGhhc2ggc3VmZml4IGlmIGR1cGxpY2F0ZSBleHBvcnQgbmFtZXMgZXhpc3RcbiAgY29uc3QgbmFtZUNvdW50cyA9IG5ldyBNYXA8c3RyaW5nLCBudW1iZXI+KCk7XG4gIGZvciAoY29uc3QgYWdlbnQgb2YgYWdlbnRzKSB7XG4gICAgbmFtZUNvdW50cy5zZXQoXG4gICAgICBhZ2VudC5leHBvcnROYW1lLFxuICAgICAgKG5hbWVDb3VudHMuZ2V0KGFnZW50LmV4cG9ydE5hbWUpIHx8IDApICsgMVxuICAgICk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGFnZW50IG9mIGFnZW50cykge1xuICAgIGNvbnN0IGNvdW50ID0gbmFtZUNvdW50cy5nZXQoYWdlbnQuZXhwb3J0TmFtZSkgPz8gMDtcbiAgICBpZiAoY291bnQgPiAxKSB7XG4gICAgICBhZ2VudC51bmlxdWVJZCA9IGAke2FnZW50LmV4cG9ydE5hbWV9XyR7c2hvcnRIYXNoKGFnZW50LmZpbGVQYXRoKX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICBhZ2VudC51bmlxdWVJZCA9IGFnZW50LmV4cG9ydE5hbWU7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFnZW50cztcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgYWxsIGFnZW50IGZpbGVzIGluIC53ZWxsLWtub3duL2FnZW50L3YxLzpcbiAqIC0gc3RlcHMuanM6IFJQQyBzdGVwIGZ1bmN0aW9ucyB3aXRoIFwidXNlIHN0ZXBcIlxuICogLSByb3V0ZS5qczogdHJpZ2dlcnMgd29ya2Zsb3cgZGlzY292ZXJ5XG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQWdlbnRGaWxlcyhcbiAgYWdlbnRzOiBEZXRlY3RlZEFnZW50W10sXG4gIG91dHB1dERpcjogc3RyaW5nLFxuICBfY3dkOiBzdHJpbmcsXG4gIGRlYnVnOiBib29sZWFuXG4pOiB2b2lkIHtcbiAgaWYgKGFnZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gTm8gYWdlbnRzIGZvdW5kLCBza2lwcGluZyBnZW5lcmF0aW9uXCIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWZzLmV4aXN0c1N5bmMob3V0cHV0RGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhvdXRwdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyYXRlIHN0ZXAgZnVuY3Rpb25zIHRoYXQgdXNlIGR5bmFtaWMgaW1wb3J0LlxuICAgKiBEeW5hbWljIGltcG9ydCBlbnN1cmVzIHRoZSBhZ2VudCBtb2R1bGUgbG9hZHMgKGluY2x1ZGluZyBsb2FkZXItaW5qZWN0ZWQgaW5pdClcbiAgICogd2hlbiB0aGUgc3RlcCBydW5zIGluIHdvcmtmbG93IGNvbnRleHQsIGF2b2lkaW5nIHRoZSBcIm5vdCBpbml0aWFsaXplZFwiIGVycm9yLlxuICAgKlxuICAgKiBVc2VzIHVuaXF1ZUlkIGZvciBmdW5jdGlvbiBuYW1lcyB0byBoYW5kbGUgZHVwbGljYXRlIGV4cG9ydCBuYW1lcyBhY3Jvc3MgZmlsZXMuXG4gICAqL1xuICBjb25zdCBycGNGdW5jdGlvbnMgPSBhZ2VudHNcbiAgICAubWFwKChhKSA9PiB7XG4gICAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgcGF0aCBmcm9tIHN0ZXBzLmpzIHRvIHRoZSBhZ2VudCBmaWxlXG4gICAgICBsZXQgYWdlbnRSZWxQYXRoID0gcGF0aFxuICAgICAgICAucmVsYXRpdmUob3V0cHV0RGlyLCBhLmZpbGVQYXRoKVxuICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIik7XG5cbiAgICAgIGlmICghYWdlbnRSZWxQYXRoLnN0YXJ0c1dpdGgoXCIuXCIpKSB7XG4gICAgICAgIGFnZW50UmVsUGF0aCA9IGAuLyR7YWdlbnRSZWxQYXRofWA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBgXG5leHBvcnQgY29uc3QgJHthLnVuaXF1ZUlkfVJwYyA9IGFzeW5jIChwYXJhbXMpID0+IHtcbiAgXCJ1c2Ugc3RlcFwiO1xuICBjb25zdCB7ICR7YS5leHBvcnROYW1lfSB9ID0gYXdhaXQgaW1wb3J0KFwiJHthZ2VudFJlbFBhdGh9XCIpO1xuICBjb25zdCByZXMgPSBhd2FpdCAke2EuZXhwb3J0TmFtZX0uaGFuZGxlcihwYXJhbXMpO1xuICBpZiAocmVzIGluc3RhbmNlb2YgUmVzcG9uc2UpIHtcbiAgICByZXR1cm4gcmVzLmpzb24oKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufTtgO1xuICAgIH0pXG4gICAgLmpvaW4oXCJcXG5cIik7XG5cbiAgLyoqXG4gICAqIEluaXQgZnVuY3Rpb25zIHdpcmUgdXAgYWdlbnQucnBjIGluIHRoZSBtYWluIGFwcCBjb250ZXh0LlxuICAgKiBVc2VzIGV4cG9ydE5hbWUgZm9yIHRoZSBmdW5jdGlvbiBuYW1lIChsb2FkZXIgbWF0Y2hlcyBieSBleHBvcnQgbmFtZSksXG4gICAqIGJ1dCByZWZlcmVuY2VzIHVuaXF1ZUlkIGZvciB0aGUgUnBjIGZ1bmN0aW9uLlxuICAgKi9cbiAgY29uc3QgaW5pdEZ1bmN0aW9ucyA9IGFnZW50c1xuICAgIC5tYXAoXG4gICAgICAoYSkgPT4gYFxuZXhwb3J0IGZ1bmN0aW9uIF9faW5pdCR7YS5leHBvcnROYW1lWzBdLnRvVXBwZXJDYXNlKCl9JHthLmV4cG9ydE5hbWUuc2xpY2UoXG4gICAgICAgIDFcbiAgICAgICl9KGFnZW50KSB7XG4gIGFnZW50LnJwYyA9ICR7YS51bmlxdWVJZH1ScGM7XG59YFxuICAgIClcbiAgICAuam9pbihcIlxcblwiKTtcblxuICBjb25zdCBzdGVwc0NvbnRlbnQgPSBgLy8gQXV0by1nZW5lcmF0ZWQgYnkgd2l0aEFnZW50IC0gZG8gbm90IGVkaXRcbiR7cnBjRnVuY3Rpb25zfVxuJHtpbml0RnVuY3Rpb25zfVxuYDtcblxuICBjb25zdCBzdGVwc1BhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBcInN0ZXBzLmpzXCIpO1xuICBmcy53cml0ZUZpbGVTeW5jKHN0ZXBzUGF0aCwgc3RlcHNDb250ZW50KTtcblxuICAvKipcbiAgICogR2VuZXJhdGUgcm91dGUuanMgdGhhdCBpbXBvcnRzIHN0ZXBzLmpzLlxuICAgKiBUaGlzIGVuc3VyZXMgd29ya2Zsb3cgZGlzY292ZXJzIHRoZSBcInVzZSBzdGVwXCIgZnVuY3Rpb25zLlxuICAgKiBObyBhY3R1YWwgaGFuZGxlciBuZWVkZWQgLSBzdG9yYWdlIFJQQyB1c2VzIHRoZSBzdGVwIGZ1bmN0aW9uIGRpcmVjdGx5LlxuICAgKi9cbiAgY29uc3Qgcm91dGVDb250ZW50ID0gYC8vIEF1dG8tZ2VuZXJhdGVkIGJ5IHdpdGhBZ2VudCAtIHRyaWdnZXJzIHdvcmtmbG93IGRpc2NvdmVyeVxuaW1wb3J0IFwiLi9zdGVwcy5qc1wiO1xuZXhwb3J0IGZ1bmN0aW9uIEdFVCgpIHtcbiAgcmV0dXJuIG5ldyBSZXNwb25zZShcIm9rXCIpO1xufVxuYDtcblxuICBjb25zdCByb3V0ZVBhdGggPSBwYXRoLmpvaW4ob3V0cHV0RGlyLCBcInJvdXRlLmpzXCIpO1xuICBmcy53cml0ZUZpbGVTeW5jKHJvdXRlUGF0aCwgcm91dGVDb250ZW50KTtcblxuICAvLyBBZGQgLmdpdGlnbm9yZVxuICBjb25zdCBnaXRpZ25vcmVQYXRoID0gcGF0aC5qb2luKG91dHB1dERpciwgXCIuZ2l0aWdub3JlXCIpO1xuICBpZiAoIWZzLmV4aXN0c1N5bmMoZ2l0aWdub3JlUGF0aCkpIHtcbiAgICBmcy53cml0ZUZpbGVTeW5jKGdpdGlnbm9yZVBhdGgsIFwiKlxcblwiKTtcbiAgfVxuXG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKGBbd2l0aEFnZW50XSBHZW5lcmF0ZWQgYWdlbnQgZmlsZXMgYXQgJHtvdXRwdXREaXJ9YCk7XG4gIH1cbn1cblxudHlwZSBUdXJib3BhY2tSdWxlID0ge1xuICBsb2FkZXJzPzogc3RyaW5nW107XG4gIGNvbmRpdGlvbj86IHtcbiAgICBhbGw/OiB1bmtub3duW107XG4gICAgYW55PzogdW5rbm93bltdO1xuICAgIHBhdGg/OiBSZWdFeHA7XG4gICAgY29udGVudD86IFJlZ0V4cDtcbiAgICBub3Q/OiB1bmtub3duO1xuICB9O1xufTtcblxudHlwZSBXb3JrZmxvd0NvbmZpZ0ZuID0gKFxuICBwaGFzZTogc3RyaW5nLFxuICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4pID0+IFByb21pc2U8TmV4dENvbmZpZz47XG5cbnR5cGUgTmV4dENvbmZpZ0lucHV0ID1cbiAgfCBOZXh0Q29uZmlnXG4gIHwgKChcbiAgICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4gICAgKSA9PiBQcm9taXNlPE5leHRDb25maWc+KTtcblxuLyoqXG4gKiBOZXh0LmpzIHBsdWdpbiB0aGF0IGNvbmZpZ3VyZXMgYWdlbnQgc3VwcG9ydC5cbiAqXG4gKiAtIERldGVjdHMgYWdlbnRzIGFuZCBnZW5lcmF0ZXMgUlBDIHN0ZXBzIHdpdGggXCJ1c2Ugc3RlcFwiIGluIC53ZWxsLWtub3duL2FnZW50L3YxL1xuICogLSBHZW5lcmF0ZXMgQUdFTlRfU0VDUkVUIGZvciBzZWN1cmUgUlBDIGNhbGxzXG4gKiAtIFdyYXBzIHdpdGhXb3JrZmxvdyBmb3Igd29ya2Zsb3cgc3VwcG9ydFxuICpcbiAqIEBleGFtcGxlXG4gKiBgYGB0c1xuICogLy8gbmV4dC5jb25maWcudHNcbiAqIGltcG9ydCB7IHdpdGhBZ2VudCB9IGZyb20gXCJleHBlcmltZW50YWwtYWdlbnQvbmV4dFwiO1xuICpcbiAqIC8vIE9wdGlvbiAxOiB3aXRoQWdlbnQgaGFuZGxlcyBldmVyeXRoaW5nIChyZWNvbW1lbmRlZClcbiAqIGV4cG9ydCBkZWZhdWx0IHdpdGhBZ2VudCh7fSk7XG4gKlxuICogLy8gT3B0aW9uIDI6IENvbXBvc2Ugd2l0aCBvdGhlciBwbHVnaW5zXG4gKiBleHBvcnQgZGVmYXVsdCB3aXRoQWdlbnQod2l0aFNvbWVPdGhlclBsdWdpbih7fSkpO1xuICogYGBgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoQWdlbnQoXG4gIGNvbmZpZ09yRm46IE5leHRDb25maWdJbnB1dCxcbiAgYWdlbnRDb25maWc/OiBXaXRoQWdlbnRDb25maWdcbik6IFdvcmtmbG93Q29uZmlnRm4ge1xuICBjb25zdCBkZWJ1ZyA9IGFnZW50Q29uZmlnPy5kZWJ1ZyA/PyBmYWxzZTtcbiAgY29uc3QgY3dkID0gcHJvY2Vzcy5jd2QoKTtcblxuICAvLyBEZXRlY3QgYXBwIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgKHNyYy9hcHAgdnMgYXBwKVxuICBjb25zdCBhcHBEaXIgPSBnZXRBcHBEaXIoY3dkKTtcbiAgY29uc3QgYWdlbnREaXIgPSBgJHthcHBEaXJ9Ly53ZWxsLWtub3duL2FnZW50LyR7QUdFTlRfUFJPVE9DT0xfVkVSU0lPTn1gO1xuXG4gIC8vIERldGVjdCBhZ2VudHMgYW5kIGdlbmVyYXRlIGZpbGVzIEZJUlNUIChiZWZvcmUgd29ya2Zsb3cgZGlzY292ZXJzIHRoZW0pXG4gIGNvbnN0IGFnZW50cyA9IGRldGVjdEFnZW50cyhjd2QsIGRlYnVnKTtcbiAgY29uc3Qgb3V0cHV0RGlyID0gcGF0aC5qb2luKGN3ZCwgYWdlbnREaXIpO1xuICBnZW5lcmF0ZUFnZW50RmlsZXMoYWdlbnRzLCBvdXRwdXREaXIsIGN3ZCwgZGVidWcpO1xuXG4gIGNvbnN0IGFnZW50RmlsZVBhdGhzID0gYWdlbnRzLm1hcCgoYSkgPT4gYS5maWxlUGF0aCk7XG4gIGNvbnN0IGxvYWRlclBhdGggPSByZXF1aXJlLnJlc29sdmUoXCIuL25leHQvbG9hZGVyXCIpO1xuXG4gIGlmIChkZWJ1Zykge1xuICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gbG9hZGVyIHBhdGg6XCIsIGxvYWRlclBhdGgpO1xuICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gYWdlbnQgZmlsZXM6XCIsIGFnZW50RmlsZVBhdGhzKTtcbiAgICBjb25zb2xlLmxvZyhcIlt3aXRoQWdlbnRdIGFnZW50IGRpcjpcIiwgYWdlbnREaXIpO1xuICB9XG5cbiAgLy8gQnVpbGQgcmVnZXggdG8gbWF0Y2ggYWdlbnQgZmlsZSBwYXRoc1xuICBjb25zdCBhZ2VudFBhdGhSZWdleCA9XG4gICAgYWdlbnRGaWxlUGF0aHMubGVuZ3RoID4gMFxuICAgICAgPyBuZXcgUmVnRXhwKFxuICAgICAgICAgIGAke2FnZW50RmlsZVBhdGhzXG4gICAgICAgICAgICAubWFwKChwKSA9PlxuICAgICAgICAgICAgICBwYXRoXG4gICAgICAgICAgICAgICAgLnJlbGF0aXZlKGN3ZCwgcClcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXC9nLCBcIi9cIilcbiAgICAgICAgICAgICAgICAucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xcXVxcXFxdL2csIFwiXFxcXCQmXCIpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbihcInxcIil9JGBcbiAgICAgICAgKVxuICAgICAgOiBudWxsO1xuXG4gIC8qKlxuICAgKiBBbHdheXMgcGFzcyB0aHJvdWdoIHdpdGhXb3JrZmxvdyAtIGl0IGhhbmRsZXMgYm90aCBOZXh0Q29uZmlnIGFuZCBhc3luYyBmdW5jdGlvbnMuXG4gICAqIFRoaXMgZW5zdXJlcyB3b3JrZmxvdyBpcyBhbHdheXMgY29uZmlndXJlZCwgcmVnYXJkbGVzcyBvZiB3aGF0IHRoZSB1c2VyIHBhc3NlZC5cbiAgICovXG4gIGxldCB3aXRoV29ya2Zsb3c6IChcbiAgICBjb25maWc6IE5leHRDb25maWdJbnB1dCxcbiAgICBvcHRpb25zPzogeyB3b3JrZmxvd3M/OiB7IGRpcnM/OiBzdHJpbmdbXSB9IH1cbiAgKSA9PiBXb3JrZmxvd0NvbmZpZ0ZuO1xuICB0cnkge1xuICAgIHdpdGhXb3JrZmxvdyA9IHJlcXVpcmUoXCJ3b3JrZmxvdy9uZXh0XCIpLndpdGhXb3JrZmxvdztcbiAgfSBjYXRjaCB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbd2l0aEFnZW50XSB3b3JrZmxvdy9uZXh0IG5vdCBmb3VuZC4gTWFrZSBzdXJlIHdvcmtmbG93IGlzIGluc3RhbGxlZC5cIlxuICAgICk7XG4gICAgcmV0dXJuIHR5cGVvZiBjb25maWdPckZuID09PSBcImZ1bmN0aW9uXCJcbiAgICAgID8gY29uZmlnT3JGblxuICAgICAgOiBhc3luYyAoKSA9PiBjb25maWdPckZuO1xuICB9XG5cbiAgY29uc3QgYmFzZUNvbmZpZ0ZuID0gd2l0aFdvcmtmbG93KGNvbmZpZ09yRm4sIHtcbiAgICB3b3JrZmxvd3M6IHtcbiAgICAgIGRpcnM6IFsuLi5ERUZBVUxUX1dPUktGTE9XX0RJUlMsIGFnZW50RGlyXSxcbiAgICB9LFxuICB9KTtcblxuICAvKipcbiAgICogUmV0dXJuIGEgd3JhcHBlciB0aGF0IHJ1bnMgQUZURVIgd29ya2Zsb3cgcHJvY2Vzc2VzLCB0aGVuIGFkZHMgb3VyIGxvYWRlci5cbiAgICogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3b3JrZmxvdyBvdmVyd3JpdGVzIHR1cmJvcGFjayBydWxlcyAtIHdlIG5lZWQgdG9cbiAgICogbW9kaWZ5IHRoZW0gYWZ0ZXIgd29ya2Zsb3cgaXMgZG9uZS5cbiAgICovXG4gIHJldHVybiBhc3luYyAocGhhc2UsIGN0eCkgPT4ge1xuICAgIGNvbnN0IG5leHRDb25maWcgPSBhd2FpdCBiYXNlQ29uZmlnRm4ocGhhc2UsIGN0eCk7XG5cbiAgICAvLyBTZXQgdXAgQUdFTlRfU0VDUkVUIGlmIG5vdCBhbHJlYWR5IHNldFxuICAgIGlmICghcHJvY2Vzcy5lbnYuQUdFTlRfU0VDUkVUKSB7XG4gICAgICBuZXh0Q29uZmlnLmVudiA9IHtcbiAgICAgICAgLi4ubmV4dENvbmZpZy5lbnYsXG4gICAgICAgIEFHRU5UX1NFQ1JFVDogY3J5cHRvLnJhbmRvbVVVSUQoKSxcbiAgICAgIH07XG4gICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgY29uc29sZS5sb2coXCJbd2l0aEFnZW50XSBHZW5lcmF0ZWQgQUdFTlRfU0VDUkVUXCIpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYWdlbnRQYXRoUmVnZXggfHwgYWdlbnRGaWxlUGF0aHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgICB9XG5cbiAgICAvLyBNb2RpZnkgdHVyYm9wYWNrIHJ1bGVzIHRvIGluY2x1ZGUgb3VyIGxvYWRlciBmb3IgYWdlbnQgZmlsZXNcbiAgICBjb25zdCBydWxlcyA9IChuZXh0Q29uZmlnLnR1cmJvcGFjaz8ucnVsZXMgfHwge30pIGFzIFJlY29yZDxcbiAgICAgIHN0cmluZyxcbiAgICAgIFR1cmJvcGFja1J1bGVcbiAgICA+O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1wiKi50c1wiLCBcIioudHN4XCIsIFwiKi5qc1wiLCBcIiouanN4XCJdKSB7XG4gICAgICBjb25zdCBleGlzdGluZ1J1bGUgPSBydWxlc1trZXldO1xuICAgICAgaWYgKCFleGlzdGluZ1J1bGUpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIC8qKlxuICAgICAgICogV29ya2Zsb3cncyBydWxlIGhhczogY29uZGl0aW9uLmFsbCA9IFt7IG5vdDogcGF0aCB9LCB7IGNvbnRlbnQ6IC91c2Ugc3RlcHwuLi4vIH1dXG4gICAgICAgKiBXZSB3YW50OiBydW4gbG9hZGVyIGlmIHdvcmtmbG93J3MgY29uZGl0aW9ucyBtYXRjaCBPUiBpdCdzIGFuIGFnZW50IGZpbGUuXG4gICAgICAgKiBTbyB3ZSB3cmFwIGluOiBjb25kaXRpb24uYW55ID0gW2V4aXN0aW5nQ29uZGl0aW9uLCB7IHBhdGg6IGFnZW50UGF0aFJlZ2V4IH1dXG4gICAgICAgKi9cbiAgICAgIHJ1bGVzW2tleV0gPSB7XG4gICAgICAgIC4uLmV4aXN0aW5nUnVsZSxcbiAgICAgICAgbG9hZGVyczogW2xvYWRlclBhdGgsIC4uLihleGlzdGluZ1J1bGUubG9hZGVycyB8fCBbXSldLFxuICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICBhbnk6IFtleGlzdGluZ1J1bGUuY29uZGl0aW9uLCB7IHBhdGg6IGFnZW50UGF0aFJlZ2V4IH1dLFxuICAgICAgICB9LFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBBbHNvIGNvbmZpZ3VyZSB3ZWJwYWNrIGZvciBub24tdHVyYm9wYWNrIGJ1aWxkc1xuICAgIGNvbnN0IGV4aXN0aW5nV2VicGFjayA9IG5leHRDb25maWcud2VicGFjaztcbiAgICBuZXh0Q29uZmlnLndlYnBhY2sgPSAod2VicGFja0NvbmZpZywgY29udGV4dCkgPT4ge1xuICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICAgIHRlc3Q6IChyZXNvdXJjZVBhdGg6IHN0cmluZykgPT4gYWdlbnRGaWxlUGF0aHMuaW5jbHVkZXMocmVzb3VyY2VQYXRoKSxcbiAgICAgICAgdXNlOiBbeyBsb2FkZXI6IGxvYWRlclBhdGggfV0sXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBleGlzdGluZ1dlYnBhY2s/Lih3ZWJwYWNrQ29uZmlnLCBjb250ZXh0KSA/PyB3ZWJwYWNrQ29uZmlnO1xuICAgIH07XG5cbiAgICBpZiAoZGVidWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiW3dpdGhBZ2VudF0gQWRkZWQgYWdlbnQgbG9hZGVyIHRvIHR1cmJvcGFjayBydWxlc1wiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiIsICJ7XG4gIFwibmFtZVwiOiBcImV4cGVyaW1lbnRhbC1hZ2VudFwiLFxuICBcInZlcnNpb25cIjogXCIwLjAuNFwiLFxuICBcIm1haW5cIjogXCIuL2Rpc3QvaW5kZXguanNcIixcbiAgXCJtb2R1bGVcIjogXCIuL2Rpc3QvaW5kZXgubWpzXCIsXG4gIFwidHlwZXNcIjogXCIuL2Rpc3QvaW5kZXguZC50c1wiLFxuICBcInNpZGVFZmZlY3RzXCI6IHRydWUsXG4gIFwibGljZW5zZVwiOiBcIk1JVFwiLFxuICBcImZpbGVzXCI6IFtcbiAgICBcImRpc3QvKipcIlxuICBdLFxuICBcImV4cG9ydHNcIjoge1xuICAgIFwiLlwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2luZGV4LmQudHNcIixcbiAgICAgIFwiaW1wb3J0XCI6IFwiLi9kaXN0L2luZGV4Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L2luZGV4LmpzXCJcbiAgICB9LFxuICAgIFwiLi9uZXh0XCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9uZXh0Lm1qc1wiLFxuICAgICAgXCJyZXF1aXJlXCI6IFwiLi9kaXN0L25leHQuanNcIlxuICAgIH0sXG4gICAgXCIuL25leHQvbG9hZGVyXCI6IHtcbiAgICAgIFwidHlwZXNcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuZC50c1wiLFxuICAgICAgXCJpbXBvcnRcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvbmV4dC9sb2FkZXIuanNcIlxuICAgIH0sXG4gICAgXCIuL2NsaWVudFwiOiB7XG4gICAgICBcInR5cGVzXCI6IFwiLi9kaXN0L2NsaWVudC5kLnRzXCIsXG4gICAgICBcImltcG9ydFwiOiBcIi4vZGlzdC9jbGllbnQubWpzXCIsXG4gICAgICBcInJlcXVpcmVcIjogXCIuL2Rpc3QvY2xpZW50LmpzXCJcbiAgICB9XG4gIH0sXG4gIFwic2NyaXB0c1wiOiB7XG4gICAgXCJidWlsZFwiOiBcInRzdXBcIixcbiAgICBcImRldlwiOiBcInRzdXAgLS13YXRjaFwiLFxuICAgIFwiY2xlYW5cIjogXCJybSAtcmYgLnR1cmJvICYmIHJtIC1yZiBub2RlX21vZHVsZXMgJiYgcm0gLXJmIGRpc3RcIixcbiAgICBcInJlbGVhc2VcIjogXCJwbnBtIGJ1aWxkICYmIG5wbSBwdWJsaXNoXCIsXG4gICAgXCJ0eXBlY2hlY2tcIjogXCJ0c2MgLS1ub0VtaXRcIixcbiAgICBcInRlc3RcIjogXCJ2aXRlc3QgcnVuXCIsXG4gICAgXCJ0ZXN0OndhdGNoXCI6IFwidml0ZXN0XCJcbiAgfSxcbiAgXCJkZXBlbmRlbmNpZXNcIjoge1xuICAgIFwiQGhvbm8vbm9kZS1zZXJ2ZXJcIjogXCJeMS4xOS45XCIsXG4gICAgXCJAc3djL2NvcmVcIjogXCJeMS4xMC4wXCIsXG4gICAgXCJAdmVyY2VsL29pZGNcIjogXCJeMy4xLjBcIixcbiAgICBcImJldHRlci1hbGxcIjogXCJeMC4wLjVcIixcbiAgICBcImVycm9yZVwiOiBcIl4wLjguMlwiLFxuICAgIFwiZmFzdC1kZWVwLWVxdWFsXCI6IFwiXjMuMS4zXCIsXG4gICAgXCJnbG9iXCI6IFwiXjExLjAuMFwiLFxuICAgIFwiaG9ub1wiOiBcIl40LjExLjZcIixcbiAgICBcInNhbmRib3hcIjogXCJeMS4wLjE4XCIsXG4gICAgXCJ1bGlkXCI6IFwiXjMuMC4yXCIsXG4gICAgXCJ6b2RcIjogXCJeNC4zLjZcIlxuICB9LFxuICBcImRldkRlcGVuZGVuY2llc1wiOiB7XG4gICAgXCJAYWdlbnQvdHNjb25maWdcIjogXCJ3b3Jrc3BhY2U6KlwiLFxuICAgIFwiQHR5cGVzL25vZGVcIjogXCJeMjAuMTEuMjRcIixcbiAgICBcImRvdGVudlwiOiBcIl4xNy4yLjNcIixcbiAgICBcIm5leHRcIjogXCJeMTYuMC4wXCIsXG4gICAgXCJ0c3VwXCI6IFwiXjguMC4yXCIsXG4gICAgXCJ0eXBlLWZlc3RcIjogXCJeNS40LjJcIixcbiAgICBcInR5cGVzY3JpcHRcIjogXCI1LjUuNFwiLFxuICAgIFwidml0ZXN0XCI6IFwiXjMuMC4wXCJcbiAgfSxcbiAgXCJwZWVyRGVwZW5kZW5jaWVzXCI6IHtcbiAgICBcImFpXCI6IFwiXjYuMC4wXCIsXG4gICAgXCJ3b3JrZmxvd1wiOiBcImh0dHBzOi8vd29ya2Zsb3ctZG9jcy03ZXZ1cGI2NGQudmVyY2VsLnNoL3dvcmtmbG93LnRnelwiXG4gIH0sXG4gIFwicHVibGlzaENvbmZpZ1wiOiB7XG4gICAgXCJhY2Nlc3NcIjogXCJwdWJsaWNcIlxuICB9XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsYUFBd0I7QUFDeEIsU0FBb0I7QUFDcEIsV0FBc0I7OztBQ0Z0QjtBQUFBLEVBQ0UsTUFBUTtBQUFBLEVBQ1IsU0FBVztBQUFBLEVBQ1gsTUFBUTtBQUFBLEVBQ1IsUUFBVTtBQUFBLEVBQ1YsT0FBUztBQUFBLEVBQ1QsYUFBZTtBQUFBLEVBQ2YsU0FBVztBQUFBLEVBQ1gsT0FBUztBQUFBLElBQ1A7QUFBQSxFQUNGO0FBQUEsRUFDQSxTQUFXO0FBQUEsSUFDVCxLQUFLO0FBQUEsTUFDSCxPQUFTO0FBQUEsTUFDVCxRQUFVO0FBQUEsTUFDVixTQUFXO0FBQUEsSUFDYjtBQUFBLElBQ0EsVUFBVTtBQUFBLE1BQ1IsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNBLGlCQUFpQjtBQUFBLE1BQ2YsT0FBUztBQUFBLE1BQ1QsUUFBVTtBQUFBLE1BQ1YsU0FBVztBQUFBLElBQ2I7QUFBQSxJQUNB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
|