@workflow/next 5.0.0-beta.36 → 5.0.0-beta.37
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/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +23 -25
- package/dist/index.js +3 -3
- package/dist/watch-ignore.d.ts +51 -0
- package/dist/watch-ignore.d.ts.map +1 -0
- package/dist/watch-ignore.js +264 -0
- package/docs/next.mdx +1 -1
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"AAoCA,wBAAsB,mBAAmB,CACvC,cAAc,CAAC,EAAE,cAAc,oBAAoB,CAAC,gBAkuBrD"}
|
package/dist/builder-eager.js
CHANGED
|
@@ -8,6 +8,7 @@ const node_fs_1 = require("node:fs");
|
|
|
8
8
|
const promises_1 = require("node:fs/promises");
|
|
9
9
|
const node_path_1 = require("node:path");
|
|
10
10
|
const chokidar_1 = __importDefault(require("chokidar"));
|
|
11
|
+
const watch_ignore_js_1 = require("./watch-ignore.js");
|
|
11
12
|
const watch_rebuild_js_1 = require("./watch-rebuild.js");
|
|
12
13
|
let CachedNextBuilderEager;
|
|
13
14
|
const importEsm = new Function('specifier', 'return import(specifier)');
|
|
@@ -26,6 +27,13 @@ async function getNextBuilderEager(buildersModule) {
|
|
|
26
27
|
const workflowGeneratedDir = (0, node_path_1.join)(outputDir, '.well-known/workflow/v1');
|
|
27
28
|
// Ensure output directories exist
|
|
28
29
|
await (0, promises_1.mkdir)(workflowGeneratedDir, { recursive: true });
|
|
30
|
+
if (!this.config.watch) {
|
|
31
|
+
// Production build caches may still contain the retired step route.
|
|
32
|
+
await (0, promises_1.rm)((0, node_path_1.join)(workflowGeneratedDir, 'step'), {
|
|
33
|
+
recursive: true,
|
|
34
|
+
force: true,
|
|
35
|
+
});
|
|
36
|
+
}
|
|
29
37
|
await (0, promises_1.writeFile)((0, node_path_1.join)(workflowGeneratedDir, '.gitignore'), '*');
|
|
30
38
|
const inputFiles = await this.getInputFiles();
|
|
31
39
|
const tsconfigPath = await this.findTsConfigPath();
|
|
@@ -94,36 +102,26 @@ async function getNextBuilderEager(buildersModule) {
|
|
|
94
102
|
'.cjs',
|
|
95
103
|
'.mjs',
|
|
96
104
|
]);
|
|
97
|
-
const ignoredPathFragments = [
|
|
98
|
-
'/.git/',
|
|
99
|
-
'/node_modules/',
|
|
100
|
-
'/.next/',
|
|
101
|
-
'/.turbo/',
|
|
102
|
-
'/.vercel/',
|
|
103
|
-
'/dist/',
|
|
104
|
-
'/build/',
|
|
105
|
-
'/out/',
|
|
106
|
-
'/.cache/',
|
|
107
|
-
'/.yarn/',
|
|
108
|
-
'/.pnpm-store/',
|
|
109
|
-
'/.parcel-cache/',
|
|
110
|
-
'/.well-known/workflow/',
|
|
111
|
-
];
|
|
112
105
|
const normalizedGeneratedDir = workflowGeneratedDir.replace(/\\/g, '/');
|
|
113
106
|
const normalizedDistDir = normalizePath(this.config.distDir);
|
|
114
|
-
|
|
107
|
+
// Prune the dev watch set to keep chokidar from registering an
|
|
108
|
+
// fs.watch per directory across the whole project tree (chokidar 4
|
|
109
|
+
// dropped fsevents, so on macOS that exhausts the fd limit -> EMFILE
|
|
110
|
+
// on large monorepos). This honors `.gitignore` and the
|
|
111
|
+
// WORKFLOW_DEV_WATCH_IGNORED_PATHS env var in addition to the
|
|
112
|
+
// built-in fragments. The generated workflow dir is passed as an
|
|
113
|
+
// extra fragment so it is pruned regardless of `.gitignore`.
|
|
114
|
+
const isIgnoredWatchPath = (0, watch_ignore_js_1.createWatchIgnorePredicate)({
|
|
115
|
+
workingDir: this.config.workingDir,
|
|
116
|
+
projectRoot: this.transformProjectRoot,
|
|
117
|
+
extraFragments: [normalizedGeneratedDir],
|
|
118
|
+
});
|
|
115
119
|
const hasIgnoredPathFragment = (normalizedPath) => {
|
|
116
|
-
if (normalizedPath
|
|
117
|
-
normalizedPath === normalizedDistDir ||
|
|
120
|
+
if (normalizedPath === normalizedDistDir ||
|
|
118
121
|
normalizedPath.startsWith(`${normalizedDistDir}/`)) {
|
|
119
122
|
return true;
|
|
120
123
|
}
|
|
121
|
-
|
|
122
|
-
if (normalizedPath.includes(fragment)) {
|
|
123
|
-
return true;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
return false;
|
|
124
|
+
return isIgnoredWatchPath(normalizedPath);
|
|
127
125
|
};
|
|
128
126
|
let rebuildQueue = Promise.resolve();
|
|
129
127
|
const enqueue = (task) => {
|
|
@@ -573,4 +571,4 @@ async function getNextBuilderEager(buildersModule) {
|
|
|
573
571
|
CachedNextBuilderEager = NextBuilder;
|
|
574
572
|
return NextBuilder;
|
|
575
573
|
}
|
|
576
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBa0NBLGtEQXF1QkM7QUF2d0JELHFDQUFpRDtBQUNqRCwrQ0FRMEI7QUFDMUIseUNBQXlFO0FBS3pFLHdEQUFnQztBQUVoQyx5REFPNEI7QUFFNUIsSUFBSSxzQkFBMkIsQ0FBQztBQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFFBQVEsQ0FBQyxXQUFXLEVBQUUsMEJBQTBCLENBRXZELENBQUM7QUFFaEIsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLG1CQUFtQixDQUN2QyxjQUFvRDtJQUVwRCxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0IsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixjQUFjLEdBQ2YsR0FBRyxjQUFjO1FBQ2xCLENBQUMsTUFBTSxTQUFTLENBQXNDLG9CQUFvQixDQUFDLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVksU0FBUSxnQkFBZ0I7UUFNeEMsS0FBSyxDQUFDLEtBQUs7WUFDVCxNQUFNLFNBQVMsR0FBRyxNQUFNLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ2hELE1BQU0sb0JBQW9CLEdBQUcsSUFBQSxnQkFBSSxFQUFDLFNBQVMsRUFBRSx5QkFBeUIsQ0FBQyxDQUFDO1lBRXhFLGtDQUFrQztZQUNsQyxNQUFNLElBQUEsZ0JBQUssRUFBQyxvQkFBb0IsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQ3ZELE1BQU0sSUFBQSxvQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUv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T0FBTyxDQUFDLEVBQUUsQ0FBQztvQkFDWCxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsaUJBQWlCLENBQUMsRUFBRSxDQUFDO3dCQUNoRSxNQUFNLENBQUMsQ0FBQztvQkFDVixDQUFDO29CQUNELE9BQU8sS0FBSyxDQUFDO2dCQUNmLENBQUM7WUFDSCxDQUFDLENBQUM7WUFFRixnQ0FBZ0M7WUFDaEMsSUFBSSxNQUFNLFdBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO2dCQUM5QixPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBRUQsb0NBQW9DO1lBQ3BDLElBQUksTUFBTSxXQUFXLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQztnQkFDakMsT0FBTyxTQUFTLENBQUM7WUFDbkIsQ0FBQztZQUVELGtGQUFrRjtZQUNsRixJQUFJLE1BQU0sV0FBVyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7Z0JBQ2hDLCtDQUErQztnQkFDL0MsTUFBTSxJQUFBLGdCQUFLLEVBQUMsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQ3pDLE9BQU8sTUFBTSxDQUFDO1lBQ2hCLENBQUM7WUFFRCxJQUFJLE1BQU0sV0FBVyxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7Z0JBQ25DLHVEQUF1RDtnQkFDdkQsTUFBTSxJQUFBLGdCQUFLLEVBQUMsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7Z0JBQzVDLE9BQU8sU0FBUyxDQUFDO1lBQ25CLENBQUM7WUFFRCxNQUFNLElBQUksS0FBSyxDQUNiLHFIQUFxSCxDQUN0SCxDQUFDO1FBQ0osQ0FBQztLQUNGO0lBRUQsc0JBQXNCLEdBQUcsV0FBVyxDQUFDO0lBQ3JDLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb25zdGFudHMsIHR5cGUgRGlyZW50IH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQge1xuICBhY2Nlc3MsXG4gIGNvcHlGaWxlLFxuICBta2RpcixcbiAgcmVhZGRpcixcbiAgcmVhbHBhdGgsXG4gIHN0YXQsXG4gIHdyaXRlRmlsZSxcbn0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBleHRuYW1lLCBpc0Fic29sdXRlLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7XG4gIE5leHRDb25maWcgYXMgQnVpbGRlck5leHRDb25maWcsXG4gIFdvcmtmbG93TWFuaWZlc3QsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgY2hva2lkYXIgZnJvbSAnY2hva2lkYXInO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIGFzIFByb2plY3ROZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQge1xuICBjbGFzc2lmeVJlYnVpbGQsXG4gIGNyZWF0ZVNvdXJjZVNuYXBzaG90LFxuICB0eXBlIEZpbGVDaGFuZ2VzLFxuICBnZXRSZWxldmFudEZpbGVzLFxuICByZXBsYWNlU291cmNlU25hcHNob3RzLFxuICB0eXBlIFNvdXJjZVNuYXBzaG90LFxufSBmcm9tICcuL3dhdGNoLXJlYnVpbGQuanMnO1xuXG5sZXQgQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjogYW55O1xuY29uc3QgaW1wb3J0RXNtID0gbmV3IEZ1bmN0aW9uKCdzcGVjaWZpZXInLCAncmV0dXJuIGltcG9ydChzcGVjaWZpZXIpJykgYXMgPFQ+KFxuICBzcGVjaWZpZXI6IHN0cmluZ1xuKSA9PiBQcm9taXNlPFQ+O1xuXG4vLyBDcmVhdGUgdGhlIGVhZ2VyIE5leHQgYnVpbGRlciBkeW5hbWljYWxseSBieSBleHRlbmRpbmcgdGhlIEVTTSBCYXNlQnVpbGRlci5cbi8vIEV4cG9ydGVkIGFzIGdldE5leHRCdWlsZGVyRWFnZXIoKSB0byBhbGxvdyBDb21tb25KUyBtb2R1bGVzIHRvIGltcG9ydCBmcm9tXG4vLyB0aGUgRVNNIEB3b3JrZmxvdy9idWlsZGVycyBwYWNrYWdlIHZpYSBkeW5hbWljIGltcG9ydCBhdCBydW50aW1lLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5leHRCdWlsZGVyRWFnZXIoXG4gIGJ1aWxkZXJzTW9kdWxlPzogdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJylcbikge1xuICBpZiAoQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcikge1xuICAgIHJldHVybiBDYWNoZWROZXh0QnVpbGRlckVhZ2VyO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIEJhc2VCdWlsZGVyOiBCYXNlQnVpbGRlckNsYXNzLFxuICAgIGdldFdvcmtmbG93UXVldWVUcmlnZ2VyLFxuICAgIGRldGVjdFdvcmtmbG93UGF0dGVybnMsXG4gICAgcGFyZW50SGFzQ2hpbGQsXG4gIH0gPSBidWlsZGVyc01vZHVsZSA/P1xuICAoYXdhaXQgaW1wb3J0RXNtPHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpPignQHdvcmtmbG93L2J1aWxkZXJzJykpO1xuXG4gIGNsYXNzIE5leHRCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXJDbGFzcyB7XG4gICAgcHJvdGVjdGVkIGRlY2xhcmUgY29uZmlnOiBCdWlsZGVyTmV4dENvbmZpZyAmIHtcbiAgICAgIHBhZ2VFeHRlbnNpb25zOiBOb25OdWxsYWJsZTxQcm9qZWN0TmV4dENvbmZpZ1sncGFnZUV4dGVuc2lvbnMnXT47XG4gICAgICBkaXN0RGlyOiBzdHJpbmc7XG4gICAgfTtcblxuICAgIGFzeW5jIGJ1aWxkKCkge1xuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gYXdhaXQgdGhpcy5maW5kQXBwRGlyZWN0b3J5KCk7XG4gICAgICBjb25zdCB3b3JrZmxvd0dlbmVyYXRlZERpciA9IGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEnKTtcblxuICAgICAgLy8gRW5zdXJlIG91dHB1dCBkaXJlY3RvcmllcyBleGlzdFxuICAgICAgYXdhaXQgbWtkaXIod29ya2Zsb3dHZW5lcmF0ZWREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICcuZ2l0aWdub3JlJyksICcqJyk7XG5cbiAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgfTtcblxuICAgICAgLy8gVjI6IEJ1aWxkIGNvbWJpbmVkIHJvdXRlIChyZXBsYWNlcyBzZXBhcmF0ZSBzdGVwICsgZmxvdyByb3V0ZXMpXG4gICAgICBjb25zdCBjb21iaW5lZFJlc3VsdCA9IGF3YWl0IHRoaXMuYnVpbGRDb21iaW5lZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tSb3V0ZSh7IHdvcmtmbG93R2VuZXJhdGVkRGlyIH0pO1xuXG4gICAgICBjb25zdCB3cml0ZU1hbmlmZXN0ID0gYXN5bmMgKFxuICAgICAgICBzb3VyY2VNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdCB8IHVuZGVmaW5lZFxuICAgICAgKSA9PiB7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0ID0ge1xuICAgICAgICAgIHN0ZXBzOiB7IC4uLnNvdXJjZU1hbmlmZXN0Py5zdGVwcyB9LFxuICAgICAgICAgIHdvcmtmbG93czogeyAuLi5zb3VyY2VNYW5pZmVzdD8ud29ya2Zsb3dzIH0sXG4gICAgICAgICAgY2xhc3NlczogeyAuLi5zb3VyY2VNYW5pZmVzdD8uY2xhc3NlcyB9LFxuICAgICAgICB9O1xuXG4gICAgICAgIC8vIFdyaXRlIG1hbmlmZXN0XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlUGF0aCA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93L3JvdXRlLmpzJyk7XG4gICAgICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuaWZlc3Qoe1xuICAgICAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgICAgICBtYW5pZmVzdERpcjogd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgICAgbWFuaWZlc3QsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4cG9zZSBtYW5pZmVzdCBhcyBhIHN0YXRpYyBmaWxlIHdoZW4gV09SS0ZMT1dfUFVCTElDX01BTklGRVNUPTEuXG4gICAgICAgIGlmICh0aGlzLnNob3VsZEV4cG9zZVB1YmxpY01hbmlmZXN0ICYmIG1hbmlmZXN0SnNvbikge1xuICAgICAgICAgIGNvbnN0IHB1YmxpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgICAncHVibGljLy53ZWxsLWtub3duL3dvcmtmbG93L3YxJ1xuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgbWtkaXIocHVibGljTWFuaWZlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihwdWJsaWNNYW5pZmVzdERpciwgJy5naXRpZ25vcmUnKSwgJyonKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgY29weUZpbGUoXG4gICAgICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpLFxuICAgICAgICAgICAgam9pbihwdWJsaWNNYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlTWFuaWZlc3QoY29tYmluZWRSZXN1bHQ/Lm1hbmlmZXN0KTtcblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXIpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHdhdGNoIG1vZGUgZm9yIGNvbWJpbmVkIGJ1bmRsZVxuICAgICAgICAvLyBGb3Igbm93LCBmYWxsIGJhY2sgdG8gZnVsbCByZWJ1aWxkIG9uIGZpbGUgY2hhbmdlc1xuICAgICAgICBpZiAoIWNvbWJpbmVkUmVzdWx0Py5pbnRlcmltQnVuZGxlQ3R4IHx8ICFjb21iaW5lZFJlc3VsdC5idW5kbGVGaW5hbCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93IGJ1aWxkIGNvbnRleHQgaW4gd2F0Y2ggbW9kZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RlcCByZWdpc3RyYXRpb25zIG1heSBiZSBlbWl0dGVkIGFzIHNvdXJjZSBpbXBvcnRzIHdpdGhvdXQgYW5cbiAgICAgICAgLy8gZXNidWlsZCBjb250ZXh0IHdoZW4gZXh0ZXJuYWxpemVOb25TdGVwcyBpcyBlbmFibGVkLlxuICAgICAgICBsZXQgc3RlcHNDdHggPSBjb21iaW5lZFJlc3VsdC5zdGVwc0NvbnRleHQ7XG4gICAgICAgIGxldCB3b3JrZmxvd3NDdHggPSB7XG4gICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eDogY29tYmluZWRSZXN1bHQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICBidW5kbGVGaW5hbDogY29tYmluZWRSZXN1bHQuYnVuZGxlRmluYWwsXG4gICAgICAgIH07XG4gICAgICAgIGxldCB3b3JrZmxvd0ludGVyaW1CdW5kbGVUZXh0ID1cbiAgICAgICAgICBjb21iaW5lZFJlc3VsdC53b3JrZmxvd0ludGVyaW1CdW5kbGVUZXh0O1xuICAgICAgICBsZXQgZGlzY292ZXJlZEVudHJpZXMgPSBjb21iaW5lZFJlc3VsdC5kaXNjb3ZlcmVkRW50cmllcztcbiAgICAgICAgbGV0IHN0ZXBzTWFuaWZlc3QgPSBjb21iaW5lZFJlc3VsdC5zdGVwc01hbmlmZXN0O1xuICAgICAgICBsZXQgd29ya2Zsb3dzTWFuaWZlc3QgPSBjb21iaW5lZFJlc3VsdC53b3JrZmxvd3NNYW5pZmVzdDtcbiAgICAgICAgY29uc3Qgc3RlcHNPdXRmaWxlID0gam9pbihcbiAgICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgICAnZmxvdycsXG4gICAgICAgICAgJ19fc3RlcF9yZWdpc3RyYXRpb25zLmpzJ1xuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgICAoaXNBYnNvbHV0ZShwYXRobmFtZSlcbiAgICAgICAgICAgID8gcGF0aG5hbWVcbiAgICAgICAgICAgIDogcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBwYXRobmFtZSlcbiAgICAgICAgICApLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgY29uc3Qgc291cmNlU25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PigpO1xuXG4gICAgICAgIGNvbnN0IHdhdGNoYWJsZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICAnLmpzeCcsXG4gICAgICAgICAgJy50cycsXG4gICAgICAgICAgJy50c3gnLFxuICAgICAgICAgICcubXRzJyxcbiAgICAgICAgICAnLmN0cycsXG4gICAgICAgICAgJy5janMnLFxuICAgICAgICAgICcubWpzJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGlnbm9yZWRQYXRoRnJhZ21lbnRzID0gW1xuICAgICAgICAgICcvLmdpdC8nLFxuICAgICAgICAgICcvbm9kZV9tb2R1bGVzLycsXG4gICAgICAgICAgJy8ubmV4dC8nLFxuICAgICAgICAgICcvLnR1cmJvLycsXG4gICAgICAgICAgJy8udmVyY2VsLycsXG4gICAgICAgICAgJy9kaXN0LycsXG4gICAgICAgICAgJy9idWlsZC8nLFxuICAgICAgICAgICcvb3V0LycsXG4gICAgICAgICAgJy8uY2FjaGUvJyxcbiAgICAgICAgICAnLy55YXJuLycsXG4gICAgICAgICAgJy8ucG5wbS1zdG9yZS8nLFxuICAgICAgICAgICcvLnBhcmNlbC1jYWNoZS8nLFxuICAgICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEdlbmVyYXRlZERpciA9IHdvcmtmbG93R2VuZXJhdGVkRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZERpc3REaXIgPSBub3JtYWxpemVQYXRoKHRoaXMuY29uZmlnLmRpc3REaXIpO1xuICAgICAgICBpZ25vcmVkUGF0aEZyYWdtZW50cy5wdXNoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpO1xuXG4gICAgICAgIGNvbnN0IGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQgPSAobm9ybWFsaXplZFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZEdlbmVyYXRlZERpcikgfHxcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoID09PSBub3JtYWxpemVkRGlzdERpciB8fFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChgJHtub3JtYWxpemVkRGlzdERpcn0vYClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGlnbm9yZWRQYXRoRnJhZ21lbnRzKSB7XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHJlYnVpbGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIGNvbnN0IGVucXVldWUgPSAodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgICAgICAgIHJlYnVpbGRRdWV1ZSA9IHJlYnVpbGRRdWV1ZS50aGVuKHRhc2spLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHByb2Nlc3MgZmlsZSBjaGFuZ2UnLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlYnVpbGRRdWV1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZWFkU291cmNlU25hcHNob3QgPSAoZmlsZTogc3RyaW5nKSA9PlxuICAgICAgICAgIGNyZWF0ZVNvdXJjZVNuYXBzaG90KHsgZmlsZSwgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyB9KTtcblxuICAgICAgICBjb25zdCByZWZyZXNoU291cmNlU25hcHNob3RzID0gKCkgPT5cbiAgICAgICAgICByZXBsYWNlU291cmNlU25hcHNob3RzKHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICAgIHJlYWRTbmFwc2hvdDogcmVhZFNvdXJjZVNuYXBzaG90LFxuICAgICAgICAgICAgc291cmNlU25hcHNob3RzLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IG1lcmdlQ29tYmluZWRNYW5pZmVzdCA9IChcbiAgICAgICAgICBuZXh0U3RlcHNNYW5pZmVzdDogV29ya2Zsb3dNYW5pZmVzdFxuICAgICAgICApOiBXb3JrZmxvd01hbmlmZXN0ID0+ICh7XG4gICAgICAgICAgLi4ubmV4dFN0ZXBzTWFuaWZlc3QsXG4gICAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgICAuLi5uZXh0U3RlcHNNYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgICAgICAuLi53b3JrZmxvd3NNYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgICAuLi5uZXh0U3RlcHNNYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAgICAgLi4ud29ya2Zsb3dzTWFuaWZlc3QuY2xhc3NlcyxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBob3RSZWJ1aWxkID0gYXN5bmMgKHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9uczogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmIChyZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnMpIHtcbiAgICAgICAgICAgIGlmIChzdGVwc0N0eCkge1xuICAgICAgICAgICAgICBhd2FpdCBzdGVwc0N0eC5yZWJ1aWxkKCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzdGVwc01hbmlmZXN0ID0gYXdhaXQgdGhpcy5jcmVhdGVTdGVwU291cmNlUmVnaXN0cmF0aW9uRmlsZSh7XG4gICAgICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgICAgIG91dGZpbGU6IHN0ZXBzT3V0ZmlsZSxcbiAgICAgICAgICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHdvcmtmbG93UmVzdWx0ID0gYXdhaXQgd29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHgucmVidWlsZCgpO1xuICAgICAgICAgIGNvbnN0IHdvcmtmbG93T3V0cHV0ID0gd29ya2Zsb3dSZXN1bHQub3V0cHV0RmlsZXM/LlswXT8udGV4dDtcbiAgICAgICAgICBpZiAoIXdvcmtmbG93T3V0cHV0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93IG91dHB1dCBmcm9tIGhvdCByZWJ1aWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB3b3JrZmxvd0ludGVyaW1CdW5kbGVUZXh0ID0gd29ya2Zsb3dPdXRwdXQ7XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmJ1bmRsZUZpbmFsKHdvcmtmbG93T3V0cHV0KTtcbiAgICAgICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KG1lcmdlQ29tYmluZWRNYW5pZmVzdChzdGVwc01hbmlmZXN0KSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZnVsbFJlYnVpbGQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhckRpc2NvdmVyZWRFbnRyaWVzQ2FjaGUoKTtcbiAgICAgICAgICBjb25zdCBuZXdJbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICAgICAgb3B0aW9ucy5pbnB1dEZpbGVzID0gbmV3SW5wdXRGaWxlcztcblxuICAgICAgICAgIGF3YWl0IHN0ZXBzQ3R4Py5kaXNwb3NlKCk7XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHguZGlzcG9zZSgpO1xuXG4gICAgICAgICAgY29uc3QgbmV3Q29tYmluZWQgPSBhd2FpdCB0aGlzLmJ1aWxkQ29tYmluZWRGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgICAgICBzdGVwc0N0eCA9IG5ld0NvbWJpbmVkLnN0ZXBzQ29udGV4dDtcbiAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyA9IG5ld0NvbWJpbmVkLmRpc2NvdmVyZWRFbnRyaWVzO1xuICAgICAgICAgIHN0ZXBzTWFuaWZlc3QgPSBuZXdDb21iaW5lZC5zdGVwc01hbmlmZXN0O1xuICAgICAgICAgIHdvcmtmbG93c01hbmlmZXN0ID0gbmV3Q29tYmluZWQud29ya2Zsb3dzTWFuaWZlc3Q7XG4gICAgICAgICAgd29ya2Zsb3dJbnRlcmltQnVuZGxlVGV4dCA9IG5ld0NvbWJpbmVkLndvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQ7XG5cbiAgICAgICAgICBpZiAoIW5ld0NvbWJpbmVkPy5pbnRlcmltQnVuZGxlQ3R4IHx8ICFuZXdDb21iaW5lZD8uYnVuZGxlRmluYWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFyaWFudDogZXhwZWN0ZWQgd29ya2Zsb3dzIGJ1bmRsZSBjb250ZXh0IGFmdGVyIHJlYnVpbGQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB3b3JrZmxvd3NDdHggPSB7XG4gICAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiBuZXdDb21iaW5lZC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgICAgYnVuZGxlRmluYWw6IG5ld0NvbWJpbmVkLmJ1bmRsZUZpbmFsLFxuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KG5ld0NvbWJpbmVkLm1hbmlmZXN0KTtcbiAgICAgICAgICBhd2FpdCByZWZyZXNoU291cmNlU25hcHNob3RzKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaXNXYXRjaGFibGVGaWxlID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICB3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRuYW1lKHBhdGgpKTtcblxuICAgICAgICBjb25zdCByZWFkS25vd25GaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBmaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IGFsaWFzZXMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgICAgIGNvbnN0IHJlbGV2YW50RmlsZXMgPSBnZXRSZWxldmFudEZpbGVzKHtcbiAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IGFkZEtub3duRmlsZSA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBsZXQgcmVhbEZpbGVQYXRoID0gZmlsZVBhdGg7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICByZWFsRmlsZVBhdGggPSBub3JtYWxpemVQYXRoKGF3YWl0IHJlYWxwYXRoKGZpbGVQYXRoKSk7XG4gICAgICAgICAgICB9IGNhdGNoIHt9XG5cbiAgICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSByZWxldmFudEZpbGVzLmhhcyhyZWFsRmlsZVBhdGgpXG4gICAgICAgICAgICAgID8gcmVhbEZpbGVQYXRoXG4gICAgICAgICAgICAgIDogZmlsZVBhdGg7XG4gICAgICAgICAgICBmaWxlcy5hZGQoY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgICBhbGlhc2VzLnNldChmaWxlUGF0aCwgY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgICBhbGlhc2VzLnNldChyZWFsRmlsZVBhdGgsIGNhbm9uaWNhbFBhdGgpO1xuICAgICAgICAgICAgcmV0dXJuIGNhbm9uaWNhbFBhdGg7XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGNvbnN0IHZpc2l0ID0gYXN5bmMgKGRpcmVjdG9yeTogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiA9PiB7XG4gICAgICAgICAgICBsZXQgZGlyZW50czogRGlyZW50PHN0cmluZz5bXTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGRpcmVudHMgPSBhd2FpdCByZWFkZGlyKGRpcmVjdG9yeSwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgIGRpcmVudHMubWFwKGFzeW5jIChkaXJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBmaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoam9pbihkaXJlY3RvcnksIGRpcmVudC5uYW1lKSk7XG4gICAgICAgICAgICAgICAgaWYgKGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQoZmlsZVBhdGgpKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGRpcmVudC5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB2aXNpdChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHN0YXRzOiBBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIHN0YXQ+PjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgc3RhdHMgPSBhd2FpdCBzdGF0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgICAgICAgYXdhaXQgdmlzaXQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICghc3RhdHMuaXNGaWxlKCkgfHwgIWlzV2F0Y2hhYmxlRmlsZShmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhd2FpdCBhZGRLbm93bkZpbGUoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXdhaXQgdmlzaXQodGhpcy5jb25maWcud29ya2luZ0Rpcik7XG4gICAgICAgICAgcmV0dXJuIHsgZmlsZXMsIGFsaWFzZXMsIGFkZEtub3duRmlsZSB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRmlsZUNoYW5nZXMgPSAoXG4gICAgICAgICAgbGVmdDogRmlsZUNoYW5nZXMsXG4gICAgICAgICAgcmlnaHQ6IEZpbGVDaGFuZ2VzXG4gICAgICAgICk6IEZpbGVDaGFuZ2VzID0+ICh7XG4gICAgICAgICAgYWRkZWRGaWxlczogdW5pcXVlKFsuLi5sZWZ0LmFkZGVkRmlsZXMsIC4uLnJpZ2h0LmFkZGVkRmlsZXNdKSxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4ubGVmdC5tb2RpZmllZEZpbGVzLFxuICAgICAgICAgICAgLi4ucmlnaHQubW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHVuaXF1ZShbLi4ubGVmdC5yZW1vdmVkRmlsZXMsIC4uLnJpZ2h0LnJlbW92ZWRGaWxlc10pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCB1bmlxdWUgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiBbLi4ubmV3IFNldChwYXRocyldO1xuXG4gICAgICAgIGNvbnN0IGNsYXNzaWZ5RmlsZUNoYW5nZXMgPSAoe1xuICAgICAgICAgIGNoYW5nZWRGaWxlcyxcbiAgICAgICAgICBrbm93bkZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfToge1xuICAgICAgICAgIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAga25vd25GaWxlczogU2V0PHN0cmluZz47XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgfSk6IEZpbGVDaGFuZ2VzID0+IHtcbiAgICAgICAgICBjb25zdCBhZGRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkRmlsZXM6IHN0cmluZ1tdID0gW107XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IGZpbGUgb2YgdW5pcXVlKGNoYW5nZWRGaWxlcykpIHtcbiAgICAgICAgICAgIGlmIChrbm93bkZpbGVzLmhhcyhmaWxlKSkge1xuICAgICAgICAgICAgICBtb2RpZmllZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBhZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgICAgICAgIGtub3duRmlsZXMuYWRkKGZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByZW1vdmVkRmlsZXMpIHtcbiAgICAgICAgICAgIGtub3duRmlsZXMuZGVsZXRlKGZpbGUpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZEZpbGVzLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICAgIHJlbW92ZWRGaWxlczogdW5pcXVlKHJlbW92ZWRGaWxlcyksXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYXNGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgYWRkZWRGaWxlcyxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfTogRmlsZUNoYW5nZXMpID0+XG4gICAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgbW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDA7XG4gICAgICAgIGNvbnN0IHN0ZXBFeGVjdXRpb25GaWxlc0NoYW5nZWQgPSAoZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgY29uc3Qgc3RlcEVudHJ5RmlsZXMgPSBbLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFN0ZXBzXS5tYXAoXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoc3RlcEVudHJ5RmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNvbnN0IGNoYW5nZWRGaWxlcyA9IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi5maWxlQ2hhbmdlcy5tb2RpZmllZEZpbGVzLFxuICAgICAgICAgICAgLi4uZmlsZUNoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICAgICAgICAgIC4uLmZpbGVDaGFuZ2VzLnJlbW92ZWRGaWxlcyxcbiAgICAgICAgICBdKS5tYXAobm9ybWFsaXplUGF0aCk7XG5cbiAgICAgICAgICByZXR1cm4gY2hhbmdlZEZpbGVzLnNvbWUoXG4gICAgICAgICAgICAoY2hhbmdlZEZpbGUpID0+XG4gICAgICAgICAgICAgIHN0ZXBFbnRyeUZpbGVzLmluY2x1ZGVzKGNoYW5nZWRGaWxlKSB8fFxuICAgICAgICAgICAgICBzdGVwRW50cnlGaWxlcy5zb21lKChzdGVwRmlsZSkgPT5cbiAgICAgICAgICAgICAgICBwYXJlbnRIYXNDaGlsZChzdGVwRmlsZSwgY2hhbmdlZEZpbGUpXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBsb2dEZXZIbXIgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52LldPUktGTE9XX0RFVl9ITVJfTE9HUyA9PT0gJzEnKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyguLi5hcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgYXdhaXQgcmVmcmVzaFNvdXJjZVNuYXBzaG90cygpO1xuICAgICAgICBsZXQge1xuICAgICAgICAgIGZpbGVzOiBrbm93bkZpbGVzLFxuICAgICAgICAgIGFsaWFzZXM6IGtub3duRmlsZUFsaWFzZXMsXG4gICAgICAgICAgYWRkS25vd25GaWxlOiByZW1lbWJlcktub3duRmlsZSxcbiAgICAgICAgfSA9IGF3YWl0IHJlYWRLbm93bkZpbGVzKCk7XG5cbiAgICAgICAgY29uc3QgcmVmcmVzaEtub3duRmlsZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbmV4dEtub3duID0gYXdhaXQgcmVhZEtub3duRmlsZXMoKTtcbiAgICAgICAgICBrbm93bkZpbGVzID0gbmV4dEtub3duLmZpbGVzO1xuICAgICAgICAgIGtub3duRmlsZUFsaWFzZXMgPSBuZXh0S25vd24uYWxpYXNlcztcbiAgICAgICAgICByZW1lbWJlcktub3duRmlsZSA9IG5leHRLbm93bi5hZGRLbm93bkZpbGU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcHJvY2Vzc0ZpbGVDaGFuZ2VzID0gYXN5bmMgKGZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcykgPT4ge1xuICAgICAgICAgIGlmICghaGFzRmlsZUNoYW5nZXMoZmlsZUNoYW5nZXMpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZGVjaXNpb24gPSBhd2FpdCBjbGFzc2lmeVJlYnVpbGQoe1xuICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICBmaWxlQ2hhbmdlcyxcbiAgICAgICAgICAgIGlucHV0RmlsZXM6IG9wdGlvbnMuaW5wdXRGaWxlcyxcbiAgICAgICAgICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgICAgICAgICBwYXJlbnRIYXNDaGlsZCxcbiAgICAgICAgICAgIHJlYWRTbmFwc2hvdDogcmVhZFNvdXJjZVNuYXBzaG90LFxuICAgICAgICAgICAgc291cmNlU25hcHNob3RzLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmIChkZWNpc2lvbi5raW5kID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGxvZ0Rldkhtcignd29ya2Zsb3cgZGV2IGhtcjogc2tpcCcpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBbZmlsZSwgc25hcHNob3RdIG9mIGRlY2lzaW9uLnNuYXBzaG90cyB8fCBbXSkge1xuICAgICAgICAgICAgICBzb3VyY2VTbmFwc2hvdHMuc2V0KGZpbGUsIHNuYXBzaG90KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgIXN0ZXBzQ3R4ICYmXG4gICAgICAgICAgICAgIHdvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQgJiZcbiAgICAgICAgICAgICAgc3RlcEV4ZWN1dGlvbkZpbGVzQ2hhbmdlZChmaWxlQ2hhbmdlcylcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAvLyBTb3VyY2Ugc3RlcCByZWdpc3RyYXRpb25zIGtlZXAgc3RhYmxlIGltcG9ydHMsIHNvIFR1cmJvcGFja1xuICAgICAgICAgICAgICAvLyBjYW4gbGVhdmUgdGhlIGdlbmVyYXRlZCBmbG93IHJvdXRlIGNhY2hlZCBhZnRlciBhXG4gICAgICAgICAgICAgIC8vIHN0ZXAtYm9keS1vbmx5IGVkaXQuIFJlZnJlc2ggdGhlIHJvdXRlIHdyYXBwZXIgd2l0aG91dFxuICAgICAgICAgICAgICAvLyByZWRpc2NvdmVyaW5nIGVudHJpZXMgb3IgcmVidWlsZGluZyB0aGUgd29ya2Zsb3cgVk0uXG4gICAgICAgICAgICAgIGF3YWl0IHdvcmtmbG93c0N0eC5idW5kbGVGaW5hbCh3b3JrZmxvd0ludGVyaW1CdW5kbGVUZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGRlY2lzaW9uLmtpbmQgPT09ICdmdWxsJykge1xuICAgICAgICAgICAgbG9nRGV2SG1yKCd3b3JrZmxvdyBkZXYgaG1yOiBmdWxsIHJlZGlzY292ZXJ5Jyk7XG4gICAgICAgICAgICBhd2FpdCBmdWxsUmVidWlsZCgpO1xuICAgICAgICAgICAgYXdhaXQgcmVmcmVzaEtub3duRmlsZXMoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBsb2dEZXZIbXIoXG4gICAgICAgICAgICBgd29ya2Zsb3cgZGV2IGhtcjogaG90IHJlYnVpbGQke2RlY2lzaW9uLnJlZnJlc2hTdGVwUmVnaXN0cmF0aW9ucyA/ICcgd2l0aCBzdGVwIHJlZ2lzdHJhdGlvbiByZWZyZXNoJyA6ICcnfWBcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IGhvdFJlYnVpbGQoZGVjaXNpb24ucmVmcmVzaFN0ZXBSZWdpc3RyYXRpb25zKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtmaWxlLCBzbmFwc2hvdF0gb2YgZGVjaXNpb24uc25hcHNob3RzKSB7XG4gICAgICAgICAgICBzb3VyY2VTbmFwc2hvdHMuc2V0KGZpbGUsIHNuYXBzaG90KTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHBlbmRpbmdGaWxlQ2hhbmdlczogRmlsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgYWRkZWRGaWxlczogW10sXG4gICAgICAgICAgbW9kaWZpZWRGaWxlczogW10sXG4gICAgICAgICAgcmVtb3ZlZEZpbGVzOiBbXSxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IGZsdXNoVGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+IHwgdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHNjaGVkdWxlRmlsZUNoYW5nZXMgPSAoZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgcGVuZGluZ0ZpbGVDaGFuZ2VzID0gbWVyZ2VGaWxlQ2hhbmdlcyhcbiAgICAgICAgICAgIHBlbmRpbmdGaWxlQ2hhbmdlcyxcbiAgICAgICAgICAgIGZpbGVDaGFuZ2VzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZmx1c2hUaW1lcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaFRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IHBlbmRpbmdGaWxlQ2hhbmdlcztcbiAgICAgICAgICAgIHBlbmRpbmdGaWxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICAgICAgYWRkZWRGaWxlczogW10sXG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IFtdLFxuICAgICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGZsdXNoVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBlbnF1ZXVlKCgpID0+IHByb2Nlc3NGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcykpO1xuICAgICAgICAgIH0sIDEwKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXNvbHZlRXhpc3RpbmdFdmVudFBhdGggPSBhc3luYyAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRobmFtZSk7XG4gICAgICAgICAgaWYgKCFpc1dhdGNoYWJsZUZpbGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qga25vd25QYXRoID0ga25vd25GaWxlQWxpYXNlcy5nZXQobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGlmIChrbm93blBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybiBrbm93blBhdGg7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHJlYWxGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYXdhaXQgcmVhbHBhdGgobm9ybWFsaXplZFBhdGgpKTtcbiAgICAgICAgICAgIHJldHVybiBrbm93bkZpbGVBbGlhc2VzLmdldChyZWFsRmlsZVBhdGgpID8/IG5vcm1hbGl6ZWRQYXRoO1xuICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRoO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVGaWxlQWRkZWQgPSBhc3luYyAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRobmFtZSk7XG4gICAgICAgICAgaWYgKCFpc1dhdGNoYWJsZUZpbGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXhpc3RpbmdQYXRoID0gYXdhaXQgcmVzb2x2ZUV4aXN0aW5nRXZlbnRQYXRoKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICBjb25zdCB3YXNLbm93biA9IGV4aXN0aW5nUGF0aCA/IGtub3duRmlsZXMuaGFzKGV4aXN0aW5nUGF0aCkgOiBmYWxzZTtcbiAgICAgICAgICBjb25zdCBjYW5vbmljYWxQYXRoID0gYXdhaXQgcmVtZW1iZXJLbm93bkZpbGUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGtub3duRmlsZXMuYWRkKGNhbm9uaWNhbFBhdGgpO1xuICAgICAgICAgIHNjaGVkdWxlRmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgYWRkZWRGaWxlczogd2FzS25vd24gPyBbXSA6IFtjYW5vbmljYWxQYXRoXSxcbiAgICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IHdhc0tub3duID8gW2Nhbm9uaWNhbFBhdGhdIDogW10sXG4gICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUZpbGVDaGFuZ2VkID0gYXN5bmMgKHBhdGhuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICBjb25zdCBjYW5vbmljYWxQYXRoID0gYXdhaXQgcmVzb2x2ZUV4aXN0aW5nRXZlbnRQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWNhbm9uaWNhbFBhdGgpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNsYXNzaWZ5RmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgY2hhbmdlZEZpbGVzOiBbY2Fub25pY2FsUGF0aF0sXG4gICAgICAgICAgICBrbm93bkZpbGVzLFxuICAgICAgICAgICAgcmVtb3ZlZEZpbGVzOiBbXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoIWtub3duRmlsZUFsaWFzZXMuaGFzKGNhbm9uaWNhbFBhdGgpKSB7XG4gICAgICAgICAgICBhd2FpdCByZW1lbWJlcktub3duRmlsZShjYW5vbmljYWxQYXRoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2NoZWR1bGVGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlRmlsZVJlbW92ZWQgPSAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRobmFtZSk7XG4gICAgICAgICAgaWYgKCFpc1dhdGNoYWJsZUZpbGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgY2Fub25pY2FsUGF0aCA9XG4gICAgICAgICAgICBrbm93bkZpbGVBbGlhc2VzLmdldChub3JtYWxpemVkUGF0aCkgPz8gbm9ybWFsaXplZFBhdGg7XG4gICAgICAgICAgY29uc3QgZmlsZUNoYW5nZXMgPSBjbGFzc2lmeUZpbGVDaGFuZ2VzKHtcbiAgICAgICAgICAgIGNoYW5nZWRGaWxlczogW10sXG4gICAgICAgICAgICBrbm93bkZpbGVzLFxuICAgICAgICAgICAgcmVtb3ZlZEZpbGVzOiBbY2Fub25pY2FsUGF0aF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgICAga25vd25GaWxlQWxpYXNlcy5kZWxldGUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIHNjaGVkdWxlRmlsZUNoYW5nZXMoZmlsZUNoYW5nZXMpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHdhdGNoZXIgPSBjaG9raWRhci53YXRjaCh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCB7XG4gICAgICAgICAgaWdub3JlSW5pdGlhbDogdHJ1ZSxcbiAgICAgICAgICBmb2xsb3dTeW1saW5rczogdHJ1ZSxcbiAgICAgICAgICBpZ25vcmVkOiAocGF0aG5hbWUpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChTdHJpbmcocGF0aG5hbWUpKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiAhd2F0Y2hhYmxlRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBoYXNJZ25vcmVkUGF0aEZyYWdtZW50KG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICB3YXRjaGVyLm9uKCdhZGQnLCAocGF0aG5hbWUpID0+IHtcbiAgICAgICAgICB2b2lkIGhhbmRsZUZpbGVBZGRlZChwYXRobmFtZSk7XG4gICAgICAgIH0pO1xuICAgICAgICB3YXRjaGVyLm9uKCdjaGFuZ2UnLCAocGF0aG5hbWUpID0+IHtcbiAgICAgICAgICB2b2lkIGhhbmRsZUZpbGVDaGFuZ2VkKHBhdGhuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ3VubGluaycsIChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgIGhhbmRsZUZpbGVSZW1vdmVkKHBhdGhuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignV29ya2Zsb3cgZGV2IHdhdGNoZXIgZXJyb3InLCBlcnJvcik7XG4gICAgICAgIH0pO1xuICAgICAgICB3YXRjaGVyLm9uKCdyZWFkeScsICgpID0+IHtcbiAgICAgICAgICBsb2dEZXZIbXIoJ3dvcmtmbG93IGRldiBobXI6IHJlYWR5Jyk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCBzdXBlci5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICByZXR1cm4gaW5wdXRGaWxlcy5maWx0ZXIoKGZpbGUpID0+IHtcbiAgICAgICAgY29uc3QgZW50cnkgPSByZWxhdGl2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCBmaWxlKS5yZXBsYWNlQWxsKFxuICAgICAgICAgICdcXFxcJyxcbiAgICAgICAgICAnLydcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBNYXRjaCBBcHAgUm91dGVyIHJvdXRlLCBwYWdlLCBhbmQgbGF5b3V0IGVudHJ5cG9pbnRzIGluIGFwcC8gb3Igc3JjL2FwcC8uXG4gICAgICAgIGlmICgvXig/OmFwcHxzcmNcXC9hcHApXFwvKD86LipcXC8pPyg/OnJvdXRlfHBhZ2V8bGF5b3V0KVxcLi8udGVzdChlbnRyeSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIGV2ZXJ5IFBhZ2VzIFJvdXRlciBlbnRyeXBvaW50IGluIHBhZ2VzLyBvciBzcmMvcGFnZXMvLlxuICAgICAgICBpZiAoL14oPzpwYWdlc3xzcmNcXC9wYWdlcylcXC8vLnRlc3QoZW50cnkpKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXRjaCBOZXh0LmpzIHJvb3QgZW50cnlwb2ludHMgYXQgdGhlIHByb2plY3Qgcm9vdCBvciB1bmRlciBzcmMvLlxuICAgICAgICByZXR1cm4gWydpbnN0cnVtZW50YXRpb24nLCAnbWlkZGxld2FyZScsICdwcm94eSddLnNvbWUoKG5hbWUpID0+XG4gICAgICAgICAgdGhpcy5jb25maWcucGFnZUV4dGVuc2lvbnMuc29tZShcbiAgICAgICAgICAgIChleHRlbnNpb24pID0+XG4gICAgICAgICAgICAgIGVudHJ5ID09PSBgJHtuYW1lfS4ke2V4dGVuc2lvbn1gIHx8XG4gICAgICAgICAgICAgIGVudHJ5ID09PSBgc3JjLyR7bmFtZX0uJHtleHRlbnNpb259YFxuICAgICAgICAgIClcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVGdW5jdGlvbnNDb25maWcob3V0cHV0RGlyOiBzdHJpbmcpIHtcbiAgICAgIC8vIHdlIGRvbid0IHJ1biB0aGlzIGluIGRldmVsb3BtZW50IG1vZGUgYXMgaXQncyBub3QgbmVlZGVkXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBWMiBjb21iaW5lZCBjb25maWc6IHNpbmdsZSB0cmlnZ2VyIGhhbmRsZXMgYm90aCB3b3JrZmxvdyBhbmQgc3RlcCBleGVjdXRpb24uXG4gICAgICAvLyBUaGUgc3RlcCByb3V0ZSBubyBsb25nZXIgbmVlZHMgaXRzIG93biB0cmlnZ2VyIHNpbmNlIHN0ZXBzIGFyZSBleGVjdXRlZFxuICAgICAgLy8gaW5saW5lIGJ5IHRoZSBjb21iaW5lZCBoYW5kbGVyIG9yIHF1ZXVlZCBiYWNrIHRvIF9fd2tmX3dvcmtmbG93Xyogd2l0aCBzdGVwSWQuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRDb25maWcgPSB7XG4gICAgICAgIHZlcnNpb246ICcwJyxcbiAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgbWF4RHVyYXRpb246ICdtYXgnLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBbZ2V0V29ya2Zsb3dRdWV1ZVRyaWdnZXIoKV0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgIGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEvY29uZmlnLmpzb24nKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZ2VuZXJhdGVkQ29uZmlnLCBudWxsLCAyKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWMjogQnVpbGQgY29tYmluZWQgcm91dGUgdGhhdCBoYW5kbGVzIGJvdGggd29ya2Zsb3cgYW5kIHN0ZXAgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYnVpbGRDb21iaW5lZEZ1bmN0aW9uKHtcbiAgICAgIGlucHV0RmlsZXMsXG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICB9OiB7XG4gICAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgfSkge1xuICAgICAgY29uc3QgZmxvd1JvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cnKTtcbiAgICAgIGF3YWl0IG1rZGlyKGZsb3dSb3V0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZUNvbWJpbmVkQnVuZGxlKHtcbiAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgc3RlcHNPdXRmaWxlOiBqb2luKGZsb3dSb3V0ZURpciwgJ19fc3RlcF9yZWdpc3RyYXRpb25zLmpzJyksXG4gICAgICAgIGZsb3dPdXRmaWxlOiBqb2luKGZsb3dSb3V0ZURpciwgJ3JvdXRlLmpzJyksXG4gICAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgICAgZXh0ZXJuYWxpemVOb25TdGVwczogdHJ1ZSxcbiAgICAgICAgc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHM6IHRydWUsXG4gICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYnVpbGRXZWJob29rUm91dGUoe1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgfToge1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB3ZWJob29rUm91dGVGaWxlID0gam9pbihcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgICd3ZWJob29rL1t0b2tlbl0vcm91dGUuanMnXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXZWJob29rQnVuZGxlKHtcbiAgICAgICAgb3V0ZmlsZTogd2ViaG9va1JvdXRlRmlsZSxcbiAgICAgICAgYnVuZGxlOiBmYWxzZSwgLy8gTmV4dC5qcyBkb2Vzbid0IG5lZWQgYnVuZGxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmluZEFwcERpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgYXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnYXBwJyk7XG4gICAgICBjb25zdCBzcmNBcHBEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvYXBwJyk7XG4gICAgICBjb25zdCBwYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3BhZ2VzJyk7XG4gICAgICBjb25zdCBzcmNQYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3NyYy9wYWdlcycpO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjY2VzcyhwYXRoLCBjb25zdGFudHMuRl9PSyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgICAgICAgIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5OiAke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBhIGRpcmVjdG9yeScpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGlmIGFwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkoYXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gYXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzcmMvYXBwIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNBcHBEaXIpKSB7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGFwcCBkaXJlY3RvcnkgZXhpc3RzLCBjaGVjayBmb3IgcGFnZXMgZGlyZWN0b3J5IGFuZCBjcmVhdGUgYXBwIG5leHQgdG8gaXRcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShwYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFwcCBkaXJlY3RvcnkgbmV4dCB0byBwYWdlcyBkaXJlY3RvcnlcbiAgICAgICAgYXdhaXQgbWtkaXIoYXBwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHNyY1BhZ2VzRGlyKSkge1xuICAgICAgICAvLyBDcmVhdGUgc3JjL2FwcCBkaXJlY3RvcnkgbmV4dCB0byBzcmMvcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKHNyY0FwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIE5leHQuanMgYXBwIG9yIHBhZ2VzIGRpcmVjdG9yeS4gRXhwZWN0ZWQgb25lIG9mOiBcImFwcFwiLCBcInNyYy9hcHBcIiwgXCJwYWdlc1wiLCBvciBcInNyYy9wYWdlc1wiIHRvIGV4aXN0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlciA9IE5leHRCdWlsZGVyO1xuICByZXR1cm4gTmV4dEJ1aWxkZXI7XG59XG4iXX0=
|
|
574
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBb0NBLGtEQW11QkM7QUF2d0JELHFDQUFpRDtBQUNqRCwrQ0FTMEI7QUFDMUIseUNBQXlFO0FBS3pFLHdEQUFnQztBQUVoQyx1REFBK0Q7QUFDL0QseURBTzRCO0FBRTVCLElBQUksc0JBQTJCLENBQUM7QUFDaEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxRQUFRLENBQUMsV0FBVyxFQUFFLDBCQUEwQixDQUV2RCxDQUFDO0FBRWhCLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0Usb0VBQW9FO0FBQzdELEtBQUssVUFBVSxtQkFBbUIsQ0FDdkMsY0FBb0Q7SUFFcEQsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzNCLE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sRUFDSixXQUFXLEVBQUUsZ0JBQWdCLEVBQzdCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdEIsY0FBYyxHQUNmLEdBQUcsY0FBYztRQUNsQixDQUFDLE1BQU0sU0FBUyxDQUFzQyxvQkFBb0IsQ0FBQyxDQUFDLENBQUM7SUFFN0UsTUFBTSxXQUFZLFNBQVEsZ0JBQWdCO1FBTXhDLEtBQUssQ0FBQyxLQUFLO1lBQ1QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxNQUFNLG9CQUFvQixHQUFHLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUV4RSxrQ0FBa0M7WUFDbEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztnQkFDdkIsb0VBQW9FO2dCQUNwRSxNQUFN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QztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RhbnRzLCB0eXBlIERpcmVudCB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHtcbiAgYWNjZXNzLFxuICBjb3B5RmlsZSxcbiAgbWtkaXIsXG4gIHJlYWRkaXIsXG4gIHJlYWxwYXRoLFxuICBybSxcbiAgc3RhdCxcbiAgd3JpdGVGaWxlLFxufSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGV4dG5hbWUsIGlzQWJzb2x1dGUsIGpvaW4sIHJlbGF0aXZlLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB0eXBlIHtcbiAgTmV4dENvbmZpZyBhcyBCdWlsZGVyTmV4dENvbmZpZyxcbiAgV29ya2Zsb3dNYW5pZmVzdCxcbn0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCBjaG9raWRhciBmcm9tICdjaG9raWRhcic7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgYXMgUHJvamVjdE5leHRDb25maWcgfSBmcm9tICduZXh0JztcbmltcG9ydCB7IGNyZWF0ZVdhdGNoSWdub3JlUHJlZGljYXRlIH0gZnJvbSAnLi93YXRjaC1pZ25vcmUuanMnO1xuaW1wb3J0IHtcbiAgY2xhc3NpZnlSZWJ1aWxkLFxuICBjcmVhdGVTb3VyY2VTbmFwc2hvdCxcbiAgdHlwZSBGaWxlQ2hhbmdlcyxcbiAgZ2V0UmVsZXZhbnRGaWxlcyxcbiAgcmVwbGFjZVNvdXJjZVNuYXBzaG90cyxcbiAgdHlwZSBTb3VyY2VTbmFwc2hvdCxcbn0gZnJvbSAnLi93YXRjaC1yZWJ1aWxkLmpzJztcblxubGV0IENhY2hlZE5leHRCdWlsZGVyRWFnZXI6IGFueTtcbmNvbnN0IGltcG9ydEVzbSA9IG5ldyBGdW5jdGlvbignc3BlY2lmaWVyJywgJ3JldHVybiBpbXBvcnQoc3BlY2lmaWVyKScpIGFzIDxUPihcbiAgc3BlY2lmaWVyOiBzdHJpbmdcbikgPT4gUHJvbWlzZTxUPjtcblxuLy8gQ3JlYXRlIHRoZSBlYWdlciBOZXh0IGJ1aWxkZXIgZHluYW1pY2FsbHkgYnkgZXh0ZW5kaW5nIHRoZSBFU00gQmFzZUJ1aWxkZXIuXG4vLyBFeHBvcnRlZCBhcyBnZXROZXh0QnVpbGRlckVhZ2VyKCkgdG8gYWxsb3cgQ29tbW9uSlMgbW9kdWxlcyB0byBpbXBvcnQgZnJvbVxuLy8gdGhlIEVTTSBAd29ya2Zsb3cvYnVpbGRlcnMgcGFja2FnZSB2aWEgZHluYW1pYyBpbXBvcnQgYXQgcnVudGltZS5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlckVhZ2VyKFxuICBidWlsZGVyc01vZHVsZT86IHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpXG4pIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRWFnZXIpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBCYXNlQnVpbGRlcjogQmFzZUJ1aWxkZXJDbGFzcyxcbiAgICBnZXRXb3JrZmxvd1F1ZXVlVHJpZ2dlcixcbiAgICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zLFxuICAgIHBhcmVudEhhc0NoaWxkLFxuICB9ID0gYnVpbGRlcnNNb2R1bGUgPz9cbiAgKGF3YWl0IGltcG9ydEVzbTx0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKT4oJ0B3b3JrZmxvdy9idWlsZGVycycpKTtcblxuICBjbGFzcyBOZXh0QnVpbGRlciBleHRlbmRzIEJhc2VCdWlsZGVyQ2xhc3Mge1xuICAgIHByb3RlY3RlZCBkZWNsYXJlIGNvbmZpZzogQnVpbGRlck5leHRDb25maWcgJiB7XG4gICAgICBwYWdlRXh0ZW5zaW9uczogTm9uTnVsbGFibGU8UHJvamVjdE5leHRDb25maWdbJ3BhZ2VFeHRlbnNpb25zJ10+O1xuICAgICAgZGlzdERpcjogc3RyaW5nO1xuICAgIH07XG5cbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG5cbiAgICAgIC8vIEVuc3VyZSBvdXRwdXQgZGlyZWN0b3JpZXMgZXhpc3RcbiAgICAgIGF3YWl0IG1rZGlyKHdvcmtmbG93R2VuZXJhdGVkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGlmICghdGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgICAgLy8gUHJvZHVjdGlvbiBidWlsZCBjYWNoZXMgbWF5IHN0aWxsIGNvbnRhaW4gdGhlIHJldGlyZWQgc3RlcCByb3V0ZS5cbiAgICAgICAgYXdhaXQgcm0oam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3N0ZXAnKSwge1xuICAgICAgICAgIHJlY3Vyc2l2ZTogdHJ1ZSxcbiAgICAgICAgICBmb3JjZTogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJy5naXRpZ25vcmUnKSwgJyonKTtcblxuICAgICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHRoaXMuZ2V0SW5wdXRGaWxlcygpO1xuICAgICAgY29uc3QgdHNjb25maWdQYXRoID0gYXdhaXQgdGhpcy5maW5kVHNDb25maWdQYXRoKCk7XG5cbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGlucHV0RmlsZXMsXG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9O1xuXG4gICAgICAvLyBWMjogQnVpbGQgY29tYmluZWQgcm91dGUgKHJlcGxhY2VzIHNlcGFyYXRlIHN0ZXAgKyBmbG93IHJvdXRlcylcbiAgICAgIGNvbnN0IGNvbWJpbmVkUmVzdWx0ID0gYXdhaXQgdGhpcy5idWlsZENvbWJpbmVkRnVuY3Rpb24ob3B0aW9ucyk7XG4gICAgICBhd2FpdCB0aGlzLmJ1aWxkV2ViaG9va1JvdXRlKHsgd29ya2Zsb3dHZW5lcmF0ZWREaXIgfSk7XG5cbiAgICAgIGNvbnN0IHdyaXRlTWFuaWZlc3QgPSBhc3luYyAoXG4gICAgICAgIHNvdXJjZU1hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0IHwgdW5kZWZpbmVkXG4gICAgICApID0+IHtcbiAgICAgICAgY29uc3QgbWFuaWZlc3QgPSB7XG4gICAgICAgICAgc3RlcHM6IHsgLi4uc291cmNlTWFuaWZlc3Q/LnN0ZXBzIH0sXG4gICAgICAgICAgd29ya2Zsb3dzOiB7IC4uLnNvdXJjZU1hbmlmZXN0Py53b3JrZmxvd3MgfSxcbiAgICAgICAgICBjbGFzc2VzOiB7IC4uLnNvdXJjZU1hbmlmZXN0Py5jbGFzc2VzIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gV3JpdGUgbWFuaWZlc3RcbiAgICAgICAgY29uc3Qgd29ya2Zsb3dCdW5kbGVQYXRoID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cvcm91dGUuanMnKTtcbiAgICAgICAgY29uc3QgbWFuaWZlc3RKc29uID0gYXdhaXQgdGhpcy5jcmVhdGVNYW5pZmVzdCh7XG4gICAgICAgICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgICAgICAgIG1hbmlmZXN0RGlyOiB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgICBtYW5pZmVzdCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXhwb3NlIG1hbmlmZXN0IGFzIGEgc3RhdGljIGZpbGUgd2hlbiBXT1JLRkxPV19QVUJMSUNfTUFOSUZFU1Q9MS5cbiAgICAgICAgaWYgKHRoaXMuc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QgJiYgbWFuaWZlc3RKc29uKSB7XG4gICAgICAgICAgY29uc3QgcHVibGljTWFuaWZlc3REaXIgPSBqb2luKFxuICAgICAgICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICAgICAgICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEnXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhd2FpdCBta2RpcihwdWJsaWNNYW5pZmVzdERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHB1YmxpY01hbmlmZXN0RGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBhd2FpdCBjb3B5RmlsZShcbiAgICAgICAgICAgIGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdtYW5pZmVzdC5qc29uJyksXG4gICAgICAgICAgICBqb2luKHB1YmxpY01hbmlmZXN0RGlyLCAnbWFuaWZlc3QuanNvbicpXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgYXdhaXQgd3JpdGVNYW5pZmVzdChjb21iaW5lZFJlc3VsdD8ubWFuaWZlc3QpO1xuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlRnVuY3Rpb25zQ29uZmlnKG91dHB1dERpcik7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy53YXRjaCkge1xuICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgd2F0Y2ggbW9kZSBmb3IgY29tYmluZWQgYnVuZGxlXG4gICAgICAgIC8vIEZvciBub3csIGZhbGwgYmFjayB0byBmdWxsIHJlYnVpbGQgb24gZmlsZSBjaGFuZ2VzXG4gICAgICAgIGlmICghY29tYmluZWRSZXN1bHQ/LmludGVyaW1CdW5kbGVDdHggfHwgIWNvbWJpbmVkUmVzdWx0LmJ1bmRsZUZpbmFsKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0ludmFyaWFudDogZXhwZWN0ZWQgd29ya2Zsb3cgYnVpbGQgY29udGV4dCBpbiB3YXRjaCBtb2RlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTdGVwIHJlZ2lzdHJhdGlvbnMgbWF5IGJlIGVtaXR0ZWQgYXMgc291cmNlIGltcG9ydHMgd2l0aG91dCBhblxuICAgICAgICAvLyBlc2J1aWxkIGNvbnRleHQgd2hlbiBleHRlcm5hbGl6ZU5vblN0ZXBzIGlzIGVuYWJsZWQuXG4gICAgICAgIGxldCBzdGVwc0N0eCA9IGNvbWJpbmVkUmVzdWx0LnN0ZXBzQ29udGV4dDtcbiAgICAgICAgbGV0IHdvcmtmbG93c0N0eCA9IHtcbiAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiBjb21iaW5lZFJlc3VsdC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgIGJ1bmRsZUZpbmFsOiBjb21iaW5lZFJlc3VsdC5idW5kbGVGaW5hbCxcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHdvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQgPVxuICAgICAgICAgIGNvbWJpbmVkUmVzdWx0LndvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQ7XG4gICAgICAgIGxldCBkaXNjb3ZlcmVkRW50cmllcyA9IGNvbWJpbmVkUmVzdWx0LmRpc2NvdmVyZWRFbnRyaWVzO1xuICAgICAgICBsZXQgc3RlcHNNYW5pZmVzdCA9IGNvbWJpbmVkUmVzdWx0LnN0ZXBzTWFuaWZlc3Q7XG4gICAgICAgIGxldCB3b3JrZmxvd3NNYW5pZmVzdCA9IGNvbWJpbmVkUmVzdWx0LndvcmtmbG93c01hbmlmZXN0O1xuICAgICAgICBjb25zdCBzdGVwc091dGZpbGUgPSBqb2luKFxuICAgICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAgICdmbG93JyxcbiAgICAgICAgICAnX19zdGVwX3JlZ2lzdHJhdGlvbnMuanMnXG4gICAgICAgICk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplUGF0aCA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICAgIChpc0Fic29sdXRlKHBhdGhuYW1lKVxuICAgICAgICAgICAgPyBwYXRobmFtZVxuICAgICAgICAgICAgOiByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHBhdGhuYW1lKVxuICAgICAgICAgICkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBjb25zdCBzb3VyY2VTbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hhYmxlRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAgICAgICAgICcuanMnLFxuICAgICAgICAgICcuanN4JyxcbiAgICAgICAgICAnLnRzJyxcbiAgICAgICAgICAnLnRzeCcsXG4gICAgICAgICAgJy5tdHMnLFxuICAgICAgICAgICcuY3RzJyxcbiAgICAgICAgICAnLmNqcycsXG4gICAgICAgICAgJy5tanMnLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEdlbmVyYXRlZERpciA9IHdvcmtmbG93R2VuZXJhdGVkRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZERpc3REaXIgPSBub3JtYWxpemVQYXRoKHRoaXMuY29uZmlnLmRpc3REaXIpO1xuXG4gICAgICAgIC8vIFBydW5lIHRoZSBkZXYgd2F0Y2ggc2V0IHRvIGtlZXAgY2hva2lkYXIgZnJvbSByZWdpc3RlcmluZyBhblxuICAgICAgICAvLyBmcy53YXRjaCBwZXIgZGlyZWN0b3J5IGFjcm9zcyB0aGUgd2hvbGUgcHJvamVjdCB0cmVlIChjaG9raWRhciA0XG4gICAgICAgIC8vIGRyb3BwZWQgZnNldmVudHMsIHNvIG9uIG1hY09TIHRoYXQgZXhoYXVzdHMgdGhlIGZkIGxpbWl0IC0+IEVNRklMRVxuICAgICAgICAvLyBvbiBsYXJnZSBtb25vcmVwb3MpLiBUaGlzIGhvbm9ycyBgLmdpdGlnbm9yZWAgYW5kIHRoZVxuICAgICAgICAvLyBXT1JLRkxPV19ERVZfV0FUQ0hfSUdOT1JFRF9QQVRIUyBlbnYgdmFyIGluIGFkZGl0aW9uIHRvIHRoZVxuICAgICAgICAvLyBidWlsdC1pbiBmcmFnbWVudHMuIFRoZSBnZW5lcmF0ZWQgd29ya2Zsb3cgZGlyIGlzIHBhc3NlZCBhcyBhblxuICAgICAgICAvLyBleHRyYSBmcmFnbWVudCBzbyBpdCBpcyBwcnVuZWQgcmVnYXJkbGVzcyBvZiBgLmdpdGlnbm9yZWAuXG4gICAgICAgIGNvbnN0IGlzSWdub3JlZFdhdGNoUGF0aCA9IGNyZWF0ZVdhdGNoSWdub3JlUHJlZGljYXRlKHtcbiAgICAgICAgICB3b3JraW5nRGlyOiB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgIHByb2plY3RSb290OiB0aGlzLnRyYW5zZm9ybVByb2plY3RSb290LFxuICAgICAgICAgIGV4dHJhRnJhZ21lbnRzOiBbbm9ybWFsaXplZEdlbmVyYXRlZERpcl0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQgPSAobm9ybWFsaXplZFBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRoID09PSBub3JtYWxpemVkRGlzdERpciB8fFxuICAgICAgICAgICAgbm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChgJHtub3JtYWxpemVkRGlzdERpcn0vYClcbiAgICAgICAgICApIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaXNJZ25vcmVkV2F0Y2hQYXRoKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcmVidWlsZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgY29uc3QgZW5xdWV1ZSA9ICh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiB7XG4gICAgICAgICAgcmVidWlsZFF1ZXVlID0gcmVidWlsZFF1ZXVlLnRoZW4odGFzaykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcHJvY2VzcyBmaWxlIGNoYW5nZScsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVidWlsZFF1ZXVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlYWRTb3VyY2VTbmFwc2hvdCA9IChmaWxlOiBzdHJpbmcpID0+XG4gICAgICAgICAgY3JlYXRlU291cmNlU25hcHNob3QoeyBmaWxlLCBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlZnJlc2hTb3VyY2VTbmFwc2hvdHMgPSAoKSA9PlxuICAgICAgICAgIHJlcGxhY2VTb3VyY2VTbmFwc2hvdHMoe1xuICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICBpbnB1dEZpbGVzOiBvcHRpb25zLmlucHV0RmlsZXMsXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgICAgICAgcmVhZFNuYXBzaG90OiByZWFkU291cmNlU25hcHNob3QsXG4gICAgICAgICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgbWVyZ2VDb21iaW5lZE1hbmlmZXN0ID0gKFxuICAgICAgICAgIG5leHRTdGVwc01hbmlmZXN0OiBXb3JrZmxvd01hbmlmZXN0XG4gICAgICAgICk6IFdvcmtmbG93TWFuaWZlc3QgPT4gKHtcbiAgICAgICAgICAuLi5uZXh0U3RlcHNNYW5pZmVzdCxcbiAgICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICAgIC4uLm5leHRTdGVwc01hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgICAgIC4uLndvcmtmbG93c01hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgICAgIC4uLm5leHRTdGVwc01hbmlmZXN0LmNsYXNzZXMsXG4gICAgICAgICAgICAuLi53b3JrZmxvd3NNYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IGhvdFJlYnVpbGQgPSBhc3luYyAocmVmcmVzaFN0ZXBSZWdpc3RyYXRpb25zOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9ucykge1xuICAgICAgICAgICAgaWYgKHN0ZXBzQ3R4KSB7XG4gICAgICAgICAgICAgIGF3YWl0IHN0ZXBzQ3R4LnJlYnVpbGQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHN0ZXBzTWFuaWZlc3QgPSBhd2FpdCB0aGlzLmNyZWF0ZVN0ZXBTb3VyY2VSZWdpc3RyYXRpb25GaWxlKHtcbiAgICAgICAgICAgICAgICBpbnB1dEZpbGVzOiBvcHRpb25zLmlucHV0RmlsZXMsXG4gICAgICAgICAgICAgICAgb3V0ZmlsZTogc3RlcHNPdXRmaWxlLFxuICAgICAgICAgICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgICAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dSZXN1bHQgPSBhd2FpdCB3b3JrZmxvd3NDdHguaW50ZXJpbUJ1bmRsZUN0eC5yZWJ1aWxkKCk7XG4gICAgICAgICAgY29uc3Qgd29ya2Zsb3dPdXRwdXQgPSB3b3JrZmxvd1Jlc3VsdC5vdXRwdXRGaWxlcz8uWzBdPy50ZXh0O1xuICAgICAgICAgIGlmICghd29ya2Zsb3dPdXRwdXQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFyaWFudDogZXhwZWN0ZWQgd29ya2Zsb3cgb3V0cHV0IGZyb20gaG90IHJlYnVpbGQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHdvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQgPSB3b3JrZmxvd091dHB1dDtcbiAgICAgICAgICBhd2FpdCB3b3JrZmxvd3NDdHguYnVuZGxlRmluYWwod29ya2Zsb3dPdXRwdXQpO1xuICAgICAgICAgIGF3YWl0IHdyaXRlTWFuaWZlc3QobWVyZ2VDb21iaW5lZE1hbmlmZXN0KHN0ZXBzTWFuaWZlc3QpKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmdWxsUmVidWlsZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IG5ld0lucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgICAgICBvcHRpb25zLmlucHV0RmlsZXMgPSBuZXdJbnB1dEZpbGVzO1xuXG4gICAgICAgICAgYXdhaXQgc3RlcHNDdHg/LmRpc3Bvc2UoKTtcbiAgICAgICAgICBhd2FpdCB3b3JrZmxvd3NDdHguaW50ZXJpbUJ1bmRsZUN0eC5kaXNwb3NlKCk7XG5cbiAgICAgICAgICBjb25zdCBuZXdDb21iaW5lZCA9IGF3YWl0IHRoaXMuYnVpbGRDb21iaW5lZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIHN0ZXBzQ3R4ID0gbmV3Q29tYmluZWQuc3RlcHNDb250ZXh0O1xuICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzID0gbmV3Q29tYmluZWQuZGlzY292ZXJlZEVudHJpZXM7XG4gICAgICAgICAgc3RlcHNNYW5pZmVzdCA9IG5ld0NvbWJpbmVkLnN0ZXBzTWFuaWZlc3Q7XG4gICAgICAgICAgd29ya2Zsb3dzTWFuaWZlc3QgPSBuZXdDb21iaW5lZC53b3JrZmxvd3NNYW5pZmVzdDtcbiAgICAgICAgICB3b3JrZmxvd0ludGVyaW1CdW5kbGVUZXh0ID0gbmV3Q29tYmluZWQud29ya2Zsb3dJbnRlcmltQnVuZGxlVGV4dDtcblxuICAgICAgICAgIGlmICghbmV3Q29tYmluZWQ/LmludGVyaW1CdW5kbGVDdHggfHwgIW5ld0NvbWJpbmVkPy5idW5kbGVGaW5hbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCB3b3JrZmxvd3MgYnVuZGxlIGNvbnRleHQgYWZ0ZXIgcmVidWlsZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdvcmtmbG93c0N0eCA9IHtcbiAgICAgICAgICAgIGludGVyaW1CdW5kbGVDdHg6IG5ld0NvbWJpbmVkLmludGVyaW1CdW5kbGVDdHgsXG4gICAgICAgICAgICBidW5kbGVGaW5hbDogbmV3Q29tYmluZWQuYnVuZGxlRmluYWwsXG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGF3YWl0IHdyaXRlTWFuaWZlc3QobmV3Q29tYmluZWQubWFuaWZlc3QpO1xuICAgICAgICAgIGF3YWl0IHJlZnJlc2hTb3VyY2VTbmFwc2hvdHMoKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBpc1dhdGNoYWJsZUZpbGUgPSAocGF0aDogc3RyaW5nKSA9PlxuICAgICAgICAgIHdhdGNoYWJsZUV4dGVuc2lvbnMuaGFzKGV4dG5hbWUocGF0aCkpO1xuXG4gICAgICAgIGNvbnN0IHJlYWRLbm93bkZpbGVzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGZpbGVzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgY29uc3QgYWxpYXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG4gICAgICAgICAgY29uc3QgcmVsZXZhbnRGaWxlcyA9IGdldFJlbGV2YW50RmlsZXMoe1xuICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICBpbnB1dEZpbGVzOiBvcHRpb25zLmlucHV0RmlsZXMsXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY29uc3QgYWRkS25vd25GaWxlID0gYXN5bmMgKGZpbGVQYXRoOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGxldCByZWFsRmlsZVBhdGggPSBmaWxlUGF0aDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIHJlYWxGaWxlUGF0aCA9IG5vcm1hbGl6ZVBhdGgoYXdhaXQgcmVhbHBhdGgoZmlsZVBhdGgpKTtcbiAgICAgICAgICAgIH0gY2F0Y2gge31cblxuICAgICAgICAgICAgY29uc3QgY2Fub25pY2FsUGF0aCA9IHJlbGV2YW50RmlsZXMuaGFzKHJlYWxGaWxlUGF0aClcbiAgICAgICAgICAgICAgPyByZWFsRmlsZVBhdGhcbiAgICAgICAgICAgICAgOiBmaWxlUGF0aDtcbiAgICAgICAgICAgIGZpbGVzLmFkZChjYW5vbmljYWxQYXRoKTtcbiAgICAgICAgICAgIGFsaWFzZXMuc2V0KGZpbGVQYXRoLCBjYW5vbmljYWxQYXRoKTtcbiAgICAgICAgICAgIGFsaWFzZXMuc2V0KHJlYWxGaWxlUGF0aCwgY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgICByZXR1cm4gY2Fub25pY2FsUGF0aDtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgY29uc3QgdmlzaXQgPSBhc3luYyAoZGlyZWN0b3J5OiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+ID0+IHtcbiAgICAgICAgICAgIGxldCBkaXJlbnRzOiBEaXJlbnQ8c3RyaW5nPltdO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgZGlyZW50cyA9IGF3YWl0IHJlYWRkaXIoZGlyZWN0b3J5LCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgZGlyZW50cy5tYXAoYXN5bmMgKGRpcmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGZpbGVQYXRoID0gbm9ybWFsaXplUGF0aChqb2luKGRpcmVjdG9yeSwgZGlyZW50Lm5hbWUpKTtcbiAgICAgICAgICAgICAgICBpZiAoaGFzSWdub3JlZFBhdGhGcmFnbWVudChmaWxlUGF0aCkpIHtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoZGlyZW50LmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgICAgICAgIGF3YWl0IHZpc2l0KGZpbGVQYXRoKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgc3RhdHM6IEF3YWl0ZWQ8UmV0dXJuVHlwZTx0eXBlb2Ygc3RhdD4+O1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICBzdGF0cyA9IGF3YWl0IHN0YXQoZmlsZVBhdGgpO1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICAgICAgICBhd2FpdCB2aXNpdChmaWxlUGF0aCk7XG4gICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFzdGF0cy5pc0ZpbGUoKSB8fCAhaXNXYXRjaGFibGVGaWxlKGZpbGVQYXRoKSkge1xuICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF3YWl0IGFkZEtub3duRmlsZShmaWxlUGF0aCk7XG4gICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH07XG5cbiAgICAgICAgICBhd2FpdCB2aXNpdCh0aGlzLmNvbmZpZy53b3JraW5nRGlyKTtcbiAgICAgICAgICByZXR1cm4geyBmaWxlcywgYWxpYXNlcywgYWRkS25vd25GaWxlIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbWVyZ2VGaWxlQ2hhbmdlcyA9IChcbiAgICAgICAgICBsZWZ0OiBGaWxlQ2hhbmdlcyxcbiAgICAgICAgICByaWdodDogRmlsZUNoYW5nZXNcbiAgICAgICAgKTogRmlsZUNoYW5nZXMgPT4gKHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiB1bmlxdWUoWy4uLmxlZnQuYWRkZWRGaWxlcywgLi4ucmlnaHQuYWRkZWRGaWxlc10pLFxuICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi5sZWZ0Lm1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgICAuLi5yaWdodC5tb2RpZmllZEZpbGVzLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIHJlbW92ZWRGaWxlczogdW5pcXVlKFsuLi5sZWZ0LnJlbW92ZWRGaWxlcywgLi4ucmlnaHQucmVtb3ZlZEZpbGVzXSksXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHVuaXF1ZSA9IChwYXRoczogc3RyaW5nW10pID0+IFsuLi5uZXcgU2V0KHBhdGhzKV07XG5cbiAgICAgICAgY29uc3QgY2xhc3NpZnlGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgY2hhbmdlZEZpbGVzLFxuICAgICAgICAgIGtub3duRmlsZXMsXG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICBrbm93bkZpbGVzOiBTZXQ8c3RyaW5nPjtcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICB9KTogRmlsZUNoYW5nZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkRmlsZXM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgY29uc3QgbW9kaWZpZWRGaWxlczogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgZmlsZSBvZiB1bmlxdWUoY2hhbmdlZEZpbGVzKSkge1xuICAgICAgICAgICAgaWYgKGtub3duRmlsZXMuaGFzKGZpbGUpKSB7XG4gICAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGFkZGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgICAgICAga25vd25GaWxlcy5hZGQoZmlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBmaWxlIG9mIHJlbW92ZWRGaWxlcykge1xuICAgICAgICAgICAga25vd25GaWxlcy5kZWxldGUoZmlsZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZGVkRmlsZXMsXG4gICAgICAgICAgICBtb2RpZmllZEZpbGVzLFxuICAgICAgICAgICAgcmVtb3ZlZEZpbGVzOiB1bmlxdWUocmVtb3ZlZEZpbGVzKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhc0ZpbGVDaGFuZ2VzID0gKHtcbiAgICAgICAgICBhZGRlZEZpbGVzLFxuICAgICAgICAgIG1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLFxuICAgICAgICB9OiBGaWxlQ2hhbmdlcykgPT5cbiAgICAgICAgICBhZGRlZEZpbGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzLmxlbmd0aCA+IDAgfHxcbiAgICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID4gMDtcbiAgICAgICAgY29uc3Qgc3RlcEV4ZWN1dGlvbkZpbGVzQ2hhbmdlZCA9IChmaWxlQ2hhbmdlczogRmlsZUNoYW5nZXMpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGVwRW50cnlGaWxlcyA9IFsuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU3RlcHNdLm1hcChcbiAgICAgICAgICAgIG5vcm1hbGl6ZVBhdGhcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChzdGVwRW50cnlGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgY2hhbmdlZEZpbGVzID0gdW5pcXVlKFtcbiAgICAgICAgICAgIC4uLmZpbGVDaGFuZ2VzLm1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgICAuLi5maWxlQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgICAgICAgICAgLi4uZmlsZUNoYW5nZXMucmVtb3ZlZEZpbGVzLFxuICAgICAgICAgIF0pLm1hcChub3JtYWxpemVQYXRoKTtcblxuICAgICAgICAgIHJldHVybiBjaGFuZ2VkRmlsZXMuc29tZShcbiAgICAgICAgICAgIChjaGFuZ2VkRmlsZSkgPT5cbiAgICAgICAgICAgICAgc3RlcEVudHJ5RmlsZXMuaW5jbHVkZXMoY2hhbmdlZEZpbGUpIHx8XG4gICAgICAgICAgICAgIHN0ZXBFbnRyeUZpbGVzLnNvbWUoKHN0ZXBGaWxlKSA9PlxuICAgICAgICAgICAgICAgIHBhcmVudEhhc0NoaWxkKHN0ZXBGaWxlLCBjaGFuZ2VkRmlsZSlcbiAgICAgICAgICAgICAgKVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGxvZ0RldkhtciA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuV09SS0ZMT1dfREVWX0hNUl9MT0dTID09PSAnMScpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBhd2FpdCByZWZyZXNoU291cmNlU25hcHNob3RzKCk7XG4gICAgICAgIGxldCB7XG4gICAgICAgICAgZmlsZXM6IGtub3duRmlsZXMsXG4gICAgICAgICAgYWxpYXNlczoga25vd25GaWxlQWxpYXNlcyxcbiAgICAgICAgICBhZGRLbm93bkZpbGU6IHJlbWVtYmVyS25vd25GaWxlLFxuICAgICAgICB9ID0gYXdhaXQgcmVhZEtub3duRmlsZXMoKTtcblxuICAgICAgICBjb25zdCByZWZyZXNoS25vd25GaWxlcyA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBuZXh0S25vd24gPSBhd2FpdCByZWFkS25vd25GaWxlcygpO1xuICAgICAgICAgIGtub3duRmlsZXMgPSBuZXh0S25vd24uZmlsZXM7XG4gICAgICAgICAga25vd25GaWxlQWxpYXNlcyA9IG5leHRLbm93bi5hbGlhc2VzO1xuICAgICAgICAgIHJlbWVtYmVyS25vd25GaWxlID0gbmV4dEtub3duLmFkZEtub3duRmlsZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBwcm9jZXNzRmlsZUNoYW5nZXMgPSBhc3luYyAoZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgaWYgKCFoYXNGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkZWNpc2lvbiA9IGF3YWl0IGNsYXNzaWZ5UmVidWlsZCh7XG4gICAgICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgICAgIGZpbGVDaGFuZ2VzLFxuICAgICAgICAgICAgaW5wdXRGaWxlczogb3B0aW9ucy5pbnB1dEZpbGVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICAgIHBhcmVudEhhc0NoaWxkLFxuICAgICAgICAgICAgcmVhZFNuYXBzaG90OiByZWFkU291cmNlU25hcHNob3QsXG4gICAgICAgICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGRlY2lzaW9uLmtpbmQgPT09ICdub25lJykge1xuICAgICAgICAgICAgbG9nRGV2SG1yKCd3b3JrZmxvdyBkZXYgaG1yOiBza2lwJyk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IFtmaWxlLCBzbmFwc2hvdF0gb2YgZGVjaXNpb24uc25hcHNob3RzIHx8IFtdKSB7XG4gICAgICAgICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgc25hcHNob3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAhc3RlcHNDdHggJiZcbiAgICAgICAgICAgICAgd29ya2Zsb3dJbnRlcmltQnVuZGxlVGV4dCAmJlxuICAgICAgICAgICAgICBzdGVwRXhlY3V0aW9uRmlsZXNDaGFuZ2VkKGZpbGVDaGFuZ2VzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIC8vIFNvdXJjZSBzdGVwIHJlZ2lzdHJhdGlvbnMga2VlcCBzdGFibGUgaW1wb3J0cywgc28gVHVyYm9wYWNrXG4gICAgICAgICAgICAgIC8vIGNhbiBsZWF2ZSB0aGUgZ2VuZXJhdGVkIGZsb3cgcm91dGUgY2FjaGVkIGFmdGVyIGFcbiAgICAgICAgICAgICAgLy8gc3RlcC1ib2R5LW9ubHkgZWRpdC4gUmVmcmVzaCB0aGUgcm91dGUgd3JhcHBlciB3aXRob3V0XG4gICAgICAgICAgICAgIC8vIHJlZGlzY292ZXJpbmcgZW50cmllcyBvciByZWJ1aWxkaW5nIHRoZSB3b3JrZmxvdyBWTS5cbiAgICAgICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmJ1bmRsZUZpbmFsKHdvcmtmbG93SW50ZXJpbUJ1bmRsZVRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoZGVjaXNpb24ua2luZCA9PT0gJ2Z1bGwnKSB7XG4gICAgICAgICAgICBsb2dEZXZIbXIoJ3dvcmtmbG93IGRldiBobXI6IGZ1bGwgcmVkaXNjb3ZlcnknKTtcbiAgICAgICAgICAgIGF3YWl0IGZ1bGxSZWJ1aWxkKCk7XG4gICAgICAgICAgICBhd2FpdCByZWZyZXNoS25vd25GaWxlcygpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGxvZ0RldkhtcihcbiAgICAgICAgICAgIGB3b3JrZmxvdyBkZXYgaG1yOiBob3QgcmVidWlsZCR7ZGVjaXNpb24ucmVmcmVzaFN0ZXBSZWdpc3RyYXRpb25zID8gJyB3aXRoIHN0ZXAgcmVnaXN0cmF0aW9uIHJlZnJlc2gnIDogJyd9YFxuICAgICAgICAgICk7XG4gICAgICAgICAgYXdhaXQgaG90UmVidWlsZChkZWNpc2lvbi5yZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnMpO1xuICAgICAgICAgIGZvciAoY29uc3QgW2ZpbGUsIHNuYXBzaG90XSBvZiBkZWNpc2lvbi5zbmFwc2hvdHMpIHtcbiAgICAgICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgc25hcHNob3QpO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcGVuZGluZ0ZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiBbXSxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiBbXSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICB9O1xuICAgICAgICBsZXQgZmx1c2hUaW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD4gfCB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgc2NoZWR1bGVGaWxlQ2hhbmdlcyA9IChmaWxlQ2hhbmdlczogRmlsZUNoYW5nZXMpID0+IHtcbiAgICAgICAgICBwZW5kaW5nRmlsZUNoYW5nZXMgPSBtZXJnZUZpbGVDaGFuZ2VzKFxuICAgICAgICAgICAgcGVuZGluZ0ZpbGVDaGFuZ2VzLFxuICAgICAgICAgICAgZmlsZUNoYW5nZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChmbHVzaFRpbWVyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGZsdXNoVGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVDaGFuZ2VzID0gcGVuZGluZ0ZpbGVDaGFuZ2VzO1xuICAgICAgICAgICAgcGVuZGluZ0ZpbGVDaGFuZ2VzID0ge1xuICAgICAgICAgICAgICBhZGRlZEZpbGVzOiBbXSxcbiAgICAgICAgICAgICAgbW9kaWZpZWRGaWxlczogW10sXG4gICAgICAgICAgICAgIHJlbW92ZWRGaWxlczogW10sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgZmx1c2hUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGVucXVldWUoKCkgPT4gcHJvY2Vzc0ZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKSk7XG4gICAgICAgICAgfSwgMTApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlc29sdmVFeGlzdGluZ0V2ZW50UGF0aCA9IGFzeW5jIChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBrbm93blBhdGggPSBrbm93bkZpbGVBbGlhc2VzLmdldChub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgaWYgKGtub3duUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGtub3duUGF0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmVhbEZpbGVQYXRoID0gbm9ybWFsaXplUGF0aChhd2FpdCByZWFscGF0aChub3JtYWxpemVkUGF0aCkpO1xuICAgICAgICAgICAgcmV0dXJuIGtub3duRmlsZUFsaWFzZXMuZ2V0KHJlYWxGaWxlUGF0aCkgPz8gbm9ybWFsaXplZFBhdGg7XG4gICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGg7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGhhbmRsZUZpbGVBZGRlZCA9IGFzeW5jIChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBleGlzdGluZ1BhdGggPSBhd2FpdCByZXNvbHZlRXhpc3RpbmdFdmVudFBhdGgobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIGNvbnN0IHdhc0tub3duID0gZXhpc3RpbmdQYXRoID8ga25vd25GaWxlcy5oYXMoZXhpc3RpbmdQYXRoKSA6IGZhbHNlO1xuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBhd2FpdCByZW1lbWJlcktub3duRmlsZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAga25vd25GaWxlcy5hZGQoY2Fub25pY2FsUGF0aCk7XG4gICAgICAgICAgc2NoZWR1bGVGaWxlQ2hhbmdlcyh7XG4gICAgICAgICAgICBhZGRlZEZpbGVzOiB3YXNLbm93biA/IFtdIDogW2Nhbm9uaWNhbFBhdGhdLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlczogd2FzS25vd24gPyBbY2Fub25pY2FsUGF0aF0gOiBbXSxcbiAgICAgICAgICAgIHJlbW92ZWRGaWxlczogW10sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaGFuZGxlRmlsZUNoYW5nZWQgPSBhc3luYyAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgIGNvbnN0IGNhbm9uaWNhbFBhdGggPSBhd2FpdCByZXNvbHZlRXhpc3RpbmdFdmVudFBhdGgocGF0aG5hbWUpO1xuICAgICAgICAgIGlmICghY2Fub25pY2FsUGF0aCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGZpbGVDaGFuZ2VzID0gY2xhc3NpZnlGaWxlQ2hhbmdlcyh7XG4gICAgICAgICAgICBjaGFuZ2VkRmlsZXM6IFtjYW5vbmljYWxQYXRoXSxcbiAgICAgICAgICAgIGtub3duRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtdLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGlmICgha25vd25GaWxlQWxpYXNlcy5oYXMoY2Fub25pY2FsUGF0aCkpIHtcbiAgICAgICAgICAgIGF3YWl0IHJlbWVtYmVyS25vd25GaWxlKGNhbm9uaWNhbFBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzY2hlZHVsZUZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBoYW5kbGVGaWxlUmVtb3ZlZCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKHBhdGhuYW1lKTtcbiAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShub3JtYWxpemVkUGF0aCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjYW5vbmljYWxQYXRoID1cbiAgICAgICAgICAgIGtub3duRmlsZUFsaWFzZXMuZ2V0KG5vcm1hbGl6ZWRQYXRoKSA/PyBub3JtYWxpemVkUGF0aDtcbiAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IGNsYXNzaWZ5RmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgY2hhbmdlZEZpbGVzOiBbXSxcbiAgICAgICAgICAgIGtub3duRmlsZXMsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXM6IFtjYW5vbmljYWxQYXRoXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBrbm93bkZpbGVBbGlhc2VzLmRlbGV0ZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgc2NoZWR1bGVGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcyk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hlciA9IGNob2tpZGFyLndhdGNoKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIHtcbiAgICAgICAgICBpZ25vcmVJbml0aWFsOiB0cnVlLFxuICAgICAgICAgIGZvbGxvd1N5bWxpbmtzOiB0cnVlLFxuICAgICAgICAgIGlnbm9yZWQ6IChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBub3JtYWxpemVQYXRoKFN0cmluZyhwYXRobmFtZSkpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmICF3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGhhc0lnbm9yZWRQYXRoRnJhZ21lbnQobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHdhdGNoZXIub24oJ2FkZCcsIChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgIHZvaWQgaGFuZGxlRmlsZUFkZGVkKHBhdGhuYW1lKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ2NoYW5nZScsIChwYXRobmFtZSkgPT4ge1xuICAgICAgICAgIHZvaWQgaGFuZGxlRmlsZUNoYW5nZWQocGF0aG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2F0Y2hlci5vbigndW5saW5rJywgKHBhdGhuYW1lKSA9PiB7XG4gICAgICAgICAgaGFuZGxlRmlsZVJlbW92ZWQocGF0aG5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgd2F0Y2hlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdXb3JrZmxvdyBkZXYgd2F0Y2hlciBlcnJvcicsIGVycm9yKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHdhdGNoZXIub24oJ3JlYWR5JywgKCkgPT4ge1xuICAgICAgICAgIGxvZ0Rldkhtcignd29ya2Zsb3cgZGV2IGhtcjogcmVhZHknKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0RmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHN1cGVyLmdldElucHV0RmlsZXMoKTtcbiAgICAgIHJldHVybiBpbnB1dEZpbGVzLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlbGF0aXZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGZpbGUpLnJlcGxhY2VBbGwoXG4gICAgICAgICAgJ1xcXFwnLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hdGNoIEFwcCBSb3V0ZXIgcm91dGUsIHBhZ2UsIGFuZCBsYXlvdXQgZW50cnlwb2ludHMgaW4gYXBwLyBvciBzcmMvYXBwLy5cbiAgICAgICAgaWYgKC9eKD86YXBwfHNyY1xcL2FwcClcXC8oPzouKlxcLyk/KD86cm91dGV8cGFnZXxsYXlvdXQpXFwuLy50ZXN0KGVudHJ5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggZXZlcnkgUGFnZXMgUm91dGVyIGVudHJ5cG9pbnQgaW4gcGFnZXMvIG9yIHNyYy9wYWdlcy8uXG4gICAgICAgIGlmICgvXig/OnBhZ2VzfHNyY1xcL3BhZ2VzKVxcLy8udGVzdChlbnRyeSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIE5leHQuanMgcm9vdCBlbnRyeXBvaW50cyBhdCB0aGUgcHJvamVjdCByb290IG9yIHVuZGVyIHNyYy8uXG4gICAgICAgIHJldHVybiBbJ2luc3RydW1lbnRhdGlvbicsICdtaWRkbGV3YXJlJywgJ3Byb3h5J10uc29tZSgobmFtZSkgPT5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5wYWdlRXh0ZW5zaW9ucy5zb21lKFxuICAgICAgICAgICAgKGV4dGVuc2lvbikgPT5cbiAgICAgICAgICAgICAgZW50cnkgPT09IGAke25hbWV9LiR7ZXh0ZW5zaW9ufWAgfHxcbiAgICAgICAgICAgICAgZW50cnkgPT09IGBzcmMvJHtuYW1lfS4ke2V4dGVuc2lvbn1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXI6IHN0cmluZykge1xuICAgICAgLy8gd2UgZG9uJ3QgcnVuIHRoaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZSBhcyBpdCdzIG5vdCBuZWVkZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFYyIGNvbWJpbmVkIGNvbmZpZzogc2luZ2xlIHRyaWdnZXIgaGFuZGxlcyBib3RoIHdvcmtmbG93IGFuZCBzdGVwIGV4ZWN1dGlvbi5cbiAgICAgIC8vIFRoZSBzdGVwIHJvdXRlIG5vIGxvbmdlciBuZWVkcyBpdHMgb3duIHRyaWdnZXIgc2luY2Ugc3RlcHMgYXJlIGV4ZWN1dGVkXG4gICAgICAvLyBpbmxpbmUgYnkgdGhlIGNvbWJpbmVkIGhhbmRsZXIgb3IgcXVldWVkIGJhY2sgdG8gX193a2Zfd29ya2Zsb3dfKiB3aXRoIHN0ZXBJZC5cbiAgICAgIGNvbnN0IGdlbmVyYXRlZENvbmZpZyA9IHtcbiAgICAgICAgdmVyc2lvbjogJzAnLFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtnZXRXb3JrZmxvd1F1ZXVlVHJpZ2dlcigpXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShcbiAgICAgICAgam9pbihvdXRwdXREaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MS9jb25maWcuanNvbicpLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShnZW5lcmF0ZWRDb25maWcsIG51bGwsIDIpXG4gICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFYyOiBCdWlsZCBjb21iaW5lZCByb3V0ZSB0aGF0IGhhbmRsZXMgYm90aCB3b3JrZmxvdyBhbmQgc3RlcCBleGVjdXRpb24uXG4gICAgICovXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZENvbWJpbmVkRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICBjb25zdCBmbG93Um91dGVEaXIgPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdycpO1xuICAgICAgYXdhaXQgbWtkaXIoZmxvd1JvdXRlRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBzdGVwc091dGZpbGU6IGpvaW4oZmxvd1JvdXRlRGlyLCAnX19zdGVwX3JlZ2lzdHJhdGlvbnMuanMnKSxcbiAgICAgICAgZmxvd091dGZpbGU6IGpvaW4oZmxvd1JvdXRlRGlyLCAncm91dGUuanMnKSxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzOiB0cnVlLFxuICAgICAgICBzb3VyY2VTdGVwUmVnaXN0cmF0aW9uSW1wb3J0czogdHJ1ZSxcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFdlYmhvb2tSb3V0ZSh7XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICB9OiB7XG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcjogc3RyaW5nO1xuICAgIH0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgIGNvbnN0IHdlYmhvb2tSb3V0ZUZpbGUgPSBqb2luKFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgJ3dlYmhvb2svW3Rva2VuXS9yb3V0ZS5qcydcbiAgICAgICk7XG4gICAgICBhd2FpdCB0aGlzLmNyZWF0ZVdlYmhvb2tCdW5kbGUoe1xuICAgICAgICBvdXRmaWxlOiB3ZWJob29rUm91dGVGaWxlLFxuICAgICAgICBidW5kbGU6IGZhbHNlLCAvLyBOZXh0LmpzIGRvZXNuJ3QgbmVlZCBidW5kbGluZ1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBmaW5kQXBwRGlyZWN0b3J5KCk6IFByb21pc2U8c3RyaW5nPiB7XG4gICAgICBjb25zdCBhcHBEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdhcHAnKTtcbiAgICAgIGNvbnN0IHNyY0FwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3NyYy9hcHAnKTtcbiAgICAgIGNvbnN0IHBhZ2VzRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAncGFnZXMnKTtcbiAgICAgIGNvbnN0IHNyY1BhZ2VzRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL3BhZ2VzJyk7XG5cbiAgICAgIC8vIEhlbHBlciB0byBjaGVjayBpZiBhIHBhdGggZXhpc3RzIGFuZCBpcyBhIGRpcmVjdG9yeVxuICAgICAgY29uc3QgaXNEaXJlY3RvcnkgPSBhc3luYyAocGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgYXdhaXQgYWNjZXNzKHBhdGgsIGNvbnN0YW50cy5GX09LKTtcbiAgICAgICAgICBjb25zdCBzdGF0cyA9IGF3YWl0IHN0YXQocGF0aCk7XG4gICAgICAgICAgaWYgKCFzdGF0cy5pc0RpcmVjdG9yeSgpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFBhdGggZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3Rvcnk6ICR7cGF0aH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIEVycm9yICYmIGUubWVzc2FnZS5pbmNsdWRlcygnbm90IGEgZGlyZWN0b3J5JykpIHtcbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gQ2hlY2sgaWYgYXBwIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShhcHBEaXIpKSB7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIHNyYy9hcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHNyY0FwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIHNyY0FwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgbm8gYXBwIGRpcmVjdG9yeSBleGlzdHMsIGNoZWNrIGZvciBwYWdlcyBkaXJlY3RvcnkgYW5kIGNyZWF0ZSBhcHAgbmV4dCB0byBpdFxuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHBhZ2VzRGlyKSkge1xuICAgICAgICAvLyBDcmVhdGUgYXBwIGRpcmVjdG9yeSBuZXh0IHRvIHBhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihhcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gYXBwRGlyO1xuICAgICAgfVxuXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjUGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBzcmMvYXBwIGRpcmVjdG9yeSBuZXh0IHRvIHNyYy9wYWdlcyBkaXJlY3RvcnlcbiAgICAgICAgYXdhaXQgbWtkaXIoc3JjQXBwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHNyY0FwcERpcjtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnQ291bGQgbm90IGZpbmQgTmV4dC5qcyBhcHAgb3IgcGFnZXMgZGlyZWN0b3J5LiBFeHBlY3RlZCBvbmUgb2Y6IFwiYXBwXCIsIFwic3JjL2FwcFwiLCBcInBhZ2VzXCIsIG9yIFwic3JjL3BhZ2VzXCIgdG8gZXhpc3QuJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBDYWNoZWROZXh0QnVpbGRlckVhZ2VyID0gTmV4dEJ1aWxkZXI7XG4gIHJldHVybiBOZXh0QnVpbGRlcjtcbn1cbiJdfQ==
|
package/dist/index.js
CHANGED
|
@@ -279,8 +279,8 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
279
279
|
const workflowTargetWorld = (0, builders_1.ensureWorkflowTargetWorldEnv)();
|
|
280
280
|
if (workflowTargetWorld === '@workflow/world-local') {
|
|
281
281
|
process.env.WORKFLOW_LOCAL_DATA_DIR ??= '.next/workflow-data';
|
|
282
|
-
|
|
283
|
-
|
|
282
|
+
// `workflows.local.port` configures where the local world addresses its own
|
|
283
|
+
// queue callbacks, so it only applies when that world is the target.
|
|
284
284
|
const maybePort = workflows?.local?.port;
|
|
285
285
|
if (maybePort) {
|
|
286
286
|
process.env.PORT = maybePort.toString();
|
|
@@ -517,4 +517,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
517
517
|
return nextConfig;
|
|
518
518
|
};
|
|
519
519
|
}
|
|
520
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErVUEsb0NBdVRDO0FBdG9CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUN0RCxpREFPNEI7QUFFNUIsb0RBQTRCO0FBQzVCLDZDQUE4QztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBQ0YsTUFBTSxrQ0FBa0MsR0FBRztJQUN6QyxVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGNBQWM7Q0FDZixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0QsTUFBTSxZQUFZLEdBQUcsVUFDZSxDQUFDO0FBRXJD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LHVDQUE0Qjt3QkFDbEMsS0FBSyxFQUFFLCtCQUErQjtxQkFDdkM7aUJBQ0YsQ0FBQztZQUNKLENBQUM7aUJBQU0sQ0FBQztnQkFDTixhQUFhLENBQUMsT0FBTyxDQUFDLEtBQUssR0FBRztvQkFDNUIsR0FBRyxDQUFDLGFBQWEsSUFBSSxFQUFFLENBQUM7b0JBQ3hCLENBQUMsdUNBQTRCLENBQUMsRUFBRSwrQkFBK0I7aUJBQ2hFLENBQUM7WUFDSixDQUFDO1lBRUQsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQyxDQUFDO1FBQ0YseURBQXlEO1FBQ3pELHVEQUF1RDtRQUN2RCxJQUNFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkI7WUFDeEMsS0FBSyxLQUFLLHlCQUF5QixFQUNuQyxDQUFDO1lBQ0QsTUFBTSxlQUFlLEdBQUcsTUFBTSxrQkFBa0IsRUFBRSxDQUFDO1lBRW5ELE1BQU0sZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQzlCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEdBQUcsR0FBRyxDQUFDO1FBQ2hELENBQUM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUNwQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29weUZpbGVTeW5jLCBta2RpclN5bmMsIHN0YXRTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBjb3B5RmlsZSwgbWtkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIGVuc3VyZVdvcmtmbG93VGFyZ2V0V29ybGRFbnYsXG4gIGlzV29ya2Zsb3dUYXJnZXRXb3JsZFBhdGgsXG4gIHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3QsXG4gIHJlc29sdmVQcm9qZWN0Um9vdCxcbiAgcmVzb2x2ZVdvcmtmbG93VGFyZ2V0V29ybGRBbGlhcyxcbiAgV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSxcbn0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB0eXBlIHsgTmV4dENvbmZpZyB9IGZyb20gJ25leHQnO1xuaW1wb3J0IHNlbXZlciBmcm9tICdzZW12ZXInO1xuaW1wb3J0IHsgZ2V0TmV4dEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXIuanMnO1xuXG5jb25zdCBWRVJDRUxfV09STERfUEFDS0FHRSA9ICdAd29ya2Zsb3cvd29ybGQtdmVyY2VsJztcbmNvbnN0IFZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTID0gW1xuICAnQHZlcmNlbC9xdWV1ZScsXG4gICdAdmVyY2VsL29pZGMnLFxuICAnQHZlcmNlbC9jbGktYXV0aCcsXG4gICdAbmFwaS1ycy9rZXlyaW5nJyxcbl07XG5jb25zdCBWRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTID0gW1xuICBWRVJDRUxfV09STERfUEFDS0FHRSxcbiAgLi4uVkVSQ0VMX1dPUkxEX0RFUEVOREVOQ1lfUEFDS0FHRVMsXG5dO1xuY29uc3QgV09SS0ZMT1dfU0VSVkVSX1RSQU5TUElMRV9QQUNLQUdFUyA9IFtcbiAgJ3dvcmtmbG93JyxcbiAgJ0B3b3JrZmxvdy9jb3JlJyxcbiAgJ0B3b3JrZmxvdy9zZXJkZScsXG4gICdAd29ya2Zsb3cvZXJyb3JzJyxcbiAgJ0B3b3JrZmxvdy91dGlscycsXG4gICdAd29ya2Zsb3cvYWknLFxuXTtcbmNvbnN0IHVzZVdvcmtmbG93UGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugd29ya2Zsb3dcXDE7P1xccyokL207XG5jb25zdCB1c2VTdGVwUGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugc3RlcFxcMTs/XFxzKiQvbTtcbmNvbnN0IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuID0gL2Zyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwxLztcbmNvbnN0IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuID1cbiAgL1N5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDFcXHMqXFwpLztcbmNvbnN0IHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybiA9XG4gIC9cXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0vO1xuXG5jb25zdCBQU0VVRE9fRVhURVJOQUxfUEFDS0FHRVMgPSBuZXcgU2V0KFsnc2VydmVyLW9ubHknLCAnY2xpZW50LW9ubHknXSk7XG5jb25zdCB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IEJBU0VfUEFUSF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS9iYXNlUGF0aCcpO1xuY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmXG4gIFJlY29yZDxzeW1ib2wsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8vIEtlZXAgdGhpcyBsb2NhbDogQHdvcmtmbG93L25leHQgaXMgQ29tbW9uSlMsIHdoaWxlIEB3b3JrZmxvdy91dGlscyBpcyBFU00tb25seS5cbmZ1bmN0aW9uIHNldFdvcmtmbG93QmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBnbG9iYWxDb25maWdbQkFTRV9QQVRIX1NZTUJPTF0gPSBiYXNlUGF0aCA/PyAnJztcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2Uge1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnJCcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuaW5jbHVkZXMoJyonKSB8fCBzcGVjaWZpZXIuaW5jbHVkZXMoJzonKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZTogc3RyaW5nKTogV29ya2Zsb3dQYXR0ZXJuTWF0Y2gge1xuICBjb25zdCBoYXNVc2VXb3JrZmxvdyA9IHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1VzZVN0ZXAgPSB1c2VTdGVwUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlSW1wb3J0ID0gd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZVN5bWJvbCA9IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5ID1cbiAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChzb3VyY2UpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZTogaGFzU2VyZGVJbXBvcnQgfHwgaGFzU2VyZGVTeW1ib2wgfHwgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZDogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGRldGVjdGVkLmhhc1VzZVdvcmtmbG93KSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHdvcmtmbG93XCIgZnVuY3Rpb25zJyk7XG4gIH1cbiAgaWYgKGRldGVjdGVkLmhhc1VzZVN0ZXApIHtcbiAgICBpc3N1ZXMucHVzaCgnXCJ1c2Ugc3RlcFwiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNTZXJkZSkge1xuICAgIGlzc3Vlcy5wdXNoKCdzZXJpYWxpemF0aW9uIGNsYXNzZXMnKTtcbiAgfVxuICByZXR1cm4gaXNzdWVzO1xufVxuXG5mdW5jdGlvbiBoYXNXb3JrZmxvd1NlcmRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUGxhaW5PYmplY3QocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMpXG4gICAgPyBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llc1xuICAgIDoge307XG5cbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKGRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpIHx8XG4gICAgT2JqZWN0Lmhhc093bihwZWVyRGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJylcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8RGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UgfCBudWxsPiB7XG4gIGlmICghaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihwYWNrYWdlTmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBoYXNVc2VXb3JrZmxvdyA9IGZhbHNlO1xuICBsZXQgaGFzVXNlU3RlcCA9IGZhbHNlO1xuICBsZXQgaGFzU2VyZGUgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBwYWNrYWdlSnNvblNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uU291cmNlKSBhcyB1bmtub3duO1xuICAgIGhhc1NlcmRlID0gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBDb250aW51ZSB0byBzb3VyY2Ugc2Nhbm5pbmcuXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IHJlcXVpcmUucmVzb2x2ZShwYWNrYWdlTmFtZSwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgaGFzVXNlU3RlcCA9IHBhdHRlcm5zLmhhc1VzZVN0ZXA7XG4gICAgaGFzU2VyZGUgfHw9IHBhdHRlcm5zLmhhc1NlcmRlO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBVc2Ugd2hpY2hldmVyIHNpZ25hbCB3ZSBhbHJlYWR5IGhhdmUuXG4gIH1cblxuICBpZiAoIWhhc1VzZVdvcmtmbG93ICYmICFoYXNVc2VTdGVwICYmICFoYXNTZXJkZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZSxcbiAgICBoYXNVc2VXb3JrZmxvdyxcbiAgICBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoXG4gIGRldGVjdGVkUGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW11cbik6IHZvaWQge1xuICBjb25zdCBuZXdseURldGVjdGVkUGFja2FnZXMgPSBkZXRlY3RlZFBhY2thZ2VzLmZpbHRlcigoeyBwYWNrYWdlTmFtZSB9KSA9PiB7XG4gICAgcmV0dXJuICF3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKTtcbiAgfSk7XG5cbiAgaWYgKG5ld2x5RGV0ZWN0ZWRQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHsgcGFja2FnZU5hbWUgfSBvZiBuZXdseURldGVjdGVkUGFja2FnZXMpIHtcbiAgICB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VEZXNjcmlwdGlvbnMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKFxuICAgICAgKGRldGVjdGVkKSA9PlxuICAgICAgICBgXCIke2RldGVjdGVkLnBhY2thZ2VOYW1lfVwiICgke2dldElzc3VlTGFiZWxzKGRldGVjdGVkKS5qb2luKCcsICcpfSlgXG4gICAgKVxuICAgIC5qb2luKCcsICcpO1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKChkZXRlY3RlZCkgPT4gYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cImApXG4gICAgLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS53YXJuKFxuICAgIGBcXG7imqAgV29ya2Zsb3cgZm91bmQgd29ya2Zsb3cgY29kZSBpbiBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzOiAke3BhY2thZ2VEZXNjcmlwdGlvbnN9LmAgK1xuICAgICAgYFxcbiAgV29ya2Zsb3cgcmVtb3ZlZCB0aGUgYWZmZWN0ZWQgZW50cmllcyBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgZm9yIHRoaXMgYnVpbGQgYW5kIGlzIGNvbXBpbGluZyB0aGUgcGFja2FnZXMgYW55d2F5LmAgK1xuICAgICAgYFxcbiAgUmVtb3ZlICR7cGFja2FnZU5hbWVzfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgaW4gbmV4dC5jb25maWcgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcuXFxuYFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBUcnkgcmVzb2x2aW5nIGZyb20gdGhlIGNvbnN1bWluZyBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb25vcmVwbyBzZXR1cHMgd2hlcmUgYG5leHRgIG1heSBub3QgYmUgaG9pc3RlZCB0byB0aGVcbiAgLy8gc2FtZSBsb2NhdGlvbiBhcyBgQHdvcmtmbG93L25leHRgLlxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnbmV4dC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkUGFja2FnZUpzb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkgYXMge1xuICAgICAgdmVyc2lvbj86IHVua25vd247XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHRoaXMgcGFja2FnZSdzIGxvY2F0aW9uLlxuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSAocmVxdWlyZSgnbmV4dC9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiB1bmtub3duIH0pXG4gICAgICAudmVyc2lvbjtcbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICBlcnJvcnMsXG4gICAgYENvdWxkIG5vdCByZXNvbHZlIE5leHQuanMgdmVyc2lvbi4gRW5zdXJlIFxcYG5leHRcXGAgaXMgaW5zdGFsbGVkIGluIHlvdXIgcHJvamVjdCAod29ya2luZyBkaXJlY3Rvcnk6ICR7d29ya2luZ0Rpcn0pLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMoe1xuICBwcm9qZWN0RGlyLFxuICBkaXN0RGlyLFxufToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB7IG1hbmlmZXN0UGF0aDogc3RyaW5nOyBkaWFnbm9zdGljc01hbmlmZXN0UGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdENhbmRpZGF0ZXMgPSBbXG4gICAgam9pbihwcm9qZWN0RGlyLCAnYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdzcmMvYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICBdO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdENhbmRpZGF0ZXMuZmluZChmaWxlRXhpc3RzKTtcblxuICBpZiAoIW1hbmlmZXN0UGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlzdERpciA9IGlzQWJzb2x1dGUoZGlzdERpcilcbiAgICA/IGRpc3REaXJcbiAgICA6IGpvaW4ocHJvamVjdERpciwgZGlzdERpcik7XG4gIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gam9pbihcbiAgICByZXNvbHZlZERpc3REaXIsXG4gICAgJ2RpYWdub3N0aWNzJyxcbiAgICAnd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICk7XG4gIHJldHVybiB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY29weUZpbGUobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29weUZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IG1hcmtlciA9ICdfX3dvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcGllcyc7XG4gIGNvbnN0IGdsb2JhbFdpdGhNYXJrZXIgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFttYXJrZXJdPzogQXJyYXk8eyBwcm9qZWN0RGlyOiBzdHJpbmc7IGRpc3REaXI6IHN0cmluZyB9PjtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSkge1xuICAgIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSA9IFtdO1xuICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29weU1ldGFkYXRhIG9mIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSB8fCBbXSkge1xuICAgICAgICBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhjb3B5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdLnB1c2gobWV0YWRhdGEpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFdvcmtmbG93KFxuICBuZXh0Q29uZmlnT3JGbjpcbiAgICB8IE5leHRDb25maWdcbiAgICB8ICgoXG4gICAgICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgICAgIGN0eDogeyBkZWZhdWx0Q29uZmlnOiBOZXh0Q29uZmlnIH1cbiAgICAgICkgPT4gUHJvbWlzZTxOZXh0Q29uZmlnPiksXG4gIHtcbiAgICB3b3JrZmxvd3MsXG4gIH06IHtcbiAgICB3b3JrZmxvd3M/OiB7XG4gICAgICBsb2NhbD86IHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIENvbnRyb2xzIGhvdyBzb3VyY2UgbWFwcyBhcmUgZW1pdHRlZCBmb3Igd29ya2Zsb3cgYnVuZGxlcy4gQWNjZXB0c1xuICAgICAgICogdGhlIHNhbWUgdmFsdWVzIGFzIGVzYnVpbGQncyBgc291cmNlbWFwYCBvcHRpb246IGB0cnVlYC9gJ2lubGluZSdgXG4gICAgICAgKiAoZGVmYXVsdCksIGAnbGlua2VkJ2AsIGAnZXh0ZXJuYWwnYCwgYCdib3RoJ2AsIG9yIGBmYWxzZWAgdG8gb21pdFxuICAgICAgICogc291cmNlIG1hcHMuIENhbiBhbHNvIGJlIHNldCB2aWEgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgXG4gICAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICAgICAqL1xuICAgICAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2xpbmtlZCcgfCAnZXh0ZXJuYWwnIHwgJ2JvdGgnO1xuICAgIH07XG4gIH0gPSB7fVxuKSB7XG4gIGNvbnN0IHdvcmtmbG93VGFyZ2V0V29ybGQgPSBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52KCk7XG4gIGlmICh3b3JrZmxvd1RhcmdldFdvcmxkID09PSAnQHdvcmtmbG93L3dvcmxkLWxvY2FsJykge1xuICAgIHByb2Nlc3MuZW52LldPUktGTE9XX0xPQ0FMX0RBVEFfRElSID8/PSAnLm5leHQvd29ya2Zsb3ctZGF0YSc7XG4gIH1cblxuICBpZiAoIXByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEKSB7XG4gICAgY29uc3QgbWF5YmVQb3J0ID0gd29ya2Zsb3dzPy5sb2NhbD8ucG9ydDtcbiAgICBpZiAobWF5YmVQb3J0KSB7XG4gICAgICBwcm9jZXNzLmVudi5QT1JUID0gbWF5YmVQb3J0LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29uZmlnKFxuICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICBwaGFzZSA9PT0gJ3BoYXNlLWRldmVsb3BtZW50LXNlcnZlcicgfHxcbiAgICAgIHBoYXNlID09PSAncGhhc2UtcHJvZHVjdGlvbi1idWlsZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgJy4vc3djLXBsdWdpbi1jYWNoZS5qcydcbiAgICAgICk7XG4gICAgICAvLyBMb2FkZXIgd29ya2VycyBpbmhlcml0IHRoaXMgY3dkIGFuZCByZWFkIGZyb20gdGhlIHNhbWUgU1dDIGNhY2hlLlxuICAgICAgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUocHJvY2Vzcy5jd2QoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGVyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9sb2FkZXInKTtcbiAgICBsZXQgbmV4dENvbmZpZzogTmV4dENvbmZpZztcblxuICAgIGlmICh0eXBlb2YgbmV4dENvbmZpZ09yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG5leHRDb25maWcgPSBhd2FpdCBuZXh0Q29uZmlnT3JGbihwaGFzZSwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENvbmZpZyA9IG5leHRDb25maWdPckZuO1xuICAgIH1cbiAgICAvLyBzaGFsbG93IGNsb25lIHRvIGF2b2lkIHJlYWQtb25seSBvbiB0b3AtbGV2ZWxcbiAgICBuZXh0Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbmV4dENvbmZpZyk7XG4gICAgY29uc3Qgd29ya2Zsb3dCYXNlUGF0aCA9IG5leHRDb25maWcuYmFzZVBhdGg7XG4gICAgc2V0V29ya2Zsb3dCYXNlUGF0aCh3b3JrZmxvd0Jhc2VQYXRoKTtcbiAgICBuZXh0Q29uZmlnLmVudiA9IHtcbiAgICAgIC4uLm5leHRDb25maWcuZW52LFxuICAgICAgV09SS0ZMT1dfVEFSR0VUX1dPUkxEOiB3b3JrZmxvd1RhcmdldFdvcmxkLFxuICAgIH07XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgd29ya2Zsb3dUYXJnZXRXb3JsZFdlYnBhY2tBbGlhcyA9IHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkQWxpYXMoe1xuICAgICAgd29ya2luZ0RpcixcbiAgICAgIHRhcmdldFdvcmxkOiB3b3JrZmxvd1RhcmdldFdvcmxkLFxuICAgIH0pO1xuICAgIGNvbnN0IHdvcmtmbG93VGFyZ2V0V29ybGRJc1BhdGggPVxuICAgICAgaXNXb3JrZmxvd1RhcmdldFdvcmxkUGF0aCh3b3JrZmxvd1RhcmdldFdvcmxkKTtcbiAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkVHJhbnNwaWxlUGFja2FnZXMgPVxuICAgICAgd29ya2Zsb3dUYXJnZXRXb3JsZCA9PT0gVkVSQ0VMX1dPUkxEX1BBQ0tBR0UgfHwgd29ya2Zsb3dUYXJnZXRXb3JsZElzUGF0aFxuICAgICAgICA/IFtdXG4gICAgICAgIDogW3dvcmtmbG93VGFyZ2V0V29ybGRdO1xuICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAuLi4obmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzIHx8IFtdKSxcbiAgICAgICAgLy8gS2VlcCB0aGUgVmVyY2VsIHdvcmxkIGFuZCBpdHMgbmF0aXZlLXByb25lIGRlcGVuZGVuY2llcyBleHRlcm5hbCBzb1xuICAgICAgICAvLyBsb2NhbCBidWlsZHMgZG8gbm90IHRyeSB0byBwYXJzZSBAdmVyY2VsL3F1ZXVlJ3Mga2V5cmluZyBkZXBlbmRlbmN5XG4gICAgICAgIC8vIHRyZWUuXG4gICAgICAgIC4uLlZFUkNFTF9XT1JMRF9TRVJWRVJfRVhURVJOQUxfUEFDS0FHRVMsXG4gICAgICBdKSxcbiAgICBdO1xuICAgIG5leHRDb25maWcudHJhbnNwaWxlUGFja2FnZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFtcbiAgICAgICAgLi4uKG5leHRDb25maWcudHJhbnNwaWxlUGFja2FnZXMgfHwgW10pLFxuICAgICAgICAuLi5XT1JLRkxPV19TRVJWRVJfVFJBTlNQSUxFX1BBQ0tBR0VTLFxuICAgICAgICAuLi53b3JrZmxvd1RhcmdldFdvcmxkVHJhbnNwaWxlUGFja2FnZXMsXG4gICAgICBdKSxcbiAgICBdO1xuICAgIGNvbnN0IGV4aXN0aW5nQ29tcGlsZXIgPSBuZXh0Q29uZmlnLmNvbXBpbGVyID8/IHt9O1xuICAgIGNvbnN0IGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZSA9IChcbiAgICAgIGV4aXN0aW5nQ29tcGlsZXIgYXMge1xuICAgICAgICBydW5BZnRlclByb2R1Y3Rpb25Db21waWxlPzogKG1ldGFkYXRhOiB7XG4gICAgICAgICAgcHJvamVjdERpcjogc3RyaW5nO1xuICAgICAgICAgIGRpc3REaXI6IHN0cmluZztcbiAgICAgICAgfSkgPT4gUHJvbWlzZTx2b2lkPjtcbiAgICAgIH1cbiAgICApLnJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU7XG5cbiAgICBjb25zdCBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IEFycmF5LmlzQXJyYXkoXG4gICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICApXG4gICAgICA/IG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlc1xuICAgICAgOiBbXTtcbiAgICBsZXQgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuXG4gICAgaWYgKGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlczogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBwYWNrYWdlTmFtZSBvZiBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcykge1xuICAgICAgICBpZiAoUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTLmhhcyhwYWNrYWdlTmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgZGV0ZWN0ZWQgPSBhd2FpdCBkZXRlY3RTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UoXG4gICAgICAgICAgICBwYWNrYWdlTmFtZSxcbiAgICAgICAgICAgIHByb2Nlc3MuY3dkKClcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChkZXRlY3RlZCkge1xuICAgICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLnB1c2goZGV0ZWN0ZWQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgLy8gQmVzdC1lZmZvcnQgb25seS4gTmV2ZXIgYmxvY2sgY29uZmlnIGdlbmVyYXRpb24uXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHJlbW92ZWRQYWNrYWdlcyA9IG5ldyBTZXQoXG4gICAgICAgICAgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLm1hcCgoZGV0ZWN0ZWQpID0+IGRldGVjdGVkLnBhY2thZ2VOYW1lKVxuICAgICAgICApO1xuICAgICAgICBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID1cbiAgICAgICAgICBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5maWx0ZXIoXG4gICAgICAgICAgICAocGFja2FnZU5hbWUpID0+ICFyZW1vdmVkUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKVxuICAgICAgICAgICk7XG4gICAgICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXM7XG4gICAgICAgIHdhcm5BYm91dEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyhkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGlmIHR1cmJvcGFjayBpcyBiZWluZyB1c2VkXG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjaykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sgPSB7fTtcbiAgICB9XG4gICAgaWYgKCFuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcykge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMgPSB7fTtcbiAgICB9XG4gICAgbmV4dENvbmZpZy50dXJib3BhY2sucmVzb2x2ZUFsaWFzID0ge1xuICAgICAgLi4uKChuZXh0Q29uZmlnLnR1cmJvcGFjay5yZXNvbHZlQWxpYXMgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4pIHx8IHt9KSxcbiAgICAgIFtXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFXTogd29ya2Zsb3dUYXJnZXRXb3JsZElzUGF0aFxuICAgICAgICA/IHdvcmtmbG93VGFyZ2V0V29ybGRXZWJwYWNrQWxpYXNcbiAgICAgICAgOiB3b3JrZmxvd1RhcmdldFdvcmxkLFxuICAgIH07XG4gICAgY29uc3QgZXhpc3RpbmdSdWxlcyA9IG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzIGFzIGFueTtcbiAgICBjb25zdCBuZXh0VmVyc2lvbiA9IHJlc29sdmVOZXh0VmVyc2lvbih3b3JraW5nRGlyKTtcbiAgICBjb25zdCBjb25maWd1cmVkUHJvamVjdFJvb3QgPVxuICAgICAgbmV4dENvbmZpZy5vdXRwdXRGaWxlVHJhY2luZ1Jvb3QgPz8gbmV4dENvbmZpZy50dXJib3BhY2s/LnJvb3Q7XG4gICAgY29uc3QgcHJvamVjdFJvb3QgPSBjb25maWd1cmVkUHJvamVjdFJvb3RcbiAgICAgID8gcmVzb2x2ZUNvbmZpZ3VyZWRQcm9qZWN0Um9vdCh3b3JraW5nRGlyLCBjb25maWd1cmVkUHJvamVjdFJvb3QpXG4gICAgICA6IHJlc29sdmVQcm9qZWN0Um9vdCh3b3JraW5nRGlyKTtcbiAgICBjb25zdCBzdXBwb3J0c1R1cmJvQ29uZGl0aW9uID0gc2VtdmVyLmd0ZShuZXh0VmVyc2lvbiwgJ3YxNi4wLjAnKTtcblxuICAgIGNvbnN0IHNob3VsZFdhdGNoID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gICAgbGV0IHdvcmtmbG93QnVpbGRlclByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkaXN0RGlyID0gbmV4dENvbmZpZy5kaXN0RGlyIHx8ICcubmV4dCc7XG5cbiAgICBuZXh0Q29uZmlnLmNvbXBpbGVyID0ge1xuICAgICAgLi4uZXhpc3RpbmdDb21waWxlcixcbiAgICAgIHJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU6IGFzeW5jIChtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKSB7XG4gICAgICAgICAgYXdhaXQgZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0KG1ldGFkYXRhKTtcbiAgICAgICAgcmVnaXN0ZXJXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3B5KG1ldGFkYXRhKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGdldFdvcmtmbG93QnVpbGRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSkge1xuICAgICAgICB3b3JrZmxvd0J1aWxkZXJQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBOZXh0QnVpbGRlciA9IGF3YWl0IGdldE5leHRCdWlsZGVyKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3IE5leHRCdWlsZGVyKHtcbiAgICAgICAgICAgIHdhdGNoOiBzaG91bGRXYXRjaCxcbiAgICAgICAgICAgIC8vIGdldElucHV0RmlsZXMgZmlsdGVycyB0aGUgcHJvamVjdCB0byBOZXh0LmpzIGVudHJ5cG9pbnRzXG4gICAgICAgICAgICBkaXJzOiBbJy4nXSxcbiAgICAgICAgICAgIHBhZ2VFeHRlbnNpb25zOiBuZXh0Q29uZmlnLnBhZ2VFeHRlbnNpb25zID8/IFtcbiAgICAgICAgICAgICAgJ3RzeCcsXG4gICAgICAgICAgICAgICd0cycsXG4gICAgICAgICAgICAgICdqc3gnLFxuICAgICAgICAgICAgICAnanMnLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIHByb2plY3RSb290LFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogd29ya2luZ0RpcixcbiAgICAgICAgICAgIHdvcmtpbmdEaXIsXG4gICAgICAgICAgICBkaXN0RGlyLFxuICAgICAgICAgICAgYmFzZVBhdGg6IHdvcmtmbG93QmFzZVBhdGgsXG4gICAgICAgICAgICBkaWFnbm9zdGljc0RpcjogYCR7ZGlzdERpcn0vZGlhZ25vc3RpY3NgLFxuICAgICAgICAgICAgYnVpbGRUYXJnZXQ6ICduZXh0JyxcbiAgICAgICAgICAgIHdvcmtmbG93c0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzdGVwc0J1bmRsZVBhdGg6ICcnLCAvLyBub3QgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICB3ZWJob29rQnVuZGxlUGF0aDogJycsIC8vIG5vZGUgdXNlZCBpbiBiYXNlXG4gICAgICAgICAgICBzb3VyY2VtYXA6IHdvcmtmbG93cz8uc291cmNlbWFwLFxuICAgICAgICAgICAgZXh0ZXJuYWxQYWNrYWdlczogW1xuICAgICAgICAgICAgICAvLyBzZXJ2ZXItb25seSBhbmQgY2xpZW50LW9ubHkgYXJlIHBzZXVkby1wYWNrYWdlcyBoYW5kbGVkIGJ5IE5leHQuanNcbiAgICAgICAgICAgICAgLy8gZHVyaW5nIGl0cyBidWlsZCBwcm9jZXNzLiBXZSBtYXJrIHRoZW0gYXMgZXh0ZXJuYWwgdG8gcHJldmVudCBlc2J1aWxkXG4gICAgICAgICAgICAgIC8vIGZyb20gZmFpbGluZyB3aGVuIGJ1bmRsaW5nIGNvZGUgdGhhdCBpbXBvcnRzIHRoZW0uXG4gICAgICAgICAgICAgIC8vIFNlZTogaHR0cHM6Ly9uZXh0anMub3JnL2RvY3MvYXBwL2dldHRpbmctc3RhcnRlZC9zZXJ2ZXItYW5kLWNsaWVudC1jb21wb25lbnRzXG4gICAgICAgICAgICAgICdzZXJ2ZXItb25seScsXG4gICAgICAgICAgICAgICdjbGllbnQtb25seScsXG4gICAgICAgICAgICAgIC4uLmVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSgpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd29ya2Zsb3dCdWlsZGVyUHJvbWlzZTtcbiAgICB9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1xuICAgICAgJyoudHN4JyxcbiAgICAgICcqLnRzJyxcbiAgICAgICcqLmpzeCcsXG4gICAgICAnKi5qcycsXG4gICAgICAnKi5tanMnLFxuICAgICAgJyoubXRzJyxcbiAgICAgICcqLmNqcycsXG4gICAgICAnKi5jdHMnLFxuICAgIF0pIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzW2tleV0gPSB7XG4gICAgICAgIC4uLihzdXBwb3J0c1R1cmJvQ29uZGl0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjoge1xuICAgICAgICAgICAgICAgIC8vIFVzZSAnYWxsJyB0byBjb21iaW5lOiBtdXN0IG1hdGNoIGNvbnRlbnQgQU5EIG11c3QgTk9UIGJlIGluIGdlbmVyYXRlZCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgJ2FsbCcgY29uZGl0aW9ucyBmcm9tIHVzZXIgY29uZmlnXG4gICAgICAgICAgICAgICAgYWxsOiBbXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdSdWxlc1trZXldPy5jb25kaXRpb24/LmFsbCB8fCBbXSksXG4gICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlcyBmcm9tIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgICB7IG5vdDogeyBwYXRoOiAvWy9cXFxcXVxcLndlbGwta25vd25bL1xcXFxdd29ya2Zsb3dbL1xcXFxdLyB9IH0sXG4gICAgICAgICAgICAgICAgICAvLyBNYXRjaCBmaWxlcyB3aXRoIHdvcmtmbG93IGRpcmVjdGl2ZXMgb3IgY3VzdG9tIHNlcmlhbGl6YXRpb24gcGF0dGVybnNcbiAgICAgICAgICAgICAgICAgIC8vIFVzZXMgYmFja3JlZmVyZW5jZXMgKFxcMiwgXFwzKSB0byBlbnN1cmUgbWF0Y2hpbmcgcXVvdGUgdHlwZXNcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpcbiAgICAgICAgICAgICAgICAgICAgICAvKHVzZSB3b3JrZmxvd3x1c2Ugc3RlcHxAd29ya2Zsb3dcXC9jb3JlXFwvcnVudGltZVxcL3dvcmxkLXRhcmdldHxmcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMnxTeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwzXFxzKlxcKSkvLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBsb2FkZXJzOiBbLi4uKGV4aXN0aW5nUnVsZXNba2V5XT8ubG9hZGVycyB8fCBbXSksIGxvYWRlclBhdGhdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmUgdGhlIGxvYWRlciBmb3Igd2VicGFja1xuICAgIGNvbnN0IGV4aXN0aW5nV2VicGFja01vZGlmeSA9IG5leHRDb25maWcud2VicGFjaztcbiAgICBuZXh0Q29uZmlnLndlYnBhY2sgPSAoLi4uYXJncykgPT4ge1xuICAgICAgbGV0IFt3ZWJwYWNrQ29uZmlnXSA9IGFyZ3M7XG4gICAgICB3ZWJwYWNrQ29uZmlnID0gZXhpc3RpbmdXZWJwYWNrTW9kaWZ5XG4gICAgICAgID8gKGV4aXN0aW5nV2VicGFja01vZGlmeSguLi5hcmdzKSA/PyB3ZWJwYWNrQ29uZmlnKVxuICAgICAgICA6IHdlYnBhY2tDb25maWc7XG5cbiAgICAgIGlmICghd2VicGFja0NvbmZpZy5tb2R1bGUpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICghd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8vIGxvYWRlcnMgaW4gd2VicGFjayBhcHBseSBib3R0b20tPnVwIHNvIGVuc3VyZVxuICAgICAgLy8gb3VycyBjb21lcyBiZWZvcmUgdGhlIGRlZmF1bHQgc3djIHRyYW5zZm9ybVxuICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICAgIHRlc3Q6IC8uKlxcLihtanN8Y2pzfGN0c3x0c3x0c3h8anN8anN4KSQvLFxuICAgICAgICBsb2FkZXI6IGxvYWRlclBhdGgsXG4gICAgICB9KTtcblxuICAgICAgd2VicGFja0NvbmZpZy5yZXNvbHZlIHx8PSB7fTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nQWxpYXMgPSB3ZWJwYWNrQ29uZmlnLnJlc29sdmUuYWxpYXM7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZ0FsaWFzKSkge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLnJlc29sdmUuYWxpYXMgPSBbXG4gICAgICAgICAgLi4uZXhpc3RpbmdBbGlhcyxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBuYW1lOiBXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFLFxuICAgICAgICAgICAgYWxpYXM6IHdvcmtmbG93VGFyZ2V0V29ybGRXZWJwYWNrQWxpYXMsXG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcucmVzb2x2ZS5hbGlhcyA9IHtcbiAgICAgICAgICAuLi4oZXhpc3RpbmdBbGlhcyB8fCB7fSksXG4gICAgICAgICAgW1dPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEVdOiB3b3JrZmxvd1RhcmdldFdvcmxkV2VicGFja0FsaWFzLFxuICAgICAgICB9O1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gd2VicGFja0NvbmZpZztcbiAgICB9O1xuICAgIC8vIG9ubHkgcnVuIHRoaXMgaW4gdGhlIG1haW4gcHJvY2VzcyBzbyBpdCBvbmx5IHJ1bnMgb25jZVxuICAgIC8vIGFzIE5leHQuanMgdXNlcyBjaGlsZCBwcm9jZXNzZXMgZm9yIGRpZmZlcmVudCBidWlsZHNcbiAgICBpZiAoXG4gICAgICAhcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTkVYVF9QUklWQVRFX0JVSUxUICYmXG4gICAgICBwaGFzZSAhPT0gJ3BoYXNlLXByb2R1Y3Rpb24tc2VydmVyJ1xuICAgICkge1xuICAgICAgY29uc3Qgd29ya2Zsb3dCdWlsZGVyID0gYXdhaXQgZ2V0V29ya2Zsb3dCdWlsZGVyKCk7XG5cbiAgICAgIGF3YWl0IHdvcmtmbG93QnVpbGRlci5idWlsZCgpO1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTkVYVF9QUklWQVRFX0JVSUxUID0gJzEnO1xuICAgIH1cblxuICAgIHJldHVybiBuZXh0Q29uZmlnO1xuICB9O1xufVxuIl19
|
|
520
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUErVUEsb0NBdVRDO0FBdG9CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUN0RCxpREFPNEI7QUFFNUIsb0RBQTRCO0FBQzVCLDZDQUE4QztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBQ0YsTUFBTSxrQ0FBa0MsR0FBRztJQUN6QyxVQUFVO0lBQ1YsZ0JBQWdCO0lBQ2hCLGlCQUFpQjtJQUNqQixrQkFBa0I7SUFDbEIsaUJBQWlCO0lBQ2pCLGNBQWM7Q0FDZixDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0QsTUFBTSxZQUFZLEdBQUcsVUFDZSxDQUFDO0FBRXJD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QztpQkFDRixDQUFDO1lBQ0osQ0FBQztpQkFBTSxDQUFDO2dCQUNOLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxHQUFHO29CQUM1QixHQUFHLENBQUMsYUFBYSxJQUFJLEVBQUUsQ0FBQztvQkFDeEIsQ0FBQyx1Q0FBNEIsQ0FBQyxFQUFFLCtCQUErQjtpQkFDaEUsQ0FBQztZQUNKLENBQUM7WUFFRCxPQUFPLGFBQWEsQ0FBQztRQUN2QixDQUFDLENBQUM7UUFDRix5REFBeUQ7UUFDekQsdURBQXVEO1FBQ3ZELElBQ0UsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtZQUN4QyxLQUFLLEtBQUsseUJBQXlCLEVBQ25DLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7WUFFbkQsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxHQUFHLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIG1rZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNvcHlGaWxlLCBta2RpciwgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHtcbiAgZW5zdXJlV29ya2Zsb3dUYXJnZXRXb3JsZEVudixcbiAgaXNXb3JrZmxvd1RhcmdldFdvcmxkUGF0aCxcbiAgcmVzb2x2ZUNvbmZpZ3VyZWRQcm9qZWN0Um9vdCxcbiAgcmVzb2x2ZVByb2plY3RSb290LFxuICByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzLFxuICBXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBnZXROZXh0QnVpbGRlciB9IGZyb20gJy4vYnVpbGRlci5qcyc7XG5cbmNvbnN0IFZFUkNFTF9XT1JMRF9QQUNLQUdFID0gJ0B3b3JrZmxvdy93b3JsZC12ZXJjZWwnO1xuY29uc3QgVkVSQ0VMX1dPUkxEX0RFUEVOREVOQ1lfUEFDS0FHRVMgPSBbXG4gICdAdmVyY2VsL3F1ZXVlJyxcbiAgJ0B2ZXJjZWwvb2lkYycsXG4gICdAdmVyY2VsL2NsaS1hdXRoJyxcbiAgJ0BuYXBpLXJzL2tleXJpbmcnLFxuXTtcbmNvbnN0IFZFUkNFTF9XT1JMRF9TRVJWRVJfRVhURVJOQUxfUEFDS0FHRVMgPSBbXG4gIFZFUkNFTF9XT1JMRF9QQUNLQUdFLFxuICAuLi5WRVJDRUxfV09STERfREVQRU5ERU5DWV9QQUNLQUdFUyxcbl07XG5jb25zdCBXT1JLRkxPV19TRVJWRVJfVFJBTlNQSUxFX1BBQ0tBR0VTID0gW1xuICAnd29ya2Zsb3cnLFxuICAnQHdvcmtmbG93L2NvcmUnLFxuICAnQHdvcmtmbG93L3NlcmRlJyxcbiAgJ0B3b3JrZmxvdy9lcnJvcnMnLFxuICAnQHdvcmtmbG93L3V0aWxzJyxcbiAgJ0B3b3JrZmxvdy9haScsXG5dO1xuY29uc3QgdXNlV29ya2Zsb3dQYXR0ZXJuID0gL15cXHMqKFsnXCJdKXVzZSB3b3JrZmxvd1xcMTs/XFxzKiQvbTtcbmNvbnN0IHVzZVN0ZXBQYXR0ZXJuID0gL15cXHMqKFsnXCJdKXVzZSBzdGVwXFwxOz9cXHMqJC9tO1xuY29uc3Qgd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4gPSAvZnJvbVxccysoWydcIl0pQHdvcmtmbG93XFwvc2VyZGVcXDEvO1xuY29uc3Qgd29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4gPVxuICAvU3ltYm9sXFwuZm9yXFxzKlxcKFxccyooWydcIl0pd29ya2Zsb3ctKD86c2VyaWFsaXplfGRlc2VyaWFsaXplKVxcMVxccypcXCkvO1xuY29uc3Qgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuID1cbiAgL1xcW1xccypXT1JLRkxPV18oPzpTRVJJQUxJWkV8REVTRVJJQUxJWkUpXFxzKlxcXS87XG5cbmNvbnN0IFBTRVVET19FWFRFUk5BTF9QQUNLQUdFUyA9IG5ldyBTZXQoWydzZXJ2ZXItb25seScsICdjbGllbnQtb25seSddKTtcbmNvbnN0IHdhcm5lZEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuY29uc3QgQkFTRV9QQVRIX1NZTUJPTCA9IFN5bWJvbC5mb3IoJ0B3b3JrZmxvdy9jb3JlL2Jhc2VQYXRoJyk7XG5jb25zdCBnbG9iYWxDb25maWcgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICZcbiAgUmVjb3JkPHN5bWJvbCwgc3RyaW5nIHwgdW5kZWZpbmVkPjtcblxuLy8gS2VlcCB0aGlzIGxvY2FsOiBAd29ya2Zsb3cvbmV4dCBpcyBDb21tb25KUywgd2hpbGUgQHdvcmtmbG93L3V0aWxzIGlzIEVTTS1vbmx5LlxuZnVuY3Rpb24gc2V0V29ya2Zsb3dCYXNlUGF0aChiYXNlUGF0aDogc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gIGdsb2JhbENvbmZpZ1tCQVNFX1BBVEhfU1lNQk9MXSA9IGJhc2VQYXRoID8/ICcnO1xufVxuXG5pbnRlcmZhY2UgV29ya2Zsb3dQYXR0ZXJuTWF0Y2gge1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZSB7XG4gIHBhY2thZ2VOYW1lOiBzdHJpbmc7XG4gIGhhc1VzZVdvcmtmbG93OiBib29sZWFuO1xuICBoYXNVc2VTdGVwOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+IHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpO1xufVxuXG5mdW5jdGlvbiBpc1Jlc29sdmFibGVQYWNrYWdlU3BlY2lmaWVyKHNwZWNpZmllcjogc3RyaW5nKTogYm9vbGVhbiB7XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLicpIHx8IHNwZWNpZmllci5zdGFydHNXaXRoKCcvJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCckJykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKHNwZWNpZmllci5pbmNsdWRlcygnKicpIHx8IHNwZWNpZmllci5pbmNsdWRlcygnOicpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlOiBzdHJpbmcpOiBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIGNvbnN0IGhhc1VzZVdvcmtmbG93ID0gdXNlV29ya2Zsb3dQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzVXNlU3RlcCA9IHVzZVN0ZXBQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVJbXBvcnQgPSB3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlU3ltYm9sID0gd29ya2Zsb3dTZXJkZVN5bWJvbFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUNvbXB1dGVkUHJvcGVydHkgPVxuICAgIHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybi50ZXN0KHNvdXJjZSk7XG5cbiAgcmV0dXJuIHtcbiAgICBoYXNVc2VXb3JrZmxvdyxcbiAgICBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlOiBoYXNTZXJkZUltcG9ydCB8fCBoYXNTZXJkZVN5bWJvbCB8fCBoYXNTZXJkZUNvbXB1dGVkUHJvcGVydHksXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldElzc3VlTGFiZWxzKGRldGVjdGVkOiBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZSk6IHN0cmluZ1tdIHtcbiAgY29uc3QgaXNzdWVzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAoZGV0ZWN0ZWQuaGFzVXNlV29ya2Zsb3cpIHtcbiAgICBpc3N1ZXMucHVzaCgnXCJ1c2Ugd29ya2Zsb3dcIiBmdW5jdGlvbnMnKTtcbiAgfVxuICBpZiAoZGV0ZWN0ZWQuaGFzVXNlU3RlcCkge1xuICAgIGlzc3Vlcy5wdXNoKCdcInVzZSBzdGVwXCIgZnVuY3Rpb25zJyk7XG4gIH1cbiAgaWYgKGRldGVjdGVkLmhhc1NlcmRlKSB7XG4gICAgaXNzdWVzLnB1c2goJ3NlcmlhbGl6YXRpb24gY2xhc3NlcycpO1xuICB9XG4gIHJldHVybiBpc3N1ZXM7XG59XG5cbmZ1bmN0aW9uIGhhc1dvcmtmbG93U2VyZGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIGlmICghaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbikpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBkZXBlbmRlbmNpZXMgPSBpc1BsYWluT2JqZWN0KHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcylcbiAgICA/IHBhY2thZ2VKc29uLmRlcGVuZGVuY2llc1xuICAgIDoge307XG4gIGNvbnN0IHBlZXJEZXBlbmRlbmNpZXMgPSBpc1BsYWluT2JqZWN0KHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXMpXG4gICAgPyBwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzXG4gICAgOiB7fTtcblxuICByZXR1cm4gKFxuICAgIE9iamVjdC5oYXNPd24oZGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJykgfHxcbiAgICBPYmplY3QuaGFzT3duKHBlZXJEZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKVxuICApO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UoXG4gIHBhY2thZ2VOYW1lOiBzdHJpbmcsXG4gIHdvcmtpbmdEaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZSB8IG51bGw+IHtcbiAgaWYgKCFpc1Jlc29sdmFibGVQYWNrYWdlU3BlY2lmaWVyKHBhY2thZ2VOYW1lKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgbGV0IGhhc1VzZVdvcmtmbG93ID0gZmFsc2U7XG4gIGxldCBoYXNVc2VTdGVwID0gZmFsc2U7XG4gIGxldCBoYXNTZXJkZSA9IGZhbHNlO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKGAke3BhY2thZ2VOYW1lfS9wYWNrYWdlLmpzb25gLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uU291cmNlID0gYXdhaXQgcmVhZEZpbGUocGFja2FnZUpzb25QYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwYWNrYWdlSnNvbiA9IEpTT04ucGFyc2UocGFja2FnZUpzb25Tb3VyY2UpIGFzIHVua25vd247XG4gICAgaGFzU2VyZGUgPSBoYXNXb3JrZmxvd1NlcmRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbik7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEJlc3QtZWZmb3J0IG9ubHkuIENvbnRpbnVlIHRvIHNvdXJjZSBzY2FubmluZy5cbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZW50cnlQYXRoID0gcmVxdWlyZS5yZXNvbHZlKHBhY2thZ2VOYW1lLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKGVudHJ5UGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGF0dGVybnMgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG4gICAgaGFzVXNlV29ya2Zsb3cgPSBwYXR0ZXJucy5oYXNVc2VXb3JrZmxvdztcbiAgICBoYXNVc2VTdGVwID0gcGF0dGVybnMuaGFzVXNlU3RlcDtcbiAgICBoYXNTZXJkZSB8fD0gcGF0dGVybnMuaGFzU2VyZGU7XG4gIH0gY2F0Y2gge1xuICAgIC8vIEJlc3QtZWZmb3J0IG9ubHkuIFVzZSB3aGljaGV2ZXIgc2lnbmFsIHdlIGFscmVhZHkgaGF2ZS5cbiAgfVxuXG4gIGlmICghaGFzVXNlV29ya2Zsb3cgJiYgIWhhc1VzZVN0ZXAgJiYgIWhhc1NlcmRlKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBhY2thZ2VOYW1lLFxuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHdhcm5BYm91dEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyhcbiAgZGV0ZWN0ZWRQYWNrYWdlczogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VbXVxuKTogdm9pZCB7XG4gIGNvbnN0IG5ld2x5RGV0ZWN0ZWRQYWNrYWdlcyA9IGRldGVjdGVkUGFja2FnZXMuZmlsdGVyKCh7IHBhY2thZ2VOYW1lIH0pID0+IHtcbiAgICByZXR1cm4gIXdhcm5lZEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5oYXMocGFja2FnZU5hbWUpO1xuICB9KTtcblxuICBpZiAobmV3bHlEZXRlY3RlZFBhY2thZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZvciAoY29uc3QgeyBwYWNrYWdlTmFtZSB9IG9mIG5ld2x5RGV0ZWN0ZWRQYWNrYWdlcykge1xuICAgIHdhcm5lZEF1dG9SZW1vdmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5hZGQocGFja2FnZU5hbWUpO1xuICB9XG5cbiAgY29uc3QgcGFja2FnZURlc2NyaXB0aW9ucyA9IG5ld2x5RGV0ZWN0ZWRQYWNrYWdlc1xuICAgIC5tYXAoXG4gICAgICAoZGV0ZWN0ZWQpID0+XG4gICAgICAgIGBcIiR7ZGV0ZWN0ZWQucGFja2FnZU5hbWV9XCIgKCR7Z2V0SXNzdWVMYWJlbHMoZGV0ZWN0ZWQpLmpvaW4oJywgJyl9KWBcbiAgICApXG4gICAgLmpvaW4oJywgJyk7XG4gIGNvbnN0IHBhY2thZ2VOYW1lcyA9IG5ld2x5RGV0ZWN0ZWRQYWNrYWdlc1xuICAgIC5tYXAoKGRldGVjdGVkKSA9PiBgXCIke2RldGVjdGVkLnBhY2thZ2VOYW1lfVwiYClcbiAgICAuam9pbignLCAnKTtcblxuICBjb25zb2xlLndhcm4oXG4gICAgYFxcbuKaoCBXb3JrZmxvdyBmb3VuZCB3b3JrZmxvdyBjb2RlIGluIHNlcnZlckV4dGVybmFsUGFja2FnZXM6ICR7cGFja2FnZURlc2NyaXB0aW9uc30uYCArXG4gICAgICBgXFxuICBXb3JrZmxvdyByZW1vdmVkIHRoZSBhZmZlY3RlZCBlbnRyaWVzIGZyb20gc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyBmb3IgdGhpcyBidWlsZCBhbmQgaXMgY29tcGlsaW5nIHRoZSBwYWNrYWdlcyBhbnl3YXkuYCArXG4gICAgICBgXFxuICBSZW1vdmUgJHtwYWNrYWdlTmFtZXN9IGZyb20gc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyBpbiBuZXh0LmNvbmZpZyB0byBzaWxlbmNlIHRoaXMgd2FybmluZy5cXG5gXG4gICk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVOZXh0VmVyc2lvbih3b3JraW5nRGlyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBlcnJvcnM6IHVua25vd25bXSA9IFtdO1xuXG4gIC8vIFRyeSByZXNvbHZpbmcgZnJvbSB0aGUgY29uc3VtaW5nIHByb2plY3QncyB3b3JraW5nIGRpcmVjdG9yeSBmaXJzdC5cbiAgLy8gVGhpcyBoYW5kbGVzIG1vbm9yZXBvIHNldHVwcyB3aGVyZSBgbmV4dGAgbWF5IG5vdCBiZSBob2lzdGVkIHRvIHRoZVxuICAvLyBzYW1lIGxvY2F0aW9uIGFzIGBAd29ya2Zsb3cvbmV4dGAuXG4gIHRyeSB7XG4gICAgY29uc3QgcGFja2FnZUpzb25QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCduZXh0L3BhY2thZ2UuanNvbicsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3QgcmVzb2x2ZWRQYWNrYWdlSnNvbiA9IHJlcXVpcmUocGFja2FnZUpzb25QYXRoKSBhcyB7XG4gICAgICB2ZXJzaW9uPzogdW5rbm93bjtcbiAgICB9O1xuICAgIGlmICh0eXBlb2YgcmVzb2x2ZWRQYWNrYWdlSnNvbi52ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIC8vIEZhbGwgYmFjayB0byByZXNvbHZpbmcgcmVsYXRpdmUgdG8gdGhpcyBwYWNrYWdlJ3MgbG9jYXRpb24uXG4gIHRyeSB7XG4gICAgY29uc3QgdmVyc2lvbiA9IChyZXF1aXJlKCduZXh0L3BhY2thZ2UuanNvbicpIGFzIHsgdmVyc2lvbj86IHVua25vd24gfSlcbiAgICAgIC52ZXJzaW9uO1xuICAgIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiB2ZXJzaW9uO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9ycy5wdXNoKGUpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKFxuICAgIGVycm9ycyxcbiAgICBgQ291bGQgbm90IHJlc29sdmUgTmV4dC5qcyB2ZXJzaW9uLiBFbnN1cmUgXFxgbmV4dFxcYCBpcyBpbnN0YWxsZWQgaW4geW91ciBwcm9qZWN0ICh3b3JraW5nIGRpcmVjdG9yeTogJHt3b3JraW5nRGlyfSkuYFxuICApO1xufVxuXG5mdW5jdGlvbiBmaWxlRXhpc3RzKHBhdGg6IHN0cmluZyk6IGJvb2xlYW4ge1xuICB0cnkge1xuICAgIGNvbnN0IHN0YXRzID0gc3RhdFN5bmMocGF0aCk7XG4gICAgcmV0dXJuIHN0YXRzLmlzRmlsZSgpO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dNYW5pZmVzdENvcHlQYXRocyh7XG4gIHByb2plY3REaXIsXG4gIGRpc3REaXIsXG59OiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHsgbWFuaWZlc3RQYXRoOiBzdHJpbmc7IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoOiBzdHJpbmcgfSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IG1hbmlmZXN0Q2FuZGlkYXRlcyA9IFtcbiAgICBqb2luKHByb2plY3REaXIsICdhcHAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICAgIGpvaW4ocHJvamVjdERpciwgJ3NyYy9hcHAvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICAgIGpvaW4ocHJvamVjdERpciwgJ3B1YmxpYy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJyksXG4gIF07XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IG1hbmlmZXN0Q2FuZGlkYXRlcy5maW5kKGZpbGVFeGlzdHMpO1xuXG4gIGlmICghbWFuaWZlc3RQYXRoKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgcmVzb2x2ZWREaXN0RGlyID0gaXNBYnNvbHV0ZShkaXN0RGlyKVxuICAgID8gZGlzdERpclxuICAgIDogam9pbihwcm9qZWN0RGlyLCBkaXN0RGlyKTtcbiAgY29uc3QgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggPSBqb2luKFxuICAgIHJlc29sdmVkRGlzdERpcixcbiAgICAnZGlhZ25vc3RpY3MnLFxuICAgICd3b3JrZmxvd3MtbWFuaWZlc3QuanNvbidcbiAgKTtcbiAgcmV0dXJuIHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0KG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgYXdhaXQgbWtkaXIoZGlybmFtZShkaWFnbm9zdGljc01hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBhd2FpdCBjb3B5RmlsZShtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoKTtcbn1cblxuZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdFN5bmMobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IHBhdGhzID0gZ2V0V29ya2Zsb3dNYW5pZmVzdENvcHlQYXRocyhtZXRhZGF0YSk7XG4gIGlmICghcGF0aHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfSA9IHBhdGhzO1xuICBta2RpclN5bmMoZGlybmFtZShkaWFnbm9zdGljc01hbmlmZXN0UGF0aCksIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICBjb3B5RmlsZVN5bmMobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyV29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0Q29weShtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB2b2lkIHtcbiAgY29uc3QgbWFya2VyID0gJ19fd29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0Q29waWVzJztcbiAgY29uc3QgZ2xvYmFsV2l0aE1hcmtlciA9IGdsb2JhbFRoaXMgYXMgdHlwZW9mIGdsb2JhbFRoaXMgJiB7XG4gICAgW21hcmtlcl0/OiBBcnJheTx7IHByb2plY3REaXI6IHN0cmluZzsgZGlzdERpcjogc3RyaW5nIH0+O1xuICB9O1xuXG4gIGlmICghZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdKSB7XG4gICAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdID0gW107XG4gICAgcHJvY2Vzcy5vbmNlKCdleGl0JywgKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBjb3B5TWV0YWRhdGEgb2YgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdIHx8IFtdKSB7XG4gICAgICAgIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKGNvcHlNZXRhZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnbG9iYWxXaXRoTWFya2VyW21hcmtlcl0ucHVzaChtZXRhZGF0YSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoV29ya2Zsb3coXG4gIG5leHRDb25maWdPckZuOlxuICAgIHwgTmV4dENvbmZpZ1xuICAgIHwgKChcbiAgICAgICAgcGhhc2U6IHN0cmluZyxcbiAgICAgICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICAgICAgKSA9PiBQcm9taXNlPE5leHRDb25maWc+KSxcbiAge1xuICAgIHdvcmtmbG93cyxcbiAgfToge1xuICAgIHdvcmtmbG93cz86IHtcbiAgICAgIGxvY2FsPzoge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzXG4gICAgICAgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgZXNidWlsZCdzIGBzb3VyY2VtYXBgIG9wdGlvbjogYHRydWVgL2AnaW5saW5lJ2BcbiAgICAgICAqIChkZWZhdWx0KSwgYCdsaW5rZWQnYCwgYCdleHRlcm5hbCdgLCBgJ2JvdGgnYCwgb3IgYGZhbHNlYCB0byBvbWl0XG4gICAgICAgKiBzb3VyY2UgbWFwcy4gQ2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGBcbiAgICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgICAgICovXG4gICAgICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG4gICAgfTtcbiAgfSA9IHt9XG4pIHtcbiAgY29uc3Qgd29ya2Zsb3dUYXJnZXRXb3JsZCA9IGVuc3VyZVdvcmtmbG93VGFyZ2V0V29ybGRFbnYoKTtcbiAgaWYgKHdvcmtmbG93VGFyZ2V0V29ybGQgPT09ICdAd29ya2Zsb3cvd29ybGQtbG9jYWwnKSB7XG4gICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIgPz89ICcubmV4dC93b3JrZmxvdy1kYXRhJztcblxuICAgIC8vIGB3b3JrZmxvd3MubG9jYWwucG9ydGAgY29uZmlndXJlcyB3aGVyZSB0aGUgbG9jYWwgd29ybGQgYWRkcmVzc2VzIGl0cyBvd25cbiAgICAvLyBxdWV1ZSBjYWxsYmFja3MsIHNvIGl0IG9ubHkgYXBwbGllcyB3aGVuIHRoYXQgd29ybGQgaXMgdGhlIHRhcmdldC5cbiAgICBjb25zdCBtYXliZVBvcnQgPSB3b3JrZmxvd3M/LmxvY2FsPy5wb3J0O1xuICAgIGlmIChtYXliZVBvcnQpIHtcbiAgICAgIHByb2Nlc3MuZW52LlBPUlQgPSBtYXliZVBvcnQudG9TdHJpbmcoKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gYnVpbGRDb25maWcoXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4gICkge1xuICAgIGlmIChcbiAgICAgIHBoYXNlID09PSAncGhhc2UtZGV2ZWxvcG1lbnQtc2VydmVyJyB8fFxuICAgICAgcGhhc2UgPT09ICdwaGFzZS1wcm9kdWN0aW9uLWJ1aWxkJ1xuICAgICkge1xuICAgICAgY29uc3QgeyBwcmV3YXJtV29ya2Zsb3dTd2NQbHVnaW5DYWNoZSB9ID0gYXdhaXQgaW1wb3J0KFxuICAgICAgICAnLi9zd2MtcGx1Z2luLWNhY2hlLmpzJ1xuICAgICAgKTtcbiAgICAgIC8vIExvYWRlciB3b3JrZXJzIGluaGVyaXQgdGhpcyBjd2QgYW5kIHJlYWQgZnJvbSB0aGUgc2FtZSBTV0MgY2FjaGUuXG4gICAgICBwcmV3YXJtV29ya2Zsb3dTd2NQbHVnaW5DYWNoZShwcm9jZXNzLmN3ZCgpKTtcbiAgICB9XG5cbiAgICBjb25zdCBsb2FkZXJQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCcuL2xvYWRlcicpO1xuICAgIGxldCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnO1xuXG4gICAgaWYgKHR5cGVvZiBuZXh0Q29uZmlnT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbmV4dENvbmZpZyA9IGF3YWl0IG5leHRDb25maWdPckZuKHBoYXNlLCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q29uZmlnID0gbmV4dENvbmZpZ09yRm47XG4gICAgfVxuICAgIC8vIHNoYWxsb3cgY2xvbmUgdG8gYXZvaWQgcmVhZC1vbmx5IG9uIHRvcC1sZXZlbFxuICAgIG5leHRDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBuZXh0Q29uZmlnKTtcbiAgICBjb25zdCB3b3JrZmxvd0Jhc2VQYXRoID0gbmV4dENvbmZpZy5iYXNlUGF0aDtcbiAgICBzZXRXb3JrZmxvd0Jhc2VQYXRoKHdvcmtmbG93QmFzZVBhdGgpO1xuICAgIG5leHRDb25maWcuZW52ID0ge1xuICAgICAgLi4ubmV4dENvbmZpZy5lbnYsXG4gICAgICBXT1JLRkxPV19UQVJHRVRfV09STEQ6IHdvcmtmbG93VGFyZ2V0V29ybGQsXG4gICAgfTtcbiAgICBjb25zdCB3b3JraW5nRGlyID0gcHJvY2Vzcy5jd2QoKTtcbiAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkV2VicGFja0FsaWFzID0gcmVzb2x2ZVdvcmtmbG93VGFyZ2V0V29ybGRBbGlhcyh7XG4gICAgICB3b3JraW5nRGlyLFxuICAgICAgdGFyZ2V0V29ybGQ6IHdvcmtmbG93VGFyZ2V0V29ybGQsXG4gICAgfSk7XG4gICAgY29uc3Qgd29ya2Zsb3dUYXJnZXRXb3JsZElzUGF0aCA9XG4gICAgICBpc1dvcmtmbG93VGFyZ2V0V29ybGRQYXRoKHdvcmtmbG93VGFyZ2V0V29ybGQpO1xuICAgIGNvbnN0IHdvcmtmbG93VGFyZ2V0V29ybGRUcmFuc3BpbGVQYWNrYWdlcyA9XG4gICAgICB3b3JrZmxvd1RhcmdldFdvcmxkID09PSBWRVJDRUxfV09STERfUEFDS0FHRSB8fCB3b3JrZmxvd1RhcmdldFdvcmxkSXNQYXRoXG4gICAgICAgID8gW11cbiAgICAgICAgOiBbd29ya2Zsb3dUYXJnZXRXb3JsZF07XG4gICAgbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gW1xuICAgICAgLi4ubmV3IFNldChbXG4gICAgICAgIC4uLihuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgfHwgW10pLFxuICAgICAgICAvLyBLZWVwIHRoZSBWZXJjZWwgd29ybGQgYW5kIGl0cyBuYXRpdmUtcHJvbmUgZGVwZW5kZW5jaWVzIGV4dGVybmFsIHNvXG4gICAgICAgIC8vIGxvY2FsIGJ1aWxkcyBkbyBub3QgdHJ5IHRvIHBhcnNlIEB2ZXJjZWwvcXVldWUncyBrZXlyaW5nIGRlcGVuZGVuY3lcbiAgICAgICAgLy8gdHJlZS5cbiAgICAgICAgLi4uVkVSQ0VMX1dPUkxEX1NFUlZFUl9FWFRFUk5BTF9QQUNLQUdFUyxcbiAgICAgIF0pLFxuICAgIF07XG4gICAgbmV4dENvbmZpZy50cmFuc3BpbGVQYWNrYWdlcyA9IFtcbiAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAuLi4obmV4dENvbmZpZy50cmFuc3BpbGVQYWNrYWdlcyB8fCBbXSksXG4gICAgICAgIC4uLldPUktGTE9XX1NFUlZFUl9UUkFOU1BJTEVfUEFDS0FHRVMsXG4gICAgICAgIC4uLndvcmtmbG93VGFyZ2V0V29ybGRUcmFuc3BpbGVQYWNrYWdlcyxcbiAgICAgIF0pLFxuICAgIF07XG4gICAgY29uc3QgZXhpc3RpbmdDb21waWxlciA9IG5leHRDb25maWcuY29tcGlsZXIgPz8ge307XG4gICAgY29uc3QgZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlID0gKFxuICAgICAgZXhpc3RpbmdDb21waWxlciBhcyB7XG4gICAgICAgIHJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU/OiAobWV0YWRhdGE6IHtcbiAgICAgICAgICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gICAgICAgICAgZGlzdERpcjogc3RyaW5nO1xuICAgICAgICB9KSA9PiBQcm9taXNlPHZvaWQ+O1xuICAgICAgfVxuICAgICkucnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZTtcblxuICAgIGNvbnN0IGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gQXJyYXkuaXNBcnJheShcbiAgICAgIG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlc1xuICAgIClcbiAgICAgID8gbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzXG4gICAgICA6IFtdO1xuICAgIGxldCBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXM7XG5cbiAgICBpZiAoY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzOiBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IHBhY2thZ2VOYW1lIG9mIGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzKSB7XG4gICAgICAgIGlmIChQU0VVRE9fRVhURVJOQUxfUEFDS0FHRVMuaGFzKHBhY2thZ2VOYW1lKSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBkZXRlY3RlZCA9IGF3YWl0IGRldGVjdFNlcnZlckV4dGVybmFsUGFja2FnZShcbiAgICAgICAgICAgIHBhY2thZ2VOYW1lLFxuICAgICAgICAgICAgcHJvY2Vzcy5jd2QoKVxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKGRldGVjdGVkKSB7XG4gICAgICAgICAgICBkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMucHVzaChkZXRlY3RlZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBOZXZlciBibG9jayBjb25maWcgZ2VuZXJhdGlvbi5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgY29uc3QgcmVtb3ZlZFBhY2thZ2VzID0gbmV3IFNldChcbiAgICAgICAgICBkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMubWFwKChkZXRlY3RlZCkgPT4gZGV0ZWN0ZWQucGFja2FnZU5hbWUpXG4gICAgICAgICk7XG4gICAgICAgIGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMgPVxuICAgICAgICAgIGNvbmZpZ3VyZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmZpbHRlcihcbiAgICAgICAgICAgIChwYWNrYWdlTmFtZSkgPT4gIXJlbW92ZWRQYWNrYWdlcy5oYXMocGFja2FnZU5hbWUpXG4gICAgICAgICAgKTtcbiAgICAgICAgbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcztcbiAgICAgICAgd2FybkFib3V0QXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzKGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gY29uZmlndXJlIHRoZSBsb2FkZXIgaWYgdHVyYm9wYWNrIGlzIGJlaW5nIHVzZWRcbiAgICBpZiAoIW5leHRDb25maWcudHVyYm9wYWNrKSB7XG4gICAgICBuZXh0Q29uZmlnLnR1cmJvcGFjayA9IHt9O1xuICAgIH1cbiAgICBpZiAoIW5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzKSB7XG4gICAgICBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcyA9IHt9O1xuICAgIH1cbiAgICBuZXh0Q29uZmlnLnR1cmJvcGFjay5yZXNvbHZlQWxpYXMgPSB7XG4gICAgICAuLi4oKG5leHRDb25maWcudHVyYm9wYWNrLnJlc29sdmVBbGlhcyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPikgfHwge30pLFxuICAgICAgW1dPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEVdOiB3b3JrZmxvd1RhcmdldFdvcmxkSXNQYXRoXG4gICAgICAgID8gd29ya2Zsb3dUYXJnZXRXb3JsZFdlYnBhY2tBbGlhc1xuICAgICAgICA6IHdvcmtmbG93VGFyZ2V0V29ybGQsXG4gICAgfTtcbiAgICBjb25zdCBleGlzdGluZ1J1bGVzID0gbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMgYXMgYW55O1xuICAgIGNvbnN0IG5leHRWZXJzaW9uID0gcmVzb2x2ZU5leHRWZXJzaW9uKHdvcmtpbmdEaXIpO1xuICAgIGNvbnN0IGNvbmZpZ3VyZWRQcm9qZWN0Um9vdCA9XG4gICAgICBuZXh0Q29uZmlnLm91dHB1dEZpbGVUcmFjaW5nUm9vdCA/PyBuZXh0Q29uZmlnLnR1cmJvcGFjaz8ucm9vdDtcbiAgICBjb25zdCBwcm9qZWN0Um9vdCA9IGNvbmZpZ3VyZWRQcm9qZWN0Um9vdFxuICAgICAgPyByZXNvbHZlQ29uZmlndXJlZFByb2plY3RSb290KHdvcmtpbmdEaXIsIGNvbmZpZ3VyZWRQcm9qZWN0Um9vdClcbiAgICAgIDogcmVzb2x2ZVByb2plY3RSb290KHdvcmtpbmdEaXIpO1xuICAgIGNvbnN0IHN1cHBvcnRzVHVyYm9Db25kaXRpb24gPSBzZW12ZXIuZ3RlKG5leHRWZXJzaW9uLCAndjE2LjAuMCcpO1xuXG4gICAgY29uc3Qgc2hvdWxkV2F0Y2ggPSBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50JztcbiAgICBsZXQgd29ya2Zsb3dCdWlsZGVyUHJvbWlzZTogUHJvbWlzZTxhbnk+IHwgdW5kZWZpbmVkO1xuICAgIGNvbnN0IGRpc3REaXIgPSBuZXh0Q29uZmlnLmRpc3REaXIgfHwgJy5uZXh0JztcblxuICAgIG5leHRDb25maWcuY29tcGlsZXIgPSB7XG4gICAgICAuLi5leGlzdGluZ0NvbXBpbGVyLFxuICAgICAgcnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZTogYXN5bmMgKG1ldGFkYXRhKSA9PiB7XG4gICAgICAgIGlmIChleGlzdGluZ1J1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGUpIHtcbiAgICAgICAgICBhd2FpdCBleGlzdGluZ1J1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGUobWV0YWRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3QobWV0YWRhdGEpO1xuICAgICAgICByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGEpO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgY29uc3QgZ2V0V29ya2Zsb3dCdWlsZGVyID0gYXN5bmMgKCkgPT4ge1xuICAgICAgaWYgKCF3b3JrZmxvd0J1aWxkZXJQcm9taXNlKSB7XG4gICAgICAgIHdvcmtmbG93QnVpbGRlclByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IE5leHRCdWlsZGVyID0gYXdhaXQgZ2V0TmV4dEJ1aWxkZXIobmV4dFZlcnNpb24pO1xuICAgICAgICAgIHJldHVybiBuZXcgTmV4dEJ1aWxkZXIoe1xuICAgICAgICAgICAgd2F0Y2g6IHNob3VsZFdhdGNoLFxuICAgICAgICAgICAgLy8gZ2V0SW5wdXRGaWxlcyBmaWx0ZXJzIHRoZSBwcm9qZWN0IHRvIE5leHQuanMgZW50cnlwb2ludHNcbiAgICAgICAgICAgIGRpcnM6IFsnLiddLFxuICAgICAgICAgICAgcGFnZUV4dGVuc2lvbnM6IG5leHRDb25maWcucGFnZUV4dGVuc2lvbnMgPz8gW1xuICAgICAgICAgICAgICAndHN4JyxcbiAgICAgICAgICAgICAgJ3RzJyxcbiAgICAgICAgICAgICAgJ2pzeCcsXG4gICAgICAgICAgICAgICdqcycsXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgcHJvamVjdFJvb3QsXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXJSb290OiB3b3JraW5nRGlyLFxuICAgICAgICAgICAgd29ya2luZ0RpcixcbiAgICAgICAgICAgIGRpc3REaXIsXG4gICAgICAgICAgICBiYXNlUGF0aDogd29ya2Zsb3dCYXNlUGF0aCxcbiAgICAgICAgICAgIGRpYWdub3N0aWNzRGlyOiBgJHtkaXN0RGlyfS9kaWFnbm9zdGljc2AsXG4gICAgICAgICAgICBidWlsZFRhcmdldDogJ25leHQnLFxuICAgICAgICAgICAgd29ya2Zsb3dzQnVuZGxlUGF0aDogJycsIC8vIG5vdCB1c2VkIGluIGJhc2VcbiAgICAgICAgICAgIHN0ZXBzQnVuZGxlUGF0aDogJycsIC8vIG5vdCB1c2VkIGluIGJhc2VcbiAgICAgICAgICAgIHdlYmhvb2tCdW5kbGVQYXRoOiAnJywgLy8gbm9kZSB1c2VkIGluIGJhc2VcbiAgICAgICAgICAgIHNvdXJjZW1hcDogd29ya2Zsb3dzPy5zb3VyY2VtYXAsXG4gICAgICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBbXG4gICAgICAgICAgICAgIC8vIHNlcnZlci1vbmx5IGFuZCBjbGllbnQtb25seSBhcmUgcHNldWRvLXBhY2thZ2VzIGhhbmRsZWQgYnkgTmV4dC5qc1xuICAgICAgICAgICAgICAvLyBkdXJpbmcgaXRzIGJ1aWxkIHByb2Nlc3MuIFdlIG1hcmsgdGhlbSBhcyBleHRlcm5hbCB0byBwcmV2ZW50IGVzYnVpbGRcbiAgICAgICAgICAgICAgLy8gZnJvbSBmYWlsaW5nIHdoZW4gYnVuZGxpbmcgY29kZSB0aGF0IGltcG9ydHMgdGhlbS5cbiAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL25leHRqcy5vcmcvZG9jcy9hcHAvZ2V0dGluZy1zdGFydGVkL3NlcnZlci1hbmQtY2xpZW50LWNvbXBvbmVudHNcbiAgICAgICAgICAgICAgJ3NlcnZlci1vbmx5JyxcbiAgICAgICAgICAgICAgJ2NsaWVudC1vbmx5JyxcbiAgICAgICAgICAgICAgLi4uZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pKCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3b3JrZmxvd0J1aWxkZXJQcm9taXNlO1xuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IGtleSBvZiBbXG4gICAgICAnKi50c3gnLFxuICAgICAgJyoudHMnLFxuICAgICAgJyouanN4JyxcbiAgICAgICcqLmpzJyxcbiAgICAgICcqLm1qcycsXG4gICAgICAnKi5tdHMnLFxuICAgICAgJyouY2pzJyxcbiAgICAgICcqLmN0cycsXG4gICAgXSkge1xuICAgICAgbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXNba2V5XSA9IHtcbiAgICAgICAgLi4uKHN1cHBvcnRzVHVyYm9Db25kaXRpb25cbiAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uOiB7XG4gICAgICAgICAgICAgICAgLy8gVXNlICdhbGwnIHRvIGNvbWJpbmU6IG11c3QgbWF0Y2ggY29udGVudCBBTkQgbXVzdCBOT1QgYmUgaW4gZ2VuZXJhdGVkIHBhdGhcbiAgICAgICAgICAgICAgICAvLyBNZXJnZSB3aXRoIGFueSBleGlzdGluZyAnYWxsJyBjb25kaXRpb25zIGZyb20gdXNlciBjb25maWdcbiAgICAgICAgICAgICAgICBhbGw6IFtcbiAgICAgICAgICAgICAgICAgIC4uLihleGlzdGluZ1J1bGVzW2tleV0/LmNvbmRpdGlvbj8uYWxsIHx8IFtdKSxcbiAgICAgICAgICAgICAgICAgIC8vIEV4Y2x1ZGUgZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzIGZyb20gdHJhbnNmb3JtYXRpb25cbiAgICAgICAgICAgICAgICAgIHsgbm90OiB7IHBhdGg6IC9bL1xcXFxdXFwud2VsbC1rbm93blsvXFxcXF13b3JrZmxvd1svXFxcXF0vIH0gfSxcbiAgICAgICAgICAgICAgICAgIC8vIE1hdGNoIGZpbGVzIHdpdGggd29ya2Zsb3cgZGlyZWN0aXZlcyBvciBjdXN0b20gc2VyaWFsaXphdGlvbiBwYXR0ZXJuc1xuICAgICAgICAgICAgICAgICAgLy8gVXNlcyBiYWNrcmVmZXJlbmNlcyAoXFwyLCBcXDMpIHRvIGVuc3VyZSBtYXRjaGluZyBxdW90ZSB0eXBlc1xuICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50OlxuICAgICAgICAgICAgICAgICAgICAgIC8odXNlIHdvcmtmbG93fHVzZSBzdGVwfEB3b3JrZmxvd1xcL2NvcmVcXC9ydW50aW1lXFwvd29ybGQtdGFyZ2V0fGZyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwyfFN5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDNcXHMqXFwpKS8sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIGxvYWRlcnM6IFsuLi4oZXhpc3RpbmdSdWxlc1trZXldPy5sb2FkZXJzIHx8IFtdKSwgbG9hZGVyUGF0aF0sXG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vIGNvbmZpZ3VyZSB0aGUgbG9hZGVyIGZvciB3ZWJwYWNrXG4gICAgY29uc3QgZXhpc3RpbmdXZWJwYWNrTW9kaWZ5ID0gbmV4dENvbmZpZy53ZWJwYWNrO1xuICAgIG5leHRDb25maWcud2VicGFjayA9ICguLi5hcmdzKSA9PiB7XG4gICAgICBsZXQgW3dlYnBhY2tDb25maWddID0gYXJncztcbiAgICAgIHdlYnBhY2tDb25maWcgPSBleGlzdGluZ1dlYnBhY2tNb2RpZnlcbiAgICAgICAgPyAoZXhpc3RpbmdXZWJwYWNrTW9kaWZ5KC4uLmFyZ3MpID8/IHdlYnBhY2tDb25maWcpXG4gICAgICAgIDogd2VicGFja0NvbmZpZztcblxuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZSkge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZSA9IHt9O1xuICAgICAgfVxuICAgICAgaWYgKCF3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcykge1xuICAgICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcyA9IFtdO1xuICAgICAgfVxuICAgICAgLy8gbG9hZGVycyBpbiB3ZWJwYWNrIGFwcGx5IGJvdHRvbS0+dXAgc28gZW5zdXJlXG4gICAgICAvLyBvdXJzIGNvbWVzIGJlZm9yZSB0aGUgZGVmYXVsdCBzd2MgdHJhbnNmb3JtXG4gICAgICB3ZWJwYWNrQ29uZmlnLm1vZHVsZS5ydWxlcy5wdXNoKHtcbiAgICAgICAgdGVzdDogLy4qXFwuKG1qc3xjanN8Y3RzfHRzfHRzeHxqc3xqc3gpJC8sXG4gICAgICAgIGxvYWRlcjogbG9hZGVyUGF0aCxcbiAgICAgIH0pO1xuXG4gICAgICB3ZWJwYWNrQ29uZmlnLnJlc29sdmUgfHw9IHt9O1xuICAgICAgY29uc3QgZXhpc3RpbmdBbGlhcyA9IHdlYnBhY2tDb25maWcucmVzb2x2ZS5hbGlhcztcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGV4aXN0aW5nQWxpYXMpKSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcucmVzb2x2ZS5hbGlhcyA9IFtcbiAgICAgICAgICAuLi5leGlzdGluZ0FsaWFzLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIG5hbWU6IFdPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEUsXG4gICAgICAgICAgICBhbGlhczogd29ya2Zsb3dUYXJnZXRXb3JsZFdlYnBhY2tBbGlhcyxcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5yZXNvbHZlLmFsaWFzID0ge1xuICAgICAgICAgIC4uLihleGlzdGluZ0FsaWFzIHx8IHt9KSxcbiAgICAgICAgICBbV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRV06IHdvcmtmbG93VGFyZ2V0V29ybGRXZWJwYWNrQWxpYXMsXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnO1xuICAgIH07XG4gICAgLy8gb25seSBydW4gdGhpcyBpbiB0aGUgbWFpbiBwcm9jZXNzIHNvIGl0IG9ubHkgcnVucyBvbmNlXG4gICAgLy8gYXMgTmV4dC5qcyB1c2VzIGNoaWxkIHByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IGJ1aWxkc1xuICAgIGlmIChcbiAgICAgICFwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX1BSSVZBVEVfQlVJTFQgJiZcbiAgICAgIHBoYXNlICE9PSAncGhhc2UtcHJvZHVjdGlvbi1zZXJ2ZXInXG4gICAgKSB7XG4gICAgICBjb25zdCB3b3JrZmxvd0J1aWxkZXIgPSBhd2FpdCBnZXRXb3JrZmxvd0J1aWxkZXIoKTtcblxuICAgICAgYXdhaXQgd29ya2Zsb3dCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX1BSSVZBVEVfQlVJTFQgPSAnMSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRDb25maWc7XG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Directory-name fragments that are always excluded from the dev watcher,
|
|
3
|
+
* regardless of `.gitignore`. Matched as POSIX substrings of the absolute
|
|
4
|
+
* path (e.g. `/node_modules/` matches any path containing that segment).
|
|
5
|
+
*/
|
|
6
|
+
export declare const BUILTIN_IGNORED_PATH_FRAGMENTS: readonly string[];
|
|
7
|
+
/**
|
|
8
|
+
* Environment variable that lets a project add extra path fragments to the
|
|
9
|
+
* dev watcher ignore list. Comma-separated; each entry is matched as a POSIX
|
|
10
|
+
* substring of the absolute path, exactly like {@link BUILTIN_IGNORED_PATH_FRAGMENTS}.
|
|
11
|
+
* Additive to `.gitignore` and the built-in list. Dev-mode only.
|
|
12
|
+
*/
|
|
13
|
+
export declare const WATCH_IGNORED_PATHS_ENV = "WORKFLOW_DEV_WATCH_IGNORED_PATHS";
|
|
14
|
+
/**
|
|
15
|
+
* Parse the comma-separated {@link WATCH_IGNORED_PATHS_ENV} value into a list
|
|
16
|
+
* of POSIX path fragments. Whitespace is trimmed and empty entries dropped.
|
|
17
|
+
*/
|
|
18
|
+
export declare function parseIgnoredPathsEnv(value: string | undefined): string[];
|
|
19
|
+
export interface WatchIgnoreOptions {
|
|
20
|
+
/** Absolute path of the app directory being built. */
|
|
21
|
+
workingDir: string;
|
|
22
|
+
/** Absolute path of the workspace/project root. Defaults to `workingDir`. */
|
|
23
|
+
projectRoot?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Extra POSIX substring fragments to ignore, in addition to the built-in
|
|
26
|
+
* list and the {@link WATCH_IGNORED_PATHS_ENV} env var. Used by the caller
|
|
27
|
+
* for build-time paths such as the generated workflow directory.
|
|
28
|
+
*/
|
|
29
|
+
extraFragments?: string[];
|
|
30
|
+
/**
|
|
31
|
+
* Override for the {@link WATCH_IGNORED_PATHS_ENV} env var. Primarily for
|
|
32
|
+
* testing; defaults to `process.env[WATCH_IGNORED_PATHS_ENV]`.
|
|
33
|
+
*/
|
|
34
|
+
envIgnoredPaths?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Build the dev-watcher ignore predicate. The returned function receives a
|
|
38
|
+
* POSIX-normalized absolute path and returns `true` when that path should be
|
|
39
|
+
* pruned from both the initial directory walk and the chokidar watch set.
|
|
40
|
+
*
|
|
41
|
+
* A path is ignored when it matches any of:
|
|
42
|
+
* - a built-in fragment ({@link BUILTIN_IGNORED_PATH_FRAGMENTS}) or caller
|
|
43
|
+
* `extraFragments` (POSIX substring match),
|
|
44
|
+
* - a {@link WATCH_IGNORED_PATHS_ENV} fragment (POSIX substring match),
|
|
45
|
+
* - a `.gitignore` rule from `workingDir` up to `projectRoot`.
|
|
46
|
+
*
|
|
47
|
+
* Matchers are built once here; the returned predicate is hot (called per path
|
|
48
|
+
* during traversal and per chokidar event) and does no I/O.
|
|
49
|
+
*/
|
|
50
|
+
export declare function createWatchIgnorePredicate(options: WatchIgnoreOptions): (normalizedPath: string) => boolean;
|
|
51
|
+
//# sourceMappingURL=watch-ignore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watch-ignore.d.ts","sourceRoot":"","sources":["../src/watch-ignore.ts"],"names":[],"mappings":"AAIA;;;;GAIG;AACH,eAAO,MAAM,8BAA8B,EAAE,SAAS,MAAM,EAc3D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB,qCAAqC,CAAC;AAI1E;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,EAAE,CAQxE;AAyFD,MAAM,WAAW,kBAAkB;IACjC,sDAAsD;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,kBAAkB,GAC1B,CAAC,cAAc,EAAE,MAAM,KAAK,OAAO,CA2JrC"}
|
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.WATCH_IGNORED_PATHS_ENV = exports.BUILTIN_IGNORED_PATH_FRAGMENTS = void 0;
|
|
7
|
+
exports.parseIgnoredPathsEnv = parseIgnoredPathsEnv;
|
|
8
|
+
exports.createWatchIgnorePredicate = createWatchIgnorePredicate;
|
|
9
|
+
const node_fs_1 = require("node:fs");
|
|
10
|
+
const node_path_1 = require("node:path");
|
|
11
|
+
const ignore_1 = __importDefault(require("ignore"));
|
|
12
|
+
/**
|
|
13
|
+
* Directory-name fragments that are always excluded from the dev watcher,
|
|
14
|
+
* regardless of `.gitignore`. Matched as POSIX substrings of the absolute
|
|
15
|
+
* path (e.g. `/node_modules/` matches any path containing that segment).
|
|
16
|
+
*/
|
|
17
|
+
exports.BUILTIN_IGNORED_PATH_FRAGMENTS = [
|
|
18
|
+
'/.git/',
|
|
19
|
+
'/node_modules/',
|
|
20
|
+
'/.next/',
|
|
21
|
+
'/.turbo/',
|
|
22
|
+
'/.vercel/',
|
|
23
|
+
'/dist/',
|
|
24
|
+
'/build/',
|
|
25
|
+
'/out/',
|
|
26
|
+
'/.cache/',
|
|
27
|
+
'/.yarn/',
|
|
28
|
+
'/.pnpm-store/',
|
|
29
|
+
'/.parcel-cache/',
|
|
30
|
+
'/.well-known/workflow/',
|
|
31
|
+
];
|
|
32
|
+
/**
|
|
33
|
+
* Environment variable that lets a project add extra path fragments to the
|
|
34
|
+
* dev watcher ignore list. Comma-separated; each entry is matched as a POSIX
|
|
35
|
+
* substring of the absolute path, exactly like {@link BUILTIN_IGNORED_PATH_FRAGMENTS}.
|
|
36
|
+
* Additive to `.gitignore` and the built-in list. Dev-mode only.
|
|
37
|
+
*/
|
|
38
|
+
exports.WATCH_IGNORED_PATHS_ENV = 'WORKFLOW_DEV_WATCH_IGNORED_PATHS';
|
|
39
|
+
const toPosix = (pathname) => pathname.replace(/\\/g, '/');
|
|
40
|
+
/**
|
|
41
|
+
* Parse the comma-separated {@link WATCH_IGNORED_PATHS_ENV} value into a list
|
|
42
|
+
* of POSIX path fragments. Whitespace is trimmed and empty entries dropped.
|
|
43
|
+
*/
|
|
44
|
+
function parseIgnoredPathsEnv(value) {
|
|
45
|
+
if (!value) {
|
|
46
|
+
return [];
|
|
47
|
+
}
|
|
48
|
+
return value
|
|
49
|
+
.split(',')
|
|
50
|
+
.map((entry) => toPosix(entry.trim()))
|
|
51
|
+
.filter((entry) => entry.length > 0);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Rebuild a matcher with `dropped` pattern lines removed. Used when a rule
|
|
55
|
+
* excluded a directory that a deeper `.gitignore` re-included: that rule must
|
|
56
|
+
* stop applying to the subtree, while every *other* rule in the same file
|
|
57
|
+
* (e.g. a `*.secret` that still matches a file inside) keeps applying.
|
|
58
|
+
*/
|
|
59
|
+
function matcherWithout(entry, dropped) {
|
|
60
|
+
if (dropped.size === 0) {
|
|
61
|
+
return entry.matcher;
|
|
62
|
+
}
|
|
63
|
+
const key = [...dropped].sort().join('\n');
|
|
64
|
+
const cached = entry.filtered.get(key);
|
|
65
|
+
if (cached) {
|
|
66
|
+
return cached;
|
|
67
|
+
}
|
|
68
|
+
const rebuilt = (0, ignore_1.default)().add(entry.lines.filter((line) => !dropped.has(line.trim())));
|
|
69
|
+
entry.filtered.set(key, rebuilt);
|
|
70
|
+
return rebuilt;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Load `.gitignore` matchers for `workingDir` up to and including
|
|
74
|
+
* `projectRoot`. In a monorepo the largest ignored trees are typically listed
|
|
75
|
+
* at the workspace root, and app-level `.gitignore` files are covered too.
|
|
76
|
+
*
|
|
77
|
+
* Returned outermost-first (workspace root → app), which is the order git
|
|
78
|
+
* applies them: a rule in a deeper `.gitignore` overrides a conflicting rule
|
|
79
|
+
* from a shallower one.
|
|
80
|
+
*
|
|
81
|
+
* Nested `.gitignore` files *below* `workingDir` are intentionally not read —
|
|
82
|
+
* the {@link WATCH_IGNORED_PATHS_ENV} env var backstops anything they'd cover.
|
|
83
|
+
*/
|
|
84
|
+
function loadGitignoreMatchers(workingDir, projectRoot) {
|
|
85
|
+
const matchers = [];
|
|
86
|
+
const stopAt = toPosix(projectRoot);
|
|
87
|
+
let current = toPosix(workingDir);
|
|
88
|
+
while (true) {
|
|
89
|
+
let content;
|
|
90
|
+
try {
|
|
91
|
+
content = (0, node_fs_1.readFileSync)(node_path_1.posix.join(current, '.gitignore'), 'utf-8');
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
content = undefined;
|
|
95
|
+
}
|
|
96
|
+
if (content) {
|
|
97
|
+
const lines = content.split('\n');
|
|
98
|
+
matchers.push({
|
|
99
|
+
dir: current,
|
|
100
|
+
matcher: (0, ignore_1.default)().add(content),
|
|
101
|
+
lines,
|
|
102
|
+
hasNegation: lines.some((line) => line.trim().startsWith('!')),
|
|
103
|
+
filtered: new Map(),
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (current === stopAt) {
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
const parent = (0, node_path_1.dirname)(current);
|
|
110
|
+
if (parent === current) {
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
current = parent;
|
|
114
|
+
}
|
|
115
|
+
// Collected innermost-first while walking up; git precedence is
|
|
116
|
+
// outermost-first, with deeper files winning.
|
|
117
|
+
return matchers.reverse();
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Build the dev-watcher ignore predicate. The returned function receives a
|
|
121
|
+
* POSIX-normalized absolute path and returns `true` when that path should be
|
|
122
|
+
* pruned from both the initial directory walk and the chokidar watch set.
|
|
123
|
+
*
|
|
124
|
+
* A path is ignored when it matches any of:
|
|
125
|
+
* - a built-in fragment ({@link BUILTIN_IGNORED_PATH_FRAGMENTS}) or caller
|
|
126
|
+
* `extraFragments` (POSIX substring match),
|
|
127
|
+
* - a {@link WATCH_IGNORED_PATHS_ENV} fragment (POSIX substring match),
|
|
128
|
+
* - a `.gitignore` rule from `workingDir` up to `projectRoot`.
|
|
129
|
+
*
|
|
130
|
+
* Matchers are built once here; the returned predicate is hot (called per path
|
|
131
|
+
* during traversal and per chokidar event) and does no I/O.
|
|
132
|
+
*/
|
|
133
|
+
function createWatchIgnorePredicate(options) {
|
|
134
|
+
const projectRoot = options.projectRoot ?? options.workingDir;
|
|
135
|
+
const envIgnoredPaths = options.envIgnoredPaths ?? process.env[exports.WATCH_IGNORED_PATHS_ENV];
|
|
136
|
+
const fragments = [
|
|
137
|
+
...exports.BUILTIN_IGNORED_PATH_FRAGMENTS,
|
|
138
|
+
...(options.extraFragments ?? []).map(toPosix),
|
|
139
|
+
...parseIgnoredPathsEnv(envIgnoredPaths),
|
|
140
|
+
];
|
|
141
|
+
const gitignoreMatchers = loadGitignoreMatchers(options.workingDir, projectRoot);
|
|
142
|
+
// Re-inclusion is only possible when some file has a `!` rule. Without one,
|
|
143
|
+
// the cheap flat scan below is equivalent to the full per-directory walk.
|
|
144
|
+
const anyNegation = gitignoreMatchers.some((entry) => entry.hasNegation);
|
|
145
|
+
const outermostDir = gitignoreMatchers[0]?.dir;
|
|
146
|
+
/** Test one path against one matcher, as both a file and a directory node. */
|
|
147
|
+
const testEntry = (entry, rel, dropped) => {
|
|
148
|
+
const matcher = dropped ? matcherWithout(entry, dropped) : entry.matcher;
|
|
149
|
+
// Test the trailing-slash form too so a directory node itself matches a
|
|
150
|
+
// `dir/` gitignore rule (not just its children) — this lets the walk and
|
|
151
|
+
// chokidar prune the directory instead of descending into it.
|
|
152
|
+
const asFile = matcher.test(rel);
|
|
153
|
+
const asDir = matcher.test(`${rel}/`);
|
|
154
|
+
if (asFile.ignored) {
|
|
155
|
+
return { ignored: true, pattern: asFile.rule?.pattern };
|
|
156
|
+
}
|
|
157
|
+
if (asDir.ignored) {
|
|
158
|
+
return { ignored: true, pattern: asDir.rule?.pattern };
|
|
159
|
+
}
|
|
160
|
+
if (asFile.unignored || asDir.unignored) {
|
|
161
|
+
return { ignored: false, pattern: undefined };
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
};
|
|
165
|
+
/**
|
|
166
|
+
* Resolve one path level against every applicable `.gitignore`, deepest file
|
|
167
|
+
* last so it wins. Returns the level's verdict plus the rules that voted to
|
|
168
|
+
* exclude it, which the caller neutralizes if the level is re-included.
|
|
169
|
+
*/
|
|
170
|
+
const decideLevel = (prefix, neutralized) => {
|
|
171
|
+
let decision;
|
|
172
|
+
let excludedBy = [];
|
|
173
|
+
for (let index = 0; index < gitignoreMatchers.length; index++) {
|
|
174
|
+
const entry = gitignoreMatchers[index];
|
|
175
|
+
const rel = node_path_1.posix.relative(entry.dir, prefix);
|
|
176
|
+
// Empty means the path *is* the gitignore dir; a `..` prefix means it is
|
|
177
|
+
// outside. `ignore` only accepts relative, in-tree paths.
|
|
178
|
+
if (rel === '' || rel === '..' || rel.startsWith('../')) {
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
const result = testEntry(entry, rel, neutralized.get(index));
|
|
182
|
+
if (!result) {
|
|
183
|
+
continue;
|
|
184
|
+
}
|
|
185
|
+
if (!result.ignored) {
|
|
186
|
+
decision = false;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
if (decision !== true) {
|
|
190
|
+
excludedBy = [];
|
|
191
|
+
}
|
|
192
|
+
decision = true;
|
|
193
|
+
if (result.pattern) {
|
|
194
|
+
excludedBy.push({ index, pattern: result.pattern });
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return { decision, excludedBy };
|
|
198
|
+
};
|
|
199
|
+
/**
|
|
200
|
+
* Walk the path one directory segment at a time, the way git does. At each
|
|
201
|
+
* level the deepest `.gitignore` with an opinion wins; if that verdict is
|
|
202
|
+
* "ignored" git stops descending, so we can return immediately.
|
|
203
|
+
*
|
|
204
|
+
* When a level is re-included after a shallower file excluded it, the rule
|
|
205
|
+
* that did the excluding is neutralized for the rest of the walk. That is
|
|
206
|
+
* what lets root `generated/` + app `!generated/` watch `app/generated/x.ts`
|
|
207
|
+
* while a sibling root rule such as `*.secret` still excludes
|
|
208
|
+
* `app/generated/a.secret`.
|
|
209
|
+
*/
|
|
210
|
+
const walkGitignore = (normalizedPath) => {
|
|
211
|
+
if (!outermostDir) {
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
const relToBase = node_path_1.posix.relative(outermostDir, normalizedPath);
|
|
215
|
+
if (relToBase === '' || relToBase === '..' || relToBase.startsWith('../')) {
|
|
216
|
+
return false;
|
|
217
|
+
}
|
|
218
|
+
const neutralized = new Map();
|
|
219
|
+
let prefix = outermostDir;
|
|
220
|
+
for (const segment of relToBase.split('/')) {
|
|
221
|
+
prefix = `${prefix}/${segment}`;
|
|
222
|
+
const { decision, excludedBy } = decideLevel(prefix, neutralized);
|
|
223
|
+
if (decision === true) {
|
|
224
|
+
// Git does not descend into an excluded directory.
|
|
225
|
+
return true;
|
|
226
|
+
}
|
|
227
|
+
if (decision === false) {
|
|
228
|
+
// This level was re-included; the rules that excluded it must not
|
|
229
|
+
// resurrect for anything beneath it.
|
|
230
|
+
for (const { index, pattern } of excludedBy) {
|
|
231
|
+
const dropped = neutralized.get(index) ?? new Set();
|
|
232
|
+
dropped.add(pattern);
|
|
233
|
+
neutralized.set(index, dropped);
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
};
|
|
239
|
+
return (normalizedPath) => {
|
|
240
|
+
// Built-in and env-var fragments are hard excludes: they are deliberately
|
|
241
|
+
// not subject to gitignore negation, so a stray `!` rule cannot drag
|
|
242
|
+
// `node_modules` or the generated directory back into the watch set.
|
|
243
|
+
for (const fragment of fragments) {
|
|
244
|
+
if (normalizedPath.includes(fragment)) {
|
|
245
|
+
return true;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
if (!anyNegation) {
|
|
249
|
+
// Fast path: no re-inclusion anywhere, so the first match decides.
|
|
250
|
+
for (const entry of gitignoreMatchers) {
|
|
251
|
+
const rel = node_path_1.posix.relative(entry.dir, normalizedPath);
|
|
252
|
+
if (rel === '' || rel === '..' || rel.startsWith('../')) {
|
|
253
|
+
continue;
|
|
254
|
+
}
|
|
255
|
+
if (entry.matcher.ignores(rel) || entry.matcher.ignores(`${rel}/`)) {
|
|
256
|
+
return true;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return false;
|
|
260
|
+
}
|
|
261
|
+
return walkGitignore(normalizedPath);
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtaWdub3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3dhdGNoLWlnbm9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUF1Q0Esb0RBUUM7QUF5SEQsZ0VBNkpDO0FBclVELHFDQUF1QztBQUN2Qyx5Q0FBMkM7QUFDM0Msb0RBQTZDO0FBRTdDOzs7O0dBSUc7QUFDVSxRQUFBLDhCQUE4QixHQUFzQjtJQUMvRCxRQUFRO0lBQ1IsZ0JBQWdCO0lBQ2hCLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLFFBQVE7SUFDUixTQUFTO0lBQ1QsT0FBTztJQUNQLFVBQVU7SUFDVixTQUFTO0lBQ1QsZUFBZTtJQUNmLGlCQUFpQjtJQUNqQix3QkFBd0I7Q0FDekIsQ0FBQztBQUVGOzs7OztHQUtHO0FBQ1UsUUFBQSx1QkFBdUIsR0FBRyxrQ0FBa0MsQ0FBQztBQUUxRSxNQUFNLE9BQU8sR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRW5FOzs7R0FHRztBQUNILFNBQWdCLG9CQUFvQixDQUFDLEtBQXlCO0lBQzVELElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUNELE9BQU8sS0FBSztTQUNULEtBQUssQ0FBQyxHQUFHLENBQUM7U0FDVixHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztTQUNyQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDekMsQ0FBQztBQWNEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBdUIsRUFBRSxPQUFvQjtJQUNuRSxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtB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QkFDeEQsU0FBUztnQkFDWCxDQUFDO2dCQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUM7b0JBQ25FLE9BQU8sSUFBSSxDQUFDO2dCQUNkLENBQUM7WUFDSCxDQUFDO1lBQ0QsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgcG9zaXggfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IGlnbm9yZSwgeyB0eXBlIElnbm9yZSB9IGZyb20gJ2lnbm9yZSc7XG5cbi8qKlxuICogRGlyZWN0b3J5LW5hbWUgZnJhZ21lbnRzIHRoYXQgYXJlIGFsd2F5cyBleGNsdWRlZCBmcm9tIHRoZSBkZXYgd2F0Y2hlcixcbiAqIHJlZ2FyZGxlc3Mgb2YgYC5naXRpZ25vcmVgLiBNYXRjaGVkIGFzIFBPU0lYIHN1YnN0cmluZ3Mgb2YgdGhlIGFic29sdXRlXG4gKiBwYXRoIChlLmcuIGAvbm9kZV9tb2R1bGVzL2AgbWF0Y2hlcyBhbnkgcGF0aCBjb250YWluaW5nIHRoYXQgc2VnbWVudCkuXG4gKi9cbmV4cG9ydCBjb25zdCBCVUlMVElOX0lHTk9SRURfUEFUSF9GUkFHTUVOVFM6IHJlYWRvbmx5IHN0cmluZ1tdID0gW1xuICAnLy5naXQvJyxcbiAgJy9ub2RlX21vZHVsZXMvJyxcbiAgJy8ubmV4dC8nLFxuICAnLy50dXJiby8nLFxuICAnLy52ZXJjZWwvJyxcbiAgJy9kaXN0LycsXG4gICcvYnVpbGQvJyxcbiAgJy9vdXQvJyxcbiAgJy8uY2FjaGUvJyxcbiAgJy8ueWFybi8nLFxuICAnLy5wbnBtLXN0b3JlLycsXG4gICcvLnBhcmNlbC1jYWNoZS8nLFxuICAnLy53ZWxsLWtub3duL3dvcmtmbG93LycsXG5dO1xuXG4vKipcbiAqIEVudmlyb25tZW50IHZhcmlhYmxlIHRoYXQgbGV0cyBhIHByb2plY3QgYWRkIGV4dHJhIHBhdGggZnJhZ21lbnRzIHRvIHRoZVxuICogZGV2IHdhdGNoZXIgaWdub3JlIGxpc3QuIENvbW1hLXNlcGFyYXRlZDsgZWFjaCBlbnRyeSBpcyBtYXRjaGVkIGFzIGEgUE9TSVhcbiAqIHN1YnN0cmluZyBvZiB0aGUgYWJzb2x1dGUgcGF0aCwgZXhhY3RseSBsaWtlIHtAbGluayBCVUlMVElOX0lHTk9SRURfUEFUSF9GUkFHTUVOVFN9LlxuICogQWRkaXRpdmUgdG8gYC5naXRpZ25vcmVgIGFuZCB0aGUgYnVpbHQtaW4gbGlzdC4gRGV2LW1vZGUgb25seS5cbiAqL1xuZXhwb3J0IGNvbnN0IFdBVENIX0lHTk9SRURfUEFUSFNfRU5WID0gJ1dPUktGTE9XX0RFVl9XQVRDSF9JR05PUkVEX1BBVEhTJztcblxuY29uc3QgdG9Qb3NpeCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbi8qKlxuICogUGFyc2UgdGhlIGNvbW1hLXNlcGFyYXRlZCB7QGxpbmsgV0FUQ0hfSUdOT1JFRF9QQVRIU19FTlZ9IHZhbHVlIGludG8gYSBsaXN0XG4gKiBvZiBQT1NJWCBwYXRoIGZyYWdtZW50cy4gV2hpdGVzcGFjZSBpcyB0cmltbWVkIGFuZCBlbXB0eSBlbnRyaWVzIGRyb3BwZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUlnbm9yZWRQYXRoc0Vudih2YWx1ZTogc3RyaW5nIHwgdW5kZWZpbmVkKTogc3RyaW5nW10ge1xuICBpZiAoIXZhbHVlKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiB2YWx1ZVxuICAgIC5zcGxpdCgnLCcpXG4gICAgLm1hcCgoZW50cnkpID0+IHRvUG9zaXgoZW50cnkudHJpbSgpKSlcbiAgICAuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkubGVuZ3RoID4gMCk7XG59XG5cbmludGVyZmFjZSBHaXRpZ25vcmVNYXRjaGVyIHtcbiAgLyoqIFBPU0lYIGFic29sdXRlIGRpcmVjdG9yeSB0aGUgYC5naXRpZ25vcmVgIGxpdmVzIGluIChubyB0cmFpbGluZyBzbGFzaCkuICovXG4gIGRpcjogc3RyaW5nO1xuICBtYXRjaGVyOiBJZ25vcmU7XG4gIC8qKiBSYXcgcGF0dGVybiBsaW5lcywgdXNlZCB0byByZWJ1aWxkIHRoZSBtYXRjaGVyIHdpdGhvdXQgYSBuZXV0cmFsaXplZCBydWxlLiAqL1xuICBsaW5lczogc3RyaW5nW107XG4gIC8qKiBXaGV0aGVyIHRoaXMgZmlsZSBjb250YWlucyBhbnkgYCFgIHJlLWluY2x1c2lvbiBydWxlLiAqL1xuICBoYXNOZWdhdGlvbjogYm9vbGVhbjtcbiAgLyoqIE1hdGNoZXJzIHJlYnVpbHQgd2l0aCBzb21lIHJ1bGVzIGRyb3BwZWQsIGtleWVkIGJ5IHRoZSBkcm9wcGVkIHNldC4gKi9cbiAgZmlsdGVyZWQ6IE1hcDxzdHJpbmcsIElnbm9yZT47XG59XG5cbi8qKlxuICogUmVidWlsZCBhIG1hdGNoZXIgd2l0aCBgZHJvcHBlZGAgcGF0dGVybiBsaW5lcyByZW1vdmVkLiBVc2VkIHdoZW4gYSBydWxlXG4gKiBleGNsdWRlZCBhIGRpcmVjdG9yeSB0aGF0IGEgZGVlcGVyIGAuZ2l0aWdub3JlYCByZS1pbmNsdWRlZDogdGhhdCBydWxlIG11c3RcbiAqIHN0b3AgYXBwbHlpbmcgdG8gdGhlIHN1YnRyZWUsIHdoaWxlIGV2ZXJ5ICpvdGhlciogcnVsZSBpbiB0aGUgc2FtZSBmaWxlXG4gKiAoZS5nLiBhIGAqLnNlY3JldGAgdGhhdCBzdGlsbCBtYXRjaGVzIGEgZmlsZSBpbnNpZGUpIGtlZXBzIGFwcGx5aW5nLlxuICovXG5mdW5jdGlvbiBtYXRjaGVyV2l0aG91dChlbnRyeTogR2l0aWdub3JlTWF0Y2hlciwgZHJvcHBlZDogU2V0PHN0cmluZz4pOiBJZ25vcmUge1xuICBpZiAoZHJvcHBlZC5zaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGVudHJ5Lm1hdGNoZXI7XG4gIH1cbiAgY29uc3Qga2V5ID0gWy4uLmRyb3BwZWRdLnNvcnQoKS5qb2luKCdcXG4nKTtcbiAgY29uc3QgY2FjaGVkID0gZW50cnkuZmlsdGVyZWQuZ2V0KGtleSk7XG4gIGlmIChjYWNoZWQpIHtcbiAgICByZXR1cm4gY2FjaGVkO1xuICB9XG4gIGNvbnN0IHJlYnVpbHQgPSBpZ25vcmUoKS5hZGQoXG4gICAgZW50cnkubGluZXMuZmlsdGVyKChsaW5lKSA9PiAhZHJvcHBlZC5oYXMobGluZS50cmltKCkpKVxuICApO1xuICBlbnRyeS5maWx0ZXJlZC5zZXQoa2V5LCByZWJ1aWx0KTtcbiAgcmV0dXJuIHJlYnVpbHQ7XG59XG5cbi8qKlxuICogTG9hZCBgLmdpdGlnbm9yZWAgbWF0Y2hlcnMgZm9yIGB3b3JraW5nRGlyYCB1cCB0byBhbmQgaW5jbHVkaW5nXG4gKiBgcHJvamVjdFJvb3RgLiBJbiBhIG1vbm9yZXBvIHRoZSBsYXJnZXN0IGlnbm9yZWQgdHJlZXMgYXJlIHR5cGljYWxseSBsaXN0ZWRcbiAqIGF0IHRoZSB3b3Jrc3BhY2Ugcm9vdCwgYW5kIGFwcC1sZXZlbCBgLmdpdGlnbm9yZWAgZmlsZXMgYXJlIGNvdmVyZWQgdG9vLlxuICpcbiAqIFJldHVybmVkIG91dGVybW9zdC1maXJzdCAod29ya3NwYWNlIHJvb3Qg4oaSIGFwcCksIHdoaWNoIGlzIHRoZSBvcmRlciBnaXRcbiAqIGFwcGxpZXMgdGhlbTogYSBydWxlIGluIGEgZGVlcGVyIGAuZ2l0aWdub3JlYCBvdmVycmlkZXMgYSBjb25mbGljdGluZyBydWxlXG4gKiBmcm9tIGEgc2hhbGxvd2VyIG9uZS5cbiAqXG4gKiBOZXN0ZWQgYC5naXRpZ25vcmVgIGZpbGVzICpiZWxvdyogYHdvcmtpbmdEaXJgIGFyZSBpbnRlbnRpb25hbGx5IG5vdCByZWFkIOKAlFxuICogdGhlIHtAbGluayBXQVRDSF9JR05PUkVEX1BBVEhTX0VOVn0gZW52IHZhciBiYWNrc3RvcHMgYW55dGhpbmcgdGhleSdkIGNvdmVyLlxuICovXG5mdW5jdGlvbiBsb2FkR2l0aWdub3JlTWF0Y2hlcnMoXG4gIHdvcmtpbmdEaXI6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZ1xuKTogR2l0aWdub3JlTWF0Y2hlcltdIHtcbiAgY29uc3QgbWF0Y2hlcnM6IEdpdGlnbm9yZU1hdGNoZXJbXSA9IFtdO1xuICBjb25zdCBzdG9wQXQgPSB0b1Bvc2l4KHByb2plY3RSb290KTtcblxuICBsZXQgY3VycmVudCA9IHRvUG9zaXgod29ya2luZ0Rpcik7XG4gIHdoaWxlICh0cnVlKSB7XG4gICAgbGV0IGNvbnRlbnQ6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgICB0cnkge1xuICAgICAgY29udGVudCA9IHJlYWRGaWxlU3luYyhwb3NpeC5qb2luKGN1cnJlbnQsICcuZ2l0aWdub3JlJyksICd1dGYtOCcpO1xuICAgIH0gY2F0Y2gge1xuICAgICAgY29udGVudCA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgaWYgKGNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGxpbmVzID0gY29udGVudC5zcGxpdCgnXFxuJyk7XG4gICAgICBtYXRjaGVycy5wdXNoKHtcbiAgICAgICAgZGlyOiBjdXJyZW50LFxuICAgICAgICBtYXRjaGVyOiBpZ25vcmUoKS5hZGQoY29udGVudCksXG4gICAgICAgIGxpbmVzLFxuICAgICAgICBoYXNOZWdhdGlvbjogbGluZXMuc29tZSgobGluZSkgPT4gbGluZS50cmltKCkuc3RhcnRzV2l0aCgnIScpKSxcbiAgICAgICAgZmlsdGVyZWQ6IG5ldyBNYXAoKSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50ID09PSBzdG9wQXQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjb25zdCBwYXJlbnQgPSBkaXJuYW1lKGN1cnJlbnQpO1xuICAgIGlmIChwYXJlbnQgPT09IGN1cnJlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjdXJyZW50ID0gcGFyZW50O1xuICB9XG5cbiAgLy8gQ29sbGVjdGVkIGlubmVybW9zdC1maXJzdCB3aGlsZSB3YWxraW5nIHVwOyBnaXQgcHJlY2VkZW5jZSBpc1xuICAvLyBvdXRlcm1vc3QtZmlyc3QsIHdpdGggZGVlcGVyIGZpbGVzIHdpbm5pbmcuXG4gIHJldHVybiBtYXRjaGVycy5yZXZlcnNlKCk7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2F0Y2hJZ25vcmVPcHRpb25zIHtcbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIGFwcCBkaXJlY3RvcnkgYmVpbmcgYnVpbHQuICovXG4gIHdvcmtpbmdEaXI6IHN0cmluZztcbiAgLyoqIEFic29sdXRlIHBhdGggb2YgdGhlIHdvcmtzcGFjZS9wcm9qZWN0IHJvb3QuIERlZmF1bHRzIHRvIGB3b3JraW5nRGlyYC4gKi9cbiAgcHJvamVjdFJvb3Q/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBFeHRyYSBQT1NJWCBzdWJzdHJpbmcgZnJhZ21lbnRzIHRvIGlnbm9yZSwgaW4gYWRkaXRpb24gdG8gdGhlIGJ1aWx0LWluXG4gICAqIGxpc3QgYW5kIHRoZSB7QGxpbmsgV0FUQ0hfSUdOT1JFRF9QQVRIU19FTlZ9IGVudiB2YXIuIFVzZWQgYnkgdGhlIGNhbGxlclxuICAgKiBmb3IgYnVpbGQtdGltZSBwYXRocyBzdWNoIGFzIHRoZSBnZW5lcmF0ZWQgd29ya2Zsb3cgZGlyZWN0b3J5LlxuICAgKi9cbiAgZXh0cmFGcmFnbWVudHM/OiBzdHJpbmdbXTtcbiAgLyoqXG4gICAqIE92ZXJyaWRlIGZvciB0aGUge0BsaW5rIFdBVENIX0lHTk9SRURfUEFUSFNfRU5WfSBlbnYgdmFyLiBQcmltYXJpbHkgZm9yXG4gICAqIHRlc3Rpbmc7IGRlZmF1bHRzIHRvIGBwcm9jZXNzLmVudltXQVRDSF9JR05PUkVEX1BBVEhTX0VOVl1gLlxuICAgKi9cbiAgZW52SWdub3JlZFBhdGhzPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIEJ1aWxkIHRoZSBkZXYtd2F0Y2hlciBpZ25vcmUgcHJlZGljYXRlLiBUaGUgcmV0dXJuZWQgZnVuY3Rpb24gcmVjZWl2ZXMgYVxuICogUE9TSVgtbm9ybWFsaXplZCBhYnNvbHV0ZSBwYXRoIGFuZCByZXR1cm5zIGB0cnVlYCB3aGVuIHRoYXQgcGF0aCBzaG91bGQgYmVcbiAqIHBydW5lZCBmcm9tIGJvdGggdGhlIGluaXRpYWwgZGlyZWN0b3J5IHdhbGsgYW5kIHRoZSBjaG9raWRhciB3YXRjaCBzZXQuXG4gKlxuICogQSBwYXRoIGlzIGlnbm9yZWQgd2hlbiBpdCBtYXRjaGVzIGFueSBvZjpcbiAqIC0gYSBidWlsdC1pbiBmcmFnbWVudCAoe0BsaW5rIEJVSUxUSU5fSUdOT1JFRF9QQVRIX0ZSQUdNRU5UU30pIG9yIGNhbGxlclxuICogICBgZXh0cmFGcmFnbWVudHNgIChQT1NJWCBzdWJzdHJpbmcgbWF0Y2gpLFxuICogLSBhIHtAbGluayBXQVRDSF9JR05PUkVEX1BBVEhTX0VOVn0gZnJhZ21lbnQgKFBPU0lYIHN1YnN0cmluZyBtYXRjaCksXG4gKiAtIGEgYC5naXRpZ25vcmVgIHJ1bGUgZnJvbSBgd29ya2luZ0RpcmAgdXAgdG8gYHByb2plY3RSb290YC5cbiAqXG4gKiBNYXRjaGVycyBhcmUgYnVpbHQgb25jZSBoZXJlOyB0aGUgcmV0dXJuZWQgcHJlZGljYXRlIGlzIGhvdCAoY2FsbGVkIHBlciBwYXRoXG4gKiBkdXJpbmcgdHJhdmVyc2FsIGFuZCBwZXIgY2hva2lkYXIgZXZlbnQpIGFuZCBkb2VzIG5vIEkvTy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdhdGNoSWdub3JlUHJlZGljYXRlKFxuICBvcHRpb25zOiBXYXRjaElnbm9yZU9wdGlvbnNcbik6IChub3JtYWxpemVkUGF0aDogc3RyaW5nKSA9PiBib29sZWFuIHtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBvcHRpb25zLnByb2plY3RSb290ID8/IG9wdGlvbnMud29ya2luZ0RpcjtcbiAgY29uc3QgZW52SWdub3JlZFBhdGhzID1cbiAgICBvcHRpb25zLmVudklnbm9yZWRQYXRocyA/PyBwcm9jZXNzLmVudltXQVRDSF9JR05PUkVEX1BBVEhTX0VOVl07XG5cbiAgY29uc3QgZnJhZ21lbnRzID0gW1xuICAgIC4uLkJVSUxUSU5fSUdOT1JFRF9QQVRIX0ZSQUdNRU5UUyxcbiAgICAuLi4ob3B0aW9ucy5leHRyYUZyYWdtZW50cyA/PyBbXSkubWFwKHRvUG9zaXgpLFxuICAgIC4uLnBhcnNlSWdub3JlZFBhdGhzRW52KGVudklnbm9yZWRQYXRocyksXG4gIF07XG5cbiAgY29uc3QgZ2l0aWdub3JlTWF0Y2hlcnMgPSBsb2FkR2l0aWdub3JlTWF0Y2hlcnMoXG4gICAgb3B0aW9ucy53b3JraW5nRGlyLFxuICAgIHByb2plY3RSb290XG4gICk7XG4gIC8vIFJlLWluY2x1c2lvbiBpcyBvbmx5IHBvc3NpYmxlIHdoZW4gc29tZSBmaWxlIGhhcyBhIGAhYCBydWxlLiBXaXRob3V0IG9uZSxcbiAgLy8gdGhlIGNoZWFwIGZsYXQgc2NhbiBiZWxvdyBpcyBlcXVpdmFsZW50IHRvIHRoZSBmdWxsIHBlci1kaXJlY3Rvcnkgd2Fsay5cbiAgY29uc3QgYW55TmVnYXRpb24gPSBnaXRpZ25vcmVNYXRjaGVycy5zb21lKChlbnRyeSkgPT4gZW50cnkuaGFzTmVnYXRpb24pO1xuICBjb25zdCBvdXRlcm1vc3REaXIgPSBnaXRpZ25vcmVNYXRjaGVyc1swXT8uZGlyO1xuXG4gIC8qKiBUZXN0IG9uZSBwYXRoIGFnYWluc3Qgb25lIG1hdGNoZXIsIGFzIGJvdGggYSBmaWxlIGFuZCBhIGRpcmVjdG9yeSBub2RlLiAqL1xuICBjb25zdCB0ZXN0RW50cnkgPSAoXG4gICAgZW50cnk6IEdpdGlnbm9yZU1hdGNoZXIsXG4gICAgcmVsOiBzdHJpbmcsXG4gICAgZHJvcHBlZDogU2V0PHN0cmluZz4gfCB1bmRlZmluZWRcbiAgKSA9PiB7XG4gICAgY29uc3QgbWF0Y2hlciA9IGRyb3BwZWQgPyBtYXRjaGVyV2l0aG91dChlbnRyeSwgZHJvcHBlZCkgOiBlbnRyeS5tYXRjaGVyO1xuICAgIC8vIFRlc3QgdGhlIHRyYWlsaW5nLXNsYXNoIGZvcm0gdG9vIHNvIGEgZGlyZWN0b3J5IG5vZGUgaXRzZWxmIG1hdGNoZXMgYVxuICAgIC8vIGBkaXIvYCBnaXRpZ25vcmUgcnVsZSAobm90IGp1c3QgaXRzIGNoaWxkcmVuKSDigJQgdGhpcyBsZXRzIHRoZSB3YWxrIGFuZFxuICAgIC8vIGNob2tpZGFyIHBydW5lIHRoZSBkaXJlY3RvcnkgaW5zdGVhZCBvZiBkZXNjZW5kaW5nIGludG8gaXQuXG4gICAgY29uc3QgYXNGaWxlID0gbWF0Y2hlci50ZXN0KHJlbCk7XG4gICAgY29uc3QgYXNEaXIgPSBtYXRjaGVyLnRlc3QoYCR7cmVsfS9gKTtcbiAgICBpZiAoYXNGaWxlLmlnbm9yZWQpIHtcbiAgICAgIHJldHVybiB7IGlnbm9yZWQ6IHRydWUsIHBhdHRlcm46IGFzRmlsZS5ydWxlPy5wYXR0ZXJuIH07XG4gICAgfVxuICAgIGlmIChhc0Rpci5pZ25vcmVkKSB7XG4gICAgICByZXR1cm4geyBpZ25vcmVkOiB0cnVlLCBwYXR0ZXJuOiBhc0Rpci5ydWxlPy5wYXR0ZXJuIH07XG4gICAgfVxuICAgIGlmIChhc0ZpbGUudW5pZ25vcmVkIHx8IGFzRGlyLnVuaWdub3JlZCkge1xuICAgICAgcmV0dXJuIHsgaWdub3JlZDogZmFsc2UsIHBhdHRlcm46IHVuZGVmaW5lZCB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuXG4gIC8qKlxuICAgKiBSZXNvbHZlIG9uZSBwYXRoIGxldmVsIGFnYWluc3QgZXZlcnkgYXBwbGljYWJsZSBgLmdpdGlnbm9yZWAsIGRlZXBlc3QgZmlsZVxuICAgKiBsYXN0IHNvIGl0IHdpbnMuIFJldHVybnMgdGhlIGxldmVsJ3MgdmVyZGljdCBwbHVzIHRoZSBydWxlcyB0aGF0IHZvdGVkIHRvXG4gICAqIGV4Y2x1ZGUgaXQsIHdoaWNoIHRoZSBjYWxsZXIgbmV1dHJhbGl6ZXMgaWYgdGhlIGxldmVsIGlzIHJlLWluY2x1ZGVkLlxuICAgKi9cbiAgY29uc3QgZGVjaWRlTGV2ZWwgPSAoXG4gICAgcHJlZml4OiBzdHJpbmcsXG4gICAgbmV1dHJhbGl6ZWQ6IE1hcDxudW1iZXIsIFNldDxzdHJpbmc+PlxuICApID0+IHtcbiAgICBsZXQgZGVjaXNpb246IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gICAgbGV0IGV4Y2x1ZGVkQnk6IEFycmF5PHsgaW5kZXg6IG51bWJlcjsgcGF0dGVybjogc3RyaW5nIH0+ID0gW107XG5cbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgZ2l0aWdub3JlTWF0Y2hlcnMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGdpdGlnbm9yZU1hdGNoZXJzW2luZGV4XTtcbiAgICAgIGNvbnN0IHJlbCA9IHBvc2l4LnJlbGF0aXZlKGVudHJ5LmRpciwgcHJlZml4KTtcbiAgICAgIC8vIEVtcHR5IG1lYW5zIHRoZSBwYXRoICppcyogdGhlIGdpdGlnbm9yZSBkaXI7IGEgYC4uYCBwcmVmaXggbWVhbnMgaXQgaXNcbiAgICAgIC8vIG91dHNpZGUuIGBpZ25vcmVgIG9ubHkgYWNjZXB0cyByZWxhdGl2ZSwgaW4tdHJlZSBwYXRocy5cbiAgICAgIGlmIChyZWwgPT09ICcnIHx8IHJlbCA9PT0gJy4uJyB8fCByZWwuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBjb25zdCByZXN1bHQgPSB0ZXN0RW50cnkoZW50cnksIHJlbCwgbmV1dHJhbGl6ZWQuZ2V0KGluZGV4KSk7XG4gICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdWx0Lmlnbm9yZWQpIHtcbiAgICAgICAgZGVjaXNpb24gPSBmYWxzZTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZGVjaXNpb24gIT09IHRydWUpIHtcbiAgICAgICAgZXhjbHVkZWRCeSA9IFtdO1xuICAgICAgfVxuICAgICAgZGVjaXNpb24gPSB0cnVlO1xuICAgICAgaWYgKHJlc3VsdC5wYXR0ZXJuKSB7XG4gICAgICAgIGV4Y2x1ZGVkQnkucHVzaCh7IGluZGV4LCBwYXR0ZXJuOiByZXN1bHQucGF0dGVybiB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4geyBkZWNpc2lvbiwgZXhjbHVkZWRCeSB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBXYWxrIHRoZSBwYXRoIG9uZSBkaXJlY3Rvcnkgc2VnbWVudCBhdCBhIHRpbWUsIHRoZSB3YXkgZ2l0IGRvZXMuIEF0IGVhY2hcbiAgICogbGV2ZWwgdGhlIGRlZXBlc3QgYC5naXRpZ25vcmVgIHdpdGggYW4gb3BpbmlvbiB3aW5zOyBpZiB0aGF0IHZlcmRpY3QgaXNcbiAgICogXCJpZ25vcmVkXCIgZ2l0IHN0b3BzIGRlc2NlbmRpbmcsIHNvIHdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkuXG4gICAqXG4gICAqIFdoZW4gYSBsZXZlbCBpcyByZS1pbmNsdWRlZCBhZnRlciBhIHNoYWxsb3dlciBmaWxlIGV4Y2x1ZGVkIGl0LCB0aGUgcnVsZVxuICAgKiB0aGF0IGRpZCB0aGUgZXhjbHVkaW5nIGlzIG5ldXRyYWxpemVkIGZvciB0aGUgcmVzdCBvZiB0aGUgd2Fsay4gVGhhdCBpc1xuICAgKiB3aGF0IGxldHMgcm9vdCBgZ2VuZXJhdGVkL2AgKyBhcHAgYCFnZW5lcmF0ZWQvYCB3YXRjaCBgYXBwL2dlbmVyYXRlZC94LnRzYFxuICAgKiB3aGlsZSBhIHNpYmxpbmcgcm9vdCBydWxlIHN1Y2ggYXMgYCouc2VjcmV0YCBzdGlsbCBleGNsdWRlc1xuICAgKiBgYXBwL2dlbmVyYXRlZC9hLnNlY3JldGAuXG4gICAqL1xuICBjb25zdCB3YWxrR2l0aWdub3JlID0gKG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBpZiAoIW91dGVybW9zdERpcikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCByZWxUb0Jhc2UgPSBwb3NpeC5yZWxhdGl2ZShvdXRlcm1vc3REaXIsIG5vcm1hbGl6ZWRQYXRoKTtcbiAgICBpZiAocmVsVG9CYXNlID09PSAnJyB8fCByZWxUb0Jhc2UgPT09ICcuLicgfHwgcmVsVG9CYXNlLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgbmV1dHJhbGl6ZWQgPSBuZXcgTWFwPG51bWJlciwgU2V0PHN0cmluZz4+KCk7XG4gICAgbGV0IHByZWZpeCA9IG91dGVybW9zdERpcjtcblxuICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiByZWxUb0Jhc2Uuc3BsaXQoJy8nKSkge1xuICAgICAgcHJlZml4ID0gYCR7cHJlZml4fS8ke3NlZ21lbnR9YDtcbiAgICAgIGNvbnN0IHsgZGVjaXNpb24sIGV4Y2x1ZGVkQnkgfSA9IGRlY2lkZUxldmVsKHByZWZpeCwgbmV1dHJhbGl6ZWQpO1xuXG4gICAgICBpZiAoZGVjaXNpb24gPT09IHRydWUpIHtcbiAgICAgICAgLy8gR2l0IGRvZXMgbm90IGRlc2NlbmQgaW50byBhbiBleGNsdWRlZCBkaXJlY3RvcnkuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRlY2lzaW9uID09PSBmYWxzZSkge1xuICAgICAgICAvLyBUaGlzIGxldmVsIHdhcyByZS1pbmNsdWRlZDsgdGhlIHJ1bGVzIHRoYXQgZXhjbHVkZWQgaXQgbXVzdCBub3RcbiAgICAgICAgLy8gcmVzdXJyZWN0IGZvciBhbnl0aGluZyBiZW5lYXRoIGl0LlxuICAgICAgICBmb3IgKGNvbnN0IHsgaW5kZXgsIHBhdHRlcm4gfSBvZiBleGNsdWRlZEJ5KSB7XG4gICAgICAgICAgY29uc3QgZHJvcHBlZCA9IG5ldXRyYWxpemVkLmdldChpbmRleCkgPz8gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgICAgICAgZHJvcHBlZC5hZGQocGF0dGVybik7XG4gICAgICAgICAgbmV1dHJhbGl6ZWQuc2V0KGluZGV4LCBkcm9wcGVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICByZXR1cm4gKG5vcm1hbGl6ZWRQYXRoOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICAvLyBCdWlsdC1pbiBhbmQgZW52LXZhciBmcmFnbWVudHMgYXJlIGhhcmQgZXhjbHVkZXM6IHRoZXkgYXJlIGRlbGliZXJhdGVseVxuICAgIC8vIG5vdCBzdWJqZWN0IHRvIGdpdGlnbm9yZSBuZWdhdGlvbiwgc28gYSBzdHJheSBgIWAgcnVsZSBjYW5ub3QgZHJhZ1xuICAgIC8vIGBub2RlX21vZHVsZXNgIG9yIHRoZSBnZW5lcmF0ZWQgZGlyZWN0b3J5IGJhY2sgaW50byB0aGUgd2F0Y2ggc2V0LlxuICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgZnJhZ21lbnRzKSB7XG4gICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghYW55TmVnYXRpb24pIHtcbiAgICAgIC8vIEZhc3QgcGF0aDogbm8gcmUtaW5jbHVzaW9uIGFueXdoZXJlLCBzbyB0aGUgZmlyc3QgbWF0Y2ggZGVjaWRlcy5cbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZ2l0aWdub3JlTWF0Y2hlcnMpIHtcbiAgICAgICAgY29uc3QgcmVsID0gcG9zaXgucmVsYXRpdmUoZW50cnkuZGlyLCBub3JtYWxpemVkUGF0aCk7XG4gICAgICAgIGlmIChyZWwgPT09ICcnIHx8IHJlbCA9PT0gJy4uJyB8fCByZWwuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZW50cnkubWF0Y2hlci5pZ25vcmVzKHJlbCkgfHwgZW50cnkubWF0Y2hlci5pZ25vcmVzKGAke3JlbH0vYCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB3YWxrR2l0aWdub3JlKG5vcm1hbGl6ZWRQYXRoKTtcbiAgfTtcbn1cbiJdfQ==
|
package/docs/next.mdx
CHANGED
|
@@ -192,7 +192,7 @@ async function sendOnboardingEmail(user: { id: string; email: string}) {
|
|
|
192
192
|
|
|
193
193
|
Taking a look at this code:
|
|
194
194
|
|
|
195
|
-
* Business logic lives inside **steps**. When a
|
|
195
|
+
* Business logic lives inside **steps**. When a workflow invokes a step, the workflow suspends while the step runs with full Node.js access. The combined handler may execute it inline; queued retries and continuations return through the same flow route.
|
|
196
196
|
* If a step throws an error, like in `sendWelcomeEmail`, the step will automatically be retried until it succeeds (or hits the step's max retry count).
|
|
197
197
|
* Steps can throw a `FatalError` if an error is intentional and should not be retried.
|
|
198
198
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/next",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.37",
|
|
4
4
|
"description": "Next.js integration for Workflow SDK",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,15 +28,16 @@
|
|
|
28
28
|
"dependencies": {
|
|
29
29
|
"@swc/core": "1.15.3",
|
|
30
30
|
"chokidar": "4.0.3",
|
|
31
|
+
"ignore": "7.0.5",
|
|
31
32
|
"semver": "7.7.4",
|
|
32
|
-
"@workflow/builders": "5.0.0-beta.
|
|
33
|
-
"@workflow/core": "5.0.0-beta.
|
|
33
|
+
"@workflow/builders": "5.0.0-beta.37",
|
|
34
|
+
"@workflow/core": "5.0.0-beta.37",
|
|
34
35
|
"@workflow/swc-plugin": "5.0.0-beta.5"
|
|
35
36
|
},
|
|
36
37
|
"devDependencies": {
|
|
37
38
|
"@types/node": "22.19.0",
|
|
38
39
|
"@types/semver": "7.7.1",
|
|
39
|
-
"next": "16.2.
|
|
40
|
+
"next": "16.2.11",
|
|
40
41
|
"typescript": "^6.0.3",
|
|
41
42
|
"vitest": "^4.1.10",
|
|
42
43
|
"@workflow/tsconfig": "5.0.0-beta.0"
|