@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.
@@ -1 +1 @@
1
- {"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"AAWA,wBAAsB,mBAAmB,iBAyiBxC"}
1
+ {"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"AAYA,wBAAsB,mBAAmB,iBAqjBxC"}
@@ -8,7 +8,6 @@ const node_fs_1 = require("node:fs");
8
8
  const promises_1 = require("node:fs/promises");
9
9
  const node_path_1 = require("node:path");
10
10
  const watchpack_1 = __importDefault(require("watchpack"));
11
- const socket_server_js_1 = require("./socket-server.js");
12
11
  let CachedNextBuilderEager;
13
12
  // Create the eager Next builder dynamically by extending the ESM BaseBuilder.
14
13
  // Exported as getNextBuilderEager() to allow CommonJS modules to import from
@@ -22,10 +21,6 @@ async function getNextBuilderEager() {
22
21
  } = (await eval('import("@workflow/builders")'));
23
22
  class NextBuilder extends BaseBuilderClass {
24
23
  async build() {
25
- // Eager mode never starts a discovery socket server, so any leftover
26
- // workflow-socket.json is from a previous deferred-mode build and
27
- // would make the webpack loader connect to a dead port.
28
- await (0, socket_server_js_1.cleanupStaleSocketInfoFiles)((0, node_path_1.join)(this.config.workingDir, this.config.distDir || '.next'));
29
24
  const outputDir = await this.findAppDirectory();
30
25
  const workflowGeneratedDir = (0, node_path_1.join)(outputDir, '.well-known/workflow/v1');
31
26
  // Ensure output directories exist
@@ -87,7 +82,6 @@ async function getNextBuilderEager() {
87
82
  bundleFinal: workflowsBundle.bundleFinal,
88
83
  };
89
84
  const normalizePath = (pathname) => pathname.replace(/\\/g, '/');
90
- const knownFiles = new Set();
91
85
  let previousTimeInfo = new Map();
92
86
  const watchableExtensions = new Set([
93
87
  '.js',
@@ -157,6 +151,7 @@ async function getNextBuilderEager() {
157
151
  return rebuildQueue;
158
152
  };
159
153
  const fullRebuild = async () => {
154
+ this.clearDiscoveredEntriesCache();
160
155
  const newInputFiles = await this.getInputFiles();
161
156
  options.inputFiles = newInputFiles;
162
157
  await stepsCtx.dispose();
@@ -176,37 +171,21 @@ async function getNextBuilderEager() {
176
171
  bundleFinal: newWorkflowsCtx.bundleFinal,
177
172
  };
178
173
  };
179
- const logBuildMessages = (result, label) => {
180
- const logByType = (messages, method) => {
181
- if (!messages || messages.length === 0) {
182
- return;
183
- }
184
- const descriptor = method === 'error' ? 'errors' : 'warnings';
185
- console[method](`${descriptor} while rebuilding ${label}`);
186
- for (const message of messages) {
187
- console[method](message);
174
+ const isWatchableFile = (path) => watchableExtensions.has((0, node_path_1.extname)(path));
175
+ const normalizeWatchpackPaths = (paths) => {
176
+ const normalizedPaths = [];
177
+ if (!paths) {
178
+ return normalizedPaths;
179
+ }
180
+ for (const path of paths) {
181
+ const normalizedPath = normalizePath(path);
182
+ if (isWatchableFile(normalizedPath)) {
183
+ normalizedPaths.push(normalizedPath);
188
184
  }
189
- };
190
- logByType(result.errors, 'error');
191
- logByType(result.warnings, 'warn');
192
- };
193
- const rebuildExistingFiles = async () => {
194
- const rebuiltStepStart = Date.now();
195
- const stepsResult = await stepsCtx.rebuild();
196
- logBuildMessages(stepsResult, 'steps bundle');
197
- console.log('Rebuilt steps bundle', `${Date.now() - rebuiltStepStart}ms`);
198
- const rebuiltWorkflowStart = Date.now();
199
- const workflowResult = await workflowsCtx.interimBundleCtx.rebuild();
200
- logBuildMessages(workflowResult, 'workflows bundle');
201
- if (!workflowResult.outputFiles ||
202
- workflowResult.outputFiles.length === 0) {
203
- console.error('No output generated while rebuilding workflows bundle');
204
- return;
205
185
  }
206
- await workflowsCtx.bundleFinal(workflowResult.outputFiles[0].text);
207
- console.log('Rebuilt workflow bundle', `${Date.now() - rebuiltWorkflowStart}ms`);
186
+ return normalizedPaths;
208
187
  };
209
- const isWatchableFile = (path) => watchableExtensions.has((0, node_path_1.extname)(path));
188
+ const unique = (paths) => [...new Set(paths)];
210
189
  const getComparableTimestamp = (entry) => entry.timestamp ?? entry.safeTime;
211
190
  const findRemovedFiles = (currentEntries, previousEntries) => {
212
191
  const removed = [];
@@ -244,55 +223,72 @@ async function getNextBuilderEager() {
244
223
  removedFiles,
245
224
  };
246
225
  };
226
+ const mergeFileChanges = ({ currentEntries, previousEntries, timestampChanges, eventChangedFiles, eventRemovedFiles, }) => ({
227
+ addedFiles: unique([
228
+ ...timestampChanges.addedFiles,
229
+ ...eventChangedFiles.filter((path) => currentEntries.has(path) && !previousEntries.has(path)),
230
+ ]),
231
+ modifiedFiles: unique([
232
+ ...timestampChanges.modifiedFiles,
233
+ ...eventChangedFiles,
234
+ ]),
235
+ removedFiles: unique([
236
+ ...timestampChanges.removedFiles,
237
+ ...eventRemovedFiles,
238
+ ]),
239
+ });
240
+ const hasFileChanges = ({ addedFiles, modifiedFiles, removedFiles, }) => addedFiles.length > 0 ||
241
+ modifiedFiles.length > 0 ||
242
+ removedFiles.length > 0;
247
243
  let isInitial = true;
248
- watcher.on('aggregated', () => {
244
+ watcher.on('aggregated', (changes, removals) => {
249
245
  const currentEntries = readTimeInfoEntries();
250
- const { addedFiles, modifiedFiles, removedFiles } = determineFileChanges(currentEntries, previousTimeInfo);
246
+ const eventChangedFiles = normalizeWatchpackPaths(changes);
247
+ const eventRemovedFiles = normalizeWatchpackPaths(removals);
248
+ const timestampChanges = determineFileChanges(currentEntries, previousTimeInfo);
249
+ const fileChanges = mergeFileChanges({
250
+ currentEntries,
251
+ previousEntries: previousTimeInfo,
252
+ timestampChanges,
253
+ eventChangedFiles,
254
+ eventRemovedFiles,
255
+ });
251
256
  previousTimeInfo = currentEntries;
252
257
  if (isInitial) {
253
258
  isInitial = false;
254
- return;
259
+ if (eventChangedFiles.length === 0 &&
260
+ eventRemovedFiles.length === 0) {
261
+ return;
262
+ }
255
263
  }
256
- if (addedFiles.length === 0 &&
257
- modifiedFiles.length === 0 &&
258
- removedFiles.length === 0) {
264
+ if (!hasFileChanges(fileChanges)) {
259
265
  return;
260
266
  }
261
- for (const removal of removedFiles) {
262
- knownFiles.delete(removal);
263
- }
264
- for (const added of addedFiles) {
265
- knownFiles.add(added);
266
- }
267
267
  enqueue(async () => {
268
- if (addedFiles.length > 0 || removedFiles.length > 0) {
269
- await fullRebuild();
270
- return;
271
- }
272
- if (modifiedFiles.length > 0) {
273
- await rebuildExistingFiles();
274
- }
268
+ await fullRebuild();
275
269
  });
276
270
  });
277
271
  watcher.watch({
278
272
  directories: [this.config.workingDir],
279
- startTime: 0,
273
+ startTime: Date.now(),
280
274
  });
281
275
  }
282
276
  }
283
277
  async getInputFiles() {
284
278
  const inputFiles = await super.getInputFiles();
285
- return inputFiles.filter((item) => {
286
- // Match App Router entrypoints: route.ts, page.ts, layout.ts in app/ or src/app/ directories
287
- // Matches: /app/page.ts, /app/dashboard/page.ts, /src/app/route.ts, etc.
288
- if (item.match(/(^|.*[/\\])(app|src[/\\]app)([/\\](route|page|layout)\.|[/\\].*[/\\](route|page|layout)\.)/)) {
279
+ return inputFiles.filter((file) => {
280
+ const entry = (0, node_path_1.relative)(this.config.workingDir, file).replaceAll('\\', '/');
281
+ // Match App Router route, page, and layout entrypoints in app/ or src/app/.
282
+ if (/^(?:app|src\/app)\/(?:.*\/)?(?:route|page|layout)\./.test(entry)) {
289
283
  return true;
290
284
  }
291
- // Match Pages Router entrypoints: files in pages/ or src/pages/
292
- if (item.match(/[/\\](pages|src[/\\]pages)[/\\]/)) {
285
+ // Match every Pages Router entrypoint in pages/ or src/pages/.
286
+ if (/^(?:pages|src\/pages)\//.test(entry)) {
293
287
  return true;
294
288
  }
295
- return false;
289
+ // Match Next.js root entrypoints at the project root or under src/.
290
+ return ['instrumentation', 'middleware', 'proxy'].some((name) => this.config.pageExtensions.some((extension) => entry === `${name}.${extension}` ||
291
+ entry === `src/${name}.${extension}`));
296
292
  });
297
293
  }
298
294
  async writeFunctionsConfig(outputDir) {
@@ -397,4 +393,4 @@ async function getNextBuilderEager() {
397
393
  CachedNextBuilderEager = NextBuilder;
398
394
  return NextBuilder;
399
395
  }
400
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBV0Esa0RBeWlCQztBQXBqQkQscUNBQW9DO0FBQ3BDLCtDQUE0RTtBQUM1RSx5Q0FBbUQ7QUFDbkQsMERBQWtDO0FBQ2xDLHlEQUFpRTtBQUVqRSxJQUFJLHNCQUEyQixDQUFDO0FBRWhDLDhFQUE4RTtBQUM5RSw2RUFBNkU7QUFDN0Usb0VBQW9FO0FBQzdELEtBQUssVUFBVSxtQkFBbUI7SUFDdkMsSUFBSSxzQkFBc0IsRUFBRSxDQUFDO1FBQzNCLE9BQU8sc0JBQXNCLENBQUM7SUFDaEMsQ0FBQztJQUVELE1BQU0sRUFDSixXQUFXLEVBQUUsZ0JBQWdCLEVBQzdCLGtCQUFrQixFQUNsQixzQkFBc0I7SUFDdEIsNElBQTRJO01BQzdJLEdBQUcsQ0FBQyxNQUFNLElBQUksQ0FDYiw4QkFBOEIsQ0FDL0IsQ0FBd0MsQ0FBQztJQUUxQyxNQUFNLFdBQVksU0FBUSxnQkFBZ0I7UUFDeEMsS0FBSyxDQUFDLEtBQUs7WUFDVCxxRUFBcUU7WUFDckUsa0VBQWtFO1lBQ2xFLHdEQUF3RDtZQUN4RCxNQUFNLElBQUEsOENBQTJCLEVBQy9CLElBQUEsZ0JBQUksRUFDRixJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFDckIsSUFBSSxDQUFDLE1BQStCLENBQUMsT0FBTyxJQUFJLE9BQU8sQ0FDekQsQ0FDRixDQUFDO1lBRUYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxNQUFNLG9CQUFvQixHQUFHLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUV4RSxrQ0FBa0M7WUFDbEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCw4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QUNoQixDQUFDO1lBRUQsSUFBSSxNQUFNLFdBQVcsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUNuQyx1REFBdUQ7Z0JBQ3ZELE1BQU0sSUFBQSxnQkFBSyxFQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUM1QyxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixxSEFBcUgsQ0FDdEgsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUVELHNCQUFzQixHQUFHLFdBQVcsQ0FBQztJQUNyQyxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBhY2Nlc3MsIGNvcHlGaWxlLCBta2Rpciwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBleHRuYW1lLCBqb2luLCByZXNvbHZlIH0gZnJvbSAnbm9kZTpwYXRoJztcbmltcG9ydCBXYXRjaHBhY2sgZnJvbSAnd2F0Y2hwYWNrJztcbmltcG9ydCB7IGNsZWFudXBTdGFsZVNvY2tldEluZm9GaWxlcyB9IGZyb20gJy4vc29ja2V0LXNlcnZlci5qcyc7XG5cbmxldCBDYWNoZWROZXh0QnVpbGRlckVhZ2VyOiBhbnk7XG5cbi8vIENyZWF0ZSB0aGUgZWFnZXIgTmV4dCBidWlsZGVyIGR5bmFtaWNhbGx5IGJ5IGV4dGVuZGluZyB0aGUgRVNNIEJhc2VCdWlsZGVyLlxuLy8gRXhwb3J0ZWQgYXMgZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHRvIGFsbG93IENvbW1vbkpTIG1vZHVsZXMgdG8gaW1wb3J0IGZyb21cbi8vIHRoZSBFU00gQHdvcmtmbG93L2J1aWxkZXJzIHBhY2thZ2UgdmlhIGR5bmFtaWMgaW1wb3J0IGF0IHJ1bnRpbWUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRWFnZXIpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBCYXNlQnVpbGRlcjogQmFzZUJ1aWxkZXJDbGFzcyxcbiAgICBTVEVQX1FVRVVFX1RSSUdHRVIsXG4gICAgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUixcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6IE5lZWQgdG8gdXNlIGV2YWwgaGVyZSB0byBhdm9pZCBUeXBlU2NyaXB0IGZyb20gdHJhbnNwaWxpbmcgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW50byBgcmVxdWlyZSgpYFxuICB9ID0gKGF3YWl0IGV2YWwoXG4gICAgJ2ltcG9ydChcIkB3b3JrZmxvdy9idWlsZGVyc1wiKSdcbiAgKSkgYXMgdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJyk7XG5cbiAgY2xhc3MgTmV4dEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlckNsYXNzIHtcbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIC8vIEVhZ2VyIG1vZGUgbmV2ZXIgc3RhcnRzIGEgZGlzY292ZXJ5IHNvY2tldCBzZXJ2ZXIsIHNvIGFueSBsZWZ0b3ZlclxuICAgICAgLy8gd29ya2Zsb3ctc29ja2V0Lmpzb24gaXMgZnJvbSBhIHByZXZpb3VzIGRlZmVycmVkLW1vZGUgYnVpbGQgYW5kXG4gICAgICAvLyB3b3VsZCBtYWtlIHRoZSB3ZWJwYWNrIGxvYWRlciBjb25uZWN0IHRvIGEgZGVhZCBwb3J0LlxuICAgICAgYXdhaXQgY2xlYW51cFN0YWxlU29ja2V0SW5mb0ZpbGVzKFxuICAgICAgICBqb2luKFxuICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgKHRoaXMuY29uZmlnIGFzIHsgZGlzdERpcj86IHN0cmluZyB9KS5kaXN0RGlyIHx8ICcubmV4dCdcbiAgICAgICAgKVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgb3V0cHV0RGlyID0gYXdhaXQgdGhpcy5maW5kQXBwRGlyZWN0b3J5KCk7XG4gICAgICBjb25zdCB3b3JrZmxvd0dlbmVyYXRlZERpciA9IGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEnKTtcblxuICAgICAgLy8gRW5zdXJlIG91dHB1dCBkaXJlY3RvcmllcyBleGlzdFxuICAgICAgYXdhaXQgbWtkaXIod29ya2Zsb3dHZW5lcmF0ZWREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgLy8gaWdub3JlIHRoZSBnZW5lcmF0ZWQgYXNzZXRzXG5cbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuXG4gICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICBjb25zdCB0c2NvbmZpZ1BhdGggPSBhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHsgbWFuaWZlc3Q6IHN0ZXBzTWFuaWZlc3QsIGNvbnRleHQ6IHN0ZXBzQnVpbGRDb250ZXh0IH0gPVxuICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkU3RlcHNGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93c0J1bmRsZSA9IGF3YWl0IHRoaXMuYnVpbGRXb3JrZmxvd3NGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRXZWJob29rUm91dGUoeyB3b3JrZmxvd0dlbmVyYXRlZERpciB9KTtcblxuICAgICAgLy8gTWVyZ2UgbWFuaWZlc3RzIGZyb20gYm90aCBidW5kbGVzXG4gICAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgICAgc3RlcHM6IHsgLi4uc3RlcHNNYW5pZmVzdC5zdGVwcywgLi4ud29ya2Zsb3dzQnVuZGxlPy5tYW5pZmVzdD8uc3RlcHMgfSxcbiAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgLi4uc3RlcHNNYW5pZmVzdC53b3JrZmxvd3MsXG4gICAgICAgICAgLi4ud29ya2Zsb3dzQnVuZGxlPy5tYW5pZmVzdD8ud29ya2Zsb3dzLFxuICAgICAgICB9LFxuICAgICAgICBjbGFzc2VzOiB7XG4gICAgICAgICAgLi4uc3RlcHNNYW5pZmVzdC5jbGFzc2VzLFxuICAgICAgICAgIC4uLndvcmtmbG93c0J1bmRsZT8ubWFuaWZlc3Q/LmNsYXNzZXMsXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICAvLyBXcml0ZSB1bmlmaWVkIG1hbmlmZXN0IHRvIHdvcmtmbG93IGdlbmVyYXRlZCBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IHdvcmtmbG93QnVuZGxlUGF0aCA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93L3JvdXRlLmpzJyk7XG4gICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgICAgICBtYW5pZmVzdERpcjogd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIG1hbmlmZXN0LFxuICAgICAgfSk7XG5cbiAgICAgIC8vIEV4cG9zZSBtYW5pZmVzdCBhcyBhIHN0YXRpYyBmaWxlIHdoZW4gV09SS0ZMT1dfUFVCTElDX01BTklGRVNUPTEuXG4gICAgICAvLyBOZXh0LmpzIHNlcnZlcyBmaWxlcyBmcm9tIHB1YmxpYy8gYXQgdGhlIHJvb3QgVVJMLlxuICAgICAgaWYgKHRoaXMuc2hvdWxkRXhwb3NlUHVibGljTWFuaWZlc3QgJiYgbWFuaWZlc3RKc29uKSB7XG4gICAgICAgIGNvbnN0IHB1YmxpY01hbmlmZXN0RGlyID0gam9pbihcbiAgICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgICdwdWJsaWMvLndlbGwta25vd24vd29ya2Zsb3cvdjEnXG4gICAgICAgICk7XG4gICAgICAgIGF3YWl0IG1rZGlyKHB1YmxpY01hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgaWYgKHByb2Nlc3MuZW52LlZFUkNFTF9ERVBMT1lNRU5UX0lEID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBhd2FpdCB3cml0ZUZpbGUoam9pbihwdWJsaWNNYW5pZmVzdERpciwgJy5naXRpZ25vcmUnKSwgJyonKTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjb3B5RmlsZShcbiAgICAgICAgICBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnbWFuaWZlc3QuanNvbicpLFxuICAgICAgICAgIGpvaW4ocHVibGljTWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJylcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgYXdhaXQgdGhpcy53cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXIpO1xuXG4gICAgICBpZiAodGhpcy5jb25maWcud2F0Y2gpIHtcbiAgICAgICAgaWYgKCFzdGVwc0J1aWxkQ29udGV4dCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHN0ZXBzIGJ1aWxkIGNvbnRleHQgaW4gd2F0Y2ggbW9kZSdcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhd29ya2Zsb3dzQnVuZGxlPy5pbnRlcmltQnVuZGxlQ3R4IHx8XG4gICAgICAgICAgIXdvcmtmbG93c0J1bmRsZT8uYnVuZGxlRmluYWxcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93cyBidW5kbGUgaW4gd2F0Y2ggbW9kZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHN0ZXBzQ3R4ID0gc3RlcHNCdWlsZENvbnRleHQ7XG4gICAgICAgIC8vIFRoZXNlIGFyZSBzYWZlIHRvIGFzc2VydCBhcyBub24tbnVsbCBiZWNhdXNlIHdlIGNoZWNrZWQgYWJvdmVcbiAgICAgICAgbGV0IHdvcmtmbG93c0N0eCA9IHtcbiAgICAgICAgICBpbnRlcmltQnVuZGxlQ3R4OiB3b3JrZmxvd3NCdW5kbGUuaW50ZXJpbUJ1bmRsZUN0eCEsXG4gICAgICAgICAgYnVuZGxlRmluYWw6IHdvcmtmbG93c0J1bmRsZS5idW5kbGVGaW5hbCEsXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplUGF0aCA9IChwYXRobmFtZTogc3RyaW5nKSA9PlxuICAgICAgICAgIHBhdGhuYW1lLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgY29uc3Qga25vd25GaWxlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgICAgICB0eXBlIFdhdGNocGFja1RpbWVJbmZvRW50cnkgPSB7XG4gICAgICAgICAgc2FmZVRpbWU6IG51bWJlcjtcbiAgICAgICAgICB0aW1lc3RhbXA/OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIGxldCBwcmV2aW91c1RpbWVJbmZvID0gbmV3IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+KCk7XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hhYmxlRXh0ZW5zaW9ucyA9IG5ldyBTZXQoW1xuICAgICAgICAgICcuanMnLFxuICAgICAgICAgICcuanN4JyxcbiAgICAgICAgICAnLnRzJyxcbiAgICAgICAgICAnLnRzeCcsXG4gICAgICAgICAgJy5tdHMnLFxuICAgICAgICAgICcuY3RzJyxcbiAgICAgICAgICAnLmNqcycsXG4gICAgICAgICAgJy5tanMnLFxuICAgICAgICBdKTtcbiAgICAgICAgY29uc3QgaWdub3JlZFBhdGhGcmFnbWVudHMgPSBbXG4gICAgICAgICAgJy8uZ2l0LycsXG4gICAgICAgICAgJy9ub2RlX21vZHVsZXMvJyxcbiAgICAgICAgICAnLy5uZXh0LycsXG4gICAgICAgICAgJy8udHVyYm8vJyxcbiAgICAgICAgICAnLy52ZXJjZWwvJyxcbiAgICAgICAgICAnL2Rpc3QvJyxcbiAgICAgICAgICAnL2J1aWxkLycsXG4gICAgICAgICAgJy9vdXQvJyxcbiAgICAgICAgICAnLy5jYWNoZS8nLFxuICAgICAgICAgICcvLnlhcm4vJyxcbiAgICAgICAgICAnLy5wbnBtLXN0b3JlLycsXG4gICAgICAgICAgJy8ucGFyY2VsLWNhY2hlLycsXG4gICAgICAgICAgJy8ud2VsbC1rbm93bi93b3JrZmxvdy8nLFxuICAgICAgICBdO1xuICAgICAgICBjb25zdCBub3JtYWxpemVkR2VuZXJhdGVkRGlyID0gd29ya2Zsb3dHZW5lcmF0ZWREaXIucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICBpZ25vcmVkUGF0aEZyYWdtZW50cy5wdXNoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpO1xuXG4gICAgICAgIC8vIFRoZXJlIGlzIGEgbm9kZS5qcyBidWcgb24gTWFjT1Mgd2hpY2ggY2F1c2VzIGNsb3NpbmcgZmlsZSB3YXRjaGVycyB0byBiZSByZWFsbHkgc2xvdy5cbiAgICAgICAgLy8gVGhpcyBsaW1pdHMgdGhlIG51bWJlciBvZiB3YXRjaGVycyB0byBtaXRpZ2F0ZSB0aGUgaXNzdWUuXG4gICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMjk5NDlcbiAgICAgICAgcHJvY2Vzcy5lbnYuV0FUQ0hQQUNLX1dBVENIRVJfTElNSVQgPVxuICAgICAgICAgIHByb2Nlc3MucGxhdGZvcm0gPT09ICdkYXJ3aW4nID8gJzIwJyA6IHVuZGVmaW5lZDtcblxuICAgICAgICBjb25zdCB3YXRjaGVyID0gbmV3IFdhdGNocGFjayh7XG4gICAgICAgICAgLy8gV2F0Y2hwYWNrIGRlZmF1bHQgaXMgMjAwbXMgd2hpY2ggYWRkcyAyMDBtcyBvZiBkZWFkIHRpbWUgb24gYm9vdHVwLlxuICAgICAgICAgIGFnZ3JlZ2F0ZVRpbWVvdXQ6IDUsXG4gICAgICAgICAgaWdub3JlZDogKHBhdGhuYW1lOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gcGF0aG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0bmFtZShub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgICBpZiAoZXh0ZW5zaW9uICYmICF3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRlbnNpb24pKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLnN0YXJ0c1dpdGgobm9ybWFsaXplZEdlbmVyYXRlZERpcikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGZyYWdtZW50IG9mIGlnbm9yZWRQYXRoRnJhZ21lbnRzKSB7XG4gICAgICAgICAgICAgIGlmIChub3JtYWxpemVkUGF0aC5pbmNsdWRlcyhmcmFnbWVudCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGNvbnN0IHJlYWRUaW1lSW5mb0VudHJpZXMgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmF3RW50cmllcyA9IHdhdGNoZXIuZ2V0VGltZUluZm9FbnRyaWVzKCkgYXMgTWFwPFxuICAgICAgICAgICAgc3RyaW5nLFxuICAgICAgICAgICAgV2F0Y2hwYWNrVGltZUluZm9FbnRyeVxuICAgICAgICAgID47XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJpZXMgPSBuZXcgTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4oKTtcbiAgICAgICAgICBmb3IgKGNvbnN0IFtwYXRoLCBpbmZvXSBvZiByYXdFbnRyaWVzKSB7XG4gICAgICAgICAgICBub3JtYWxpemVkRW50cmllcy5zZXQobm9ybWFsaXplUGF0aChwYXRoKSwgaW5mbyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBub3JtYWxpemVkRW50cmllcztcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgcmVidWlsZFF1ZXVlID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgY29uc3QgZW5xdWV1ZSA9ICh0YXNrOiAoKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiB7XG4gICAgICAgICAgcmVidWlsZFF1ZXVlID0gcmVidWlsZFF1ZXVlLnRoZW4odGFzaykuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gcHJvY2VzcyBmaWxlIGNoYW5nZScsIGVycm9yKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4gcmVidWlsZFF1ZXVlO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGZ1bGxSZWJ1aWxkID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IG5ld0lucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgICAgICBvcHRpb25zLmlucHV0RmlsZXMgPSBuZXdJbnB1dEZpbGVzO1xuXG4gICAgICAgICAgYXdhaXQgc3RlcHNDdHguZGlzcG9zZSgpO1xuICAgICAgICAgIGNvbnN0IHsgY29udGV4dDogbmV3U3RlcHNDdHggfSA9XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmJ1aWxkU3RlcHNGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgICAgICBpZiAoIW5ld1N0ZXBzQ3R4KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHN0ZXBzIGJ1aWxkIGNvbnRleHQgYWZ0ZXIgcmVidWlsZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHN0ZXBzQ3R4ID0gbmV3U3RlcHNDdHg7XG5cbiAgICAgICAgICBhd2FpdCB3b3JrZmxvd3NDdHguaW50ZXJpbUJ1bmRsZUN0eC5kaXNwb3NlKCk7XG4gICAgICAgICAgY29uc3QgbmV3V29ya2Zsb3dzQ3R4ID0gYXdhaXQgdGhpcy5idWlsZFdvcmtmbG93c0Z1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICFuZXdXb3JrZmxvd3NDdHg/LmludGVyaW1CdW5kbGVDdHggfHxcbiAgICAgICAgICAgICFuZXdXb3JrZmxvd3NDdHg/LmJ1bmRsZUZpbmFsXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93cyBidW5kbGUgY29udGV4dCBhZnRlciByZWJ1aWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eDogbmV3V29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHgsXG4gICAgICAgICAgICBidW5kbGVGaW5hbDogbmV3V29ya2Zsb3dzQ3R4LmJ1bmRsZUZpbmFsLFxuICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbG9nQnVpbGRNZXNzYWdlcyA9IChcbiAgICAgICAgICByZXN1bHQ6IHtcbiAgICAgICAgICAgIGVycm9ycz86IGltcG9ydCgnZXNidWlsZCcpLk1lc3NhZ2VbXTtcbiAgICAgICAgICAgIHdhcm5pbmdzPzogaW1wb3J0KCdlc2J1aWxkJykuTWVzc2FnZVtdO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgbGFiZWw6IHN0cmluZ1xuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBsb2dCeVR5cGUgPSAoXG4gICAgICAgICAgICBtZXNzYWdlczogaW1wb3J0KCdlc2J1aWxkJykuTWVzc2FnZVtdIHwgdW5kZWZpbmVkLFxuICAgICAgICAgICAgbWV0aG9kOiAnZXJyb3InIHwgJ3dhcm4nXG4gICAgICAgICAgKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1lc3NhZ2VzIHx8IG1lc3NhZ2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkZXNjcmlwdG9yID0gbWV0aG9kID09PSAnZXJyb3InID8gJ2Vycm9ycycgOiAnd2FybmluZ3MnO1xuICAgICAgICAgICAgY29uc29sZVttZXRob2RdKGAke2Rlc2NyaXB0b3J9IHdoaWxlIHJlYnVpbGRpbmcgJHtsYWJlbH1gKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbWVzc2FnZSBvZiBtZXNzYWdlcykge1xuICAgICAgICAgICAgICBjb25zb2xlW21ldGhvZF0obWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcblxuICAgICAgICAgIGxvZ0J5VHlwZShyZXN1bHQuZXJyb3JzLCAnZXJyb3InKTtcbiAgICAgICAgICBsb2dCeVR5cGUocmVzdWx0Lndhcm5pbmdzLCAnd2FybicpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHJlYnVpbGRFeGlzdGluZ0ZpbGVzID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlYnVpbHRTdGVwU3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHN0ZXBzUmVzdWx0ID0gYXdhaXQgc3RlcHNDdHgucmVidWlsZCgpO1xuICAgICAgICAgIGxvZ0J1aWxkTWVzc2FnZXMoc3RlcHNSZXN1bHQsICdzdGVwcyBidW5kbGUnKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgICAgICdSZWJ1aWx0IHN0ZXBzIGJ1bmRsZScsXG4gICAgICAgICAgICBgJHtEYXRlLm5vdygpIC0gcmVidWlsdFN0ZXBTdGFydH1tc2BcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgY29uc3QgcmVidWlsdFdvcmtmbG93U3RhcnQgPSBEYXRlLm5vdygpO1xuICAgICAgICAgIGNvbnN0IHdvcmtmbG93UmVzdWx0ID0gYXdhaXQgd29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHgucmVidWlsZCgpO1xuICAgICAgICAgIGxvZ0J1aWxkTWVzc2FnZXMod29ya2Zsb3dSZXN1bHQsICd3b3JrZmxvd3MgYnVuZGxlJyk7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhd29ya2Zsb3dSZXN1bHQub3V0cHV0RmlsZXMgfHxcbiAgICAgICAgICAgIHdvcmtmbG93UmVzdWx0Lm91dHB1dEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ05vIG91dHB1dCBnZW5lcmF0ZWQgd2hpbGUgcmVidWlsZGluZyB3b3JrZmxvd3MgYnVuZGxlJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmJ1bmRsZUZpbmFsKHdvcmtmbG93UmVzdWx0Lm91dHB1dEZpbGVzWzBdLnRleHQpO1xuICAgICAgICAgIGNvbnNvbGUubG9nKFxuICAgICAgICAgICAgJ1JlYnVpbHQgd29ya2Zsb3cgYnVuZGxlJyxcbiAgICAgICAgICAgIGAke0RhdGUubm93KCkgLSByZWJ1aWx0V29ya2Zsb3dTdGFydH1tc2BcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGlzV2F0Y2hhYmxlRmlsZSA9IChwYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgd2F0Y2hhYmxlRXh0ZW5zaW9ucy5oYXMoZXh0bmFtZShwYXRoKSk7XG5cbiAgICAgICAgY29uc3QgZ2V0Q29tcGFyYWJsZVRpbWVzdGFtcCA9IChlbnRyeTogV2F0Y2hwYWNrVGltZUluZm9FbnRyeSkgPT5cbiAgICAgICAgICBlbnRyeS50aW1lc3RhbXAgPz8gZW50cnkuc2FmZVRpbWU7XG5cbiAgICAgICAgY29uc3QgZmluZFJlbW92ZWRGaWxlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwcmV2aW91c0VudHJpZXMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRFbnRyaWVzLmhhcyhwYXRoKSAmJiBpc1dhdGNoYWJsZUZpbGUocGF0aCkpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5kQWRkZWRBbmRNb2RpZmllZEZpbGVzID0gKFxuICAgICAgICAgIGN1cnJlbnRFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PixcbiAgICAgICAgICBwcmV2aW91c0VudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgaW5mb10gb2YgY3VycmVudEVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghaXNXYXRjaGFibGVGaWxlKHBhdGgpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHByZXZpb3VzRW50cmllcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICAgICAgICAgIGFkZGVkLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGdldENvbXBhcmFibGVUaW1lc3RhbXAoaW5mbykgIT09IGdldENvbXBhcmFibGVUaW1lc3RhbXAocHJldmlvdXMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbW9kaWZpZWQucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyBhZGRlZCwgbW9kaWZpZWQgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXRlcm1pbmVGaWxlQ2hhbmdlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmVkRmlsZXMgPSBmaW5kUmVtb3ZlZEZpbGVzKFxuICAgICAgICAgICAgY3VycmVudEVudHJpZXMsXG4gICAgICAgICAgICBwcmV2aW91c0VudHJpZXNcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHsgYWRkZWQsIG1vZGlmaWVkIH0gPSBmaW5kQWRkZWRBbmRNb2RpZmllZEZpbGVzKFxuICAgICAgICAgICAgY3VycmVudEVudHJpZXMsXG4gICAgICAgICAgICBwcmV2aW91c0VudHJpZXNcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGFkZGVkRmlsZXM6IGFkZGVkLFxuICAgICAgICAgICAgbW9kaWZpZWRGaWxlczogbW9kaWZpZWQsXG4gICAgICAgICAgICByZW1vdmVkRmlsZXMsXG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgaXNJbml0aWFsID0gdHJ1ZTtcblxuICAgICAgICB3YXRjaGVyLm9uKCdhZ2dyZWdhdGVkJywgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbnRyaWVzID0gcmVhZFRpbWVJbmZvRW50cmllcygpO1xuICAgICAgICAgIGNvbnN0IHsgYWRkZWRGaWxlcywgbW9kaWZpZWRGaWxlcywgcmVtb3ZlZEZpbGVzIH0gPVxuICAgICAgICAgICAgZGV0ZXJtaW5lRmlsZUNoYW5nZXMoY3VycmVudEVudHJpZXMsIHByZXZpb3VzVGltZUluZm8pO1xuXG4gICAgICAgICAgcHJldmlvdXNUaW1lSW5mbyA9IGN1cnJlbnRFbnRyaWVzO1xuXG4gICAgICAgICAgaWYgKGlzSW5pdGlhbCkge1xuICAgICAgICAgICAgaXNJbml0aWFsID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgICAgIG1vZGlmaWVkRmlsZXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICByZW1vdmVkRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCByZW1vdmFsIG9mIHJlbW92ZWRGaWxlcykge1xuICAgICAgICAgICAga25vd25GaWxlcy5kZWxldGUocmVtb3ZhbCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgYWRkZWQgb2YgYWRkZWRGaWxlcykge1xuICAgICAgICAgICAga25vd25GaWxlcy5hZGQoYWRkZWQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGVucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fCByZW1vdmVkRmlsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBhd2FpdCBmdWxsUmVidWlsZCgpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChtb2RpZmllZEZpbGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgYXdhaXQgcmVidWlsZEV4aXN0aW5nRmlsZXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgd2F0Y2hlci53YXRjaCh7XG4gICAgICAgICAgZGlyZWN0b3JpZXM6IFt0aGlzLmNvbmZpZy53b3JraW5nRGlyXSxcbiAgICAgICAgICBzdGFydFRpbWU6IDAsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBhc3luYyBnZXRJbnB1dEZpbGVzKCk6IFByb21pc2U8c3RyaW5nW10+IHtcbiAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCBzdXBlci5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICByZXR1cm4gaW5wdXRGaWxlcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgLy8gTWF0Y2ggQXBwIFJvdXRlciBlbnRyeXBvaW50czogcm91dGUudHMsIHBhZ2UudHMsIGxheW91dC50cyBpbiBhcHAvIG9yIHNyYy9hcHAvIGRpcmVjdG9yaWVzXG4gICAgICAgIC8vIE1hdGNoZXM6IC9hcHAvcGFnZS50cywgL2FwcC9kYXNoYm9hcmQvcGFnZS50cywgL3NyYy9hcHAvcm91dGUudHMsIGV0Yy5cbiAgICAgICAgaWYgKFxuICAgICAgICAgIGl0ZW0ubWF0Y2goXG4gICAgICAgICAgICAvKF58LipbL1xcXFxdKShhcHB8c3JjWy9cXFxcXWFwcCkoWy9cXFxcXShyb3V0ZXxwYWdlfGxheW91dClcXC58Wy9cXFxcXS4qWy9cXFxcXShyb3V0ZXxwYWdlfGxheW91dClcXC4pL1xuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTWF0Y2ggUGFnZXMgUm91dGVyIGVudHJ5cG9pbnRzOiBmaWxlcyBpbiBwYWdlcy8gb3Igc3JjL3BhZ2VzL1xuICAgICAgICBpZiAoaXRlbS5tYXRjaCgvWy9cXFxcXShwYWdlc3xzcmNbL1xcXFxdcGFnZXMpWy9cXFxcXS8pKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXI6IHN0cmluZykge1xuICAgICAgLy8gd2UgZG9uJ3QgcnVuIHRoaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZSBhcyBpdCdzIG5vdCBuZWVkZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBnZW5lcmF0ZWRDb25maWcgPSB7XG4gICAgICAgIHZlcnNpb246ICcwJyxcbiAgICAgICAgc3RlcHM6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtTVEVQX1FVRVVFX1RSSUdHRVJdLFxuICAgICAgICB9LFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIHdyaXRlIHRoaXMgZmlsZSB0byB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yeSBmb3JcbiAgICAgIC8vIHRoZSBOZXh0LmpzIGJ1aWxkZXIgdG8gY29uc3VtZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2NvbmZpZy5qc29uJyksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGdlbmVyYXRlZENvbmZpZywgbnVsbCwgMilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFN0ZXBzRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICAvLyBDcmVhdGUgc3RlcHMgYnVuZGxlXG4gICAgICBjb25zdCBzdGVwc1JvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3N0ZXAnKTtcbiAgICAgIGF3YWl0IG1rZGlyKHN0ZXBzUm91dGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgICAgICAvLyBJZiBhbnkgZHluYW1pYyByZXF1aXJlcyBhcmUgdXNlZCB3aGVuIGJ1bmRsaW5nIHdpdGggRVNNXG4gICAgICAgIC8vIGVzYnVpbGQgd2lsbCBjcmVhdGUgYSB0b28gZHluYW1pYyB3cmFwcGVyIGFyb3VuZCByZXF1aXJlXG4gICAgICAgIC8vIHdoaWNoIHR1cmJvcGFjay93ZWJwYWNrIGZhaWwgdG8gYW5hbHl6ZS4gSWYgd2UgZXh0ZXJuYWxpemVcbiAgICAgICAgLy8gY29ycmVjdGx5IHRoaXMgc2hvdWxkbid0IGJlIGFuIGlzc3VlIGFsdGhvdWdoIHdlIG1pZ2h0IHdhbnRcbiAgICAgICAgLy8gdG8gdXNlIGNqcyBhcyBhbHRlcm5hdGl2ZSB0byBhdm9pZFxuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBvdXRmaWxlOiBqb2luKHN0ZXBzUm91dGVEaXIsICdyb3V0ZS5qcycpLFxuICAgICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzOiB0cnVlLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV29ya2Zsb3dzRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICBjb25zdCB3b3JrZmxvd3NSb3V0ZURpciA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93Jyk7XG4gICAgICBhd2FpdCBta2Rpcih3b3JrZmxvd3NSb3V0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVXb3JrZmxvd3NCdW5kbGUoe1xuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBvdXRmaWxlOiBqb2luKHdvcmtmbG93c1JvdXRlRGlyLCAncm91dGUuanMnKSxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV2ViaG9va1JvdXRlKHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgIH06IHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd2ViaG9va1JvdXRlRmlsZSA9IGpvaW4oXG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICAgIG91dGZpbGU6IHdlYmhvb2tSb3V0ZUZpbGUsXG4gICAgICAgIGJ1bmRsZTogZmFsc2UsIC8vIE5leHQuanMgZG9lc24ndCBuZWVkIGJ1bmRsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRBcHBEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGFwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ2FwcCcpO1xuICAgICAgY29uc3Qgc3JjQXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL2FwcCcpO1xuICAgICAgY29uc3QgcGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdwYWdlcycpO1xuICAgICAgY29uc3Qgc3JjUGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvcGFnZXMnKTtcblxuICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXRoKTtcbiAgICAgICAgICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeTogJHtwYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdub3QgYSBkaXJlY3RvcnknKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiBhcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KGFwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3JjL2FwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjQXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBhcHAgZGlyZWN0b3J5IGV4aXN0cywgY2hlY2sgZm9yIHBhZ2VzIGRpcmVjdG9yeSBhbmQgY3JlYXRlIGFwcCBuZXh0IHRvIGl0XG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkocGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhcHAgZGlyZWN0b3J5IG5leHQgdG8gcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKGFwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNQYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHNyYy9hcHAgZGlyZWN0b3J5IG5leHQgdG8gc3JjL3BhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihzcmNBcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZmluZCBOZXh0LmpzIGFwcCBvciBwYWdlcyBkaXJlY3RvcnkuIEV4cGVjdGVkIG9uZSBvZjogXCJhcHBcIiwgXCJzcmMvYXBwXCIsIFwicGFnZXNcIiwgb3IgXCJzcmMvcGFnZXNcIiB0byBleGlzdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIENhY2hlZE5leHRCdWlsZGVyRWFnZXIgPSBOZXh0QnVpbGRlcjtcbiAgcmV0dXJuIE5leHRCdWlsZGVyO1xufVxuIl19
396
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBWUEsa0RBcWpCQztBQWprQkQscUNBQW9DO0FBQ3BDLCtDQUE0RTtBQUM1RSx5Q0FBNkQ7QUFHN0QsMERBQWtDO0FBRWxDLElBQUksc0JBQTJCLENBQUM7QUFFaEMsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLG1CQUFtQjtJQUN2QyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0Isa0JBQWtCLEVBQ2xCLHNCQUFzQjtJQUN0Qiw0SUFBNEk7TUFDN0ksR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUNiLDhCQUE4QixDQUMvQixDQUF3QyxDQUFDO0lBRTFDLE1BQU0sV0FBWSxTQUFRLGdCQUFnQjtRQUt4QyxLQUFLLENBQUMsS0FBSztZQUNULE1BQU0sU0FBUyxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7WUFDaEQsTUFBTSxvQkFBb0IsR0FBRyxJQUFBLGdCQUFJLEVBQUMsU0FBUyxFQUFFLHlCQUF5QixDQUFDLENBQUM7WUFFeEUsa0NBQWtDO1lBQ2xDLE1BQU0sSUFBQSxnQkFBSyxFQUFDLG9CQUFvQixFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdkQsOEJBQThCO1lBRTlCLE1BQU0sSUFBQSxvQkFBUyxFQUFDLElBQUEsZ0JBQUksRUFBQyxvQkFBb0IsRUFBRSxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztZQUUvRCxNQUFNLFVBQVUsR0FBRyxNQUFNLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUM5QyxNQUFNLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxn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QztZQUNuQixDQUFDO1lBRUQsTUFBTSxJQUFJLEtBQUssQ0FDYixxSEFBcUgsQ0FDdEgsQ0FBQztRQUNKLENBQUM7S0FDRjtJQUVELHNCQUFzQixHQUFHLFdBQVcsQ0FBQztJQUNyQyxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY29uc3RhbnRzIH0gZnJvbSAnbm9kZTpmcyc7XG5pbXBvcnQgeyBhY2Nlc3MsIGNvcHlGaWxlLCBta2Rpciwgc3RhdCwgd3JpdGVGaWxlIH0gZnJvbSAnbm9kZTpmcy9wcm9taXNlcyc7XG5pbXBvcnQgeyBleHRuYW1lLCBqb2luLCByZWxhdGl2ZSwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IE5leHRDb25maWcgYXMgQnVpbGRlck5leHRDb25maWcgfSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHR5cGUgeyBOZXh0Q29uZmlnIGFzIFByb2plY3ROZXh0Q29uZmlnIH0gZnJvbSAnbmV4dCc7XG5pbXBvcnQgV2F0Y2hwYWNrIGZyb20gJ3dhdGNocGFjayc7XG5cbmxldCBDYWNoZWROZXh0QnVpbGRlckVhZ2VyOiBhbnk7XG5cbi8vIENyZWF0ZSB0aGUgZWFnZXIgTmV4dCBidWlsZGVyIGR5bmFtaWNhbGx5IGJ5IGV4dGVuZGluZyB0aGUgRVNNIEJhc2VCdWlsZGVyLlxuLy8gRXhwb3J0ZWQgYXMgZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHRvIGFsbG93IENvbW1vbkpTIG1vZHVsZXMgdG8gaW1wb3J0IGZyb21cbi8vIHRoZSBFU00gQHdvcmtmbG93L2J1aWxkZXJzIHBhY2thZ2UgdmlhIGR5bmFtaWMgaW1wb3J0IGF0IHJ1bnRpbWUuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpIHtcbiAgaWYgKENhY2hlZE5leHRCdWlsZGVyRWFnZXIpIHtcbiAgICByZXR1cm4gQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBCYXNlQnVpbGRlcjogQmFzZUJ1aWxkZXJDbGFzcyxcbiAgICBTVEVQX1FVRVVFX1RSSUdHRVIsXG4gICAgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUixcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6IE5lZWQgdG8gdXNlIGV2YWwgaGVyZSB0byBhdm9pZCBUeXBlU2NyaXB0IGZyb20gdHJhbnNwaWxpbmcgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW50byBgcmVxdWlyZSgpYFxuICB9ID0gKGF3YWl0IGV2YWwoXG4gICAgJ2ltcG9ydChcIkB3b3JrZmxvdy9idWlsZGVyc1wiKSdcbiAgKSkgYXMgdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJyk7XG5cbiAgY2xhc3MgTmV4dEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlckNsYXNzIHtcbiAgICBwcm90ZWN0ZWQgZGVjbGFyZSBjb25maWc6IEJ1aWxkZXJOZXh0Q29uZmlnICYge1xuICAgICAgcGFnZUV4dGVuc2lvbnM6IE5vbk51bGxhYmxlPFByb2plY3ROZXh0Q29uZmlnWydwYWdlRXh0ZW5zaW9ucyddPjtcbiAgICB9O1xuXG4gICAgYXN5bmMgYnVpbGQoKSB7XG4gICAgICBjb25zdCBvdXRwdXREaXIgPSBhd2FpdCB0aGlzLmZpbmRBcHBEaXJlY3RvcnkoKTtcbiAgICAgIGNvbnN0IHdvcmtmbG93R2VuZXJhdGVkRGlyID0gam9pbihvdXRwdXREaXIsICcud2VsbC1rbm93bi93b3JrZmxvdy92MScpO1xuXG4gICAgICAvLyBFbnN1cmUgb3V0cHV0IGRpcmVjdG9yaWVzIGV4aXN0XG4gICAgICBhd2FpdCBta2Rpcih3b3JrZmxvd0dlbmVyYXRlZERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAvLyBpZ25vcmUgdGhlIGdlbmVyYXRlZCBhc3NldHNcblxuICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICcuZ2l0aWdub3JlJyksICcqJyk7XG5cbiAgICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgIGNvbnN0IHRzY29uZmlnUGF0aCA9IGF3YWl0IHRoaXMuZmluZFRzQ29uZmlnUGF0aCgpO1xuXG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgdHNjb25maWdQYXRoLFxuICAgICAgfTtcblxuICAgICAgY29uc3QgeyBtYW5pZmVzdDogc3RlcHNNYW5pZmVzdCwgY29udGV4dDogc3RlcHNCdWlsZENvbnRleHQgfSA9XG4gICAgICAgIGF3YWl0IHRoaXMuYnVpbGRTdGVwc0Z1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dzQnVuZGxlID0gYXdhaXQgdGhpcy5idWlsZFdvcmtmbG93c0Z1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tSb3V0ZSh7IHdvcmtmbG93R2VuZXJhdGVkRGlyIH0pO1xuXG4gICAgICAvLyBNZXJnZSBtYW5pZmVzdHMgZnJvbSBib3RoIGJ1bmRsZXNcbiAgICAgIGNvbnN0IG1hbmlmZXN0ID0ge1xuICAgICAgICBzdGVwczogeyAuLi5zdGVwc01hbmlmZXN0LnN0ZXBzLCAuLi53b3JrZmxvd3NCdW5kbGU/Lm1hbmlmZXN0Py5zdGVwcyB9LFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICAuLi5zdGVwc01hbmlmZXN0LndvcmtmbG93cyxcbiAgICAgICAgICAuLi53b3JrZmxvd3NCdW5kbGU/Lm1hbmlmZXN0Py53b3JrZmxvd3MsXG4gICAgICAgIH0sXG4gICAgICAgIGNsYXNzZXM6IHtcbiAgICAgICAgICAuLi5zdGVwc01hbmlmZXN0LmNsYXNzZXMsXG4gICAgICAgICAgLi4ud29ya2Zsb3dzQnVuZGxlPy5tYW5pZmVzdD8uY2xhc3NlcyxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFdyaXRlIHVuaWZpZWQgbWFuaWZlc3QgdG8gd29ya2Zsb3cgZ2VuZXJhdGVkIGRpcmVjdG9yeVxuICAgICAgY29uc3Qgd29ya2Zsb3dCdW5kbGVQYXRoID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cvcm91dGUuanMnKTtcbiAgICAgIGNvbnN0IG1hbmlmZXN0SnNvbiA9IGF3YWl0IHRoaXMuY3JlYXRlTWFuaWZlc3Qoe1xuICAgICAgICB3b3JrZmxvd0J1bmRsZVBhdGgsXG4gICAgICAgIG1hbmlmZXN0RGlyOiB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgICAgbWFuaWZlc3QsXG4gICAgICB9KTtcblxuICAgICAgLy8gRXhwb3NlIG1hbmlmZXN0IGFzIGEgc3RhdGljIGZpbGUgd2hlbiBXT1JLRkxPV19QVUJMSUNfTUFOSUZFU1Q9MS5cbiAgICAgIC8vIE5leHQuanMgc2VydmVzIGZpbGVzIGZyb20gcHVibGljLyBhdCB0aGUgcm9vdCBVUkwuXG4gICAgICBpZiAodGhpcy5zaG91bGRFeHBvc2VQdWJsaWNNYW5pZmVzdCAmJiBtYW5pZmVzdEpzb24pIHtcbiAgICAgICAgY29uc3QgcHVibGljTWFuaWZlc3REaXIgPSBqb2luKFxuICAgICAgICAgIHRoaXMuY29uZmlnLndvcmtpbmdEaXIsXG4gICAgICAgICAgJ3B1YmxpYy8ud2VsbC1rbm93bi93b3JrZmxvdy92MSdcbiAgICAgICAgKTtcbiAgICAgICAgYXdhaXQgbWtkaXIocHVibGljTWFuaWZlc3REaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHB1YmxpY01hbmlmZXN0RGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IGNvcHlGaWxlKFxuICAgICAgICAgIGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdtYW5pZmVzdC5qc29uJyksXG4gICAgICAgICAgam9pbihwdWJsaWNNYW5pZmVzdERpciwgJ21hbmlmZXN0Lmpzb24nKVxuICAgICAgICApO1xuICAgICAgfVxuXG4gICAgICBhd2FpdCB0aGlzLndyaXRlRnVuY3Rpb25zQ29uZmlnKG91dHB1dERpcik7XG5cbiAgICAgIGlmICh0aGlzLmNvbmZpZy53YXRjaCkge1xuICAgICAgICBpZiAoIXN0ZXBzQnVpbGRDb250ZXh0KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgJ0ludmFyaWFudDogZXhwZWN0ZWQgc3RlcHMgYnVpbGQgY29udGV4dCBpbiB3YXRjaCBtb2RlJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICF3b3JrZmxvd3NCdW5kbGU/LmludGVyaW1CdW5kbGVDdHggfHxcbiAgICAgICAgICAhd29ya2Zsb3dzQnVuZGxlPy5idW5kbGVGaW5hbFxuICAgICAgICApIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFyaWFudDogZXhwZWN0ZWQgd29ya2Zsb3dzIGJ1bmRsZSBpbiB3YXRjaCBtb2RlJyk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3RlcHNDdHggPSBzdGVwc0J1aWxkQ29udGV4dDtcbiAgICAgICAgLy8gVGhlc2UgYXJlIHNhZmUgdG8gYXNzZXJ0IGFzIG5vbi1udWxsIGJlY2F1c2Ugd2UgY2hlY2tlZCBhYm92ZVxuICAgICAgICBsZXQgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgIGludGVyaW1CdW5kbGVDdHg6IHdvcmtmbG93c0J1bmRsZS5pbnRlcmltQnVuZGxlQ3R4ISxcbiAgICAgICAgICBidW5kbGVGaW5hbDogd29ya2Zsb3dzQnVuZGxlLmJ1bmRsZUZpbmFsISxcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVQYXRoID0gKHBhdGhuYW1lOiBzdHJpbmcpID0+XG4gICAgICAgICAgcGF0aG5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuICAgICAgICB0eXBlIFdhdGNocGFja1RpbWVJbmZvRW50cnkgPSB7XG4gICAgICAgICAgc2FmZVRpbWU6IG51bWJlcjtcbiAgICAgICAgICB0aW1lc3RhbXA/OiBudW1iZXI7XG4gICAgICAgIH07XG4gICAgICAgIHR5cGUgRmlsZUNoYW5nZXMgPSB7XG4gICAgICAgICAgYWRkZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAgbW9kaWZpZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgfTtcbiAgICAgICAgbGV0IHByZXZpb3VzVGltZUluZm8gPSBuZXcgTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4oKTtcblxuICAgICAgICBjb25zdCB3YXRjaGFibGVFeHRlbnNpb25zID0gbmV3IFNldChbXG4gICAgICAgICAgJy5qcycsXG4gICAgICAgICAgJy5qc3gnLFxuICAgICAgICAgICcudHMnLFxuICAgICAgICAgICcudHN4JyxcbiAgICAgICAgICAnLm10cycsXG4gICAgICAgICAgJy5jdHMnLFxuICAgICAgICAgICcuY2pzJyxcbiAgICAgICAgICAnLm1qcycsXG4gICAgICAgIF0pO1xuICAgICAgICBjb25zdCBpZ25vcmVkUGF0aEZyYWdtZW50cyA9IFtcbiAgICAgICAgICAnLy5naXQvJyxcbiAgICAgICAgICAnL25vZGVfbW9kdWxlcy8nLFxuICAgICAgICAgICcvLm5leHQvJyxcbiAgICAgICAgICAnLy50dXJiby8nLFxuICAgICAgICAgICcvLnZlcmNlbC8nLFxuICAgICAgICAgICcvZGlzdC8nLFxuICAgICAgICAgICcvYnVpbGQvJyxcbiAgICAgICAgICAnL291dC8nLFxuICAgICAgICAgICcvLmNhY2hlLycsXG4gICAgICAgICAgJy8ueWFybi8nLFxuICAgICAgICAgICcvLnBucG0tc3RvcmUvJyxcbiAgICAgICAgICAnLy5wYXJjZWwtY2FjaGUvJyxcbiAgICAgICAgICAnLy53ZWxsLWtub3duL3dvcmtmbG93LycsXG4gICAgICAgIF07XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIgPSB3b3JrZmxvd0dlbmVyYXRlZERpci5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIGlnbm9yZWRQYXRoRnJhZ21lbnRzLnB1c2gobm9ybWFsaXplZEdlbmVyYXRlZERpcik7XG5cbiAgICAgICAgLy8gVGhlcmUgaXMgYSBub2RlLmpzIGJ1ZyBvbiBNYWNPUyB3aGljaCBjYXVzZXMgY2xvc2luZyBmaWxlIHdhdGNoZXJzIHRvIGJlIHJlYWxseSBzbG93LlxuICAgICAgICAvLyBUaGlzIGxpbWl0cyB0aGUgbnVtYmVyIG9mIHdhdGNoZXJzIHRvIG1pdGlnYXRlIHRoZSBpc3N1ZS5cbiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8yOTk0OVxuICAgICAgICBwcm9jZXNzLmVudi5XQVRDSFBBQ0tfV0FUQ0hFUl9MSU1JVCA9XG4gICAgICAgICAgcHJvY2Vzcy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgPyAnMjAnIDogdW5kZWZpbmVkO1xuXG4gICAgICAgIGNvbnN0IHdhdGNoZXIgPSBuZXcgV2F0Y2hwYWNrKHtcbiAgICAgICAgICAvLyBXYXRjaHBhY2sgZGVmYXVsdCBpcyAyMDBtcyB3aGljaCBhZGRzIDIwMG1zIG9mIGRlYWQgdGltZSBvbiBib290dXAuXG4gICAgICAgICAgYWdncmVnYXRlVGltZW91dDogNSxcbiAgICAgICAgICBpZ25vcmVkOiAocGF0aG5hbWU6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgICAgICBjb25zdCBleHRlbnNpb24gPSBleHRuYW1lKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgIXdhdGNoYWJsZUV4dGVuc2lvbnMuaGFzKGV4dGVuc2lvbikpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobm9ybWFsaXplZFBhdGguc3RhcnRzV2l0aChub3JtYWxpemVkR2VuZXJhdGVkRGlyKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAoY29uc3QgZnJhZ21lbnQgb2YgaWdub3JlZFBhdGhGcmFnbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRQYXRoLmluY2x1ZGVzKGZyYWdtZW50KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgcmVhZFRpbWVJbmZvRW50cmllcyA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXdFbnRyaWVzID0gd2F0Y2hlci5nZXRUaW1lSW5mb0VudHJpZXMoKSBhcyBNYXA8XG4gICAgICAgICAgICBzdHJpbmcsXG4gICAgICAgICAgICBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5XG4gICAgICAgICAgPjtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkRW50cmllcyA9IG5ldyBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PigpO1xuICAgICAgICAgIGZvciAoY29uc3QgW3BhdGgsIGluZm9dIG9mIHJhd0VudHJpZXMpIHtcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRFbnRyaWVzLnNldChub3JtYWxpemVQYXRoKHBhdGgpLCBpbmZvKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRFbnRyaWVzO1xuICAgICAgICB9O1xuXG4gICAgICAgIGxldCByZWJ1aWxkUXVldWUgPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAgICAgICBjb25zdCBlbnF1ZXVlID0gKHRhc2s6ICgpID0+IFByb21pc2U8dm9pZD4pID0+IHtcbiAgICAgICAgICByZWJ1aWxkUXVldWUgPSByZWJ1aWxkUXVldWUudGhlbih0YXNrKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBwcm9jZXNzIGZpbGUgY2hhbmdlJywgZXJyb3IpO1xuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJldHVybiByZWJ1aWxkUXVldWU7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZnVsbFJlYnVpbGQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgdGhpcy5jbGVhckRpc2NvdmVyZWRFbnRyaWVzQ2FjaGUoKTtcbiAgICAgICAgICBjb25zdCBuZXdJbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICAgICAgb3B0aW9ucy5pbnB1dEZpbGVzID0gbmV3SW5wdXRGaWxlcztcblxuICAgICAgICAgIGF3YWl0IHN0ZXBzQ3R4LmRpc3Bvc2UoKTtcbiAgICAgICAgICBjb25zdCB7IGNvbnRleHQ6IG5ld1N0ZXBzQ3R4IH0gPVxuICAgICAgICAgICAgYXdhaXQgdGhpcy5idWlsZFN0ZXBzRnVuY3Rpb24ob3B0aW9ucyk7XG4gICAgICAgICAgaWYgKCFuZXdTdGVwc0N0eCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCBzdGVwcyBidWlsZCBjb250ZXh0IGFmdGVyIHJlYnVpbGQnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzdGVwc0N0eCA9IG5ld1N0ZXBzQ3R4O1xuXG4gICAgICAgICAgYXdhaXQgd29ya2Zsb3dzQ3R4LmludGVyaW1CdW5kbGVDdHguZGlzcG9zZSgpO1xuICAgICAgICAgIGNvbnN0IG5ld1dvcmtmbG93c0N0eCA9IGF3YWl0IHRoaXMuYnVpbGRXb3JrZmxvd3NGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAhbmV3V29ya2Zsb3dzQ3R4Py5pbnRlcmltQnVuZGxlQ3R4IHx8XG4gICAgICAgICAgICAhbmV3V29ya2Zsb3dzQ3R4Py5idW5kbGVGaW5hbFxuICAgICAgICAgICkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCB3b3JrZmxvd3MgYnVuZGxlIGNvbnRleHQgYWZ0ZXIgcmVidWlsZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHdvcmtmbG93c0N0eCA9IHtcbiAgICAgICAgICAgIGludGVyaW1CdW5kbGVDdHg6IG5ld1dvcmtmbG93c0N0eC5pbnRlcmltQnVuZGxlQ3R4LFxuICAgICAgICAgICAgYnVuZGxlRmluYWw6IG5ld1dvcmtmbG93c0N0eC5idW5kbGVGaW5hbCxcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IGlzV2F0Y2hhYmxlRmlsZSA9IChwYXRoOiBzdHJpbmcpID0+XG4gICAgICAgICAgd2F0Y2hhYmxlRXh0ZW5zaW9ucy5oYXMoZXh0bmFtZShwYXRoKSk7XG5cbiAgICAgICAgY29uc3Qgbm9ybWFsaXplV2F0Y2hwYWNrUGF0aHMgPSAocGF0aHM/OiBJdGVyYWJsZTxzdHJpbmc+KSA9PiB7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGlmICghcGF0aHMpIHtcbiAgICAgICAgICAgIHJldHVybiBub3JtYWxpemVkUGF0aHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IG5vcm1hbGl6ZVBhdGgocGF0aCk7XG4gICAgICAgICAgICBpZiAoaXNXYXRjaGFibGVGaWxlKG5vcm1hbGl6ZWRQYXRoKSkge1xuICAgICAgICAgICAgICBub3JtYWxpemVkUGF0aHMucHVzaChub3JtYWxpemVkUGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRocztcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCB1bmlxdWUgPSAocGF0aHM6IHN0cmluZ1tdKSA9PiBbLi4ubmV3IFNldChwYXRocyldO1xuXG4gICAgICAgIGNvbnN0IGdldENvbXBhcmFibGVUaW1lc3RhbXAgPSAoZW50cnk6IFdhdGNocGFja1RpbWVJbmZvRW50cnkpID0+XG4gICAgICAgICAgZW50cnkudGltZXN0YW1wID8/IGVudHJ5LnNhZmVUaW1lO1xuXG4gICAgICAgIGNvbnN0IGZpbmRSZW1vdmVkRmlsZXMgPSAoXG4gICAgICAgICAgY3VycmVudEVudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+LFxuICAgICAgICAgIHByZXZpb3VzRW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT5cbiAgICAgICAgKSA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcHJldmlvdXNFbnRyaWVzLmtleXMoKSkge1xuICAgICAgICAgICAgaWYgKCFjdXJyZW50RW50cmllcy5oYXMocGF0aCkgJiYgaXNXYXRjaGFibGVGaWxlKHBhdGgpKSB7XG4gICAgICAgICAgICAgIHJlbW92ZWQucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlbW92ZWQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZmluZEFkZGVkQW5kTW9kaWZpZWRGaWxlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCBhZGRlZDogc3RyaW5nW10gPSBbXTtcbiAgICAgICAgICBjb25zdCBtb2RpZmllZDogc3RyaW5nW10gPSBbXTtcblxuICAgICAgICAgIGZvciAoY29uc3QgW3BhdGgsIGluZm9dIG9mIGN1cnJlbnRFbnRyaWVzKSB7XG4gICAgICAgICAgICBpZiAoIWlzV2F0Y2hhYmxlRmlsZShwYXRoKSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBwcmV2aW91c0VudHJpZXMuZ2V0KHBhdGgpO1xuICAgICAgICAgICAgaWYgKCFwcmV2aW91cykge1xuICAgICAgICAgICAgICBhZGRlZC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICBnZXRDb21wYXJhYmxlVGltZXN0YW1wKGluZm8pICE9PSBnZXRDb21wYXJhYmxlVGltZXN0YW1wKHByZXZpb3VzKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgIG1vZGlmaWVkLnB1c2gocGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHsgYWRkZWQsIG1vZGlmaWVkIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgZGV0ZXJtaW5lRmlsZUNoYW5nZXMgPSAoXG4gICAgICAgICAgY3VycmVudEVudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+LFxuICAgICAgICAgIHByZXZpb3VzRW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT5cbiAgICAgICAgKTogRmlsZUNoYW5nZXMgPT4ge1xuICAgICAgICAgIGNvbnN0IHJlbW92ZWRGaWxlcyA9IGZpbmRSZW1vdmVkRmlsZXMoXG4gICAgICAgICAgICBjdXJyZW50RW50cmllcyxcbiAgICAgICAgICAgIHByZXZpb3VzRW50cmllc1xuICAgICAgICAgICk7XG4gICAgICAgICAgY29uc3QgeyBhZGRlZCwgbW9kaWZpZWQgfSA9IGZpbmRBZGRlZEFuZE1vZGlmaWVkRmlsZXMoXG4gICAgICAgICAgICBjdXJyZW50RW50cmllcyxcbiAgICAgICAgICAgIHByZXZpb3VzRW50cmllc1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWRkZWRGaWxlczogYWRkZWQsXG4gICAgICAgICAgICBtb2RpZmllZEZpbGVzOiBtb2RpZmllZCxcbiAgICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgICB9O1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG1lcmdlRmlsZUNoYW5nZXMgPSAoe1xuICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgIHByZXZpb3VzRW50cmllcyxcbiAgICAgICAgICB0aW1lc3RhbXBDaGFuZ2VzLFxuICAgICAgICAgIGV2ZW50Q2hhbmdlZEZpbGVzLFxuICAgICAgICAgIGV2ZW50UmVtb3ZlZEZpbGVzLFxuICAgICAgICB9OiB7XG4gICAgICAgICAgY3VycmVudEVudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+O1xuICAgICAgICAgIHByZXZpb3VzRW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT47XG4gICAgICAgICAgdGltZXN0YW1wQ2hhbmdlczogRmlsZUNoYW5nZXM7XG4gICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICAgIGV2ZW50UmVtb3ZlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgfSk6IEZpbGVDaGFuZ2VzID0+ICh7XG4gICAgICAgICAgYWRkZWRGaWxlczogdW5pcXVlKFtcbiAgICAgICAgICAgIC4uLnRpbWVzdGFtcENoYW5nZXMuYWRkZWRGaWxlcyxcbiAgICAgICAgICAgIC4uLmV2ZW50Q2hhbmdlZEZpbGVzLmZpbHRlcihcbiAgICAgICAgICAgICAgKHBhdGgpID0+IGN1cnJlbnRFbnRyaWVzLmhhcyhwYXRoKSAmJiAhcHJldmlvdXNFbnRyaWVzLmhhcyhwYXRoKVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4udGltZXN0YW1wQ2hhbmdlcy5tb2RpZmllZEZpbGVzLFxuICAgICAgICAgICAgLi4uZXZlbnRDaGFuZ2VkRmlsZXMsXG4gICAgICAgICAgXSksXG4gICAgICAgICAgcmVtb3ZlZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4udGltZXN0YW1wQ2hhbmdlcy5yZW1vdmVkRmlsZXMsXG4gICAgICAgICAgICAuLi5ldmVudFJlbW92ZWRGaWxlcyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgY29uc3QgaGFzRmlsZUNoYW5nZXMgPSAoe1xuICAgICAgICAgIGFkZGVkRmlsZXMsXG4gICAgICAgICAgbW9kaWZpZWRGaWxlcyxcbiAgICAgICAgICByZW1vdmVkRmlsZXMsXG4gICAgICAgIH06IEZpbGVDaGFuZ2VzKSA9PlxuICAgICAgICAgIGFkZGVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIG1vZGlmaWVkRmlsZXMubGVuZ3RoID4gMCB8fFxuICAgICAgICAgIHJlbW92ZWRGaWxlcy5sZW5ndGggPiAwO1xuXG4gICAgICAgIGxldCBpc0luaXRpYWwgPSB0cnVlO1xuXG4gICAgICAgIHdhdGNoZXIub24oXG4gICAgICAgICAgJ2FnZ3JlZ2F0ZWQnLFxuICAgICAgICAgIChjaGFuZ2VzPzogU2V0PHN0cmluZz4sIHJlbW92YWxzPzogU2V0PHN0cmluZz4pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRFbnRyaWVzID0gcmVhZFRpbWVJbmZvRW50cmllcygpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRDaGFuZ2VkRmlsZXMgPSBub3JtYWxpemVXYXRjaHBhY2tQYXRocyhjaGFuZ2VzKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50UmVtb3ZlZEZpbGVzID0gbm9ybWFsaXplV2F0Y2hwYWNrUGF0aHMocmVtb3ZhbHMpO1xuICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wQ2hhbmdlcyA9IGRldGVybWluZUZpbGVDaGFuZ2VzKFxuICAgICAgICAgICAgICBjdXJyZW50RW50cmllcyxcbiAgICAgICAgICAgICAgcHJldmlvdXNUaW1lSW5mb1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgY29uc3QgZmlsZUNoYW5nZXMgPSBtZXJnZUZpbGVDaGFuZ2VzKHtcbiAgICAgICAgICAgICAgY3VycmVudEVudHJpZXMsXG4gICAgICAgICAgICAgIHByZXZpb3VzRW50cmllczogcHJldmlvdXNUaW1lSW5mbyxcbiAgICAgICAgICAgICAgdGltZXN0YW1wQ2hhbmdlcyxcbiAgICAgICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXMsXG4gICAgICAgICAgICAgIGV2ZW50UmVtb3ZlZEZpbGVzLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByZXZpb3VzVGltZUluZm8gPSBjdXJyZW50RW50cmllcztcblxuICAgICAgICAgICAgaWYgKGlzSW5pdGlhbCkge1xuICAgICAgICAgICAgICBpc0luaXRpYWwgPSBmYWxzZTtcbiAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGV2ZW50Q2hhbmdlZEZpbGVzLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgIGV2ZW50UmVtb3ZlZEZpbGVzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFoYXNGaWxlQ2hhbmdlcyhmaWxlQ2hhbmdlcykpIHtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBlbnF1ZXVlKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgYXdhaXQgZnVsbFJlYnVpbGQoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICB3YXRjaGVyLndhdGNoKHtcbiAgICAgICAgICBkaXJlY3RvcmllczogW3RoaXMuY29uZmlnLndvcmtpbmdEaXJdLFxuICAgICAgICAgIHN0YXJ0VGltZTogRGF0ZS5ub3coKSxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldElucHV0RmlsZXMoKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuICAgICAgY29uc3QgaW5wdXRGaWxlcyA9IGF3YWl0IHN1cGVyLmdldElucHV0RmlsZXMoKTtcbiAgICAgIHJldHVybiBpbnB1dEZpbGVzLmZpbHRlcigoZmlsZSkgPT4ge1xuICAgICAgICBjb25zdCBlbnRyeSA9IHJlbGF0aXZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsIGZpbGUpLnJlcGxhY2VBbGwoXG4gICAgICAgICAgJ1xcXFwnLFxuICAgICAgICAgICcvJ1xuICAgICAgICApO1xuXG4gICAgICAgIC8vIE1hdGNoIEFwcCBSb3V0ZXIgcm91dGUsIHBhZ2UsIGFuZCBsYXlvdXQgZW50cnlwb2ludHMgaW4gYXBwLyBvciBzcmMvYXBwLy5cbiAgICAgICAgaWYgKC9eKD86YXBwfHNyY1xcL2FwcClcXC8oPzouKlxcLyk/KD86cm91dGV8cGFnZXxsYXlvdXQpXFwuLy50ZXN0KGVudHJ5KSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF0Y2ggZXZlcnkgUGFnZXMgUm91dGVyIGVudHJ5cG9pbnQgaW4gcGFnZXMvIG9yIHNyYy9wYWdlcy8uXG4gICAgICAgIGlmICgvXig/OnBhZ2VzfHNyY1xcL3BhZ2VzKVxcLy8udGVzdChlbnRyeSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hdGNoIE5leHQuanMgcm9vdCBlbnRyeXBvaW50cyBhdCB0aGUgcHJvamVjdCByb290IG9yIHVuZGVyIHNyYy8uXG4gICAgICAgIHJldHVybiBbJ2luc3RydW1lbnRhdGlvbicsICdtaWRkbGV3YXJlJywgJ3Byb3h5J10uc29tZSgobmFtZSkgPT5cbiAgICAgICAgICB0aGlzLmNvbmZpZy5wYWdlRXh0ZW5zaW9ucy5zb21lKFxuICAgICAgICAgICAgKGV4dGVuc2lvbikgPT5cbiAgICAgICAgICAgICAgZW50cnkgPT09IGAke25hbWV9LiR7ZXh0ZW5zaW9ufWAgfHxcbiAgICAgICAgICAgICAgZW50cnkgPT09IGBzcmMvJHtuYW1lfS4ke2V4dGVuc2lvbn1gXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyB3cml0ZUZ1bmN0aW9uc0NvbmZpZyhvdXRwdXREaXI6IHN0cmluZykge1xuICAgICAgLy8gd2UgZG9uJ3QgcnVuIHRoaXMgaW4gZGV2ZWxvcG1lbnQgbW9kZSBhcyBpdCdzIG5vdCBuZWVkZWRcbiAgICAgIGlmIChwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBnZW5lcmF0ZWRDb25maWcgPSB7XG4gICAgICAgIHZlcnNpb246ICcwJyxcbiAgICAgICAgc3RlcHM6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtTVEVQX1FVRVVFX1RSSUdHRVJdLFxuICAgICAgICB9LFxuICAgICAgICB3b3JrZmxvd3M6IHtcbiAgICAgICAgICBtYXhEdXJhdGlvbjogJ21heCcsXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfSxcbiAgICAgIH07XG5cbiAgICAgIC8vIFdlIHdyaXRlIHRoaXMgZmlsZSB0byB0aGUgZ2VuZXJhdGVkIGRpcmVjdG9yeSBmb3JcbiAgICAgIC8vIHRoZSBOZXh0LmpzIGJ1aWxkZXIgdG8gY29uc3VtZVxuICAgICAgYXdhaXQgd3JpdGVGaWxlKFxuICAgICAgICBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2NvbmZpZy5qc29uJyksXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGdlbmVyYXRlZENvbmZpZywgbnVsbCwgMilcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBhc3luYyBidWlsZFN0ZXBzRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICAvLyBDcmVhdGUgc3RlcHMgYnVuZGxlXG4gICAgICBjb25zdCBzdGVwc1JvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ3N0ZXAnKTtcbiAgICAgIGF3YWl0IG1rZGlyKHN0ZXBzUm91dGVEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuY3JlYXRlU3RlcHNCdW5kbGUoe1xuICAgICAgICAvLyBJZiBhbnkgZHluYW1pYyByZXF1aXJlcyBhcmUgdXNlZCB3aGVuIGJ1bmRsaW5nIHdpdGggRVNNXG4gICAgICAgIC8vIGVzYnVpbGQgd2lsbCBjcmVhdGUgYSB0b28gZHluYW1pYyB3cmFwcGVyIGFyb3VuZCByZXF1aXJlXG4gICAgICAgIC8vIHdoaWNoIHR1cmJvcGFjay93ZWJwYWNrIGZhaWwgdG8gYW5hbHl6ZS4gSWYgd2UgZXh0ZXJuYWxpemVcbiAgICAgICAgLy8gY29ycmVjdGx5IHRoaXMgc2hvdWxkbid0IGJlIGFuIGlzc3VlIGFsdGhvdWdoIHdlIG1pZ2h0IHdhbnRcbiAgICAgICAgLy8gdG8gdXNlIGNqcyBhcyBhbHRlcm5hdGl2ZSB0byBhdm9pZFxuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICBvdXRmaWxlOiBqb2luKHN0ZXBzUm91dGVEaXIsICdyb3V0ZS5qcycpLFxuICAgICAgICBleHRlcm5hbGl6ZU5vblN0ZXBzOiB0cnVlLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV29ya2Zsb3dzRnVuY3Rpb24oe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgdHNjb25maWdQYXRoLFxuICAgIH06IHtcbiAgICAgIGlucHV0RmlsZXM6IHN0cmluZ1tdO1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICAgIHRzY29uZmlnUGF0aD86IHN0cmluZztcbiAgICB9KSB7XG4gICAgICBjb25zdCB3b3JrZmxvd3NSb3V0ZURpciA9IGpvaW4od29ya2Zsb3dHZW5lcmF0ZWREaXIsICdmbG93Jyk7XG4gICAgICBhd2FpdCBta2Rpcih3b3JrZmxvd3NSb3V0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICByZXR1cm4gYXdhaXQgdGhpcy5jcmVhdGVXb3JrZmxvd3NCdW5kbGUoe1xuICAgICAgICBmb3JtYXQ6ICdlc20nLFxuICAgICAgICBvdXRmaWxlOiBqb2luKHdvcmtmbG93c1JvdXRlRGlyLCAncm91dGUuanMnKSxcbiAgICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgICBpbnB1dEZpbGVzLFxuICAgICAgICB0c2NvbmZpZ1BhdGgsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGJ1aWxkV2ViaG9va1JvdXRlKHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgIH06IHtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgfSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgY29uc3Qgd2ViaG9va1JvdXRlRmlsZSA9IGpvaW4oXG4gICAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAnd2ViaG9vay9bdG9rZW5dL3JvdXRlLmpzJ1xuICAgICAgKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICAgIG91dGZpbGU6IHdlYmhvb2tSb3V0ZUZpbGUsXG4gICAgICAgIGJ1bmRsZTogZmFsc2UsIC8vIE5leHQuanMgZG9lc24ndCBuZWVkIGJ1bmRsaW5nXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGFzeW5jIGZpbmRBcHBEaXJlY3RvcnkoKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICAgIGNvbnN0IGFwcERpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ2FwcCcpO1xuICAgICAgY29uc3Qgc3JjQXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnc3JjL2FwcCcpO1xuICAgICAgY29uc3QgcGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdwYWdlcycpO1xuICAgICAgY29uc3Qgc3JjUGFnZXNEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvcGFnZXMnKTtcblxuICAgICAgLy8gSGVscGVyIHRvIGNoZWNrIGlmIGEgcGF0aCBleGlzdHMgYW5kIGlzIGEgZGlyZWN0b3J5XG4gICAgICBjb25zdCBpc0RpcmVjdG9yeSA9IGFzeW5jIChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBhd2FpdCBhY2Nlc3MocGF0aCwgY29uc3RhbnRzLkZfT0spO1xuICAgICAgICAgIGNvbnN0IHN0YXRzID0gYXdhaXQgc3RhdChwYXRoKTtcbiAgICAgICAgICBpZiAoIXN0YXRzLmlzRGlyZWN0b3J5KCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUGF0aCBleGlzdHMgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeTogJHtwYXRofWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGlmIChlIGluc3RhbmNlb2YgRXJyb3IgJiYgZS5tZXNzYWdlLmluY2x1ZGVzKCdub3QgYSBkaXJlY3RvcnknKSkge1xuICAgICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBpZiBhcHAgZGlyZWN0b3J5IGV4aXN0c1xuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KGFwcERpcikpIHtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgaWYgc3JjL2FwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3Rvcnkoc3JjQXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiBubyBhcHAgZGlyZWN0b3J5IGV4aXN0cywgY2hlY2sgZm9yIHBhZ2VzIGRpcmVjdG9yeSBhbmQgY3JlYXRlIGFwcCBuZXh0IHRvIGl0XG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkocGFnZXNEaXIpKSB7XG4gICAgICAgIC8vIENyZWF0ZSBhcHAgZGlyZWN0b3J5IG5leHQgdG8gcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKGFwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBhcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNQYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIHNyYy9hcHAgZGlyZWN0b3J5IG5leHQgdG8gc3JjL3BhZ2VzIGRpcmVjdG9yeVxuICAgICAgICBhd2FpdCBta2RpcihzcmNBcHBEaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICByZXR1cm4gc3JjQXBwRGlyO1xuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDb3VsZCBub3QgZmluZCBOZXh0LmpzIGFwcCBvciBwYWdlcyBkaXJlY3RvcnkuIEV4cGVjdGVkIG9uZSBvZjogXCJhcHBcIiwgXCJzcmMvYXBwXCIsIFwicGFnZXNcIiwgb3IgXCJzcmMvcGFnZXNcIiB0byBleGlzdC4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIENhY2hlZE5leHRCdWlsZGVyRWFnZXIgPSBOZXh0QnVpbGRlcjtcbiAgcmV0dXJuIE5leHRCdWlsZGVyO1xufVxuIl19
package/dist/builder.d.ts CHANGED
@@ -1,5 +1,2 @@
1
- export declare const DEFERRED_BUILDER_MIN_VERSION = "16.2.0-canary.48";
2
- export declare const WORKFLOW_DEFERRED_ENTRIES: readonly ["/.well-known/workflow/v1/flow", "/.well-known/workflow/v1/step", "/.well-known/workflow/v1/webhook/[token]"];
3
- export declare function shouldUseDeferredBuilder(nextVersion: string): boolean;
4
- export declare function getNextBuilder(nextVersion: string): Promise<any>;
1
+ export declare function getNextBuilder(_nextVersion: string): Promise<any>;
5
2
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,eAAO,MAAM,yBAAyB,yHAI5B,CAAC;AAIX,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAerE;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,gBAMvD"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,gBAExD"}
package/dist/builder.js CHANGED
@@ -1,34 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WORKFLOW_DEFERRED_ENTRIES = exports.DEFERRED_BUILDER_MIN_VERSION = void 0;
7
- exports.shouldUseDeferredBuilder = shouldUseDeferredBuilder;
8
3
  exports.getNextBuilder = getNextBuilder;
9
- const semver_1 = __importDefault(require("semver"));
10
- const builder_deferred_js_1 = require("./builder-deferred.js");
11
4
  const builder_eager_js_1 = require("./builder-eager.js");
12
- exports.DEFERRED_BUILDER_MIN_VERSION = '16.2.0-canary.48';
13
- exports.WORKFLOW_DEFERRED_ENTRIES = [
14
- '/.well-known/workflow/v1/flow',
15
- '/.well-known/workflow/v1/step',
16
- '/.well-known/workflow/v1/webhook/[token]',
17
- ];
18
- let warnedAboutFlagAndVersion = false;
19
- function shouldUseDeferredBuilder(nextVersion) {
20
- const flagEnabled = Boolean(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
21
- const versionCompatible = semver_1.default.gte(nextVersion, exports.DEFERRED_BUILDER_MIN_VERSION);
22
- if (flagEnabled && !versionCompatible && !warnedAboutFlagAndVersion) {
23
- warnedAboutFlagAndVersion = true;
24
- console.warn(`Enabled lazyDiscovery but Next.js version is not compatible, needs ${exports.DEFERRED_BUILDER_MIN_VERSION} have ${nextVersion}`);
25
- }
26
- return flagEnabled && versionCompatible;
27
- }
28
- async function getNextBuilder(nextVersion) {
29
- if (shouldUseDeferredBuilder(nextVersion)) {
30
- return (0, builder_deferred_js_1.getNextBuilderDeferred)();
31
- }
5
+ async function getNextBuilder(_nextVersion) {
32
6
  return (0, builder_eager_js_1.getNextBuilderEager)();
33
7
  }
34
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQWNBLDREQWVDO0FBRUQsd0NBTUM7QUFyQ0Qsb0RBQTRCO0FBQzVCLCtEQUErRDtBQUMvRCx5REFBeUQ7QUFFNUMsUUFBQSw0QkFBNEIsR0FBRyxrQkFBa0IsQ0FBQztBQUVsRCxRQUFBLHlCQUF5QixHQUFHO0lBQ3ZDLCtCQUErQjtJQUMvQiwrQkFBK0I7SUFDL0IsMENBQTBDO0NBQ2xDLENBQUM7QUFFWCxJQUFJLHlCQUF5QixHQUFHLEtBQUssQ0FBQztBQUV0QyxTQUFnQix3QkFBd0IsQ0FBQyxXQUFtQjtJQUMxRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0saUJBQWlCLEdBQUcsZ0JBQU0sQ0FBQyxHQUFHLENBQ2xDLFdBQVcsRUFDWCxvQ0FBNEIsQ0FDN0IsQ0FBQztJQUVGLElBQUksV0FBVyxJQUFJLENBQUMsaUJBQWlCLElBQUksQ0FBQyx5QkFBeUIsRUFBRSxDQUFDO1FBQ3BFLHlCQUF5QixHQUFHLElBQUksQ0FBQztRQUNqQyxPQUFPLENBQUMsSUFBSSxDQUNWLHNFQUFzRSxvQ0FBNEIsU0FBUyxXQUFXLEVBQUUsQ0FDekgsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLFdBQVcsSUFBSSxpQkFBaUIsQ0FBQztBQUMxQyxDQUFDO0FBRU0sS0FBSyxVQUFVLGNBQWMsQ0FBQyxXQUFtQjtJQUN0RCxJQUFJLHdCQUF3QixDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDMUMsT0FBTyxJQUFBLDRDQUFzQixHQUFFLENBQUM7SUFDbEMsQ0FBQztJQUVELE9BQU8sSUFBQSxzQ0FBbUIsR0FBRSxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgc2VtdmVyIGZyb20gJ3NlbXZlcic7XG5pbXBvcnQgeyBnZXROZXh0QnVpbGRlckRlZmVycmVkIH0gZnJvbSAnLi9idWlsZGVyLWRlZmVycmVkLmpzJztcbmltcG9ydCB7IGdldE5leHRCdWlsZGVyRWFnZXIgfSBmcm9tICcuL2J1aWxkZXItZWFnZXIuanMnO1xuXG5leHBvcnQgY29uc3QgREVGRVJSRURfQlVJTERFUl9NSU5fVkVSU0lPTiA9ICcxNi4yLjAtY2FuYXJ5LjQ4JztcblxuZXhwb3J0IGNvbnN0IFdPUktGTE9XX0RFRkVSUkVEX0VOVFJJRVMgPSBbXG4gICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycsXG4gICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvc3RlcCcsXG4gICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay9bdG9rZW5dJyxcbl0gYXMgY29uc3Q7XG5cbmxldCB3YXJuZWRBYm91dEZsYWdBbmRWZXJzaW9uID0gZmFsc2U7XG5cbmV4cG9ydCBmdW5jdGlvbiBzaG91bGRVc2VEZWZlcnJlZEJ1aWxkZXIobmV4dFZlcnNpb246IHN0cmluZyk6IGJvb2xlYW4ge1xuICBjb25zdCBmbGFnRW5hYmxlZCA9IEJvb2xlYW4ocHJvY2Vzcy5lbnYuV09SS0ZMT1dfTkVYVF9MQVpZX0RJU0NPVkVSWSk7XG4gIGNvbnN0IHZlcnNpb25Db21wYXRpYmxlID0gc2VtdmVyLmd0ZShcbiAgICBuZXh0VmVyc2lvbixcbiAgICBERUZFUlJFRF9CVUlMREVSX01JTl9WRVJTSU9OXG4gICk7XG5cbiAgaWYgKGZsYWdFbmFibGVkICYmICF2ZXJzaW9uQ29tcGF0aWJsZSAmJiAhd2FybmVkQWJvdXRGbGFnQW5kVmVyc2lvbikge1xuICAgIHdhcm5lZEFib3V0RmxhZ0FuZFZlcnNpb24gPSB0cnVlO1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgIGBFbmFibGVkIGxhenlEaXNjb3ZlcnkgYnV0IE5leHQuanMgdmVyc2lvbiBpcyBub3QgY29tcGF0aWJsZSwgbmVlZHMgJHtERUZFUlJFRF9CVUlMREVSX01JTl9WRVJTSU9OfSBoYXZlICR7bmV4dFZlcnNpb259YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZmxhZ0VuYWJsZWQgJiYgdmVyc2lvbkNvbXBhdGlibGU7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlcihuZXh0VmVyc2lvbjogc3RyaW5nKSB7XG4gIGlmIChzaG91bGRVc2VEZWZlcnJlZEJ1aWxkZXIobmV4dFZlcnNpb24pKSB7XG4gICAgcmV0dXJuIGdldE5leHRCdWlsZGVyRGVmZXJyZWQoKTtcbiAgfVxuXG4gIHJldHVybiBnZXROZXh0QnVpbGRlckVhZ2VyKCk7XG59XG4iXX0=
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsd0NBRUM7QUFKRCx5REFBeUQ7QUFFbEQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxZQUFvQjtJQUN2RCxPQUFPLElBQUEsc0NBQW1CLEdBQUUsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TmV4dEJ1aWxkZXJFYWdlciB9IGZyb20gJy4vYnVpbGRlci1lYWdlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlcihfbmV4dFZlcnNpb246IHN0cmluZykge1xuICByZXR1cm4gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpO1xufVxuIl19
package/dist/index.d.ts CHANGED
@@ -3,7 +3,6 @@ export declare function withWorkflow(nextConfigOrFn: NextConfig | ((phase: strin
3
3
  defaultConfig: NextConfig;
4
4
  }) => Promise<NextConfig>), { workflows, }?: {
5
5
  workflows?: {
6
- lazyDiscovery?: boolean;
7
6
  local?: {
8
7
  port?: number;
9
8
  };
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA0MvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACE,IAsBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBA6NrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA8QvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACE,IAkBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAuLrC"}