@workflow/next 5.0.0-beta.42 → 5.0.0-beta.44
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 +68 -32
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +82 -8
- package/dist/watch-ignore.js +3 -3
- package/dist/watch-rebuild.d.ts +47 -0
- package/dist/watch-rebuild.d.ts.map +1 -1
- package/dist/watch-rebuild.js +80 -3
- package/docs/api-reference/with-workflow.mdx +16 -16
- package/docs/next.mdx +11 -11
- package/package.json +3 -3
package/dist/watch-rebuild.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.classifyRebuild = exports.replaceSourceSnapshots = exports.getRelevantFiles = exports.createSourceSnapshot = exports.createSourceSnapshotFromSource = exports.extractDefinitionSignature = exports.extractImportSignature = exports.stripCommentsFromSource = void 0;
|
|
3
|
+
exports.classifyRebuild = exports.pinBaselinesAcrossFullRebuild = exports.replaceSourceSnapshots = exports.getRelevantFiles = exports.createSourceSnapshot = exports.createSourceSnapshotFromSource = exports.extractDefinitionSignature = exports.extractImportSignature = exports.stripCommentsFromSource = void 0;
|
|
4
4
|
const promises_1 = require("node:fs/promises");
|
|
5
5
|
const importSpecifierPatterns = [
|
|
6
6
|
/\bfrom\s+['"]([^'"]+)['"]/g,
|
|
@@ -192,11 +192,88 @@ const replaceSourceSnapshots = async ({ discoveredEntries, inputFiles, normalize
|
|
|
192
192
|
sourceSnapshots.set(file, await readSnapshot(file));
|
|
193
193
|
}
|
|
194
194
|
catch {
|
|
195
|
-
|
|
195
|
+
// Unreadable (e.g. just deleted) files stay absent from the
|
|
196
|
+
// freshly cleared map.
|
|
196
197
|
}
|
|
197
198
|
}));
|
|
198
199
|
};
|
|
199
200
|
exports.replaceSourceSnapshots = replaceSourceSnapshots;
|
|
201
|
+
/**
|
|
202
|
+
* Read snapshots for every currently relevant file without mutating the
|
|
203
|
+
* shared baseline map. Used by `pinBaselinesAcrossFullRebuild` to capture
|
|
204
|
+
* content at rebuild start, so the baseline can later be pinned to what the
|
|
205
|
+
* rebuild actually consumed.
|
|
206
|
+
*/
|
|
207
|
+
const captureSourceSnapshots = async ({ discoveredEntries, inputFiles, normalizePath = defaultNormalizePath, readSnapshot, }) => {
|
|
208
|
+
const snapshots = new Map();
|
|
209
|
+
await Promise.all([
|
|
210
|
+
...(0, exports.getRelevantFiles)({
|
|
211
|
+
discoveredEntries,
|
|
212
|
+
inputFiles,
|
|
213
|
+
normalizePath,
|
|
214
|
+
}),
|
|
215
|
+
].map(async (file) => {
|
|
216
|
+
try {
|
|
217
|
+
snapshots.set(file, await readSnapshot(file));
|
|
218
|
+
}
|
|
219
|
+
catch { }
|
|
220
|
+
}));
|
|
221
|
+
return snapshots;
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Run a full rebuild while keeping the classifier baseline anchored to the
|
|
225
|
+
* content the rebuild consumed.
|
|
226
|
+
*
|
|
227
|
+
* A full rebuild reads sources twice: once when the bundler consumes them and
|
|
228
|
+
* once when the baseline is refreshed from disk afterwards (the `rebuild`
|
|
229
|
+
* callback owns both, in that order). An edit that lands between those reads
|
|
230
|
+
* would be absorbed into the baseline without ever being built, and its
|
|
231
|
+
* queued watcher event would then classify as a no-op, silently dropping
|
|
232
|
+
* the change until the next unrelated rebuild.
|
|
233
|
+
*
|
|
234
|
+
* To prevent that, the relevant files are re-read from disk immediately
|
|
235
|
+
* before the rebuild starts, and files present both before and after get
|
|
236
|
+
* that captured value restored. A mid-(multi-second-)rebuild edit then still
|
|
237
|
+
* diffs against what the rebuild consumed, while a duplicate watcher event
|
|
238
|
+
* for content the rebuild already consumed (watchers routinely emit several
|
|
239
|
+
* events per edit, the triggering edit included) diffs equal and stays a
|
|
240
|
+
* no-op instead of cascading into back-to-back full rebuilds.
|
|
241
|
+
*
|
|
242
|
+
* The capture costs one serial read of the relevant set (~150-250ms at ~250
|
|
243
|
+
* files) per full rediscovery. A zero-read formulation (cloning the live
|
|
244
|
+
* baseline map and pinning the triggering batch to the snapshots
|
|
245
|
+
* `classifyRebuild` read) was tried and reverted: writes landing in the
|
|
246
|
+
* capture window (test-teardown restores, multi-flush setup bursts) are
|
|
247
|
+
* content the imminent build consumes anyway, and the clone un-absorbs them
|
|
248
|
+
* into follow-up full rebuilds; with real-world multi-second rebuilds that
|
|
249
|
+
* bursts into rebuild chains. The disk capture intentionally coalesces such
|
|
250
|
+
* writes into the in-flight rebuild.
|
|
251
|
+
*
|
|
252
|
+
* Files the rebuild discovered for the first time have no captured content
|
|
253
|
+
* and keep their post-build baseline. That is already sound for the two
|
|
254
|
+
* cases that matter: a new file the build missed has no baseline at all, so
|
|
255
|
+
* its queued add event forces the follow-up rebuild, and a new file the
|
|
256
|
+
* build did consume gets a baseline matching what it consumed. What stays
|
|
257
|
+
* narrowed rather than closed is a file created and then edited again within
|
|
258
|
+
* one rebuild window; eviction-style conservatism was tried against that
|
|
259
|
+
* and rejected too: it turned every added file's routine duplicate watcher
|
|
260
|
+
* events into redundant full rebuilds.
|
|
261
|
+
*/
|
|
262
|
+
const pinBaselinesAcrossFullRebuild = async ({ discoveredEntries, inputFiles, normalizePath = defaultNormalizePath, readSnapshot, rebuild, sourceSnapshots, }) => {
|
|
263
|
+
const preBuildSnapshots = await captureSourceSnapshots({
|
|
264
|
+
discoveredEntries,
|
|
265
|
+
inputFiles,
|
|
266
|
+
normalizePath,
|
|
267
|
+
readSnapshot,
|
|
268
|
+
});
|
|
269
|
+
await rebuild();
|
|
270
|
+
for (const [file, snapshot] of preBuildSnapshots) {
|
|
271
|
+
if (sourceSnapshots.has(file)) {
|
|
272
|
+
sourceSnapshots.set(file, snapshot);
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
exports.pinBaselinesAcrossFullRebuild = pinBaselinesAcrossFullRebuild;
|
|
200
277
|
const didSourceSnapshotChange = (previousSnapshot, nextSnapshot) => previousSnapshot.importSignature !== nextSnapshot.importSignature ||
|
|
201
278
|
previousSnapshot.definitionSignature !== nextSnapshot.definitionSignature ||
|
|
202
279
|
previousSnapshot.hasDirective !== nextSnapshot.hasDirective ||
|
|
@@ -396,4 +473,4 @@ const classifyRebuild = async ({ discoveredEntries, fileChanges, inputFiles, nor
|
|
|
396
473
|
}
|
|
397
474
|
};
|
|
398
475
|
exports.classifyRebuild = classifyRebuild;
|
|
399
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtcmVidWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YXRjaC1yZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0QztBQW9DNUMsTUFBTSx1QkFBdUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsMENBQTBDO0lBQzFDLHdDQUF3QztJQUN4Qyx5Q0FBeUM7Q0FDMUMsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsb0dBQW9HO0lBQ3BHLHlJQUF5STtDQUMxSSxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FDckIsa01BQWtNLENBQUM7QUFFck0sTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztDQUNKLENBQUMsQ0FBQztBQUNILE1BQU0scUJBQXFCLEdBQ3pCLHVFQUF1RSxDQUFDO0FBRTFFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFH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aUJBQWlCO1lBQ2pCLGFBQWE7WUFDYixjQUFjO1NBQ2YsQ0FBQztZQUNBLENBQUMsQ0FBQztnQkFDRSxJQUFJLEVBQUUsS0FBSztnQkFDWCx3QkFBd0IsRUFBRSw0QkFBNEIsQ0FBQztvQkFDckQsWUFBWSxFQUFFLG9CQUFvQjtvQkFDbEMsaUJBQWlCO29CQUNqQixhQUFhO2lCQUNkLENBQUM7Z0JBQ0YsU0FBUzthQUNWO1lBQ0gsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztJQUMxQixDQUFDO0FBQ0gsQ0FBQyxDQUFDO0FBM0ZXLFFBQUEsZUFBZSxtQkEyRjFCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBEaXNjb3ZlcmVkRW50cmllc0xpa2Uge1xuICBkaXNjb3ZlcmVkU3RlcHM6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkV29ya2Zsb3dzOiBTZXQ8c3RyaW5nPjtcbiAgZGlzY292ZXJlZFNlcmRlRmlsZXM6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkRmlsZXM/OiBTZXQ8c3RyaW5nPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBGaWxlQ2hhbmdlcyB7XG4gIGFkZGVkRmlsZXM6IHN0cmluZ1tdO1xuICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTb3VyY2VTbmFwc2hvdCB7XG4gIGltcG9ydFNpZ25hdHVyZTogc3RyaW5nO1xuICBkZWZpbml0aW9uU2lnbmF0dXJlOiBzdHJpbmc7XG4gIGhhc0RpcmVjdGl2ZTogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59XG5cbmV4cG9ydCB0eXBlIFJlYnVpbGREZWNpc2lvbiA9XG4gIHwgeyBraW5kOiAnbm9uZSc7IHNuYXBzaG90cz86IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PiB9XG4gIHwge1xuICAgICAga2luZDogJ2hvdCc7XG4gICAgICByZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnM6IGJvb2xlYW47XG4gICAgICBzbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PjtcbiAgICB9XG4gIHwgeyBraW5kOiAnZnVsbCcgfTtcblxuZXhwb3J0IHR5cGUgU291cmNlUGF0dGVybkRldGVjdG9yID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGhhc0RpcmVjdGl2ZTogYm9vbGVhbjtcbiAgaGFzU2VyZGU6IGJvb2xlYW47XG59O1xuXG5jb25zdCBpbXBvcnRTcGVjaWZpZXJQYXR0ZXJucyA9IFtcbiAgL1xcYmZyb21cXHMrWydcIl0oW14nXCJdKylbJ1wiXS9nLFxuICAvKD86XnxbO1xcbl0pXFxzKmltcG9ydFxccytbJ1wiXShbXidcIl0rKVsnXCJdL2csXG4gIC9cXGJpbXBvcnRcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXSspWydcIl1cXHMqXFwpL2csXG4gIC9cXGJyZXF1aXJlXFxzKlxcKFxccypbJ1wiXShbXidcIl0rKVsnXCJdXFxzKlxcKS9nLFxuXTtcbmNvbnN0IGRpcmVjdGl2ZUZ1bmN0aW9uUGF0dGVybnMgPSBbXG4gIC9cXGIoPzpleHBvcnRcXHMrKT8oPzphc3luY1xccyspP2Z1bmN0aW9uXFxzKyhbQS1aYS16XyRdW1xcdyRdKilbXntdKlxce1xccypbJ1wiXXVzZVxccysod29ya2Zsb3d8c3RlcClbJ1wiXS9nLFxuICAvXFxiKD86ZXhwb3J0XFxzKyk/Y29uc3RcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVxccyo9XFxzKig/OmFzeW5jXFxzKik/KD86XFwoW14pXSpcXCl8W0EtWmEtel8kXVtcXHckXSopXFxzKj0+XFxzKlxce1xccypbJ1wiXXVzZVxccysod29ya2Zsb3d8c3RlcClbJ1wiXS9nLFxuXTtcbmNvbnN0IHNlcmRlQ2xhc3NQYXR0ZXJuID1cbiAgL1xcYmNsYXNzXFxzKyhbQS1aYS16XyRdW1xcdyRdKilbXFxzXFxTXSo/KD86c3RhdGljXFxzK2NsYXNzSWRcXHMqPVxccypbJ1wiXShbXidcIl0rKVsnXCJdfFN5bWJvbFxcLmZvclxccypcXChcXHMqWydcIl13b3JrZmxvdy0oPzpzZXJpYWxpemV8ZGVzZXJpYWxpemUpWydcIl1cXHMqXFwpfFxcW1xccypXT1JLRkxPV18oPzpTRVJJQUxJWkV8REVTRVJJQUxJWkUpXFxzKlxcXSkvZztcblxuY29uc3QgZGVmYXVsdE5vcm1hbGl6ZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZykgPT4gcGF0aG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG5jb25zdCBSRUdFWF9QUkVGSVhfQ0hBUlMgPSBuZXcgU2V0KFtcbiAgJygnLFxuICAneycsXG4gICdbJyxcbiAgJz0nLFxuICAnOicsXG4gICcsJyxcbiAgJzsnLFxuICAnIScsXG4gICc/JyxcbiAgJyYnLFxuICAnfCcsXG4gICcrJyxcbiAgJy0nLFxuICAnKicsXG4gICd+JyxcbiAgJ14nLFxuICAnPCcsXG4gICc+JyxcbiAgJyUnLFxuXSk7XG5jb25zdCBSRUdFWF9QUkVGSVhfS0VZV09SRFMgPVxuICAvXFxiKD86cmV0dXJufHRocm93fGNhc2V8ZGVsZXRlfHZvaWR8dHlwZW9mfGluc3RhbmNlb2Z8aW58eWllbGR8YXdhaXQpJC87XG5cbmNvbnN0IGNhblN0YXJ0UmVnZXhMaXRlcmFsID0gKG91dHB1dDogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHByZXZpb3VzID0gb3V0cHV0LnRyaW1FbmQoKTtcbiAgaWYgKHByZXZpb3VzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHByZXZpb3VzQ2hhciA9IHByZXZpb3VzW3ByZXZpb3VzLmxlbmd0aCAtIDFdO1xuICByZXR1cm4gKFxuICAgIFJFR0VYX1BSRUZJWF9DSEFSUy5oYXMocHJldmlvdXNDaGFyKSB8fCBSRUdFWF9QUkVGSVhfS0VZV09SRFMudGVzdChwcmV2aW91cylcbiAgKTtcbn07XG5cbi8vIGJpb21lLWlnbm9yZSBsaW50L2NvbXBsZXhpdHkvbm9FeGNlc3NpdmVDb2duaXRpdmVDb21wbGV4aXR5OiBLZWVwIHRoZSBzdHJpbmcvY29tbWVudC9yZWdleCBzY2FubmVyIGxvY2FsIGFuZCBhbGxvY2F0aW9uLWxpZ2h0LlxuZXhwb3J0IGNvbnN0IHN0cmlwQ29tbWVudHNGcm9tU291cmNlID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGxldCBvdXRwdXQgPSAnJztcbiAgbGV0IGluZGV4ID0gMDtcbiAgbGV0IHF1b3RlOiAnXCInIHwgXCInXCIgfCAnYCcgfCB1bmRlZmluZWQ7XG4gIGxldCByZWdleCA9IGZhbHNlO1xuICBsZXQgcmVnZXhDaGFyQ2xhc3MgPSBmYWxzZTtcbiAgbGV0IGVzY2FwZWQgPSBmYWxzZTtcblxuICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgY29uc3QgY2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgY29uc3QgbmV4dCA9IHNvdXJjZVtpbmRleCArIDFdO1xuXG4gICAgaWYgKHF1b3RlIHx8IHJlZ2V4KSB7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG5cbiAgICAgIGlmIChlc2NhcGVkKSB7XG4gICAgICAgIGVzY2FwZWQgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAoY2hhciA9PT0gJ1xcXFwnKSB7XG4gICAgICAgIGVzY2FwZWQgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChxdW90ZSAmJiBjaGFyID09PSBxdW90ZSkge1xuICAgICAgICBxdW90ZSA9IHVuZGVmaW5lZDtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJ1snKSB7XG4gICAgICAgIHJlZ2V4Q2hhckNsYXNzID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJ10nKSB7XG4gICAgICAgIHJlZ2V4Q2hhckNsYXNzID0gZmFsc2U7XG4gICAgICB9IGVsc2UgaWYgKHJlZ2V4ICYmIGNoYXIgPT09ICcvJyAmJiAhcmVnZXhDaGFyQ2xhc3MpIHtcbiAgICAgICAgcmVnZXggPSBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnXCInIHx8IGNoYXIgPT09IFwiJ1wiIHx8IGNoYXIgPT09ICdgJykge1xuICAgICAgcXVvdGUgPSBjaGFyO1xuICAgICAgb3V0cHV0ICs9IGNoYXI7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgY2hhciA9PT0gJy8nICYmXG4gICAgICBuZXh0ICE9PSAnLycgJiZcbiAgICAgIG5leHQgIT09ICcqJyAmJlxuICAgICAgY2FuU3RhcnRSZWdleExpdGVyYWwob3V0cHV0KVxuICAgICkge1xuICAgICAgcmVnZXggPSB0cnVlO1xuICAgICAgb3V0cHV0ICs9IGNoYXI7XG4gICAgICBpbmRleCsrO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnLycpIHtcbiAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGggJiYgc291cmNlW2luZGV4XSAhPT0gJ1xcbicpIHtcbiAgICAgICAgb3V0cHV0ICs9ICcgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGlmIChjaGFyID09PSAnLycgJiYgbmV4dCA9PT0gJyonKSB7XG4gICAgICBvdXRwdXQgKz0gJyAgJztcbiAgICAgIGluZGV4ICs9IDI7XG4gICAgICB3aGlsZSAoaW5kZXggPCBzb3VyY2UubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGJsb2NrQ2hhciA9IHNvdXJjZVtpbmRleF07XG4gICAgICAgIGNvbnN0IGJsb2NrTmV4dCA9IHNvdXJjZVtpbmRleCArIDFdO1xuICAgICAgICBpZiAoYmxvY2tDaGFyID09PSAnKicgJiYgYmxvY2tOZXh0ID09PSAnLycpIHtcbiAgICAgICAgICBvdXRwdXQgKz0gJyAgJztcbiAgICAgICAgICBpbmRleCArPSAyO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dCArPSBibG9ja0NoYXIgPT09ICdcXG4nID8gJ1xcbicgOiAnICc7XG4gICAgICAgIGluZGV4Kys7XG4gICAgICB9XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICBpbmRleCsrO1xuICB9XG5cbiAgcmV0dXJuIG91dHB1dDtcbn07XG5cbmNvbnN0IHNvdXJjZU1heUNvbnRhaW5JbXBvcnRTcGVjaWZpZXJzID0gKHNvdXJjZTogc3RyaW5nKSA9PlxuICBzb3VyY2UuaW5jbHVkZXMoJ2ltcG9ydCcpIHx8XG4gIHNvdXJjZS5pbmNsdWRlcygncmVxdWlyZScpIHx8XG4gIHNvdXJjZS5pbmNsdWRlcygnZnJvbScpO1xuXG5jb25zdCBjb2xsZWN0SW1wb3J0U3BlY2lmaWVycyA9IChzb3VyY2U6IHN0cmluZykgPT4ge1xuICBjb25zdCBzcGVjaWZpZXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGZvciAoY29uc3QgcGF0dGVybiBvZiBpbXBvcnRTcGVjaWZpZXJQYXR0ZXJucykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZS5tYXRjaEFsbChwYXR0ZXJuKSkge1xuICAgICAgaWYgKG1hdGNoWzFdKSB7XG4gICAgICAgIHNwZWNpZmllcnMuYWRkKG1hdGNoWzFdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIFsuLi5zcGVjaWZpZXJzXS5zb3J0KCkuam9pbignXFxuJyk7XG59O1xuXG5leHBvcnQgY29uc3QgZXh0cmFjdEltcG9ydFNpZ25hdHVyZSA9IChzb3VyY2U6IHN0cmluZykgPT5cbiAgc291cmNlTWF5Q29udGFpbkltcG9ydFNwZWNpZmllcnMoc291cmNlKVxuICAgID8gY29sbGVjdEltcG9ydFNwZWNpZmllcnMoc291cmNlKVxuICAgIDogJyc7XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0RGVmaW5pdGlvblNpZ25hdHVyZSA9IChzb3VyY2U6IHN0cmluZykgPT4ge1xuICBjb25zdCBkZWZpbml0aW9uczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRpcmVjdGl2ZUZ1bmN0aW9uUGF0dGVybnMpIHtcbiAgICBwYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gICAgZm9yIChjb25zdCBtYXRjaCBvZiBzb3VyY2UubWF0Y2hBbGwocGF0dGVybikpIHtcbiAgICAgIGRlZmluaXRpb25zLnB1c2goYCR7bWF0Y2hbMl19OiR7bWF0Y2hbMV19YCk7XG4gICAgfVxuICB9XG4gIHNlcmRlQ2xhc3NQYXR0ZXJuLmxhc3RJbmRleCA9IDA7XG4gIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKHNlcmRlQ2xhc3NQYXR0ZXJuKSkge1xuICAgIGRlZmluaXRpb25zLnB1c2goYHNlcmRlOiR7bWF0Y2hbMl0gPz8gbWF0Y2hbMV19YCk7XG4gIH1cbiAgcmV0dXJuIGRlZmluaXRpb25zLnNvcnQoKS5qb2luKCdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3VyY2VTbmFwc2hvdEZyb21Tb3VyY2UgPSAoXG4gIHNvdXJjZTogc3RyaW5nLFxuICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zOiBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3Jcbik6IFNvdXJjZVNuYXBzaG90ID0+IHtcbiAgY29uc3Qgc291cmNlV2l0aG91dENvbW1lbnRzID0gc3RyaXBDb21tZW50c0Zyb21Tb3VyY2Uoc291cmNlKTtcbiAgY29uc3QgcGF0dGVybnMgPSBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zKHNvdXJjZVdpdGhvdXRDb21tZW50cyk7XG5cbiAgcmV0dXJuIHtcbiAgICBpbXBvcnRTaWduYXR1cmU6IGV4dHJhY3RJbXBvcnRTaWduYXR1cmUoc291cmNlV2l0aG91dENvbW1lbnRzKSxcbiAgICBkZWZpbml0aW9uU2lnbmF0dXJlOiBleHRyYWN0RGVmaW5pdGlvblNpZ25hdHVyZShzb3VyY2VXaXRob3V0Q29tbWVudHMpLFxuICAgIGhhc0RpcmVjdGl2ZTogcGF0dGVybnMuaGFzRGlyZWN0aXZlLFxuICAgIGhhc1NlcmRlOiBwYXR0ZXJucy5oYXNTZXJkZSxcbiAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVTb3VyY2VTbmFwc2hvdCA9IGFzeW5jICh7XG4gIGZpbGUsXG4gIGRldGVjdFdvcmtmbG93UGF0dGVybnMsXG59OiB7XG4gIGZpbGU6IHN0cmluZztcbiAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJuczogU291cmNlUGF0dGVybkRldGVjdG9yO1xufSk6IFByb21pc2U8U291cmNlU25hcHNob3Q+ID0+XG4gIGNyZWF0ZVNvdXJjZVNuYXBzaG90RnJvbVNvdXJjZShcbiAgICBhd2FpdCByZWFkRmlsZShmaWxlLCAndXRmOCcpLFxuICAgIGRldGVjdFdvcmtmbG93UGF0dGVybnNcbiAgKTtcblxuZXhwb3J0IGNvbnN0IGdldFJlbGV2YW50RmlsZXMgPSAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aD86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbn0pID0+XG4gIG5ldyBTZXQoXG4gICAgW1xuICAgICAgLi4uaW5wdXRGaWxlcyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTdGVwcyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRXb3JrZmxvd3MsXG4gICAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgICAgIC4uLihkaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkRmlsZXMgfHwgW10pLFxuICAgIF0ubWFwKG5vcm1hbGl6ZVBhdGgpXG4gICk7XG5cbmV4cG9ydCBjb25zdCByZXBsYWNlU291cmNlU25hcHNob3RzID0gYXN5bmMgKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xuICBzb3VyY2VTbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pjtcbn0pID0+IHtcbiAgc291cmNlU25hcHNob3RzLmNsZWFyKCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFtcbiAgICAgIC4uLmdldFJlbGV2YW50RmlsZXMoe1xuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIH0pLFxuICAgIF0ubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzb3VyY2VTbmFwc2hvdHMuc2V0KGZpbGUsIGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKSk7XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgc291cmNlU25hcHNob3RzLmRlbGV0ZShmaWxlKTtcbiAgICAgIH1cbiAgICB9KVxuICApO1xufTtcblxuY29uc3QgZGlkU291cmNlU25hcHNob3RDaGFuZ2UgPSAoXG4gIHByZXZpb3VzU25hcHNob3Q6IFNvdXJjZVNuYXBzaG90LFxuICBuZXh0U25hcHNob3Q6IFNvdXJjZVNuYXBzaG90XG4pID0+XG4gIHByZXZpb3VzU25hcHNob3QuaW1wb3J0U2lnbmF0dXJlICE9PSBuZXh0U25hcHNob3QuaW1wb3J0U2lnbmF0dXJlIHx8XG4gIHByZXZpb3VzU25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSAhPT0gbmV4dFNuYXBzaG90LmRlZmluaXRpb25TaWduYXR1cmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5oYXNEaXJlY3RpdmUgIT09IG5leHRTbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5oYXNTZXJkZSAhPT0gbmV4dFNuYXBzaG90Lmhhc1NlcmRlO1xuXG5jb25zdCB1bmlxdWUgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiBbLi4ubmV3IFNldChwYXRocyldO1xuXG5jb25zdCBzbmFwc2hvdENoYW5nZWRGaWxlID0gYXN5bmMgKHtcbiAgZmlsZSxcbiAgbmV4dFNuYXBzaG90cyxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGZpbGU6IHN0cmluZztcbiAgbmV4dFNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xuICBzb3VyY2VTbmFwc2hvdHM6IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pjtcbn0pID0+IHtcbiAgY29uc3QgcHJldmlvdXNTbmFwc2hvdCA9IHNvdXJjZVNuYXBzaG90cy5nZXQoZmlsZSk7XG4gIGlmICghcHJldmlvdXNTbmFwc2hvdCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IG5leHRTbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBuZXh0U25hcHNob3RzLnNldChmaWxlLCBuZXh0U25hcHNob3QpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbmNvbnN0IHJlbW92ZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBpbnB1dEZpbGVzLFxuICBub3JtYWxpemVQYXRoLFxuICByZW1vdmVkRmlsZXMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlbW92ZWRGaWxlczogc3RyaW5nW107XG59KSA9PiB7XG4gIGNvbnN0IHJlbGV2YW50RmlsZXMgPSBnZXRSZWxldmFudEZpbGVzKHtcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBpbnB1dEZpbGVzLFxuICAgIG5vcm1hbGl6ZVBhdGgsXG4gIH0pO1xuICByZXR1cm4gcmVtb3ZlZEZpbGVzLnNvbWUoKGZpbGUpID0+IHJlbGV2YW50RmlsZXMuaGFzKGZpbGUpKTtcbn07XG5cbmNvbnN0IGFkZGVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBhZGRlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG59OiB7XG4gIGFkZGVkRmlsZXM6IHN0cmluZ1tdO1xuICByZWFkU25hcHNob3Q6IChmaWxlOiBzdHJpbmcpID0+IFByb21pc2U8U291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgYWRkZWRGaWxlcykge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgICAgIGlmIChzbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHwgc25hcHNob3QuaGFzU2VyZGUpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgcHJ1bmVTdGFsZUFkZGVkRmlsZXMgPSBhc3luYyAoe1xuICBhZGRlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBuZXh0QWRkZWRGaWxlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3Qgc25hcHNob3RzID0gbmV3IE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90PigpO1xuXG4gIGZvciAoY29uc3QgZmlsZSBvZiB1bmlxdWUoYWRkZWRGaWxlcykpIHtcbiAgICBjb25zdCBwcmV2aW91c1NuYXBzaG90ID0gc291cmNlU25hcHNob3RzLmdldChmaWxlKTtcbiAgICBpZiAoIXByZXZpb3VzU25hcHNob3QpIHtcbiAgICAgIG5leHRBZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgbmV4dEFkZGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBzbmFwc2hvdHMuc2V0KGZpbGUsIG5leHRTbmFwc2hvdCk7XG4gICAgfSBjYXRjaCB7XG4gICAgICBuZXh0QWRkZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7IGFkZGVkRmlsZXM6IG5leHRBZGRlZEZpbGVzLCBzbmFwc2hvdHMgfTtcbn07XG5cbmNvbnN0IG1vZGlmaWVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBtb2RpZmllZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgbW9kaWZpZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBmb3IgKGNvbnN0IGZpbGUgb2YgdW5pcXVlKG1vZGlmaWVkRmlsZXMpKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG5leHRTbmFwc2hvdCA9IGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKTtcbiAgICAgIGNvbnN0IHByZXZpb3VzU25hcHNob3QgPSBzb3VyY2VTbmFwc2hvdHMuZ2V0KGZpbGUpO1xuICAgICAgaWYgKCFwcmV2aW91c1NuYXBzaG90KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBuZXh0U25hcHNob3QuaW1wb3J0U2lnbmF0dXJlIHx8XG4gICAgICAgICAgbmV4dFNuYXBzaG90LmRlZmluaXRpb25TaWduYXR1cmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuaGFzRGlyZWN0aXZlIHx8XG4gICAgICAgICAgbmV4dFNuYXBzaG90Lmhhc1NlcmRlXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgaWYgKGRpZFNvdXJjZVNuYXBzaG90Q2hhbmdlKHByZXZpb3VzU25hcHNob3QsIG5leHRTbmFwc2hvdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfSBjYXRjaCB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuY29uc3QgZ2V0Q2hhbmdlZFJlbGV2YW50RmlsZXMgPSAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgZmlsZUNoYW5nZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGgsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbn0pID0+IHtcbiAgY29uc3QgcmVsZXZhbnRGaWxlcyA9IGdldFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIHJldHVybiB1bmlxdWUoZmlsZUNoYW5nZXMubW9kaWZpZWRGaWxlcykuZmlsdGVyKChmaWxlKSA9PlxuICAgIHJlbGV2YW50RmlsZXMuaGFzKGZpbGUpXG4gICk7XG59O1xuXG5jb25zdCBjb2xsZWN0SG90UmVidWlsZFNuYXBzaG90cyA9IGFzeW5jICh7XG4gIGNoYW5nZWRGaWxlcyxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBjaGFuZ2VkRmlsZXMpIHtcbiAgICBpZiAoXG4gICAgICAhKGF3YWl0IHNuYXBzaG90Q2hhbmdlZEZpbGUoe1xuICAgICAgICBmaWxlLFxuICAgICAgICBuZXh0U25hcHNob3RzOiBzbmFwc2hvdHMsXG4gICAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICAgICAgc291cmNlU25hcHNob3RzLFxuICAgICAgfSkpXG4gICAgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG4gIHJldHVybiBzbmFwc2hvdHM7XG59O1xuXG5jb25zdCB3b3JrZmxvd0VudHJ5RmlsZXNDaGFuZ2VkID0gKHtcbiAgY2hhbmdlZEZpbGVzLFxuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgbm9ybWFsaXplUGF0aCxcbiAgcGFyZW50SGFzQ2hpbGQsXG59OiB7XG4gIGNoYW5nZWRGaWxlczogc3RyaW5nW107XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcGFyZW50SGFzQ2hpbGQ6IChcbiAgICBwYXJlbnQ6IHN0cmluZyxcbiAgICBjaGlsZDogc3RyaW5nLFxuICAgIG9wdGlvbnM/OiB7IGV4Y2x1ZGVkUm9vdHM/OiBJdGVyYWJsZTxzdHJpbmc+IH1cbiAgKSA9PiBib29sZWFuO1xufSkgPT4ge1xuICBjb25zdCB3b3JrZmxvd0VudHJ5RmlsZXMgPSBbXG4gICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlcyxcbiAgXS5tYXAobm9ybWFsaXplUGF0aCk7XG4gIGNvbnN0IHN0ZXBFbnRyeUZpbGVzID0gWy4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTdGVwc10ubWFwKFxuICAgIG5vcm1hbGl6ZVBhdGhcbiAgKTtcblxuICByZXR1cm4gY2hhbmdlZEZpbGVzLnNvbWUoKGNoYW5nZWRGaWxlKSA9PiB7XG4gICAgaWYgKHdvcmtmbG93RW50cnlGaWxlcy5pbmNsdWRlcyhjaGFuZ2VkRmlsZSkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoc3RlcEVudHJ5RmlsZXMuaW5jbHVkZXMoY2hhbmdlZEZpbGUpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB3b3JrZmxvd0VudHJ5RmlsZXMuc29tZSgod29ya2Zsb3dGaWxlKSA9PlxuICAgICAgcGFyZW50SGFzQ2hpbGQod29ya2Zsb3dGaWxlLCBjaGFuZ2VkRmlsZSwge1xuICAgICAgICBleGNsdWRlZFJvb3RzOiBzdGVwRW50cnlGaWxlcyxcbiAgICAgIH0pXG4gICAgKTtcbiAgfSk7XG59O1xuXG5jb25zdCBzdGVwUmVnaXN0cmF0aW9uc05lZWRSZWZyZXNoID0gKHtcbiAgY2hhbmdlZEZpbGVzLFxuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgbm9ybWFsaXplUGF0aCxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCBzZXJkZUZpbGVzID0gbmV3IFNldChcbiAgICBbLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFNlcmRlRmlsZXNdLm1hcChub3JtYWxpemVQYXRoKVxuICApO1xuICByZXR1cm4gY2hhbmdlZEZpbGVzLnNvbWUoKGZpbGUpID0+IHNlcmRlRmlsZXMuaGFzKGZpbGUpKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjbGFzc2lmeVJlYnVpbGQgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgZmlsZUNoYW5nZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcGFyZW50SGFzQ2hpbGQsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBmaWxlQ2hhbmdlczogRmlsZUNoYW5nZXM7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwYXJlbnRIYXNDaGlsZDogKFxuICAgIHBhcmVudDogc3RyaW5nLFxuICAgIGNoaWxkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZXhjbHVkZWRSb290cz86IEl0ZXJhYmxlPHN0cmluZz4gfVxuICApID0+IGJvb2xlYW47XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSk6IFByb21pc2U8UmVidWlsZERlY2lzaW9uPiA9PiB7XG4gIGNvbnN0IHBydW5lZEFkZGVkRmlsZXMgPSBhd2FpdCBwcnVuZVN0YWxlQWRkZWRGaWxlcyh7XG4gICAgYWRkZWRGaWxlczogZmlsZUNoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICByZWFkU25hcHNob3QsXG4gICAgc291cmNlU25hcHNob3RzLFxuICB9KTtcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVDaGFuZ2VzID0ge1xuICAgIC4uLmZpbGVDaGFuZ2VzLFxuICAgIGFkZGVkRmlsZXM6IHBydW5lZEFkZGVkRmlsZXMuYWRkZWRGaWxlcyxcbiAgfTtcblxuICBpZiAoXG4gICAgcmVtb3ZlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIG5vcm1hbGl6ZVBhdGgsXG4gICAgICByZW1vdmVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5yZW1vdmVkRmlsZXMsXG4gICAgfSkgfHxcbiAgICAoYXdhaXQgYWRkZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCh7XG4gICAgICBhZGRlZEZpbGVzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICB9KSkgfHxcbiAgICAoYXdhaXQgbW9kaWZpZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCh7XG4gICAgICBtb2RpZmllZEZpbGVzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMubW9kaWZpZWRGaWxlcyxcbiAgICAgIHJlYWRTbmFwc2hvdCxcbiAgICAgIHNvdXJjZVNuYXBzaG90cyxcbiAgICB9KSlcbiAgKSB7XG4gICAgcmV0dXJuIHsga2luZDogJ2Z1bGwnIH07XG4gIH1cblxuICBjb25zdCBjaGFuZ2VkUmVsZXZhbnRGaWxlcyA9IGdldENoYW5nZWRSZWxldmFudEZpbGVzKHtcbiAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICBmaWxlQ2hhbmdlczogbm9ybWFsaXplZEZpbGVDaGFuZ2VzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIGlmIChjaGFuZ2VkUmVsZXZhbnRGaWxlcy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gcHJ1bmVkQWRkZWRGaWxlcy5zbmFwc2hvdHMuc2l6ZSA+IDBcbiAgICAgID8geyBraW5kOiAnbm9uZScsIHNuYXBzaG90czogcHJ1bmVkQWRkZWRGaWxlcy5zbmFwc2hvdHMgfVxuICAgICAgOiB7IGtpbmQ6ICdub25lJyB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBzbmFwc2hvdHMgPSBhd2FpdCBjb2xsZWN0SG90UmVidWlsZFNuYXBzaG90cyh7XG4gICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgc291cmNlU25hcHNob3RzLFxuICAgIH0pO1xuICAgIGlmICghc25hcHNob3RzKSB7XG4gICAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtmbG93RW50cnlGaWxlc0NoYW5nZWQoe1xuICAgICAgY2hhbmdlZEZpbGVzOiBjaGFuZ2VkUmVsZXZhbnRGaWxlcyxcbiAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIHBhcmVudEhhc0NoaWxkLFxuICAgIH0pXG4gICAgICA/IHtcbiAgICAgICAgICBraW5kOiAnaG90JyxcbiAgICAgICAgICByZWZyZXNoU3RlcFJlZ2lzdHJhdGlvbnM6IHN0ZXBSZWdpc3RyYXRpb25zTmVlZFJlZnJlc2goe1xuICAgICAgICAgICAgY2hhbmdlZEZpbGVzOiBjaGFuZ2VkUmVsZXZhbnRGaWxlcyxcbiAgICAgICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgICAgICB9KSxcbiAgICAgICAgICBzbmFwc2hvdHMsXG4gICAgICAgIH1cbiAgICAgIDogeyBraW5kOiAnbm9uZScsIHNuYXBzaG90cyB9O1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgfVxufTtcbiJdfQ==
|
|
476
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2gtcmVidWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy93YXRjaC1yZWJ1aWxkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtDQUE0QztBQW9DNUMsTUFBTSx1QkFBdUIsR0FBRztJQUM5Qiw0QkFBNEI7SUFDNUIsMENBQTBDO0lBQzFDLHdDQUF3QztJQUN4Qyx5Q0FBeUM7Q0FDMUMsQ0FBQztBQUNGLE1BQU0seUJBQXlCLEdBQUc7SUFDaEMsb0dBQW9HO0lBQ3BHLHlJQUF5STtDQUMxSSxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FDckIsa01BQWtNLENBQUM7QUFFck0sTUFBTSxvQkFBb0IsR0FBRyxDQUFDLFFBQWdCLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBRWhGLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxHQUFHLENBQUM7SUFDakMsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsR0FBRztDQUNKLENBQUMsQ0FBQztBQUNILE1BQU0scUJBQXFCLEdBQ3pCLHVFQUF1RSxDQUFDO0FBRTFFLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtJQUM5QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQzFCLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFH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QUNmLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDMUIsQ0FBQztRQUNELE9BQU8seUJBQXlCLENBQUM7WUFDL0IsWUFBWSxFQUFFLG9CQUFvQjtZQUNsQyxpQkFBaUI7WUFDakIsYUFBYTtZQUNiLGNBQWM7U0FDZixDQUFDO1lBQ0EsQ0FBQyxDQUFDO2dCQUNFLElBQUksRUFBRSxLQUFLO2dCQUNYLHdCQUF3QixFQUFFLDRCQUE0QixDQUFDO29CQUNyRCxZQUFZLEVBQUUsb0JBQW9CO29CQUNsQyxpQkFBaUI7b0JBQ2pCLGFBQWE7aUJBQ2QsQ0FBQztnQkFDRixTQUFTO2FBQ1Y7WUFDSCxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO0lBQzFCLENBQUM7QUFDSCxDQUFDLENBQUM7QUEzRlcsUUFBQSxlQUFlLG1CQTJGMUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIERpc2NvdmVyZWRFbnRyaWVzTGlrZSB7XG4gIGRpc2NvdmVyZWRTdGVwczogU2V0PHN0cmluZz47XG4gIGRpc2NvdmVyZWRXb3JrZmxvd3M6IFNldDxzdHJpbmc+O1xuICBkaXNjb3ZlcmVkU2VyZGVGaWxlczogU2V0PHN0cmluZz47XG4gIGRpc2NvdmVyZWRGaWxlcz86IFNldDxzdHJpbmc+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpbGVDaGFuZ2VzIHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIG1vZGlmaWVkRmlsZXM6IHN0cmluZ1tdO1xuICByZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNvdXJjZVNuYXBzaG90IHtcbiAgaW1wb3J0U2lnbmF0dXJlOiBzdHJpbmc7XG4gIGRlZmluaXRpb25TaWduYXR1cmU6IHN0cmluZztcbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IHR5cGUgUmVidWlsZERlY2lzaW9uID1cbiAgfCB7IGtpbmQ6ICdub25lJzsgc25hcHNob3RzPzogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+IH1cbiAgfCB7XG4gICAgICBraW5kOiAnaG90JztcbiAgICAgIHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9uczogYm9vbGVhbjtcbiAgICAgIHNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xuICAgIH1cbiAgfCB7IGtpbmQ6ICdmdWxsJyB9O1xuXG5leHBvcnQgdHlwZSBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3IgPSAoc291cmNlOiBzdHJpbmcpID0+IHtcbiAgaGFzRGlyZWN0aXZlOiBib29sZWFuO1xuICBoYXNTZXJkZTogYm9vbGVhbjtcbn07XG5cbmNvbnN0IGltcG9ydFNwZWNpZmllclBhdHRlcm5zID0gW1xuICAvXFxiZnJvbVxccytbJ1wiXShbXidcIl0rKVsnXCJdL2csXG4gIC8oPzpefFs7XFxuXSlcXHMqaW1wb3J0XFxzK1snXCJdKFteJ1wiXSspWydcIl0vZyxcbiAgL1xcYmltcG9ydFxccypcXChcXHMqWydcIl0oW14nXCJdKylbJ1wiXVxccypcXCkvZyxcbiAgL1xcYnJlcXVpcmVcXHMqXFwoXFxzKlsnXCJdKFteJ1wiXSspWydcIl1cXHMqXFwpL2csXG5dO1xuY29uc3QgZGlyZWN0aXZlRnVuY3Rpb25QYXR0ZXJucyA9IFtcbiAgL1xcYig/OmV4cG9ydFxccyspPyg/OmFzeW5jXFxzKyk/ZnVuY3Rpb25cXHMrKFtBLVphLXpfJF1bXFx3JF0qKVtee10qXFx7XFxzKlsnXCJddXNlXFxzKyh3b3JrZmxvd3xzdGVwKVsnXCJdL2csXG4gIC9cXGIoPzpleHBvcnRcXHMrKT9jb25zdFxccysoW0EtWmEtel8kXVtcXHckXSopXFxzKj1cXHMqKD86YXN5bmNcXHMqKT8oPzpcXChbXildKlxcKXxbQS1aYS16XyRdW1xcdyRdKilcXHMqPT5cXHMqXFx7XFxzKlsnXCJddXNlXFxzKyh3b3JrZmxvd3xzdGVwKVsnXCJdL2csXG5dO1xuY29uc3Qgc2VyZGVDbGFzc1BhdHRlcm4gPVxuICAvXFxiY2xhc3NcXHMrKFtBLVphLXpfJF1bXFx3JF0qKVtcXHNcXFNdKj8oPzpzdGF0aWNcXHMrY2xhc3NJZFxccyo9XFxzKlsnXCJdKFteJ1wiXSspWydcIl18U3ltYm9sXFwuZm9yXFxzKlxcKFxccypbJ1wiXXdvcmtmbG93LSg/OnNlcmlhbGl6ZXxkZXNlcmlhbGl6ZSlbJ1wiXVxccypcXCl8XFxbXFxzKldPUktGTE9XXyg/OlNFUklBTElaRXxERVNFUklBTElaRSlcXHMqXFxdKS9nO1xuXG5jb25zdCBkZWZhdWx0Tm9ybWFsaXplUGF0aCA9IChwYXRobmFtZTogc3RyaW5nKSA9PiBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbmNvbnN0IFJFR0VYX1BSRUZJWF9DSEFSUyA9IG5ldyBTZXQoW1xuICAnKCcsXG4gICd7JyxcbiAgJ1snLFxuICAnPScsXG4gICc6JyxcbiAgJywnLFxuICAnOycsXG4gICchJyxcbiAgJz8nLFxuICAnJicsXG4gICd8JyxcbiAgJysnLFxuICAnLScsXG4gICcqJyxcbiAgJ34nLFxuICAnXicsXG4gICc8JyxcbiAgJz4nLFxuICAnJScsXG5dKTtcbmNvbnN0IFJFR0VYX1BSRUZJWF9LRVlXT1JEUyA9XG4gIC9cXGIoPzpyZXR1cm58dGhyb3d8Y2FzZXxkZWxldGV8dm9pZHx0eXBlb2Z8aW5zdGFuY2VvZnxpbnx5aWVsZHxhd2FpdCkkLztcblxuY29uc3QgY2FuU3RhcnRSZWdleExpdGVyYWwgPSAob3V0cHV0OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgcHJldmlvdXMgPSBvdXRwdXQudHJpbUVuZCgpO1xuICBpZiAocHJldmlvdXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcHJldmlvdXNDaGFyID0gcHJldmlvdXNbcHJldmlvdXMubGVuZ3RoIC0gMV07XG4gIHJldHVybiAoXG4gICAgUkVHRVhfUFJFRklYX0NIQVJTLmhhcyhwcmV2aW91c0NoYXIpIHx8IFJFR0VYX1BSRUZJWF9LRVlXT1JEUy50ZXN0KHByZXZpb3VzKVxuICApO1xufTtcblxuLy8gYmlvbWUtaWdub3JlIGxpbnQvY29tcGxleGl0eS9ub0V4Y2Vzc2l2ZUNvZ25pdGl2ZUNvbXBsZXhpdHk6IEtlZXAgdGhlIHN0cmluZy9jb21tZW50L3JlZ2V4IHNjYW5uZXIgbG9jYWwgYW5kIGFsbG9jYXRpb24tbGlnaHQuXG5leHBvcnQgY29uc3Qgc3RyaXBDb21tZW50c0Zyb21Tb3VyY2UgPSAoc291cmNlOiBzdHJpbmcpID0+IHtcbiAgbGV0IG91dHB1dCA9ICcnO1xuICBsZXQgaW5kZXggPSAwO1xuICBsZXQgcXVvdGU6ICdcIicgfCBcIidcIiB8ICdgJyB8IHVuZGVmaW5lZDtcbiAgbGV0IHJlZ2V4ID0gZmFsc2U7XG4gIGxldCByZWdleENoYXJDbGFzcyA9IGZhbHNlO1xuICBsZXQgZXNjYXBlZCA9IGZhbHNlO1xuXG4gIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICBjb25zdCBjaGFyID0gc291cmNlW2luZGV4XTtcbiAgICBjb25zdCBuZXh0ID0gc291cmNlW2luZGV4ICsgMV07XG5cbiAgICBpZiAocXVvdGUgfHwgcmVnZXgpIHtcbiAgICAgIG91dHB1dCArPSBjaGFyO1xuICAgICAgaW5kZXgrKztcblxuICAgICAgaWYgKGVzY2FwZWQpIHtcbiAgICAgICAgZXNjYXBlZCA9IGZhbHNlO1xuICAgICAgfSBlbHNlIGlmIChjaGFyID09PSAnXFxcXCcpIHtcbiAgICAgICAgZXNjYXBlZCA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKHF1b3RlICYmIGNoYXIgPT09IHF1b3RlKSB7XG4gICAgICAgIHF1b3RlID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIGlmIChyZWdleCAmJiBjaGFyID09PSAnWycpIHtcbiAgICAgICAgcmVnZXhDaGFyQ2xhc3MgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChyZWdleCAmJiBjaGFyID09PSAnXScpIHtcbiAgICAgICAgcmVnZXhDaGFyQ2xhc3MgPSBmYWxzZTtcbiAgICAgIH0gZWxzZSBpZiAocmVnZXggJiYgY2hhciA9PT0gJy8nICYmICFyZWdleENoYXJDbGFzcykge1xuICAgICAgICByZWdleCA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICdcIicgfHwgY2hhciA9PT0gXCInXCIgfHwgY2hhciA9PT0gJ2AnKSB7XG4gICAgICBxdW90ZSA9IGNoYXI7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICBjaGFyID09PSAnLycgJiZcbiAgICAgIG5leHQgIT09ICcvJyAmJlxuICAgICAgbmV4dCAhPT0gJyonICYmXG4gICAgICBjYW5TdGFydFJlZ2V4TGl0ZXJhbChvdXRwdXQpXG4gICAgKSB7XG4gICAgICByZWdleCA9IHRydWU7XG4gICAgICBvdXRwdXQgKz0gY2hhcjtcbiAgICAgIGluZGV4Kys7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAoY2hhciA9PT0gJy8nICYmIG5leHQgPT09ICcvJykge1xuICAgICAgb3V0cHV0ICs9ICcgICc7XG4gICAgICBpbmRleCArPSAyO1xuICAgICAgd2hpbGUgKGluZGV4IDwgc291cmNlLmxlbmd0aCAmJiBzb3VyY2VbaW5kZXhdICE9PSAnXFxuJykge1xuICAgICAgICBvdXRwdXQgKz0gJyAnO1xuICAgICAgICBpbmRleCsrO1xuICAgICAgfVxuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKGNoYXIgPT09ICcvJyAmJiBuZXh0ID09PSAnKicpIHtcbiAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgaW5kZXggKz0gMjtcbiAgICAgIHdoaWxlIChpbmRleCA8IHNvdXJjZS5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgYmxvY2tDaGFyID0gc291cmNlW2luZGV4XTtcbiAgICAgICAgY29uc3QgYmxvY2tOZXh0ID0gc291cmNlW2luZGV4ICsgMV07XG4gICAgICAgIGlmIChibG9ja0NoYXIgPT09ICcqJyAmJiBibG9ja05leHQgPT09ICcvJykge1xuICAgICAgICAgIG91dHB1dCArPSAnICAnO1xuICAgICAgICAgIGluZGV4ICs9IDI7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ICs9IGJsb2NrQ2hhciA9PT0gJ1xcbicgPyAnXFxuJyA6ICcgJztcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIG91dHB1dCArPSBjaGFyO1xuICAgIGluZGV4Kys7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufTtcblxuY29uc3Qgc291cmNlTWF5Q29udGFpbkltcG9ydFNwZWNpZmllcnMgPSAoc291cmNlOiBzdHJpbmcpID0+XG4gIHNvdXJjZS5pbmNsdWRlcygnaW1wb3J0JykgfHxcbiAgc291cmNlLmluY2x1ZGVzKCdyZXF1aXJlJykgfHxcbiAgc291cmNlLmluY2x1ZGVzKCdmcm9tJyk7XG5cbmNvbnN0IGNvbGxlY3RJbXBvcnRTcGVjaWZpZXJzID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHNwZWNpZmllcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGltcG9ydFNwZWNpZmllclBhdHRlcm5zKSB7XG4gICAgcGF0dGVybi5sYXN0SW5kZXggPSAwO1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2Ygc291cmNlLm1hdGNoQWxsKHBhdHRlcm4pKSB7XG4gICAgICBpZiAobWF0Y2hbMV0pIHtcbiAgICAgICAgc3BlY2lmaWVycy5hZGQobWF0Y2hbMV0pO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gWy4uLnNwZWNpZmllcnNdLnNvcnQoKS5qb2luKCdcXG4nKTtcbn07XG5cbmV4cG9ydCBjb25zdCBleHRyYWN0SW1wb3J0U2lnbmF0dXJlID0gKHNvdXJjZTogc3RyaW5nKSA9PlxuICBzb3VyY2VNYXlDb250YWluSW1wb3J0U3BlY2lmaWVycyhzb3VyY2UpXG4gICAgPyBjb2xsZWN0SW1wb3J0U3BlY2lmaWVycyhzb3VyY2UpXG4gICAgOiAnJztcblxuZXhwb3J0IGNvbnN0IGV4dHJhY3REZWZpbml0aW9uU2lnbmF0dXJlID0gKHNvdXJjZTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IGRlZmluaXRpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZGlyZWN0aXZlRnVuY3Rpb25QYXR0ZXJucykge1xuICAgIHBhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIHNvdXJjZS5tYXRjaEFsbChwYXR0ZXJuKSkge1xuICAgICAgZGVmaW5pdGlvbnMucHVzaChgJHttYXRjaFsyXX06JHttYXRjaFsxXX1gKTtcbiAgICB9XG4gIH1cbiAgc2VyZGVDbGFzc1BhdHRlcm4ubGFzdEluZGV4ID0gMDtcbiAgZm9yIChjb25zdCBtYXRjaCBvZiBzb3VyY2UubWF0Y2hBbGwoc2VyZGVDbGFzc1BhdHRlcm4pKSB7XG4gICAgZGVmaW5pdGlvbnMucHVzaChgc2VyZGU6JHttYXRjaFsyXSA/PyBtYXRjaFsxXX1gKTtcbiAgfVxuICByZXR1cm4gZGVmaW5pdGlvbnMuc29ydCgpLmpvaW4oJ1xcbicpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvdXJjZVNuYXBzaG90RnJvbVNvdXJjZSA9IChcbiAgc291cmNlOiBzdHJpbmcsXG4gIGRldGVjdFdvcmtmbG93UGF0dGVybnM6IFNvdXJjZVBhdHRlcm5EZXRlY3RvclxuKTogU291cmNlU25hcHNob3QgPT4ge1xuICBjb25zdCBzb3VyY2VXaXRob3V0Q29tbWVudHMgPSBzdHJpcENvbW1lbnRzRnJvbVNvdXJjZShzb3VyY2UpO1xuICBjb25zdCBwYXR0ZXJucyA9IGRldGVjdFdvcmtmbG93UGF0dGVybnMoc291cmNlV2l0aG91dENvbW1lbnRzKTtcblxuICByZXR1cm4ge1xuICAgIGltcG9ydFNpZ25hdHVyZTogZXh0cmFjdEltcG9ydFNpZ25hdHVyZShzb3VyY2VXaXRob3V0Q29tbWVudHMpLFxuICAgIGRlZmluaXRpb25TaWduYXR1cmU6IGV4dHJhY3REZWZpbml0aW9uU2lnbmF0dXJlKHNvdXJjZVdpdGhvdXRDb21tZW50cyksXG4gICAgaGFzRGlyZWN0aXZlOiBwYXR0ZXJucy5oYXNEaXJlY3RpdmUsXG4gICAgaGFzU2VyZGU6IHBhdHRlcm5zLmhhc1NlcmRlLFxuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IGNyZWF0ZVNvdXJjZVNuYXBzaG90ID0gYXN5bmMgKHtcbiAgZmlsZSxcbiAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyxcbn06IHtcbiAgZmlsZTogc3RyaW5nO1xuICBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zOiBTb3VyY2VQYXR0ZXJuRGV0ZWN0b3I7XG59KTogUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD4gPT5cbiAgY3JlYXRlU291cmNlU25hcHNob3RGcm9tU291cmNlKFxuICAgIGF3YWl0IHJlYWRGaWxlKGZpbGUsICd1dGY4JyksXG4gICAgZGV0ZWN0V29ya2Zsb3dQYXR0ZXJuc1xuICApO1xuXG5leHBvcnQgY29uc3QgZ2V0UmVsZXZhbnRGaWxlcyA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBpbnB1dEZpbGVzLFxuICBub3JtYWxpemVQYXRoID0gZGVmYXVsdE5vcm1hbGl6ZVBhdGgsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICBub3JtYWxpemVQYXRoPzogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT5cbiAgbmV3IFNldChcbiAgICBbXG4gICAgICAuLi5pbnB1dEZpbGVzLFxuICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFN0ZXBzLFxuICAgICAgLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFdvcmtmbG93cyxcbiAgICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICAgICAgLi4uKGRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRGaWxlcyB8fCBbXSksXG4gICAgXS5tYXAobm9ybWFsaXplUGF0aClcbiAgKTtcblxuZXhwb3J0IGNvbnN0IHJlcGxhY2VTb3VyY2VTbmFwc2hvdHMgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBzb3VyY2VTbmFwc2hvdHMuY2xlYXIoKTtcbiAgYXdhaXQgUHJvbWlzZS5hbGwoXG4gICAgW1xuICAgICAgLi4uZ2V0UmVsZXZhbnRGaWxlcyh7XG4gICAgICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgfSksXG4gICAgXS5tYXAoYXN5bmMgKGZpbGUpID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNvdXJjZVNuYXBzaG90cy5zZXQoZmlsZSwgYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpKTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICAvLyBVbnJlYWRhYmxlIChlLmcuIGp1c3QgZGVsZXRlZCkgZmlsZXMgc3RheSBhYnNlbnQgZnJvbSB0aGVcbiAgICAgICAgLy8gZnJlc2hseSBjbGVhcmVkIG1hcC5cbiAgICAgIH1cbiAgICB9KVxuICApO1xufTtcblxuLyoqXG4gKiBSZWFkIHNuYXBzaG90cyBmb3IgZXZlcnkgY3VycmVudGx5IHJlbGV2YW50IGZpbGUgd2l0aG91dCBtdXRhdGluZyB0aGVcbiAqIHNoYXJlZCBiYXNlbGluZSBtYXAuIFVzZWQgYnkgYHBpbkJhc2VsaW5lc0Fjcm9zc0Z1bGxSZWJ1aWxkYCB0byBjYXB0dXJlXG4gKiBjb250ZW50IGF0IHJlYnVpbGQgc3RhcnQsIHNvIHRoZSBiYXNlbGluZSBjYW4gbGF0ZXIgYmUgcGlubmVkIHRvIHdoYXQgdGhlXG4gKiByZWJ1aWxkIGFjdHVhbGx5IGNvbnN1bWVkLlxuICovXG5jb25zdCBjYXB0dXJlU291cmNlU25hcHNob3RzID0gYXN5bmMgKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGggPSBkZWZhdWx0Tm9ybWFsaXplUGF0aCxcbiAgcmVhZFNuYXBzaG90LFxufToge1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aD86IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90Pjtcbn0pOiBQcm9taXNlPE1hcDxzdHJpbmcsIFNvdXJjZVNuYXBzaG90Pj4gPT4ge1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG4gIGF3YWl0IFByb21pc2UuYWxsKFxuICAgIFtcbiAgICAgIC4uLmdldFJlbGV2YW50RmlsZXMoe1xuICAgICAgICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIH0pLFxuICAgIF0ubWFwKGFzeW5jIChmaWxlKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBzbmFwc2hvdHMuc2V0KGZpbGUsIGF3YWl0IHJlYWRTbmFwc2hvdChmaWxlKSk7XG4gICAgICB9IGNhdGNoIHt9XG4gICAgfSlcbiAgKTtcbiAgcmV0dXJuIHNuYXBzaG90cztcbn07XG5cbi8qKlxuICogUnVuIGEgZnVsbCByZWJ1aWxkIHdoaWxlIGtlZXBpbmcgdGhlIGNsYXNzaWZpZXIgYmFzZWxpbmUgYW5jaG9yZWQgdG8gdGhlXG4gKiBjb250ZW50IHRoZSByZWJ1aWxkIGNvbnN1bWVkLlxuICpcbiAqIEEgZnVsbCByZWJ1aWxkIHJlYWRzIHNvdXJjZXMgdHdpY2U6IG9uY2Ugd2hlbiB0aGUgYnVuZGxlciBjb25zdW1lcyB0aGVtIGFuZFxuICogb25jZSB3aGVuIHRoZSBiYXNlbGluZSBpcyByZWZyZXNoZWQgZnJvbSBkaXNrIGFmdGVyd2FyZHMgKHRoZSBgcmVidWlsZGBcbiAqIGNhbGxiYWNrIG93bnMgYm90aCwgaW4gdGhhdCBvcmRlcikuIEFuIGVkaXQgdGhhdCBsYW5kcyBiZXR3ZWVuIHRob3NlIHJlYWRzXG4gKiB3b3VsZCBiZSBhYnNvcmJlZCBpbnRvIHRoZSBiYXNlbGluZSB3aXRob3V0IGV2ZXIgYmVpbmcgYnVpbHQsIGFuZCBpdHNcbiAqIHF1ZXVlZCB3YXRjaGVyIGV2ZW50IHdvdWxkIHRoZW4gY2xhc3NpZnkgYXMgYSBuby1vcCwgc2lsZW50bHkgZHJvcHBpbmdcbiAqIHRoZSBjaGFuZ2UgdW50aWwgdGhlIG5leHQgdW5yZWxhdGVkIHJlYnVpbGQuXG4gKlxuICogVG8gcHJldmVudCB0aGF0LCB0aGUgcmVsZXZhbnQgZmlsZXMgYXJlIHJlLXJlYWQgZnJvbSBkaXNrIGltbWVkaWF0ZWx5XG4gKiBiZWZvcmUgdGhlIHJlYnVpbGQgc3RhcnRzLCBhbmQgZmlsZXMgcHJlc2VudCBib3RoIGJlZm9yZSBhbmQgYWZ0ZXIgZ2V0XG4gKiB0aGF0IGNhcHR1cmVkIHZhbHVlIHJlc3RvcmVkLiBBIG1pZC0obXVsdGktc2Vjb25kLSlyZWJ1aWxkIGVkaXQgdGhlbiBzdGlsbFxuICogZGlmZnMgYWdhaW5zdCB3aGF0IHRoZSByZWJ1aWxkIGNvbnN1bWVkLCB3aGlsZSBhIGR1cGxpY2F0ZSB3YXRjaGVyIGV2ZW50XG4gKiBmb3IgY29udGVudCB0aGUgcmVidWlsZCBhbHJlYWR5IGNvbnN1bWVkICh3YXRjaGVycyByb3V0aW5lbHkgZW1pdCBzZXZlcmFsXG4gKiBldmVudHMgcGVyIGVkaXQsIHRoZSB0cmlnZ2VyaW5nIGVkaXQgaW5jbHVkZWQpIGRpZmZzIGVxdWFsIGFuZCBzdGF5cyBhXG4gKiBuby1vcCBpbnN0ZWFkIG9mIGNhc2NhZGluZyBpbnRvIGJhY2stdG8tYmFjayBmdWxsIHJlYnVpbGRzLlxuICpcbiAqIFRoZSBjYXB0dXJlIGNvc3RzIG9uZSBzZXJpYWwgcmVhZCBvZiB0aGUgcmVsZXZhbnQgc2V0ICh+MTUwLTI1MG1zIGF0IH4yNTBcbiAqIGZpbGVzKSBwZXIgZnVsbCByZWRpc2NvdmVyeS4gQSB6ZXJvLXJlYWQgZm9ybXVsYXRpb24gKGNsb25pbmcgdGhlIGxpdmVcbiAqIGJhc2VsaW5lIG1hcCBhbmQgcGlubmluZyB0aGUgdHJpZ2dlcmluZyBiYXRjaCB0byB0aGUgc25hcHNob3RzXG4gKiBgY2xhc3NpZnlSZWJ1aWxkYCByZWFkKSB3YXMgdHJpZWQgYW5kIHJldmVydGVkOiB3cml0ZXMgbGFuZGluZyBpbiB0aGVcbiAqIGNhcHR1cmUgd2luZG93ICh0ZXN0LXRlYXJkb3duIHJlc3RvcmVzLCBtdWx0aS1mbHVzaCBzZXR1cCBidXJzdHMpIGFyZVxuICogY29udGVudCB0aGUgaW1taW5lbnQgYnVpbGQgY29uc3VtZXMgYW55d2F5LCBhbmQgdGhlIGNsb25lIHVuLWFic29yYnMgdGhlbVxuICogaW50byBmb2xsb3ctdXAgZnVsbCByZWJ1aWxkczsgd2l0aCByZWFsLXdvcmxkIG11bHRpLXNlY29uZCByZWJ1aWxkcyB0aGF0XG4gKiBidXJzdHMgaW50byByZWJ1aWxkIGNoYWlucy4gVGhlIGRpc2sgY2FwdHVyZSBpbnRlbnRpb25hbGx5IGNvYWxlc2NlcyBzdWNoXG4gKiB3cml0ZXMgaW50byB0aGUgaW4tZmxpZ2h0IHJlYnVpbGQuXG4gKlxuICogRmlsZXMgdGhlIHJlYnVpbGQgZGlzY292ZXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUgaGF2ZSBubyBjYXB0dXJlZCBjb250ZW50XG4gKiBhbmQga2VlcCB0aGVpciBwb3N0LWJ1aWxkIGJhc2VsaW5lLiBUaGF0IGlzIGFscmVhZHkgc291bmQgZm9yIHRoZSB0d29cbiAqIGNhc2VzIHRoYXQgbWF0dGVyOiBhIG5ldyBmaWxlIHRoZSBidWlsZCBtaXNzZWQgaGFzIG5vIGJhc2VsaW5lIGF0IGFsbCwgc29cbiAqIGl0cyBxdWV1ZWQgYWRkIGV2ZW50IGZvcmNlcyB0aGUgZm9sbG93LXVwIHJlYnVpbGQsIGFuZCBhIG5ldyBmaWxlIHRoZVxuICogYnVpbGQgZGlkIGNvbnN1bWUgZ2V0cyBhIGJhc2VsaW5lIG1hdGNoaW5nIHdoYXQgaXQgY29uc3VtZWQuIFdoYXQgc3RheXNcbiAqIG5hcnJvd2VkIHJhdGhlciB0aGFuIGNsb3NlZCBpcyBhIGZpbGUgY3JlYXRlZCBhbmQgdGhlbiBlZGl0ZWQgYWdhaW4gd2l0aGluXG4gKiBvbmUgcmVidWlsZCB3aW5kb3c7IGV2aWN0aW9uLXN0eWxlIGNvbnNlcnZhdGlzbSB3YXMgdHJpZWQgYWdhaW5zdCB0aGF0XG4gKiBhbmQgcmVqZWN0ZWQgdG9vOiBpdCB0dXJuZWQgZXZlcnkgYWRkZWQgZmlsZSdzIHJvdXRpbmUgZHVwbGljYXRlIHdhdGNoZXJcbiAqIGV2ZW50cyBpbnRvIHJlZHVuZGFudCBmdWxsIHJlYnVpbGRzLlxuICovXG5leHBvcnQgY29uc3QgcGluQmFzZWxpbmVzQWNyb3NzRnVsbFJlYnVpbGQgPSBhc3luYyAoe1xuICBkaXNjb3ZlcmVkRW50cmllcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICByZWFkU25hcHNob3QsXG4gIHJlYnVpbGQsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHJlYnVpbGQ6ICgpID0+IFByb21pc2U8dm9pZD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICBjb25zdCBwcmVCdWlsZFNuYXBzaG90cyA9IGF3YWl0IGNhcHR1cmVTb3VyY2VTbmFwc2hvdHMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgICByZWFkU25hcHNob3QsXG4gIH0pO1xuXG4gIGF3YWl0IHJlYnVpbGQoKTtcblxuICBmb3IgKGNvbnN0IFtmaWxlLCBzbmFwc2hvdF0gb2YgcHJlQnVpbGRTbmFwc2hvdHMpIHtcbiAgICBpZiAoc291cmNlU25hcHNob3RzLmhhcyhmaWxlKSkge1xuICAgICAgc291cmNlU25hcHNob3RzLnNldChmaWxlLCBzbmFwc2hvdCk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBkaWRTb3VyY2VTbmFwc2hvdENoYW5nZSA9IChcbiAgcHJldmlvdXNTbmFwc2hvdDogU291cmNlU25hcHNob3QsXG4gIG5leHRTbmFwc2hvdDogU291cmNlU25hcHNob3RcbikgPT5cbiAgcHJldmlvdXNTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgIT09IG5leHRTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgfHxcbiAgcHJldmlvdXNTbmFwc2hvdC5kZWZpbml0aW9uU2lnbmF0dXJlICE9PSBuZXh0U25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSB8fFxuICBwcmV2aW91c1NuYXBzaG90Lmhhc0RpcmVjdGl2ZSAhPT0gbmV4dFNuYXBzaG90Lmhhc0RpcmVjdGl2ZSB8fFxuICBwcmV2aW91c1NuYXBzaG90Lmhhc1NlcmRlICE9PSBuZXh0U25hcHNob3QuaGFzU2VyZGU7XG5cbmNvbnN0IHVuaXF1ZSA9IChwYXRoczogc3RyaW5nW10pID0+IFsuLi5uZXcgU2V0KHBhdGhzKV07XG5cbmNvbnN0IHNuYXBzaG90Q2hhbmdlZEZpbGUgPSBhc3luYyAoe1xuICBmaWxlLFxuICBuZXh0U25hcHNob3RzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgZmlsZTogc3RyaW5nO1xuICBuZXh0U25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG4gIHNvdXJjZVNuYXBzaG90czogTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+O1xufSkgPT4ge1xuICBjb25zdCBwcmV2aW91c1NuYXBzaG90ID0gc291cmNlU25hcHNob3RzLmdldChmaWxlKTtcbiAgaWYgKCFwcmV2aW91c1NuYXBzaG90KSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIG5leHRTbmFwc2hvdHMuc2V0KGZpbGUsIG5leHRTbmFwc2hvdCk7XG4gIHJldHVybiB0cnVlO1xufTtcblxuY29uc3QgcmVtb3ZlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkID0gKHtcbiAgZGlzY292ZXJlZEVudHJpZXMsXG4gIGlucHV0RmlsZXMsXG4gIG5vcm1hbGl6ZVBhdGgsXG4gIHJlbW92ZWRGaWxlcyxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg6IChwYXRoOiBzdHJpbmcpID0+IHN0cmluZztcbiAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbn0pID0+IHtcbiAgY29uc3QgcmVsZXZhbnRGaWxlcyA9IGdldFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGlucHV0RmlsZXMsXG4gICAgbm9ybWFsaXplUGF0aCxcbiAgfSk7XG4gIHJldHVybiByZW1vdmVkRmlsZXMuc29tZSgoZmlsZSkgPT4gcmVsZXZhbnRGaWxlcy5oYXMoZmlsZSkpO1xufTtcblxuY29uc3QgYWRkZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9IGFzeW5jICh7XG4gIGFkZGVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbn06IHtcbiAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gIHJlYWRTbmFwc2hvdDogKGZpbGU6IHN0cmluZykgPT4gUHJvbWlzZTxTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiBhZGRlZEZpbGVzKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgaWYgKHNuYXBzaG90Lmhhc0RpcmVjdGl2ZSB8fCBzbmFwc2hvdC5oYXNTZXJkZSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBwcnVuZVN0YWxlQWRkZWRGaWxlcyA9IGFzeW5jICh7XG4gIGFkZGVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBhZGRlZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGNvbnN0IG5leHRBZGRlZEZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBzbmFwc2hvdHMgPSBuZXcgTWFwPHN0cmluZywgU291cmNlU25hcHNob3Q+KCk7XG5cbiAgZm9yIChjb25zdCBmaWxlIG9mIHVuaXF1ZShhZGRlZEZpbGVzKSkge1xuICAgIGNvbnN0IHByZXZpb3VzU25hcHNob3QgPSBzb3VyY2VTbmFwc2hvdHMuZ2V0KGZpbGUpO1xuICAgIGlmICghcHJldmlvdXNTbmFwc2hvdCkge1xuICAgICAgbmV4dEFkZGVkRmlsZXMucHVzaChmaWxlKTtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBuZXh0U25hcHNob3QgPSBhd2FpdCByZWFkU25hcHNob3QoZmlsZSk7XG4gICAgICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICBuZXh0QWRkZWRGaWxlcy5wdXNoKGZpbGUpO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNuYXBzaG90cy5zZXQoZmlsZSwgbmV4dFNuYXBzaG90KTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIG5leHRBZGRlZEZpbGVzLnB1c2goZmlsZSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgYWRkZWRGaWxlczogbmV4dEFkZGVkRmlsZXMsIHNuYXBzaG90cyB9O1xufTtcblxuY29uc3QgbW9kaWZpZWRGaWxlc1JlcXVpcmVGdWxsUmVidWlsZCA9IGFzeW5jICh7XG4gIG1vZGlmaWVkRmlsZXMsXG4gIHJlYWRTbmFwc2hvdCxcbiAgc291cmNlU25hcHNob3RzLFxufToge1xuICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGZvciAoY29uc3QgZmlsZSBvZiB1bmlxdWUobW9kaWZpZWRGaWxlcykpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgbmV4dFNuYXBzaG90ID0gYXdhaXQgcmVhZFNuYXBzaG90KGZpbGUpO1xuICAgICAgY29uc3QgcHJldmlvdXNTbmFwc2hvdCA9IHNvdXJjZVNuYXBzaG90cy5nZXQoZmlsZSk7XG4gICAgICBpZiAoIXByZXZpb3VzU25hcHNob3QpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG5leHRTbmFwc2hvdC5pbXBvcnRTaWduYXR1cmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuZGVmaW5pdGlvblNpZ25hdHVyZSB8fFxuICAgICAgICAgIG5leHRTbmFwc2hvdC5oYXNEaXJlY3RpdmUgfHxcbiAgICAgICAgICBuZXh0U25hcHNob3QuaGFzU2VyZGVcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAoZGlkU291cmNlU25hcHNob3RDaGFuZ2UocHJldmlvdXNTbmFwc2hvdCwgbmV4dFNuYXBzaG90KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59O1xuXG5jb25zdCBnZXRDaGFuZ2VkUmVsZXZhbnRGaWxlcyA9ICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBmaWxlQ2hhbmdlcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCxcbn06IHtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgZmlsZUNoYW5nZXM6IEZpbGVDaGFuZ2VzO1xuICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xufSkgPT4ge1xuICBjb25zdCByZWxldmFudEZpbGVzID0gZ2V0UmVsZXZhbnRGaWxlcyh7XG4gICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgaW5wdXRGaWxlcyxcbiAgICBub3JtYWxpemVQYXRoLFxuICB9KTtcbiAgcmV0dXJuIHVuaXF1ZShmaWxlQ2hhbmdlcy5tb2RpZmllZEZpbGVzKS5maWx0ZXIoKGZpbGUpID0+XG4gICAgcmVsZXZhbnRGaWxlcy5oYXMoZmlsZSlcbiAgKTtcbn07XG5cbmNvbnN0IGNvbGxlY3RIb3RSZWJ1aWxkU25hcHNob3RzID0gYXN5bmMgKHtcbiAgY2hhbmdlZEZpbGVzLFxuICByZWFkU25hcHNob3QsXG4gIHNvdXJjZVNuYXBzaG90cyxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KSA9PiB7XG4gIGNvbnN0IHNuYXBzaG90cyA9IG5ldyBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD4oKTtcbiAgZm9yIChjb25zdCBmaWxlIG9mIGNoYW5nZWRGaWxlcykge1xuICAgIGlmIChcbiAgICAgICEoYXdhaXQgc25hcHNob3RDaGFuZ2VkRmlsZSh7XG4gICAgICAgIGZpbGUsXG4gICAgICAgIG5leHRTbmFwc2hvdHM6IHNuYXBzaG90cyxcbiAgICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgICB9KSlcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNuYXBzaG90cztcbn07XG5cbmNvbnN0IHdvcmtmbG93RW50cnlGaWxlc0NoYW5nZWQgPSAoe1xuICBjaGFuZ2VkRmlsZXMsXG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBub3JtYWxpemVQYXRoLFxuICBwYXJlbnRIYXNDaGlsZCxcbn06IHtcbiAgY2hhbmdlZEZpbGVzOiBzdHJpbmdbXTtcbiAgZGlzY292ZXJlZEVudHJpZXM6IERpc2NvdmVyZWRFbnRyaWVzTGlrZTtcbiAgbm9ybWFsaXplUGF0aDogKHBhdGg6IHN0cmluZykgPT4gc3RyaW5nO1xuICBwYXJlbnRIYXNDaGlsZDogKFxuICAgIHBhcmVudDogc3RyaW5nLFxuICAgIGNoaWxkOiBzdHJpbmcsXG4gICAgb3B0aW9ucz86IHsgZXhjbHVkZWRSb290cz86IEl0ZXJhYmxlPHN0cmluZz4gfVxuICApID0+IGJvb2xlYW47XG59KSA9PiB7XG4gIGNvbnN0IHdvcmtmbG93RW50cnlGaWxlcyA9IFtcbiAgICAuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkV29ya2Zsb3dzLFxuICAgIC4uLmRpc2NvdmVyZWRFbnRyaWVzLmRpc2NvdmVyZWRTZXJkZUZpbGVzLFxuICBdLm1hcChub3JtYWxpemVQYXRoKTtcbiAgY29uc3Qgc3RlcEVudHJ5RmlsZXMgPSBbLi4uZGlzY292ZXJlZEVudHJpZXMuZGlzY292ZXJlZFN0ZXBzXS5tYXAoXG4gICAgbm9ybWFsaXplUGF0aFxuICApO1xuXG4gIHJldHVybiBjaGFuZ2VkRmlsZXMuc29tZSgoY2hhbmdlZEZpbGUpID0+IHtcbiAgICBpZiAod29ya2Zsb3dFbnRyeUZpbGVzLmluY2x1ZGVzKGNoYW5nZWRGaWxlKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChzdGVwRW50cnlGaWxlcy5pbmNsdWRlcyhjaGFuZ2VkRmlsZSkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHdvcmtmbG93RW50cnlGaWxlcy5zb21lKCh3b3JrZmxvd0ZpbGUpID0+XG4gICAgICBwYXJlbnRIYXNDaGlsZCh3b3JrZmxvd0ZpbGUsIGNoYW5nZWRGaWxlLCB7XG4gICAgICAgIGV4Y2x1ZGVkUm9vdHM6IHN0ZXBFbnRyeUZpbGVzLFxuICAgICAgfSlcbiAgICApO1xuICB9KTtcbn07XG5cbmNvbnN0IHN0ZXBSZWdpc3RyYXRpb25zTmVlZFJlZnJlc2ggPSAoe1xuICBjaGFuZ2VkRmlsZXMsXG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBub3JtYWxpemVQYXRoLFxufToge1xuICBjaGFuZ2VkRmlsZXM6IHN0cmluZ1tdO1xuICBkaXNjb3ZlcmVkRW50cmllczogRGlzY292ZXJlZEVudHJpZXNMaWtlO1xuICBub3JtYWxpemVQYXRoOiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG59KSA9PiB7XG4gIGNvbnN0IHNlcmRlRmlsZXMgPSBuZXcgU2V0KFxuICAgIFsuLi5kaXNjb3ZlcmVkRW50cmllcy5kaXNjb3ZlcmVkU2VyZGVGaWxlc10ubWFwKG5vcm1hbGl6ZVBhdGgpXG4gICk7XG4gIHJldHVybiBjaGFuZ2VkRmlsZXMuc29tZSgoZmlsZSkgPT4gc2VyZGVGaWxlcy5oYXMoZmlsZSkpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNsYXNzaWZ5UmVidWlsZCA9IGFzeW5jICh7XG4gIGRpc2NvdmVyZWRFbnRyaWVzLFxuICBmaWxlQ2hhbmdlcyxcbiAgaW5wdXRGaWxlcyxcbiAgbm9ybWFsaXplUGF0aCA9IGRlZmF1bHROb3JtYWxpemVQYXRoLFxuICBwYXJlbnRIYXNDaGlsZCxcbiAgcmVhZFNuYXBzaG90LFxuICBzb3VyY2VTbmFwc2hvdHMsXG59OiB7XG4gIGRpc2NvdmVyZWRFbnRyaWVzOiBEaXNjb3ZlcmVkRW50cmllc0xpa2U7XG4gIGZpbGVDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgaW5wdXRGaWxlczogc3RyaW5nW107XG4gIG5vcm1hbGl6ZVBhdGg/OiAocGF0aDogc3RyaW5nKSA9PiBzdHJpbmc7XG4gIHBhcmVudEhhc0NoaWxkOiAoXG4gICAgcGFyZW50OiBzdHJpbmcsXG4gICAgY2hpbGQ6IHN0cmluZyxcbiAgICBvcHRpb25zPzogeyBleGNsdWRlZFJvb3RzPzogSXRlcmFibGU8c3RyaW5nPiB9XG4gICkgPT4gYm9vbGVhbjtcbiAgcmVhZFNuYXBzaG90OiAoZmlsZTogc3RyaW5nKSA9PiBQcm9taXNlPFNvdXJjZVNuYXBzaG90PjtcbiAgc291cmNlU25hcHNob3RzOiBNYXA8c3RyaW5nLCBTb3VyY2VTbmFwc2hvdD47XG59KTogUHJvbWlzZTxSZWJ1aWxkRGVjaXNpb24+ID0+IHtcbiAgY29uc3QgcHJ1bmVkQWRkZWRGaWxlcyA9IGF3YWl0IHBydW5lU3RhbGVBZGRlZEZpbGVzKHtcbiAgICBhZGRlZEZpbGVzOiBmaWxlQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgIHJlYWRTbmFwc2hvdCxcbiAgICBzb3VyY2VTbmFwc2hvdHMsXG4gIH0pO1xuICBjb25zdCBub3JtYWxpemVkRmlsZUNoYW5nZXMgPSB7XG4gICAgLi4uZmlsZUNoYW5nZXMsXG4gICAgYWRkZWRGaWxlczogcHJ1bmVkQWRkZWRGaWxlcy5hZGRlZEZpbGVzLFxuICB9O1xuXG4gIGlmIChcbiAgICByZW1vdmVkRmlsZXNSZXF1aXJlRnVsbFJlYnVpbGQoe1xuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgbm9ybWFsaXplUGF0aCxcbiAgICAgIHJlbW92ZWRGaWxlczogbm9ybWFsaXplZEZpbGVDaGFuZ2VzLnJlbW92ZWRGaWxlcyxcbiAgICB9KSB8fFxuICAgIChhd2FpdCBhZGRlZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIGFkZGVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgIH0pKSB8fFxuICAgIChhd2FpdCBtb2RpZmllZEZpbGVzUmVxdWlyZUZ1bGxSZWJ1aWxkKHtcbiAgICAgIG1vZGlmaWVkRmlsZXM6IG5vcm1hbGl6ZWRGaWxlQ2hhbmdlcy5tb2RpZmllZEZpbGVzLFxuICAgICAgcmVhZFNuYXBzaG90LFxuICAgICAgc291cmNlU25hcHNob3RzLFxuICAgIH0pKVxuICApIHtcbiAgICByZXR1cm4geyBraW5kOiAnZnVsbCcgfTtcbiAgfVxuXG4gIGNvbnN0IGNoYW5nZWRSZWxldmFudEZpbGVzID0gZ2V0Q2hhbmdlZFJlbGV2YW50RmlsZXMoe1xuICAgIGRpc2NvdmVyZWRFbnRyaWVzLFxuICAgIGZpbGVDaGFuZ2VzOiBub3JtYWxpemVkRmlsZUNoYW5nZXMsXG4gICAgaW5wdXRGaWxlcyxcbiAgICBub3JtYWxpemVQYXRoLFxuICB9KTtcbiAgaWYgKGNoYW5nZWRSZWxldmFudEZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBwcnVuZWRBZGRlZEZpbGVzLnNuYXBzaG90cy5zaXplID4gMFxuICAgICAgPyB7IGtpbmQ6ICdub25lJywgc25hcHNob3RzOiBwcnVuZWRBZGRlZEZpbGVzLnNuYXBzaG90cyB9XG4gICAgICA6IHsga2luZDogJ25vbmUnIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHNuYXBzaG90cyA9IGF3YWl0IGNvbGxlY3RIb3RSZWJ1aWxkU25hcHNob3RzKHtcbiAgICAgIGNoYW5nZWRGaWxlczogY2hhbmdlZFJlbGV2YW50RmlsZXMsXG4gICAgICByZWFkU25hcHNob3QsXG4gICAgICBzb3VyY2VTbmFwc2hvdHMsXG4gICAgfSk7XG4gICAgaWYgKCFzbmFwc2hvdHMpIHtcbiAgICAgIHJldHVybiB7IGtpbmQ6ICdmdWxsJyB9O1xuICAgIH1cbiAgICByZXR1cm4gd29ya2Zsb3dFbnRyeUZpbGVzQ2hhbmdlZCh7XG4gICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgcGFyZW50SGFzQ2hpbGQsXG4gICAgfSlcbiAgICAgID8ge1xuICAgICAgICAgIGtpbmQ6ICdob3QnLFxuICAgICAgICAgIHJlZnJlc2hTdGVwUmVnaXN0cmF0aW9uczogc3RlcFJlZ2lzdHJhdGlvbnNOZWVkUmVmcmVzaCh7XG4gICAgICAgICAgICBjaGFuZ2VkRmlsZXM6IGNoYW5nZWRSZWxldmFudEZpbGVzLFxuICAgICAgICAgICAgZGlzY292ZXJlZEVudHJpZXMsXG4gICAgICAgICAgICBub3JtYWxpemVQYXRoLFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHNuYXBzaG90cyxcbiAgICAgICAgfVxuICAgICAgOiB7IGtpbmQ6ICdub25lJywgc25hcHNob3RzIH07XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB7IGtpbmQ6ICdmdWxsJyB9O1xuICB9XG59O1xuIl19
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
---
|
|
2
2
|
title: withWorkflow
|
|
3
|
-
description: Configure webpack
|
|
3
|
+
description: Configure webpack and Turbopack to transform workflow directives in Next.js.
|
|
4
4
|
type: reference
|
|
5
5
|
summary: Wrap your Next.js config with withWorkflow to enable workflow directive transformation.
|
|
6
6
|
prerequisites:
|
|
7
7
|
- /docs/getting-started/next
|
|
8
8
|
---
|
|
9
9
|
|
|
10
|
-
Configures webpack
|
|
10
|
+
Configures webpack and Turbopack loaders to transform workflow code (`"use step"` and `"use workflow"` directives).
|
|
11
11
|
|
|
12
12
|
## Usage
|
|
13
13
|
|
|
@@ -16,13 +16,13 @@ To enable `"use step"` and `"use workflow"` directives while developing locally
|
|
|
16
16
|
```typescript title="next.config.ts" lineNumbers
|
|
17
17
|
import { withWorkflow } from "workflow/next"; // [!code highlight]
|
|
18
18
|
import type { NextConfig } from "next";
|
|
19
|
-
|
|
19
|
+
|
|
20
20
|
const nextConfig: NextConfig = {
|
|
21
21
|
// … rest of your Next.js config
|
|
22
22
|
};
|
|
23
23
|
|
|
24
24
|
// not required but allows configuring workflow options
|
|
25
|
-
const workflowConfig = {}
|
|
25
|
+
const workflowConfig = {};
|
|
26
26
|
|
|
27
27
|
export default withWorkflow(nextConfig, workflowConfig); // [!code highlight]
|
|
28
28
|
```
|
|
@@ -36,22 +36,22 @@ Remove that package from `serverExternalPackages` in your
|
|
|
36
36
|
`next.config` to silence the warning.
|
|
37
37
|
</Callout>
|
|
38
38
|
|
|
39
|
-
### Workflow
|
|
39
|
+
### Workflow discovery in Next.js
|
|
40
40
|
|
|
41
|
-
`withWorkflow()` discovers workflows by scanning your Next.js entrypoints
|
|
42
|
-
Router `route`, `page`, and `layout` files
|
|
43
|
-
file under `pages/` or `src/pages/`
|
|
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
44
|
`workflow/api`. The workflow and step files themselves can live anywhere (for
|
|
45
45
|
example `src/workflows/`); they are discovered transitively through imports, as
|
|
46
46
|
long as a `start()` call in an entrypoint statically reaches them.
|
|
47
47
|
|
|
48
48
|
<Callout type="info">
|
|
49
49
|
Call `start()` from server-side entrypoints, including Route Handlers and Server
|
|
50
|
-
Actions. Don't call workflow functions directly
|
|
50
|
+
Actions. Don't call workflow functions directly, which bypasses the workflow
|
|
51
51
|
runtime.
|
|
52
52
|
</Callout>
|
|
53
53
|
|
|
54
|
-
### Next.js
|
|
54
|
+
### Next.js server actions and `"use server"`
|
|
55
55
|
|
|
56
56
|
Don't put a top-level `"use server"` directive in modules imported by workflow
|
|
57
57
|
or step functions. Workflow transformation wraps imported modules in synchronous
|
|
@@ -60,7 +60,7 @@ with errors like `Server Actions must be async functions`. Keep `"use server"`
|
|
|
60
60
|
on the files that define your Server Actions, and move shared logic into
|
|
61
61
|
separate modules that don't carry the directive.
|
|
62
62
|
|
|
63
|
-
### Monorepos and
|
|
63
|
+
### Monorepos and workspace imports
|
|
64
64
|
|
|
65
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:
|
|
66
66
|
|
|
@@ -107,7 +107,7 @@ export default withWorkflow(nextConfig, {
|
|
|
107
107
|
|
|
108
108
|
### Source maps
|
|
109
109
|
|
|
110
|
-
The step bundle and intermediate workflow bundle default to `'inline'` source maps **in development**
|
|
110
|
+
The step bundle and intermediate workflow bundle default to `'inline'` source maps **in development** (so stack traces from step errors and workflow virtual machine (VM) errors point at your source files) and to **`false` in production**, so function bundles stay small. The `sourcemap` option lets you change that:
|
|
111
111
|
|
|
112
112
|
| Value | Behavior |
|
|
113
113
|
| --- | --- |
|
|
@@ -117,10 +117,10 @@ The step bundle and intermediate workflow bundle default to `'inline'` source ma
|
|
|
117
117
|
| `'both'` | Emit both inline and external source maps. |
|
|
118
118
|
| `false` | Omit source maps entirely. |
|
|
119
119
|
|
|
120
|
-
In production, source maps are already off by default. Setting `sourcemap: false` explicitly also turns them off in development, and it drops the inline source map from every bundle while skipping the source-map-support runtime shim on the Vercel step function (the same behavior production gets by default)
|
|
120
|
+
In production, source maps are already off by default. Setting `sourcemap: false` explicitly also turns them off in development, and it drops the inline source map from every bundle while skipping the source-map-support runtime shim on the Vercel step function (the same behavior production gets by default), the main lever for staying under the Vercel 250 MB function size limit. The tradeoff is that workflow VM stack traces will reference generated code (for example, `evalmachine.<anonymous>`) rather than your source files.
|
|
121
121
|
|
|
122
122
|
<Callout type="info">
|
|
123
|
-
Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower
|
|
123
|
+
Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower: it only toggles source maps on the final workflow wrapper and webhook bundle (which default to off). It continues to work, but new code should use the `sourcemap` option or the `WORKFLOW_SOURCEMAP` environment variable instead.
|
|
124
124
|
</Callout>
|
|
125
125
|
|
|
126
126
|
The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, which accepts the same values plus `'0'` / `'1'` as aliases for `false` / `true`. Precedence is: explicit config > `WORKFLOW_SOURCEMAP` > the environment-aware default (`'inline'` in development, `false` in production). Development is detected from `next dev` / `NODE_ENV=development`, so the config option and the env var both let you force either behavior in either environment.
|
|
@@ -129,7 +129,7 @@ The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, wh
|
|
|
129
129
|
The `workflows.local` options only affect local development. When deployed to Vercel, the runtime ignores `local` settings and uses the Vercel world automatically.
|
|
130
130
|
</Callout>
|
|
131
131
|
|
|
132
|
-
## Exporting a
|
|
132
|
+
## Exporting a function
|
|
133
133
|
|
|
134
134
|
|
|
135
135
|
If you are exporting a function in your `next.config` you will need to ensure you call the function returned from `withWorkflow`.
|
|
@@ -158,4 +158,4 @@ export default async function config(
|
|
|
158
158
|
}
|
|
159
159
|
return nextConfig;
|
|
160
160
|
}
|
|
161
|
-
```
|
|
161
|
+
```
|
package/docs/next.mdx
CHANGED
|
@@ -17,7 +17,7 @@ related:
|
|
|
17
17
|
<Steps>
|
|
18
18
|
|
|
19
19
|
<Step>
|
|
20
|
-
## Create
|
|
20
|
+
## Create your Next.js project
|
|
21
21
|
|
|
22
22
|
Start by creating a new Next.js project. This command will create a new directory named `my-workflow-app` and set up a Next.js project inside it.
|
|
23
23
|
|
|
@@ -89,7 +89,7 @@ If your Next.js app has a [proxy handler](https://nextjs.org/docs/app/api-refere
|
|
|
89
89
|
(formerly known as "middleware"), you'll need to update the matcher pattern to exclude Workflow's
|
|
90
90
|
internal paths to prevent the proxy handler from running on them.
|
|
91
91
|
|
|
92
|
-
If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This
|
|
92
|
+
If you see `[local world] Queue operation failed` with `Cannot perform ArrayBuffer.prototype.slice on a detached ArrayBuffer`, your proxy matcher is still intercepting Workflow's internal `POST /.well-known/workflow/v1/flow` request. This issue can be hard to spot in Next.js 16, where `proxy.ts` replaced `middleware.ts`.
|
|
93
93
|
|
|
94
94
|
Add `.well-known/workflow/*` to your matcher exclusion list:
|
|
95
95
|
|
|
@@ -121,7 +121,7 @@ This ensures that internal Workflow paths are not intercepted by your middleware
|
|
|
121
121
|
|
|
122
122
|
<Step>
|
|
123
123
|
|
|
124
|
-
## Create
|
|
124
|
+
## Create your first workflow
|
|
125
125
|
|
|
126
126
|
Create a new file for our first workflow:
|
|
127
127
|
|
|
@@ -144,14 +144,14 @@ export async function handleUserSignup(email: string) {
|
|
|
144
144
|
|
|
145
145
|
```
|
|
146
146
|
|
|
147
|
-
We'll fill in those functions next
|
|
147
|
+
We'll fill in those functions next. The current code does the following:
|
|
148
148
|
|
|
149
149
|
* We define a **workflow** function with the directive `"use workflow"`. Think of the workflow function as the _orchestrator_ of individual **steps**.
|
|
150
150
|
* The Workflow SDK's `sleep` function allows us to suspend execution of the workflow without using up any resources. A sleep can be a few seconds, hours, days, or even months long.
|
|
151
151
|
|
|
152
|
-
## Create
|
|
152
|
+
## Create your workflow steps
|
|
153
153
|
|
|
154
|
-
|
|
154
|
+
Define the missing functions.
|
|
155
155
|
|
|
156
156
|
```typescript title="workflows/user-signup.ts" lineNumbers
|
|
157
157
|
import { FatalError } from "workflow"
|
|
@@ -204,7 +204,7 @@ We'll dive deeper into workflows, steps, and other ways to suspend or handle eve
|
|
|
204
204
|
|
|
205
205
|
<Step>
|
|
206
206
|
|
|
207
|
-
## Create
|
|
207
|
+
## Create your route handler
|
|
208
208
|
|
|
209
209
|
To invoke your new workflow, we'll need to add your workflow to a `POST` API Route Handler, `app/api/signup/route.ts`, with the following code:
|
|
210
210
|
|
|
@@ -276,12 +276,12 @@ Check the [Deploying](/docs/deploying) section to learn how your workflows can b
|
|
|
276
276
|
|
|
277
277
|
If you see this error when upgrading to Next.js 16.1 or later:
|
|
278
278
|
|
|
279
|
-
```
|
|
279
|
+
```text
|
|
280
280
|
Build error occurred
|
|
281
281
|
Error: Cannot find module 'next/dist/lib/server-external-packages.json'
|
|
282
282
|
```
|
|
283
283
|
|
|
284
|
-
Upgrade
|
|
284
|
+
Upgrade `workflow` to the latest release:
|
|
285
285
|
|
|
286
286
|
```package-install
|
|
287
287
|
workflow@latest
|
|
@@ -315,7 +315,7 @@ Without this configuration, you may experience intermittent issues where workflo
|
|
|
315
315
|
|
|
316
316
|
If you see this error:
|
|
317
317
|
|
|
318
|
-
```
|
|
318
|
+
```text
|
|
319
319
|
'start' received an invalid workflow function. Ensure the Workflow SDK is configured correctly and the function includes a 'use workflow' directive.
|
|
320
320
|
```
|
|
321
321
|
|
|
@@ -326,7 +326,7 @@ Check both of these first:
|
|
|
326
326
|
|
|
327
327
|
See [start-invalid-workflow-function](/docs/errors/start-invalid-workflow-function) for full examples and fixes.
|
|
328
328
|
|
|
329
|
-
## Next
|
|
329
|
+
## Next steps
|
|
330
330
|
|
|
331
331
|
* Learn more about the [Foundations](/docs/foundations).
|
|
332
332
|
* Check [Errors](/docs/errors) if you encounter issues.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/next",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.44",
|
|
4
4
|
"description": "Next.js integration for Workflow SDK",
|
|
5
5
|
"type": "commonjs",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -30,8 +30,8 @@
|
|
|
30
30
|
"chokidar": "4.0.3",
|
|
31
31
|
"ignore": "7.0.5",
|
|
32
32
|
"semver": "7.7.4",
|
|
33
|
-
"@workflow/builders": "5.0.0-beta.
|
|
34
|
-
"@workflow/core": "5.0.0-beta.
|
|
33
|
+
"@workflow/builders": "5.0.0-beta.44",
|
|
34
|
+
"@workflow/core": "5.0.0-beta.44",
|
|
35
35
|
"@workflow/swc-plugin": "5.0.0-beta.5"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|