@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/builder-eager.d.ts.map +1 -1
- package/dist/builder-eager.js +58 -62
- package/dist/builder.d.ts +1 -4
- package/dist/builder.d.ts.map +1 -1
- package/dist/builder.js +2 -28
- package/dist/index.d.ts +0 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +118 -62
- package/dist/loader.d.ts.map +1 -1
- package/dist/loader.js +18 -252
- package/dist/runtime.d.ts +1 -1
- package/dist/runtime.d.ts.map +1 -1
- package/dist/runtime.js +2 -2
- package/dist/swc-plugin-cache.d.ts +7 -0
- package/dist/swc-plugin-cache.d.ts.map +1 -0
- package/dist/swc-plugin-cache.js +23 -0
- package/docs/api-reference/with-workflow.mdx +26 -4
- package/package.json +6 -4
- package/dist/builder-deferred.d.ts +0 -2
- package/dist/builder-deferred.d.ts.map +0 -1
- package/dist/builder-deferred.js +0 -1417
- package/dist/socket-server.d.ts +0 -68
- package/dist/socket-server.d.ts.map +0 -1
- package/dist/socket-server.js +0 -181
- 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/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
|
|
348
|
-
const
|
|
349
|
-
|
|
350
|
-
|
|
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
|
-
//
|
|
373
|
-
//
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
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
|
|
384
|
-
|
|
385
|
-
|
|
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 =
|
|
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(
|
|
410
|
-
const mode =
|
|
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:
|
|
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/
|
|
1
|
+
export * from '@workflow/core/runtime';
|
|
2
2
|
//# sourceMappingURL=runtime.d.ts.map
|
package/dist/runtime.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,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/
|
|
21
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
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.
|
|
35
|
-
|
|
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">
|