@anansi/core 0.20.39 → 0.20.40

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/CHANGELOG.md CHANGED
@@ -3,6 +3,16 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ ## [0.20.40](/github.com/ntucker/anansi/compare/@anansi/core@0.20.39...@anansi/core@0.20.40) (2025-11-15)
7
+
8
+ ### 🐛 Bug Fix
9
+
10
+ * Properly handle fallbacks to node_modules in multiple directories ([#2864](/github.com/ntucker/anansi/issues/2864)) ([136bcb5](/github.com/ntucker/anansi/commit/136bcb5a2a3a895931200f16eeccd7c3b071b11b))
11
+
12
+ ### 📦 Package
13
+
14
+ * Update all non-major dependencies ([#2866](/github.com/ntucker/anansi/issues/2866)) ([930d19a](/github.com/ntucker/anansi/commit/930d19aa7ff8768fb2ba9f220543374435c25fbf))
15
+
6
16
  ## [0.20.39](/github.com/ntucker/anansi/compare/@anansi/core@0.20.38...@anansi/core@0.20.39) (2025-11-09)
7
17
 
8
18
  ### 🐛 Bug Fix
@@ -0,0 +1,16 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { type IUnionFs } from 'unionfs';
3
+ /**
4
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
5
+ * with Node's native require (for bare specifiers from project node_modules).
6
+ *
7
+ * This solves the issue where fs-require cannot resolve bare specifiers like
8
+ * `@anansi/core/server` from workspace node_modules when they're not in the
9
+ * memfs bundle.
10
+ *
11
+ * @param ufs - The unionfs instance (disk first, then memfs)
12
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
13
+ * @returns A require function that tries memfs first, then falls back to project node_modules
14
+ */
15
+ export declare function createHybridRequire(ufs: IUnionFs, projectRoot?: string): ReturnType<typeof createFsRequire>;
16
+ //# sourceMappingURL=createHybridRequire.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"createHybridRequire.d.ts","sourceRoot":"","sources":["../../src/scripts/createHybridRequire.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,SAAS,CAAC;AAExC;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,QAAQ,EACb,WAAW,GAAE,MAAsB,GAClC,UAAU,CAAC,OAAO,eAAe,CAAC,CAqBpC"}
@@ -0,0 +1,36 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ /**
5
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
6
+ * with Node's native require (for bare specifiers from project node_modules).
7
+ *
8
+ * This solves the issue where fs-require cannot resolve bare specifiers like
9
+ * `@anansi/core/server` from workspace node_modules when they're not in the
10
+ * memfs bundle.
11
+ *
12
+ * @param ufs - The unionfs instance (disk first, then memfs)
13
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
14
+ * @returns A require function that tries memfs first, then falls back to project node_modules
15
+ */
16
+ export function createHybridRequire(ufs, projectRoot = process.cwd()) {
17
+ const fsRequire = createFsRequire(ufs);
18
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
19
+ function hybridRequire(id) {
20
+ try {
21
+ return fsRequire(id);
22
+ } catch (error) {
23
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
24
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
25
+ return projectRequire(id);
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ // Preserve cache and resolve properties from fsRequire
32
+ hybridRequire.cache = fsRequire.cache;
33
+ hybridRequire.resolve = fsRequire.resolve;
34
+ return hybridRequire;
35
+ }
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGc1JlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwicGF0aCIsImNyZWF0ZUh5YnJpZFJlcXVpcmUiLCJ1ZnMiLCJwcm9qZWN0Um9vdCIsInByb2Nlc3MiLCJjd2QiLCJmc1JlcXVpcmUiLCJwcm9qZWN0UmVxdWlyZSIsImpvaW4iLCJoeWJyaWRSZXF1aXJlIiwiaWQiLCJlcnJvciIsImlzQmFyZSIsInN0YXJ0c1dpdGgiLCJpc0Fic29sdXRlIiwiY29kZSIsImNhY2hlIiwicmVzb2x2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL2NyZWF0ZUh5YnJpZFJlcXVpcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRnNSZXF1aXJlIH0gZnJvbSAnZnMtcmVxdWlyZSc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHlwZSBJVW5pb25GcyB9IGZyb20gJ3VuaW9uZnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoeWJyaWQgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IGNvbWJpbmVzIGZzLXJlcXVpcmUgKGZvciBpbi1tZW1vcnkgZmlsZXMpXG4gKiB3aXRoIE5vZGUncyBuYXRpdmUgcmVxdWlyZSAoZm9yIGJhcmUgc3BlY2lmaWVycyBmcm9tIHByb2plY3Qgbm9kZV9tb2R1bGVzKS5cbiAqXG4gKiBUaGlzIHNvbHZlcyB0aGUgaXNzdWUgd2hlcmUgZnMtcmVxdWlyZSBjYW5ub3QgcmVzb2x2ZSBiYXJlIHNwZWNpZmllcnMgbGlrZVxuICogYEBhbmFuc2kvY29yZS9zZXJ2ZXJgIGZyb20gd29ya3NwYWNlIG5vZGVfbW9kdWxlcyB3aGVuIHRoZXkncmUgbm90IGluIHRoZVxuICogbWVtZnMgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSB1ZnMgLSBUaGUgdW5pb25mcyBpbnN0YW5jZSAoZGlzayBmaXJzdCwgdGhlbiBtZW1mcylcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIE9wdGlvbmFsIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIHByb2Nlc3MuY3dkKClcbiAqIEByZXR1cm5zIEEgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IHRyaWVzIG1lbWZzIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gcHJvamVjdCBub2RlX21vZHVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZFJlcXVpcmUoXG4gIHVmczogSVVuaW9uRnMsXG4gIHByb2plY3RSb290OiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRnNSZXF1aXJlPiB7XG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUZzUmVxdWlyZSh1ZnMpO1xuICBjb25zdCBwcm9qZWN0UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUocGF0aC5qb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJykpO1xuXG4gIGZ1bmN0aW9uIGh5YnJpZFJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnNSZXF1aXJlKGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc0JhcmUgPSAhaWQuc3RhcnRzV2l0aCgnLicpICYmICFwYXRoLmlzQWJzb2x1dGUoaWQpO1xuICAgICAgaWYgKGlzQmFyZSAmJiBlcnJvcj8uY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0UmVxdWlyZShpZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVzZXJ2ZSBjYWNoZSBhbmQgcmVzb2x2ZSBwcm9wZXJ0aWVzIGZyb20gZnNSZXF1aXJlXG4gIGh5YnJpZFJlcXVpcmUuY2FjaGUgPSBmc1JlcXVpcmUuY2FjaGU7XG4gIGh5YnJpZFJlcXVpcmUucmVzb2x2ZSA9IGZzUmVxdWlyZS5yZXNvbHZlO1xuXG4gIHJldHVybiBoeWJyaWRSZXF1aXJlIGFzIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZzUmVxdWlyZT47XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxZQUFZO0FBQzVDLFNBQVNDLGFBQWEsUUFBUSxRQUFRO0FBQ3RDLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBR3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsbUJBQW1CQSxDQUNqQ0MsR0FBYSxFQUNiQyxXQUFtQixHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQ0M7RUFDcEMsTUFBTUMsU0FBUyxHQUFHUixlQUFlLENBQUNJLEdBQUcsQ0FBQztFQUN0QyxNQUFNSyxjQUFjLEdBQUdSLGFBQWEsQ0FBQ0MsSUFBSSxDQUFDUSxJQUFJLENBQUNMLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztFQUU1RSxTQUFTTSxhQUFhQSxDQUFDQyxFQUFVLEVBQUU7SUFDakMsSUFBSTtNQUNGLE9BQU9KLFNBQVMsQ0FBQ0ksRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxPQUFPQyxLQUFVLEVBQUU7TUFDbkIsTUFBTUMsTUFBTSxHQUFHLENBQUNGLEVBQUUsQ0FBQ0csVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2MsVUFBVSxDQUFDSixFQUFFLENBQUM7TUFDMUQsSUFBSUUsTUFBTSxJQUFJRCxLQUFLLEVBQUVJLElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUNoRCxPQUFPUixjQUFjLENBQUNHLEVBQUUsQ0FBQztNQUMzQjtNQUNBLE1BQU1DLEtBQUs7SUFDYjtFQUNGOztFQUVBO0VBQ0FGLGFBQWEsQ0FBQ08sS0FBSyxHQUFHVixTQUFTLENBQUNVLEtBQUs7RUFDckNQLGFBQWEsQ0FBQ1EsT0FBTyxHQUFHWCxTQUFTLENBQUNXLE9BQU87RUFFekMsT0FBT1IsYUFBYTtBQUN0QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -0,0 +1,36 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ /**
5
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
6
+ * with Node's native require (for bare specifiers from project node_modules).
7
+ *
8
+ * This solves the issue where fs-require cannot resolve bare specifiers like
9
+ * `@anansi/core/server` from workspace node_modules when they're not in the
10
+ * memfs bundle.
11
+ *
12
+ * @param ufs - The unionfs instance (disk first, then memfs)
13
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
14
+ * @returns A require function that tries memfs first, then falls back to project node_modules
15
+ */
16
+ export function createHybridRequire(ufs, projectRoot = process.cwd()) {
17
+ const fsRequire = createFsRequire(ufs);
18
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
19
+ function hybridRequire(id) {
20
+ try {
21
+ return fsRequire(id);
22
+ } catch (error) {
23
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
24
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
25
+ return projectRequire(id);
26
+ }
27
+ throw error;
28
+ }
29
+ }
30
+
31
+ // Preserve cache and resolve properties from fsRequire
32
+ hybridRequire.cache = fsRequire.cache;
33
+ hybridRequire.resolve = fsRequire.resolve;
34
+ return hybridRequire;
35
+ }
36
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJjcmVhdGVGc1JlcXVpcmUiLCJjcmVhdGVSZXF1aXJlIiwicGF0aCIsImNyZWF0ZUh5YnJpZFJlcXVpcmUiLCJ1ZnMiLCJwcm9qZWN0Um9vdCIsInByb2Nlc3MiLCJjd2QiLCJmc1JlcXVpcmUiLCJwcm9qZWN0UmVxdWlyZSIsImpvaW4iLCJoeWJyaWRSZXF1aXJlIiwiaWQiLCJlcnJvciIsImlzQmFyZSIsInN0YXJ0c1dpdGgiLCJpc0Fic29sdXRlIiwiY29kZSIsImNhY2hlIiwicmVzb2x2ZSJdLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zY3JpcHRzL2NyZWF0ZUh5YnJpZFJlcXVpcmUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlRnNSZXF1aXJlIH0gZnJvbSAnZnMtcmVxdWlyZSc7XG5pbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbW9kdWxlJztcbmltcG9ydCBwYXRoIGZyb20gJ3BhdGgnO1xuaW1wb3J0IHsgdHlwZSBJVW5pb25GcyB9IGZyb20gJ3VuaW9uZnMnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBoeWJyaWQgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IGNvbWJpbmVzIGZzLXJlcXVpcmUgKGZvciBpbi1tZW1vcnkgZmlsZXMpXG4gKiB3aXRoIE5vZGUncyBuYXRpdmUgcmVxdWlyZSAoZm9yIGJhcmUgc3BlY2lmaWVycyBmcm9tIHByb2plY3Qgbm9kZV9tb2R1bGVzKS5cbiAqXG4gKiBUaGlzIHNvbHZlcyB0aGUgaXNzdWUgd2hlcmUgZnMtcmVxdWlyZSBjYW5ub3QgcmVzb2x2ZSBiYXJlIHNwZWNpZmllcnMgbGlrZVxuICogYEBhbmFuc2kvY29yZS9zZXJ2ZXJgIGZyb20gd29ya3NwYWNlIG5vZGVfbW9kdWxlcyB3aGVuIHRoZXkncmUgbm90IGluIHRoZVxuICogbWVtZnMgYnVuZGxlLlxuICpcbiAqIEBwYXJhbSB1ZnMgLSBUaGUgdW5pb25mcyBpbnN0YW5jZSAoZGlzayBmaXJzdCwgdGhlbiBtZW1mcylcbiAqIEBwYXJhbSBwcm9qZWN0Um9vdCAtIE9wdGlvbmFsIHByb2plY3Qgcm9vdCBkaXJlY3RvcnkuIERlZmF1bHRzIHRvIHByb2Nlc3MuY3dkKClcbiAqIEByZXR1cm5zIEEgcmVxdWlyZSBmdW5jdGlvbiB0aGF0IHRyaWVzIG1lbWZzIGZpcnN0LCB0aGVuIGZhbGxzIGJhY2sgdG8gcHJvamVjdCBub2RlX21vZHVsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZFJlcXVpcmUoXG4gIHVmczogSVVuaW9uRnMsXG4gIHByb2plY3RSb290OiBzdHJpbmcgPSBwcm9jZXNzLmN3ZCgpLFxuKTogUmV0dXJuVHlwZTx0eXBlb2YgY3JlYXRlRnNSZXF1aXJlPiB7XG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUZzUmVxdWlyZSh1ZnMpO1xuICBjb25zdCBwcm9qZWN0UmVxdWlyZSA9IGNyZWF0ZVJlcXVpcmUocGF0aC5qb2luKHByb2plY3RSb290LCAncGFja2FnZS5qc29uJykpO1xuXG4gIGZ1bmN0aW9uIGh5YnJpZFJlcXVpcmUoaWQ6IHN0cmluZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gZnNSZXF1aXJlKGlkKTtcbiAgICB9IGNhdGNoIChlcnJvcjogYW55KSB7XG4gICAgICBjb25zdCBpc0JhcmUgPSAhaWQuc3RhcnRzV2l0aCgnLicpICYmICFwYXRoLmlzQWJzb2x1dGUoaWQpO1xuICAgICAgaWYgKGlzQmFyZSAmJiBlcnJvcj8uY29kZSA9PT0gJ01PRFVMRV9OT1RfRk9VTkQnKSB7XG4gICAgICAgIHJldHVybiBwcm9qZWN0UmVxdWlyZShpZCk7XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG4gIH1cblxuICAvLyBQcmVzZXJ2ZSBjYWNoZSBhbmQgcmVzb2x2ZSBwcm9wZXJ0aWVzIGZyb20gZnNSZXF1aXJlXG4gIGh5YnJpZFJlcXVpcmUuY2FjaGUgPSBmc1JlcXVpcmUuY2FjaGU7XG4gIGh5YnJpZFJlcXVpcmUucmVzb2x2ZSA9IGZzUmVxdWlyZS5yZXNvbHZlO1xuXG4gIHJldHVybiBoeWJyaWRSZXF1aXJlIGFzIFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZzUmVxdWlyZT47XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGVBQWUsUUFBUSxZQUFZO0FBQzVDLFNBQVNDLGFBQWEsUUFBUSxRQUFRO0FBQ3RDLE9BQU9DLElBQUksTUFBTSxNQUFNO0FBR3ZCO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLE9BQU8sU0FBU0MsbUJBQW1CQSxDQUNqQ0MsR0FBYSxFQUNiQyxXQUFtQixHQUFHQyxPQUFPLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQ0M7RUFDcEMsTUFBTUMsU0FBUyxHQUFHUixlQUFlLENBQUNJLEdBQUcsQ0FBQztFQUN0QyxNQUFNSyxjQUFjLEdBQUdSLGFBQWEsQ0FBQ0MsSUFBSSxDQUFDUSxJQUFJLENBQUNMLFdBQVcsRUFBRSxjQUFjLENBQUMsQ0FBQztFQUU1RSxTQUFTTSxhQUFhQSxDQUFDQyxFQUFVLEVBQUU7SUFDakMsSUFBSTtNQUNGLE9BQU9KLFNBQVMsQ0FBQ0ksRUFBRSxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxPQUFPQyxLQUFVLEVBQUU7TUFDbkIsTUFBTUMsTUFBTSxHQUFHLENBQUNGLEVBQUUsQ0FBQ0csVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUNiLElBQUksQ0FBQ2MsVUFBVSxDQUFDSixFQUFFLENBQUM7TUFDMUQsSUFBSUUsTUFBTSxJQUFJRCxLQUFLLEVBQUVJLElBQUksS0FBSyxrQkFBa0IsRUFBRTtRQUNoRCxPQUFPUixjQUFjLENBQUNHLEVBQUUsQ0FBQztNQUMzQjtNQUNBLE1BQU1DLEtBQUs7SUFDYjtFQUNGOztFQUVBO0VBQ0FGLGFBQWEsQ0FBQ08sS0FBSyxHQUFHVixTQUFTLENBQUNVLEtBQUs7RUFDckNQLGFBQWEsQ0FBQ1EsT0FBTyxHQUFHWCxTQUFTLENBQUNXLE9BQU87RUFFekMsT0FBT1IsYUFBYTtBQUN0QiIsImlnbm9yZUxpc3QiOltdfQ==
@@ -3,7 +3,6 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, k
3
3
  return Object.prototype.hasOwnProperty.call(it, key);
4
4
  };
5
5
  import diskFs from 'fs';
6
- import { createFsRequire } from 'fs-require';
7
6
  import { createFsFromVolume, Volume } from 'memfs';
8
7
  import path from 'path';
9
8
  import sourceMapSupport from 'source-map-support';
@@ -14,6 +13,7 @@ import webpack from 'webpack';
14
13
  import logging from 'webpack/lib/logging/runtime.js';
15
14
  import WebpackDevServer from 'webpack-dev-server';
16
15
  import 'cross-fetch/dist/node-polyfill.js';
16
+ import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
18
  // run directly from node
19
19
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -36,7 +36,7 @@ export default async function startDevServer(entrypoint, env = {}) {
36
36
  const volume = new Volume();
37
37
  const fs = createFsFromVolume(volume);
38
38
  ufs.use(diskFs).use(fs);
39
- const fsRequire = createFsRequire(ufs);
39
+ const fsRequire = createHybridRequire(ufs);
40
40
  const readFile = promisify(ufs.readFile);
41
41
  // Generate a temporary file so we can hot reload from the root of the application
42
42
  function hotEntry(entryPath) {
@@ -229,4 +229,4 @@ export default async function startDevServer(entrypoint, env = {}) {
229
229
  });
230
230
  runServer();
231
231
  }
232
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzUmVxdWlyZSIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiZ2V0V2VicGFja0NvbmZpZyIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRSZW5kZXIiLCJyZW5kZXIiLCJhcmdzIiwicHVzaCIsImltcG9ydFJlbmRlciIsInN0YXRzIiwiY2xpZW50U3RhdHMiLCJjb21waWxhdGlvbiIsImVycm9ycyIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImluZm8iLCJjbGllbnRNYW5pZmVzdCIsInRoZW4iLCJidWYiLCJ0b1N0cmluZyIsImtleXMiLCJjYWNoZSIsImZvckVhY2giLCJkZWZhdWx0IiwiYmluZCIsInVuZGVmaW5lZCIsImluaXQiLCJlIiwiZGV2U2VydmVyIiwiZGV2TWlkZGxld2FyZSIsIm91dHB1dEZpbGVTeXN0ZW0iLCJzZXR1cE1pZGRsZXdhcmVzIiwibWlkZGxld2FyZXMiLCJFcnJvciIsIm90aGVyUm91dGVzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsInByb3h5IiwiZmlsdGVyIiwiZmxhdE1hcCIsImNvbnRleHQiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJ1cmwiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBjcmVhdGVGc1JlcXVpcmUgfSBmcm9tICdmcy1yZXF1aXJlJztcbmltcG9ydCB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IGNyZWF0ZUZzRnJvbVZvbHVtZSwgVm9sdW1lIH0gZnJvbSAnbWVtZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc291cmNlTWFwU3VwcG9ydCBmcm9tICdzb3VyY2UtbWFwLXN1cHBvcnQnO1xuaW1wb3J0IHRtcCBmcm9tICd0bXAnO1xuaW1wb3J0IHsgdWZzIH0gZnJvbSAndW5pb25mcyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCB3ZWJwYWNrLCB7IHR5cGUgQ29uZmlndXJhdGlvbiwgdHlwZSBNdWx0aUNvbmZpZ3VyYXRpb24gfSBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCBsb2dnaW5nIGZyb20gJ3dlYnBhY2svbGliL2xvZ2dpbmcvcnVudGltZS5qcyc7XG5pbXBvcnQgV2VicGFja0RldlNlcnZlciBmcm9tICd3ZWJwYWNrLWRldi1zZXJ2ZXInO1xuXG5pbXBvcnQgJ2Nyb3NzLWZldGNoL2Rpc3Qvbm9kZS1wb2x5ZmlsbC5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlRnNSZXF1aXJlKHVmcyk7XG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZm4ocmVxLCByZXMpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBuZXh0KHgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBsZXQgaW5pdFJlbmRlcjpcbiAgICB8IHsgYXJnczogUGFyYW1ldGVyczxCb3VuZFJlbmRlcj47IHJlc29sdmU6ICgpID0+IHZvaWQgfVtdXG4gICAgfCB1bmRlZmluZWQgPSBbXTtcbiAgbGV0IHJlbmRlcjogQm91bmRSZW5kZXIgPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGluaXRSZW5kZXI/LnB1c2goeyBhcmdzLCByZXNvbHZlIH0pO1xuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIGltcG9ydFJlbmRlcihzdGF0czogd2VicGFjay5TdGF0c1tdKSB7XG4gICAgY29uc3QgW2NsaWVudFN0YXRzLCBzZXJ2ZXJTdGF0c10gPSBzdGF0cztcbiAgICBpZiAoXG4gICAgICBjbGllbnRTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoIHx8XG4gICAgICBzZXJ2ZXJTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3IgY2xpZW50IGJ1aWxkOiAnICsgY2xpZW50U3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBzZXJ2ZXIgYnVpbGQ6ICcgKyBzZXJ2ZXJTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgLy8gZmlyc3QgdGltZSwgcmF0aGVyIHRoYW4gcmUtcmVuZGVyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0UmVuZGVyKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKCdBYm92ZSBjb21waWxlciBlcnJvcnMgYmxvY2tpbmcgcmVsb2FkJyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKCdMYXVuY2hpbmcgU1NSJyk7XG4gICAgfVxuXG4gICAgLy8gQVNTRVRTXG4gICAgY29uc3QgY2xpZW50TWFuaWZlc3QgPSBjbGllbnRTdGF0cy50b0pzb24oKTtcblxuICAgIHNlcnZlckVudHJ5ID0gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzKTtcbiAgICBzZXJ2ZXJGaWxlQ29udGVudHMgPSByZWFkRmlsZShzZXJ2ZXJFbnRyeSkudGhlbihidWYgPT4gYnVmLnRvU3RyaW5nKCkpO1xuICAgIC8vIHJlbG9hZCBtb2R1bGVzXG4gICAgT2JqZWN0LmtleXMoZnNSZXF1aXJlLmNhY2hlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBkZWxldGUgZnNSZXF1aXJlLmNhY2hlW2tleV07XG4gICAgfSk7XG4gICAgcmVuZGVyID0gKGZzUmVxdWlyZShzZXJ2ZXJFbnRyeSkgYXMgYW55KS5kZWZhdWx0LmJpbmQoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGllbnRNYW5pZmVzdCxcbiAgICApO1xuICAgIC8vIFNFUlZFUiBTSURFIEVOVFJZUE9JTlRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0UmVuZGVyKSkge1xuICAgICAgaW5pdFJlbmRlci5mb3JFYWNoKGFzeW5jIGluaXQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5pbmZvKCdSZXNvbHZpbmcgcXVldWVkIHJlcXVlc3RzJyk7XG4gICAgICAgICAgYXdhaXQgcmVuZGVyKC4uLmluaXQuYXJncyk7XG4gICAgICAgICAgaW5pdC5yZXNvbHZlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byByZW5kZXIgcXVldWVkIHJlcXVlc3RzJyk7XG4gICAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGluaXRSZW5kZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGV2U2VydmVyID0gbmV3IFdlYnBhY2tEZXZTZXJ2ZXIoXG4gICAgLy8gd3JpdGUgdG8gbWVtb3J5IGZpbGVzeXN0ZW0gc28gd2UgY2FuIGltcG9ydFxuICAgIHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcixcbiAgICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0/LmRldlNlcnZlcj8uZGV2TWlkZGxld2FyZSxcbiAgICAgICAgb3V0cHV0RmlsZVN5c3RlbToge1xuICAgICAgICAgIC4uLmZzLFxuICAgICAgICAgIGpvaW46IHBhdGguam9pbiBhcyBhbnksXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgfSxcbiAgICAgIHNldHVwTWlkZGxld2FyZXM6IChtaWRkbGV3YXJlcywgZGV2U2VydmVyKSA9PiB7XG4gICAgICAgIGlmICghZGV2U2VydmVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJwYWNrLWRldi1zZXJ2ZXIgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG90aGVyUm91dGVzID0gW1xuICAgICAgICAgIHByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEgsXG4gICAgICAgICAgLi4uKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8ucHJveHlcbiAgICAgICAgICAgID8uZmlsdGVyKHByb3h5ID0+IHR5cGVvZiBwcm94eSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICA/LmZsYXRNYXAocHJveHkgPT4gcHJveHkuY29udGV4dCkgPz8gW10pLFxuICAgICAgICBdO1xuICAgICAgICAvLyBzZXJ2ZSBTU1IgZm9yIG5vbi1XRUJQQUNLX1BVQkxJQ19QQVRIXG4gICAgICAgIGRldlNlcnZlci5hcHA/LmdldChcbiAgICAgICAgICBuZXcgUmVnRXhwKGBeKD8hJHtvdGhlclJvdXRlcy5qb2luKCd8Jyl9KWApLFxuICAgICAgICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICAgICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignRmF0YWw6JywgZXJyb3IpO1xuICAgICAgICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0VDT05OUkVTRVQgaXMgdXN1YWxseSBkdWUgdG8gYnJvd3NlciBjbG9zaW5nIHRoZSBjb25uZWN0aW9uJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgcmVuZGVyKHJlcSwgcmVzKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAod2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5zZXR1cE1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgcmV0dXJuIHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlci5zZXR1cE1pZGRsZXdhcmVzKFxuICAgICAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgICAgICBkZXZTZXJ2ZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlcztcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21waWxlcixcbiAgKTtcbiAgY29uc3QgcnVuU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRldlNlcnZlci5zdGFydCgpO1xuICAgIGRldlNlcnZlci5jb21waWxlci5ob29rcy5kb25lLnRhcChcbiAgICAgICdBbmFuc2kgU2VydmVyJyxcbiAgICAgIChtdWx0aVN0YXRzOiB3ZWJwYWNrLk11bHRpU3RhdHMgfCB3ZWJwYWNrLlN0YXRzKSA9PiB7XG4gICAgICAgIGlmICghbXVsdGlTdGF0cykge1xuICAgICAgICAgIGxvZy5lcnJvcignc3RhdHMgbm90IHNlbmQnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKG11bHRpU3RhdHMsICdzdGF0cycpKSByZXR1cm47XG4gICAgICAgIGlmICgobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW1wb3J0UmVuZGVyKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2ZSBlbnRyeXBvaW50Jyk7XG4gICAgICAgICAgICBjb25zdCBmaW5kZXIgPSBuZXcgUmVnRXhwKGAke3NlcnZlckVudHJ5fTooW1xcXFxkXSspOihbXFxcXGRdKylgLCAnZycpO1xuICAgICAgICAgICAgc2VydmVyRmlsZUNvbnRlbnRzLnRoZW4oZmlsZVRleHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0ZXh0Um93cyA9IGZpbGVUZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCc+Pj4gU3RhY2sgQ29udGV4dCBbc2VydmUgZW50cnlwb2ludF0gPDw8Jyk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZS5zdGFjay5tYXRjaEFsbChmaW5kZXIpID8/IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihwYXRoLmJhc2VuYW1lKHNlcnZlckVudHJ5KSArICcgJyArIHJvdyArICc6JyArIGNvbCk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihBcnJheShjb2wpLmpvaW4oJyAnKSArICdeJyk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3Jvd10pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDJdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNrRnMud3JpdGVGaWxlU3luYyhzZXJ2ZXJFbnRyeSwgZmlsZVRleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5lcnJvcignT25seSBjb21waWxlciBvbmUgc3RhdCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG4gIGNvbnN0IHN0b3BTZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgbG9nLmluZm8oJ1N0b3BwaW5nIHNlcnZlci4uLicpO1xuICAgIGF3YWl0IGRldlNlcnZlci5zdG9wKCk7XG4gICAgbG9nLmluZm8oJ1NlcnZlciBjbG9zZWQnKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgbG9nLndhcm4oJ1JlY2VpdmVkIFNJR0lOVCwgZGV2c2VydmVyIHNodXR0aW5nIGRvd24nKTtcbiAgICBzdG9wU2VydmVyKCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSk7XG5cbiAgcnVuU2VydmVyKCk7XG59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
232
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJpbXBvcnQiLCJtZXRhIiwibWFpbiIsImVudHJ5cG9pbnQiLCJwcm9jZXNzIiwiYXJndiIsImNvbnNvbGUiLCJsb2ciLCJleGl0Iiwic3RhcnREZXZTZXJ2ZXIiLCJzZXJ2ZXJGaWxlQ29udGVudHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNlcnZlckVudHJ5IiwiZW52Iiwid2VicGFja0NvbmZpZyIsImdldExvZ2dlciIsInZvbHVtZSIsImZzIiwidXNlIiwiZnNSZXF1aXJlIiwicmVhZEZpbGUiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsImN3ZCIsIndlYnBhY2tDb25maWdzIiwiZW50cnlwYXRoIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwiQlJPV1NFUlNMSVNUX0VOViIsInRhcmdldCIsImNvbXBpbGVyIiwiZXJyb3IiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJqb2luIiwib3V0cHV0UGF0aCIsImhhbmRsZUVycm9ycyIsImZuIiwicmVxIiwicmVzIiwibmV4dCIsIngiLCJpbml0UmVuZGVyIiwicmVuZGVyIiwiYXJncyIsInB1c2giLCJpbXBvcnRSZW5kZXIiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJpbmZvIiwiY2xpZW50TWFuaWZlc3QiLCJ0aGVuIiwiYnVmIiwidG9TdHJpbmciLCJrZXlzIiwiY2FjaGUiLCJmb3JFYWNoIiwiZGVmYXVsdCIsImJpbmQiLCJ1bmRlZmluZWQiLCJpbml0IiwiZSIsImRldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwic2V0dXBNaWRkbGV3YXJlcyIsIm1pZGRsZXdhcmVzIiwiRXJyb3IiLCJvdGhlclJvdXRlcyIsIldFQlBBQ0tfUFVCTElDX1BBVEgiLCJwcm94eSIsImZpbHRlciIsImZsYXRNYXAiLCJjb250ZXh0IiwiYXBwIiwiZ2V0IiwiUmVnRXhwIiwidXJsIiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic2VuZCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7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
@@ -1 +1 @@
1
- {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAoBA,OAAO,mCAAmC,CAAC;AAqB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA4PlC"}
1
+ {"version":3,"file":"startDevserver.d.ts","sourceRoot":"","sources":["../../src/scripts/startDevserver.ts"],"names":[],"mappings":";AAmBA,OAAO,mCAAmC,CAAC;AAsB3C,wBAA8B,cAAc,CAC1C,UAAU,EAAE,MAAM,EAClB,GAAG,GAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAM,iBA6PlC"}
@@ -3,7 +3,6 @@ Object.hasOwn = Object.hasOwn || /* istanbul ignore next */function hasOwn(it, k
3
3
  return Object.prototype.hasOwnProperty.call(it, key);
4
4
  };
5
5
  import diskFs from 'fs';
6
- import { createFsRequire } from 'fs-require';
7
6
  import { createFsFromVolume, Volume } from 'memfs';
8
7
  import path from 'path';
9
8
  import sourceMapSupport from 'source-map-support';
@@ -14,6 +13,7 @@ import webpack from 'webpack';
14
13
  import logging from 'webpack/lib/logging/runtime.js';
15
14
  import WebpackDevServer from 'webpack-dev-server';
16
15
  import 'cross-fetch/dist/node-polyfill.js';
16
+ import { createHybridRequire } from './createHybridRequire.js';
17
17
  import { getWebpackConfig } from './getWebpackConfig.js';
18
18
  // run directly from node
19
19
  // eslint-disable-next-line @typescript-eslint/ban-ts-comment
@@ -36,7 +36,7 @@ export default async function startDevServer(entrypoint, env = {}) {
36
36
  const volume = new Volume();
37
37
  const fs = createFsFromVolume(volume);
38
38
  ufs.use(diskFs).use(fs);
39
- const fsRequire = createFsRequire(ufs);
39
+ const fsRequire = createHybridRequire(ufs);
40
40
  const readFile = promisify(ufs.readFile);
41
41
  // Generate a temporary file so we can hot reload from the root of the application
42
42
  function hotEntry(entryPath) {
@@ -229,4 +229,4 @@ export default async function startDevServer(entrypoint, env = {}) {
229
229
  });
230
230
  runServer();
231
231
  }
232
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzUmVxdWlyZSIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiZ2V0V2VicGFja0NvbmZpZyIsImltcG9ydCIsIm1ldGEiLCJtYWluIiwiZW50cnlwb2ludCIsInByb2Nlc3MiLCJhcmd2IiwiY29uc29sZSIsImxvZyIsImV4aXQiLCJzdGFydERldlNlcnZlciIsInNlcnZlckZpbGVDb250ZW50cyIsIlByb21pc2UiLCJyZXNvbHZlIiwic2VydmVyRW50cnkiLCJlbnYiLCJ3ZWJwYWNrQ29uZmlnIiwiZ2V0TG9nZ2VyIiwidm9sdW1lIiwiZnMiLCJ1c2UiLCJmc1JlcXVpcmUiLCJyZWFkRmlsZSIsImhvdEVudHJ5IiwiZW50cnlQYXRoIiwiZ2VuZXJhdGVkRW50cnlwb2ludCIsImZpbGVTeW5jIiwicG9zdGZpeCIsIndyaXRlU3luYyIsImZkIiwiY3dkIiwid2VicGFja0NvbmZpZ3MiLCJlbnRyeXBhdGgiLCJuYW1lIiwibW9kZSIsInJlcGxhY2UiLCJCUk9XU0VSU0xJU1RfRU5WIiwidGFyZ2V0IiwiY29tcGlsZXIiLCJlcnJvciIsImluc3RhbGwiLCJob29rUmVxdWlyZSIsImdldFNlcnZlckJ1bmRsZSIsInNlcnZlclN0YXRzIiwic2VydmVySnNvbiIsInRvSnNvbiIsImFzc2V0cyIsImpvaW4iLCJvdXRwdXRQYXRoIiwiaGFuZGxlRXJyb3JzIiwiZm4iLCJyZXEiLCJyZXMiLCJuZXh0IiwieCIsImluaXRSZW5kZXIiLCJyZW5kZXIiLCJhcmdzIiwicHVzaCIsImltcG9ydFJlbmRlciIsInN0YXRzIiwiY2xpZW50U3RhdHMiLCJjb21waWxhdGlvbiIsImVycm9ycyIsImxlbmd0aCIsIkFycmF5IiwiaXNBcnJheSIsImluZm8iLCJjbGllbnRNYW5pZmVzdCIsInRoZW4iLCJidWYiLCJ0b1N0cmluZyIsImtleXMiLCJjYWNoZSIsImZvckVhY2giLCJkZWZhdWx0IiwiYmluZCIsInVuZGVmaW5lZCIsImluaXQiLCJlIiwiZGV2U2VydmVyIiwiZGV2TWlkZGxld2FyZSIsIm91dHB1dEZpbGVTeXN0ZW0iLCJzZXR1cE1pZGRsZXdhcmVzIiwibWlkZGxld2FyZXMiLCJFcnJvciIsIm90aGVyUm91dGVzIiwiV0VCUEFDS19QVUJMSUNfUEFUSCIsInByb3h5IiwiZmlsdGVyIiwiZmxhdE1hcCIsImNvbnRleHQiLCJhcHAiLCJnZXQiLCJSZWdFeHAiLCJ1cmwiLCJlbmRzV2l0aCIsInN0YXR1c0NvZGUiLCJzZXRIZWFkZXIiLCJzZW5kIiwic29ja2V0Iiwib24iLCJjb2RlIiwicnVuU2VydmVyIiwic3RhcnQiLCJob29rcyIsImRvbmUiLCJ0YXAiLCJtdWx0aVN0YXRzIiwiZmluZGVyIiwiZmlsZVRleHQiLCJ0ZXh0Um93cyIsInNwbGl0IiwibWF0Y2giLCJzdGFjayIsIm1hdGNoQWxsIiwicm93IiwiTnVtYmVyIiwicGFyc2VJbnQiLCJjb2wiLCJiYXNlbmFtZSIsIndyaXRlRmlsZVN5bmMiLCJzdG9wU2VydmVyIiwic3RvcCIsIndhcm4iXSwic291cmNlcyI6WyIuLi8uLi9zcmMvc2NyaXB0cy9zdGFydERldnNlcnZlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIjIS91c3IvYmluL2VudiBub2RlXG5PYmplY3QuaGFzT3duID1cbiAgT2JqZWN0Lmhhc093biB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyBmdW5jdGlvbiBoYXNPd24oaXQsIGtleSkge1xuICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaXQsIGtleSk7XG4gIH07XG5pbXBvcnQgdHlwZSB7IE5leHRGdW5jdGlvbiB9IGZyb20gJ2V4cHJlc3MnO1xuaW1wb3J0IGRpc2tGcyBmcm9tICdmcyc7XG5pbXBvcnQgeyBjcmVhdGVGc1JlcXVpcmUgfSBmcm9tICdmcy1yZXF1aXJlJztcbmltcG9ydCB7IEluY29taW5nTWVzc2FnZSwgU2VydmVyUmVzcG9uc2UgfSBmcm9tICdodHRwJztcbmltcG9ydCB7IGNyZWF0ZUZzRnJvbVZvbHVtZSwgVm9sdW1lIH0gZnJvbSAnbWVtZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5pbXBvcnQgc291cmNlTWFwU3VwcG9ydCBmcm9tICdzb3VyY2UtbWFwLXN1cHBvcnQnO1xuaW1wb3J0IHRtcCBmcm9tICd0bXAnO1xuaW1wb3J0IHsgdWZzIH0gZnJvbSAndW5pb25mcyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcbmltcG9ydCB3ZWJwYWNrLCB7IHR5cGUgQ29uZmlndXJhdGlvbiwgdHlwZSBNdWx0aUNvbmZpZ3VyYXRpb24gfSBmcm9tICd3ZWJwYWNrJztcbmltcG9ydCBsb2dnaW5nIGZyb20gJ3dlYnBhY2svbGliL2xvZ2dpbmcvcnVudGltZS5qcyc7XG5pbXBvcnQgV2VicGFja0RldlNlcnZlciBmcm9tICd3ZWJwYWNrLWRldi1zZXJ2ZXInO1xuXG5pbXBvcnQgJ2Nyb3NzLWZldGNoL2Rpc3Qvbm9kZS1wb2x5ZmlsbC5qcyc7XG5pbXBvcnQgeyBnZXRXZWJwYWNrQ29uZmlnIH0gZnJvbSAnLi9nZXRXZWJwYWNrQ29uZmlnLmpzJztcbmltcG9ydCB7IEJvdW5kUmVuZGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG5cbi8vIHJ1biBkaXJlY3RseSBmcm9tIG5vZGVcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbi8vIEB0cy1pZ25vcmVcbmlmIChpbXBvcnQubWV0YS5tYWluKSB7XG4gIGNvbnN0IGVudHJ5cG9pbnQgPSBwcm9jZXNzLmFyZ3ZbMl07XG5cbiAgaWYgKCFlbnRyeXBvaW50KSB7XG4gICAgY29uc29sZS5sb2coYFVzYWdlOiBzdGFydC1hbmFuc2kgPGVudHJ5cG9pbnQtZmlsZT5gKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc3RhcnREZXZTZXJ2ZXIoZW50cnlwb2ludCk7XG59XG5cbmxldCBzZXJ2ZXJGaWxlQ29udGVudHM6IFByb21pc2U8c3RyaW5nPiA9IFByb21pc2UucmVzb2x2ZSgnJyk7XG5sZXQgc2VydmVyRW50cnkgPSAnJztcblxuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gc3RhcnREZXZTZXJ2ZXIoXG4gIGVudHJ5cG9pbnQ6IHN0cmluZyxcbiAgZW52OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9LFxuKSB7XG4gIGNvbnN0IHdlYnBhY2tDb25maWcgPSBhd2FpdCBnZXRXZWJwYWNrQ29uZmlnKCk7XG5cbiAgY29uc3QgbG9nID0gbG9nZ2luZy5nZXRMb2dnZXIoJ2FuYW5zaS1kZXZzZXJ2ZXInKTtcblxuICAvLyBTZXQgdXAgaW4gbWVtb3J5IGZpbGVzeXN0ZW1cbiAgY29uc3Qgdm9sdW1lID0gbmV3IFZvbHVtZSgpO1xuICBjb25zdCBmcyA9IGNyZWF0ZUZzRnJvbVZvbHVtZSh2b2x1bWUpO1xuICB1ZnMudXNlKGRpc2tGcykudXNlKGZzIGFzIGFueSk7XG5cbiAgY29uc3QgZnNSZXF1aXJlID0gY3JlYXRlRnNSZXF1aXJlKHVmcyk7XG4gIGNvbnN0IHJlYWRGaWxlID0gcHJvbWlzaWZ5KHVmcy5yZWFkRmlsZSk7XG4gIC8vIEdlbmVyYXRlIGEgdGVtcG9yYXJ5IGZpbGUgc28gd2UgY2FuIGhvdCByZWxvYWQgZnJvbSB0aGUgcm9vdCBvZiB0aGUgYXBwbGljYXRpb25cbiAgZnVuY3Rpb24gaG90RW50cnkoZW50cnlQYXRoOiBzdHJpbmcpIHtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAvLyBAdHMtaWdub3JlIGZvciBzb21lIHJlYXNvbiBpdCdzIG5vdCBwaWNraW5nIHVwIHRoYXQgb3RoZXIgb3B0aW9ucyBhcmUgb3B0aW9uYWxcbiAgICBjb25zdCBnZW5lcmF0ZWRFbnRyeXBvaW50ID0gdG1wLmZpbGVTeW5jKHsgcG9zdGZpeDogJy5qcycgfSk7XG4gICAgZGlza0ZzLndyaXRlU3luYyhcbiAgICAgIGdlbmVyYXRlZEVudHJ5cG9pbnQuZmQsXG4gICAgICBgXG4gIGltcG9ydCBlbnRyeSBmcm9tIFwiJHtwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgZW50cnlQYXRoKX1cIjtcblxuICBpZiAoaW1wb3J0Lm1ldGEud2VicGFja0hvdCkge1xuICAgIGltcG9ydC5tZXRhLndlYnBhY2tIb3QuYWNjZXB0KCk7XG4gIH1cblxuICBleHBvcnQgZGVmYXVsdCBlbnRyeTtcbiAgICBgLFxuICAgICk7XG4gICAgcmV0dXJuIGdlbmVyYXRlZEVudHJ5cG9pbnQ7XG4gIH1cblxuICBjb25zdCB3ZWJwYWNrQ29uZmlnczogQ29uZmlndXJhdGlvbltdID0gW1xuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBob3RFbnRyeShlbnRyeXBvaW50KS5uYW1lLFxuICAgICAgICBuYW1lOiAnY2xpZW50JyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcgfSxcbiAgICApLFxuICAgIHdlYnBhY2tDb25maWcoXG4gICAgICB7XG4gICAgICAgIC4uLmVudixcbiAgICAgICAgZW50cnlwYXRoOiBlbnRyeXBvaW50LnJlcGxhY2UoJy50c3gnLCAnLnNlcnZlci50c3gnKSxcbiAgICAgICAgbmFtZTogJ3NlcnZlcicsXG4gICAgICAgIEJST1dTRVJTTElTVF9FTlY6ICdjdXJyZW50IG5vZGUnLFxuICAgICAgfSxcbiAgICAgIHsgbW9kZTogJ2RldmVsb3BtZW50JywgdGFyZ2V0OiAnbm9kZScgfSxcbiAgICApLFxuICBdO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXJcbiAgY29uc3QgY29tcGlsZXIgPSB3ZWJwYWNrKHdlYnBhY2tDb25maWdzIGFzIHVua25vd24gYXMgTXVsdGlDb25maWd1cmF0aW9uKTtcbiAgaWYgKCFjb21waWxlcikge1xuICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIHdlYnBhY2sgY29tcGlsZXInKTtcbiAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICB9XG5cbiAgc291cmNlTWFwU3VwcG9ydC5pbnN0YWxsKHsgaG9va1JlcXVpcmU6IHRydWUgfSk7XG5cbiAgZnVuY3Rpb24gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzOiB3ZWJwYWNrLlN0YXRzKSB7XG4gICAgY29uc3Qgc2VydmVySnNvbiA9IHNlcnZlclN0YXRzLnRvSnNvbih7IGFzc2V0czogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcGF0aC5qb2luKHNlcnZlckpzb24ub3V0cHV0UGF0aCA/PyAnJywgJ3NlcnZlci5qcycpO1xuICB9XG4gIGZ1bmN0aW9uIGhhbmRsZUVycm9yczxcbiAgICBGIGV4dGVuZHMgKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICkgPT4gUHJvbWlzZTx2b2lkPixcbiAgPihmbjogRikge1xuICAgIHJldHVybiBhc3luYyBmdW5jdGlvbiAoXG4gICAgICByZXE6IFJlcXVlc3QgfCBJbmNvbWluZ01lc3NhZ2UsXG4gICAgICByZXM6IFJlc3BvbnNlIHwgU2VydmVyUmVzcG9uc2UsXG4gICAgICBuZXh0OiBOZXh0RnVuY3Rpb24sXG4gICAgKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgZm4ocmVxLCByZXMpO1xuICAgICAgfSBjYXRjaCAoeCkge1xuICAgICAgICBuZXh0KHgpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBsZXQgaW5pdFJlbmRlcjpcbiAgICB8IHsgYXJnczogUGFyYW1ldGVyczxCb3VuZFJlbmRlcj47IHJlc29sdmU6ICgpID0+IHZvaWQgfVtdXG4gICAgfCB1bmRlZmluZWQgPSBbXTtcbiAgbGV0IHJlbmRlcjogQm91bmRSZW5kZXIgPSAoLi4uYXJncykgPT5cbiAgICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHtcbiAgICAgIGluaXRSZW5kZXI/LnB1c2goeyBhcmdzLCByZXNvbHZlIH0pO1xuICAgIH0pO1xuXG4gIGZ1bmN0aW9uIGltcG9ydFJlbmRlcihzdGF0czogd2VicGFjay5TdGF0c1tdKSB7XG4gICAgY29uc3QgW2NsaWVudFN0YXRzLCBzZXJ2ZXJTdGF0c10gPSBzdGF0cztcbiAgICBpZiAoXG4gICAgICBjbGllbnRTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoIHx8XG4gICAgICBzZXJ2ZXJTdGF0cz8uY29tcGlsYXRpb24/LmVycm9ycz8ubGVuZ3RoXG4gICAgKSB7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3IgY2xpZW50IGJ1aWxkOiAnICsgY2xpZW50U3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIGxvZy5lcnJvcignRXJyb3JzIGZvciBzZXJ2ZXIgYnVpbGQ6ICcgKyBzZXJ2ZXJTdGF0cy5jb21waWxhdGlvbi5lcnJvcnMpO1xuICAgICAgLy8gZmlyc3QgdGltZSwgcmF0aGVyIHRoYW4gcmUtcmVuZGVyXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0UmVuZGVyKSkge1xuICAgICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgfVxuICAgICAgbG9nLmVycm9yKCdBYm92ZSBjb21waWxlciBlcnJvcnMgYmxvY2tpbmcgcmVsb2FkJyk7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZy5pbmZvKCdMYXVuY2hpbmcgU1NSJyk7XG4gICAgfVxuXG4gICAgLy8gQVNTRVRTXG4gICAgY29uc3QgY2xpZW50TWFuaWZlc3QgPSBjbGllbnRTdGF0cy50b0pzb24oKTtcblxuICAgIHNlcnZlckVudHJ5ID0gZ2V0U2VydmVyQnVuZGxlKHNlcnZlclN0YXRzKTtcbiAgICBzZXJ2ZXJGaWxlQ29udGVudHMgPSByZWFkRmlsZShzZXJ2ZXJFbnRyeSkudGhlbihidWYgPT4gYnVmLnRvU3RyaW5nKCkpO1xuICAgIC8vIHJlbG9hZCBtb2R1bGVzXG4gICAgT2JqZWN0LmtleXMoZnNSZXF1aXJlLmNhY2hlKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBkZWxldGUgZnNSZXF1aXJlLmNhY2hlW2tleV07XG4gICAgfSk7XG4gICAgcmVuZGVyID0gKGZzUmVxdWlyZShzZXJ2ZXJFbnRyeSkgYXMgYW55KS5kZWZhdWx0LmJpbmQoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBjbGllbnRNYW5pZmVzdCxcbiAgICApO1xuICAgIC8vIFNFUlZFUiBTSURFIEVOVFJZUE9JTlRcbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbml0UmVuZGVyKSkge1xuICAgICAgaW5pdFJlbmRlci5mb3JFYWNoKGFzeW5jIGluaXQgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGxvZy5pbmZvKCdSZXNvbHZpbmcgcXVldWVkIHJlcXVlc3RzJyk7XG4gICAgICAgICAgYXdhaXQgcmVuZGVyKC4uLmluaXQuYXJncyk7XG4gICAgICAgICAgaW5pdC5yZXNvbHZlKCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ0Vycm9yIHdoZW4gYXR0ZW1wdGluZyB0byByZW5kZXIgcXVldWVkIHJlcXVlc3RzJyk7XG4gICAgICAgICAgbG9nLmVycm9yKGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIGluaXRSZW5kZXIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZGV2U2VydmVyID0gbmV3IFdlYnBhY2tEZXZTZXJ2ZXIoXG4gICAgLy8gd3JpdGUgdG8gbWVtb3J5IGZpbGVzeXN0ZW0gc28gd2UgY2FuIGltcG9ydFxuICAgIHtcbiAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcixcbiAgICAgIGRldk1pZGRsZXdhcmU6IHtcbiAgICAgICAgLi4ud2VicGFja0NvbmZpZ3NbMF0/LmRldlNlcnZlcj8uZGV2TWlkZGxld2FyZSxcbiAgICAgICAgb3V0cHV0RmlsZVN5c3RlbToge1xuICAgICAgICAgIC4uLmZzLFxuICAgICAgICAgIGpvaW46IHBhdGguam9pbiBhcyBhbnksXG4gICAgICAgIH0gYXMgYW55LFxuICAgICAgfSxcbiAgICAgIHNldHVwTWlkZGxld2FyZXM6IChtaWRkbGV3YXJlcywgZGV2U2VydmVyKSA9PiB7XG4gICAgICAgIGlmICghZGV2U2VydmVyKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd3ZWJwYWNrLWRldi1zZXJ2ZXIgaXMgbm90IGRlZmluZWQnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG90aGVyUm91dGVzID0gW1xuICAgICAgICAgIHByb2Nlc3MuZW52LldFQlBBQ0tfUFVCTElDX1BBVEgsXG4gICAgICAgICAgLi4uKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8ucHJveHlcbiAgICAgICAgICAgID8uZmlsdGVyKHByb3h5ID0+IHR5cGVvZiBwcm94eSA9PT0gJ29iamVjdCcpXG4gICAgICAgICAgICA/LmZsYXRNYXAocHJveHkgPT4gcHJveHkuY29udGV4dCkgPz8gW10pLFxuICAgICAgICBdO1xuICAgICAgICAvLyBzZXJ2ZSBTU1IgZm9yIG5vbi1XRUJQQUNLX1BVQkxJQ19QQVRIXG4gICAgICAgIGRldlNlcnZlci5hcHA/LmdldChcbiAgICAgICAgICBuZXcgUmVnRXhwKGBeKD8hJHtvdGhlclJvdXRlcy5qb2luKCd8Jyl9KWApLFxuICAgICAgICAgIGhhbmRsZUVycm9ycyhhc3luYyBmdW5jdGlvbiAocmVxOiBhbnksIHJlczogYW55KSB7XG4gICAgICAgICAgICBpZiAocmVxLnVybC5lbmRzV2l0aCgnZmF2aWNvbi5pY28nKSkge1xuICAgICAgICAgICAgICByZXMuc3RhdHVzQ29kZSA9IDQwNDtcbiAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC10eXBlJywgJ3RleHQvaHRtbCcpO1xuICAgICAgICAgICAgICByZXMuc2VuZCgnbm90IGZvdW5kJyk7XG4gICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJlcy5zb2NrZXQub24oJ2Vycm9yJywgKGVycm9yOiB1bmtub3duKSA9PiB7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignRmF0YWw6JywgZXJyb3IpO1xuICAgICAgICAgICAgICBpZiAoKGVycm9yIGFzIGFueSkuY29kZSA9PT0gJ0VDT05OUkVTRVQnKSB7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0VDT05OUkVTRVQgaXMgdXN1YWxseSBkdWUgdG8gYnJvd3NlciBjbG9zaW5nIHRoZSBjb25uZWN0aW9uJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYXdhaXQgcmVuZGVyKHJlcSwgcmVzKTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAod2VicGFja0NvbmZpZ3NbMF0uZGV2U2VydmVyPy5zZXR1cE1pZGRsZXdhcmVzKSB7XG4gICAgICAgICAgcmV0dXJuIHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlci5zZXR1cE1pZGRsZXdhcmVzKFxuICAgICAgICAgICAgbWlkZGxld2FyZXMsXG4gICAgICAgICAgICBkZXZTZXJ2ZXIsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBtaWRkbGV3YXJlcztcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb21waWxlcixcbiAgKTtcbiAgY29uc3QgcnVuU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IGRldlNlcnZlci5zdGFydCgpO1xuICAgIGRldlNlcnZlci5jb21waWxlci5ob29rcy5kb25lLnRhcChcbiAgICAgICdBbmFuc2kgU2VydmVyJyxcbiAgICAgIChtdWx0aVN0YXRzOiB3ZWJwYWNrLk11bHRpU3RhdHMgfCB3ZWJwYWNrLlN0YXRzKSA9PiB7XG4gICAgICAgIGlmICghbXVsdGlTdGF0cykge1xuICAgICAgICAgIGxvZy5lcnJvcignc3RhdHMgbm90IHNlbmQnKTtcbiAgICAgICAgICBwcm9jZXNzLmV4aXQoLTEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFPYmplY3QuaGFzT3duKG11bHRpU3RhdHMsICdzdGF0cycpKSByZXR1cm47XG4gICAgICAgIGlmICgobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaW1wb3J0UmVuZGVyKChtdWx0aVN0YXRzIGFzIHdlYnBhY2suTXVsdGlTdGF0cykuc3RhdHMpO1xuICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgbG9nLmVycm9yKCdGYWlsZWQgdG8gbG9hZCBzZXJ2ZSBlbnRyeXBvaW50Jyk7XG4gICAgICAgICAgICBjb25zdCBmaW5kZXIgPSBuZXcgUmVnRXhwKGAke3NlcnZlckVudHJ5fTooW1xcXFxkXSspOihbXFxcXGRdKylgLCAnZycpO1xuICAgICAgICAgICAgc2VydmVyRmlsZUNvbnRlbnRzLnRoZW4oZmlsZVRleHQgPT4ge1xuICAgICAgICAgICAgICBjb25zdCB0ZXh0Um93cyA9IGZpbGVUZXh0LnNwbGl0KCdcXG4nKTtcbiAgICAgICAgICAgICAgbG9nLmVycm9yKCc+Pj4gU3RhY2sgQ29udGV4dCBbc2VydmUgZW50cnlwb2ludF0gPDw8Jyk7XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgZS5zdGFjay5tYXRjaEFsbChmaW5kZXIpID8/IFtdKSB7XG4gICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzFdKTtcbiAgICAgICAgICAgICAgICBjb25zdCBjb2wgPSBOdW1iZXIucGFyc2VJbnQobWF0Y2hbMl0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihwYXRoLmJhc2VuYW1lKHNlcnZlckVudHJ5KSArICcgJyArIHJvdyArICc6JyArIGNvbCk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93IC0gMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihBcnJheShjb2wpLmpvaW4oJyAnKSArICdeJyk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3Jvd10pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAxXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyArIDJdKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkaXNrRnMud3JpdGVGaWxlU3luYyhzZXJ2ZXJFbnRyeSwgZmlsZVRleHQpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRocm93IGU7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxvZy5lcnJvcignT25seSBjb21waWxlciBvbmUgc3RhdCcpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH07XG4gIGNvbnN0IHN0b3BTZXJ2ZXIgPSBhc3luYyAoKSA9PiB7XG4gICAgbG9nLmluZm8oJ1N0b3BwaW5nIHNlcnZlci4uLicpO1xuICAgIGF3YWl0IGRldlNlcnZlci5zdG9wKCk7XG4gICAgbG9nLmluZm8oJ1NlcnZlciBjbG9zZWQnKTtcbiAgfTtcblxuICBwcm9jZXNzLm9uKCdTSUdJTlQnLCAoKSA9PiB7XG4gICAgbG9nLndhcm4oJ1JlY2VpdmVkIFNJR0lOVCwgZGV2c2VydmVyIHNodXR0aW5nIGRvd24nKTtcbiAgICBzdG9wU2VydmVyKCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfSk7XG5cbiAgcnVuU2VydmVyKCk7XG59XG4iXSwibWFwcGluZ3MiOiJBQUFBO0FBQ0FBLE1BQU0sQ0FBQ0MsTUFBTSxHQUNYRCxNQUFNLENBQUNDLE1BQU0sSUFDYiwwQkFBMkIsU0FBU0EsTUFBTUEsQ0FBQ0MsRUFBRSxFQUFFQyxHQUFHLEVBQUU7RUFDbEQsT0FBT0gsTUFBTSxDQUFDSSxTQUFTLENBQUNDLGNBQWMsQ0FBQ0MsSUFBSSxDQUFDSixFQUFFLEVBQUVDLEdBQUcsQ0FBQztBQUN0RCxDQUFDO0FBRUgsT0FBT0ksTUFBTSxNQUFNLElBQUk7QUFDdkIsU0FBU0MsZUFBZSxRQUFRLFlBQVk7QUFFNUMsU0FBU0Msa0JBQWtCLEVBQUVDLE1BQU0sUUFBUSxPQUFPO0FBQ2xELE9BQU9DLElBQUksTUFBTSxNQUFNO0FBQ3ZCLE9BQU9DLGdCQUFnQixNQUFNLG9CQUFvQjtBQUNqRCxPQUFPQyxHQUFHLE1BQU0sS0FBSztBQUNyQixTQUFTQyxHQUFHLFFBQVEsU0FBUztBQUM3QixTQUFTQyxTQUFTLFFBQVEsTUFBTTtBQUNoQyxPQUFPQyxPQUFPLE1BQXVELFNBQVM7QUFDOUUsT0FBT0MsT0FBTyxNQUFNLGdDQUFnQztBQUNwRCxPQUFPQyxnQkFBZ0IsTUFBTSxvQkFBb0I7QUFFakQsT0FBTyxtQ0FBbUM7QUFDMUMsU0FBU0MsZ0JBQWdCLFFBQVEsdUJBQXVCO0FBR3hEO0FBQ0E7QUFDQTtBQUNBLElBQUlDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDQyxJQUFJLEVBQUU7RUFDcEIsTUFBTUMsVUFBVSxHQUFHQyxPQUFPLENBQUNDLElBQUksQ0FBQyxDQUFDLENBQUM7RUFFbEMsSUFBSSxDQUFDRixVQUFVLEVBQUU7SUFDZkcsT0FBTyxDQUFDQyxHQUFHLENBQUMsdUNBQXVDLENBQUM7SUFDcERILE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xCO0VBRUFDLGNBQWMsQ0FBQ04sVUFBVSxDQUFDO0FBQzVCO0FBRUEsSUFBSU8sa0JBQW1DLEdBQUdDLE9BQU8sQ0FBQ0MsT0FBTyxDQUFDLEVBQUUsQ0FBQztBQUM3RCxJQUFJQyxXQUFXLEdBQUcsRUFBRTtBQUVwQixlQUFlLGVBQWVKLGNBQWNBLENBQzFDTixVQUFrQixFQUNsQlcsR0FBNEIsR0FBRyxDQUFDLENBQUMsRUFDakM7RUFDQSxNQUFNQyxhQUFhLEdBQUcsTUFBTWhCLGdCQUFnQixDQUFDLENBQUM7RUFFOUMsTUFBTVEsR0FBRyxHQUFHVixPQUFPLENBQUNtQixTQUFTLENBQUMsa0JBQWtCLENBQUM7O0VBRWpEO0VBQ0EsTUFBTUMsTUFBTSxHQUFHLElBQUkzQixNQUFNLENBQUMsQ0FBQztFQUMzQixNQUFNNEIsRUFBRSxHQUFHN0Isa0JBQWtCLENBQUM0QixNQUFNLENBQUM7RUFDckN2QixHQUFHLENBQUN5QixHQUFHLENBQUNoQyxNQUFNLENBQUMsQ0FBQ2dDLEdBQUcsQ0FBQ0QsRUFBUyxDQUFDO0VBRTlCLE1BQU1FLFNBQVMsR0FBR2hDLGVBQWUsQ0FBQ00sR0FBRyxDQUFDO0VBQ3RDLE1BQU0yQixRQUFRLEdBQUcxQixTQUFTLENBQUNELEdBQUcsQ0FBQzJCLFFBQVEsQ0FBQztFQUN4QztFQUNBLFNBQVNDLFFBQVFBLENBQUNDLFNBQWlCLEVBQUU7SUFDbkM7SUFDQTtJQUNBLE1BQU1DLG1CQUFtQixHQUFHL0IsR0FBRyxDQUFDZ0MsUUFBUSxDQUFDO01BQUVDLE9BQU8sRUFBRTtJQUFNLENBQUMsQ0FBQztJQUM1RHZDLE1BQU0sQ0FBQ3dDLFNBQVMsQ0FDZEgsbUJBQW1CLENBQUNJLEVBQUUsRUFDdEI7QUFDTix1QkFBdUJyQyxJQUFJLENBQUNxQixPQUFPLENBQUNSLE9BQU8sQ0FBQ3lCLEdBQUcsQ0FBQyxDQUFDLEVBQUVOLFNBQVMsQ0FBQztBQUM3RDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxLQUNJLENBQUM7SUFDRCxPQUFPQyxtQkFBbUI7RUFDNUI7RUFFQSxNQUFNTSxjQUErQixHQUFHLENBQ3RDZixhQUFhLENBQ1g7SUFDRSxHQUFHRCxHQUFHO0lBQ05pQixTQUFTLEVBQUVULFFBQVEsQ0FBQ25CLFVBQVUsQ0FBQyxDQUFDNkIsSUFBSTtJQUNwQ0EsSUFBSSxFQUFFO0VBQ1IsQ0FBQyxFQUNEO0lBQUVDLElBQUksRUFBRTtFQUFjLENBQ3hCLENBQUMsRUFDRGxCLGFBQWEsQ0FDWDtJQUNFLEdBQUdELEdBQUc7SUFDTmlCLFNBQVMsRUFBRTVCLFVBQVUsQ0FBQytCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDO0lBQ3BERixJQUFJLEVBQUUsUUFBUTtJQUNkRyxnQkFBZ0IsRUFBRTtFQUNwQixDQUFDLEVBQ0Q7SUFBRUYsSUFBSSxFQUFFLGFBQWE7SUFBRUcsTUFBTSxFQUFFO0VBQU8sQ0FDeEMsQ0FBQyxDQUNGOztFQUVEO0VBQ0EsTUFBTUMsUUFBUSxHQUFHekMsT0FBTyxDQUFDa0MsY0FBK0MsQ0FBQztFQUN6RSxJQUFJLENBQUNPLFFBQVEsRUFBRTtJQUNiOUIsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJDQUEyQyxDQUFDO0lBQ3REbEMsT0FBTyxDQUFDSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7RUFDbEI7RUFFQWhCLGdCQUFnQixDQUFDK0MsT0FBTyxDQUFDO0lBQUVDLFdBQVcsRUFBRTtFQUFLLENBQUMsQ0FBQztFQUUvQyxTQUFTQyxlQUFlQSxDQUFDQyxXQUEwQixFQUFFO0lBQ25ELE1BQU1DLFVBQVUsR0FBR0QsV0FBVyxDQUFDRSxNQUFNLENBQUM7TUFBRUMsTUFBTSxFQUFFO0lBQUssQ0FBQyxDQUFDO0lBQ3ZELE9BQU90RCxJQUFJLENBQUN1RCxJQUFJLENBQUNILFVBQVUsQ0FBQ0ksVUFBVSxJQUFJLEVBQUUsRUFBRSxXQUFXLENBQUM7RUFDNUQ7RUFDQSxTQUFTQyxZQUFZQSxDQUtuQkMsRUFBSyxFQUFFO0lBQ1AsT0FBTyxnQkFDTEMsR0FBOEIsRUFDOUJDLEdBQThCLEVBQzlCQyxJQUFrQixFQUNsQjtNQUNBLElBQUk7UUFDRixPQUFPLE1BQU1ILEVBQUUsQ0FBQ0MsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDM0IsQ0FBQyxDQUFDLE9BQU9FLENBQUMsRUFBRTtRQUNWRCxJQUFJLENBQUNDLENBQUMsQ0FBQztNQUNUO0lBQ0YsQ0FBQztFQUNIO0VBRUEsSUFBSUMsVUFFUyxHQUFHLEVBQUU7RUFDbEIsSUFBSUMsTUFBbUIsR0FBR0EsQ0FBQyxHQUFHQyxJQUFJLEtBQ2hDLElBQUk3QyxPQUFPLENBQUNDLE9BQU8sSUFBSTtJQUNyQjBDLFVBQVUsRUFBRUcsSUFBSSxDQUFDO01BQUVELElBQUk7TUFBRTVDO0lBQVEsQ0FBQyxDQUFDO0VBQ3JDLENBQUMsQ0FBQztFQUVKLFNBQVM4QyxZQUFZQSxDQUFDQyxLQUFzQixFQUFFO0lBQzVDLE1BQU0sQ0FBQ0MsV0FBVyxFQUFFbEIsV0FBVyxDQUFDLEdBQUdpQixLQUFLO0lBQ3hDLElBQ0VDLFdBQVcsRUFBRUMsV0FBVyxFQUFFQyxNQUFNLEVBQUVDLE1BQU0sSUFDeENyQixXQUFXLEVBQUVtQixXQUFXLEVBQUVDLE1BQU0sRUFBRUMsTUFBTSxFQUN4QztNQUNBeEQsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLDJCQUEyQixHQUFHc0IsV0FBVyxDQUFDQyxXQUFXLENBQUNDLE1BQU0sQ0FBQztNQUN2RXZELEdBQUcsQ0FBQytCLEtBQUssQ0FBQywyQkFBMkIsR0FBR0ksV0FBVyxDQUFDbUIsV0FBVyxDQUFDQyxNQUFNLENBQUM7TUFDdkU7TUFDQSxJQUFJRSxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7UUFDN0JsRCxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjtNQUNBRCxHQUFHLENBQUMrQixLQUFLLENBQUMsdUNBQXVDLENBQUM7TUFDbEQ7SUFDRixDQUFDLE1BQU07TUFDTC9CLEdBQUcsQ0FBQzJELElBQUksQ0FBQyxlQUFlLENBQUM7SUFDM0I7O0lBRUE7SUFDQSxNQUFNQyxjQUFjLEdBQUdQLFdBQVcsQ0FBQ2hCLE1BQU0sQ0FBQyxDQUFDO0lBRTNDL0IsV0FBVyxHQUFHNEIsZUFBZSxDQUFDQyxXQUFXLENBQUM7SUFDMUNoQyxrQkFBa0IsR0FBR1csUUFBUSxDQUFDUixXQUFXLENBQUMsQ0FBQ3VELElBQUksQ0FBQ0MsR0FBRyxJQUFJQSxHQUFHLENBQUNDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdEU7SUFDQTFGLE1BQU0sQ0FBQzJGLElBQUksQ0FBQ25ELFNBQVMsQ0FBQ29ELEtBQUssQ0FBQyxDQUFDQyxPQUFPLENBQUMxRixHQUFHLElBQUk7TUFDMUMsT0FBT3FDLFNBQVMsQ0FBQ29ELEtBQUssQ0FBQ3pGLEdBQUcsQ0FBQztJQUM3QixDQUFDLENBQUM7SUFDRndFLE1BQU0sR0FBSW5DLFNBQVMsQ0FBQ1AsV0FBVyxDQUFDLENBQVM2RCxPQUFPLENBQUNDLElBQUksQ0FDbkRDLFNBQVMsRUFDVFQsY0FDRixDQUFDO0lBQ0Q7SUFDQSxJQUFJSCxLQUFLLENBQUNDLE9BQU8sQ0FBQ1gsVUFBVSxDQUFDLEVBQUU7TUFDN0JBLFVBQVUsQ0FBQ21CLE9BQU8sQ0FBQyxNQUFNSSxJQUFJLElBQUk7UUFDL0IsSUFBSTtVQUNGdEUsR0FBRyxDQUFDMkQsSUFBSSxDQUFDLDJCQUEyQixDQUFDO1VBQ3JDLE1BQU1YLE1BQU0sQ0FBQyxHQUFHc0IsSUFBSSxDQUFDckIsSUFBSSxDQUFDO1VBQzFCcUIsSUFBSSxDQUFDakUsT0FBTyxDQUFDLENBQUM7UUFDaEIsQ0FBQyxDQUFDLE9BQU9rRSxDQUFDLEVBQUU7VUFDVnZFLEdBQUcsQ0FBQytCLEtBQUssQ0FBQyxpREFBaUQsQ0FBQztVQUM1RC9CLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ3dDLENBQUMsQ0FBQztRQUNkO01BQ0YsQ0FBQyxDQUFDO01BQ0Z4QixVQUFVLEdBQUdzQixTQUFTO0lBQ3hCO0VBQ0Y7RUFFQSxNQUFNRyxTQUFTLEdBQUcsSUFBSWpGLGdCQUFnQjtFQUNwQztFQUNBO0lBQ0UsR0FBR2dDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQ2lELFNBQVM7SUFDOUJDLGFBQWEsRUFBRTtNQUNiLEdBQUdsRCxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUVpRCxTQUFTLEVBQUVDLGFBQWE7TUFDOUNDLGdCQUFnQixFQUFFO1FBQ2hCLEdBQUcvRCxFQUFFO1FBQ0w0QixJQUFJLEVBQUV2RCxJQUFJLENBQUN1RDtNQUNiO0lBQ0YsQ0FBQztJQUNEb0MsZ0JBQWdCLEVBQUVBLENBQUNDLFdBQVcsRUFBRUosU0FBUyxLQUFLO01BQzVDLElBQUksQ0FBQ0EsU0FBUyxFQUFFO1FBQ2QsTUFBTSxJQUFJSyxLQUFLLENBQUMsbUNBQW1DLENBQUM7TUFDdEQ7TUFFQSxNQUFNQyxXQUFXLEdBQUcsQ0FDbEJqRixPQUFPLENBQUNVLEdBQUcsQ0FBQ3dFLG1CQUFtQixFQUMvQixJQUFJeEQsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDaUQsU0FBUyxFQUFFUSxLQUFLLEVBQ2xDQyxNQUFNLENBQUNELEtBQUssSUFBSSxPQUFPQSxLQUFLLEtBQUssUUFBUSxDQUFDLEVBQzFDRSxPQUFPLENBQUNGLEtBQUssSUFBSUEsS0FBSyxDQUFDRyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FDM0M7TUFDRDtNQUNBWCxTQUFTLENBQUNZLEdBQUcsRUFBRUMsR0FBRyxDQUNoQixJQUFJQyxNQUFNLENBQUMsT0FBT1IsV0FBVyxDQUFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFDM0NFLFlBQVksQ0FBQyxnQkFBZ0JFLEdBQVEsRUFBRUMsR0FBUSxFQUFFO1FBQy9DLElBQUlELEdBQUcsQ0FBQzRDLEdBQUcsQ0FBQ0MsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFO1VBQ25DNUMsR0FBRyxDQUFDNkMsVUFBVSxHQUFHLEdBQUc7VUFDcEI3QyxHQUFHLENBQUM4QyxTQUFTLENBQUMsY0FBYyxFQUFFLFdBQVcsQ0FBQztVQUMxQzlDLEdBQUcsQ0FBQytDLElBQUksQ0FBQyxXQUFXLENBQUM7VUFDckI7UUFDRjtRQUNBL0MsR0FBRyxDQUFDZ0QsTUFBTSxDQUFDQyxFQUFFLENBQUMsT0FBTyxFQUFHOUQsS0FBYyxJQUFLO1VBQ3pDL0IsR0FBRyxDQUFDK0IsS0FBSyxDQUFDLFFBQVEsRUFBRUEsS0FBSyxDQUFDO1VBQzFCLElBQUtBLEtBQUssQ0FBUytELElBQUksS0FBSyxZQUFZLEVBQUU7WUFDeEM5RixHQUFHLENBQUMrQixLQUFLLENBQ1AsNkRBQ0YsQ0FBQztVQUNIO1FBQ0YsQ0FBQyxDQUFDO1FBRUYsTUFBTWlCLE1BQU0sQ0FBQ0wsR0FBRyxFQUFFQyxHQUFHLENBQUM7TUFDeEIsQ0FBQyxDQUNILENBQUM7TUFFRCxJQUFJckIsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDaUQsU0FBUyxFQUFFRyxnQkFBZ0IsRUFBRTtRQUNqRCxPQUFPcEQsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDaUQsU0FBUyxDQUFDRyxnQkFBZ0IsQ0FDakRDLFdBQVcsRUFDWEosU0FDRixDQUFDO01BQ0g7TUFFQSxPQUFPSSxXQUFXO0lBQ3BCO0VBQ0YsQ0FBQyxFQUNEOUMsUUFDRixDQUFDO0VBQ0QsTUFBTWlFLFNBQVMsR0FBRyxNQUFBQSxDQUFBLEtBQVk7SUFDNUIsTUFBTXZCLFNBQVMsQ0FBQ3dCLEtBQUssQ0FBQyxDQUFDO0lBQ3ZCeEIsU0FBUyxDQUFDMUMsUUFBUSxDQUFDbUUsS0FBSyxDQUFDQyxJQUFJLENBQUNDLEdBQUcsQ0FDL0IsZUFBZSxFQUNkQyxVQUE4QyxJQUFLO01BQ2xELElBQUksQ0FBQ0EsVUFBVSxFQUFFO1FBQ2ZwRyxHQUFHLENBQUMrQixLQUFLLENBQUMsZ0JBQWdCLENBQUM7UUFDM0JsQyxPQUFPLENBQUNJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztNQUNsQjtNQUVBLElBQUksQ0FBQzVCLE1BQU0sQ0FBQ0MsTUFBTSxDQUFDOEgsVUFBVSxFQUFFLE9BQU8sQ0FBQyxFQUFFO01BQ3pDLElBQUtBLFVBQVUsQ0FBd0JoRCxLQUFLLENBQUNJLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDdkQsSUFBSTtVQUNGTCxZQUFZLENBQUVpRCxVQUFVLENBQXdCaEQsS0FBSyxDQUFDO1FBQ3hELENBQUMsQ0FBQyxPQUFPbUIsQ0FBTSxFQUFFO1VBQ2Z2RSxHQUFHLENBQUMrQixLQUFLLENBQUMsaUNBQWlDLENBQUM7VUFDNUMsTUFBTXNFLE1BQU0sR0FBRyxJQUFJZixNQUFNLENBQUMsR0FBR2hGLFdBQVcsb0JBQW9CLEVBQUUsR0FBRyxDQUFDO1VBQ2xFSCxrQkFBa0IsQ0FBQzBELElBQUksQ0FBQ3lDLFFBQVEsSUFBSTtZQUNsQyxNQUFNQyxRQUFRLEdBQUdELFFBQVEsQ0FBQ0UsS0FBSyxDQUFDLElBQUksQ0FBQztZQUNyQ3hHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQywwQ0FBMEMsQ0FBQztZQUNyRCxLQUFLLE1BQU0wRSxLQUFLLElBQUlsQyxDQUFDLENBQUNtQyxLQUFLLENBQUNDLFFBQVEsQ0FBQ04sTUFBTSxDQUFDLElBQUksRUFBRSxFQUFFO2NBQ2xELE1BQU1PLEdBQUcsR0FBR0MsTUFBTSxDQUFDQyxRQUFRLENBQUNMLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztjQUNyQyxNQUFNTSxHQUFHLEdBQUdGLE1BQU0sQ0FBQ0MsUUFBUSxDQUFDTCxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDckN6RyxHQUFHLENBQUMrQixLQUFLLENBQUMvQyxJQUFJLENBQUNnSSxRQUFRLENBQUMxRyxXQUFXLENBQUMsR0FBRyxHQUFHLEdBQUdzRyxHQUFHLEdBQUcsR0FBRyxHQUFHRyxHQUFHLENBQUM7Y0FDN0QvRyxHQUFHLENBQUMrQixLQUFLLENBQUN3RSxRQUFRLENBQUNLLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztjQUM1QjVHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ3dFLFFBQVEsQ0FBQ0ssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQzVCNUcsR0FBRyxDQUFDK0IsS0FBSyxDQUFDMEIsS0FBSyxDQUFDc0QsR0FBRyxDQUFDLENBQUN4RSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2NBQ3JDdkMsR0FBRyxDQUFDK0IsS0FBSyxDQUFDd0UsUUFBUSxDQUFDSyxHQUFHLENBQUMsQ0FBQztjQUN4QjVHLEdBQUcsQ0FBQytCLEtBQUssQ0FBQ3dFLFFBQVEsQ0FBQ0ssR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO2NBQzVCNUcsR0FBRyxDQUFDK0IsS0FBSyxDQUFDd0UsUUFBUSxDQUFDSyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDOUI7WUFDQWhJLE1BQU0sQ0FBQ3FJLGFBQWEsQ0FBQzNHLFdBQVcsRUFBRWdHLFFBQVEsQ0FBQztVQUM3QyxDQUFDLENBQUM7VUFFRixNQUFNL0IsQ0FBQztRQUNUO01BQ0YsQ0FBQyxNQUFNO1FBQ0x2RSxHQUFHLENBQUMrQixLQUFLLENBQUMsd0JBQXdCLENBQUM7TUFDckM7SUFDRixDQUNGLENBQUM7RUFDSCxDQUFDO0VBQ0QsTUFBTW1GLFVBQVUsR0FBRyxNQUFBQSxDQUFBLEtBQVk7SUFDN0JsSCxHQUFHLENBQUMyRCxJQUFJLENBQUMsb0JBQW9CLENBQUM7SUFDOUIsTUFBTWEsU0FBUyxDQUFDMkMsSUFBSSxDQUFDLENBQUM7SUFDdEJuSCxHQUFHLENBQUMyRCxJQUFJLENBQUMsZUFBZSxDQUFDO0VBQzNCLENBQUM7RUFFRDlELE9BQU8sQ0FBQ2dHLEVBQUUsQ0FBQyxRQUFRLEVBQUUsTUFBTTtJQUN6QjdGLEdBQUcsQ0FBQ29ILElBQUksQ0FBQywwQ0FBMEMsQ0FBQztJQUNwREYsVUFBVSxDQUFDLENBQUM7SUFDWnJILE9BQU8sQ0FBQ0ksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0VBQ2xCLENBQUMsQ0FBQztFQUVGOEYsU0FBUyxDQUFDLENBQUM7QUFDYiIsImlnbm9yZUxpc3QiOltdfQ==
232
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJPYmplY3QiLCJoYXNPd24iLCJpdCIsImtleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCIsImRpc2tGcyIsImNyZWF0ZUZzRnJvbVZvbHVtZSIsIlZvbHVtZSIsInBhdGgiLCJzb3VyY2VNYXBTdXBwb3J0IiwidG1wIiwidWZzIiwicHJvbWlzaWZ5Iiwid2VicGFjayIsImxvZ2dpbmciLCJXZWJwYWNrRGV2U2VydmVyIiwiY3JlYXRlSHlicmlkUmVxdWlyZSIsImdldFdlYnBhY2tDb25maWciLCJpbXBvcnQiLCJtZXRhIiwibWFpbiIsImVudHJ5cG9pbnQiLCJwcm9jZXNzIiwiYXJndiIsImNvbnNvbGUiLCJsb2ciLCJleGl0Iiwic3RhcnREZXZTZXJ2ZXIiLCJzZXJ2ZXJGaWxlQ29udGVudHMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInNlcnZlckVudHJ5IiwiZW52Iiwid2VicGFja0NvbmZpZyIsImdldExvZ2dlciIsInZvbHVtZSIsImZzIiwidXNlIiwiZnNSZXF1aXJlIiwicmVhZEZpbGUiLCJob3RFbnRyeSIsImVudHJ5UGF0aCIsImdlbmVyYXRlZEVudHJ5cG9pbnQiLCJmaWxlU3luYyIsInBvc3RmaXgiLCJ3cml0ZVN5bmMiLCJmZCIsImN3ZCIsIndlYnBhY2tDb25maWdzIiwiZW50cnlwYXRoIiwibmFtZSIsIm1vZGUiLCJyZXBsYWNlIiwiQlJPV1NFUlNMSVNUX0VOViIsInRhcmdldCIsImNvbXBpbGVyIiwiZXJyb3IiLCJpbnN0YWxsIiwiaG9va1JlcXVpcmUiLCJnZXRTZXJ2ZXJCdW5kbGUiLCJzZXJ2ZXJTdGF0cyIsInNlcnZlckpzb24iLCJ0b0pzb24iLCJhc3NldHMiLCJqb2luIiwib3V0cHV0UGF0aCIsImhhbmRsZUVycm9ycyIsImZuIiwicmVxIiwicmVzIiwibmV4dCIsIngiLCJpbml0UmVuZGVyIiwicmVuZGVyIiwiYXJncyIsInB1c2giLCJpbXBvcnRSZW5kZXIiLCJzdGF0cyIsImNsaWVudFN0YXRzIiwiY29tcGlsYXRpb24iLCJlcnJvcnMiLCJsZW5ndGgiLCJBcnJheSIsImlzQXJyYXkiLCJpbmZvIiwiY2xpZW50TWFuaWZlc3QiLCJ0aGVuIiwiYnVmIiwidG9TdHJpbmciLCJrZXlzIiwiY2FjaGUiLCJmb3JFYWNoIiwiZGVmYXVsdCIsImJpbmQiLCJ1bmRlZmluZWQiLCJpbml0IiwiZSIsImRldlNlcnZlciIsImRldk1pZGRsZXdhcmUiLCJvdXRwdXRGaWxlU3lzdGVtIiwic2V0dXBNaWRkbGV3YXJlcyIsIm1pZGRsZXdhcmVzIiwiRXJyb3IiLCJvdGhlclJvdXRlcyIsIldFQlBBQ0tfUFVCTElDX1BBVEgiLCJwcm94eSIsImZpbHRlciIsImZsYXRNYXAiLCJjb250ZXh0IiwiYXBwIiwiZ2V0IiwiUmVnRXhwIiwidXJsIiwiZW5kc1dpdGgiLCJzdGF0dXNDb2RlIiwic2V0SGVhZGVyIiwic2VuZCIsInNvY2tldCIsIm9uIiwiY29kZSIsInJ1blNlcnZlciIsInN0YXJ0IiwiaG9va3MiLCJkb25lIiwidGFwIiwibXVsdGlTdGF0cyIsImZpbmRlciIsImZpbGVUZXh0IiwidGV4dFJvd3MiLCJzcGxpdCIsIm1hdGNoIiwic3RhY2siLCJtYXRjaEFsbCIsInJvdyIsIk51bWJlciIsInBhcnNlSW50IiwiY29sIiwiYmFzZW5hbWUiLCJ3cml0ZUZpbGVTeW5jIiwic3RvcFNlcnZlciIsInN0b3AiLCJ3YXJuIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NjcmlwdHMvc3RhcnREZXZzZXJ2ZXIudHMiXSwic291cmNlc0NvbnRlbnQiOlsiIyEvdXNyL2Jpbi9lbnYgbm9kZVxuT2JqZWN0Lmhhc093biA9XG4gIE9iamVjdC5oYXNPd24gfHxcbiAgLyogaXN0YW5idWwgaWdub3JlIG5leHQgKi8gZnVuY3Rpb24gaGFzT3duKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xuICB9O1xuaW1wb3J0IHR5cGUgeyBOZXh0RnVuY3Rpb24gfSBmcm9tICdleHByZXNzJztcbmltcG9ydCBkaXNrRnMgZnJvbSAnZnMnO1xuaW1wb3J0IHsgSW5jb21pbmdNZXNzYWdlLCBTZXJ2ZXJSZXNwb25zZSB9IGZyb20gJ2h0dHAnO1xuaW1wb3J0IHsgY3JlYXRlRnNGcm9tVm9sdW1lLCBWb2x1bWUgfSBmcm9tICdtZW1mcyc7XG5pbXBvcnQgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCBzb3VyY2VNYXBTdXBwb3J0IGZyb20gJ3NvdXJjZS1tYXAtc3VwcG9ydCc7XG5pbXBvcnQgdG1wIGZyb20gJ3RtcCc7XG5pbXBvcnQgeyB1ZnMgfSBmcm9tICd1bmlvbmZzJztcbmltcG9ydCB7IHByb21pc2lmeSB9IGZyb20gJ3V0aWwnO1xuaW1wb3J0IHdlYnBhY2ssIHsgdHlwZSBDb25maWd1cmF0aW9uLCB0eXBlIE11bHRpQ29uZmlndXJhdGlvbiB9IGZyb20gJ3dlYnBhY2snO1xuaW1wb3J0IGxvZ2dpbmcgZnJvbSAnd2VicGFjay9saWIvbG9nZ2luZy9ydW50aW1lLmpzJztcbmltcG9ydCBXZWJwYWNrRGV2U2VydmVyIGZyb20gJ3dlYnBhY2stZGV2LXNlcnZlcic7XG5cbmltcG9ydCAnY3Jvc3MtZmV0Y2gvZGlzdC9ub2RlLXBvbHlmaWxsLmpzJztcbmltcG9ydCB7IGNyZWF0ZUh5YnJpZFJlcXVpcmUgfSBmcm9tICcuL2NyZWF0ZUh5YnJpZFJlcXVpcmUuanMnO1xuaW1wb3J0IHsgZ2V0V2VicGFja0NvbmZpZyB9IGZyb20gJy4vZ2V0V2VicGFja0NvbmZpZy5qcyc7XG5pbXBvcnQgeyBCb3VuZFJlbmRlciB9IGZyb20gJy4vdHlwZXMuanMnO1xuXG4vLyBydW4gZGlyZWN0bHkgZnJvbSBub2RlXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4vLyBAdHMtaWdub3JlXG5pZiAoaW1wb3J0Lm1ldGEubWFpbikge1xuICBjb25zdCBlbnRyeXBvaW50ID0gcHJvY2Vzcy5hcmd2WzJdO1xuXG4gIGlmICghZW50cnlwb2ludCkge1xuICAgIGNvbnNvbGUubG9nKGBVc2FnZTogc3RhcnQtYW5hbnNpIDxlbnRyeXBvaW50LWZpbGU+YCk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHN0YXJ0RGV2U2VydmVyKGVudHJ5cG9pbnQpO1xufVxuXG5sZXQgc2VydmVyRmlsZUNvbnRlbnRzOiBQcm9taXNlPHN0cmluZz4gPSBQcm9taXNlLnJlc29sdmUoJycpO1xubGV0IHNlcnZlckVudHJ5ID0gJyc7XG5cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIGZ1bmN0aW9uIHN0YXJ0RGV2U2VydmVyKFxuICBlbnRyeXBvaW50OiBzdHJpbmcsXG4gIGVudjogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fSxcbikge1xuICBjb25zdCB3ZWJwYWNrQ29uZmlnID0gYXdhaXQgZ2V0V2VicGFja0NvbmZpZygpO1xuXG4gIGNvbnN0IGxvZyA9IGxvZ2dpbmcuZ2V0TG9nZ2VyKCdhbmFuc2ktZGV2c2VydmVyJyk7XG5cbiAgLy8gU2V0IHVwIGluIG1lbW9yeSBmaWxlc3lzdGVtXG4gIGNvbnN0IHZvbHVtZSA9IG5ldyBWb2x1bWUoKTtcbiAgY29uc3QgZnMgPSBjcmVhdGVGc0Zyb21Wb2x1bWUodm9sdW1lKTtcbiAgdWZzLnVzZShkaXNrRnMpLnVzZShmcyBhcyBhbnkpO1xuXG4gIGNvbnN0IGZzUmVxdWlyZSA9IGNyZWF0ZUh5YnJpZFJlcXVpcmUodWZzKTtcblxuICBjb25zdCByZWFkRmlsZSA9IHByb21pc2lmeSh1ZnMucmVhZEZpbGUpO1xuICAvLyBHZW5lcmF0ZSBhIHRlbXBvcmFyeSBmaWxlIHNvIHdlIGNhbiBob3QgcmVsb2FkIGZyb20gdGhlIHJvb3Qgb2YgdGhlIGFwcGxpY2F0aW9uXG4gIGZ1bmN0aW9uIGhvdEVudHJ5KGVudHJ5UGF0aDogc3RyaW5nKSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lXG4gICAgLy8gQHRzLWlnbm9yZSBmb3Igc29tZSByZWFzb24gaXQncyBub3QgcGlja2luZyB1cCB0aGF0IG90aGVyIG9wdGlvbnMgYXJlIG9wdGlvbmFsXG4gICAgY29uc3QgZ2VuZXJhdGVkRW50cnlwb2ludCA9IHRtcC5maWxlU3luYyh7IHBvc3RmaXg6ICcuanMnIH0pO1xuICAgIGRpc2tGcy53cml0ZVN5bmMoXG4gICAgICBnZW5lcmF0ZWRFbnRyeXBvaW50LmZkLFxuICAgICAgYFxuICBpbXBvcnQgZW50cnkgZnJvbSBcIiR7cGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIGVudHJ5UGF0aCl9XCI7XG5cbiAgaWYgKGltcG9ydC5tZXRhLndlYnBhY2tIb3QpIHtcbiAgICBpbXBvcnQubWV0YS53ZWJwYWNrSG90LmFjY2VwdCgpO1xuICB9XG5cbiAgZXhwb3J0IGRlZmF1bHQgZW50cnk7XG4gICAgYCxcbiAgICApO1xuICAgIHJldHVybiBnZW5lcmF0ZWRFbnRyeXBvaW50O1xuICB9XG5cbiAgY29uc3Qgd2VicGFja0NvbmZpZ3M6IENvbmZpZ3VyYXRpb25bXSA9IFtcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogaG90RW50cnkoZW50cnlwb2ludCkubmFtZSxcbiAgICAgICAgbmFtZTogJ2NsaWVudCcsXG4gICAgICB9LFxuICAgICAgeyBtb2RlOiAnZGV2ZWxvcG1lbnQnIH0sXG4gICAgKSxcbiAgICB3ZWJwYWNrQ29uZmlnKFxuICAgICAge1xuICAgICAgICAuLi5lbnYsXG4gICAgICAgIGVudHJ5cGF0aDogZW50cnlwb2ludC5yZXBsYWNlKCcudHN4JywgJy5zZXJ2ZXIudHN4JyksXG4gICAgICAgIG5hbWU6ICdzZXJ2ZXInLFxuICAgICAgICBCUk9XU0VSU0xJU1RfRU5WOiAnY3VycmVudCBub2RlJyxcbiAgICAgIH0sXG4gICAgICB7IG1vZGU6ICdkZXZlbG9wbWVudCcsIHRhcmdldDogJ25vZGUnIH0sXG4gICAgKSxcbiAgXTtcblxuICAvLyBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyXG4gIGNvbnN0IGNvbXBpbGVyID0gd2VicGFjayh3ZWJwYWNrQ29uZmlncyBhcyB1bmtub3duIGFzIE11bHRpQ29uZmlndXJhdGlvbik7XG4gIGlmICghY29tcGlsZXIpIHtcbiAgICBsb2cuZXJyb3IoJ0ZhaWxlZCB0byBpbml0aWFsaXplIHRoZSB3ZWJwYWNrIGNvbXBpbGVyJyk7XG4gICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgfVxuXG4gIHNvdXJjZU1hcFN1cHBvcnQuaW5zdGFsbCh7IGhvb2tSZXF1aXJlOiB0cnVlIH0pO1xuXG4gIGZ1bmN0aW9uIGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0czogd2VicGFjay5TdGF0cykge1xuICAgIGNvbnN0IHNlcnZlckpzb24gPSBzZXJ2ZXJTdGF0cy50b0pzb24oeyBhc3NldHM6IHRydWUgfSk7XG4gICAgcmV0dXJuIHBhdGguam9pbihzZXJ2ZXJKc29uLm91dHB1dFBhdGggPz8gJycsICdzZXJ2ZXIuanMnKTtcbiAgfVxuICBmdW5jdGlvbiBoYW5kbGVFcnJvcnM8XG4gICAgRiBleHRlbmRzIChcbiAgICAgIHJlcTogUmVxdWVzdCB8IEluY29taW5nTWVzc2FnZSxcbiAgICAgIHJlczogUmVzcG9uc2UgfCBTZXJ2ZXJSZXNwb25zZSxcbiAgICApID0+IFByb21pc2U8dm9pZD4sXG4gID4oZm46IEYpIHtcbiAgICByZXR1cm4gYXN5bmMgZnVuY3Rpb24gKFxuICAgICAgcmVxOiBSZXF1ZXN0IHwgSW5jb21pbmdNZXNzYWdlLFxuICAgICAgcmVzOiBSZXNwb25zZSB8IFNlcnZlclJlc3BvbnNlLFxuICAgICAgbmV4dDogTmV4dEZ1bmN0aW9uLFxuICAgICkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGF3YWl0IGZuKHJlcSwgcmVzKTtcbiAgICAgIH0gY2F0Y2ggKHgpIHtcbiAgICAgICAgbmV4dCh4KTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgbGV0IGluaXRSZW5kZXI6XG4gICAgfCB7IGFyZ3M6IFBhcmFtZXRlcnM8Qm91bmRSZW5kZXI+OyByZXNvbHZlOiAoKSA9PiB2b2lkIH1bXVxuICAgIHwgdW5kZWZpbmVkID0gW107XG4gIGxldCByZW5kZXI6IEJvdW5kUmVuZGVyID0gKC4uLmFyZ3MpID0+XG4gICAgbmV3IFByb21pc2UocmVzb2x2ZSA9PiB7XG4gICAgICBpbml0UmVuZGVyPy5wdXNoKHsgYXJncywgcmVzb2x2ZSB9KTtcbiAgICB9KTtcblxuICBmdW5jdGlvbiBpbXBvcnRSZW5kZXIoc3RhdHM6IHdlYnBhY2suU3RhdHNbXSkge1xuICAgIGNvbnN0IFtjbGllbnRTdGF0cywgc2VydmVyU3RhdHNdID0gc3RhdHM7XG4gICAgaWYgKFxuICAgICAgY2xpZW50U3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aCB8fFxuICAgICAgc2VydmVyU3RhdHM/LmNvbXBpbGF0aW9uPy5lcnJvcnM/Lmxlbmd0aFxuICAgICkge1xuICAgICAgbG9nLmVycm9yKCdFcnJvcnMgZm9yIGNsaWVudCBidWlsZDogJyArIGNsaWVudFN0YXRzLmNvbXBpbGF0aW9uLmVycm9ycyk7XG4gICAgICBsb2cuZXJyb3IoJ0Vycm9ycyBmb3Igc2VydmVyIGJ1aWxkOiAnICsgc2VydmVyU3RhdHMuY29tcGlsYXRpb24uZXJyb3JzKTtcbiAgICAgIC8vIGZpcnN0IHRpbWUsIHJhdGhlciB0aGFuIHJlLXJlbmRlclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgIH1cbiAgICAgIGxvZy5lcnJvcignQWJvdmUgY29tcGlsZXIgZXJyb3JzIGJsb2NraW5nIHJlbG9hZCcpO1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSB7XG4gICAgICBsb2cuaW5mbygnTGF1bmNoaW5nIFNTUicpO1xuICAgIH1cblxuICAgIC8vIEFTU0VUU1xuICAgIGNvbnN0IGNsaWVudE1hbmlmZXN0ID0gY2xpZW50U3RhdHMudG9Kc29uKCk7XG5cbiAgICBzZXJ2ZXJFbnRyeSA9IGdldFNlcnZlckJ1bmRsZShzZXJ2ZXJTdGF0cyk7XG4gICAgc2VydmVyRmlsZUNvbnRlbnRzID0gcmVhZEZpbGUoc2VydmVyRW50cnkpLnRoZW4oYnVmID0+IGJ1Zi50b1N0cmluZygpKTtcbiAgICAvLyByZWxvYWQgbW9kdWxlc1xuICAgIE9iamVjdC5rZXlzKGZzUmVxdWlyZS5jYWNoZSkuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgZGVsZXRlIGZzUmVxdWlyZS5jYWNoZVtrZXldO1xuICAgIH0pO1xuICAgIHJlbmRlciA9IChmc1JlcXVpcmUoc2VydmVyRW50cnkpIGFzIGFueSkuZGVmYXVsdC5iaW5kKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgY2xpZW50TWFuaWZlc3QsXG4gICAgKTtcbiAgICAvLyBTRVJWRVIgU0lERSBFTlRSWVBPSU5UXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5pdFJlbmRlcikpIHtcbiAgICAgIGluaXRSZW5kZXIuZm9yRWFjaChhc3luYyBpbml0ID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBsb2cuaW5mbygnUmVzb2x2aW5nIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGF3YWl0IHJlbmRlciguLi5pbml0LmFyZ3MpO1xuICAgICAgICAgIGluaXQucmVzb2x2ZSgpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgbG9nLmVycm9yKCdFcnJvciB3aGVuIGF0dGVtcHRpbmcgdG8gcmVuZGVyIHF1ZXVlZCByZXF1ZXN0cycpO1xuICAgICAgICAgIGxvZy5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpbml0UmVuZGVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGRldlNlcnZlciA9IG5ldyBXZWJwYWNrRGV2U2VydmVyKFxuICAgIC8vIHdyaXRlIHRvIG1lbW9yeSBmaWxlc3lzdGVtIHNvIHdlIGNhbiBpbXBvcnRcbiAgICB7XG4gICAgICAuLi53ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIsXG4gICAgICBkZXZNaWRkbGV3YXJlOiB7XG4gICAgICAgIC4uLndlYnBhY2tDb25maWdzWzBdPy5kZXZTZXJ2ZXI/LmRldk1pZGRsZXdhcmUsXG4gICAgICAgIG91dHB1dEZpbGVTeXN0ZW06IHtcbiAgICAgICAgICAuLi5mcyxcbiAgICAgICAgICBqb2luOiBwYXRoLmpvaW4gYXMgYW55LFxuICAgICAgICB9IGFzIGFueSxcbiAgICAgIH0sXG4gICAgICBzZXR1cE1pZGRsZXdhcmVzOiAobWlkZGxld2FyZXMsIGRldlNlcnZlcikgPT4ge1xuICAgICAgICBpZiAoIWRldlNlcnZlcikge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignd2VicGFjay1kZXYtc2VydmVyIGlzIG5vdCBkZWZpbmVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBvdGhlclJvdXRlcyA9IFtcbiAgICAgICAgICBwcm9jZXNzLmVudi5XRUJQQUNLX1BVQkxJQ19QQVRILFxuICAgICAgICAgIC4uLih3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXI/LnByb3h5XG4gICAgICAgICAgICA/LmZpbHRlcihwcm94eSA9PiB0eXBlb2YgcHJveHkgPT09ICdvYmplY3QnKVxuICAgICAgICAgICAgPy5mbGF0TWFwKHByb3h5ID0+IHByb3h5LmNvbnRleHQpID8/IFtdKSxcbiAgICAgICAgXTtcbiAgICAgICAgLy8gc2VydmUgU1NSIGZvciBub24tV0VCUEFDS19QVUJMSUNfUEFUSFxuICAgICAgICBkZXZTZXJ2ZXIuYXBwPy5nZXQoXG4gICAgICAgICAgbmV3IFJlZ0V4cChgXig/ISR7b3RoZXJSb3V0ZXMuam9pbignfCcpfSlgKSxcbiAgICAgICAgICBoYW5kbGVFcnJvcnMoYXN5bmMgZnVuY3Rpb24gKHJlcTogYW55LCByZXM6IGFueSkge1xuICAgICAgICAgICAgaWYgKHJlcS51cmwuZW5kc1dpdGgoJ2Zhdmljb24uaWNvJykpIHtcbiAgICAgICAgICAgICAgcmVzLnN0YXR1c0NvZGUgPSA0MDQ7XG4gICAgICAgICAgICAgIHJlcy5zZXRIZWFkZXIoJ0NvbnRlbnQtdHlwZScsICd0ZXh0L2h0bWwnKTtcbiAgICAgICAgICAgICAgcmVzLnNlbmQoJ25vdCBmb3VuZCcpO1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXMuc29ja2V0Lm9uKCdlcnJvcicsIChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgICAgICAgICAgICBsb2cuZXJyb3IoJ0ZhdGFsOicsIGVycm9yKTtcbiAgICAgICAgICAgICAgaWYgKChlcnJvciBhcyBhbnkpLmNvZGUgPT09ICdFQ09OTlJFU0VUJykge1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcihcbiAgICAgICAgICAgICAgICAgICdFQ09OTlJFU0VUIGlzIHVzdWFsbHkgZHVlIHRvIGJyb3dzZXIgY2xvc2luZyB0aGUgY29ubmVjdGlvbicsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGF3YWl0IHJlbmRlcihyZXEsIHJlcyk7XG4gICAgICAgICAgfSksXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHdlYnBhY2tDb25maWdzWzBdLmRldlNlcnZlcj8uc2V0dXBNaWRkbGV3YXJlcykge1xuICAgICAgICAgIHJldHVybiB3ZWJwYWNrQ29uZmlnc1swXS5kZXZTZXJ2ZXIuc2V0dXBNaWRkbGV3YXJlcyhcbiAgICAgICAgICAgIG1pZGRsZXdhcmVzLFxuICAgICAgICAgICAgZGV2U2VydmVyLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWlkZGxld2FyZXM7XG4gICAgICB9LFxuICAgIH0sXG4gICAgY29tcGlsZXIsXG4gICk7XG4gIGNvbnN0IHJ1blNlcnZlciA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RhcnQoKTtcbiAgICBkZXZTZXJ2ZXIuY29tcGlsZXIuaG9va3MuZG9uZS50YXAoXG4gICAgICAnQW5hbnNpIFNlcnZlcicsXG4gICAgICAobXVsdGlTdGF0czogd2VicGFjay5NdWx0aVN0YXRzIHwgd2VicGFjay5TdGF0cykgPT4ge1xuICAgICAgICBpZiAoIW11bHRpU3RhdHMpIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ3N0YXRzIG5vdCBzZW5kJyk7XG4gICAgICAgICAgcHJvY2Vzcy5leGl0KC0xKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghT2JqZWN0Lmhhc093bihtdWx0aVN0YXRzLCAnc3RhdHMnKSkgcmV0dXJuO1xuICAgICAgICBpZiAoKG11bHRpU3RhdHMgYXMgd2VicGFjay5NdWx0aVN0YXRzKS5zdGF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGltcG9ydFJlbmRlcigobXVsdGlTdGF0cyBhcyB3ZWJwYWNrLk11bHRpU3RhdHMpLnN0YXRzKTtcbiAgICAgICAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgICAgICAgIGxvZy5lcnJvcignRmFpbGVkIHRvIGxvYWQgc2VydmUgZW50cnlwb2ludCcpO1xuICAgICAgICAgICAgY29uc3QgZmluZGVyID0gbmV3IFJlZ0V4cChgJHtzZXJ2ZXJFbnRyeX06KFtcXFxcZF0rKTooW1xcXFxkXSspYCwgJ2cnKTtcbiAgICAgICAgICAgIHNlcnZlckZpbGVDb250ZW50cy50aGVuKGZpbGVUZXh0ID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgdGV4dFJvd3MgPSBmaWxlVGV4dC5zcGxpdCgnXFxuJyk7XG4gICAgICAgICAgICAgIGxvZy5lcnJvcignPj4+IFN0YWNrIENvbnRleHQgW3NlcnZlIGVudHJ5cG9pbnRdIDw8PCcpO1xuICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGUuc3RhY2subWF0Y2hBbGwoZmluZGVyKSA/PyBbXSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IE51bWJlci5wYXJzZUludChtYXRjaFsxXSk7XG4gICAgICAgICAgICAgICAgY29uc3QgY29sID0gTnVtYmVyLnBhcnNlSW50KG1hdGNoWzJdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IocGF0aC5iYXNlbmFtZShzZXJ2ZXJFbnRyeSkgKyAnICcgKyByb3cgKyAnOicgKyBjb2wpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgLSAyXSk7XG4gICAgICAgICAgICAgICAgbG9nLmVycm9yKHRleHRSb3dzW3JvdyAtIDFdKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IoQXJyYXkoY29sKS5qb2luKCcgJykgKyAnXicpO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3ddKTtcbiAgICAgICAgICAgICAgICBsb2cuZXJyb3IodGV4dFJvd3Nbcm93ICsgMV0pO1xuICAgICAgICAgICAgICAgIGxvZy5lcnJvcih0ZXh0Um93c1tyb3cgKyAyXSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGlza0ZzLndyaXRlRmlsZVN5bmMoc2VydmVyRW50cnksIGZpbGVUZXh0KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBsb2cuZXJyb3IoJ09ubHkgY29tcGlsZXIgb25lIHN0YXQnKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9O1xuICBjb25zdCBzdG9wU2VydmVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGxvZy5pbmZvKCdTdG9wcGluZyBzZXJ2ZXIuLi4nKTtcbiAgICBhd2FpdCBkZXZTZXJ2ZXIuc3RvcCgpO1xuICAgIGxvZy5pbmZvKCdTZXJ2ZXIgY2xvc2VkJyk7XG4gIH07XG5cbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgKCkgPT4ge1xuICAgIGxvZy53YXJuKCdSZWNlaXZlZCBTSUdJTlQsIGRldnNlcnZlciBzaHV0dGluZyBkb3duJyk7XG4gICAgc3RvcFNlcnZlcigpO1xuICAgIHByb2Nlc3MuZXhpdCgtMSk7XG4g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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anansi/core",
3
- "version": "0.20.39",
3
+ "version": "0.20.40",
4
4
  "description": "React 19 Framework",
5
5
  "homepage": "https://github.com/ntucker/anansi/tree/master/packages/core#readme",
6
6
  "repository": {
@@ -71,8 +71,8 @@
71
71
  "@types/compression": "1.8.1",
72
72
  "@types/express": "^4.17.17",
73
73
  "@types/node": "^24.0.0",
74
- "@types/react": "19.2.2",
75
- "@types/react-dom": "19.2.2",
74
+ "@types/react": "19.2.5",
75
+ "@types/react-dom": "19.2.3",
76
76
  "@types/source-map-support": "0.5.10",
77
77
  "@types/tmp": "0.2.6",
78
78
  "@types/webpack-hot-middleware": "2.25.12",
@@ -0,0 +1,172 @@
1
+ import diskFs from 'fs';
2
+ import { createFsFromVolume, Volume } from 'memfs';
3
+ import path from 'path';
4
+ import tmp from 'tmp';
5
+ import { ufs } from 'unionfs';
6
+
7
+ import { createHybridRequire } from '../createHybridRequire';
8
+
9
+ /**
10
+ * Regression test to ensure hybridRequire resolves from the initial
11
+ * working directory even if process.cwd() changes after initialization.
12
+ * This guards against future refactors that might call process.chdir.
13
+ */
14
+ describe('hybridRequire - process.cwd() variance regression', () => {
15
+ let tempDir: string;
16
+ let originalCwd: string;
17
+
18
+ beforeEach(() => {
19
+ originalCwd = process.cwd();
20
+ tempDir = tmp.dirSync({ unsafeCleanup: true }).name;
21
+ });
22
+
23
+ afterEach(() => {
24
+ process.chdir(originalCwd);
25
+ });
26
+
27
+ it('should capture projectRequire path at initialization time', () => {
28
+ const projectRoot = path.join(tempDir, 'project');
29
+ const otherDir = path.join(tempDir, 'other');
30
+
31
+ // Create project structure
32
+ diskFs.mkdirSync(projectRoot, { recursive: true });
33
+ diskFs.mkdirSync(otherDir, { recursive: true });
34
+
35
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
36
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-cwd');
37
+ const testFile = path.join(testPackageDir, 'index.js');
38
+
39
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
40
+ diskFs.writeFileSync(
41
+ testFile,
42
+ "module.exports = { default: 'from-project-root' };",
43
+ );
44
+ diskFs.writeFileSync(
45
+ path.join(testPackageDir, 'package.json'),
46
+ JSON.stringify({ name: 'test-package-cwd', main: 'index.js' }),
47
+ );
48
+
49
+ diskFs.writeFileSync(
50
+ path.join(projectRoot, 'package.json'),
51
+ JSON.stringify({ name: 'project' }),
52
+ );
53
+
54
+ // Create another package.json in otherDir (should not be used)
55
+ diskFs.writeFileSync(
56
+ path.join(otherDir, 'package.json'),
57
+ JSON.stringify({ name: 'other' }),
58
+ );
59
+
60
+ // Set up memfs WITHOUT diskFs to test fallback
61
+ const volume = new Volume();
62
+ const fs = createFsFromVolume(volume);
63
+ ufs.use(fs as any);
64
+
65
+ // Initialize hybridRequire while in projectRoot
66
+ process.chdir(projectRoot);
67
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
68
+
69
+ // Change to other directory
70
+ process.chdir(otherDir);
71
+
72
+ // Verify process.cwd() changed
73
+ expect(process.cwd()).toBe(otherDir);
74
+
75
+ // hybridRequire should still resolve from projectRoot (captured at init)
76
+ const result = hybridRequire('test-package-cwd');
77
+ expect(result.default).toBe('from-project-root');
78
+ });
79
+
80
+ it('should work correctly when process.cwd() is different from projectRoot', () => {
81
+ const projectRoot = path.join(tempDir, 'workspace', 'examples', 'app');
82
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
83
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-nested');
84
+ const testFile = path.join(testPackageDir, 'index.js');
85
+
86
+ // Create nested structure
87
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
88
+ diskFs.writeFileSync(
89
+ testFile,
90
+ "module.exports = { default: 'from-nested-workspace' };",
91
+ );
92
+ diskFs.writeFileSync(
93
+ path.join(testPackageDir, 'package.json'),
94
+ JSON.stringify({ name: 'test-package-nested', main: 'index.js' }),
95
+ );
96
+
97
+ diskFs.writeFileSync(
98
+ path.join(projectRoot, 'package.json'),
99
+ JSON.stringify({ name: 'app' }),
100
+ );
101
+
102
+ // Set up memfs WITHOUT diskFs to test fallback
103
+ const volume = new Volume();
104
+ const fs = createFsFromVolume(volume);
105
+ ufs.use(fs as any);
106
+
107
+ // Initialize from a different directory (simulating monorepo root)
108
+ const monorepoRoot = path.join(tempDir, 'workspace');
109
+ process.chdir(monorepoRoot);
110
+
111
+ // Create hybridRequire with explicit projectRoot (not process.cwd())
112
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
113
+
114
+ // Verify it resolves from projectRoot, not monorepoRoot
115
+ const result = hybridRequire('test-package-nested');
116
+ expect(result.default).toBe('from-nested-workspace');
117
+ });
118
+
119
+ it('should handle multiple chdir calls without breaking', () => {
120
+ const projectRoot = path.join(tempDir, 'project');
121
+ const dir1 = path.join(tempDir, 'dir1');
122
+ const dir2 = path.join(tempDir, 'dir2');
123
+
124
+ diskFs.mkdirSync(projectRoot, { recursive: true });
125
+ diskFs.mkdirSync(dir1, { recursive: true });
126
+ diskFs.mkdirSync(dir2, { recursive: true });
127
+
128
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
129
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-stable');
130
+ const testFile = path.join(testPackageDir, 'index.js');
131
+
132
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
133
+ diskFs.writeFileSync(
134
+ testFile,
135
+ "module.exports = { default: 'stable-reference' };",
136
+ );
137
+ diskFs.writeFileSync(
138
+ path.join(testPackageDir, 'package.json'),
139
+ JSON.stringify({ name: 'test-package-stable', main: 'index.js' }),
140
+ );
141
+
142
+ diskFs.writeFileSync(
143
+ path.join(projectRoot, 'package.json'),
144
+ JSON.stringify({ name: 'project' }),
145
+ );
146
+
147
+ // Set up memfs WITHOUT diskFs to test fallback
148
+ const volume = new Volume();
149
+ const fs = createFsFromVolume(volume);
150
+ ufs.use(fs as any);
151
+
152
+ // Initialize
153
+ process.chdir(projectRoot);
154
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
155
+
156
+ // Multiple chdir calls
157
+ process.chdir(dir1);
158
+ expect(hybridRequire('test-package-stable').default).toBe(
159
+ 'stable-reference',
160
+ );
161
+
162
+ process.chdir(dir2);
163
+ expect(hybridRequire('test-package-stable').default).toBe(
164
+ 'stable-reference',
165
+ );
166
+
167
+ process.chdir(projectRoot);
168
+ expect(hybridRequire('test-package-stable').default).toBe(
169
+ 'stable-reference',
170
+ );
171
+ });
172
+ });
@@ -0,0 +1,243 @@
1
+ import diskFs from 'fs';
2
+ import { createFsRequire } from 'fs-require';
3
+ import { createFsFromVolume, Volume } from 'memfs';
4
+ import path from 'path';
5
+ import tmp from 'tmp';
6
+ import { ufs } from 'unionfs';
7
+
8
+ import { createHybridRequire } from '../createHybridRequire';
9
+
10
+ describe('hybridRequire wrapper', () => {
11
+ let tempDir: string;
12
+ let originalCwd: string;
13
+
14
+ beforeEach(() => {
15
+ originalCwd = process.cwd();
16
+ tempDir = tmp.dirSync({ unsafeCleanup: true }).name;
17
+ });
18
+
19
+ afterEach(() => {
20
+ process.chdir(originalCwd);
21
+ });
22
+
23
+ describe('unit tests - fallback resolver', () => {
24
+ it('should resolve bare specifiers from project node_modules when not in memfs', () => {
25
+ // Set up a temp directory with node_modules containing a test package
26
+ const projectRoot = tempDir;
27
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
28
+ const testPackageDir = path.join(nodeModulesDir, 'test-package');
29
+ const testFile = path.join(testPackageDir, 'index.js');
30
+
31
+ // Create directory structure with a unique package name to avoid conflicts
32
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
33
+ diskFs.writeFileSync(
34
+ testFile,
35
+ "module.exports = { default: 'test-export-value', test: 'value' };",
36
+ );
37
+
38
+ // Create package.json for the test package
39
+ diskFs.writeFileSync(
40
+ path.join(testPackageDir, 'package.json'),
41
+ JSON.stringify({ name: 'test-package', main: 'index.js' }),
42
+ );
43
+
44
+ // Create package.json in project root
45
+ diskFs.writeFileSync(
46
+ path.join(projectRoot, 'package.json'),
47
+ JSON.stringify({ name: 'test-project' }),
48
+ );
49
+
50
+ // Set up memfs WITHOUT diskFs to simulate memfs-only scenario
51
+ // This way fsRequire will fail (module not in memfs)
52
+ // and hybridRequire will fall back to projectRequire
53
+ const volume = new Volume();
54
+ const fs = createFsFromVolume(volume);
55
+ // Only use memfs, not disk - this simulates the webpack output scenario
56
+ ufs.use(fs as any);
57
+
58
+ const fsRequire = createFsRequire(ufs);
59
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
60
+
61
+ // Mock process.cwd to return our temp directory
62
+ const originalCwd = process.cwd;
63
+ process.cwd = jest.fn(() => projectRoot);
64
+
65
+ try {
66
+ // fsRequire should fail because test-package is not in memfs
67
+ expect(() => {
68
+ fsRequire('test-package');
69
+ }).toThrow();
70
+
71
+ // hybridRequire should succeed by falling back to project node_modules
72
+ const result = hybridRequire('test-package');
73
+ expect(result).toBeDefined();
74
+ expect(result.default).toBe('test-export-value');
75
+ expect(result.test).toBe('value');
76
+ } finally {
77
+ process.cwd = originalCwd;
78
+ }
79
+ });
80
+
81
+ it('should work with unionfs when module exists in both disk and memfs', () => {
82
+ const projectRoot = tempDir;
83
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
84
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-union');
85
+ const testFile = path.join(testPackageDir, 'index.js');
86
+
87
+ // Create directory structure on disk
88
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
89
+ diskFs.writeFileSync(
90
+ testFile,
91
+ "module.exports = { default: 'disk-version' };",
92
+ );
93
+ diskFs.writeFileSync(
94
+ path.join(testPackageDir, 'package.json'),
95
+ JSON.stringify({ name: 'test-package-union', main: 'index.js' }),
96
+ );
97
+
98
+ diskFs.writeFileSync(
99
+ path.join(projectRoot, 'package.json'),
100
+ JSON.stringify({ name: 'test-project' }),
101
+ );
102
+
103
+ // Set up memfs with the same module (different version)
104
+ const volume = new Volume();
105
+ const fs = createFsFromVolume(volume);
106
+ const memfsPath = path.join('/node_modules/test-package-union/index.js');
107
+ fs.mkdirSync(path.dirname(memfsPath), { recursive: true });
108
+ fs.writeFileSync(
109
+ memfsPath,
110
+ "module.exports = { default: 'memfs-version' };",
111
+ );
112
+
113
+ // unionfs checks disk first, then memfs (same as dev server)
114
+ ufs.use(diskFs).use(fs as any);
115
+
116
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
117
+
118
+ // hybridRequire should get disk version (unionfs checks disk first)
119
+ // This verifies that hybridRequire correctly uses fsRequire with unionfs
120
+ const result = hybridRequire('test-package-union');
121
+ expect(result.default).toBe('disk-version');
122
+ });
123
+
124
+ it('should handle relative paths without fallback', () => {
125
+ const projectRoot = tempDir;
126
+ diskFs.writeFileSync(
127
+ path.join(projectRoot, 'package.json'),
128
+ JSON.stringify({ name: 'test-project' }),
129
+ );
130
+
131
+ const volume = new Volume();
132
+ const fs = createFsFromVolume(volume);
133
+ const relativeFile = '/relative.js';
134
+ fs.writeFileSync(
135
+ relativeFile,
136
+ "module.exports = { default: 'relative-export' };",
137
+ );
138
+
139
+ ufs.use(diskFs).use(fs as any);
140
+
141
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
142
+
143
+ // Relative paths should work through memfs
144
+ const result = hybridRequire(relativeFile);
145
+ expect(result.default).toBe('relative-export');
146
+
147
+ // If relative path fails, it should throw (not fallback)
148
+ expect(() => hybridRequire('./nonexistent.js')).toThrow();
149
+ });
150
+
151
+ it('should throw non-MODULE_NOT_FOUND errors', () => {
152
+ const projectRoot = tempDir;
153
+ diskFs.writeFileSync(
154
+ path.join(projectRoot, 'package.json'),
155
+ JSON.stringify({ name: 'test-project' }),
156
+ );
157
+
158
+ const volume = new Volume();
159
+ const fs = createFsFromVolume(volume);
160
+ ufs.use(diskFs).use(fs as any);
161
+
162
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
163
+
164
+ // Create a file that will cause a different error
165
+ const badFile = '/bad.js';
166
+ fs.writeFileSync(badFile, 'invalid syntax !!!');
167
+
168
+ // Should throw the original error, not attempt fallback
169
+ expect(() => hybridRequire(badFile)).toThrow();
170
+ });
171
+
172
+ it('should preserve cache and resolve properties', () => {
173
+ const projectRoot = tempDir;
174
+ diskFs.writeFileSync(
175
+ path.join(projectRoot, 'package.json'),
176
+ JSON.stringify({ name: 'test-project' }),
177
+ );
178
+
179
+ const volume = new Volume();
180
+ const fs = createFsFromVolume(volume);
181
+ ufs.use(diskFs).use(fs as any);
182
+
183
+ // Create hybridRequire (which creates fsRequire internally)
184
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
185
+
186
+ // Verify cache and resolve are preserved from the internal fsRequire
187
+ expect(hybridRequire.cache).toBeDefined();
188
+ expect(typeof hybridRequire.cache).toBe('object');
189
+ expect(hybridRequire.resolve).toBeDefined();
190
+ expect(typeof hybridRequire.resolve).toBe('function');
191
+ // Verify resolve works
192
+ expect(() => hybridRequire.resolve('some-module')).not.toThrow();
193
+ });
194
+ });
195
+
196
+ describe('regression test - process.cwd variance', () => {
197
+ it('should resolve from initial working directory even after process.chdir', () => {
198
+ const projectRoot = tempDir;
199
+ const nodeModulesDir = path.join(projectRoot, 'node_modules');
200
+ const testPackageDir = path.join(nodeModulesDir, 'test-package-3');
201
+ const testFile = path.join(testPackageDir, 'index.js');
202
+
203
+ // Create directory structure
204
+ diskFs.mkdirSync(testPackageDir, { recursive: true });
205
+ diskFs.writeFileSync(
206
+ testFile,
207
+ "module.exports = { default: 'test-export-value' };",
208
+ );
209
+ diskFs.writeFileSync(
210
+ path.join(testPackageDir, 'package.json'),
211
+ JSON.stringify({ name: 'test-package-3', main: 'index.js' }),
212
+ );
213
+
214
+ diskFs.writeFileSync(
215
+ path.join(projectRoot, 'package.json'),
216
+ JSON.stringify({ name: 'test-project' }),
217
+ );
218
+
219
+ // Create another directory that we'll chdir to
220
+ const otherDir = tmp.dirSync({ unsafeCleanup: true }).name;
221
+ diskFs.writeFileSync(
222
+ path.join(otherDir, 'package.json'),
223
+ JSON.stringify({ name: 'other-project' }),
224
+ );
225
+
226
+ // Set up memfs WITHOUT diskFs to test fallback
227
+ const volume = new Volume();
228
+ const fs = createFsFromVolume(volume);
229
+ ufs.use(fs as any);
230
+
231
+ // Capture projectRequire at initial cwd
232
+ const hybridRequire = createHybridRequire(ufs, projectRoot);
233
+
234
+ // Change directory
235
+ process.chdir(otherDir);
236
+
237
+ // hybridRequire should still resolve from the original projectRoot
238
+ // because projectRequire was created with that path
239
+ const result = hybridRequire('test-package-3');
240
+ expect(result.default).toBe('test-export-value');
241
+ });
242
+ });
243
+ });
@@ -0,0 +1,4 @@
1
+ {
2
+ "extends": "../../../tsconfig.test.json"
3
+ }
4
+
@@ -0,0 +1,42 @@
1
+ import { createFsRequire } from 'fs-require';
2
+ import { createRequire } from 'module';
3
+ import path from 'path';
4
+ import { type IUnionFs } from 'unionfs';
5
+
6
+ /**
7
+ * Creates a hybrid require function that combines fs-require (for in-memory files)
8
+ * with Node's native require (for bare specifiers from project node_modules).
9
+ *
10
+ * This solves the issue where fs-require cannot resolve bare specifiers like
11
+ * `@anansi/core/server` from workspace node_modules when they're not in the
12
+ * memfs bundle.
13
+ *
14
+ * @param ufs - The unionfs instance (disk first, then memfs)
15
+ * @param projectRoot - Optional project root directory. Defaults to process.cwd()
16
+ * @returns A require function that tries memfs first, then falls back to project node_modules
17
+ */
18
+ export function createHybridRequire(
19
+ ufs: IUnionFs,
20
+ projectRoot: string = process.cwd(),
21
+ ): ReturnType<typeof createFsRequire> {
22
+ const fsRequire = createFsRequire(ufs);
23
+ const projectRequire = createRequire(path.join(projectRoot, 'package.json'));
24
+
25
+ function hybridRequire(id: string) {
26
+ try {
27
+ return fsRequire(id);
28
+ } catch (error: any) {
29
+ const isBare = !id.startsWith('.') && !path.isAbsolute(id);
30
+ if (isBare && error?.code === 'MODULE_NOT_FOUND') {
31
+ return projectRequire(id);
32
+ }
33
+ throw error;
34
+ }
35
+ }
36
+
37
+ // Preserve cache and resolve properties from fsRequire
38
+ hybridRequire.cache = fsRequire.cache;
39
+ hybridRequire.resolve = fsRequire.resolve;
40
+
41
+ return hybridRequire as ReturnType<typeof createFsRequire>;
42
+ }
@@ -6,7 +6,6 @@ Object.hasOwn =
6
6
  };
7
7
  import type { NextFunction } from 'express';
8
8
  import diskFs from 'fs';
9
- import { createFsRequire } from 'fs-require';
10
9
  import { IncomingMessage, ServerResponse } from 'http';
11
10
  import { createFsFromVolume, Volume } from 'memfs';
12
11
  import path from 'path';
@@ -19,6 +18,7 @@ import logging from 'webpack/lib/logging/runtime.js';
19
18
  import WebpackDevServer from 'webpack-dev-server';
20
19
 
21
20
  import 'cross-fetch/dist/node-polyfill.js';
21
+ import { createHybridRequire } from './createHybridRequire.js';
22
22
  import { getWebpackConfig } from './getWebpackConfig.js';
23
23
  import { BoundRender } from './types.js';
24
24
 
@@ -52,7 +52,8 @@ export default async function startDevServer(
52
52
  const fs = createFsFromVolume(volume);
53
53
  ufs.use(diskFs).use(fs as any);
54
54
 
55
- const fsRequire = createFsRequire(ufs);
55
+ const fsRequire = createHybridRequire(ufs);
56
+
56
57
  const readFile = promisify(ufs.readFile);
57
58
  // Generate a temporary file so we can hot reload from the root of the application
58
59
  function hotEntry(entryPath: string) {