@workflow/next 5.0.0-beta.2 → 5.0.0-beta.20
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-deferred.d.ts.map +1 -1
- package/dist/builder-deferred.js +416 -501
- package/dist/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +60 -76
- package/dist/builder.d.ts +1 -1
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +4 -4
- package/dist/environment-flag.d.ts +2 -0
- package/dist/environment-flag.d.ts.map +1 -0
- package/dist/environment-flag.js +15 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +267 -10
- package/dist/loader.d.ts +6 -0
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +59 -60
- package/dist/runtime.js +1 -1
- package/dist/socket-server.d.ts +20 -0
- package/dist/socket-server.d.ts.map +1 -1
- package/dist/socket-server.js +29 -2
- package/docs/api-reference/with-workflow.mdx +34 -2
- package/docs/next.mdx +5 -3
- package/package.json +4 -5
- 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.js.map +0 -1
- package/dist/step-copy-utils.d.ts +0 -19
- package/dist/step-copy-utils.d.ts.map +0 -1
- package/dist/step-copy-utils.js +0 -101
- package/dist/step-copy-utils.js.map +0 -1
package/dist/index.js
CHANGED
|
@@ -4,8 +4,144 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.withWorkflow = withWorkflow;
|
|
7
|
+
const node_fs_1 = require("node:fs");
|
|
8
|
+
const promises_1 = require("node:fs/promises");
|
|
9
|
+
const node_path_1 = require("node:path");
|
|
7
10
|
const semver_1 = __importDefault(require("semver"));
|
|
8
11
|
const builder_js_1 = require("./builder.js");
|
|
12
|
+
const environment_flag_js_1 = require("./environment-flag.js");
|
|
13
|
+
const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
|
|
14
|
+
const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
|
|
15
|
+
'@vercel/queue',
|
|
16
|
+
'@vercel/oidc',
|
|
17
|
+
'@vercel/cli-auth',
|
|
18
|
+
'@napi-rs/keyring',
|
|
19
|
+
];
|
|
20
|
+
const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
|
|
21
|
+
VERCEL_WORLD_PACKAGE,
|
|
22
|
+
...VERCEL_WORLD_DEPENDENCY_PACKAGES,
|
|
23
|
+
];
|
|
24
|
+
const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
|
|
25
|
+
const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
|
|
26
|
+
const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
|
|
27
|
+
const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
|
|
28
|
+
const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
|
|
29
|
+
const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
|
|
30
|
+
const warnedAutoRemovedServerExternalPackages = new Set();
|
|
31
|
+
function isPlainObject(value) {
|
|
32
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
function isResolvablePackageSpecifier(specifier) {
|
|
35
|
+
if (specifier.startsWith('.') || specifier.startsWith('/')) {
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
if (specifier.startsWith('$')) {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
if (specifier.includes('*') || specifier.includes(':')) {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
function detectWorkflowPatterns(source) {
|
|
47
|
+
const hasUseWorkflow = useWorkflowPattern.test(source);
|
|
48
|
+
const hasUseStep = useStepPattern.test(source);
|
|
49
|
+
const hasSerdeImport = workflowSerdeImportPattern.test(source);
|
|
50
|
+
const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
|
|
51
|
+
const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
|
|
52
|
+
return {
|
|
53
|
+
hasUseWorkflow,
|
|
54
|
+
hasUseStep,
|
|
55
|
+
hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
function getIssueLabels(detected) {
|
|
59
|
+
const issues = [];
|
|
60
|
+
if (detected.hasUseWorkflow) {
|
|
61
|
+
issues.push('"use workflow" functions');
|
|
62
|
+
}
|
|
63
|
+
if (detected.hasUseStep) {
|
|
64
|
+
issues.push('"use step" functions');
|
|
65
|
+
}
|
|
66
|
+
if (detected.hasSerde) {
|
|
67
|
+
issues.push('serialization classes');
|
|
68
|
+
}
|
|
69
|
+
return issues;
|
|
70
|
+
}
|
|
71
|
+
function hasWorkflowSerdeDependency(packageJson) {
|
|
72
|
+
if (!isPlainObject(packageJson)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
const dependencies = isPlainObject(packageJson.dependencies)
|
|
76
|
+
? packageJson.dependencies
|
|
77
|
+
: {};
|
|
78
|
+
const peerDependencies = isPlainObject(packageJson.peerDependencies)
|
|
79
|
+
? packageJson.peerDependencies
|
|
80
|
+
: {};
|
|
81
|
+
return (Object.hasOwn(dependencies, '@workflow/serde') ||
|
|
82
|
+
Object.hasOwn(peerDependencies, '@workflow/serde'));
|
|
83
|
+
}
|
|
84
|
+
async function detectServerExternalPackage(packageName, workingDir) {
|
|
85
|
+
if (!isResolvablePackageSpecifier(packageName)) {
|
|
86
|
+
return null;
|
|
87
|
+
}
|
|
88
|
+
let hasUseWorkflow = false;
|
|
89
|
+
let hasUseStep = false;
|
|
90
|
+
let hasSerde = false;
|
|
91
|
+
try {
|
|
92
|
+
const packageJsonPath = require.resolve(`${packageName}/package.json`, {
|
|
93
|
+
paths: [workingDir],
|
|
94
|
+
});
|
|
95
|
+
const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
|
|
96
|
+
const packageJson = JSON.parse(packageJsonSource);
|
|
97
|
+
hasSerde = hasWorkflowSerdeDependency(packageJson);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
// Best-effort only. Continue to source scanning.
|
|
101
|
+
}
|
|
102
|
+
try {
|
|
103
|
+
const entryPath = require.resolve(packageName, {
|
|
104
|
+
paths: [workingDir],
|
|
105
|
+
});
|
|
106
|
+
const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
|
|
107
|
+
const patterns = detectWorkflowPatterns(source);
|
|
108
|
+
hasUseWorkflow = patterns.hasUseWorkflow;
|
|
109
|
+
hasUseStep = patterns.hasUseStep;
|
|
110
|
+
hasSerde ||= patterns.hasSerde;
|
|
111
|
+
}
|
|
112
|
+
catch {
|
|
113
|
+
// Best-effort only. Use whichever signal we already have.
|
|
114
|
+
}
|
|
115
|
+
if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
packageName,
|
|
120
|
+
hasUseWorkflow,
|
|
121
|
+
hasUseStep,
|
|
122
|
+
hasSerde,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
|
|
126
|
+
const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
|
|
127
|
+
return !warnedAutoRemovedServerExternalPackages.has(packageName);
|
|
128
|
+
});
|
|
129
|
+
if (newlyDetectedPackages.length === 0) {
|
|
130
|
+
return;
|
|
131
|
+
}
|
|
132
|
+
for (const { packageName } of newlyDetectedPackages) {
|
|
133
|
+
warnedAutoRemovedServerExternalPackages.add(packageName);
|
|
134
|
+
}
|
|
135
|
+
const packageDescriptions = newlyDetectedPackages
|
|
136
|
+
.map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
|
|
137
|
+
.join(', ');
|
|
138
|
+
const packageNames = newlyDetectedPackages
|
|
139
|
+
.map((detected) => `"${detected.packageName}"`)
|
|
140
|
+
.join(', ');
|
|
141
|
+
console.warn(`\n⚠ Workflow found workflow code in serverExternalPackages: ${packageDescriptions}.` +
|
|
142
|
+
`\n Workflow removed the affected entries from serverExternalPackages for this build and is compiling the packages anyway.` +
|
|
143
|
+
`\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
|
|
144
|
+
}
|
|
9
145
|
function resolveNextVersion(workingDir) {
|
|
10
146
|
const errors = [];
|
|
11
147
|
// Try resolving from the consuming project's working directory first.
|
|
@@ -36,9 +172,80 @@ function resolveNextVersion(workingDir) {
|
|
|
36
172
|
}
|
|
37
173
|
throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
|
|
38
174
|
}
|
|
175
|
+
function fileExists(path) {
|
|
176
|
+
try {
|
|
177
|
+
const stats = (0, node_fs_1.statSync)(path);
|
|
178
|
+
return stats.isFile();
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return false;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
|
|
185
|
+
const manifestCandidates = [
|
|
186
|
+
(0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
|
|
187
|
+
(0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
|
|
188
|
+
(0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
|
|
189
|
+
];
|
|
190
|
+
const manifestPath = manifestCandidates.find(fileExists);
|
|
191
|
+
if (!manifestPath) {
|
|
192
|
+
return;
|
|
193
|
+
}
|
|
194
|
+
const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
|
|
195
|
+
? distDir
|
|
196
|
+
: (0, node_path_1.join)(projectDir, distDir);
|
|
197
|
+
const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
|
|
198
|
+
return { manifestPath, diagnosticsManifestPath };
|
|
199
|
+
}
|
|
200
|
+
async function copyWorkflowDiagnosticsManifest(metadata) {
|
|
201
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
202
|
+
if (!paths) {
|
|
203
|
+
return;
|
|
204
|
+
}
|
|
205
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
206
|
+
await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
207
|
+
await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
|
|
208
|
+
}
|
|
209
|
+
function copyWorkflowDiagnosticsManifestSync(metadata) {
|
|
210
|
+
const paths = getWorkflowManifestCopyPaths(metadata);
|
|
211
|
+
if (!paths) {
|
|
212
|
+
return;
|
|
213
|
+
}
|
|
214
|
+
const { manifestPath, diagnosticsManifestPath } = paths;
|
|
215
|
+
(0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
|
|
216
|
+
(0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
|
|
217
|
+
}
|
|
218
|
+
function registerWorkflowDiagnosticsManifestCopy(metadata) {
|
|
219
|
+
const marker = '__workflowDiagnosticsManifestCopies';
|
|
220
|
+
const globalWithMarker = globalThis;
|
|
221
|
+
if (!globalWithMarker[marker]) {
|
|
222
|
+
globalWithMarker[marker] = [];
|
|
223
|
+
process.once('exit', () => {
|
|
224
|
+
for (const copyMetadata of globalWithMarker[marker] || []) {
|
|
225
|
+
copyWorkflowDiagnosticsManifestSync(copyMetadata);
|
|
226
|
+
}
|
|
227
|
+
});
|
|
228
|
+
}
|
|
229
|
+
globalWithMarker[marker].push(metadata);
|
|
230
|
+
}
|
|
39
231
|
function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
40
|
-
|
|
41
|
-
|
|
232
|
+
// lazyDiscovery defaults to true; pass `lazyDiscovery: false` to force eager
|
|
233
|
+
// discovery (scanning the project at startup) instead of deferring workflow
|
|
234
|
+
// discovery until files are requested. The `WORKFLOW_NEXT_LAZY_DISCOVERY`
|
|
235
|
+
// environment variable, if set, takes precedence over the option.
|
|
236
|
+
const lazyDiscoveryOverride = (0, environment_flag_js_1.parseEnvironmentFlag)(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
|
|
237
|
+
if (lazyDiscoveryOverride === undefined) {
|
|
238
|
+
if (workflows?.lazyDiscovery === false) {
|
|
239
|
+
delete process.env.WORKFLOW_NEXT_LAZY_DISCOVERY;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = lazyDiscoveryOverride
|
|
247
|
+
? '1'
|
|
248
|
+
: '0';
|
|
42
249
|
}
|
|
43
250
|
if (!process.env.VERCEL_DEPLOYMENT_ID) {
|
|
44
251
|
if (!process.env.WORKFLOW_TARGET_WORLD) {
|
|
@@ -67,6 +274,45 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
67
274
|
}
|
|
68
275
|
// shallow clone to avoid read-only on top-level
|
|
69
276
|
nextConfig = Object.assign({}, nextConfig);
|
|
277
|
+
nextConfig.serverExternalPackages = [
|
|
278
|
+
...new Set([
|
|
279
|
+
...(nextConfig.serverExternalPackages || []),
|
|
280
|
+
// Keep the Vercel world and its native-prone dependencies external so
|
|
281
|
+
// local builds do not try to parse @vercel/queue's keyring dependency
|
|
282
|
+
// tree.
|
|
283
|
+
...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
|
|
284
|
+
]),
|
|
285
|
+
];
|
|
286
|
+
const existingCompiler = nextConfig.compiler ?? {};
|
|
287
|
+
const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
|
|
288
|
+
const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
|
|
289
|
+
? nextConfig.serverExternalPackages
|
|
290
|
+
: [];
|
|
291
|
+
let effectiveServerExternalPackages = configuredServerExternalPackages;
|
|
292
|
+
if (configuredServerExternalPackages.length > 0) {
|
|
293
|
+
const detectedWorkflowPackages = [];
|
|
294
|
+
for (const packageName of configuredServerExternalPackages) {
|
|
295
|
+
if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
|
|
296
|
+
continue;
|
|
297
|
+
}
|
|
298
|
+
try {
|
|
299
|
+
const detected = await detectServerExternalPackage(packageName, process.cwd());
|
|
300
|
+
if (detected) {
|
|
301
|
+
detectedWorkflowPackages.push(detected);
|
|
302
|
+
}
|
|
303
|
+
}
|
|
304
|
+
catch {
|
|
305
|
+
// Best-effort only. Never block config generation.
|
|
306
|
+
}
|
|
307
|
+
}
|
|
308
|
+
if (detectedWorkflowPackages.length > 0) {
|
|
309
|
+
const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
|
|
310
|
+
effectiveServerExternalPackages =
|
|
311
|
+
configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
|
|
312
|
+
nextConfig.serverExternalPackages = effectiveServerExternalPackages;
|
|
313
|
+
warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
70
316
|
// configure the loader if turbopack is being used
|
|
71
317
|
if (!nextConfig.turbopack) {
|
|
72
318
|
nextConfig.turbopack = {};
|
|
@@ -78,11 +324,19 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
78
324
|
const nextVersion = resolveNextVersion(process.cwd());
|
|
79
325
|
const supportsTurboCondition = semver_1.default.gte(nextVersion, 'v16.0.0');
|
|
80
326
|
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
327
|
const shouldWatch = process.env.NODE_ENV === 'development';
|
|
85
328
|
let workflowBuilderPromise;
|
|
329
|
+
const distDir = nextConfig.distDir || '.next';
|
|
330
|
+
nextConfig.compiler = {
|
|
331
|
+
...existingCompiler,
|
|
332
|
+
runAfterProductionCompile: async (metadata) => {
|
|
333
|
+
if (existingRunAfterProductionCompile) {
|
|
334
|
+
await existingRunAfterProductionCompile(metadata);
|
|
335
|
+
}
|
|
336
|
+
await copyWorkflowDiagnosticsManifest(metadata);
|
|
337
|
+
registerWorkflowDiagnosticsManifestCopy(metadata);
|
|
338
|
+
},
|
|
339
|
+
};
|
|
86
340
|
const getWorkflowBuilder = async () => {
|
|
87
341
|
if (!workflowBuilderPromise) {
|
|
88
342
|
workflowBuilderPromise = (async () => {
|
|
@@ -92,12 +346,15 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
92
346
|
// discover workflows from pages/app entries
|
|
93
347
|
dirs: ['pages', 'app', 'src/pages', 'src/app'],
|
|
94
348
|
projectRoot: nextConfig.outputFileTracingRoot,
|
|
349
|
+
moduleSpecifierRoot: process.cwd(),
|
|
95
350
|
workingDir: process.cwd(),
|
|
96
|
-
distDir
|
|
351
|
+
distDir,
|
|
352
|
+
diagnosticsDir: `${distDir}/diagnostics`,
|
|
97
353
|
buildTarget: 'next',
|
|
98
354
|
workflowsBundlePath: '', // not used in base
|
|
99
355
|
stepsBundlePath: '', // not used in base
|
|
100
356
|
webhookBundlePath: '', // node used in base
|
|
357
|
+
sourcemap: workflows?.sourcemap,
|
|
101
358
|
suppressCreateWorkflowsBundleLogs: useDeferredBuilder,
|
|
102
359
|
suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
|
|
103
360
|
suppressCreateWebhookBundleLogs: useDeferredBuilder,
|
|
@@ -109,7 +366,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
109
366
|
// See: https://nextjs.org/docs/app/getting-started/server-and-client-components
|
|
110
367
|
'server-only',
|
|
111
368
|
'client-only',
|
|
112
|
-
...
|
|
369
|
+
...effectiveServerExternalPackages,
|
|
113
370
|
],
|
|
114
371
|
});
|
|
115
372
|
})();
|
|
@@ -161,7 +418,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
161
418
|
'*.cts',
|
|
162
419
|
]) {
|
|
163
420
|
nextConfig.turbopack.rules[key] = {
|
|
164
|
-
...(
|
|
421
|
+
...(supportsTurboCondition
|
|
165
422
|
? {
|
|
166
423
|
condition: {
|
|
167
424
|
// Use 'all' to combine: must match content AND must NOT be in generated path
|
|
@@ -199,7 +456,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
199
456
|
loader: loaderPath,
|
|
200
457
|
});
|
|
201
458
|
return existingWebpackModify
|
|
202
|
-
? existingWebpackModify(...args)
|
|
459
|
+
? (existingWebpackModify(...args) ?? webpackConfig)
|
|
203
460
|
: webpackConfig;
|
|
204
461
|
};
|
|
205
462
|
// only run this in the main process so it only runs once
|
|
@@ -213,4 +470,4 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
|
|
|
213
470
|
return nextConfig;
|
|
214
471
|
};
|
|
215
472
|
}
|
|
216
|
-
//# sourceMappingURL=index.js.map
|
|
473
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUE2VEEsb0NBeVRDO0FBdG5CRCxxQ0FBNEQ7QUFDNUQsK0NBQTZEO0FBQzdELHlDQUFzRDtBQUV0RCxvREFBNEI7QUFDNUIsNkNBSXNCO0FBQ3RCLCtEQUE2RDtBQUU3RCxNQUFNLG9CQUFvQixHQUFHLHdCQUF3QixDQUFDO0FBQ3RELE1BQU0sZ0NBQWdDLEdBQUc7SUFDdkMsZUFBZTtJQUNmLGNBQWM7SUFDZCxrQkFBa0I7SUFDbEIsa0JBQWtCO0NBQ25CLENBQUM7QUFDRixNQUFNLHFDQUFxQyxHQUFHO0lBQzVDLG9CQUFvQjtJQUNwQixHQUFHLGdDQUFnQztDQUNwQyxDQUFDO0FBRUYsTUFBTSxrQkFBa0IsR0FBRyxpQ0FBaUMsQ0FBQztBQUM3RCxNQUFNLGNBQWMsR0FBRyw2QkFBNkIsQ0FBQztBQUNyRCxNQUFNLDBCQUEwQixHQUFHLGlDQUFpQyxDQUFDO0FBQ3JFLE1BQU0sMEJBQTBCLEdBQzlCLG9FQUFvRSxDQUFDO0FBQ3ZFLE1BQU0sb0NBQW9DLEdBQ3hDLDhDQUE4QyxDQUFDO0FBRWpELE1BQU0sd0JBQXdCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztBQUN6RSxNQUFNLHVDQUF1QyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7QUFlbEUsU0FBUyxhQUFhLENBQUMsS0FBYztJQUNuQyxPQUFPLE9BQU8sS0FBSyxLQUFLLFFBQVEsSUFBSSxLQUFLLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsU0FBUyw0QkFBNEIsQ0FBQyxTQUFpQjtJQUNyRCxJQUFJLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENB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Q3ZELElBQ0UsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLDJCQUEyQjtZQUN4QyxLQUFLLEtBQUsseUJBQXlCLEVBQ25DLENBQUM7WUFDRCxNQUFNLGVBQWUsR0FBRyxNQUFNLGtCQUFrQixFQUFFLENBQUM7WUFFbkQsTUFBTSxlQUFlLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDOUIsT0FBTyxDQUFDLEdBQUcsQ0FBQywyQkFBMkIsR0FBRyxHQUFHLENBQUM7UUFDaEQsQ0FBQztRQUVELE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjb3B5RmlsZVN5bmMsIG1rZGlyU3luYywgc3RhdFN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNvcHlGaWxlLCBta2RpciwgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7IGRpcm5hbWUsIGlzQWJzb2x1dGUsIGpvaW4gfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQge1xuICBnZXROZXh0QnVpbGRlcixcbiAgc2hvdWxkVXNlRGVmZXJyZWRCdWlsZGVyLFxuICBXT1JLRkxPV19ERUZFUlJFRF9FTlRSSUVTLFxufSBmcm9tICcuL2J1aWxkZXIuanMnO1xuaW1wb3J0IHsgcGFyc2VFbnZpcm9ubWVudEZsYWcgfSBmcm9tICcuL2Vudmlyb25tZW50LWZsYWcuanMnO1xuXG5jb25zdCBWRVJDRUxfV09STERfUEFDS0FHRSA9ICdAd29ya2Zsb3cvd29ybGQtdmVyY2VsJztcbmNvbnN0IFZFUkNFTF9XT1JMRF9ERVBFTkRFTkNZX1BBQ0tBR0VTID0gW1xuICAnQHZlcmNlbC9xdWV1ZScsXG4gICdAdmVyY2VsL29pZGMnLFxuICAnQHZlcmNlbC9jbGktYXV0aCcsXG4gICdAbmFwaS1ycy9rZXlyaW5nJyxcbl07XG5jb25zdCBWRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTID0gW1xuICBWRVJDRUxfV09STERfUEFDS0FHRSxcbiAgLi4uVkVSQ0VMX1dPUkxEX0RFUEVOREVOQ1lfUEFDS0FHRVMsXG5dO1xuXG5jb25zdCB1c2VXb3JrZmxvd1BhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHdvcmtmbG93XFwxOz9cXHMqJC9tO1xuY29uc3QgdXNlU3RlcFBhdHRlcm4gPSAvXlxccyooWydcIl0pdXNlIHN0ZXBcXDE7P1xccyokL207XG5jb25zdCB3b3JrZmxvd1NlcmRlSW1wb3J0UGF0dGVybiA9IC9mcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMS87XG5jb25zdCB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybiA9XG4gIC9TeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwxXFxzKlxcKS87XG5jb25zdCB3b3JrZmxvd1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eVBhdHRlcm4gPVxuICAvXFxbXFxzKldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSlcXHMqXFxdLztcblxuY29uc3QgUFNFVURPX0VYVEVSTkFMX1BBQ0tBR0VTID0gbmV3IFNldChbJ3NlcnZlci1vbmx5JywgJ2NsaWVudC1vbmx5J10pO1xuY29uc3Qgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cbmludGVyZmFjZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCB7XG4gIGhhc1VzZVdvcmtmbG93OiBib29sZWFuO1xuICBoYXNVc2VTdGVwOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuaW50ZXJmYWNlIERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHtcbiAgcGFja2FnZU5hbWU6IHN0cmluZztcbiAgaGFzVXNlV29ya2Zsb3c6IGJvb2xlYW47XG4gIGhhc1VzZVN0ZXA6IGJvb2xlYW47XG4gIGhhc1NlcmRlOiBib29sZWFuO1xufVxuXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSk7XG59XG5cbmZ1bmN0aW9uIGlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIoc3BlY2lmaWVyOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKHNwZWNpZmllci5zdGFydHNXaXRoKCcuJykgfHwgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJyQnKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoc3BlY2lmaWVyLmluY2x1ZGVzKCcqJykgfHwgc3BlY2lmaWVyLmluY2x1ZGVzKCc6JykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFdvcmtmbG93UGF0dGVybk1hdGNoIHtcbiAgY29uc3QgaGFzVXNlV29ya2Zsb3cgPSB1c2VXb3JrZmxvd1BhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNVc2VTdGVwID0gdXNlU3RlcFBhdHRlcm4udGVzdChzb3VyY2UpO1xuICBjb25zdCBoYXNTZXJkZUltcG9ydCA9IHdvcmtmbG93U2VyZGVJbXBvcnRQYXR0ZXJuLnRlc3Qoc291cmNlKTtcbiAgY29uc3QgaGFzU2VyZGVTeW1ib2wgPSB3b3JrZmxvd1NlcmRlU3ltYm9sUGF0dGVybi50ZXN0KHNvdXJjZSk7XG4gIGNvbnN0IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSA9XG4gICAgd29ya2Zsb3dTZXJkZUNvbXB1dGVkUHJvcGVydHlQYXR0ZXJuLnRlc3Qoc291cmNlKTtcblxuICByZXR1cm4ge1xuICAgIGhhc1VzZVdvcmtmbG93LFxuICAgIGhhc1VzZVN0ZXAsXG4gICAgaGFzU2VyZGU6IGhhc1NlcmRlSW1wb3J0IHx8IGhhc1NlcmRlU3ltYm9sIHx8IGhhc1NlcmRlQ29tcHV0ZWRQcm9wZXJ0eSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gZ2V0SXNzdWVMYWJlbHMoZGV0ZWN0ZWQ6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlKTogc3RyaW5nW10ge1xuICBjb25zdCBpc3N1ZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VXb3JrZmxvdykge1xuICAgIGlzc3Vlcy5wdXNoKCdcInVzZSB3b3JrZmxvd1wiIGZ1bmN0aW9ucycpO1xuICB9XG4gIGlmIChkZXRlY3RlZC5oYXNVc2VTdGVwKSB7XG4gICAgaXNzdWVzLnB1c2goJ1widXNlIHN0ZXBcIiBmdW5jdGlvbnMnKTtcbiAgfVxuICBpZiAoZGV0ZWN0ZWQuaGFzU2VyZGUpIHtcbiAgICBpc3N1ZXMucHVzaCgnc2VyaWFsaXphdGlvbiBjbGFzc2VzJyk7XG4gIH1cbiAgcmV0dXJuIGlzc3Vlcztcbn1cblxuZnVuY3Rpb24gaGFzV29ya2Zsb3dTZXJkZURlcGVuZGVuY3kocGFja2FnZUpzb246IHVua25vd24pOiBib29sZWFuIHtcbiAgaWYgKCFpc1BsYWluT2JqZWN0KHBhY2thZ2VKc29uKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzKVxuICAgID8gcGFja2FnZUpzb24uZGVwZW5kZW5jaWVzXG4gICAgOiB7fTtcbiAgY29uc3QgcGVlckRlcGVuZGVuY2llcyA9IGlzUGxhaW5PYmplY3QocGFja2FnZUpzb24ucGVlckRlcGVuZGVuY2llcylcbiAgICA/IHBhY2thZ2VKc29uLnBlZXJEZXBlbmRlbmNpZXNcbiAgICA6IHt9O1xuXG4gIHJldHVybiAoXG4gICAgT2JqZWN0Lmhhc093bihkZXBlbmRlbmNpZXMsICdAd29ya2Zsb3cvc2VyZGUnKSB8fFxuICAgIE9iamVjdC5oYXNPd24ocGVlckRlcGVuZGVuY2llcywgJ0B3b3JrZmxvdy9zZXJkZScpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdFNlcnZlckV4dGVybmFsUGFja2FnZShcbiAgcGFja2FnZU5hbWU6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlIHwgbnVsbD4ge1xuICBpZiAoIWlzUmVzb2x2YWJsZVBhY2thZ2VTcGVjaWZpZXIocGFja2FnZU5hbWUpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBsZXQgaGFzVXNlV29ya2Zsb3cgPSBmYWxzZTtcbiAgbGV0IGhhc1VzZVN0ZXAgPSBmYWxzZTtcbiAgbGV0IGhhc1NlcmRlID0gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoYCR7cGFja2FnZU5hbWV9L3BhY2thZ2UuanNvbmAsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3QgcGFja2FnZUpzb25Tb3VyY2UgPSBhd2FpdCByZWFkRmlsZShwYWNrYWdlSnNvblBhdGgsICd1dGYtOCcpO1xuICAgIGNvbnN0IHBhY2thZ2VKc29uID0gSlNPTi5wYXJzZShwYWNrYWdlSnNvblNvdXJjZSkgYXMgdW5rbm93bjtcbiAgICBoYXNTZXJkZSA9IGhhc1dvcmtmbG93U2VyZGVEZXBlbmRlbmN5KHBhY2thZ2VKc29uKTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gQ29udGludWUgdG8gc291cmNlIHNjYW5uaW5nLlxuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBlbnRyeVBhdGggPSByZXF1aXJlLnJlc29sdmUocGFja2FnZU5hbWUsIHtcbiAgICAgIHBhdGhzOiBbd29ya2luZ0Rpcl0sXG4gICAgfSk7XG4gICAgY29uc3Qgc291cmNlID0gYXdhaXQgcmVhZEZpbGUoZW50cnlQYXRoLCAndXRmLTgnKTtcbiAgICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlKTtcbiAgICBoYXNVc2VXb3JrZmxvdyA9IHBhdHRlcm5zLmhhc1VzZVdvcmtmbG93O1xuICAgIGhhc1VzZVN0ZXAgPSBwYXR0ZXJucy5oYXNVc2VTdGVwO1xuICAgIGhhc1NlcmRlIHx8PSBwYXR0ZXJucy5oYXNTZXJkZTtcbiAgfSBjYXRjaCB7XG4gICAgLy8gQmVzdC1lZmZvcnQgb25seS4gVXNlIHdoaWNoZXZlciBzaWduYWwgd2UgYWxyZWFkeSBoYXZlLlxuICB9XG5cbiAgaWYgKCFoYXNVc2VXb3JrZmxvdyAmJiAhaGFzVXNlU3RlcCAmJiAhaGFzU2VyZGUpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcGFja2FnZU5hbWUsXG4gICAgaGFzVXNlV29ya2Zsb3csXG4gICAgaGFzVXNlU3RlcCxcbiAgICBoYXNTZXJkZSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gd2FybkFib3V0QXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzKFxuICBkZXRlY3RlZFBhY2thZ2VzOiBEZXRlY3RlZFNlcnZlckV4dGVybmFsUGFja2FnZVtdXG4pOiB2b2lkIHtcbiAgY29uc3QgbmV3bHlEZXRlY3RlZFBhY2thZ2VzID0gZGV0ZWN0ZWRQYWNrYWdlcy5maWx0ZXIoKHsgcGFja2FnZU5hbWUgfSkgPT4ge1xuICAgIHJldHVybiAhd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSk7XG4gIH0pO1xuXG4gIGlmIChuZXdseURldGVjdGVkUGFja2FnZXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgZm9yIChjb25zdCB7IHBhY2thZ2VOYW1lIH0gb2YgbmV3bHlEZXRlY3RlZFBhY2thZ2VzKSB7XG4gICAgd2FybmVkQXV0b1JlbW92ZWRTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLmFkZChwYWNrYWdlTmFtZSk7XG4gIH1cblxuICBjb25zdCBwYWNrYWdlRGVzY3JpcHRpb25zID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcChcbiAgICAgIChkZXRlY3RlZCkgPT5cbiAgICAgICAgYFwiJHtkZXRlY3RlZC5wYWNrYWdlTmFtZX1cIiAoJHtnZXRJc3N1ZUxhYmVscyhkZXRlY3RlZCkuam9pbignLCAnKX0pYFxuICAgIClcbiAgICAuam9pbignLCAnKTtcbiAgY29uc3QgcGFja2FnZU5hbWVzID0gbmV3bHlEZXRlY3RlZFBhY2thZ2VzXG4gICAgLm1hcCgoZGV0ZWN0ZWQpID0+IGBcIiR7ZGV0ZWN0ZWQucGFja2FnZU5hbWV9XCJgKVxuICAgIC5qb2luKCcsICcpO1xuXG4gIGNvbnNvbGUud2FybihcbiAgICBgXFxu4pqgIFdvcmtmbG93IGZvdW5kIHdvcmtmbG93IGNvZGUgaW4gc2VydmVyRXh0ZXJuYWxQYWNrYWdlczogJHtwYWNrYWdlRGVzY3JpcHRpb25zfS5gICtcbiAgICAgIGBcXG4gIFdvcmtmbG93IHJlbW92ZWQgdGhlIGFmZmVjdGVkIGVudHJpZXMgZnJvbSBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzIGZvciB0aGlzIGJ1aWxkIGFuZCBpcyBjb21waWxpbmcgdGhlIHBhY2thZ2VzIGFueXdheS5gICtcbiAgICAgIGBcXG4gIFJlbW92ZSAke3BhY2thZ2VOYW1lc30gZnJvbSBzZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzIGluIG5leHQuY29uZmlnIHRvIHNpbGVuY2UgdGhpcyB3YXJuaW5nLlxcbmBcbiAgKTtcbn1cblxuZnVuY3Rpb24gcmVzb2x2ZU5leHRWZXJzaW9uKHdvcmtpbmdEaXI6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IGVycm9yczogdW5rbm93bltdID0gW107XG5cbiAgLy8gVHJ5IHJlc29sdmluZyBmcm9tIHRoZSBjb25zdW1pbmcgcHJvamVjdCdzIHdvcmtpbmcgZGlyZWN0b3J5IGZpcnN0LlxuICAvLyBUaGlzIGhhbmRsZXMgbW9ub3JlcG8gc2V0dXBzIHdoZXJlIGBuZXh0YCBtYXkgbm90IGJlIGhvaXN0ZWQgdG8gdGhlXG4gIC8vIHNhbWUgbG9jYXRpb24gYXMgYEB3b3JrZmxvdy9uZXh0YC5cbiAgdHJ5IHtcbiAgICBjb25zdCBwYWNrYWdlSnNvblBhdGggPSByZXF1aXJlLnJlc29sdmUoJ25leHQvcGFja2FnZS5qc29uJywge1xuICAgICAgcGF0aHM6IFt3b3JraW5nRGlyXSxcbiAgICB9KTtcbiAgICBjb25zdCByZXNvbHZlZFBhY2thZ2VKc29uID0gcmVxdWlyZShwYWNrYWdlSnNvblBhdGgpIGFzIHtcbiAgICAgIHZlcnNpb24/OiB1bmtub3duO1xuICAgIH07XG4gICAgaWYgKHR5cGVvZiByZXNvbHZlZFBhY2thZ2VKc29uLnZlcnNpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gcmVzb2x2ZWRQYWNrYWdlSnNvbi52ZXJzaW9uO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9ycy5wdXNoKGUpO1xuICB9XG5cbiAgLy8gRmFsbCBiYWNrIHRvIHJlc29sdmluZyByZWxhdGl2ZSB0byB0aGlzIHBhY2thZ2UncyBsb2NhdGlvbi5cbiAgdHJ5IHtcbiAgICBjb25zdCB2ZXJzaW9uID0gKHJlcXVpcmUoJ25leHQvcGFja2FnZS5qc29uJykgYXMgeyB2ZXJzaW9uPzogdW5rbm93biB9KVxuICAgICAgLnZlcnNpb247XG4gICAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZlcnNpb247XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgZXJyb3JzLnB1c2goZSk7XG4gIH1cblxuICB0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IoXG4gICAgZXJyb3JzLFxuICAgIGBDb3VsZCBub3QgcmVzb2x2ZSBOZXh0LmpzIHZlcnNpb24uIEVuc3VyZSBcXGBuZXh0XFxgIGlzIGluc3RhbGxlZCBpbiB5b3VyIHByb2plY3QgKHdvcmtpbmcgZGlyZWN0b3J5OiAke3dvcmtpbmdEaXJ9KS5gXG4gICk7XG59XG5cbmZ1bmN0aW9uIGZpbGVFeGlzdHMocGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHRyeSB7XG4gICAgY29uc3Qgc3RhdHMgPSBzdGF0U3luYyhwYXRoKTtcbiAgICByZXR1cm4gc3RhdHMuaXNGaWxlKCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKHtcbiAgcHJvamVjdERpcixcbiAgZGlzdERpcixcbn06IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogeyBtYW5pZmVzdFBhdGg6IHN0cmluZzsgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGg6IHN0cmluZyB9IHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgbWFuaWZlc3RDYW5kaWRhdGVzID0gW1xuICAgIGpvaW4ocHJvamVjdERpciwgJ2FwcC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJyksXG4gICAgam9pbihwcm9qZWN0RGlyLCAnc3JjL2FwcC8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJyksXG4gICAgam9pbihwcm9qZWN0RGlyLCAncHVibGljLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nKSxcbiAgXTtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gbWFuaWZlc3RDYW5kaWRhdGVzLmZpbmQoZmlsZUV4aXN0cyk7XG5cbiAgaWYgKCFtYW5pZmVzdFBhdGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCByZXNvbHZlZERpc3REaXIgPSBpc0Fic29sdXRlKGRpc3REaXIpXG4gICAgPyBkaXN0RGlyXG4gICAgOiBqb2luKHByb2plY3REaXIsIGRpc3REaXIpO1xuICBjb25zdCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCA9IGpvaW4oXG4gICAgcmVzb2x2ZWREaXN0RGlyLFxuICAgICdkaWFnbm9zdGljcycsXG4gICAgJ3dvcmtmbG93cy1tYW5pZmVzdC5qc29uJ1xuICApO1xuICByZXR1cm4geyBtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNvcHlXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3QobWV0YWRhdGE6IHtcbiAgcHJvamVjdERpcjogc3RyaW5nO1xuICBkaXN0RGlyOiBzdHJpbmc7XG59KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHBhdGhzID0gZ2V0V29ya2Zsb3dNYW5pZmVzdENvcHlQYXRocyhtZXRhZGF0YSk7XG4gIGlmICghcGF0aHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjb25zdCB7IG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGggfSA9IHBhdGhzO1xuICBhd2FpdCBta2RpcihkaXJuYW1lKGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGF3YWl0IGNvcHlGaWxlKG1hbmlmZXN0UGF0aCwgZGlhZ25vc3RpY3NNYW5pZmVzdFBhdGgpO1xufVxuXG5mdW5jdGlvbiBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0U3luYyhtZXRhZGF0YToge1xuICBwcm9qZWN0RGlyOiBzdHJpbmc7XG4gIGRpc3REaXI6IHN0cmluZztcbn0pOiB2b2lkIHtcbiAgY29uc3QgcGF0aHMgPSBnZXRXb3JrZmxvd01hbmlmZXN0Q29weVBhdGhzKG1ldGFkYXRhKTtcbiAgaWYgKCFwYXRocykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHsgbWFuaWZlc3RQYXRoLCBkaWFnbm9zdGljc01hbmlmZXN0UGF0aCB9ID0gcGF0aHM7XG4gIG1rZGlyU3luYyhkaXJuYW1lKGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gIGNvcHlGaWxlU3luYyhtYW5pZmVzdFBhdGgsIGRpYWdub3N0aWNzTWFuaWZlc3RQYXRoKTtcbn1cblxuZnVuY3Rpb24gcmVnaXN0ZXJXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3B5KG1ldGFkYXRhOiB7XG4gIHByb2plY3REaXI6IHN0cmluZztcbiAgZGlzdERpcjogc3RyaW5nO1xufSk6IHZvaWQge1xuICBjb25zdCBtYXJrZXIgPSAnX193b3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3BpZXMnO1xuICBjb25zdCBnbG9iYWxXaXRoTWFya2VyID0gZ2xvYmFsVGhpcyBhcyB0eXBlb2YgZ2xvYmFsVGhpcyAmIHtcbiAgICBbbWFya2VyXT86IEFycmF5PHsgcHJvamVjdERpcjogc3RyaW5nOyBkaXN0RGlyOiBzdHJpbmcgfT47XG4gIH07XG5cbiAgaWYgKCFnbG9iYWxXaXRoTWFya2VyW21hcmtlcl0pIHtcbiAgICBnbG9iYWxXaXRoTWFya2VyW21hcmtlcl0gPSBbXTtcbiAgICBwcm9jZXNzLm9uY2UoJ2V4aXQnLCAoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvcHlNZXRhZGF0YSBvZiBnbG9iYWxXaXRoTWFya2VyW21hcmtlcl0gfHwgW10pIHtcbiAgICAgICAgY29weVdvcmtmbG93RGlhZ25vc3RpY3NNYW5pZmVzdFN5bmMoY29weU1ldGFkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGdsb2JhbFdpdGhNYXJrZXJbbWFya2VyXS5wdXNoKG1ldGFkYXRhKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHdpdGhXb3JrZmxvdyhcbiAgbmV4dENvbmZpZ09yRm46XG4gICAgfCBOZXh0Q29uZmlnXG4gICAgfCAoKFxuICAgICAgICBwaGFzZTogc3RyaW5nLFxuICAgICAgICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4gICAgICApID0+IFByb21pc2U8TmV4dENvbmZpZz4pLFxuICB7XG4gICAgd29ya2Zsb3dzLFxuICB9OiB7XG4gICAgd29ya2Zsb3dzPzoge1xuICAgICAgbGF6eURpc2NvdmVyeT86IGJvb2xlYW47XG4gICAgICBsb2NhbD86IHtcbiAgICAgICAgcG9ydD86IG51bWJlcjtcbiAgICAgIH07XG4gICAgICAvKipcbiAgICAgICAqIENvbnRyb2xzIGhvdyBzb3VyY2UgbWFwcyBhcmUgZW1pdHRlZCBmb3Igd29ya2Zsb3cgYnVuZGxlcy4gQWNjZXB0c1xuICAgICAgICogdGhlIHNhbWUgdmFsdWVzIGFzIGVzYnVpbGQncyBgc291cmNlbWFwYCBvcHRpb246IGB0cnVlYC9gJ2lubGluZSdgXG4gICAgICAgKiAoZGVmYXVsdCksIGAnbGlua2VkJ2AsIGAnZXh0ZXJuYWwnYCwgYCdib3RoJ2AsIG9yIGBmYWxzZWAgdG8gb21pdFxuICAgICAgICogc291cmNlIG1hcHMuIENhbiBhbHNvIGJlIHNldCB2aWEgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgXG4gICAgICAgKiBlbnZpcm9ubWVudCB2YXJpYWJsZS5cbiAgICAgICAqL1xuICAgICAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2xpbmtlZCcgfCAnZXh0ZXJuYWwnIHwgJ2JvdGgnO1xuICAgIH07XG4gIH0gPSB7fVxuKSB7XG4gIC8vIGxhenlEaXNjb3ZlcnkgZGVmYXVsdHMgdG8gdHJ1ZTsgcGFzcyBgbGF6eURpc2NvdmVyeTogZmFsc2VgIHRvIGZvcmNlIGVhZ2VyXG4gIC8vIGRpc2NvdmVyeSAoc2Nhbm5pbmcgdGhlIHByb2plY3QgYXQgc3RhcnR1cCkgaW5zdGVhZCBvZiBkZWZlcnJpbmcgd29ya2Zsb3dcbiAgLy8gZGlzY292ZXJ5IHVudGlsIGZpbGVzIGFyZSByZXF1ZXN0ZWQuIFRoZSBgV09SS0ZMT1dfTkVYVF9MQVpZX0RJU0NPVkVSWWBcbiAgLy8gZW52aXJvbm1lbnQgdmFyaWFibGUsIGlmIHNldCwgdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBvcHRpb24uXG4gIGNvbnN0IGxhenlEaXNjb3ZlcnlPdmVycmlkZSA9IHBhcnNlRW52aXJvbm1lbnRGbGFnKFxuICAgIHByb2Nlc3MuZW52LldPUktGTE9XX05FWFRfTEFaWV9ESVNDT1ZFUllcbiAgKTtcbiAgaWYgKGxhenlEaXNjb3ZlcnlPdmVycmlkZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgaWYgKHdvcmtmbG93cz8ubGF6eURpc2NvdmVyeSA9PT0gZmFsc2UpIHtcbiAgICAgIGRlbGV0ZSBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX0xBWllfRElTQ09WRVJZO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX0xBWllfRElTQ09WRVJZID0gJzEnO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX0xBWllfRElTQ09WRVJZID0gbGF6eURpc2NvdmVyeU92ZXJyaWRlXG4gICAgICA/ICcxJ1xuICAgICAgOiAnMCc7XG4gIH1cblxuICBpZiAoIXByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEKSB7XG4gICAgaWYgKCFwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQpIHtcbiAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1RBUkdFVF9XT1JMRCA9ICdsb2NhbCc7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19MT0NBTF9EQVRBX0RJUiA9ICcubmV4dC93b3JrZmxvdy1kYXRhJztcbiAgICB9XG4gICAgY29uc3QgbWF5YmVQb3J0ID0gd29ya2Zsb3dzPy5sb2NhbD8ucG9ydDtcbiAgICBpZiAobWF5YmVQb3J0KSB7XG4gICAgICBwcm9jZXNzLmVudi5QT1JUID0gbWF5YmVQb3J0LnRvU3RyaW5nKCk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmICghcHJvY2Vzcy5lbnYuV09SS0ZMT1dfVEFSR0VUX1dPUkxEKSB7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQgPSAndmVyY2VsJztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gYnVpbGRDb25maWcoXG4gICAgcGhhc2U6IHN0cmluZyxcbiAgICBjdHg6IHsgZGVmYXVsdENvbmZpZzogTmV4dENvbmZpZyB9XG4gICkge1xuICAgIGNvbnN0IGxvYWRlclBhdGggPSByZXF1aXJlLnJlc29sdmUoJy4vbG9hZGVyJyk7XG4gICAgbGV0IHJ1bkRlZmVycmVkQnVpbGRGcm9tQ2FsbGJhY2s6ICgoKSA9PiBQcm9taXNlPHZvaWQ+KSB8IHVuZGVmaW5lZDtcblxuICAgIGxldCBuZXh0Q29uZmlnOiBOZXh0Q29uZmlnO1xuXG4gICAgaWYgKHR5cGVvZiBuZXh0Q29uZmlnT3JGbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgbmV4dENvbmZpZyA9IGF3YWl0IG5leHRDb25maWdPckZuKHBoYXNlLCBjdHgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXh0Q29uZmlnID0gbmV4dENvbmZpZ09yRm47XG4gICAgfVxuICAgIC8vIHNoYWxsb3cgY2xvbmUgdG8gYXZvaWQgcmVhZC1vbmx5IG9uIHRvcC1sZXZlbFxuICAgIG5leHRDb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBuZXh0Q29uZmlnKTtcbiAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBbXG4gICAgICAuLi5uZXcgU2V0KFtcbiAgICAgICAgLi4uKG5leHRDb25maWcuc2VydmVyRXh0ZXJuYWxQYWNrYWdlcyB8fCBbXSksXG4gICAgICAgIC8vIEtlZXAgdGhlIFZlcmNlbCB3b3JsZCBhbmQgaXRzIG5hdGl2ZS1wcm9uZSBkZXBlbmRlbmNpZXMgZXh0ZXJuYWwgc29cbiAgICAgICAgLy8gbG9jYWwgYnVpbGRzIGRvIG5vdCB0cnkgdG8gcGFyc2UgQHZlcmNlbC9xdWV1ZSdzIGtleXJpbmcgZGVwZW5kZW5jeVxuICAgICAgICAvLyB0cmVlLlxuICAgICAgICAuLi5WRVJDRUxfV09STERfU0VSVkVSX0VYVEVSTkFMX1BBQ0tBR0VTLFxuICAgICAgXSksXG4gICAgXTtcbiAgICBjb25zdCBleGlzdGluZ0NvbXBpbGVyID0gbmV4dENvbmZpZy5jb21waWxlciA/PyB7fTtcbiAgICBjb25zdCBleGlzdGluZ1J1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGUgPSAoXG4gICAgICBleGlzdGluZ0NvbXBpbGVyIGFzIHtcbiAgICAgICAgcnVuQWZ0ZXJQcm9kdWN0aW9uQ29tcGlsZT86IChtZXRhZGF0YToge1xuICAgICAgICAgIHByb2plY3REaXI6IHN0cmluZztcbiAgICAgICAgICBkaXN0RGlyOiBzdHJpbmc7XG4gICAgICAgIH0pID0+IFByb21pc2U8dm9pZD47XG4gICAgICB9XG4gICAgKS5ydW5BZnRlclByb2R1Y3Rpb25Db21waWxlO1xuXG4gICAgY29uc3QgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBBcnJheS5pc0FycmF5KFxuICAgICAgbmV4dENvbmZpZy5zZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzXG4gICAgKVxuICAgICAgPyBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXNcbiAgICAgIDogW107XG4gICAgbGV0IGVmZmVjdGl2ZVNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcztcblxuICAgIGlmIChjb25maWd1cmVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlcy5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBkZXRlY3RlZFdvcmtmbG93UGFja2FnZXM6IERldGVjdGVkU2VydmVyRXh0ZXJuYWxQYWNrYWdlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgcGFja2FnZU5hbWUgb2YgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMpIHtcbiAgICAgICAgaWYgKFBTRVVET19FWFRFUk5BTF9QQUNLQUdFUy5oYXMocGFja2FnZU5hbWUpKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IGRldGVjdGVkID0gYXdhaXQgZGV0ZWN0U2VydmVyRXh0ZXJuYWxQYWNrYWdlKFxuICAgICAgICAgICAgcGFja2FnZU5hbWUsXG4gICAgICAgICAgICBwcm9jZXNzLmN3ZCgpXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5wdXNoKGRldGVjdGVkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgIC8vIEJlc3QtZWZmb3J0IG9ubHkuIE5ldmVyIGJsb2NrIGNvbmZpZyBnZW5lcmF0aW9uLlxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXRlY3RlZFdvcmtmbG93UGFja2FnZXMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCByZW1vdmVkUGFja2FnZXMgPSBuZXcgU2V0KFxuICAgICAgICAgIGRldGVjdGVkV29ya2Zsb3dQYWNrYWdlcy5tYXAoKGRldGVjdGVkKSA9PiBkZXRlY3RlZC5wYWNrYWdlTmFtZSlcbiAgICAgICAgKTtcbiAgICAgICAgZWZmZWN0aXZlU2VydmVyRXh0ZXJuYWxQYWNrYWdlcyA9XG4gICAgICAgICAgY29uZmlndXJlZFNlcnZlckV4dGVybmFsUGFja2FnZXMuZmlsdGVyKFxuICAgICAgICAgICAgKHBhY2thZ2VOYW1lKSA9PiAhcmVtb3ZlZFBhY2thZ2VzLmhhcyhwYWNrYWdlTmFtZSlcbiAgICAgICAgICApO1xuICAgICAgICBuZXh0Q29uZmlnLnNlcnZlckV4dGVybmFsUGFja2FnZXMgPSBlZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzO1xuICAgICAgICB3YXJuQWJvdXRBdXRvUmVtb3ZlZFNlcnZlckV4dGVybmFsUGFja2FnZXMoZGV0ZWN0ZWRXb3JrZmxvd1BhY2thZ2VzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmUgdGhlIGxvYWRlciBpZiB0dXJib3BhY2sgaXMgYmVpbmcgdXNlZFxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2spIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrID0ge307XG4gICAgfVxuICAgIGlmICghbmV4dENvbmZpZy50dXJib3BhY2sucnVsZXMpIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzID0ge307XG4gICAgfVxuICAgIGNvbnN0IGV4aXN0aW5nUnVsZXMgPSBuZXh0Q29uZmlnLnR1cmJvcGFjay5ydWxlcyBhcyBhbnk7XG4gICAgY29uc3QgbmV4dFZlcnNpb24gPSByZXNvbHZlTmV4dFZlcnNpb24ocHJvY2Vzcy5jd2QoKSk7XG4gICAgY29uc3Qgc3VwcG9ydHNUdXJib0NvbmRpdGlvbiA9IHNlbXZlci5ndGUobmV4dFZlcnNpb24sICd2MTYuMC4wJyk7XG4gICAgY29uc3QgdXNlRGVmZXJyZWRCdWlsZGVyID0gc2hvdWxkVXNlRGVmZXJyZWRCdWlsZGVyKG5leHRWZXJzaW9uKTtcblxuICAgIGNvbnN0IHNob3VsZFdhdGNoID0gcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCc7XG4gICAgbGV0IHdvcmtmbG93QnVpbGRlclByb21pc2U6IFByb21pc2U8YW55PiB8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBkaXN0RGlyID0gbmV4dENvbmZpZy5kaXN0RGlyIHx8ICcubmV4dCc7XG5cbiAgICBuZXh0Q29uZmlnLmNvbXBpbGVyID0ge1xuICAgICAgLi4uZXhpc3RpbmdDb21waWxlcixcbiAgICAgIHJ1bkFmdGVyUHJvZHVjdGlvbkNvbXBpbGU6IGFzeW5jIChtZXRhZGF0YSkgPT4ge1xuICAgICAgICBpZiAoZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKSB7XG4gICAgICAgICAgYXdhaXQgZXhpc3RpbmdSdW5BZnRlclByb2R1Y3Rpb25Db21waWxlKG1ldGFkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjb3B5V29ya2Zsb3dEaWFnbm9zdGljc01hbmlmZXN0KG1ldGFkYXRhKTtcbiAgICAgICAgcmVnaXN0ZXJXb3JrZmxvd0RpYWdub3N0aWNzTWFuaWZlc3RDb3B5KG1ldGFkYXRhKTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIGNvbnN0IGdldFdvcmtmbG93QnVpbGRlciA9IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghd29ya2Zsb3dCdWlsZGVyUHJvbWlzZSkge1xuICAgICAgICB3b3JrZmxvd0J1aWxkZXJQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCBOZXh0QnVpbGRlciA9IGF3YWl0IGdldE5leHRCdWlsZGVyKG5leHRWZXJzaW9uKTtcbiAgICAgICAgICByZXR1cm4gbmV3IE5leHRCdWlsZGVyKHtcbiAgICAgICAgICAgIHdhdGNoOiBzaG91bGRXYXRjaCxcbiAgICAgICAgICAgIC8vIGRpc2NvdmVyIHdvcmtmbG93cyBmcm9tIHBhZ2VzL2FwcCBlbnRyaWVzXG4gICAgICAgICAgICBkaXJzOiBbJ3BhZ2VzJywgJ2FwcCcsICdzcmMvcGFnZXMnLCAnc3JjL2FwcCddLFxuICAgICAgICAgICAgcHJvamVjdFJvb3Q6IG5leHRDb25maWcub3V0cHV0RmlsZVRyYWNpbmdSb290LFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyUm9vdDogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgIHdvcmtpbmdEaXI6IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICBkaXN0RGlyLFxuICAgICAgICAgICAgZGlhZ25vc3RpY3NEaXI6IGAke2Rpc3REaXJ9L2RpYWdub3N0aWNzYCxcbiAgICAgICAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsXG4gICAgICAgICAgICB3b3JrZmxvd3NCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc3RlcHNCdW5kbGVQYXRoOiAnJywgLy8gbm90IHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgd2ViaG9va0J1bmRsZVBhdGg6ICcnLCAvLyBub2RlIHVzZWQgaW4gYmFzZVxuICAgICAgICAgICAgc291cmNlbWFwOiB3b3JrZmxvd3M/LnNvdXJjZW1hcCxcbiAgICAgICAgICAgIHN1cHByZXNzQ3JlYXRlV29ya2Zsb3dzQnVuZGxlTG9nczogdXNlRGVmZXJyZWRCdWlsZGVyLFxuICAgICAgICAgICAgc3VwcHJlc3NDcmVhdGVXb3JrZmxvd3NCdW5kbGVXYXJuaW5nczogdXNlRGVmZXJyZWRCdWlsZGVyLFxuICAgICAgICAgICAgc3VwcHJlc3NDcmVhdGVXZWJob29rQnVuZGxlTG9nczogdXNlRGVmZXJyZWRCdWlsZGVyLFxuICAgICAgICAgICAgc3VwcHJlc3NDcmVhdGVNYW5pZmVzdExvZ3M6IHVzZURlZmVycmVkQnVpbGRlcixcbiAgICAgICAgICAgIGV4dGVybmFsUGFja2FnZXM6IFtcbiAgICAgICAgICAgICAgLy8gc2VydmVyLW9ubHkgYW5kIGNsaWVudC1vbmx5IGFyZSBwc2V1ZG8tcGFja2FnZXMgaGFuZGxlZCBieSBOZXh0LmpzXG4gICAgICAgICAgICAgIC8vIGR1cmluZyBpdHMgYnVpbGQgcHJvY2Vzcy4gV2UgbWFyayB0aGVtIGFzIGV4dGVybmFsIHRvIHByZXZlbnQgZXNidWlsZFxuICAgICAgICAgICAgICAvLyBmcm9tIGZhaWxpbmcgd2hlbiBidW5kbGluZyBjb2RlIHRoYXQgaW1wb3J0cyB0aGVtLlxuICAgICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vbmV4dGpzLm9yZy9kb2NzL2FwcC9nZXR0aW5nLXN0YXJ0ZWQvc2VydmVyLWFuZC1jbGllbnQtY29tcG9uZW50c1xuICAgICAgICAgICAgICAnc2VydmVyLW9ubHknLFxuICAgICAgICAgICAgICAnY2xpZW50LW9ubHknLFxuICAgICAgICAgICAgICAuLi5lZmZlY3RpdmVTZXJ2ZXJFeHRlcm5hbFBhY2thZ2VzLFxuICAgICAgICAgICAgXSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSkoKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHdvcmtmbG93QnVpbGRlclByb21pc2U7XG4gICAgfTtcblxuICAgIGlmICh1c2VEZWZlcnJlZEJ1aWxkZXIpIHtcbiAgICAgIHJ1bkRlZmVycmVkQnVpbGRGcm9tQ2FsbGJhY2sgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHdvcmtmbG93QnVpbGRlciA9IGF3YWl0IGdldFdvcmtmbG93QnVpbGRlcigpO1xuICAgICAgICBpZiAodHlwZW9mIHdvcmtmbG93QnVpbGRlci5vbkJlZm9yZURlZmVycmVkRW50cmllcyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGF3YWl0IHdvcmtmbG93QnVpbGRlci5vbkJlZm9yZURlZmVycmVkRW50cmllcygpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBleGlzdGluZ0V4cGVyaW1lbnRhbCA9IChuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbCA/PyB7fSkgYXMgUmVjb3JkPFxuICAgICAgICBzdHJpbmcsXG4gICAgICAgIGFueVxuICAgICAgPjtcbiAgICAgIGNvbnN0IGV4aXN0aW5nRGVmZXJyZWRFbnRyaWVzID0gQXJyYXkuaXNBcnJheShcbiAgICAgICAgZXhpc3RpbmdFeHBlcmltZW50YWwuZGVmZXJyZWRFbnRyaWVzXG4gICAgICApXG4gICAgICAgID8gZXhpc3RpbmdFeHBlcmltZW50YWwuZGVmZXJyZWRFbnRyaWVzXG4gICAgICAgIDogW107XG4gICAgICBjb25zdCBleGlzdGluZ09uQmVmb3JlRGVmZXJyZWRFbnRyaWVzID1cbiAgICAgICAgdHlwZW9mIGV4aXN0aW5nRXhwZXJpbWVudGFsLm9uQmVmb3JlRGVmZXJyZWRFbnRyaWVzID09PSAnZnVuY3Rpb24nXG4gICAgICAgICAgPyBleGlzdGluZ0V4cGVyaW1lbnRhbC5vbkJlZm9yZURlZmVycmVkRW50cmllc1xuICAgICAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgICBuZXh0Q29uZmlnLmV4cGVyaW1lbnRhbCA9IHtcbiAgICAgICAgLi4uZXhpc3RpbmdFeHBlcmltZW50YWwsXG5cbiAgICAgICAgLy8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub1RzSWdub3JlOiBleHBlY3QtZXJyb3IgaXMgd3JvbmcgYXMgaXQgd2lsbCB3b3JrIG9uIHZhbGlkIHZlcnNpb25cbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIGlzIG9ubHkgYXZhaWxhYmxlIGluIGNhbmFyeSBOZXh0LmpzXG4gICAgICAgIGRlZmVycmVkRW50cmllczogW1xuICAgICAgICAgIC4uLm5ldyBTZXQoW1xuICAgICAgICAgICAgLi4uZXhpc3RpbmdEZWZlcnJlZEVudHJpZXMsXG4gICAgICAgICAgICAuLi5XT1JLRkxPV19ERUZFUlJFRF9FTlRSSUVTLFxuICAgICAgICAgIF0pLFxuICAgICAgICBdLFxuICAgICAgICBvbkJlZm9yZURlZmVycmVkRW50cmllczogYXN5bmMgKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgICAgICAgIGlmIChleGlzdGluZ09uQmVmb3JlRGVmZXJyZWRFbnRyaWVzKSB7XG4gICAgICAgICAgICBhd2FpdCBleGlzdGluZ09uQmVmb3JlRGVmZXJyZWRFbnRyaWVzKC4uLmFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjaykge1xuICAgICAgICAgICAgYXdhaXQgcnVuRGVmZXJyZWRCdWlsZEZyb21DYWxsYmFjaygpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgb2YgW1xuICAgICAgJyoudHN4JyxcbiAgICAgICcqLnRzJyxcbiAgICAgICcqLmpzeCcsXG4gICAgICAnKi5qcycsXG4gICAgICAnKi5tanMnLFxuICAgICAgJyoubXRzJyxcbiAgICAgICcqLmNqcycsXG4gICAgICAnKi5jdHMnLFxuICAgIF0pIHtcbiAgICAgIG5leHRDb25maWcudHVyYm9wYWNrLnJ1bGVzW2tleV0gPSB7XG4gICAgICAgIC4uLihzdXBwb3J0c1R1cmJvQ29uZGl0aW9uXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIGNvbmRpdGlvbjoge1xuICAgICAgICAgICAgICAgIC8vIFVzZSAnYWxsJyB0byBjb21iaW5lOiBtdXN0IG1hdGNoIGNvbnRlbnQgQU5EIG11c3QgTk9UIGJlIGluIGdlbmVyYXRlZCBwYXRoXG4gICAgICAgICAgICAgICAgLy8gTWVyZ2Ugd2l0aCBhbnkgZXhpc3RpbmcgJ2FsbCcgY29uZGl0aW9ucyBmcm9tIHVzZXIgY29uZmlnXG4gICAgICAgICAgICAgICAgYWxsOiBbXG4gICAgICAgICAgICAgICAgICAuLi4oZXhpc3RpbmdSdWxlc1trZXldPy5jb25kaXRpb24/LmFsbCB8fCBbXSksXG4gICAgICAgICAgICAgICAgICAvLyBFeGNsdWRlIGdlbmVyYXRlZCB3b3JrZmxvdyByb3V0ZSBmaWxlcyBmcm9tIHRyYW5zZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgICB7IG5vdDogeyBwYXRoOiAvWy9cXFxcXVxcLndlbGwta25vd25bL1xcXFxdd29ya2Zsb3dbL1xcXFxdLyB9IH0sXG4gICAgICAgICAgICAgICAgICAvLyBNYXRjaCBmaWxlcyB3aXRoIHdvcmtmbG93IGRpcmVjdGl2ZXMgb3IgY3VzdG9tIHNlcmlhbGl6YXRpb24gcGF0dGVybnNcbiAgICAgICAgICAgICAgICAgIC8vIFVzZXMgYmFja3JlZmVyZW5jZXMgKFxcMiwgXFwzKSB0byBlbnN1cmUgbWF0Y2hpbmcgcXVvdGUgdHlwZXNcbiAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudDpcbiAgICAgICAgICAgICAgICAgICAgICAvKHVzZSB3b3JrZmxvd3x1c2Ugc3RlcHxmcm9tXFxzKyhbJ1wiXSlAd29ya2Zsb3dcXC9zZXJkZVxcMnxTeW1ib2xcXC5mb3JcXHMqXFwoXFxzKihbJ1wiXSl3b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpXFwzXFxzKlxcKSkvLFxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfVxuICAgICAgICAgIDoge30pLFxuICAgICAgICBsb2FkZXJzOiBbLi4uKGV4aXN0aW5nUnVsZXNba2V5XT8ubG9hZGVycyB8fCBbXSksIGxvYWRlclBhdGhdLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBjb25maWd1cmUgdGhlIGxvYWRlciBmb3Igd2VicGFja1xuICAgIGNvbnN0IGV4aXN0aW5nV2VicGFja01vZGlmeSA9IG5leHRDb25maWcud2VicGFjaztcbiAgICBuZXh0Q29uZmlnLndlYnBhY2sgPSAoLi4uYXJncykgPT4ge1xuICAgICAgY29uc3QgW3dlYnBhY2tDb25maWddID0gYXJncztcbiAgICAgIGlmICghd2VicGFja0NvbmZpZy5tb2R1bGUpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUgPSB7fTtcbiAgICAgIH1cbiAgICAgIGlmICghd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMpIHtcbiAgICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMgPSBbXTtcbiAgICAgIH1cbiAgICAgIC8vIGxvYWRlcnMgaW4gd2VicGFjayBhcHBseSBib3R0b20tPnVwIHNvIGVuc3VyZVxuICAgICAgLy8gb3VycyBjb21lcyBiZWZvcmUgdGhlIGRlZmF1bHQgc3djIHRyYW5zZm9ybVxuICAgICAgd2VicGFja0NvbmZpZy5tb2R1bGUucnVsZXMucHVzaCh7XG4gICAgICAgIHRlc3Q6IC8uKlxcLihtanN8Y2pzfGN0c3x0c3x0c3h8anN8anN4KSQvLFxuICAgICAgICBsb2FkZXI6IGxvYWRlclBhdGgsXG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGV4aXN0aW5nV2VicGFja01vZGlmeVxuICAgICAgICA/IChleGlzdGluZ1dlYnBhY2tNb2RpZnkoLi4uYXJncykgPz8gd2VicGFja0NvbmZpZylcbiAgICAgICAgOiB3ZWJwYWNrQ29uZmlnO1xuICAgIH07XG4gICAgLy8gb25seSBydW4gdGhpcyBpbiB0aGUgbWFpbiBwcm9jZXNzIHNvIGl0IG9ubHkgcnVucyBvbmNlXG4gICAgLy8gYXMgTmV4dC5qcyB1c2VzIGNoaWxkIHByb2Nlc3NlcyBmb3IgZGlmZmVyZW50IGJ1aWxkc1xuICAgIGlmIChcbiAgICAgICFwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX1BSSVZBVEVfQlVJTFQgJiZcbiAgICAgIHBoYXNlICE9PSAncGhhc2UtcHJvZHVjdGlvbi1zZXJ2ZXInXG4gICAgKSB7XG4gICAgICBjb25zdCB3b3JrZmxvd0J1aWxkZXIgPSBhd2FpdCBnZXRXb3JrZmxvd0J1aWxkZXIoKTtcblxuICAgICAgYXdhaXQgd29ya2Zsb3dCdWlsZGVyLmJ1aWxkKCk7XG4gICAgICBwcm9jZXNzLmVudi5XT1JLRkxPV19ORVhUX1BSSVZBVEVfQlVJTFQgPSAnMSc7XG4gICAgfVxuXG4gICAgcmV0dXJuIG5leHRDb25maWc7XG4gIH07XG59XG4iXX0=
|
package/dist/loader.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
type DiscoveredPatternState = {
|
|
2
|
+
hasWorkflow: boolean;
|
|
3
|
+
hasStep: boolean;
|
|
4
|
+
hasSerde: boolean;
|
|
5
|
+
};
|
|
6
|
+
export declare function shouldNotifySocketForDiscoveredPattern(patternStateChanged: boolean, patternState: DiscoveredPatternState): boolean;
|
|
1
7
|
type WorkflowLoaderContext = {
|
|
2
8
|
resourcePath: string;
|
|
3
9
|
async?: () => (error: Error | null, content?: string, sourceMap?: any) => void;
|
package/dist/loader.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AA6BA,KAAK,sBAAsB,GAAG;IAC5B,WAAW,EAAE,OAAO,CAAC;IACrB,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,OAAO,CAAC;CACnB,CAAC;AAMF,wBAAgB,sCAAsC,CACpD,mBAAmB,EAAE,OAAO,EAC5B,YAAY,EAAE,sBAAsB,GACnC,OAAO,CAOT;AA+lBD,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CAiJjC"}
|