@workflow/next 4.0.10 → 4.1.0

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/loader.js CHANGED
@@ -2,46 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.default = workflowLoader;
4
4
  const node_fs_1 = require("node:fs");
5
- const promises_1 = require("node:fs/promises");
6
- const node_net_1 = require("node:net");
7
5
  const node_path_1 = require("node:path");
8
6
  const core_1 = require("@swc/core");
9
- const socket_server_js_1 = require("./socket-server.js");
10
- const step_copy_utils_js_1 = require("./step-copy-utils.js");
11
7
  // Cache decorator options per working directory to avoid reading tsconfig for every file
12
8
  const decoratorOptionsCache = new Map();
13
9
  // Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)
14
10
  let cachedBuildersModule = null;
15
11
  let cachedLoaderStaticDependencies = null;
16
- // Cache socket connection to avoid reconnecting on every file.
17
- let socketClientPromise = null;
18
- let socketClient = null;
19
- let socketClientKey = null;
20
- /**
21
- * Wrap a TCP connect failure with context about where the connection was
22
- * attempted, where the credentials came from, and which source file was
23
- * being processed when it failed. ECONNREFUSED is the common case here, and
24
- * the message points the user at the most likely root cause (stale
25
- * socket-info file).
26
- */
27
- function annotateConnectionError(originalError, credentials) {
28
- const errorCode = originalError instanceof Error &&
29
- 'code' in originalError &&
30
- typeof originalError.code === 'string'
31
- ? originalError.code
32
- : undefined;
33
- const errorMessage = originalError instanceof Error
34
- ? originalError.message
35
- : String(originalError);
36
- const lines = [
37
- `Workflow discovery socket connect failed: ${errorCode ?? errorMessage} (127.0.0.1:${credentials.port})`,
38
- ];
39
- const annotated = new Error(lines.join('\n'));
40
- if (originalError instanceof Error) {
41
- annotated.cause = originalError;
42
- }
43
- return annotated;
44
- }
45
12
  function registerFileDependency(loaderContext, dependencyPath) {
46
13
  loaderContext.addDependency?.(dependencyPath);
47
14
  loaderContext.addBuildDependency?.(dependencyPath);
@@ -64,8 +31,6 @@ function resolveLoaderStaticDependencies() {
64
31
  const workflowBuildersPackageJsonPath = (0, node_path_1.join)((0, node_path_1.dirname)(workflowBuildersPath), '../package.json');
65
32
  const files = new Set([
66
33
  __filename,
67
- require.resolve('./socket-server'),
68
- require.resolve('./step-copy-utils'),
69
34
  swcPluginPath,
70
35
  swcPluginBuildHashPath,
71
36
  workflowBuildersPath,
@@ -85,169 +50,6 @@ function registerTransformDependencies(loaderContext) {
85
50
  }
86
51
  return staticDependencies.swcPluginPath;
87
52
  }
88
- function resetSocketClient(cachedSocket) {
89
- if (cachedSocket && socketClient && socketClient !== cachedSocket) {
90
- return;
91
- }
92
- socketClientPromise = null;
93
- socketClient = null;
94
- socketClientKey = null;
95
- }
96
- async function writeSocketMessage(socket, message) {
97
- await new Promise((resolve, reject) => {
98
- socket.write(message, (error) => {
99
- if (error) {
100
- reject(error);
101
- return;
102
- }
103
- resolve();
104
- });
105
- });
106
- }
107
- function getSocketInfoFilePath() {
108
- const configuredPath = process.env.WORKFLOW_SOCKET_INFO_PATH;
109
- if (!configuredPath) {
110
- return null;
111
- }
112
- return configuredPath;
113
- }
114
- function getSocketCredentialsFromEnv() {
115
- const socketPort = process.env.WORKFLOW_SOCKET_PORT;
116
- const authToken = process.env.WORKFLOW_SOCKET_AUTH;
117
- if (!socketPort || !authToken) {
118
- return null;
119
- }
120
- const port = Number.parseInt(socketPort, 10);
121
- if (Number.isNaN(port)) {
122
- return null;
123
- }
124
- return { port, authToken };
125
- }
126
- async function getSocketCredentialsFromFile() {
127
- const socketInfoFilePath = getSocketInfoFilePath();
128
- if (!socketInfoFilePath) {
129
- return null;
130
- }
131
- if (!(0, node_fs_1.existsSync)(socketInfoFilePath)) {
132
- return null;
133
- }
134
- try {
135
- const raw = await (0, promises_1.readFile)(socketInfoFilePath, 'utf8');
136
- const parsed = JSON.parse(raw);
137
- const authToken = typeof parsed.authToken === 'string' ? parsed.authToken : null;
138
- const numericPort = typeof parsed.port === 'number'
139
- ? parsed.port
140
- : Number.parseInt(String(parsed.port), 10);
141
- if (!authToken || Number.isNaN(numericPort)) {
142
- return null;
143
- }
144
- return {
145
- port: numericPort,
146
- authToken,
147
- };
148
- }
149
- catch {
150
- return null;
151
- }
152
- }
153
- async function getSocketCredentials() {
154
- return (getSocketCredentialsFromEnv() ?? (await getSocketCredentialsFromFile()));
155
- }
156
- async function getSocketClient() {
157
- const socketCredentials = await getSocketCredentials();
158
- if (!socketCredentials) {
159
- return null;
160
- }
161
- if (socketClient?.destroyed) {
162
- resetSocketClient(socketClient);
163
- }
164
- const currentSocketKey = `${socketCredentials.port}:${socketCredentials.authToken}`;
165
- if (socketClientKey && socketClientKey !== currentSocketKey) {
166
- if (socketClient) {
167
- resetSocketClient(socketClient);
168
- }
169
- else {
170
- resetSocketClient();
171
- }
172
- }
173
- if (!socketClientPromise) {
174
- socketClientPromise = (async () => {
175
- try {
176
- const socket = (0, node_net_1.connect)({
177
- port: socketCredentials.port,
178
- host: '127.0.0.1',
179
- });
180
- // Wait for connection
181
- await new Promise((resolve, reject) => {
182
- const onConnect = () => {
183
- socket.setNoDelay(true);
184
- cleanup();
185
- resolve();
186
- };
187
- const onError = (error) => {
188
- cleanup();
189
- reject(annotateConnectionError(error, socketCredentials));
190
- };
191
- const timeout = setTimeout(() => {
192
- cleanup();
193
- socket.destroy();
194
- reject(annotateConnectionError(new Error('Socket connection timeout'), socketCredentials));
195
- }, 1000);
196
- const cleanup = () => {
197
- clearTimeout(timeout);
198
- socket.off('connect', onConnect);
199
- socket.off('error', onError);
200
- };
201
- socket.on('connect', onConnect);
202
- socket.on('error', onError);
203
- });
204
- socket.on('close', () => {
205
- resetSocketClient(socket);
206
- });
207
- socket.on('error', () => {
208
- resetSocketClient(socket);
209
- });
210
- socketClient = socket;
211
- socketClientKey = currentSocketKey;
212
- return socket;
213
- }
214
- catch (error) {
215
- resetSocketClient();
216
- throw error;
217
- }
218
- })();
219
- }
220
- return socketClientPromise;
221
- }
222
- async function notifySocketServer(filename, hasWorkflow, hasStep, hasSerde) {
223
- const socketCredentials = await getSocketCredentials();
224
- if (!socketCredentials) {
225
- return;
226
- }
227
- const socket = await getSocketClient();
228
- if (!socket) {
229
- throw new Error('Invariant: missing workflow socket connection');
230
- }
231
- const message = {
232
- type: 'file-discovered',
233
- filePath: filename,
234
- hasWorkflow,
235
- hasStep,
236
- hasSerde,
237
- };
238
- const serializedMessage = (0, socket_server_js_1.serializeMessage)(message, socketCredentials.authToken);
239
- try {
240
- await writeSocketMessage(socket, serializedMessage);
241
- }
242
- catch (error) {
243
- resetSocketClient(socket);
244
- const reconnectedSocket = await getSocketClient();
245
- if (!reconnectedSocket) {
246
- throw error;
247
- }
248
- await writeSocketMessage(reconnectedSocket, serializedMessage);
249
- }
250
- }
251
53
  async function getBuildersModule() {
252
54
  if (cachedBuildersModule) {
253
55
  return cachedBuildersModule;
@@ -333,10 +135,6 @@ async function getRelativeFilenameForSwc(filename, workingDir) {
333
135
  }
334
136
  return relativeFilename;
335
137
  }
336
- function stripDeferredStepSourceMetadataComment(source) {
337
- const metadataPattern = new RegExp(`^\\s*//\\s*${step_copy_utils_js_1.DEFERRED_STEP_SOURCE_METADATA_PREFIX}[A-Za-z0-9+/=]+\\s*\\r?\\n?`);
338
- return source.replace(metadataPattern, '');
339
- }
340
138
  function workflowLoader(source, sourceMap) {
341
139
  const callback = this.async?.();
342
140
  const run = async () => {
@@ -344,53 +142,23 @@ function workflowLoader(source, sourceMap) {
344
142
  const normalizedSource = source.toString();
345
143
  const workingDir = process.cwd();
346
144
  const swcPluginPath = registerTransformDependencies(this);
347
- const isDeferredStepCopyFile = (0, step_copy_utils_js_1.isDeferredStepCopyFilePath)(filename);
348
- const deferredStepSourceMetadata = isDeferredStepCopyFile
349
- ? (0, step_copy_utils_js_1.parseDeferredStepSourceMetadata)(normalizedSource)
350
- : null;
351
- const sourceWithoutDeferredMetadata = isDeferredStepCopyFile
352
- ? stripDeferredStepSourceMetadataComment(normalizedSource)
353
- : normalizedSource;
354
- const deferredSourceMapResult = isDeferredStepCopyFile
355
- ? (0, step_copy_utils_js_1.parseInlineSourceMapComment)(sourceWithoutDeferredMetadata)
356
- : {
357
- sourceWithoutMapComment: sourceWithoutDeferredMetadata,
358
- sourceMap: null,
359
- };
360
- const sourceForTransform = deferredSourceMapResult.sourceWithoutMapComment;
361
- const discoveryFilePath = deferredStepSourceMetadata?.absolutePath || filename;
362
- if (deferredStepSourceMetadata?.absolutePath) {
363
- // Ensure edits to the original source invalidate deferred step copies.
364
- registerFileDependency(this, deferredStepSourceMetadata.absolutePath);
365
- }
366
- // Skip generated workflow route files to avoid re-processing them
367
- if ((await checkGeneratedFile(filename)) && !isDeferredStepCopyFile) {
145
+ const sourceForTransform = normalizedSource;
146
+ const isGeneratedWorkflowFile = await checkGeneratedFile(filename);
147
+ // Skip generated workflow route files to avoid re-processing them.
148
+ if (isGeneratedWorkflowFile) {
368
149
  return { code: normalizedSource, map: sourceMap };
369
150
  }
370
151
  // Detect workflow patterns in the source code.
371
152
  const patterns = await detectPatterns(sourceForTransform);
372
- // Always notify discovery tracking, even for `false/false`, so files that
373
- // previously had workflow/step usage are removed from the tracked sets.
374
- // Deferred step copy files must report using their original source path so
375
- // deferred rebuilds can react to source edits outside generated artifacts.
376
- if (!isDeferredStepCopyFile || deferredStepSourceMetadata?.absolutePath) {
377
- // For @workflow SDK packages, do not report serde-only matches for
378
- // discovery, otherwise deferred mode can incorrectly treat SDK internals
379
- // as app serde entrypoints.
380
- const isSdkFile = await checkSdkFile(discoveryFilePath);
381
- await notifySocketServer(discoveryFilePath, patterns.hasUseWorkflow, patterns.hasUseStep, patterns.hasSerde && !isSdkFile);
153
+ // For @workflow SDK packages, only transform files with actual directives,
154
+ // not files that just match serde patterns (which are internal SDK implementation files)
155
+ const isSdkFile = await checkSdkFile(filename);
156
+ if (isSdkFile && !patterns.hasDirective) {
157
+ return { code: normalizedSource, map: sourceMap };
382
158
  }
383
- if (!isDeferredStepCopyFile) {
384
- // For @workflow SDK packages, only transform files with actual directives,
385
- // not files that just match serde patterns (which are internal SDK implementation files)
386
- const isSdkFile = await checkSdkFile(filename);
387
- if (isSdkFile && !patterns.hasDirective) {
388
- return { code: normalizedSource, map: sourceMap };
389
- }
390
- // Check if file needs transformation based on patterns and path
391
- if (!(await checkShouldTransform(filename, patterns))) {
392
- return { code: normalizedSource, map: sourceMap };
393
- }
159
+ // Check if file needs transformation based on patterns and path
160
+ if (!(await checkShouldTransform(filename, patterns))) {
161
+ return { code: normalizedSource, map: sourceMap };
394
162
  }
395
163
  const isTypeScript = filename.endsWith('.ts') ||
396
164
  filename.endsWith('.tsx') ||
@@ -398,16 +166,15 @@ function workflowLoader(source, sourceMap) {
398
166
  filename.endsWith('.cts');
399
167
  // Calculate relative filename for SWC plugin
400
168
  // The SWC plugin uses filename to generate workflowId, so it must be relative
401
- const relativeFilename = deferredStepSourceMetadata?.relativeFilename ||
402
- (await getRelativeFilenameForSwc(filename, workingDir));
169
+ const relativeFilename = await getRelativeFilenameForSwc(filename, workingDir);
403
170
  // Get decorator options from tsconfig (cached per working directory)
404
171
  const { options: decoratorOptions, configPath } = await getDecoratorOptions(workingDir);
405
172
  if (configPath) {
406
173
  registerFileDependency(this, configPath);
407
174
  }
408
175
  // Resolve module specifier for packages (node_modules or workspace packages)
409
- const moduleSpecifier = await getModuleSpecifier(deferredStepSourceMetadata?.absolutePath || filename, workingDir);
410
- const mode = isDeferredStepCopyFile ? 'step' : 'client';
176
+ const moduleSpecifier = await getModuleSpecifier(filename, workingDir);
177
+ const mode = 'client';
411
178
  // Transform with SWC
412
179
  const result = await (0, core_1.transform)(sourceForTransform, {
413
180
  filename: relativeFilename,
@@ -427,6 +194,7 @@ function workflowLoader(source, sourceMap) {
427
194
  },
428
195
  target: 'es2022',
429
196
  experimental: {
197
+ cacheRoot: (0, node_path_1.join)(workingDir, '.swc'),
430
198
  plugins: [[swcPluginPath, { mode, moduleSpecifier }]],
431
199
  },
432
200
  transform: {
@@ -438,9 +206,7 @@ function workflowLoader(source, sourceMap) {
438
206
  },
439
207
  },
440
208
  minify: false,
441
- inputSourceMap: isDeferredStepCopyFile
442
- ? deferredSourceMapResult.sourceMap || sourceMap
443
- : sourceMap,
209
+ inputSourceMap: sourceMap,
444
210
  sourceMaps: true,
445
211
  inlineSourcesContent: true,
446
212
  });
@@ -467,4 +233,4 @@ function workflowLoader(source, sourceMap) {
467
233
  callback(error instanceof Error ? error : new Error(String(error)));
468
234
  });
469
235
  }
470
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXFlQSxpQ0E2SkM7QUFsb0JELHFDQUFxQztBQUNyQywrQ0FBNEM7QUFDNUMsdUNBQWdEO0FBQ2hELHlDQUFvRDtBQUNwRCxvQ0FBc0M7QUFDdEMseURBQTBFO0FBQzFFLDZEQUs4QjtBQU05Qix5RkFBeUY7QUFDekYsTUFBTSxxQkFBcUIsR0FBRyxJQUFJLEdBQUcsRUFHbEMsQ0FBQztBQUNKLHlHQUF5RztBQUN6RyxJQUFJLG9CQUFvQixHQUErQyxJQUFJLENBQUM7QUFLNUUsSUFBSSw4QkFBOEIsR0FBb0MsSUFBSSxDQUFDO0FBRTNFLCtEQUErRDtBQUMvRCxJQUFJLG1CQUFtQixHQUFrQyxJQUFJLENBQUM7QUFDOUQsSUFBSSxZQUFZLEdBQWtCLElBQUksQ0FBQztBQUN2QyxJQUFJLGVBQWUsR0FBa0IsSUFBSSxDQUFDO0FBTzFDOzs7Ozs7R0FNRztBQUNILFNBQVMsdUJBQXVCLENBQzlCLGFBQXNCLEVBQ3RCLFdBQThCO0lBRTlCLE1BQU0sU0FBUyxHQUNiLGFBQWEsWUFBWSxLQUFLO1FBQzlCLE1BQU0sSUFBSSxhQUFhO1FBQ3ZCLE9BQVEsYUFBb0MsQ0FBQyxJQUFJLEtBQUssUUFBUTtRQUM1RCxDQUFDLENBQUcsYUFBa0MsQ0FBQyxJQUFlO1FBQ3RELENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDaEIsTUFBTSxZQUFZLEdBQ2hCLGFBQWEsWUFBWSxLQUFLO1FBQzVCLENBQUMsQ0FBQyxhQUFhLENBQUMsT0FBTztRQUN2QixDQUFDLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBRTVCLE1BQU0sS0FBSyxHQUFHO1FBQ1osNkNBQTZDLFNBQVMsSUFBSSxZQUFZLGVBQWUsV0FBVyxDQUFDLElBQUksR0FBRztLQUN6RyxDQUFDO0lBRUYsTUFBTSxTQUFTLEdBQUcsSUFBSSxLQUFLLENBQUMsS0FBSyxD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LFNBQVMsQ0FBQztRQUMvQixJQUFJLE9BQU8sTUFBTSxDQUFDLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQyxJQUFJLENBQUM7Z0JBQ0gsY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFDLENBQUM7WUFBQyxNQUFNLENBQUM7Z0JBQ1AsY0FBYyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUM7WUFDOUIsQ0FBQztRQUNILENBQUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixjQUFjLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM5QixDQUFDO1FBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxjQUFjLEVBQUUsQ0FBQztJQUNwRCxDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDZCxPQUFPLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxLQUFLLEdBQUcsRUFBRTtTQUNQLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN6RCxLQUFLLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRTtRQUN4QixRQUFRLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGV4aXN0c1N5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IHJlYWRGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBjb25uZWN0LCB0eXBlIFNvY2tldCB9IGZyb20gJ25vZGU6bmV0JztcbmltcG9ydCB7IGRpcm5hbWUsIGpvaW4sIHJlbGF0aXZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCB7IHRyYW5zZm9ybSB9IGZyb20gJ0Bzd2MvY29yZSc7XG5pbXBvcnQgeyB0eXBlIFNvY2tldE1lc3NhZ2UsIHNlcmlhbGl6ZU1lc3NhZ2UgfSBmcm9tICcuL3NvY2tldC1zZXJ2ZXIuanMnO1xuaW1wb3J0IHtcbiAgREVGRVJSRURfU1RFUF9TT1VSQ0VfTUVUQURBVEFfUFJFRklYLFxuICBpc0RlZmVycmVkU3RlcENvcHlGaWxlUGF0aCxcbiAgcGFyc2VEZWZlcnJlZFN0ZXBTb3VyY2VNZXRhZGF0YSxcbiAgcGFyc2VJbmxpbmVTb3VyY2VNYXBDb21tZW50LFxufSBmcm9tICcuL3N0ZXAtY29weS11dGlscy5qcyc7XG5cbnR5cGUgRGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoID1cbiAgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKS5EZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGg7XG50eXBlIFdvcmtmbG93UGF0dGVybk1hdGNoID0gaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKS5Xb3JrZmxvd1BhdHRlcm5NYXRjaDtcblxuLy8gQ2FjaGUgZGVjb3JhdG9yIG9wdGlvbnMgcGVyIHdvcmtpbmcgZGlyZWN0b3J5IHRvIGF2b2lkIHJlYWRpbmcgdHNjb25maWcgZm9yIGV2ZXJ5IGZpbGVcbmNvbnN0IGRlY29yYXRvck9wdGlvbnNDYWNoZSA9IG5ldyBNYXA8XG4gIHN0cmluZyxcbiAgUHJvbWlzZTxEZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGg+XG4+KCk7XG4vLyBDYWNoZSBmb3Igc2hhcmVkIHV0aWxpdGllcyBmcm9tIEB3b3JrZmxvdy9idWlsZGVycyAoRVNNIG1vZHVsZSBsb2FkZWQgZHluYW1pY2FsbHkgaW4gQ29tbW9uSlMgY29udGV4dClcbmxldCBjYWNoZWRCdWlsZGVyc01vZHVsZTogdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJykgfCBudWxsID0gbnVsbDtcbnR5cGUgTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzID0ge1xuICBzd2NQbHVnaW5QYXRoOiBzdHJpbmc7XG4gIGZpbGVzOiBzdHJpbmdbXTtcbn07XG5sZXQgY2FjaGVkTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzOiBMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMgfCBudWxsID0gbnVsbDtcblxuLy8gQ2FjaGUgc29ja2V0IGNvbm5lY3Rpb24gdG8gYXZvaWQgcmVjb25uZWN0aW5nIG9uIGV2ZXJ5IGZpbGUuXG5sZXQgc29ja2V0Q2xpZW50UHJvbWlzZTogUHJvbWlzZTxTb2NrZXQgfCBudWxsPiB8IG51bGwgPSBudWxsO1xubGV0IHNvY2tldENsaWVudDogU29ja2V0IHwgbnVsbCA9IG51bGw7XG5sZXQgc29ja2V0Q2xpZW50S2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxudHlwZSBTb2NrZXRDcmVkZW50aWFscyA9IHtcbiAgcG9ydDogbnVtYmVyO1xuICBhdXRoVG9rZW46IHN0cmluZztcbn07XG5cbi8qKlxuICogV3JhcCBhIFRDUCBjb25uZWN0IGZhaWx1cmUgd2l0aCBjb250ZXh0IGFib3V0IHdoZXJlIHRoZSBjb25uZWN0aW9uIHdhc1xuICogYXR0ZW1wdGVkLCB3aGVyZSB0aGUgY3JlZGVudGlhbHMgY2FtZSBmcm9tLCBhbmQgd2hpY2ggc291cmNlIGZpbGUgd2FzXG4gKiBiZWluZyBwcm9jZXNzZWQgd2hlbiBpdCBmYWlsZWQuIEVDT05OUkVGVVNFRCBpcyB0aGUgY29tbW9uIGNhc2UgaGVyZSwgYW5kXG4gKiB0aGUgbWVzc2FnZSBwb2ludHMgdGhlIHVzZXIgYXQgdGhlIG1vc3QgbGlrZWx5IHJvb3QgY2F1c2UgKHN0YWxlXG4gKiBzb2NrZXQtaW5mbyBmaWxlKS5cbiAqL1xuZnVuY3Rpb24gYW5ub3RhdGVDb25uZWN0aW9uRXJyb3IoXG4gIG9yaWdpbmFsRXJyb3I6IHVua25vd24sXG4gIGNyZWRlbnRpYWxzOiBTb2NrZXRDcmVkZW50aWFsc1xuKTogRXJyb3Ige1xuICBjb25zdCBlcnJvckNvZGUgPVxuICAgIG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvciAmJlxuICAgICdjb2RlJyBpbiBvcmlnaW5hbEVycm9yICYmXG4gICAgdHlwZW9mIChvcmlnaW5hbEVycm9yIGFzIHsgY29kZT86IHVua25vd24gfSkuY29kZSA9PT0gJ3N0cmluZydcbiAgICAgID8gKChvcmlnaW5hbEVycm9yIGFzIHsgY29kZTogc3RyaW5nIH0pLmNvZGUgYXMgc3RyaW5nKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGVycm9yTWVzc2FnZSA9XG4gICAgb3JpZ2luYWxFcnJvciBpbnN0YW5jZW9mIEVycm9yXG4gICAgICA/IG9yaWdpbmFsRXJyb3IubWVzc2FnZVxuICAgICAgOiBTdHJpbmcob3JpZ2luYWxFcnJvcik7XG5cbiAgY29uc3QgbGluZXMgPSBbXG4gICAgYFdvcmtmbG93IGRpc2NvdmVyeSBzb2NrZXQgY29ubmVjdCBmYWlsZWQ6ICR7ZXJyb3JDb2RlID8/IGVycm9yTWVzc2FnZX0gKDEyNy4wLjAuMToke2NyZWRlbnRpYWxzLnBvcnR9KWAsXG4gIF07XG5cbiAgY29uc3QgYW5ub3RhdGVkID0gbmV3IEVycm9yKGxpbmVzLmpvaW4oJ1xcbicpKTtcbiAgaWYgKG9yaWdpbmFsRXJyb3IgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgIChhbm5vdGF0ZWQgYXMgeyBjYXVzZT86IHVua25vd24gfSkuY2F1c2UgPSBvcmlnaW5hbEVycm9yO1xuICB9XG4gIHJldHVybiBhbm5vdGF0ZWQ7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRmlsZURlcGVuZGVuY3koXG4gIGxvYWRlckNvbnRleHQ6IFdvcmtmbG93TG9hZGVyQ29udGV4dCxcbiAgZGVwZW5kZW5jeVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGxvYWRlckNvbnRleHQuYWRkRGVwZW5kZW5jeT8uKGRlcGVuZGVuY3lQYXRoKTtcbiAgbG9hZGVyQ29udGV4dC5hZGRCdWlsZERlcGVuZGVuY3k/LihkZXBlbmRlbmN5UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZElmRXhpc3RzKGZpbGVzOiBTZXQ8c3RyaW5nPiwgZGVwZW5kZW5jeVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3RzU3luYyhkZXBlbmRlbmN5UGF0aCkpIHtcbiAgICBmaWxlcy5hZGQoZGVwZW5kZW5jeVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMoKTogTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzIHtcbiAgaWYgKGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llcykge1xuICAgIHJldHVybiBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBjb25zdCBzd2NQbHVnaW5QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvc3djLXBsdWdpbicpO1xuICBjb25zdCBzd2NQbHVnaW5CdWlsZEhhc2hQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFxuICAgICdAd29ya2Zsb3cvc3djLXBsdWdpbi9idWlsZC1oYXNoLmpzb24nXG4gICk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvYnVpbGRlcnMnKTtcblxuICAvLyBEZXJpdmUgcGFja2FnZS5qc29uIHBhdGhzIGZyb20gcmVzb2x2ZWQgZW50cnlwb2ludHMgdG8gYXZvaWRcbiAgLy8gVHVyYm9wYWNrIGxvYWRlci1ldmFsIGZhaWx1cmVzIGFyb3VuZCAuLi9wYWNrYWdlLmpzb24gcmVzb2x1dGlvbi5cbiAgY29uc3Qgc3djUGx1Z2luUGFja2FnZUpzb25QYXRoID0gam9pbihkaXJuYW1lKHN3Y1BsdWdpblBhdGgpLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYWNrYWdlSnNvblBhdGggPSBqb2luKFxuICAgIGRpcm5hbWUod29ya2Zsb3dCdWlsZGVyc1BhdGgpLFxuICAgICcuLi9wYWNrYWdlLmpzb24nXG4gICk7XG5cbiAgY29uc3QgZmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgIF9fZmlsZW5hbWUsXG4gICAgcmVxdWlyZS5yZXNvbHZlKCcuL3NvY2tldC1zZXJ2ZXInKSxcbiAgICByZXF1aXJlLnJlc29sdmUoJy4vc3RlcC1jb3B5LXV0aWxzJyksXG4gICAgc3djUGx1Z2luUGF0aCxcbiAgICBzd2NQbHVnaW5CdWlsZEhhc2hQYXRoLFxuICAgIHdvcmtmbG93QnVpbGRlcnNQYXRoLFxuICBdKTtcbiAgYWRkSWZFeGlzdHMoZmlsZXMsIHN3Y1BsdWdpblBhY2thZ2VKc29uUGF0aCk7XG4gIGFkZElmRXhpc3RzKGZpbGVzLCB3b3JrZmxvd0J1aWxkZXJzUGFja2FnZUpzb25QYXRoKTtcblxuICBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMgPSB7XG4gICAgc3djUGx1Z2luUGF0aCxcbiAgICBmaWxlczogQXJyYXkuZnJvbShmaWxlcyksXG4gIH07XG4gIHJldHVybiBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHJhbnNmb3JtRGVwZW5kZW5jaWVzKFxuICBsb2FkZXJDb250ZXh0OiBXb3JrZmxvd0xvYWRlckNvbnRleHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXRpY0RlcGVuZGVuY2llcyA9IHJlc29sdmVMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMoKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5UGF0aCBvZiBzdGF0aWNEZXBlbmRlbmNpZXMuZmlsZXMpIHtcbiAgICByZWdpc3RlckZpbGVEZXBlbmRlbmN5KGxvYWRlckNvbnRleHQsIGRlcGVuZGVuY3lQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0aWNEZXBlbmRlbmNpZXMuc3djUGx1Z2luUGF0aDtcbn1cblxuZnVuY3Rpb24gcmVzZXRTb2NrZXRDbGllbnQoY2FjaGVkU29ja2V0PzogU29ja2V0KTogdm9pZCB7XG4gIGlmIChjYWNoZWRTb2NrZXQgJiYgc29ja2V0Q2xpZW50ICYmIHNvY2tldENsaWVudCAhPT0gY2FjaGVkU29ja2V0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgc29ja2V0Q2xpZW50UHJvbWlzZSA9IG51bGw7XG4gIHNvY2tldENsaWVudCA9IG51bGw7XG4gIHNvY2tldENsaWVudEtleSA9IG51bGw7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHdyaXRlU29ja2V0TWVzc2FnZShcbiAgc29ja2V0OiBTb2NrZXQsXG4gIG1lc3NhZ2U6IHN0cmluZ1xuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBzb2NrZXQud3JpdGUobWVzc2FnZSwgKGVycm9yPzogRXJyb3IgfCBudWxsKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgcmVzb2x2ZSgpO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0SW5mb0ZpbGVQYXRoKCk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBjb25maWd1cmVkUGF0aCA9IHByb2Nlc3MuZW52LldPUktGTE9XX1NPQ0tFVF9JTkZPX1BBVEg7XG4gIGlmICghY29uZmlndXJlZFBhdGgpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHJldHVybiBjb25maWd1cmVkUGF0aDtcbn1cblxuZnVuY3Rpb24gZ2V0U29ja2V0Q3JlZGVudGlhbHNGcm9tRW52KCk6IFNvY2tldENyZWRlbnRpYWxzIHwgbnVsbCB7XG4gIGNvbnN0IHNvY2tldFBvcnQgPSBwcm9jZXNzLmVudi5XT1JLRkxPV19TT0NLRVRfUE9SVDtcbiAgY29uc3QgYXV0aFRva2VuID0gcHJvY2Vzcy5lbnYuV09SS0ZMT1dfU09DS0VUX0FVVEg7XG4gIGlmICghc29ja2V0UG9ydCB8fCAhYXV0aFRva2VuKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBjb25zdCBwb3J0ID0gTnVtYmVyLnBhcnNlSW50KHNvY2tldFBvcnQsIDEwKTtcbiAgaWYgKE51bWJlci5pc05hTihwb3J0KSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgcmV0dXJuIHsgcG9ydCwgYXV0aFRva2VuIH07XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNvY2tldENyZWRlbnRpYWxzRnJvbUZpbGUoKTogUHJvbWlzZTxTb2NrZXRDcmVkZW50aWFscyB8IG51bGw+IHtcbiAgY29uc3Qgc29ja2V0SW5mb0ZpbGVQYXRoID0gZ2V0U29ja2V0SW5mb0ZpbGVQYXRoKCk7XG4gIGlmICghc29ja2V0SW5mb0ZpbGVQYXRoKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKCFleGlzdHNTeW5jKHNvY2tldEluZm9GaWxlUGF0aCkpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgcmF3ID0gYXdhaXQgcmVhZEZpbGUoc29ja2V0SW5mb0ZpbGVQYXRoLCAndXRmOCcpO1xuICAgIGNvbnN0IHBhcnNlZCA9IEpTT04ucGFyc2UocmF3KSBhcyB7XG4gICAgICBwb3J0PzogdW5rbm93bjtcbiAgICAgIGF1dGhUb2tlbj86IHVua25vd247XG4gICAgfTtcbiAgICBjb25zdCBhdXRoVG9rZW4gPVxuICAgICAgdHlwZW9mIHBhcnNlZC5hdXRoVG9rZW4gPT09ICdzdHJpbmcnID8gcGFyc2VkLmF1dGhUb2tlbiA6IG51bGw7XG4gICAgY29uc3QgbnVtZXJpY1BvcnQgPVxuICAgICAgdHlwZW9mIHBhcnNlZC5wb3J0ID09PSAnbnVtYmVyJ1xuICAgICAgICA/IHBhcnNlZC5wb3J0XG4gICAgICAgIDogTnVtYmVyLnBhcnNlSW50KFN0cmluZyhwYXJzZWQucG9ydCksIDEwKTtcblxuICAgIGlmICghYXV0aFRva2VuIHx8IE51bWJlci5pc05hTihudW1lcmljUG9ydCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBwb3J0OiBudW1lcmljUG9ydCxcbiAgICAgIGF1dGhUb2tlbixcbiAgICB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRTb2NrZXRDcmVkZW50aWFscygpOiBQcm9taXNlPFNvY2tldENyZWRlbnRpYWxzIHwgbnVsbD4ge1xuICByZXR1cm4gKFxuICAgIGdldFNvY2tldENyZWRlbnRpYWxzRnJvbUVudigpID8/IChhd2FpdCBnZXRTb2NrZXRDcmVkZW50aWFsc0Zyb21GaWxlKCkpXG4gICk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFNvY2tldENsaWVudCgpOiBQcm9taXNlPFNvY2tldCB8IG51bGw+IHtcbiAgY29uc3Qgc29ja2V0Q3JlZGVudGlhbHMgPSBhd2FpdCBnZXRTb2NrZXRDcmVkZW50aWFscygpO1xuICBpZiAoIXNvY2tldENyZWRlbnRpYWxzKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAoc29ja2V0Q2xpZW50Py5kZXN0cm95ZWQpIHtcbiAgICByZXNldFNvY2tldENsaWVudChzb2NrZXRDbGllbnQpO1xuICB9XG5cbiAgY29uc3QgY3VycmVudFNvY2tldEtleSA9IGAke3NvY2tldENyZWRlbnRpYWxzLnBvcnR9OiR7c29ja2V0Q3JlZGVudGlhbHMuYXV0aFRva2VufWA7XG4gIGlmIChzb2NrZXRDbGllbnRLZXkgJiYgc29ja2V0Q2xpZW50S2V5ICE9PSBjdXJyZW50U29ja2V0S2V5KSB7XG4gICAgaWYgKHNvY2tldENsaWVudCkge1xuICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0Q2xpZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzZXRTb2NrZXRDbGllbnQoKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIXNvY2tldENsaWVudFByb21pc2UpIHtcbiAgICBzb2NrZXRDbGllbnRQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IGNvbm5lY3Qoe1xuICAgICAgICAgIHBvcnQ6IHNvY2tldENyZWRlbnRpYWxzLnBvcnQsXG4gICAgICAgICAgaG9zdDogJzEyNy4wLjAuMScsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFdhaXQgZm9yIGNvbm5lY3Rpb25cbiAgICAgICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG9uQ29ubmVjdCA9ICgpID0+IHtcbiAgICAgICAgICAgIHNvY2tldC5zZXROb0RlbGF5KHRydWUpO1xuICAgICAgICAgICAgY2xlYW51cCgpO1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgY29uc3Qgb25FcnJvciA9IChlcnJvcjogRXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHJlamVjdChhbm5vdGF0ZUNvbm5lY3Rpb25FcnJvcihlcnJvciwgc29ja2V0Q3JlZGVudGlhbHMpKTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIGNvbnN0IHRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIGNsZWFudXAoKTtcbiAgICAgICAgICAgIHNvY2tldC5kZXN0cm95KCk7XG4gICAgICAgICAgICByZWplY3QoXG4gICAgICAgICAgICAgIGFubm90YXRlQ29ubmVjdGlvbkVycm9yKFxuICAgICAgICAgICAgICAgIG5ldyBFcnJvcignU29ja2V0IGNvbm5lY3Rpb24gdGltZW91dCcpLFxuICAgICAgICAgICAgICAgIHNvY2tldENyZWRlbnRpYWxzXG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgY29uc3QgY2xlYW51cCA9ICgpID0+IHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICAgICAgICAgIHNvY2tldC5vZmYoJ2Nvbm5lY3QnLCBvbkNvbm5lY3QpO1xuICAgICAgICAgICAgc29ja2V0Lm9mZignZXJyb3InLCBvbkVycm9yKTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgc29ja2V0Lm9uKCdjb25uZWN0Jywgb25Db25uZWN0KTtcbiAgICAgICAgICBzb2NrZXQub24oJ2Vycm9yJywgb25FcnJvcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNvY2tldC5vbignY2xvc2UnLCAoKSA9PiB7XG4gICAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0KTtcbiAgICAgICAgfSk7XG4gICAgICAgIHNvY2tldC5vbignZXJyb3InLCAoKSA9PiB7XG4gICAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoc29ja2V0KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgc29ja2V0Q2xpZW50ID0gc29ja2V0O1xuICAgICAgICBzb2NrZXRDbGllbnRLZXkgPSBjdXJyZW50U29ja2V0S2V5O1xuICAgICAgICByZXR1cm4gc29ja2V0O1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgcmVzZXRTb2NrZXRDbGllbnQoKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICB9XG4gICAgfSkoKTtcbiAgfVxuXG4gIHJldHVybiBzb2NrZXRDbGllbnRQcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBub3RpZnlTb2NrZXRTZXJ2ZXIoXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIGhhc1dvcmtmbG93OiBib29sZWFuLFxuICBoYXNTdGVwOiBib29sZWFuLFxuICBoYXNTZXJkZTogYm9vbGVhblxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHNvY2tldENyZWRlbnRpYWxzID0gYXdhaXQgZ2V0U29ja2V0Q3JlZGVudGlhbHMoKTtcbiAgaWYgKCFzb2NrZXRDcmVkZW50aWFscykge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IHNvY2tldCA9IGF3YWl0IGdldFNvY2tldENsaWVudCgpO1xuICBpZiAoIXNvY2tldCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YXJpYW50OiBtaXNzaW5nIHdvcmtmbG93IHNvY2tldCBjb25uZWN0aW9uJyk7XG4gIH1cblxuICBjb25zdCBtZXNzYWdlOiBTb2NrZXRNZXNzYWdlID0ge1xuICAgIHR5cGU6ICdmaWxlLWRpc2NvdmVyZWQnLFxuICAgIGZpbGVQYXRoOiBmaWxlbmFtZSxcbiAgICBoYXNXb3JrZmxvdyxcbiAgICBoYXNTdGVwLFxuICAgIGhhc1NlcmRlLFxuICB9O1xuICBjb25zdCBzZXJpYWxpemVkTWVzc2FnZSA9IHNlcmlhbGl6ZU1lc3NhZ2UoXG4gICAgbWVzc2FnZSxcbiAgICBzb2NrZXRDcmVkZW50aWFscy5hdXRoVG9rZW5cbiAgKTtcblxuICB0cnkge1xuICAgIGF3YWl0IHdyaXRlU29ja2V0TWVzc2FnZShzb2NrZXQsIHNlcmlhbGl6ZWRNZXNzYWdlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXNldFNvY2tldENsaWVudChzb2NrZXQpO1xuICAgIGNvbnN0IHJlY29ubmVjdGVkU29ja2V0ID0gYXdhaXQgZ2V0U29ja2V0Q2xpZW50KCk7XG4gICAgaWYgKCFyZWNvbm5lY3RlZFNvY2tldCkge1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuICAgIGF3YWl0IHdyaXRlU29ja2V0TWVzc2FnZShyZWNvbm5lY3RlZFNvY2tldCwgc2VyaWFsaXplZE1lc3NhZ2UpO1xuICB9XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkZXJzTW9kdWxlKCk6IFByb21pc2U8XG4gIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpXG4+IHtcbiAgaWYgKGNhY2hlZEJ1aWxkZXJzTW9kdWxlKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJ1aWxkZXJzTW9kdWxlO1xuICB9XG4gIC8vIER5bmFtaWMgaW1wb3J0IHRvIGhhbmRsZSBFU00gbW9kdWxlIGZyb20gQ29tbW9uSlMgY29udGV4dFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6IE5lZWQgdG8gdXNlIGV2YWwgaGVyZSB0byBhdm9pZCBUeXBlU2NyaXB0IGZyb20gdHJhbnNwaWxpbmcgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW50byBgcmVxdWlyZSgpYFxuICBjYWNoZWRCdWlsZGVyc01vZHVsZSA9IChhd2FpdCBldmFsKFxuICAgICdpbXBvcnQoXCJAd29ya2Zsb3cvYnVpbGRlcnNcIiknXG4gICkpIGFzIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpO1xuICByZXR1cm4gY2FjaGVkQnVpbGRlcnNNb2R1bGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnMoXG4gIHdvcmtpbmdEaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxEZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGg+IHtcbiAgY29uc3QgY2FjaGVkID0gZGVjb3JhdG9yT3B0aW9uc0NhY2hlLmdldCh3b3JraW5nRGlyKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCBwcm9taXNlID0gKGFzeW5jICgpOiBQcm9taXNlPERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aD4gPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGVjb3JhdG9yT3B0aW9uc0ZvckRpcmVjdG9yeVdpdGhDb25maWdQYXRoIH0gPVxuICAgICAgYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgICByZXR1cm4gZ2V0RGVjb3JhdG9yT3B0aW9uc0ZvckRpcmVjdG9yeVdpdGhDb25maWdQYXRoKHdvcmtpbmdEaXIpO1xuICB9KSgpO1xuXG4gIGRlY29yYXRvck9wdGlvbnNDYWNoZS5zZXQod29ya2luZ0RpciwgcHJvbWlzZSk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8V29ya2Zsb3dQYXR0ZXJuTWF0Y2g+IHtcbiAgY29uc3QgeyBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0dlbmVyYXRlZEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGlzR2VuZXJhdGVkV29ya2Zsb3dGaWxlIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUoZmlsZVBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1Nka0ZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGlzV29ya2Zsb3dTZGtGaWxlIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gaXNXb3JrZmxvd1Nka0ZpbGUoZmlsZVBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1Nob3VsZFRyYW5zZm9ybShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgcGF0dGVybnM6IFdvcmtmbG93UGF0dGVybk1hdGNoXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBzaG91bGRUcmFuc2Zvcm1GaWxlIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gc2hvdWxkVHJhbnNmb3JtRmlsZShmaWxlUGF0aCwgcGF0dGVybnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNb2R1bGVTcGVjaWZpZXIoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgcmVzb2x2ZU1vZHVsZVNwZWNpZmllciB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoZmlsZVBhdGgsIHByb2plY3RSb290KS5tb2R1bGVTcGVjaWZpZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3JrZmxvd0FsaWFzUGF0aChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IHJlc29sdmVXb3JrZmxvd0FsaWFzUmVsYXRpdmVQYXRoIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGgoZmlsZVBhdGgsIHdvcmtpbmdEaXIpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gd29ya2luZ0RpclxuICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVwYXRoID0gZmlsZW5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gIC8vIFdpbmRvd3MgZml4OiBVc2UgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uIHRvIHdvcmsgYXJvdW5kIGRyaXZlIGxldHRlciBjYXNpbmcgaXNzdWVzXG4gIGNvbnN0IGxvd2VyV2QgPSBub3JtYWxpemVkV29ya2luZ0Rpci50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsb3dlclBhdGggPSBub3JtYWxpemVkRmlsZXBhdGgudG9Mb3dlckNhc2UoKTtcblxuICBsZXQgcmVsYXRpdmVGaWxlbmFtZTogc3RyaW5nO1xuICBpZiAobG93ZXJQYXRoLnN0YXJ0c1dpdGgoYCR7bG93ZXJXZH0vYCkpIHtcbiAgICAvLyBGaWxlIGlzIHVuZGVyIHdvcmtpbmcgZGlyZWN0b3J5IC0gbWFudWFsbHkgY2FsY3VsYXRlIHJlbGF0aXZlIHBhdGhcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gbm9ybWFsaXplZEZpbGVwYXRoLnN1YnN0cmluZyhcbiAgICAgIG5vcm1hbGl6ZWRXb3JraW5nRGlyLmxlbmd0aCArIDFcbiAgICApO1xuICB9IGVsc2UgaWYgKGxvd2VyUGF0aCA9PT0gbG93ZXJXZCkge1xuICAgIC8vIEZpbGUgSVMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IChzaG91bGRuJ3QgaGFwcGVuKVxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSAnLic7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIHJlbGF0aXZlKCkgZm9yIGZpbGVzIG91dHNpZGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gcmVsYXRpdmUod29ya2luZ0RpciwgZmlsZW5hbWUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICAgIGlmIChyZWxhdGl2ZUZpbGVuYW1lLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICBjb25zdCBhbGlhc2VkUmVsYXRpdmVQYXRoID0gYXdhaXQgcmVzb2x2ZVdvcmtmbG93QWxpYXNQYXRoKFxuICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgd29ya2luZ0RpclxuICAgICAgKTtcbiAgICAgIGlmIChhbGlhc2VkUmVsYXRpdmVQYXRoKSB7XG4gICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBhbGlhc2VkUmVsYXRpdmVQYXRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IHJlbGF0aXZlRmlsZW5hbWVcbiAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaW5hbCBzYWZldHkgY2hlY2sgLSBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBhbiBhYnNvbHV0ZSBwYXRoIHRvIFNXQ1xuICBpZiAocmVsYXRpdmVGaWxlbmFtZS5pbmNsdWRlcygnOicpIHx8IHJlbGF0aXZlRmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgcmFyZWx5IGhhcHBlbiwgYnV0IHVzZSBmaWxlbmFtZSBzcGxpdCBhcyBsYXN0IHJlc29ydFxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBub3JtYWxpemVkRmlsZXBhdGguc3BsaXQoJy8nKS5wb3AoKSB8fCAndW5rbm93bi50cyc7XG4gIH1cblxuICByZXR1cm4gcmVsYXRpdmVGaWxlbmFtZTtcbn1cblxuZnVuY3Rpb24gc3RyaXBEZWZlcnJlZFN0ZXBTb3VyY2VNZXRhZGF0YUNvbW1lbnQoc291cmNlOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBtZXRhZGF0YVBhdHRlcm4gPSBuZXcgUmVnRXhwKFxuICAgIGBeXFxcXHMqLy9cXFxccyoke0RFRkVSUkVEX1NURVBfU09VUkNFX01FVEFEQVRBX1BSRUZJWH1bQS1aYS16MC05Ky89XStcXFxccypcXFxccj9cXFxcbj9gXG4gICk7XG4gIHJldHVybiBzb3VyY2UucmVwbGFjZShtZXRhZGF0YVBhdHRlcm4sICcnKTtcbn1cblxuLy8gVGhpcyBsb2FkZXIgYXBwbGllcyB0aGUgXCJ1c2Ugd29ya2Zsb3dcIi9cInVzZSBzdGVwXCIgdHJhbnNmb3JtLlxuLy8gRGVmZXJyZWQgc3RlcC1jb3B5IGZpbGVzIGFyZSB0cmFuc2Zvcm1lZCBpbiBzdGVwIG1vZGU7IGFsbCBvdGhlciBmaWxlcyB1c2UgY2xpZW50IG1vZGUuXG50eXBlIFdvcmtmbG93TG9hZGVyQ29udGV4dCA9IHtcbiAgcmVzb3VyY2VQYXRoOiBzdHJpbmc7XG4gIGFzeW5jPzogKCkgPT4gKFxuICAgIGVycm9yOiBFcnJvciB8IG51bGwsXG4gICAgY29udGVudD86IHN0cmluZyxcbiAgICBzb3VyY2VNYXA/OiBhbnlcbiAgKSA9PiB2b2lkO1xuICBhZGREZXBlbmRlbmN5PzogKGRlcGVuZGVuY3k6IHN0cmluZykgPT4gdm9pZDtcbiAgYWRkQnVpbGREZXBlbmRlbmN5PzogKGRlcGVuZGVuY3k6IHN0cmluZykgPT4gdm9pZDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHdvcmtmbG93TG9hZGVyKFxuICB0aGlzOiBXb3JrZmxvd0xvYWRlckNvbnRleHQsXG4gIHNvdXJjZTogc3RyaW5nIHwgQnVmZmVyLFxuICBzb3VyY2VNYXA6IGFueVxuKTogc3RyaW5nIHwgUHJvbWlzZTxzdHJpbmc+IHwgdm9pZCB7XG4gIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5hc3luYz8uKCk7XG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpOiBQcm9taXNlPHsgY29kZTogc3RyaW5nOyBtYXA6IGFueSB9PiA9PiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnJlc291cmNlUGF0aDtcbiAgICBjb25zdCBub3JtYWxpemVkU291cmNlID0gc291cmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgc3djUGx1Z2luUGF0aCA9IHJlZ2lzdGVyVHJhbnNmb3JtRGVwZW5kZW5jaWVzKHRoaXMpO1xuICAgIGNvbnN0IGlzRGVmZXJyZWRTdGVwQ29weUZpbGUgPSBpc0RlZmVycmVkU3RlcENvcHlGaWxlUGF0aChmaWxlbmFtZSk7XG4gICAgY29uc3QgZGVmZXJyZWRTdGVwU291cmNlTWV0YWRhdGEgPSBpc0RlZmVycmVkU3RlcENvcHlGaWxlXG4gICAgICA/IHBhcnNlRGVmZXJyZWRTdGVwU291cmNlTWV0YWRhdGEobm9ybWFsaXplZFNvdXJjZSlcbiAgICAgIDogbnVsbDtcbiAgICBjb25zdCBzb3VyY2VXaXRob3V0RGVmZXJyZWRNZXRhZGF0YSA9IGlzRGVmZXJyZWRTdGVwQ29weUZpbGVcbiAgICAgID8gc3RyaXBEZWZlcnJlZFN0ZXBTb3VyY2VNZXRhZGF0YUNvbW1lbnQobm9ybWFsaXplZFNvdXJjZSlcbiAgICAgIDogbm9ybWFsaXplZFNvdXJjZTtcbiAgICBjb25zdCBkZWZlcnJlZFNvdXJjZU1hcFJlc3VsdCA9IGlzRGVmZXJyZWRTdGVwQ29weUZpbGVcbiAgICAgID8gcGFyc2VJbmxpbmVTb3VyY2VNYXBDb21tZW50KHNvdXJjZVdpdGhvdXREZWZlcnJlZE1ldGFkYXRhKVxuICAgICAgOiB7XG4gICAgICAgICAgc291cmNlV2l0aG91dE1hcENvbW1lbnQ6IHNvdXJjZVdpdGhvdXREZWZlcnJlZE1ldGFkYXRhLFxuICAgICAgICAgIHNvdXJjZU1hcDogbnVsbCxcbiAgICAgICAgfTtcbiAgICBjb25zdCBzb3VyY2VGb3JUcmFuc2Zvcm0gPSBkZWZlcnJlZFNvdXJjZU1hcFJlc3VsdC5zb3VyY2VXaXRob3V0TWFwQ29tbWVudDtcbiAgICBjb25zdCBkaXNjb3ZlcnlGaWxlUGF0aCA9XG4gICAgICBkZWZlcnJlZFN0ZXBTb3VyY2VNZXRhZGF0YT8uYWJzb2x1dGVQYXRoIHx8IGZpbGVuYW1lO1xuXG4gICAgaWYgKGRlZmVycmVkU3RlcFNvdXJjZU1ldGFkYXRhPy5hYnNvbHV0ZVBhdGgpIHtcbiAgICAgIC8vIEVuc3VyZSBlZGl0cyB0byB0aGUgb3JpZ2luYWwgc291cmNlIGludmFsaWRhdGUgZGVmZXJyZWQgc3RlcCBjb3BpZXMuXG4gICAgICByZWdpc3RlckZpbGVEZXBlbmRlbmN5KHRoaXMsIGRlZmVycmVkU3RlcFNvdXJjZU1ldGFkYXRhLmFic29sdXRlUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gU2tpcCBnZW5lcmF0ZWQgd29ya2Zsb3cgcm91dGUgZmlsZXMgdG8gYXZvaWQgcmUtcHJvY2Vzc2luZyB0aGVtXG4gICAgaWYgKChhd2FpdCBjaGVja0dlbmVyYXRlZEZpbGUoZmlsZW5hbWUpKSAmJiAhaXNEZWZlcnJlZFN0ZXBDb3B5RmlsZSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogbm9ybWFsaXplZFNvdXJjZSwgbWFwOiBzb3VyY2VNYXAgfTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgd29ya2Zsb3cgcGF0dGVybnMgaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgZGV0ZWN0UGF0dGVybnMoc291cmNlRm9yVHJhbnNmb3JtKTtcbiAgICAvLyBBbHdheXMgbm90aWZ5IGRpc2NvdmVyeSB0cmFja2luZywgZXZlbiBmb3IgYGZhbHNlL2ZhbHNlYCwgc28gZmlsZXMgdGhhdFxuICAgIC8vIHByZXZpb3VzbHkgaGFkIHdvcmtmbG93L3N0ZXAgdXNhZ2UgYXJlIHJlbW92ZWQgZnJvbSB0aGUgdHJhY2tlZCBzZXRzLlxuICAgIC8vIERlZmVycmVkIHN0ZXAgY29weSBmaWxlcyBtdXN0IHJlcG9ydCB1c2luZyB0aGVpciBvcmlnaW5hbCBzb3VyY2UgcGF0aCBzb1xuICAgIC8vIGRlZmVycmVkIHJlYnVpbGRzIGNhbiByZWFjdCB0byBzb3VyY2UgZWRpdHMgb3V0c2lkZSBnZW5lcmF0ZWQgYXJ0aWZhY3RzLlxuICAgIGlmICghaXNEZWZlcnJlZFN0ZXBDb3B5RmlsZSB8fCBkZWZlcnJlZFN0ZXBTb3VyY2VNZXRhZGF0YT8uYWJzb2x1dGVQYXRoKSB7XG4gICAgICAvLyBGb3IgQHdvcmtmbG93IFNESyBwYWNrYWdlcywgZG8gbm90IHJlcG9ydCBzZXJkZS1vbmx5IG1hdGNoZXMgZm9yXG4gICAgICAvLyBkaXNjb3ZlcnksIG90aGVyd2lzZSBkZWZlcnJlZCBtb2RlIGNhbiBpbmNvcnJlY3RseSB0cmVhdCBTREsgaW50ZXJuYWxzXG4gICAgICAvLyBhcyBhcHAgc2VyZGUgZW50cnlwb2ludHMuXG4gICAgICBjb25zdCBpc1Nka0ZpbGUgPSBhd2FpdCBjaGVja1Nka0ZpbGUoZGlzY292ZXJ5RmlsZVBhdGgpO1xuICAgICAgYXdhaXQgbm90aWZ5U29ja2V0U2VydmVyKFxuICAgICAgICBkaXNjb3ZlcnlGaWxlUGF0aCxcbiAgICAgICAgcGF0dGVybnMuaGFzVXNlV29ya2Zsb3csXG4gICAgICAgIHBhdHRlcm5zLmhhc1VzZVN0ZXAsXG4gICAgICAgIHBhdHRlcm5zLmhhc1NlcmRlICYmICFpc1Nka0ZpbGVcbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKCFpc0RlZmVycmVkU3RlcENvcHlGaWxlKSB7XG4gICAgICAvLyBGb3IgQHdvcmtmbG93IFNESyBwYWNrYWdlcywgb25seSB0cmFuc2Zvcm0gZmlsZXMgd2l0aCBhY3R1YWwgZGlyZWN0aXZlcyxcbiAgICAgIC8vIG5vdCBmaWxlcyB0aGF0IGp1c3QgbWF0Y2ggc2VyZGUgcGF0dGVybnMgKHdoaWNoIGFyZSBpbnRlcm5hbCBTREsgaW1wbGVtZW50YXRpb24gZmlsZXMpXG4gICAgICBjb25zdCBpc1Nka0ZpbGUgPSBhd2FpdCBjaGVja1Nka0ZpbGUoZmlsZW5hbWUpO1xuICAgICAgaWYgKGlzU2RrRmlsZSAmJiAhcGF0dGVybnMuaGFzRGlyZWN0aXZlKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IG5vcm1hbGl6ZWRTb3VyY2UsIG1hcDogc291cmNlTWFwIH07XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGlmIGZpbGUgbmVlZHMgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gcGF0dGVybnMgYW5kIHBhdGhcbiAgICAgIGlmICghKGF3YWl0IGNoZWNrU2hvdWxkVHJhbnNmb3JtKGZpbGVuYW1lLCBwYXR0ZXJucykpKSB7XG4gICAgICAgIHJldHVybiB7IGNvZGU6IG5vcm1hbGl6ZWRTb3VyY2UsIG1hcDogc291cmNlTWFwIH07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgaXNUeXBlU2NyaXB0ID1cbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKCcudHMnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy50c3gnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy5tdHMnKSB8fFxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy5jdHMnKTtcblxuICAgIC8vIENhbGN1bGF0ZSByZWxhdGl2ZSBmaWxlbmFtZSBmb3IgU1dDIHBsdWdpblxuICAgIC8vIFRoZSBTV0MgcGx1Z2luIHVzZXMgZmlsZW5hbWUgdG8gZ2VuZXJhdGUgd29ya2Zsb3dJZCwgc28gaXQgbXVzdCBiZSByZWxhdGl2ZVxuICAgIGNvbnN0IHJlbGF0aXZlRmlsZW5hbWUgPVxuICAgICAgZGVmZXJyZWRTdGVwU291cmNlTWV0YWRhdGE/LnJlbGF0aXZlRmlsZW5hbWUgfHxcbiAgICAgIChhd2FpdCBnZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKGZpbGVuYW1lLCB3b3JraW5nRGlyKSk7XG5cbiAgICAvLyBHZXQgZGVjb3JhdG9yIG9wdGlvbnMgZnJvbSB0c2NvbmZpZyAoY2FjaGVkIHBlciB3b3JraW5nIGRpcmVjdG9yeSlcbiAgICBjb25zdCB7IG9wdGlvbnM6IGRlY29yYXRvck9wdGlvbnMsIGNvbmZpZ1BhdGggfSA9XG4gICAgICBhd2FpdCBnZXREZWNvcmF0b3JPcHRpb25zKHdvcmtpbmdEaXIpO1xuICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICByZWdpc3RlckZpbGVEZXBlbmRlbmN5KHRoaXMsIGNvbmZpZ1BhdGgpO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgbW9kdWxlIHNwZWNpZmllciBmb3IgcGFja2FnZXMgKG5vZGVfbW9kdWxlcyBvciB3b3Jrc3BhY2UgcGFja2FnZXMpXG4gICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gYXdhaXQgZ2V0TW9kdWxlU3BlY2lmaWVyKFxuICAgICAgZGVmZXJyZWRTdGVwU291cmNlTWV0YWRhdGE/LmFic29sdXRlUGF0aCB8fCBmaWxlbmFtZSxcbiAgICAgIHdvcmtpbmdEaXJcbiAgICApO1xuICAgIGNvbnN0IG1vZGUgPSBpc0RlZmVycmVkU3RlcENvcHlGaWxlID8gJ3N0ZXAnIDogJ2NsaWVudCc7XG5cbiAgICAvLyBUcmFuc2Zvcm0gd2l0aCBTV0NcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0cmFuc2Zvcm0oc291cmNlRm9yVHJhbnNmb3JtLCB7XG4gICAgICBmaWxlbmFtZTogcmVsYXRpdmVGaWxlbmFtZSxcbiAgICAgIGpzYzoge1xuICAgICAgICBwYXJzZXI6IHtcbiAgICAgICAgICAuLi4oaXNUeXBlU2NyaXB0XG4gICAgICAgICAgICA/IHtcbiAgICAgICAgICAgICAgICBzeW50YXg6ICd0eXBlc2NyaXB0JyxcbiAgICAgICAgICAgICAgICB0c3g6IGZpbGVuYW1lLmVuZHNXaXRoKCcudHN4JyksXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JzLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICBzeW50YXg6ICdlY21hc2NyaXB0JyxcbiAgICAgICAgICAgICAgICBqc3g6IGZpbGVuYW1lLmVuZHNXaXRoKCcuanN4JyksXG4gICAgICAgICAgICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JzLFxuICAgICAgICAgICAgICB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgdGFyZ2V0OiAnZXMyMDIyJyxcbiAgICAgICAgZXhwZXJpbWVudGFsOiB7XG4gICAgICAgICAgcGx1Z2luczogW1tzd2NQbHVnaW5QYXRoLCB7IG1vZGUsIG1vZHVsZVNwZWNpZmllciB9XV0sXG4gICAgICAgIH0sXG4gICAgICAgIHRyYW5zZm9ybToge1xuICAgICAgICAgIHJlYWN0OiB7XG4gICAgICAgICAgICBydW50aW1lOiAncHJlc2VydmUnLFxuICAgICAgICAgIH0sXG4gICAgICAgICAgbGVnYWN5RGVjb3JhdG9yOiBkZWNvcmF0b3JPcHRpb25zLmxlZ2FjeURlY29yYXRvcixcbiAgICAgICAgICBkZWNvcmF0b3JNZXRhZGF0YTogZGVjb3JhdG9yT3B0aW9ucy5kZWNvcmF0b3JNZXRhZGF0YSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBtaW5pZnk6IGZhbHNlLFxuICAgICAgaW5wdXRTb3VyY2VNYXA6IGlzRGVmZXJyZWRTdGVwQ29weUZpbGVcbiAgICAgICAgPyBkZWZlcnJlZFNvdXJjZU1hcFJlc3VsdC5zb3VyY2VNYXAgfHwgc291cmNlTWFwXG4gICAgICAgIDogc291cmNlTWFwLFxuICAgICAgc291cmNlTWFwczogdHJ1ZSxcbiAgICAgIGlubGluZVNvdXJjZXNDb250ZW50OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgbGV0IHRyYW5zZm9ybWVkTWFwID0gc291cmNlTWFwO1xuICAgIGlmICh0eXBlb2YgcmVzdWx0Lm1hcCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRyYW5zZm9ybWVkTWFwID0gSlNPTi5wYXJzZShyZXN1bHQubWFwKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0cmFuc2Zvcm1lZE1hcCA9IHJlc3VsdC5tYXA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChyZXN1bHQubWFwKSB7XG4gICAgICB0cmFuc2Zvcm1lZE1hcCA9IHJlc3VsdC5tYXA7XG4gICAgfVxuXG4gICAgcmV0dXJuIHsgY29kZTogcmVzdWx0LmNvZGUsIG1hcDogdHJhbnNmb3JtZWRNYXAgfTtcbiAgfTtcblxuICBpZiAoIWNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIHJ1bigpLnRoZW4oKHJlc3VsdCkgPT4gcmVzdWx0LmNvZGUpO1xuICB9XG5cbiAgdm9pZCBydW4oKVxuICAgIC50aGVuKChyZXN1bHQpID0+IGNhbGxiYWNrKG51bGwsIHJlc3VsdC5jb2RlLCByZXN1bHQubWFwKSlcbiAgICAuY2F0Y2goKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICBjYWxsYmFjayhlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IgOiBuZXcgRXJyb3IoU3RyaW5nKGVycm9yKSkpO1xuICAgIH0pO1xufVxuIl19
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQTBOQSxpQ0FxSEM7QUEvVUQscUNBQXFDO0FBQ3JDLHlDQUFvRDtBQUNwRCxvQ0FBc0M7QUFNdEMseUZBQXlGO0FBQ3pGLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLEVBR2xDLENBQUM7QUFDSix5R0FBeUc7QUFDekcsSUFBSSxvQkFBb0IsR0FBK0MsSUFBSSxDQUFDO0FBSzVFLElBQUksOEJBQThCLEdBQW9DLElBQUksQ0FBQztBQUUzRSxTQUFTLHNCQUFzQixDQUM3QixhQUFvQyxFQUNwQyxjQUFzQjtJQUV0QixhQUFhLENBQUMsYUFBYSxFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDOUMsYUFBYSxDQUFDLGtCQUFrQixFQUFFLENBQUMsY0FBYyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELFNBQVMsV0FBVyxDQUFDLEtBQWtCLEVBQUUsY0FBc0I7SUFDN0QsSUFBSSxJQUFBLG9CQUFVLEVBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQztRQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7QUFDSCxDQUFDO0FBRUQsU0FBUywrQkFBK0I7SUFDdEMsSUFBSSw4QkFBOEIsRUFBRSxDQUFDO1FBQ25DLE9BQU8sOEJBQThCLENBQUM7SUFDeEMsQ0FBQztJQUVELE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM5RCxNQUFNLHNCQUFzQixHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQzVDLHNDQUFzQyxDQUN2QyxDQUFDO0lBQ0YsTUFBTSxvQkFBb0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFFbkUsK0RBQStEO0lBQy9ELG9FQUFvRTtJQUNwRSxNQUFNLHdCQUF3QixHQUFHLElBQUEsZ0JB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LENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxHQUFHLEVBQUU7U0FDUCxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDekQsS0FBSyxDQUFDLENBQUMsS0FBYyxFQUFFLEVBQUU7UUFDeEIsUUFBUSxDQUFDLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBleGlzdHNTeW5jIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBkaXJuYW1lLCBqb2luLCByZWxhdGl2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm0gfSBmcm9tICdAc3djL2NvcmUnO1xuXG50eXBlIERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aCA9XG4gIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJykuRGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoO1xudHlwZSBXb3JrZmxvd1BhdHRlcm5NYXRjaCA9IGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJykuV29ya2Zsb3dQYXR0ZXJuTWF0Y2g7XG5cbi8vIENhY2hlIGRlY29yYXRvciBvcHRpb25zIHBlciB3b3JraW5nIGRpcmVjdG9yeSB0byBhdm9pZCByZWFkaW5nIHRzY29uZmlnIGZvciBldmVyeSBmaWxlXG5jb25zdCBkZWNvcmF0b3JPcHRpb25zQ2FjaGUgPSBuZXcgTWFwPFxuICBzdHJpbmcsXG4gIFByb21pc2U8RGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoPlxuPigpO1xuLy8gQ2FjaGUgZm9yIHNoYXJlZCB1dGlsaXRpZXMgZnJvbSBAd29ya2Zsb3cvYnVpbGRlcnMgKEVTTSBtb2R1bGUgbG9hZGVkIGR5bmFtaWNhbGx5IGluIENvbW1vbkpTIGNvbnRleHQpXG5sZXQgY2FjaGVkQnVpbGRlcnNNb2R1bGU6IHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpIHwgbnVsbCA9IG51bGw7XG50eXBlIExvYWRlclN0YXRpY0RlcGVuZGVuY2llcyA9IHtcbiAgc3djUGx1Z2luUGF0aDogc3RyaW5nO1xuICBmaWxlczogc3RyaW5nW107XG59O1xubGV0IGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llczogTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzIHwgbnVsbCA9IG51bGw7XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyRmlsZURlcGVuZGVuY3koXG4gIGxvYWRlckNvbnRleHQ6IFdvcmtmbG93TG9hZGVyQ29udGV4dCxcbiAgZGVwZW5kZW5jeVBhdGg6IHN0cmluZ1xuKTogdm9pZCB7XG4gIGxvYWRlckNvbnRleHQuYWRkRGVwZW5kZW5jeT8uKGRlcGVuZGVuY3lQYXRoKTtcbiAgbG9hZGVyQ29udGV4dC5hZGRCdWlsZERlcGVuZGVuY3k/LihkZXBlbmRlbmN5UGF0aCk7XG59XG5cbmZ1bmN0aW9uIGFkZElmRXhpc3RzKGZpbGVzOiBTZXQ8c3RyaW5nPiwgZGVwZW5kZW5jeVBhdGg6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoZXhpc3RzU3luYyhkZXBlbmRlbmN5UGF0aCkpIHtcbiAgICBmaWxlcy5hZGQoZGVwZW5kZW5jeVBhdGgpO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMoKTogTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzIHtcbiAgaWYgKGNhY2hlZExvYWRlclN0YXRpY0RlcGVuZGVuY2llcykge1xuICAgIHJldHVybiBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM7XG4gIH1cblxuICBjb25zdCBzd2NQbHVnaW5QYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvc3djLXBsdWdpbicpO1xuICBjb25zdCBzd2NQbHVnaW5CdWlsZEhhc2hQYXRoID0gcmVxdWlyZS5yZXNvbHZlKFxuICAgICdAd29ya2Zsb3cvc3djLXBsdWdpbi9idWlsZC1oYXNoLmpzb24nXG4gICk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYXRoID0gcmVxdWlyZS5yZXNvbHZlKCdAd29ya2Zsb3cvYnVpbGRlcnMnKTtcblxuICAvLyBEZXJpdmUgcGFja2FnZS5qc29uIHBhdGhzIGZyb20gcmVzb2x2ZWQgZW50cnlwb2ludHMgdG8gYXZvaWRcbiAgLy8gVHVyYm9wYWNrIGxvYWRlci1ldmFsIGZhaWx1cmVzIGFyb3VuZCAuLi9wYWNrYWdlLmpzb24gcmVzb2x1dGlvbi5cbiAgY29uc3Qgc3djUGx1Z2luUGFja2FnZUpzb25QYXRoID0gam9pbihkaXJuYW1lKHN3Y1BsdWdpblBhdGgpLCAncGFja2FnZS5qc29uJyk7XG4gIGNvbnN0IHdvcmtmbG93QnVpbGRlcnNQYWNrYWdlSnNvblBhdGggPSBqb2luKFxuICAgIGRpcm5hbWUod29ya2Zsb3dCdWlsZGVyc1BhdGgpLFxuICAgICcuLi9wYWNrYWdlLmpzb24nXG4gICk7XG5cbiAgY29uc3QgZmlsZXMgPSBuZXcgU2V0PHN0cmluZz4oW1xuICAgIF9fZmlsZW5hbWUsXG4gICAgc3djUGx1Z2luUGF0aCxcbiAgICBzd2NQbHVnaW5CdWlsZEhhc2hQYXRoLFxuICAgIHdvcmtmbG93QnVpbGRlcnNQYXRoLFxuICBdKTtcbiAgYWRkSWZFeGlzdHMoZmlsZXMsIHN3Y1BsdWdpblBhY2thZ2VKc29uUGF0aCk7XG4gIGFkZElmRXhpc3RzKGZpbGVzLCB3b3JrZmxvd0J1aWxkZXJzUGFja2FnZUpzb25QYXRoKTtcblxuICBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMgPSB7XG4gICAgc3djUGx1Z2luUGF0aCxcbiAgICBmaWxlczogQXJyYXkuZnJvbShmaWxlcyksXG4gIH07XG4gIHJldHVybiBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyVHJhbnNmb3JtRGVwZW5kZW5jaWVzKFxuICBsb2FkZXJDb250ZXh0OiBXb3JrZmxvd0xvYWRlckNvbnRleHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHN0YXRpY0RlcGVuZGVuY2llcyA9IHJlc29sdmVMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMoKTtcbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5UGF0aCBvZiBzdGF0aWNEZXBlbmRlbmNpZXMuZmlsZXMpIHtcbiAgICByZWdpc3RlckZpbGVEZXBlbmRlbmN5KGxvYWRlckNvbnRleHQsIGRlcGVuZGVuY3lQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBzdGF0aWNEZXBlbmRlbmNpZXMuc3djUGx1Z2luUGF0aDtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0QnVpbGRlcnNNb2R1bGUoKTogUHJvbWlzZTxcbiAgdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJylcbj4ge1xuICBpZiAoY2FjaGVkQnVpbGRlcnNNb2R1bGUpIHtcbiAgICByZXR1cm4gY2FjaGVkQnVpbGRlcnNNb2R1bGU7XG4gIH1cbiAgLy8gRHluYW1pYyBpbXBvcnQgdG8gaGFuZGxlIEVTTSBtb2R1bGUgZnJvbSBDb21tb25KUyBjb250ZXh0XG4gIC8vIGJpb21lLWlnbm9yZSBsaW50L3NlY3VyaXR5L25vR2xvYmFsRXZhbDogTmVlZCB0byB1c2UgZXZhbCBoZXJlIHRvIGF2b2lkIFR5cGVTY3JpcHQgZnJvbSB0cmFuc3BpbGluZyB0aGUgaW1wb3J0IHN0YXRlbWVudCBpbnRvIGByZXF1aXJlKClgXG4gIGNhY2hlZEJ1aWxkZXJzTW9kdWxlID0gKGF3YWl0IGV2YWwoXG4gICAgJ2ltcG9ydChcIkB3b3JrZmxvdy9idWlsZGVyc1wiKSdcbiAgKSkgYXMgdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJyk7XG4gIHJldHVybiBjYWNoZWRCdWlsZGVyc01vZHVsZTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gZ2V0RGVjb3JhdG9yT3B0aW9ucyhcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aD4ge1xuICBjb25zdCBjYWNoZWQgPSBkZWNvcmF0b3JPcHRpb25zQ2FjaGUuZ2V0KHdvcmtpbmdEaXIpO1xuICBpZiAoY2FjaGVkKSB7XG4gICAgcmV0dXJuIGNhY2hlZDtcbiAgfVxuXG4gIGNvbnN0IHByb21pc2UgPSAoYXN5bmMgKCk6IFByb21pc2U8RGVjb3JhdG9yT3B0aW9uc1dpdGhDb25maWdQYXRoPiA9PiB7XG4gICAgY29uc3QgeyBnZXREZWNvcmF0b3JPcHRpb25zRm9yRGlyZWN0b3J5V2l0aENvbmZpZ1BhdGggfSA9XG4gICAgICBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICAgIHJldHVybiBnZXREZWNvcmF0b3JPcHRpb25zRm9yRGlyZWN0b3J5V2l0aENvbmZpZ1BhdGgod29ya2luZ0Rpcik7XG4gIH0pKCk7XG5cbiAgZGVjb3JhdG9yT3B0aW9uc0NhY2hlLnNldCh3b3JraW5nRGlyLCBwcm9taXNlKTtcbiAgcmV0dXJuIHByb21pc2U7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGRldGVjdFBhdHRlcm5zKHNvdXJjZTogc3RyaW5nKTogUHJvbWlzZTxXb3JrZmxvd1BhdHRlcm5NYXRjaD4ge1xuICBjb25zdCB7IGRldGVjdFdvcmtmbG93UGF0dGVybnMgfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZSk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrR2VuZXJhdGVkRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUgfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiBpc0dlbmVyYXRlZFdvcmtmbG93RmlsZShmaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrU2RrRmlsZShmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gIGNvbnN0IHsgaXNXb3JrZmxvd1Nka0ZpbGUgfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiBpc1dvcmtmbG93U2RrRmlsZShmaWxlUGF0aCk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGNoZWNrU2hvdWxkVHJhbnNmb3JtKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICBwYXR0ZXJuczogV29ya2Zsb3dQYXR0ZXJuTWF0Y2hcbik6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IHNob3VsZFRyYW5zZm9ybUZpbGUgfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiBzaG91bGRUcmFuc2Zvcm1GaWxlKGZpbGVQYXRoLCBwYXR0ZXJucyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldE1vZHVsZVNwZWNpZmllcihcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgcHJvamVjdFJvb3Q6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcbiAgY29uc3QgeyByZXNvbHZlTW9kdWxlU3BlY2lmaWVyIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gcmVzb2x2ZU1vZHVsZVNwZWNpZmllcihmaWxlUGF0aCwgcHJvamVjdFJvb3QpLm1vZHVsZVNwZWNpZmllcjtcbn1cblxuYXN5bmMgZnVuY3Rpb24gcmVzb2x2ZVdvcmtmbG93QWxpYXNQYXRoKFxuICBmaWxlUGF0aDogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGggfSA9IGF3YWl0IGdldEJ1aWxkZXJzTW9kdWxlKCk7XG4gIHJldHVybiByZXNvbHZlV29ya2Zsb3dBbGlhc1JlbGF0aXZlUGF0aChmaWxlUGF0aCwgd29ya2luZ0Rpcik7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldFJlbGF0aXZlRmlsZW5hbWVGb3JTd2MoXG4gIGZpbGVuYW1lOiBzdHJpbmcsXG4gIHdvcmtpbmdEaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3Qgbm9ybWFsaXplZFdvcmtpbmdEaXIgPSB3b3JraW5nRGlyXG4gICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgIC5yZXBsYWNlKC9cXC8kLywgJycpO1xuICBjb25zdCBub3JtYWxpemVkRmlsZXBhdGggPSBmaWxlbmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgLy8gV2luZG93cyBmaXg6IFVzZSBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24gdG8gd29yayBhcm91bmQgZHJpdmUgbGV0dGVyIGNhc2luZyBpc3N1ZXNcbiAgY29uc3QgbG93ZXJXZCA9IG5vcm1hbGl6ZWRXb3JraW5nRGlyLnRvTG93ZXJDYXNlKCk7XG4gIGNvbnN0IGxvd2VyUGF0aCA9IG5vcm1hbGl6ZWRGaWxlcGF0aC50b0xvd2VyQ2FzZSgpO1xuXG4gIGxldCByZWxhdGl2ZUZpbGVuYW1lOiBzdHJpbmc7XG4gIGlmIChsb3dlclBhdGguc3RhcnRzV2l0aChgJHtsb3dlcldkfS9gKSkge1xuICAgIC8vIEZpbGUgaXMgdW5kZXIgd29ya2luZyBkaXJlY3RvcnkgLSBtYW51YWxseSBjYWxjdWxhdGUgcmVsYXRpdmUgcGF0aFxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBub3JtYWxpemVkRmlsZXBhdGguc3Vic3RyaW5nKFxuICAgICAgbm9ybWFsaXplZFdvcmtpbmdEaXIubGVuZ3RoICsgMVxuICAgICk7XG4gIH0gZWxzZSBpZiAobG93ZXJQYXRoID09PSBsb3dlcldkKSB7XG4gICAgLy8gRmlsZSBJUyB0aGUgd29ya2luZyBkaXJlY3RvcnkgKHNob3VsZG4ndCBoYXBwZW4pXG4gICAgcmVsYXRpdmVGaWxlbmFtZSA9ICcuJztcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgcmVsYXRpdmUoKSBmb3IgZmlsZXMgb3V0c2lkZSB3b3JraW5nIGRpcmVjdG9yeVxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSByZWxhdGl2ZSh3b3JraW5nRGlyLCBmaWxlbmFtZSkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgaWYgKHJlbGF0aXZlRmlsZW5hbWUuc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgIGNvbnN0IGFsaWFzZWRSZWxhdGl2ZVBhdGggPSBhd2FpdCByZXNvbHZlV29ya2Zsb3dBbGlhc1BhdGgoXG4gICAgICAgIGZpbGVuYW1lLFxuICAgICAgICB3b3JraW5nRGlyXG4gICAgICApO1xuICAgICAgaWYgKGFsaWFzZWRSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IGFsaWFzZWRSZWxhdGl2ZVBhdGg7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZWxhdGl2ZUZpbGVuYW1lID0gcmVsYXRpdmVGaWxlbmFtZVxuICAgICAgICAgIC5zcGxpdCgnLycpXG4gICAgICAgICAgLmZpbHRlcigocGFydCkgPT4gcGFydCAhPT0gJy4uJylcbiAgICAgICAgICAuam9pbignLycpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmFsIHNhZmV0eSBjaGVjayAtIGVuc3VyZSB3ZSBuZXZlciBwYXNzIGFuIGFic29sdXRlIHBhdGggdG8gU1dDXG4gIGlmIChyZWxhdGl2ZUZpbGVuYW1lLmluY2x1ZGVzKCc6JykgfHwgcmVsYXRpdmVGaWxlbmFtZS5zdGFydHNXaXRoKCcvJykpIHtcbiAgICAvLyBUaGlzIHNob3VsZCByYXJlbHkgaGFwcGVuLCBidXQgdXNlIGZpbGVuYW1lIHNwbGl0IGFzIGxhc3QgcmVzb3J0XG4gICAgcmVsYXRpdmVGaWxlbmFtZSA9IG5vcm1hbGl6ZWRGaWxlcGF0aC5zcGxpdCgnLycpLnBvcCgpIHx8ICd1bmtub3duLnRzJztcbiAgfVxuXG4gIHJldHVybiByZWxhdGl2ZUZpbGVuYW1lO1xufVxuXG4vLyBUaGlzIGxvYWRlciBhcHBsaWVzIHRoZSBcInVzZSB3b3JrZmxvd1wiL1widXNlIHN0ZXBcIiB0cmFuc2Zvcm0uXG4vLyBBbGwgbWF0Y2hpbmcgZmlsZXMgYXJlIHRyYW5zZm9ybWVkIGluIGNsaWVudCBtb2RlOyB0aGUgU1dDIHBsdWdpbiBkZWNpZGVzXG4vLyBwZXItZnVuY3Rpb24gd2hldGhlciB0byBlbWl0IHdvcmtmbG93IG9yIHN0ZXAgYmluZGluZ3MgYmFzZWQgb24gdGhlXG4vLyBzb3VyY2UncyBkaXJlY3RpdmVzLlxudHlwZSBXb3JrZmxvd0xvYWRlckNvbnRleHQgPSB7XG4gIHJlc291cmNlUGF0aDogc3RyaW5nO1xuICBhc3luYz86ICgpID0+IChcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsLFxuICAgIGNvbnRlbnQ/OiBzdHJpbmcsXG4gICAgc291cmNlTWFwPzogYW55XG4gICkgPT4gdm9pZDtcbiAgYWRkRGVwZW5kZW5jeT86IChkZXBlbmRlbmN5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGFkZEJ1aWxkRGVwZW5kZW5jeT86IChkZXBlbmRlbmN5OiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3b3JrZmxvd0xvYWRlcihcbiAgdGhpczogV29ya2Zsb3dMb2FkZXJDb250ZXh0LFxuICBzb3VyY2U6IHN0cmluZyB8IEJ1ZmZlcixcbiAgc291cmNlTWFwOiBhbnlcbik6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8IHZvaWQge1xuICBjb25zdCBjYWxsYmFjayA9IHRoaXMuYXN5bmM/LigpO1xuICBjb25zdCBydW4gPSBhc3luYyAoKTogUHJvbWlzZTx7IGNvZGU6IHN0cmluZzsgbWFwOiBhbnkgfT4gPT4ge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGhpcy5yZXNvdXJjZVBhdGg7XG4gICAgY29uc3Qgbm9ybWFsaXplZFNvdXJjZSA9IHNvdXJjZS50b1N0cmluZygpO1xuICAgIGNvbnN0IHdvcmtpbmdEaXIgPSBwcm9jZXNzLmN3ZCgpO1xuICAgIGNvbnN0IHN3Y1BsdWdpblBhdGggPSByZWdpc3RlclRyYW5zZm9ybURlcGVuZGVuY2llcyh0aGlzKTtcbiAgICBjb25zdCBzb3VyY2VGb3JUcmFuc2Zvcm0gPSBub3JtYWxpemVkU291cmNlO1xuXG4gICAgY29uc3QgaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUgPSBhd2FpdCBjaGVja0dlbmVyYXRlZEZpbGUoZmlsZW5hbWUpO1xuICAgIC8vIFNraXAgZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzIHRvIGF2b2lkIHJlLXByb2Nlc3NpbmcgdGhlbS5cbiAgICBpZiAoaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IG5vcm1hbGl6ZWRTb3VyY2UsIG1hcDogc291cmNlTWFwIH07XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHdvcmtmbG93IHBhdHRlcm5zIGluIHRoZSBzb3VyY2UgY29kZS5cbiAgICBjb25zdCBwYXR0ZXJucyA9IGF3YWl0IGRldGVjdFBhdHRlcm5zKHNvdXJjZUZvclRyYW5zZm9ybSk7XG5cbiAgICAvLyBGb3IgQHdvcmtmbG93IFNESyBwYWNrYWdlcywgb25seSB0cmFuc2Zvcm0gZmlsZXMgd2l0aCBhY3R1YWwgZGlyZWN0aXZlcyxcbiAgICAvLyBub3QgZmlsZXMgdGhhdCBqdXN0IG1hdGNoIHNlcmRlIHBhdHRlcm5zICh3aGljaCBhcmUgaW50ZXJuYWwgU0RLIGltcGxlbWVudGF0aW9uIGZpbGVzKVxuICAgIGNvbnN0IGlzU2RrRmlsZSA9IGF3YWl0IGNoZWNrU2RrRmlsZShmaWxlbmFtZSk7XG4gICAgaWYgKGlzU2RrRmlsZSAmJiAhcGF0dGVybnMuaGFzRGlyZWN0aXZlKSB7XG4gICAgICByZXR1cm4geyBjb2RlOiBub3JtYWxpemVkU291cmNlLCBtYXA6IHNvdXJjZU1hcCB9O1xuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIGZpbGUgbmVlZHMgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gcGF0dGVybnMgYW5kIHBhdGhcbiAgICBpZiAoIShhd2FpdCBjaGVja1Nob3VsZFRyYW5zZm9ybShmaWxlbmFtZSwgcGF0dGVybnMpKSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogbm9ybWFsaXplZFNvdXJjZSwgbWFwOiBzb3VyY2VNYXAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1R5cGVTY3JpcHQgPVxuICAgICAgZmlsZW5hbWUuZW5kc1dpdGgoJy50cycpIHx8XG4gICAgICBmaWxlbmFtZS5lbmRzV2l0aCgnLnRzeCcpIHx8XG4gICAgICBmaWxlbmFtZS5lbmRzV2l0aCgnLm10cycpIHx8XG4gICAgICBmaWxlbmFtZS5lbmRzV2l0aCgnLmN0cycpO1xuXG4gICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIGZpbGVuYW1lIGZvciBTV0MgcGx1Z2luXG4gICAgLy8gVGhlIFNXQyBwbHVnaW4gdXNlcyBmaWxlbmFtZSB0byBnZW5lcmF0ZSB3b3JrZmxvd0lkLCBzbyBpdCBtdXN0IGJlIHJlbGF0aXZlXG4gICAgY29uc3QgcmVsYXRpdmVGaWxlbmFtZSA9IGF3YWl0IGdldFJlbGF0aXZlRmlsZW5hbWVGb3JTd2MoXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIHdvcmtpbmdEaXJcbiAgICApO1xuXG4gICAgLy8gR2V0IGRlY29yYXRvciBvcHRpb25zIGZyb20gdHNjb25maWcgKGNhY2hlZCBwZXIgd29ya2luZyBkaXJlY3RvcnkpXG4gICAgY29uc3QgeyBvcHRpb25zOiBkZWNvcmF0b3JPcHRpb25zLCBjb25maWdQYXRoIH0gPVxuICAgICAgYXdhaXQgZ2V0RGVjb3JhdG9yT3B0aW9ucyh3b3JraW5nRGlyKTtcbiAgICBpZiAoY29uZmlnUGF0aCkge1xuICAgICAgcmVnaXN0ZXJGaWxlRGVwZW5kZW5jeSh0aGlzLCBjb25maWdQYXRoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNvbHZlIG1vZHVsZSBzcGVjaWZpZXIgZm9yIHBhY2thZ2VzIChub2RlX21vZHVsZXMgb3Igd29ya3NwYWNlIHBhY2thZ2VzKVxuICAgIGNvbnN0IG1vZHVsZVNwZWNpZmllciA9IGF3YWl0IGdldE1vZHVsZVNwZWNpZmllcihmaWxlbmFtZSwgd29ya2luZ0Rpcik7XG4gICAgY29uc3QgbW9kZSA9ICdjbGllbnQnO1xuXG4gICAgLy8gVHJhbnNmb3JtIHdpdGggU1dDXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtKHNvdXJjZUZvclRyYW5zZm9ybSwge1xuICAgICAgZmlsZW5hbWU6IHJlbGF0aXZlRmlsZW5hbWUsXG4gICAgICBqc2M6IHtcbiAgICAgICAgcGFyc2VyOiB7XG4gICAgICAgICAgLi4uKGlzVHlwZVNjcmlwdFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc3ludGF4OiAndHlwZXNjcmlwdCcsXG4gICAgICAgICAgICAgICAgdHN4OiBmaWxlbmFtZS5lbmRzV2l0aCgnLnRzeCcpLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcnM6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9ycyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgc3ludGF4OiAnZWNtYXNjcmlwdCcsXG4gICAgICAgICAgICAgICAganN4OiBmaWxlbmFtZS5lbmRzV2l0aCgnLmpzeCcpLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcnM6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9ycyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICAgIGNhY2hlUm9vdDogam9pbih3b3JraW5nRGlyLCAnLnN3YycpLFxuICAgICAgICAgIHBsdWdpbnM6IFtbc3djUGx1Z2luUGF0aCwgeyBtb2RlLCBtb2R1bGVTcGVjaWZpZXIgfV1dLFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICByZWFjdDoge1xuICAgICAgICAgICAgcnVudGltZTogJ3ByZXNlcnZlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxlZ2FjeURlY29yYXRvcjogZGVjb3JhdG9yT3B0aW9ucy5sZWdhY3lEZWNvcmF0b3IsXG4gICAgICAgICAgZGVjb3JhdG9yTWV0YWRhdGE6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9yTWV0YWRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIGlucHV0U291cmNlTWFwOiBzb3VyY2VNYXAsXG4gICAgICBzb3VyY2VNYXBzOiB0cnVlLFxuICAgICAgaW5saW5lU291cmNlc0NvbnRlbnQ6IHRydWUsXG4gICAgfSk7XG5cbiAgICBsZXQgdHJhbnNmb3JtZWRNYXAgPSBzb3VyY2VNYXA7XG4gICAgaWYgKHR5cGVvZiByZXN1bHQubWFwID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdHJhbnNmb3JtZWRNYXAgPSBKU09OLnBhcnNlKHJlc3VsdC5tYXApO1xuICAgICAgfSBjYXRjaCB7XG4gICAgICAgIHRyYW5zZm9ybWVkTWFwID0gcmVzdWx0Lm1hcDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3VsdC5tYXApIHtcbiAgICAgIHRyYW5zZm9ybWVkTWFwID0gcmVzdWx0Lm1hcDtcbiAgICB9XG5cbiAgICByZXR1cm4geyBjb2RlOiByZXN1bHQuY29kZSwgbWFwOiB0cmFuc2Zvcm1lZE1hcCB9O1xuICB9O1xuXG4gIGlmICghY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcnVuKCkudGhlbigocmVzdWx0KSA9PiByZXN1bHQuY29kZSk7XG4gIH1cblxuICB2b2lkIHJ1bigpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0LmNvZGUsIHJlc3VsdC5tYXApKVxuICAgIC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNhbGxiYWNrKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgfSk7XG59XG4iXX0=
package/dist/runtime.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from '@workflow/core/dist/runtime';
1
+ export * from '@workflow/core/runtime';
2
2
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,cAAc,wBAAwB,CAAC"}
package/dist/runtime.js CHANGED
@@ -17,5 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // re-export runtime as stub for resolving to not
18
18
  // require @workflow/core be a dependency as well as
19
19
  // @workflow/next
20
- __exportStar(require("@workflow/core/dist/runtime"), exports);
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBaUQ7QUFDakQsb0RBQW9EO0FBQ3BELGlCQUFpQjtBQUNqQiw4REFBNEMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZS1leHBvcnQgcnVudGltZSBhcyBzdHViIGZvciByZXNvbHZpbmcgdG8gbm90XG4vLyByZXF1aXJlIEB3b3JrZmxvdy9jb3JlIGJlIGEgZGVwZW5kZW5jeSBhcyB3ZWxsIGFzXG4vLyBAd29ya2Zsb3cvbmV4dFxuZXhwb3J0ICogZnJvbSAnQHdvcmtmbG93L2NvcmUvZGlzdC9ydW50aW1lJztcbiJdfQ==
20
+ __exportStar(require("@workflow/core/runtime"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBaUQ7QUFDakQsb0RBQW9EO0FBQ3BELGlCQUFpQjtBQUNqQix5REFBdUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZS1leHBvcnQgcnVudGltZSBhcyBzdHViIGZvciByZXNvbHZpbmcgdG8gbm90XG4vLyByZXF1aXJlIEB3b3JrZmxvdy9jb3JlIGJlIGEgZGVwZW5kZW5jeSBhcyB3ZWxsIGFzXG4vLyBAd29ya2Zsb3cvbmV4dFxuZXhwb3J0ICogZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SWC does not atomically write its Wasmer cache. Compile the plugin before
3
+ * Next.js starts parallel loader workers.
4
+ * @see https://github.com/swc-project/swc/issues/10065
5
+ */
6
+ export declare function prewarmWorkflowSwcPluginCache(projectRoot: string): void;
7
+ //# sourceMappingURL=swc-plugin-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swc-plugin-cache.d.ts","sourceRoot":"","sources":["../src/swc-plugin-cache.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAWvE"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prewarmWorkflowSwcPluginCache = prewarmWorkflowSwcPluginCache;
4
+ const node_path_1 = require("node:path");
5
+ const core_1 = require("@swc/core");
6
+ /**
7
+ * SWC does not atomically write its Wasmer cache. Compile the plugin before
8
+ * Next.js starts parallel loader workers.
9
+ * @see https://github.com/swc-project/swc/issues/10065
10
+ */
11
+ function prewarmWorkflowSwcPluginCache(projectRoot) {
12
+ (0, core_1.transformSync)(`async function step() { 'use step'; }`, {
13
+ filename: '__workflow_swc_cache_warmup__.js',
14
+ swcrc: false,
15
+ jsc: {
16
+ experimental: {
17
+ cacheRoot: (0, node_path_1.join)(projectRoot, '.swc'),
18
+ plugins: [[require.resolve('@workflow/swc-plugin'), { mode: 'step' }]],
19
+ },
20
+ },
21
+ });
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLXBsdWdpbi1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zd2MtcGx1Z2luLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsc0VBV0M7QUFuQkQseUNBQWlDO0FBQ2pDLG9DQUEwQztBQUUxQzs7OztHQUlHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQUMsV0FBbUI7SUFDL0QsSUFBQSxvQkFBYSxFQUFDLHVDQUF1QyxFQUFFO1FBQ3JELFFBQVEsRUFBRSxrQ0FBa0M7UUFDNUMsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLEVBQUU7WUFDSCxZQUFZLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLElBQUEsZ0JBQUksRUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZFO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1TeW5jIH0gZnJvbSAnQHN3Yy9jb3JlJztcblxuLyoqXG4gKiBTV0MgZG9lcyBub3QgYXRvbWljYWxseSB3cml0ZSBpdHMgV2FzbWVyIGNhY2hlLiBDb21waWxlIHRoZSBwbHVnaW4gYmVmb3JlXG4gKiBOZXh0LmpzIHN0YXJ0cyBwYXJhbGxlbCBsb2FkZXIgd29ya2Vycy5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N3Yy1wcm9qZWN0L3N3Yy9pc3N1ZXMvMTAwNjVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXdhcm1Xb3JrZmxvd1N3Y1BsdWdpbkNhY2hlKHByb2plY3RSb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJhbnNmb3JtU3luYyhgYXN5bmMgZnVuY3Rpb24gc3RlcCgpIHsgJ3VzZSBzdGVwJzsgfWAsIHtcbiAgICBmaWxlbmFtZTogJ19fd29ya2Zsb3dfc3djX2NhY2hlX3dhcm11cF9fLmpzJyxcbiAgICBzd2NyYzogZmFsc2UsXG4gICAganNjOiB7XG4gICAgICBleHBlcmltZW50YWw6IHtcbiAgICAgICAgY2FjaGVSb290OiBqb2luKHByb2plY3RSb290LCAnLnN3YycpLFxuICAgICAgICBwbHVnaW5zOiBbW3JlcXVpcmUucmVzb2x2ZSgnQHdvcmtmbG93L3N3Yy1wbHVnaW4nKSwgeyBtb2RlOiAnc3RlcCcgfV1dLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -31,11 +31,35 @@ export default withWorkflow(nextConfig, workflowConfig); // [!code highlight]
31
31
  If a package in `serverExternalPackages` contains workflow code (`"use step"`,
32
32
  `"use workflow"`, or serialization classes), `withWorkflow()` automatically
33
33
  removes it from `serverExternalPackages` for the current build and prints a
34
- warning. This ensures the package still gets transformed by the Workflow
35
- compiler. Remove that package from `serverExternalPackages` in your
34
+ warning. Workflow still compiles the package so its directives are transformed.
35
+ Remove that package from `serverExternalPackages` in your
36
36
  `next.config` to silence the warning.
37
37
  </Callout>
38
38
 
39
+ ### Workflow Discovery in Next.js
40
+
41
+ `withWorkflow()` discovers workflows by scanning your Next.js entrypoints — App
42
+ Router `route`, `page`, and `layout` files (under `app/` or `src/app/`) and any
43
+ file under `pages/` or `src/pages/` — for `start()` calls imported from
44
+ `workflow/api`. The workflow and step files themselves can live anywhere (for
45
+ example `src/workflows/`); they are discovered transitively through imports, as
46
+ long as a `start()` call in an entrypoint statically reaches them.
47
+
48
+ <Callout type="info">
49
+ Call `start()` from server-side entrypoints, including Route Handlers and Server
50
+ Actions. Don't call workflow functions directly — that bypasses the workflow
51
+ runtime.
52
+ </Callout>
53
+
54
+ ### Next.js Server Actions and `"use server"`
55
+
56
+ Don't put a top-level `"use server"` directive in modules imported by workflow
57
+ or step functions. Workflow transformation wraps imported modules in synchronous
58
+ initializers, and Next.js rejects a `"use server"` directive inside that wrapper
59
+ with errors like `Server Actions must be async functions`. Keep `"use server"`
60
+ on the files that define your Server Actions, and move shared logic into
61
+ separate modules that don't carry the directive.
62
+
39
63
  ### Monorepos and Workspace Imports
40
64
 
41
65
  By default, Next.js detects the correct workspace root automatically. If your Next.js app lives in a subdirectory such as `apps/web` and workspace resolution is not working correctly, you can set `outputFileTracingRoot` as a workaround:
@@ -68,7 +92,6 @@ const nextConfig: NextConfig = {};
68
92
 
69
93
  export default withWorkflow(nextConfig, {
70
94
  workflows: {
71
- lazyDiscovery: true,
72
95
  local: {
73
96
  port: 4000,
74
97
  },
@@ -78,7 +101,6 @@ export default withWorkflow(nextConfig, {
78
101
 
79
102
  | Option | Type | Default | Description |
80
103
  | --- | --- | --- | --- |
81
- | `workflows.lazyDiscovery` | `boolean` | `false` | When `true`, defers workflow discovery until files are requested instead of scanning eagerly at startup. Useful for large projects where startup time matters. |
82
104
  | `workflows.local.port` | `number` | — | Overrides the `PORT` environment variable for local development. Has no effect when deployed to Vercel. |
83
105
 
84
106
  <Callout type="info">