@workflow/next 5.0.0-beta.4 → 5.0.0-beta.41
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 +1 -1
- package/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +377 -220
- package/dist/builder.d.ts +1 -4
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -28
- package/dist/index.d.ts +8 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +333 -55
- package/dist/loader.d.ts +5 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +15 -341
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/swc-plugin-cache.d.ts +7 -0
- package/dist/swc-plugin-cache.d.ts.map +1 -0
- package/dist/swc-plugin-cache.js +23 -0
- 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/dist/watch-rebuild.d.ts +63 -0
- package/dist/watch-rebuild.d.ts.map +1 -0
- package/dist/watch-rebuild.js +399 -0
- package/docs/api-reference/with-workflow.mdx +56 -2
- package/docs/next.mdx +12 -6
- package/package.json +10 -7
- package/dist/builder-deferred.d.ts +0 -2
- package/dist/builder-deferred.d.ts.map +0 -1
- package/dist/builder-deferred.js +0 -1401
- package/dist/builder-deferred.js.map +0 -1
- package/dist/builder-eager.js.map +0 -1
- package/dist/builder.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/loader.js.map +0 -1
- package/dist/runtime.js.map +0 -1
- package/dist/socket-server.d.ts +0 -48
- package/dist/socket-server.d.ts.map +0 -1
- package/dist/socket-server.js +0 -154
- package/dist/socket-server.js.map +0 -1
package/dist/builder.d.ts
CHANGED
|
@@ -1,5 +1,2 @@
|
|
|
1
|
-
export declare
|
|
2
|
-
export declare const WORKFLOW_DEFERRED_ENTRIES: readonly ["/.well-known/workflow/v1/flow", "/.well-known/workflow/v1/step", "/.well-known/workflow/v1/webhook/[token]"];
|
|
3
|
-
export declare function shouldUseDeferredBuilder(nextVersion: string): boolean;
|
|
4
|
-
export declare function getNextBuilder(nextVersion: string): Promise<any>;
|
|
1
|
+
export declare function getNextBuilder(_nextVersion: string): Promise<any>;
|
|
5
2
|
//# sourceMappingURL=builder.d.ts.map
|
package/dist/builder.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,gBAExD"}
|
package/dist/builder.js
CHANGED
|
@@ -1,34 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.WORKFLOW_DEFERRED_ENTRIES = exports.DEFERRED_BUILDER_MIN_VERSION = void 0;
|
|
7
|
-
exports.shouldUseDeferredBuilder = shouldUseDeferredBuilder;
|
|
8
3
|
exports.getNextBuilder = getNextBuilder;
|
|
9
|
-
const semver_1 = __importDefault(require("semver"));
|
|
10
|
-
const builder_deferred_js_1 = require("./builder-deferred.js");
|
|
11
4
|
const builder_eager_js_1 = require("./builder-eager.js");
|
|
12
|
-
|
|
13
|
-
exports.WORKFLOW_DEFERRED_ENTRIES = [
|
|
14
|
-
'/.well-known/workflow/v1/flow',
|
|
15
|
-
'/.well-known/workflow/v1/step',
|
|
16
|
-
'/.well-known/workflow/v1/webhook/[token]',
|
|
17
|
-
];
|
|
18
|
-
let warnedAboutFlagAndVersion = false;
|
|
19
|
-
function shouldUseDeferredBuilder(nextVersion) {
|
|
20
|
-
const flagEnabled = Boolean(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
|
|
21
|
-
const versionCompatible = semver_1.default.gte(nextVersion, exports.DEFERRED_BUILDER_MIN_VERSION);
|
|
22
|
-
if (flagEnabled && !versionCompatible && !warnedAboutFlagAndVersion) {
|
|
23
|
-
warnedAboutFlagAndVersion = true;
|
|
24
|
-
console.warn(`Enabled lazyDiscovery but Next.js version is not compatible, needs ${exports.DEFERRED_BUILDER_MIN_VERSION} have ${nextVersion}`);
|
|
25
|
-
}
|
|
26
|
-
return flagEnabled && versionCompatible;
|
|
27
|
-
}
|
|
28
|
-
async function getNextBuilder(nextVersion) {
|
|
29
|
-
if (shouldUseDeferredBuilder(nextVersion)) {
|
|
30
|
-
return (0, builder_deferred_js_1.getNextBuilderDeferred)();
|
|
31
|
-
}
|
|
5
|
+
async function getNextBuilder(_nextVersion) {
|
|
32
6
|
return (0, builder_eager_js_1.getNextBuilderEager)();
|
|
33
7
|
}
|
|
34
|
-
//# sourceMappingURL=
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsd0NBRUM7QUFKRCx5REFBeUQ7QUFFbEQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxZQUFvQjtJQUN2RCxPQUFPLElBQUEsc0NBQW1CLEdBQUUsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TmV4dEJ1aWxkZXJFYWdlciB9IGZyb20gJy4vYnVpbGRlci1lYWdlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlcihfbmV4dFZlcnNpb246IHN0cmluZykge1xuICByZXR1cm4gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpO1xufVxuIl19
|
package/dist/index.d.ts
CHANGED
|
@@ -3,10 +3,17 @@ export declare function withWorkflow(nextConfigOrFn: NextConfig | ((phase: strin
|
|
|
3
3
|
defaultConfig: NextConfig;
|
|
4
4
|
}) => Promise<NextConfig>), { workflows, }?: {
|
|
5
5
|
workflows?: {
|
|
6
|
-
lazyDiscovery?: boolean;
|
|
7
6
|
local?: {
|
|
8
7
|
port?: number;
|
|
9
8
|
};
|
|
9
|
+
/**
|
|
10
|
+
* Controls how source maps are emitted for workflow bundles. Accepts
|
|
11
|
+
* the same values as esbuild's `sourcemap` option: `true`/`'inline'`
|
|
12
|
+
* (default), `'linked'`, `'external'`, `'both'`, or `false` to omit
|
|
13
|
+
* source maps. Can also be set via the `WORKFLOW_SOURCEMAP`
|
|
14
|
+
* environment variable.
|
|
15
|
+
*/
|
|
16
|
+
sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
|
|
10
17
|
};
|
|
11
18
|
}): (phase: string, ctx: {
|
|
12
19
|
defaultConfig: NextConfig;
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAgVvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;QACF;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;KACjE,CAAC;CACE,IAkBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAsOrC"}
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,186 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
2
35
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
36
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
37
|
};
|
|
5
38
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
39
|
exports.withWorkflow = withWorkflow;
|
|
40
|
+
const node_fs_1 = require("node:fs");
|
|
41
|
+
const promises_1 = require("node:fs/promises");
|
|
42
|
+
const node_path_1 = require("node:path");
|
|
43
|
+
const builders_1 = require("@workflow/builders");
|
|
7
44
|
const semver_1 = __importDefault(require("semver"));
|
|
8
45
|
const builder_js_1 = require("./builder.js");
|
|
46
|
+
const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
|
|
47
|
+
const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
|
|
48
|
+
'@vercel/queue',
|
|
49
|
+
'@vercel/oidc',
|
|
50
|
+
'@vercel/cli-auth',
|
|
51
|
+
'@napi-rs/keyring',
|
|
52
|
+
];
|
|
53
|
+
const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
|
|
54
|
+
VERCEL_WORLD_PACKAGE,
|
|
55
|
+
...VERCEL_WORLD_DEPENDENCY_PACKAGES,
|
|
56
|
+
];
|
|
57
|
+
const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
|
|
58
|
+
const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
|
|
59
|
+
const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
|
|
60
|
+
const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
|
|
61
|
+
const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
|
|
62
|
+
const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
|
|
63
|
+
const warnedAutoRemovedServerExternalPackages = new Set();
|
|
64
|
+
const BASE_PATH_SYMBOL = Symbol.for('@workflow/core/basePath');
|
|
65
|
+
const globalConfig = globalThis;
|
|
66
|
+
// Keep this local: @workflow/next is CommonJS, while @workflow/utils is ESM-only.
|
|
67
|
+
function setWorkflowBasePath(basePath) {
|
|
68
|
+
globalConfig[BASE_PATH_SYMBOL] = basePath ?? '';
|
|
69
|
+
}
|
|
70
|
+
function isPlainObject(value) {
|
|
71
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
72
|
+
}
|
|
73
|
+
function isResolvablePackageSpecifier(specifier) {
|
|
74
|
+
if (specifier.startsWith('.') || specifier.startsWith('/')) {
|
|
75
|
+
return false;
|
|
76
|
+
}
|
|
77
|
+
if (specifier.startsWith('$')) {
|
|
78
|
+
return false;
|
|
79
|
+
}
|
|
80
|
+
if (specifier.includes('*') || specifier.includes(':')) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
function detectWorkflowPatterns(source) {
|
|
86
|
+
const hasUseWorkflow = useWorkflowPattern.test(source);
|
|
87
|
+
const hasUseStep = useStepPattern.test(source);
|
|
88
|
+
const hasSerdeImport = workflowSerdeImportPattern.test(source);
|
|
89
|
+
const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
|
|
90
|
+
const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
|
|
91
|
+
return {
|
|
92
|
+
hasUseWorkflow,
|
|
93
|
+
hasUseStep,
|
|
94
|
+
hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function getIssueLabels(detected) {
|
|
98
|
+
const issues = [];
|
|
99
|
+
if (detected.hasUseWorkflow) {
|
|
100
|
+
issues.push('"use workflow" functions');
|
|
101
|
+
}
|
|
102
|
+
if (detected.hasUseStep) {
|
|
103
|
+
issues.push('"use step" functions');
|
|
104
|
+
}
|
|
105
|
+
if (detected.hasSerde) {
|
|
106
|
+
issues.push('serialization classes');
|
|
107
|
+
}
|
|
108
|
+
return issues;
|
|
109
|
+
}
|
|
110
|
+
function hasWorkflowSerdeDependency(packageJson) {
|
|
111
|
+
if (!isPlainObject(packageJson)) {
|
|
112
|
+
return false;
|
|
113
|
+
}
|
|
114
|
+
const dependencies = isPlainObject(packageJson.dependencies)
|
|
115
|
+
? packageJson.dependencies
|
|
116
|
+
: {};
|
|
117
|
+
const peerDependencies = isPlainObject(packageJson.peerDependencies)
|
|
118
|
+
? packageJson.peerDependencies
|
|
119
|
+
: {};
|
|
120
|
+
return (Object.hasOwn(dependencies, '@workflow/serde') ||
|
|
121
|
+
Object.hasOwn(peerDependencies, '@workflow/serde'));
|
|
122
|
+
}
|
|
123
|
+
async function detectServerExternalPackage(packageName, workingDir) {
|
|
124
|
+
if (!isResolvablePackageSpecifier(packageName)) {
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
let hasUseWorkflow = false;
|
|
128
|
+
let hasUseStep = false;
|
|
129
|
+
let hasSerde = false;
|
|
130
|
+
try {
|
|
131
|
+
const packageJsonPath = require.resolve(`${packageName}/package.json`, {
|
|
132
|
+
paths: [workingDir],
|
|
133
|
+
});
|
|
134
|
+
const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
|
|
135
|
+
const packageJson = JSON.parse(packageJsonSource);
|
|
136
|
+
hasSerde = hasWorkflowSerdeDependency(packageJson);
|
|
137
|
+
}
|
|
138
|
+
catch {
|
|
139
|
+
// Best-effort only. Continue to source scanning.
|
|
140
|
+
}
|
|
141
|
+
try {
|
|
142
|
+
const entryPath = require.resolve(packageName, {
|
|
143
|
+
paths: [workingDir],
|
|
144
|
+
});
|
|
145
|
+
const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
|
|
146
|
+
const patterns = detectWorkflowPatterns(source);
|
|
147
|
+
hasUseWorkflow = patterns.hasUseWorkflow;
|
|
148
|
+
hasUseStep = patterns.hasUseStep;
|
|
149
|
+
hasSerde ||= patterns.hasSerde;
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
// Best-effort only. Use whichever signal we already have.
|
|
153
|
+
}
|
|
154
|
+
if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
|
|
155
|
+
return null;
|
|
156
|
+
}
|
|
157
|
+
return {
|
|
158
|
+
packageName,
|
|
159
|
+
hasUseWorkflow,
|
|
160
|
+
hasUseStep,
|
|
161
|
+
hasSerde,
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
|
|
165
|
+
const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
|
|
166
|
+
return !warnedAutoRemovedServerExternalPackages.has(packageName);
|
|
167
|
+
});
|
|
168
|
+
if (newlyDetectedPackages.length === 0) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
for (const { packageName } of newlyDetectedPackages) {
|
|
172
|
+
warnedAutoRemovedServerExternalPackages.add(packageName);
|
|
173
|
+
}
|
|
174
|
+
const packageDescriptions = newlyDetectedPackages
|
|
175
|
+
.map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
|
|
176
|
+
.join(', ');
|
|
177
|
+
const packageNames = newlyDetectedPackages
|
|
178
|
+
.map((detected) => `"${detected.packageName}"`)
|
|
179
|
+
.join(', ');
|
|
180
|
+
console.warn(`\n⚠ Workflow found workflow code in serverExternalPackages: ${packageDescriptions}.` +
|
|
181
|
+
`\n Workflow removed the affected entries from serverExternalPackages for this build and is compiling the packages anyway.` +
|
|
182
|
+
`\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
|
|
183
|
+
}
|
|
9
184
|
function resolveNextVersion(workingDir) {
|
|
10
185
|
const errors = [];
|
|
11
186
|
// Try resolving from the consuming project's working directory first.
|
|
@@ -36,10 +211,82 @@ function resolveNextVersion(workingDir) {
|
|
|
36
211
|
}
|
|
37
212
|
throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
|
|
38
213
|
}
|
|
39
|
-
function
|
|
40
|
-
|
|
41
|
-
|
|
214
|
+
function fileExists(path) {
|
|
215
|
+
try {
|
|
216
|
+
const stats = (0, node_fs_1.statSync)(path);
|
|
217
|
+
return stats.isFile();
|
|
42
218
|
}
|
|
219
|
+
catch {
|
|
220
|
+
return false;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
|
|
224
|
+
const manifestCandidates = [
|
|
225
|
+
(0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
|
|
226
|
+
(0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
|
|
227
|
+
(0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
|
|
228
|
+
];
|
|
229
|
+
const manifestPath = manifestCandidates.find(fileExists);
|
|
230
|
+
if (!manifestPath) {
|
|
231
|
+
return;
|
|
232
|
+
}
|
|
233
|
+
const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
|
|
234
|
+
? distDir
|
|
235
|
+
: (0, node_path_1.join)(projectDir, distDir);
|
|
236
|
+
const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
|
|
237
|
+
return { manifestPath, diagnosticsManifestPath };
|
|
238
|
+
}
|
|
239
|
+
async function copyWorkflowDiagnosticsManifest(metadata) {
|
|
240
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
241
|
+
if (!paths) {
|
|
242
|
+
return;
|
|
243
|
+
}
|
|
244
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
245
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
246
|
+
await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
|
|
247
|
+
}
|
|
248
|
+
function copyWorkflowDiagnosticsManifestSync(metadata) {
|
|
249
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
250
|
+
if (!paths) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
254
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
255
|
+
(0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
|
|
256
|
+
}
|
|
257
|
+
function registerWorkflowDiagnosticsManifestCopy(metadata) {
|
|
258
|
+
const marker = '__workflowDiagnosticsManifestCopies';
|
|
259
|
+
const globalWithMarker = globalThis;
|
|
260
|
+
if (!globalWithMarker[marker]) {
|
|
261
|
+
globalWithMarker[marker] = [];
|
|
262
|
+
process.once('exit', () => {
|
|
263
|
+
for (const copyMetadata of globalWithMarker[marker] || []) {
|
|
264
|
+
copyWorkflowDiagnosticsManifestSync(copyMetadata);
|
|
265
|
+
}
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
globalWithMarker[marker].push(metadata);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Mark `ws`'s optional native accelerators external on the webpack server
|
|
272
|
+
* build, which otherwise bundles their JS wrapper without the native `.node`
|
|
273
|
+
* binding and throws "bufferUtil.mask is not a function" at runtime. See
|
|
274
|
+
* `WORKFLOW_OPTIONAL_WS_NATIVE_MODULES`; `@workflow/rollup` handles the
|
|
275
|
+
* Rollup/Vite/Nitro side.
|
|
276
|
+
*/
|
|
277
|
+
function externalizeWsNativeAccelerators(webpackConfig) {
|
|
278
|
+
const names = [...builders_1.WORKFLOW_OPTIONAL_WS_NATIVE_MODULES];
|
|
279
|
+
if (Array.isArray(webpackConfig.externals)) {
|
|
280
|
+
webpackConfig.externals.push(...names);
|
|
281
|
+
}
|
|
282
|
+
else if (webpackConfig.externals) {
|
|
283
|
+
webpackConfig.externals = [webpackConfig.externals, ...names];
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
webpackConfig.externals = names;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
43
290
|
if (!process.env.VERCEL_DEPLOYMENT_ID) {
|
|
44
291
|
if (!process.env.WORKFLOW_TARGET_WORLD) {
|
|
45
292
|
process.env.WORKFLOW_TARGET_WORLD = 'local';
|
|
@@ -56,8 +303,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
56
303
|
}
|
|
57
304
|
}
|
|
58
305
|
return async function buildConfig(phase, ctx) {
|
|
306
|
+
if (phase === 'phase-development-server' ||
|
|
307
|
+
phase === 'phase-production-build') {
|
|
308
|
+
const { prewarmWorkflowSwcPluginCache } = await Promise.resolve().then(() => __importStar(require('./swc-plugin-cache.js')));
|
|
309
|
+
// Loader workers inherit this cwd and read from the same SWC cache.
|
|
310
|
+
prewarmWorkflowSwcPluginCache(process.cwd());
|
|
311
|
+
}
|
|
59
312
|
const loaderPath = require.resolve('./loader');
|
|
60
|
-
let runDeferredBuildFromCallback;
|
|
61
313
|
let nextConfig;
|
|
62
314
|
if (typeof nextConfigOrFn === 'function') {
|
|
63
315
|
nextConfig = await nextConfigOrFn(phase, ctx);
|
|
@@ -67,6 +319,47 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
67
319
|
}
|
|
68
320
|
// shallow clone to avoid read-only on top-level
|
|
69
321
|
nextConfig = Object.assign({}, nextConfig);
|
|
322
|
+
const workflowBasePath = nextConfig.basePath;
|
|
323
|
+
setWorkflowBasePath(workflowBasePath);
|
|
324
|
+
nextConfig.serverExternalPackages = [
|
|
325
|
+
...new Set([
|
|
326
|
+
...(nextConfig.serverExternalPackages || []),
|
|
327
|
+
// Keep the Vercel world and its native-prone dependencies external so
|
|
328
|
+
// local builds do not try to parse @vercel/queue's keyring dependency
|
|
329
|
+
// tree.
|
|
330
|
+
...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
|
|
331
|
+
]),
|
|
332
|
+
];
|
|
333
|
+
const existingCompiler = nextConfig.compiler ?? {};
|
|
334
|
+
const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
|
|
335
|
+
const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
|
|
336
|
+
? nextConfig.serverExternalPackages
|
|
337
|
+
: [];
|
|
338
|
+
let effectiveServerExternalPackages = configuredServerExternalPackages;
|
|
339
|
+
if (configuredServerExternalPackages.length > 0) {
|
|
340
|
+
const detectedWorkflowPackages = [];
|
|
341
|
+
for (const packageName of configuredServerExternalPackages) {
|
|
342
|
+
if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
|
|
343
|
+
continue;
|
|
344
|
+
}
|
|
345
|
+
try {
|
|
346
|
+
const detected = await detectServerExternalPackage(packageName, process.cwd());
|
|
347
|
+
if (detected) {
|
|
348
|
+
detectedWorkflowPackages.push(detected);
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
catch {
|
|
352
|
+
// Best-effort only. Never block config generation.
|
|
353
|
+
}
|
|
354
|
+
}
|
|
355
|
+
if (detectedWorkflowPackages.length > 0) {
|
|
356
|
+
const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
|
|
357
|
+
effectiveServerExternalPackages =
|
|
358
|
+
configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
|
|
359
|
+
nextConfig.serverExternalPackages = effectiveServerExternalPackages;
|
|
360
|
+
warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
70
363
|
// configure the loader if turbopack is being used
|
|
71
364
|
if (!nextConfig.turbopack) {
|
|
72
365
|
nextConfig.turbopack = {};
|
|
@@ -75,35 +368,51 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
75
368
|
nextConfig.turbopack.rules = {};
|
|
76
369
|
}
|
|
77
370
|
const existingRules = nextConfig.turbopack.rules;
|
|
78
|
-
const
|
|
371
|
+
const workingDir = process.cwd();
|
|
372
|
+
const nextVersion = resolveNextVersion(workingDir);
|
|
373
|
+
const configuredProjectRoot = nextConfig.outputFileTracingRoot ?? nextConfig.turbopack?.root;
|
|
374
|
+
const projectRoot = configuredProjectRoot
|
|
375
|
+
? (0, builders_1.resolveConfiguredProjectRoot)(workingDir, configuredProjectRoot)
|
|
376
|
+
: (0, builders_1.resolveProjectRoot)(workingDir);
|
|
79
377
|
const supportsTurboCondition = semver_1.default.gte(nextVersion, 'v16.0.0');
|
|
80
|
-
const useDeferredBuilder = (0, builder_js_1.shouldUseDeferredBuilder)(nextVersion);
|
|
81
|
-
// Deferred builder discovers files via loader socket notifications, so
|
|
82
|
-
// turbopack content conditions are only needed with the eager builder.
|
|
83
|
-
const shouldApplyTurboCondition = supportsTurboCondition && !useDeferredBuilder;
|
|
84
378
|
const shouldWatch = process.env.NODE_ENV === 'development';
|
|
85
379
|
let workflowBuilderPromise;
|
|
86
380
|
const distDir = nextConfig.distDir || '.next';
|
|
381
|
+
nextConfig.compiler = {
|
|
382
|
+
...existingCompiler,
|
|
383
|
+
runAfterProductionCompile: async (metadata) => {
|
|
384
|
+
if (existingRunAfterProductionCompile) {
|
|
385
|
+
await existingRunAfterProductionCompile(metadata);
|
|
386
|
+
}
|
|
387
|
+
await copyWorkflowDiagnosticsManifest(metadata);
|
|
388
|
+
registerWorkflowDiagnosticsManifestCopy(metadata);
|
|
389
|
+
},
|
|
390
|
+
};
|
|
87
391
|
const getWorkflowBuilder = async () => {
|
|
88
392
|
if (!workflowBuilderPromise) {
|
|
89
393
|
workflowBuilderPromise = (async () => {
|
|
90
394
|
const NextBuilder = await (0, builder_js_1.getNextBuilder)(nextVersion);
|
|
91
395
|
return new NextBuilder({
|
|
92
396
|
watch: shouldWatch,
|
|
93
|
-
//
|
|
94
|
-
dirs: ['
|
|
95
|
-
|
|
96
|
-
|
|
397
|
+
// getInputFiles filters the project to Next.js entrypoints
|
|
398
|
+
dirs: ['.'],
|
|
399
|
+
pageExtensions: nextConfig.pageExtensions ?? [
|
|
400
|
+
'tsx',
|
|
401
|
+
'ts',
|
|
402
|
+
'jsx',
|
|
403
|
+
'js',
|
|
404
|
+
],
|
|
405
|
+
projectRoot,
|
|
406
|
+
moduleSpecifierRoot: workingDir,
|
|
407
|
+
workingDir,
|
|
97
408
|
distDir,
|
|
409
|
+
basePath: workflowBasePath,
|
|
98
410
|
diagnosticsDir: `${distDir}/diagnostics`,
|
|
99
411
|
buildTarget: 'next',
|
|
100
412
|
workflowsBundlePath: '', // not used in base
|
|
101
413
|
stepsBundlePath: '', // not used in base
|
|
102
414
|
webhookBundlePath: '', // node used in base
|
|
103
|
-
|
|
104
|
-
suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
|
|
105
|
-
suppressCreateWebhookBundleLogs: useDeferredBuilder,
|
|
106
|
-
suppressCreateManifestLogs: useDeferredBuilder,
|
|
415
|
+
sourcemap: workflows?.sourcemap,
|
|
107
416
|
externalPackages: [
|
|
108
417
|
// server-only and client-only are pseudo-packages handled by Next.js
|
|
109
418
|
// during its build process. We mark them as external to prevent esbuild
|
|
@@ -111,47 +420,13 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
111
420
|
// See: https://nextjs.org/docs/app/getting-started/server-and-client-components
|
|
112
421
|
'server-only',
|
|
113
422
|
'client-only',
|
|
114
|
-
...
|
|
423
|
+
...effectiveServerExternalPackages,
|
|
115
424
|
],
|
|
116
425
|
});
|
|
117
426
|
})();
|
|
118
427
|
}
|
|
119
428
|
return workflowBuilderPromise;
|
|
120
429
|
};
|
|
121
|
-
if (useDeferredBuilder) {
|
|
122
|
-
runDeferredBuildFromCallback = async () => {
|
|
123
|
-
const workflowBuilder = await getWorkflowBuilder();
|
|
124
|
-
if (typeof workflowBuilder.onBeforeDeferredEntries === 'function') {
|
|
125
|
-
await workflowBuilder.onBeforeDeferredEntries();
|
|
126
|
-
}
|
|
127
|
-
};
|
|
128
|
-
const existingExperimental = (nextConfig.experimental ?? {});
|
|
129
|
-
const existingDeferredEntries = Array.isArray(existingExperimental.deferredEntries)
|
|
130
|
-
? existingExperimental.deferredEntries
|
|
131
|
-
: [];
|
|
132
|
-
const existingOnBeforeDeferredEntries = typeof existingExperimental.onBeforeDeferredEntries === 'function'
|
|
133
|
-
? existingExperimental.onBeforeDeferredEntries
|
|
134
|
-
: undefined;
|
|
135
|
-
nextConfig.experimental = {
|
|
136
|
-
...existingExperimental,
|
|
137
|
-
// biome-ignore lint/suspicious/noTsIgnore: expect-error is wrong as it will work on valid version
|
|
138
|
-
// @ts-ignore this is only available in canary Next.js
|
|
139
|
-
deferredEntries: [
|
|
140
|
-
...new Set([
|
|
141
|
-
...existingDeferredEntries,
|
|
142
|
-
...builder_js_1.WORKFLOW_DEFERRED_ENTRIES,
|
|
143
|
-
]),
|
|
144
|
-
],
|
|
145
|
-
onBeforeDeferredEntries: async (...args) => {
|
|
146
|
-
if (existingOnBeforeDeferredEntries) {
|
|
147
|
-
await existingOnBeforeDeferredEntries(...args);
|
|
148
|
-
}
|
|
149
|
-
if (runDeferredBuildFromCallback) {
|
|
150
|
-
await runDeferredBuildFromCallback();
|
|
151
|
-
}
|
|
152
|
-
},
|
|
153
|
-
};
|
|
154
|
-
}
|
|
155
430
|
for (const key of [
|
|
156
431
|
'*.tsx',
|
|
157
432
|
'*.ts',
|
|
@@ -163,7 +438,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
163
438
|
'*.cts',
|
|
164
439
|
]) {
|
|
165
440
|
nextConfig.turbopack.rules[key] = {
|
|
166
|
-
...(
|
|
441
|
+
...(supportsTurboCondition
|
|
167
442
|
? {
|
|
168
443
|
condition: {
|
|
169
444
|
// Use 'all' to combine: must match content AND must NOT be in generated path
|
|
@@ -200,8 +475,11 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
200
475
|
test: /.*\.(mjs|cjs|cts|ts|tsx|js|jsx)$/,
|
|
201
476
|
loader: loaderPath,
|
|
202
477
|
});
|
|
478
|
+
if (args[1]?.isServer) {
|
|
479
|
+
externalizeWsNativeAccelerators(webpackConfig);
|
|
480
|
+
}
|
|
203
481
|
return existingWebpackModify
|
|
204
|
-
? existingWebpackModify(...args)
|
|
482
|
+
? (existingWebpackModify(...args) ?? webpackConfig)
|
|
205
483
|
: webpackConfig;
|
|
206
484
|
};
|
|
207
485
|
// only run this in the main process so it only runs once
|
|
@@ -215,4 +493,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
215
493
|
return nextConfig;
|
|
216
494
|
};
|
|
217
495
|
}
|
|
218
|
-
//# sourceMappingURL=index.js.map
|
|
496
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF3VkEsb0NBZ1JDO0FBeG1CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUN0RCxpREFJNEI7QUFFNUIsb0RBQTRCO0FBQzVCLDZDQUE4QztBQUU5QyxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBQ0YsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFDbEUsTUFBTSxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLHlCQUF5QixDQUFDLENBQUM7QUFDL0QsTUFBTSxZQUFZLEdBQUcsVUFDZSxDQUFDO0FBRXJDLGtGQUFrRjtBQUNsRixTQUFTLG1CQUFtQixDQUFDLFFBQTRCO0lBQ3ZELFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDbEQsQ0FBQztBQWVE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bm9kZTpmcyc7XG5pbXBvcnQgeyBjb3B5RmlsZSwgbWtkaXIsIHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBpc0Fic29sdXRlLCBqb2luIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7XG4gIHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3QsXG4gIHJlc29sdmVQcm9qZWN0Um9vdCxcbiAgV09SS0ZMT1dfT1BUSU9OQUxfV1NfTkFUSVZFX01PRFVMRVMsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgfSBmcm9tICduZXh0JztcbmltcG9ydCBzZW12ZXIgZnJvbSAnc2VtdmVyJztcbmltcG9ydCB7IGdldE5leHRCdWlsZGVyIH0gZnJvbSAnLi9idWlsZGVyLmpzJztcblxuY29uc3QgVkVSQ0VMX1dPUkxEX1BBQ0tBR0UgPSAnQHdvcmtmbG93L3dvcmxkLXZlcmNlbCc7XG5jb25zdCBWRVJDRUxfV09STERfREVQRU5ERU5DWV9QQUNLQUdFUyA9IFtcbiAgJ0B2ZXJjZWwvcXVldWUnLFxuICAnQHZlcmNlbC9vaWRjJyxcbiAgJ0B2ZXJjZWwvY2xpLWF1dGgnLFxuICAnQG5hcGktcnMva2V5cmluZycsXG5dO1xuY29uc3QgVkVSQ0VMX1dPUkxEX1NFUlZFUl9FWFRFUk5BTF9QQUNLQUdFUyA9IFtcbiAgVkVSQ0VMX1dPUkxEX1BBQ0tBR0UsXG4gIC4uLlZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTLFxuXTtcbmNvbnN0IHVzZVdvcmtmbG93UGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugd29ya2Zsb3dcXDE7P1xccyokL207XG5jb25zdCB1c2VTdGVwUGF0dGVybiA9IC9eXFxzKihbJ1wiXSl1c2Ugc3RlcFxcMTs/XFxzKiQvbTtcbmNvbnN0IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuID0gL2Zyb21cXHMrKFsnXCJdKUB3b3JrZmxvd1xcL3NlcmRlXFwxLztcbmNvbnN0IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuID1cbiAgL1N5bWJvbFxcLmZvclxccypcXChcXHMqKFsnXCJdKXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlcXDFcXHMqXFwpLztcbmNvbnN0IHdvcmtmbG93U2VyZGVDb21wdXRlZFByb3BlcnR5UGF0dGVybiA9XG4gIC9cXFtcXHMqV09SS0ZMT1dfKD86U0VSSUFMSVpFfERFU0VSSUFMSVpFKVxccypcXF0vO1xuXG5jb25zdCBQU0VVRE9fRVhURVJOQUxfUEFDS0FHRVMgPSBuZXcgU2V0KFsnc2VydmVyLW9ubHknLCAnY2xpZW50LW9ubHknXSk7XG5jb25zdCB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbmNvbnN0IEJBU0VfUEFUSF9TWU1CT0wgPSBTeW1ib2wuZm9yKCdAd29ya2Zsb3cvY29yZS9iYXNlUGF0aCcpO1xuY29uc3QgZ2xvYmFsQ29uZmlnID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmXG4gIFJlY29yZDxzeW1ib2wsIHN0cmluZyB8IHVuZGVmaW5lZD47XG5cbi8vIEtlZXAgdGhpcyBsb2NhbDogQHdvcmtmbG93L25leHQgaXMgQ29tbW9uSlMsIHdoaWxlIEB3b3JrZmxvdy91dGlscyBpcyBFU00tb25seS5cbmZ1bmN0aW9uIHNldFdvcmtmbG93QmFzZVBhdGgoYmFzZVBhdGg6IHN0cmluZyB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICBnbG9iYWxDb25maWdbQkFTRV9QQVRIX1NZTUJPTF0gPSBiYXNlUGF0aCA/PyAnJztcbn1cblxuaW50ZXJmYWNlIFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5pbnRlcmZhY2UgRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2Uge1xuICBwYWNrYWdlTmFtZTogc3RyaW5nO1xuICBoYXNVc2VXb3JrZmxvdzogYm9vbGVhbjtcbiAgaGFzVXNlU3RlcDogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cblxuZnVuY3Rpb24gaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihzcGVjaWZpZXI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuc3RhcnRzV2l0aCgnJCcpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChzcGVjaWZpZXIuaW5jbHVkZXMoJyonKSB8fCBzcGVjaWZpZXIuaW5jbHVkZXMoJzonKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZTogc3RyaW5nKTogV29ya2Zsb3dQYXR0ZXJuTWF0Y2gge1xuICBjb25zdCBoYXNVc2VXb3JrZmxvdyA9IHVzZVdvcmtmbG93UGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1VzZVN0ZXAgPSB1c2VTdGVwUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlSW1wb3J0ID0gd29ya2Zsb3dTZXJkZUltcG9ydFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZVN5bWJvbCA9IHdvcmtmbG93U2VyZGVTeW1ib2xQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5ID1cbiAgICB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4udGVzdChzb3VyY2UpO1xuXG4gIHJldHVybiB7XG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZTogaGFzU2VyZGVJbXBvcnQgfHwgaGFzU2VyZGVTeW1ib2wgfHwgaGFzU2VyZGVDb21wdXRlZFByb3BlcnR5LFxuICB9O1xufVxuXG5mdW5jdGlvbiBnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZDogRGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGlzc3Vlczogc3RyaW5nW10gPSBbXTtcbiAgaWYgKGRldGVjdGVkLmhhc1VzZVdvcmtmbG93KSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHdvcmtmbG93XCIgZnVuY3Rpb25zJyk7XG4gIH1cbiAgaWYgKGRldGVjdGVkLmhhc1VzZVN0ZXApIHtcbiAgICBpc3N1ZXMucHVzaCgnXCJ1c2Ugc3RlcFwiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNTZXJkZSkge1xuICAgIGlzc3Vlcy5wdXNoKCdzZXJpYWxpemF0aW9uIGNsYXNzZXMnKTtcbiAgfVxuICByZXR1cm4gaXNzdWVzO1xufVxuXG5mdW5jdGlvbiBoYXNXb3JrZmxvd1NlcmRlRGVwZW5kZW5jeShwYWNrYWdlSnNvbjogdW5rbm93bik6IGJvb2xlYW4ge1xuICBpZiAoIWlzUGxhaW5PYmplY3QocGFja2FnZUpzb24pKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXMpXG4gICAgPyBwYWNrYWdlSnNvbi5kZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuICBjb25zdCBwZWVyRGVwZW5kZW5jaWVzID0gaXNQbGFpbk9iamVjdChwYWNrYWdlSnNvbi5wZWVyRGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llc1xuICAgIDoge307XG5cbiAgcmV0dXJuIChcbiAgICBPYmplY3QuaGFzT3duKGRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpIHx8XG4gICAgT2JqZWN0Lmhhc093bihwZWVyRGVwZW5kZW5jaWVzLCAnQHdvcmtmbG93L3NlcmRlJylcbiAgKTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICBwYWNrYWdlTmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8RGV0ZWN0ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2UgfCBudWxsPiB7XG4gIGlmICghaXNSZXNvbHZhYmxlUGFja2FnZVNwZWNpZmllcihwYWNrYWdlTmFtZSkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGxldCBoYXNVc2VXb3JrZmxvdyA9IGZhbHNlO1xuICBsZXQgaGFzVXNlU3RlcCA9IGZhbHNlO1xuICBsZXQgaGFzU2VyZGUgPSBmYWxzZTtcblxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShgJHtwYWNrYWdlTmFtZX0vcGFja2FnZS5qc29uYCwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBwYWNrYWdlSnNvblNvdXJjZSA9IGF3YWl0IHJlYWRGaWxlKHBhY2thZ2VKc29uUGF0aCwgJ3V0Zi04Jyk7XG4gICAgY29uc3QgcGFja2FnZUpzb24gPSBKU09OLnBhcnNlKHBhY2thZ2VKc29uU291cmNlKSBhcyB1bmtub3duO1xuICAgIGhhc1NlcmRlID0gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb24pO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBDb250aW51ZSB0byBzb3VyY2Ugc2Nhbm5pbmcuXG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IGVudHJ5UGF0aCA9IHJlcXVpcmUucmVzb2x2ZShwYWNrYWdlTmFtZSwge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShlbnRyeVBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhdHRlcm5zID0gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xuICAgIGhhc1VzZVdvcmtmbG93ID0gcGF0dGVybnMuaGFzVXNlV29ya2Zsb3c7XG4gICAgaGFzVXNlU3RlcCA9IHBhdHRlcm5zLmhhc1VzZVN0ZXA7XG4gICAgaGFzU2VyZGUgfHw9IHBhdHRlcm5zLmhhc1NlcmRlO1xuICB9IGNhdGNoIHtcbiAgICAvLyBCZXN0LWVmZm9ydCBvbmx5LiBVc2Ugd2hpY2hldmVyIHNpZ25hbCB3ZSBhbHJlYWR5IGhhdmUuXG4gIH1cblxuICBpZiAoIWhhc1VzZVdvcmtmbG93ICYmICFoYXNVc2VTdGVwICYmICFoYXNTZXJkZSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICBwYWNrYWdlTmFtZSxcbiAgICBoYXNVc2VXb3JrZmxvdyxcbiAgICBoYXNVc2VTdGVwLFxuICAgIGhhc1NlcmRlLFxuICB9O1xufVxuXG5mdW5jdGlvbiB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoXG4gIGRldGVjdGVkUGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW11cbik6IHZvaWQge1xuICBjb25zdCBuZXdseURldGVjdGVkUGFja2FnZXMgPSBkZXRlY3RlZFBhY2thZ2VzLmZpbHRlcigoeyBwYWNrYWdlTmFtZSB9KSA9PiB7XG4gICAgcmV0dXJuICF3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuaGFzKHBhY2thZ2VOYW1lKTtcbiAgfSk7XG5cbiAgaWYgKG5ld2x5RGV0ZWN0ZWRQYWNrYWdlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBmb3IgKGNvbnN0IHsgcGFja2FnZU5hbWUgfSBvZiBuZXdseURldGVjdGVkUGFja2FnZXMpIHtcbiAgICB3YXJuZWRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuYWRkKHBhY2thZ2VOYW1lKTtcbiAgfVxuXG4gIGNvbnN0IHBhY2thZ2VEZXNjcmlwdGlvbnMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKFxuICAgICAgKGRldGVjdGVkKSA9PlxuICAgICAgICBgXCIke2RldGVjdGVkLnBhY2thZ2VOYW1lfVwiICgke2dldElzc3VlTGFiZWxzKGRldGVjdGVkKS5qb2luKCcsICcpfSlgXG4gICAgKVxuICAgIC5qb2luKCcsICcpO1xuICBjb25zdCBwYWNrYWdlTmFtZXMgPSBuZXdseURldGVjdGVkUGFja2FnZXNcbiAgICAubWFwKChkZXRlY3RlZCkgPT4gYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cImApXG4gICAgLmpvaW4oJywgJyk7XG5cbiAgY29uc29sZS53YXJuKFxuICAgIGBcXG7imqAgV29ya2Zsb3cgZm91bmQgd29ya2Zsb3cgY29kZSBpbiBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzOiAke3BhY2thZ2VEZXNjcmlwdGlvbnN9LmAgK1xuICAgICAgYFxcbiAgV29ya2Zsb3cgcmVtb3ZlZCB0aGUgYWZmZWN0ZWQgZW50cmllcyBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgZm9yIHRoaXMgYnVpbGQgYW5kIGlzIGNvbXBpbGluZyB0aGUgcGFja2FnZXMgYW55d2F5LmAgK1xuICAgICAgYFxcbiAgUmVtb3ZlICR7cGFja2FnZU5hbWVzfSBmcm9tIHNlcnZlckV4dGVybmFsUGFja2FnZXMgaW4gbmV4dC5jb25maWcgdG8gc2lsZW5jZSB0aGlzIHdhcm5pbmcuXFxuYFxuICApO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcblxuICAvLyBUcnkgcmVzb2x2aW5nIGZyb20gdGhlIGNvbnN1bWluZyBwcm9qZWN0J3Mgd29ya2luZyBkaXJlY3RvcnkgZmlyc3QuXG4gIC8vIFRoaXMgaGFuZGxlcyBtb25vcmVwbyBzZXR1cHMgd2hlcmUgYG5leHRgIG1heSBub3QgYmUgaG9pc3RlZCB0byB0aGVcbiAgLy8gc2FtZSBsb2NhdGlvbiBhcyBgQHdvcmtmbG93L25leHRgLlxuICB0cnkge1xuICAgIGNvbnN0IHBhY2thZ2VKc29uUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnbmV4dC9wYWNrYWdlLmpzb24nLCB7XG4gICAgICBwYXRoczogW3dvcmtpbmdEaXJdLFxuICAgIH0pO1xuICAgIGNvbnN0IHJlc29sdmVkUGFja2FnZUpzb24gPSByZXF1aXJlKHBhY2thZ2VKc29uUGF0aCkgYXMge1xuICAgICAgdmVyc2lvbj86IHVua25vd247XG4gICAgfTtcbiAgICBpZiAodHlwZW9mIHJlc29sdmVkUGFja2FnZUpzb24udmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICAvLyBGYWxsIGJhY2sgdG8gcmVzb2x2aW5nIHJlbGF0aXZlIHRvIHRoaXMgcGFja2FnZSdzIGxvY2F0aW9uLlxuICB0cnkge1xuICAgIGNvbnN0IHZlcnNpb24gPSAocmVxdWlyZSgnbmV4dC9wYWNrYWdlLmpzb24nKSBhcyB7IHZlcnNpb24/OiB1bmtub3duIH0pXG4gICAgICAudmVyc2lvbjtcbiAgICBpZiAodHlwZW9mIHZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmVyc2lvbjtcbiAgICB9XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBlcnJvcnMucHVzaChlKTtcbiAgfVxuXG4gIHRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcihcbiAgICBlcnJvcnMsXG4gICAgYENvdWxkIG5vdCByZXNvbHZlIE5leHQuanMgdmVyc2lvbi4gRW5zdXJlIFxcYG5leHRcXGAgaXMgaW5zdGFsbGVkIGluIHlvdXIgcHJvamVjdCAod29ya2luZyBkaXJlY3Rvcnk6ICR7d29ya2luZ0Rpcn0pLmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gZmlsZUV4aXN0cyhwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgdHJ5IHtcbiAgICBjb25zdCBzdGF0cyA9IHN0YXRTeW5jKHBhdGgpO1xuICAgIHJldHVybiBzdGF0cy5pc0ZpbGUoKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMoe1xuICBwcm9qZWN0RGlyLFxuICBkaXN0RGlyLFxufToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB7IG1hbmlmZXN0UGF0aDogc3RyaW5nOyBkaWFnbm9zdGljc01hbmlmZXN0UGF0aDogc3RyaW5nIH0gfCB1bmRlZmluZWQge1xuICBjb25zdCBtYW5pZmVzdENhbmRpZGF0ZXMgPSBbXG4gICAgam9pbihwcm9qZWN0RGlyLCAnYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdzcmMvYXBwLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgICBqb2luKHByb2plY3REaXIsICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbicpLFxuICBdO1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBtYW5pZmVzdENhbmRpZGF0ZXMuZmluZChmaWxlRXhpc3RzKTtcblxuICBpZiAoIW1hbmlmZXN0UGF0aCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHJlc29sdmVkRGlzdERpciA9IGlzQWJzb2x1dGUoZGlzdERpcilcbiAgICA/IGRpc3REaXJcbiAgICA6IGpvaW4ocHJvamVjdERpciwgZGlzdERpcik7XG4gIGNvbnN0IGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoID0gam9pbihcbiAgICByZXNvbHZlZERpc3REaXIsXG4gICAgJ2RpYWdub3N0aWNzJyxcbiAgICAnd29ya2Zsb3dzLW1hbmlmZXN0Lmpzb24nXG4gICk7XG4gIHJldHVybiB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIGF3YWl0IG1rZGlyKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgYXdhaXQgY29weUZpbGUobWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RTeW5jKG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBwYXRocyA9IGdldFdvcmtmbG93TWFuaWZlc3RDb3B5UGF0aHMobWV0YWRhdGEpO1xuICBpZiAoIXBhdGhzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgeyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH0gPSBwYXRocztcbiAgbWtkaXJTeW5jKGRpcm5hbWUoZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgY29weUZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlcldvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcHkobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogdm9pZCB7XG4gIGNvbnN0IG1hcmtlciA9ICdfX3dvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdENvcGllcyc7XG4gIGNvbnN0IGdsb2JhbFdpdGhNYXJrZXIgPSBnbG9iYWxUaGlzIGFzIHR5cGVvZiBnbG9iYWxUaGlzICYge1xuICAgIFttYXJrZXJdPzogQXJyYXk8eyBwcm9qZWN0RGlyOiBzdHJpbmc7IGRpc3REaXI6IHN0cmluZyB9PjtcbiAgfTtcblxuICBpZiAoIWdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSkge1xuICAgIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSA9IFtdO1xuICAgIHByb2Nlc3Mub25jZSgnZXhpdCcsICgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY29weU1ldGFkYXRhIG9mIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXSB8fCBbXSkge1xuICAgICAgICBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhjb3B5TWV0YWRhdGEpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2xvYmFsV2l0aE1hcmtlclttYXJrZXJdLnB1c2gobWV0YWRhdGEpO1xufVxuXG4vKipcbiAqIE1hcmsgYHdzYCdzIG9wdGlvbmFsIG5hdGl2ZSBhY2NlbGVyYXRvcnMgZXh0ZXJuYWwgb24gdGhlIHdlYnBhY2sgc2VydmVyXG4gKiBidWlsZCwgd2hpY2ggb3RoZXJ3aXNlIGJ1bmRsZXMgdGhlaXIgSlMgd3JhcHBlciB3aXRob3V0IHRoZSBuYXRpdmUgYC5ub2RlYFxuICogYmluZGluZyBhbmQgdGhyb3dzIFwiYnVmZmVyVXRpbC5tYXNrIGlzIG5vdCBhIGZ1bmN0aW9uXCIgYXQgcnVudGltZS4gU2VlXG4gKiBgV09SS0ZMT1dfT1BUSU9OQUxfV1NfTkFUSVZFX01PRFVMRVNgOyBgQHdvcmtmbG93L3JvbGx1cGAgaGFuZGxlcyB0aGVcbiAqIFJvbGx1cC9WaXRlL05pdHJvIHNpZGUuXG4gKi9cbmZ1bmN0aW9uIGV4dGVybmFsaXplV3NOYXRpdmVBY2NlbGVyYXRvcnMod2VicGFja0NvbmZpZzoge1xuICBleHRlcm5hbHM/OiB1bmtub3duO1xufSk6IHZvaWQge1xuICBjb25zdCBuYW1lcyA9IFsuLi5XT1JLRkxPV19PUFRJT05BTF9XU19OQVRJVkVfTU9EVUxFU107XG4gIGlmIChBcnJheS5pc0FycmF5KHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzKSkge1xuICAgIHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzLnB1c2goLi4ubmFtZXMpO1xuICB9IGVsc2UgaWYgKHdlYnBhY2tDb25maWcuZXh0ZXJuYWxzKSB7XG4gICAgd2VicGFja0NvbmZpZy5leHRlcm5hbHMgPSBbd2VicGFja0NvbmZpZy5leHRlcm5hbHMsIC4uLm5hbWVzXTtcbiAgfSBlbHNlIHtcbiAgICB3ZWJwYWNrQ29uZmlnLmV4dGVybmFscyA9IG5hbWVzO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB3aXRoV29ya2Zsb3coXG4gIG5leHRDb25maWdPckZuOlxuICAgIHwgTmV4dENvbmZpZ1xuICAgIHwgKChcbiAgICAgICAgcGhhc2U6IHN0cmluZyxcbiAgICAgICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICAgICAgKSA9PiBQcm9taXNlPE5leHRDb25maWc+KSxcbiAge1xuICAgIHdvcmtmbG93cyxcbiAgfToge1xuICAgIHdvcmtmbG93cz86IHtcbiAgICAgIGxvY2FsPzoge1xuICAgICAgICBwb3J0PzogbnVtYmVyO1xuICAgICAgfTtcbiAgICAgIC8qKlxuICAgICAgICogQ29udHJvbHMgaG93IHNvdXJjZSBtYXBzIGFyZSBlbWl0dGVkIGZvciB3b3JrZmxvdyBidW5kbGVzLiBBY2NlcHRzXG4gICAgICAgKiB0aGUgc2FtZSB2YWx1ZXMgYXMgZXNidWlsZCdzIGBzb3VyY2VtYXBgIG9wdGlvbjogYHRydWVgL2AnaW5saW5lJ2BcbiAgICAgICAqIChkZWZhdWx0KSwgYCdsaW5rZWQnYCwgYCdleHRlcm5hbCdgLCBgJ2JvdGgnYCwgb3IgYGZhbHNlYCB0byBvbWl0XG4gICAgICAgKiBzb3VyY2UgbWFwcy4gQ2FuIGFsc28gYmUgc2V0IHZpYSB0aGUgYFdPUktGTE9XX1NPVVJDRU1BUGBcbiAgICAgICAqIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgICAgICovXG4gICAgICBzb3VyY2VtYXA/OiBib29sZWFuIHwgJ2lubGluZScgfCAnbGlua2VkJyB8ICdleHRlcm5hbCcgfCAnYm90aCc7XG4gICAgfTtcbiAgfSA9IHt9XG4pIHtcbiAgaWYgKCFwcm9jZXNzLmVudi5WRVJDRUxfREVQTE9ZTUVOVF9JRCkge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEKSB7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQgPSAnbG9jYWwnO1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfTE9DQUxfREFUQV9ESVIgPSAnLm5leHQvd29ya2Zsb3ctZGF0YSc7XG4gICAgfVxuICAgIGNvbnN0IG1heWJlUG9ydCA9IHdvcmtmbG93cz8ubG9jYWw/LnBvcnQ7XG4gICAgaWYgKG1heWJlUG9ydCkge1xuICAgICAgcHJvY2Vzcy5lbnYuUE9SVCA9IG1heWJlUG9ydC50b1N0cmluZygpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoIXByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCkge1xuICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEID0gJ3ZlcmNlbCc7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGFzeW5jIGZ1bmN0aW9uIGJ1aWxkQ29uZmlnKFxuICAgIHBoYXNlOiBzdHJpbmcsXG4gICAgY3R4OiB7IGRlZmF1bHRDb25maWc6IE5leHRDb25maWcgfVxuICApIHtcbiAgICBpZiAoXG4gICAgICBwaGFzZSA9PT0gJ3BoYXNlLWRldmVsb3BtZW50LXNlcnZlcicgfHxcbiAgICAgIHBoYXNlID09PSAncGhhc2UtcHJvZHVjdGlvbi1idWlsZCdcbiAgICApIHtcbiAgICAgIGNvbnN0IHsgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUgfSA9IGF3YWl0IGltcG9ydChcbiAgICAgICAgJy4vc3djLXBsdWdpbi1jYWNoZS5qcydcbiAgICAgICk7XG4gICAgICAvLyBMb2FkZXIgd29ya2VycyBpbmhlcml0IHRoaXMgY3dkIGFuZCByZWFkIGZyb20gdGhlIHNhbWUgU1dDIGNhY2hlLlxuICAgICAgcHJld2FybVdvcmtmbG93U3djUGx1Z2luQ2FjaGUocHJvY2Vzcy5jd2QoKSk7XG4gICAgfVxuXG4gICAgY29uc3QgbG9hZGVyUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnLi9sb2FkZXInKTtcbiAgICBsZXQgbmV4dENvbmZpZzogTmV4dENvbmZpZztcblxuICAgIGlmICh0eXBlb2YgbmV4dENvbmZpZ09yRm4gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIG5leHRDb25maWcgPSBhd2FpdCBuZXh0Q29uZmlnT3JGbihwaGFzZSwgY3R4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV4dENvbmZpZyA9IG5leHRDb25maWdPckZuO1xuICAgIH1cbiAgICAvLyBzaGFsbG93IGNsb25lIHRvIGF2b2lkIHJlYWQtb25seSBvbiB0b3AtbGV2ZWxcbiAgICBuZXh0Q29uZmlnID0gT2JqZWN0LmFzc2lnbih7fSwgbmV4dENvbmZpZyk7XG4gICAgY29uc3Qgd29ya2Zsb3dCYXNlUGF0aCA9IG5leHRDb25maWcuYmFzZVBhdGg7XG4gICAgc2V0V29ya2Zsb3dCYXNlUGF0aCh3b3JrZmxvd0Jhc2VQYXRoKTtcbiAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFtcbiAgICAgICAgLi4uKG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyB8fCBbXSksXG4gICAgICAgIC8vIEtlZXAgdGhlIFZlcmNlbCB3b3JsZCBhbmQgaXRzIG5hdGl2ZS1wcm9uZSBkZXBlbmRlbmNpZXMgZXh0ZXJuYWwgc29cbiAgICAgICAgLy8gbG9jYWwgYnVpbGRzIGRvIG5vdCB0cnkgdG8gcGFyc2UgQHZlcmNlbC9xdWV1ZSdzIGtleXJpbmcgZGVwZW5kZW5jeVxuICAgICAgICAvLyB0cmVlLlxuICAgICAgICAuLi5WRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTLFxuICAgICAgXSksXG4gICAgXTtcbiAgICBjb25zdCBleGlzdGluZ0NvbXBpbGVyID0gbmV4dENvbmZpZy5jb21waWxlciA/PyB7fTtcbiAgICBjb25zdCBleGlzdGluZ1J1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGUgPSAoXG4gICAgICBleGlzdGluZ0NvbXBpbGVyIGFzIHtcbiAgICAgICAgcnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZT86IChtZXRhZGF0YToge1xuICAgICAgICAgIHByb2plY3REaXI6IHN0cmluZztcbiAgICAgICAgICBkaXN0RGlyOiBzdHJpbmc7XG4gICAgICAgIH0pID0+IFByb21pc2U8dm9pZD47XG4gICAgICB9XG4gICAgKS5ydW5BZnRlclByb2R1Y3Rpb25Db21waWxlO1xuXG4gICAgY29uc3QgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBBcnJheS5pc0FycmF5KFxuICAgICAgbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzXG4gICAgKVxuICAgICAgPyBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICAgIDogW107XG4gICAgbGV0IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcztcblxuICAgIGlmIChjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXRlY3RlZFdvcmtmbG93UGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgICAgaWYgKFBTRVVET19FWFRFUk5BTF9QQUNLQUdFUy5oYXMocGFja2FnZU5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRldGVjdGVkID0gYXdhaXQgZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5wdXNoKGRldGVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IG9ubHkuIE5ldmVyIGJsb2NrIGNvbmZpZyBnZW5lcmF0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBuZXcgU2V0KFxuICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5tYXAoKGRldGVjdGVkKSA9PiBkZXRlY3RlZC5wYWNrYWdlTmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9XG4gICAgICAgICAgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhY2thZ2VOYW1lKSA9PiAhcmVtb3ZlZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuICAgICAgICB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmUgdGhlIGxvYWRlciBpZiB0dXJib3BhY2sgaXMgYmVpbmcgdXNlZFxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2spIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrID0ge307XG4gICAgfVxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMpIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcyBhcyBhbnk7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3QgbmV4dFZlcnNpb24gPSByZXNvbHZlTmV4dFZlcnNpb24od29ya2luZ0Rpcik7XG4gICAgY29uc3QgY29uZmlndXJlZFByb2plY3RSb290ID1cbiAgICAgIG5leHRDb25maWcub3V0cHV0RmlsZVRyYWNpbmdSb290ID8/IG5leHRDb25maWcudHVyYm9wYWNrPy5yb290O1xuICAgIGNvbnN0IHByb2plY3RSb290ID0gY29uZmlndXJlZFByb2plY3RSb290XG4gICAgICA/IHJlc29sdmVDb25maWd1cmVkUHJvamVjdFJvb3Qod29ya2luZ0RpciwgY29uZmlndXJlZFByb2plY3RSb290KVxuICAgICAgOiByZXNvbHZlUHJvamVjdFJvb3Qod29ya2luZ0Rpcik7XG4gICAgY29uc3Qgc3VwcG9ydHNUdXJib0NvbmRpdGlvbiA9IHNlbXZlci5ndGUobmV4dFZlcnNpb24sICd2MTYuMC4wJyk7XG5cbiAgICBjb25zdCBzaG91bGRXYXRjaCA9IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnO1xuICAgIGxldCB3b3JrZmxvd0J1aWxkZXJQcm9taXNlOiBQcm9taXNlPGFueT4gfCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZGlzdERpciA9IG5leHRDb25maWcuZGlzdERpciB8fCAnLm5leHQnO1xuXG4gICAgbmV4dENvbmZpZy5jb21waWxlciA9IHtcbiAgICAgIC4uLmV4aXN0aW5nQ29tcGlsZXIsXG4gICAgICBydW5BZnRlclByb2R1Y3Rpb25Db21waWxlOiBhc3luYyAobWV0YWRhdGEpID0+IHtcbiAgICAgICAgaWYgKGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZSkge1xuICAgICAgICAgIGF3YWl0IGV4aXN0aW5nUnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZShtZXRhZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXQgY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdChtZXRhZGF0YSk7XG4gICAgICAgIHJlZ2lzdGVyV29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0Q29weShtZXRhZGF0YSk7XG4gICAgICB9LFxuICAgIH07XG5cbiAgICBjb25zdCBnZXRXb3JrZmxvd0J1aWxkZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXdvcmtmbG93QnVpbGRlclByb21pc2UpIHtcbiAgICAgICAgd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgTmV4dEJ1aWxkZXIgPSBhd2FpdCBnZXROZXh0QnVpbGRlcihuZXh0VmVyc2lvbik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBOZXh0QnVpbGRlcih7XG4gICAgICAgICAgICB3YXRjaDogc2hvdWxkV2F0Y2gsXG4gICAgICAgICAgICAvLyBnZXRJbnB1dEZpbGVzIGZpbHRlcnMgdGhlIHByb2plY3QgdG8gTmV4dC5qcyBlbnRyeXBvaW50c1xuICAgICAgICAgICAgZGlyczogWycuJ10sXG4gICAgICAgICAgICBwYWdlRXh0ZW5zaW9uczogbmV4dENvbmZpZy5wYWdlRXh0ZW5zaW9ucyA/PyBbXG4gICAgICAgICAgICAgICd0c3gnLFxuICAgICAgICAgICAgICAndHMnLFxuICAgICAgICAgICAgICAnanN4JyxcbiAgICAgICAgICAgICAgJ2pzJyxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBwcm9qZWN0Um9vdCxcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllclJvb3Q6IHdvcmtpbmdEaXIsXG4gICAgICAgICAgICB3b3JraW5nRGlyLFxuICAgICAgICAgICAgZGlzdERpcixcbiAgICAgICAgICAgIGJhc2VQYXRoOiB3b3JrZmxvd0Jhc2VQYXRoLFxuICAgICAgICAgICAgZGlhZ25vc3RpY3NEaXI6IGAke2Rpc3REaXJ9L2RpYWdub3N0aWNzYCxcbiAgICAgICAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsXG4gICAgICAgICAgICB3b3JrZmxvd3NCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc3RlcHNCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgd2ViaG9va0J1bmRsZVBhdGg6ICcnLCAvLyBub2RlIHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc291cmNlbWFwOiB3b3JrZmxvd3M/LnNvdXJjZW1hcCxcbiAgICAgICAgICAgIGV4dGVybmFsUGFja2FnZXM6IFtcbiAgICAgICAgICAgICAgLy8gc2VydmVyLW9ubHkgYW5kIGNsaWVudC1vbmx5IGFyZSBwc2V1ZG8tcGFja2FnZXMgaGFuZGxlZCBieSBOZXh0LmpzXG4gICAgICAgICAgICAgIC8vIGR1cmluZyBpdHMgYnVpbGQgcHJvY2Vzcy4gV2UgbWFyayB0aGVtIGFzIGV4dGVybmFsIHRvIHByZXZlbnQgZXNidWlsZFxuICAgICAgICAgICAgICAvLyBmcm9tIGZhaWxpbmcgd2hlbiBidW5kbGluZyBjb2RlIHRoYXQgaW1wb3J0cyB0aGVtLlxuICAgICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9nZXR0aW5nLXN0YXJ0ZWQvc2VydmVyLWFuZC1jbGllbnQtY29tcG9uZW50c1xuICAgICAgICAgICAgICAnc2VydmVyLW9ubHknLFxuICAgICAgICAgICAgICAnY2xpZW50LW9ubHknLFxuICAgICAgICAgICAgICAuLi5lZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdvcmtmbG93QnVpbGRlclByb21pc2U7XG4gICAgfTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIFtcbiAgICAgICcqLnRzeCcsXG4gICAgICAnKi50cycsXG4gICAgICAnKi5qc3gnLFxuICAgICAgJyouanMnLFxuICAgICAgJyoubWpzJyxcbiAgICAgICcqLm10cycsXG4gICAgICAnKi5janMnLFxuICAgICAgJyouY3RzJyxcbiAgICBdKSB7XG4gICAgICBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlc1trZXldID0ge1xuICAgICAgICAuLi4oc3VwcG9ydHNUdXJib0NvbmRpdGlvblxuICAgICAgICAgID8ge1xuICAgICAgICAgICAgICBjb25kaXRpb246IHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgJ2FsbCcgdG8gY29tYmluZTogbXVzdCBtYXRjaCBjb250ZW50IEFORCBtdXN0IE5PVCBiZSBpbiBnZW5lcmF0ZWQgcGF0aFxuICAgICAgICAgICAgICAgIC8vIE1lcmdlIHdpdGggYW55IGV4aXN0aW5nICdhbGwnIGNvbmRpdGlvbnMgZnJvbSB1c2VyIGNvbmZpZ1xuICAgICAgICAgICAgICAgIGFsbDogW1xuICAgICAgICAgICAgICAgICAgLi4uKGV4aXN0aW5nUnVsZXNba2V5XT8uY29uZGl0aW9uPy5hbGwgfHwgW10pLFxuICAgICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgZnJvbSB0cmFuc2Zvcm1hdGlvblxuICAgICAgICAgICAgICAgICAgeyBub3Q6IHsgcGF0aDogL1svXFxcXF1cXC53ZWxsLWtub3duWy9cXFxcXXdvcmtmbG93Wy9cXFxcXS8gfSB9LFxuICAgICAgICAgICAgICAgICAgLy8gTWF0Y2ggZmlsZXMgd2l0aCB3b3JrZmxvdyBkaXJlY3RpdmVzIG9yIGN1c3RvbSBzZXJpYWxpemF0aW9uIHBhdHRlcm5zXG4gICAgICAgICAgICAgICAgICAvLyBVc2VzIGJhY2tyZWZlcmVuY2VzIChcXDIsIFxcMykgdG8gZW5zdXJlIG1hdGNoaW5nIHF1b3RlIHR5cGVzXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6XG4gICAgICAgICAgICAgICAgICAgICAgLyh1c2Ugd29ya2Zsb3d8dXNlIHN0ZXB8ZnJvbVxccysoWydcIl0pQHdvcmtmbG93XFwvc2VyZGVcXDJ8U3ltYm9sXFwuZm9yXFxzKlxcKFxccyooWydcIl0pd29ya2Zsb3ctKD86c2VyaWFsaXplfGRlc2VyaWFsaXplKVxcM1xccypcXCkpLyxcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICA6IHt9KSxcbiAgICAgICAgbG9hZGVyczogWy4uLihleGlzdGluZ1J1bGVzW2tleV0/LmxvYWRlcnMgfHwgW10pLCBsb2FkZXJQYXRoXSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gY29uZmlndXJlIHRoZSBsb2FkZXIgZm9yIHdlYnBhY2tcbiAgICBjb25zdCBleGlzdGluZ1dlYnBhY2tNb2RpZnkgPSBuZXh0Q29uZmlnLndlYnBhY2s7XG4gICAgbmV4dENvbmZpZy53ZWJwYWNrID0gKC4uLmFyZ3MpID0+IHtcbiAgICAgIGNvbnN0IFt3ZWJwYWNrQ29uZmlnXSA9IGFyZ3M7XG4gICAgICBpZiAoIXdlYnBhY2tDb25maWcubW9kdWxlKSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlID0ge307XG4gICAgICB9XG4gICAgICBpZiAoIXdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzKSB7XG4gICAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzID0gW107XG4gICAgICB9XG4gICAgICAvLyBsb2FkZXJzIGluIHdlYnBhY2sgYXBwbHkgYm90dG9tLT51cCBzbyBlbnN1cmVcbiAgICAgIC8vIG91cnMgY29tZXMgYmVmb3JlIHRoZSBkZWZhdWx0IHN3YyB0cmFuc2Zvcm1cbiAgICAgIHdlYnBhY2tDb25maWcubW9kdWxlLnJ1bGVzLnB1c2goe1xuICAgICAgICB0ZXN0OiAvLipcXC4obWpzfGNqc3xjdHN8dHN8dHN4fGpzfGpzeCkkLyxcbiAgICAgICAgbG9hZGVyOiBsb2FkZXJQYXRoLFxuICAgICAgfSk7XG5cbiAgICAgIGlmIChhcmdzWzFdPy5pc1NlcnZlcikge1xuICAgICAgICBleHRlcm5hbGl6ZVdzTmF0aXZlQWNjZWxlcmF0b3JzKHdlYnBhY2tDb25maWcpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gZXhpc3RpbmdXZWJwYWNrTW9kaWZ5XG4gICAgICAgID8gKGV4aXN0aW5nV2VicGFja01vZGlmeSguLi5hcmdzKSA/PyB3ZWJwYWNrQ29uZmlnKVxuICAgICAgICA6IHdlYnBhY2tDb25maWc7XG4gICAgfTtcbiAgICAvLyBvbmx5IHJ1biB0aGlzIGluIHRoZSBtYWluIHByb2Nlc3Mgc28gaXQgb25seSBydW5zIG9uY2VcbiAgICAvLyBhcyBOZXh0LmpzIHVzZXMgY2hpbGQgcHJvY2Vzc2VzIGZvciBkaWZmZXJlbnQgYnVpbGRzXG4gICAgaWYgKFxuICAgICAgIXByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCAmJlxuICAgICAgcGhhc2UgIT09ICdwaGFzZS1wcm9kdWN0aW9uLXNlcnZlcidcbiAgICApIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93QnVpbGRlciA9IGF3YWl0IGdldFdvcmtmbG93QnVpbGRlcigpO1xuXG4gICAgICBhd2FpdCB3b3JrZmxvd0J1aWxkZXIuYnVpbGQoKTtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfUFJJVkFURV9CVUlMVCA9ICcxJztcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dENvbmZpZztcbiAgfTtcbn1cbiJdfQ==
|