@analogjs/vitest-angular 2.0.0-beta.16 → 2.0.0-beta.18

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@analogjs/vitest-angular",
3
- "version": "2.0.0-beta.16",
3
+ "version": "2.0.0-beta.18",
4
4
  "description": "Vitest Builder for Angular",
5
5
  "type": "module",
6
6
  "author": "Brandon Roberts <robertsbt@gmail.com>",
@@ -1,5 +1,6 @@
1
1
  import { createBuilder } from '@angular-devkit/architect';
2
2
  import * as path from 'path';
3
+ import { globSync } from 'tinyglobby';
3
4
  import { createAngularMemoryPlugin } from './plugins/angular-memory-plugin';
4
5
  import { esbuildDownlevelPlugin } from './plugins/esbuild-downlevel-plugin';
5
6
  import { getBuildApplicationFunction } from './devkit';
@@ -125,14 +126,49 @@ export async function getExtraArgs(options) {
125
126
  }
126
127
  return extraArgs;
127
128
  }
129
+ /**
130
+ * Finds test files to include in the Vitest run using tinyglobby pattern matching.
131
+ *
132
+ * This function:
133
+ * 1. Normalizes the project root path to ensure consistent path separators
134
+ * 2. Constructs glob patterns by prepending the project root to each include pattern
135
+ * 3. Uses globSync from tinyglobby to find all files matching the patterns while respecting exclusions
136
+ *
137
+ * @param options Configuration object containing workspace and project paths, include/exclude patterns
138
+ * @returns Array of absolute file paths that match the include patterns
139
+ *
140
+ * Sample output paths:
141
+ * - /workspace/apps/my-app/src/app/app.component.spec.ts
142
+ * - /workspace/apps/my-app/src/app/services/data.service.spec.ts
143
+ * - /workspace/apps/my-app/src/app/components/header/header.component.test.ts
144
+ * - /workspace/apps/my-app/src/app/utils/helpers.spec.ts
145
+ *
146
+ * tinyglobby vs fast-glob comparison:
147
+ * - Both support the same glob patterns and ignore functionality
148
+ * - Both are fast and efficient for file matching
149
+ * - tinyglobby is a lighter alternative with similar API
150
+ * - tinyglobby's globSync returns absolute paths by default when absolute: true is set
151
+ * - tinyglobby has fewer dependencies and smaller bundle size
152
+ *
153
+ * globSync options explained:
154
+ * - dot: true - Includes files/directories that start with a dot (e.g., .env.test)
155
+ * - absolute: true - Returns absolute file paths instead of relative paths
156
+ * - ignore: options.exclude - Excludes files matching the exclude patterns
157
+ */
128
158
  function findIncludes(options) {
129
- const fg = require('fast-glob');
130
159
  const { normalizePath } = require('vite');
160
+ // Normalize project root path to ensure consistent path separators across platforms
131
161
  const projectRoot = normalizePath(path.resolve(options.workspaceRoot, options.projectRoot));
162
+ // Construct glob patterns by prepending project root to each include pattern
163
+ // Example: if include=['**/*.spec.ts'] and projectRoot='/workspace/apps/my-app'
164
+ // Result: ['/workspace/apps/my-app/**/*.spec.ts']
132
165
  const globs = [...options.include.map((glob) => `${projectRoot}/${glob}`)];
133
- return fg.sync(globs, {
134
- dot: true,
135
- ignore: options.exclude,
166
+ // Use globSync from tinyglobby to find all files matching the patterns
167
+ // Returns absolute file paths that match the include patterns while respecting exclusions
168
+ return globSync(globs, {
169
+ dot: true, // Include files/directories starting with dot (e.g., .env.test)
170
+ absolute: true, // Return absolute file paths
171
+ ignore: options.exclude, // Exclude files matching these patterns
136
172
  });
137
173
  }
138
174
  function generateEntryPoints({ projectRoot, testFiles, context, angularVersion, }) {
@@ -158,4 +194,4 @@ function generateEntryPoints({ projectRoot, testFiles, context, angularVersion,
158
194
  }));
159
195
  }
160
196
  export default createBuilder(vitestApplicationBuilder);
161
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL2J1aWxkZXJzL2J1aWxkL3ZpdGVzdC5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQU03QixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFdkQsTUFBTSxDQUFOLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQixpREFBTyxDQUFBO0lBQ1AsMkNBQUksQ0FBQTtJQUNKLHlEQUFXLENBQUE7SUFDWCxpRUFBZSxDQUFBO0FBQ2pCLENBQUMsRUFMVyxVQUFVLEtBQVYsVUFBVSxRQUtyQjtBQUVELE9BQU8sQ0FBQyxHQUFHLENBQUMseUJBQXlCLENBQUMsR0FBRyxNQUFNLENBQUM7QUFFaEQsS0FBSyxTQUFTLENBQUMsQ0FBQyx3QkFBd0IsQ0FDdEMsT0FBcUIsRUFDckIsT0FBWTtJQUVaLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzdCLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO0lBRS9CLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxjQUFjLEVBQUUsR0FDaEQsTUFBTSwyQkFBMkIsRUFBRSxDQUFDO0lBQ3RDLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FBRyxNQUFPLFFBQVEsQ0FDckMsOEJBQThCLENBQy9CLEVBQTRDLENBQUM7SUFFOUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxP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RSxDQUFDO1lBQzVCLFVBQVUsR0FBRyxHQUFHLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxFQUFFLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxlQUFlLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgVml0ZXN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICd2aXRlJztcbmltcG9ydCB0eXBlIHsgVGVzdFVzZXJDb25maWcgYXMgVml0ZXN0Q29uZmlnIH0gZnJvbSAndml0ZXN0L25vZGUnO1xuXG5pbXBvcnQgeyBWaXRlc3RTY2hlbWEgfSBmcm9tICcuL3NjaGVtYSc7XG5pbXBvcnQgeyBjcmVhdGVBbmd1bGFyTWVtb3J5UGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zL2FuZ3VsYXItbWVtb3J5LXBsdWdpbic7XG5pbXBvcnQgeyBlc2J1aWxkRG93bmxldmVsUGx1Z2luIH0gZnJvbSAnLi9wbHVnaW5zL2VzYnVpbGQtZG93bmxldmVsLXBsdWdpbic7XG5pbXBvcnQgeyBnZXRCdWlsZEFwcGxpY2F0aW9uRnVuY3Rpb24gfSBmcm9tICcuL2RldmtpdCc7XG5cbmV4cG9ydCBlbnVtIFJlc3VsdEtpbmQge1xuICBGYWlsdXJlLFxuICBGdWxsLFxuICBJbmNyZW1lbnRhbCxcbiAgQ29tcG9uZW50VXBkYXRlLFxufVxuXG5wcm9jZXNzLmVudlsnVklURV9DSlNfSUdOT1JFX1dBUk5JTkcnXSA9ICd0cnVlJztcblxuYXN5bmMgZnVuY3Rpb24qIHZpdGVzdEFwcGxpY2F0aW9uQnVpbGRlcihcbiAgb3B0aW9uczogVml0ZXN0U2NoZW1hLFxuICBjb250ZXh0OiBhbnksXG4pOiBBc3luY0l0ZXJhYmxlPHsgc3VjY2VzczogYm9vbGVhbiB9PiB7XG4gIHByb2Nlc3MuZW52WydURVNUJ10gPSAndHJ1ZSc7XG4gIHByb2Nlc3MuZW52WydWSVRFU1QnXSA9ICd0cnVlJztcblxuICBjb25zdCB7IGJ1aWxkQXBwbGljYXRpb25JbnRlcm5hbCwgYW5ndWxhclZlcnNpb24gfSA9XG4gICAgYXdhaXQgZ2V0QnVpbGRBcHBsaWNhdGlvbkZ1bmN0aW9uKCk7XG4gIGNvbnN0IHsgc3RhcnRWaXRlc3QgfSA9IGF3YWl0IChGdW5jdGlvbihcbiAgICAncmV0dXJuIGltcG9ydChcInZpdGVzdC9ub2RlXCIpJyxcbiAgKSgpIGFzIFByb21pc2U8dHlwZW9mIGltcG9ydCgndml0ZXN0L25vZGUnKT4pO1xuXG4gIGNvbnN0IHByb2plY3RDb25maWcgPSBhd2FpdCBjb250ZXh0LmdldFByb2plY3RNZXRhZGF0YShjb250ZXh0LnRhcmdldCk7XG4gIGNvbnN0IGV4dHJhQXJncyA9IGF3YWl0IGdldEV4dHJhQXJncyhvcHRpb25zKTtcbiAgY29uc3Qgd29ya3NwYWNlUm9vdCA9IGNvbnRleHQud29ya3NwYWNlUm9vdDtcbiAgY29uc3QgcHJvamVjdFJvb3QgPSBwcm9qZWN0Q29uZmlnWydyb290J107XG4gIGNvbnN0IHNldHVwRmlsZSA9IHBhdGgucmVsYXRpdmUocHJvamVjdFJvb3QsIG9wdGlvbnMuc2V0dXBGaWxlKTtcblxuICBjb25zdCBjb25maWc6IFZpdGVzdENvbmZpZyA9IHtcbiAgICByb290OiBgJHtwcm9qZWN0Um9vdCB8fCAnLid9YCxcbiAgICB3YXRjaDogb3B0aW9ucy53YXRjaCA9PT0gdHJ1ZSxcbiAgICBjb25maWc6IG9wdGlvbnMuY29uZmlnRmlsZSxcbiAgICBzZXR1cEZpbGVzOiBbc2V0dXBGaWxlXSxcbiAgICBnbG9iYWxzOiB0cnVlLFxuICAgIHBvb2w6ICd2bVRocmVhZHMnLFxuICAgIHJlcG9ydGVyczogWydkZWZhdWx0J10sXG4gICAgZW52aXJvbm1lbnQ6ICdqc2RvbScsXG4gICAgZXhjbHVkZTogb3B0aW9ucz8uZXhjbHVkZSB8fCBbXSxcbiAgICAuLi5leHRyYUFyZ3MsXG4gIH07XG5cbiAgY29uc3QgaW5jbHVkZXM6IHN0cmluZ1tdID0gZmluZEluY2x1ZGVzKHtcbiAgICB3b3Jrc3BhY2VSb290LFxuICAgIHByb2plY3RSb290LFxuICAgIGluY2x1ZGU6IG9wdGlvbnMuaW5jbHVkZSxcbiAgICBleGNsdWRlOiBvcHRpb25zLmV4Y2x1ZGUgfHwgW10sXG4gIH0pO1xuXG4gIGNvbnN0IHRlc3RGaWxlcyA9IFtcbiAgICBwYXRoLnJlbGF0aXZlKHdvcmtzcGFjZVJvb3QsIG9wdGlvbnMuc2V0dXBGaWxlKSxcbiAgICAuLi5pbmNsdWRlcy5tYXAoKGluYykgPT4gcGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBpbmMpKSxcbiAgXTtcblxuICBjb25zdCBlbnRyeVBvaW50cyA9IGdlbmVyYXRlRW50cnlQb2ludHMoe1xuICAgIHByb2plY3RSb290OiBwcm9qZWN0Um9vdCxcbiAgICB0ZXN0RmlsZXMsXG4gICAgY29udGV4dCxcbiAgICBhbmd1bGFyVmVyc2lvbixcbiAgfSk7XG5cbiAgY29uc3Qgb3V0cHV0RmlsZXMgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3Qgdml0ZUNvbmZpZzogYW55ID0ge1xuICAgIHBsdWdpbnM6IFtcbiAgICAgIChhd2FpdCBjcmVhdGVBbmd1bGFyTWVtb3J5UGx1Z2luKHtcbiAgICAgICAgYW5ndWxhclZlcnNpb24sXG4gICAgICAgIHdvcmtzcGFjZVJvb3QsXG4gICAgICAgIG91dHB1dEZpbGVzLFxuICAgICAgfSkpIGFzIFBsdWdpbixcbiAgICAgIGF3YWl0IGVzYnVpbGREb3dubGV2ZWxQbHVnaW4oKSxcbiAgICBdLFxuICB9O1xuXG4gIGxldCBzZXJ2ZXI6IFZpdGVzdCB8IHVuZGVmaW5lZDtcbiAgZm9yIGF3YWl0IChjb25zdCBidWlsZE91dHB1dCBvZiBidWlsZEFwcGxpY2F0aW9uSW50ZXJuYWwoXG4gICAge1xuICAgICAgYW90OiBmYWxzZSxcbiAgICAgIGluZGV4OiBmYWxzZSxcbiAgICAgIHByb2dyZXNzOiBmYWxzZSxcbiAgICAgIHByZXJlbmRlcjogZmFsc2UsXG4gICAgICBvcHRpbWl6YXRpb246IGZhbHNlLFxuICAgICAgb3V0cHV0UGF0aDogYC5hbmd1bGFyLy52aXRlc3QvJHtwcm9qZWN0Q29uZmlnWyduYW1lJ119YCxcbiAgICAgIG91dEV4dGVuc2lvbjogJ21qcycsXG4gICAgICBvdXRwdXRIYXNoaW5nOiAyLCAvLyBOb25lXG4gICAgICB0c0NvbmZpZzogcGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBvcHRpb25zLnRzQ29uZmlnKSxcbiAgICAgIHdhdGNoOiBvcHRpb25zLndhdGNoID09PSB0cnVlLFxuICAgICAgZW50cnlQb2ludHMsXG4gICAgICBhbGxvd2VkQ29tbW9uSnNEZXBlbmRlbmNpZXM6IFsnQGFuYWxvZ2pzL3ZpdGVzdC1hbmd1bGFyL3NldHVwLXpvbmUnXSxcbiAgICAgIHNvdXJjZU1hcDoge1xuICAgICAgICBzY3JpcHRzOiB0cnVlLFxuICAgICAgICBzdHlsZXM6IGZhbHNlLFxuICAgICAgICB2ZW5kb3I6IGZhbHNlLFxuICAgICAgfSxcbiAgICB9LFxuICAgIGNvbnRleHQsXG4gICkpIHtcbiAgICBpZiAoYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GYWlsdXJlKSB7XG4gICAgICByZXR1cm4geyBzdWNjZXNzOiBmYWxzZSB9O1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICBidWlsZE91dHB1dC5raW5kID09PSBSZXN1bHRLaW5kLkluY3JlbWVudGFsIHx8XG4gICAgICBidWlsZE91dHB1dC5raW5kID09PSBSZXN1bHRLaW5kLkZ1bGxcbiAgICApIHtcbiAgICAgIGlmIChidWlsZE91dHB1dC5raW5kID09PSBSZXN1bHRLaW5kLkZ1bGwpIHtcbiAgICAgICAgb3V0cHV0RmlsZXMuY2xlYXIoKTtcbiAgICAgICAgT2JqZWN0LmtleXMoYnVpbGRPdXRwdXQuZmlsZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgIG91dHB1dEZpbGVzLnNldChrZXksIGJ1aWxkT3V0cHV0LmZpbGVzW2tleV0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkT3V0cHV0LmZpbGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBvdXRwdXRGaWxlcy5zZXQoa2V5LCBidWlsZE91dHB1dC5maWxlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKG9wdGlvbnMud2F0Y2gpIHtcbiAgICAgIGlmICghc2VydmVyKSB7XG4gICAgICAgIHNlcnZlciA9IGF3YWl0IHN0YXJ0Vml0ZXN0KCd0ZXN0JywgW10sIGNvbmZpZywgdml0ZUNvbmZpZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhd2FpdCBzZXJ2ZXIuc3RhcnQoW10pO1xuICAgICAgfVxuXG4gICAgICB5aWVsZCB7IHN1Y2Nlc3M6IHRydWUgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2VydmVyID0gYXdhaXQgc3RhcnRWaXRlc3QoJ3Rlc3QnLCBbXSwgY29uZmlnLCB2aXRlQ29uZmlnKTtcblxuICAgICAgY29uc3Qgc3VjY2VzcyA9IHNlcnZlcj8uc3RhdGUuZ2V0Q291bnRPZkZhaWxlZFRlc3RzKCkgPT09IDA7XG5cbiAgICAgIHlpZWxkIHsgc3VjY2VzcyB9O1xuICAgIH1cbiAgfVxuXG4gIHlpZWxkIHsgc3VjY2VzczogdHJ1ZSB9O1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2V0RXh0cmFBcmdzKFxuICBvcHRpb25zOiBWaXRlc3RTY2hlbWEsXG4pOiBQcm9taXNlPFJlY29yZDxzdHJpbmcsIGFueT4+IHtcbiAgLy8gc3VwcG9ydCBwYXNzaW5nIGV4dHJhIGFyZ3MgdG8gVml0ZXN0IENMSVxuICBjb25zdCBzY2hlbWEgPSBhd2FpdCBpbXBvcnQoJy4vc2NoZW1hLmpzb24nLCB7IHdpdGg6IHsgdHlwZTogJ2pzb24nIH0gfSk7XG4gIGNvbnN0IGV4dHJhQXJnczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhvcHRpb25zKSkge1xuICAgIGlmICghKHNjaGVtYSBhcyBhbnkpLmRlZmF1bHQucHJvcGVydGllc1trZXldKSB7XG4gICAgICBleHRyYUFyZ3Nba2V5XSA9IChvcHRpb25zIGFzIGFueSlba2V5XTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZXh0cmFBcmdzO1xufVxuXG5mdW5jdGlvbiBmaW5kSW5jbHVkZXMob3B0aW9uczoge1xuICB3b3Jrc3BhY2VSb290OiBzdHJpbmc7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBleGNsdWRlOiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgZmcgPSByZXF1aXJlKCdmYXN0LWdsb2InKTtcbiAgY29uc3QgeyBub3JtYWxpemVQYXRoIH0gPSByZXF1aXJlKCd2aXRlJyk7XG5cbiAgY29uc3QgcHJvamVjdFJvb3QgPSBub3JtYWxpemVQYXRoKFxuICAgIHBhdGgucmVzb2x2ZShvcHRpb25zLndvcmtzcGFjZVJvb3QsIG9wdGlvbnMucHJvamVjdFJvb3QpLFxuICApO1xuICBjb25zdCBnbG9icyA9IFsuLi5vcHRpb25zLmluY2x1ZGUubWFwKChnbG9iKSA9PiBgJHtwcm9qZWN0Um9vdH0vJHtnbG9ifWApXTtcblxuICByZXR1cm4gZmcuc3luYyhnbG9icywge1xuICAgIGRvdDogdHJ1ZSxcbiAgICBpZ25vcmU6IG9wdGlvbnMuZXhjbHVkZSxcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW50cnlQb2ludHMoe1xuICBwcm9qZWN0Um9vdCxcbiAgdGVzdEZpbGVzLFxuICBjb250ZXh0LFxuICBhbmd1bGFyVmVyc2lvbixcbn06IHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgdGVzdEZpbGVzOiBzdHJpbmdbXTtcbiAgY29udGV4dDogYW55O1xuICBhbmd1bGFyVmVyc2lvbjogbnVtYmVyO1xufSkge1xuICBpZiAoYW5ndWxhclZlcnNpb24gPCAxOSkge1xuICAgIHJldHVybiB0ZXN0RmlsZXM7XG4gIH1cblxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuXG4gIHJldHVybiBuZXcgTWFwKFxuICAgIEFycmF5LmZyb20odGVzdEZpbGVzLCAodGVzdEZpbGUpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGhcbiAgICAgICAgLnJlbGF0aXZlKFxuICAgICAgICAgIHRlc3RGaWxlLnN0YXJ0c1dpdGgocHJvamVjdFJvb3QpXG4gICAgICAgICAgICA/IHByb2plY3RSb290XG4gICAgICAgICAgICA6IGNvbnRleHQud29ya3NwYWNlUm9vdCxcbiAgICAgICAgICB0ZXN0RmlsZSxcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgvXlsuL10rLywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICctJyk7XG5cbiAgICAgIGxldCB1bmlxdWVOYW1lID0gYHNwZWMtJHtwYXRoLmJhc2VuYW1lKFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHBhdGguZXh0bmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgKX1gO1xuICAgICAgbGV0IHN1ZmZpeCA9IDI7XG4gICAgICB3aGlsZSAoc2Vlbi5oYXModW5pcXVlTmFtZSkpIHtcbiAgICAgICAgdW5pcXVlTmFtZSA9IGAke3JlbGF0aXZlUGF0aH0tJHtzdWZmaXh9YDtcbiAgICAgICAgKytzdWZmaXg7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZCh1bmlxdWVOYW1lKTtcblxuICAgICAgcmV0dXJuIFt1bmlxdWVOYW1lLCB0ZXN0RmlsZV07XG4gICAgfSksXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUJ1aWxkZXIodml0ZXN0QXBwbGljYXRpb25CdWlsZGVyKSBhcyB1bmtub3duO1xuIl19
197
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZXN0LmltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy92aXRlc3QtYW5ndWxhci9zcmMvbGliL2J1aWxkZXJzL2J1aWxkL3ZpdGVzdC5pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUMxRCxPQUFPLEtBQUssSUFBSSxNQUFNLE1BQU0sQ0FBQztBQUk3QixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBR3RDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLG9DQUFvQyxDQUFDO0FBQzVFLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV2RCxNQUFNLENBQU4sSUFBWSxVQUtYO0FBTEQsV0FBWSxVQUFVO0lBQ3BCLGlEQUFPLENBQUE7SUFDUCwyQ0FBSSxDQUFBO0lBQ0oseURBQVcsQ0FBQTtJQUNYLGlFQUFlLENBQUE7QUFDakIsQ0FBQyxFQUxXLFVBQVUsS0FBVixVQUFVLFFBS3JCO0FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxHQUFHLE1BQU0sQ0FBQztBQUVoRCxLQUFLLFNBQVMsQ0FBQyxDQUFDLHdCQUF3QixDQUN0QyxPQUFxQixFQUNyQixPQUFZO0lBRVosT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUM7SUFDN0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxNQUFNLENBQUM7SUFFL0IsTUFBTSxFQUFFLHdCQUF3QixFQUFFLGNBQWMsRUFBRSxHQUNoRCxNQUFNLDJCQUEyQixFQUFFLENBQUM7SUFDdEMsTUFBTSxFQUFFLFdBQVcsRUFBRSxHQUFHLE1BQU8sUUFBUSxDQUNyQyw4QkFBOEIsQ0FD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QUFHLFFBQVEsSUFBSSxDQUFDLFFBQVEsQ0FDcEMsWUFBWSxFQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQzNCLEVBQUUsQ0FBQztRQUNKLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQzVCLFVBQVUsR0FBRyxHQUFHLFlBQVksSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUN6QyxFQUFFLE1BQU0sQ0FBQztRQUNYLENBQUM7UUFDRCxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXJCLE9BQU8sQ0FBQyxVQUFVLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDaEMsQ0FBQyxDQUFDLENBQ0gsQ0FBQztBQUNKLENBQUM7QUFFRCxlQUFlLGFBQWEsQ0FBQyx3QkFBd0IsQ0FBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY3JlYXRlQnVpbGRlciB9IGZyb20gJ0Bhbmd1bGFyLWRldmtpdC9hcmNoaXRlY3QnO1xuaW1wb3J0ICogYXMgcGF0aCBmcm9tICdwYXRoJztcbmltcG9ydCB0eXBlIHsgVml0ZXN0IH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4sIFVzZXJDb25maWcgfSBmcm9tICd2aXRlJztcbmltcG9ydCB0eXBlIHsgVGVzdFVzZXJDb25maWcgYXMgVml0ZXN0Q29uZmlnIH0gZnJvbSAndml0ZXN0L25vZGUnO1xuaW1wb3J0IHsgZ2xvYlN5bmMgfSBmcm9tICd0aW55Z2xvYmJ5JztcblxuaW1wb3J0IHsgVml0ZXN0U2NoZW1hIH0gZnJvbSAnLi9zY2hlbWEnO1xuaW1wb3J0IHsgY3JlYXRlQW5ndWxhck1lbW9yeVBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucy9hbmd1bGFyLW1lbW9yeS1wbHVnaW4nO1xuaW1wb3J0IHsgZXNidWlsZERvd25sZXZlbFBsdWdpbiB9IGZyb20gJy4vcGx1Z2lucy9lc2J1aWxkLWRvd25sZXZlbC1wbHVnaW4nO1xuaW1wb3J0IHsgZ2V0QnVpbGRBcHBsaWNhdGlvbkZ1bmN0aW9uIH0gZnJvbSAnLi9kZXZraXQnO1xuXG5leHBvcnQgZW51bSBSZXN1bHRLaW5kIHtcbiAgRmFpbHVyZSxcbiAgRnVsbCxcbiAgSW5jcmVtZW50YWwsXG4gIENvbXBvbmVudFVwZGF0ZSxcbn1cblxucHJvY2Vzcy5lbnZbJ1ZJVEVfQ0pTX0lHTk9SRV9XQVJOSU5HJ10gPSAndHJ1ZSc7XG5cbmFzeW5jIGZ1bmN0aW9uKiB2aXRlc3RBcHBsaWNhdGlvbkJ1aWxkZXIoXG4gIG9wdGlvbnM6IFZpdGVzdFNjaGVtYSxcbiAgY29udGV4dDogYW55LFxuKTogQXN5bmNJdGVyYWJsZTx7IHN1Y2Nlc3M6IGJvb2xlYW4gfT4ge1xuICBwcm9jZXNzLmVudlsnVEVTVCddID0gJ3RydWUnO1xuICBwcm9jZXNzLmVudlsnVklURVNUJ10gPSAndHJ1ZSc7XG5cbiAgY29uc3QgeyBidWlsZEFwcGxpY2F0aW9uSW50ZXJuYWwsIGFuZ3VsYXJWZXJzaW9uIH0gPVxuICAgIGF3YWl0IGdldEJ1aWxkQXBwbGljYXRpb25GdW5jdGlvbigpO1xuICBjb25zdCB7IHN0YXJ0Vml0ZXN0IH0gPSBhd2FpdCAoRnVuY3Rpb24oXG4gICAgJ3JldHVybiBpbXBvcnQoXCJ2aXRlc3Qvbm9kZVwiKScsXG4gICkoKSBhcyBQcm9taXNlPHR5cGVvZiBpbXBvcnQoJ3ZpdGVzdC9ub2RlJyk+KTtcblxuICBjb25zdCBwcm9qZWN0Q29uZmlnID0gYXdhaXQgY29udGV4dC5nZXRQcm9qZWN0TWV0YWRhdGEoY29udGV4dC50YXJnZXQpO1xuICBjb25zdCBleHRyYUFyZ3MgPSBhd2FpdCBnZXRFeHRyYUFyZ3Mob3B0aW9ucyk7XG4gIGNvbnN0IHdvcmtzcGFjZVJvb3QgPSBjb250ZXh0LndvcmtzcGFjZVJvb3Q7XG4gIGNvbnN0IHByb2plY3RSb290ID0gcHJvamVjdENvbmZpZ1sncm9vdCddO1xuICBjb25zdCBzZXR1cEZpbGUgPSBwYXRoLnJlbGF0aXZlKHByb2plY3RSb290LCBvcHRpb25zLnNldHVwRmlsZSk7XG5cbiAgY29uc3QgY29uZmlnOiBWaXRlc3RDb25maWcgPSB7XG4gICAgcm9vdDogYCR7cHJvamVjdFJvb3QgfHwgJy4nfWAsXG4gICAgd2F0Y2g6IG9wdGlvbnMud2F0Y2ggPT09IHRydWUsXG4gICAgY29uZmlnOiBvcHRpb25zLmNvbmZpZ0ZpbGUsXG4gICAgc2V0dXBGaWxlczogW3NldHVwRmlsZV0sXG4gICAgZ2xvYmFsczogdHJ1ZSxcbiAgICBwb29sOiAndm1UaHJlYWRzJyxcbiAgICByZXBvcnRlcnM6IFsnZGVmYXVsdCddLFxuICAgIGVudmlyb25tZW50OiAnanNkb20nLFxuICAgIGV4Y2x1ZGU6IG9wdGlvbnM/LmV4Y2x1ZGUgfHwgW10sXG4gICAgLi4uZXh0cmFBcmdzLFxuICB9O1xuXG4gIGNvbnN0IGluY2x1ZGVzOiBzdHJpbmdbXSA9IGZpbmRJbmNsdWRlcyh7XG4gICAgd29ya3NwYWNlUm9vdCxcbiAgICBwcm9qZWN0Um9vdCxcbiAgICBpbmNsdWRlOiBvcHRpb25zLmluY2x1ZGUsXG4gICAgZXhjbHVkZTogb3B0aW9ucy5leGNsdWRlIHx8IFtdLFxuICB9KTtcblxuICBjb25zdCB0ZXN0RmlsZXMgPSBbXG4gICAgcGF0aC5yZWxhdGl2ZSh3b3Jrc3BhY2VSb290LCBvcHRpb25zLnNldHVwRmlsZSksXG4gICAgLi4uaW5jbHVkZXMubWFwKChpbmMpID0+IHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgaW5jKSksXG4gIF07XG5cbiAgY29uc3QgZW50cnlQb2ludHMgPSBnZW5lcmF0ZUVudHJ5UG9pbnRzKHtcbiAgICBwcm9qZWN0Um9vdDogcHJvamVjdFJvb3QsXG4gICAgdGVzdEZpbGVzLFxuICAgIGNvbnRleHQsXG4gICAgYW5ndWxhclZlcnNpb24sXG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dEZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IHZpdGVDb25maWc6IGFueSA9IHtcbiAgICBwbHVnaW5zOiBbXG4gICAgICAoYXdhaXQgY3JlYXRlQW5ndWxhck1lbW9yeVBsdWdpbih7XG4gICAgICAgIGFuZ3VsYXJWZXJzaW9uLFxuICAgICAgICB3b3Jrc3BhY2VSb290LFxuICAgICAgICBvdXRwdXRGaWxlcyxcbiAgICAgIH0pKSBhcyBQbHVnaW4sXG4gICAgICBhd2FpdCBlc2J1aWxkRG93bmxldmVsUGx1Z2luKCksXG4gICAgXSxcbiAgfTtcblxuICBsZXQgc2VydmVyOiBWaXRlc3QgfCB1bmRlZmluZWQ7XG4gIGZvciBhd2FpdCAoY29uc3QgYnVpbGRPdXRwdXQgb2YgYnVpbGRBcHBsaWNhdGlvbkludGVybmFsKFxuICAgIHtcbiAgICAgIGFvdDogZmFsc2UsXG4gICAgICBpbmRleDogZmFsc2UsXG4gICAgICBwcm9ncmVzczogZmFsc2UsXG4gICAgICBwcmVyZW5kZXI6IGZhbHNlLFxuICAgICAgb3B0aW1pemF0aW9uOiBmYWxzZSxcbiAgICAgIG91dHB1dFBhdGg6IGAuYW5ndWxhci8udml0ZXN0LyR7cHJvamVjdENvbmZpZ1snbmFtZSddfWAsXG4gICAgICBvdXRFeHRlbnNpb246ICdtanMnLFxuICAgICAgb3V0cHV0SGFzaGluZzogMiwgLy8gTm9uZVxuICAgICAgdHNDb25maWc6IHBhdGgucmVsYXRpdmUod29ya3NwYWNlUm9vdCwgb3B0aW9ucy50c0NvbmZpZyksXG4gICAgICB3YXRjaDogb3B0aW9ucy53YXRjaCA9PT0gdHJ1ZSxcbiAgICAgIGVudHJ5UG9pbnRzLFxuICAgICAgYWxsb3dlZENvbW1vbkpzRGVwZW5kZW5jaWVzOiBbJ0BhbmFsb2dqcy92aXRlc3QtYW5ndWxhci9zZXR1cC16b25lJ10sXG4gICAgICBzb3VyY2VNYXA6IHtcbiAgICAgICAgc2NyaXB0czogdHJ1ZSxcbiAgICAgICAgc3R5bGVzOiBmYWxzZSxcbiAgICAgICAgdmVuZG9yOiBmYWxzZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICBjb250ZXh0LFxuICApKSB7XG4gICAgaWYgKGJ1aWxkT3V0cHV0LmtpbmQgPT09IFJlc3VsdEtpbmQuRmFpbHVyZSkge1xuICAgICAgcmV0dXJuIHsgc3VjY2VzczogZmFsc2UgfTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5JbmNyZW1lbnRhbCB8fFxuICAgICAgYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsXG4gICAgKSB7XG4gICAgICBpZiAoYnVpbGRPdXRwdXQua2luZCA9PT0gUmVzdWx0S2luZC5GdWxsKSB7XG4gICAgICAgIG91dHB1dEZpbGVzLmNsZWFyKCk7XG4gICAgICAgIE9iamVjdC5rZXlzKGJ1aWxkT3V0cHV0LmZpbGVzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICBvdXRwdXRGaWxlcy5zZXQoa2V5LCBidWlsZE91dHB1dC5maWxlc1trZXldKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBPYmplY3Qua2V5cyhidWlsZE91dHB1dC5maWxlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgb3V0cHV0RmlsZXMuc2V0KGtleSwgYnVpbGRPdXRwdXQuZmlsZXNba2V5XSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChvcHRpb25zLndhdGNoKSB7XG4gICAgICBpZiAoIXNlcnZlcikge1xuICAgICAgICBzZXJ2ZXIgPSBhd2FpdCBzdGFydFZpdGVzdCgndGVzdCcsIFtdLCBjb25maWcsIHZpdGVDb25maWcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgc2VydmVyLnN0YXJ0KFtdKTtcbiAgICAgIH1cblxuICAgICAgeWllbGQgeyBzdWNjZXNzOiB0cnVlIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHNlcnZlciA9IGF3YWl0IHN0YXJ0Vml0ZXN0KCd0ZXN0JywgW10sIGNvbmZpZywgdml0ZUNvbmZpZyk7XG5cbiAgICAgIGNvbnN0IHN1Y2Nlc3MgPSBzZXJ2ZXI/LnN0YXRlLmdldENvdW50T2ZGYWlsZWRUZXN0cygpID09PSAwO1xuXG4gICAgICB5aWVsZCB7IHN1Y2Nlc3MgfTtcbiAgICB9XG4gIH1cblxuICB5aWVsZCB7IHN1Y2Nlc3M6IHRydWUgfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEV4dHJhQXJncyhcbiAgb3B0aW9uczogVml0ZXN0U2NoZW1hLFxuKTogUHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+PiB7XG4gIC8vIHN1cHBvcnQgcGFzc2luZyBleHRyYSBhcmdzIHRvIFZpdGVzdCBDTElcbiAgY29uc3Qgc2NoZW1hID0gYXdhaXQgaW1wb3J0KCcuL3NjaGVtYS5qc29uJywgeyB3aXRoOiB7IHR5cGU6ICdqc29uJyB9IH0pO1xuICBjb25zdCBleHRyYUFyZ3M6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMob3B0aW9ucykpIHtcbiAgICBpZiAoIShzY2hlbWEgYXMgYW55KS5kZWZhdWx0LnByb3BlcnRpZXNba2V5XSkge1xuICAgICAgZXh0cmFBcmdzW2tleV0gPSAob3B0aW9ucyBhcyBhbnkpW2tleV07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGV4dHJhQXJncztcbn1cblxuLyoqXG4gKiBGaW5kcyB0ZXN0IGZpbGVzIHRvIGluY2x1ZGUgaW4gdGhlIFZpdGVzdCBydW4gdXNpbmcgdGlueWdsb2JieSBwYXR0ZXJuIG1hdGNoaW5nLlxuICpcbiAqIFRoaXMgZnVuY3Rpb246XG4gKiAxLiBOb3JtYWxpemVzIHRoZSBwcm9qZWN0IHJvb3QgcGF0aCB0byBlbnN1cmUgY29uc2lzdGVudCBwYXRoIHNlcGFyYXRvcnNcbiAqIDIuIENvbnN0cnVjdHMgZ2xvYiBwYXR0ZXJucyBieSBwcmVwZW5kaW5nIHRoZSBwcm9qZWN0IHJvb3QgdG8gZWFjaCBpbmNsdWRlIHBhdHRlcm5cbiAqIDMuIFVzZXMgZ2xvYlN5bmMgZnJvbSB0aW55Z2xvYmJ5IHRvIGZpbmQgYWxsIGZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJucyB3aGlsZSByZXNwZWN0aW5nIGV4Y2x1c2lvbnNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyBDb25maWd1cmF0aW9uIG9iamVjdCBjb250YWluaW5nIHdvcmtzcGFjZSBhbmQgcHJvamVjdCBwYXRocywgaW5jbHVkZS9leGNsdWRlIHBhdHRlcm5zXG4gKiBAcmV0dXJucyBBcnJheSBvZiBhYnNvbHV0ZSBmaWxlIHBhdGhzIHRoYXQgbWF0Y2ggdGhlIGluY2x1ZGUgcGF0dGVybnNcbiAqXG4gKiBTYW1wbGUgb3V0cHV0IHBhdGhzOlxuICogLSAvd29ya3NwYWNlL2FwcHMvbXktYXBwL3NyYy9hcHAvYXBwLmNvbXBvbmVudC5zcGVjLnRzXG4gKiAtIC93b3Jrc3BhY2UvYXBwcy9teS1hcHAvc3JjL2FwcC9zZXJ2aWNlcy9kYXRhLnNlcnZpY2Uuc3BlYy50c1xuICogLSAvd29ya3NwYWNlL2FwcHMvbXktYXBwL3NyYy9hcHAvY29tcG9uZW50cy9oZWFkZXIvaGVhZGVyLmNvbXBvbmVudC50ZXN0LnRzXG4gKiAtIC93b3Jrc3BhY2UvYXBwcy9teS1hcHAvc3JjL2FwcC91dGlscy9oZWxwZXJzLnNwZWMudHNcbiAqXG4gKiB0aW55Z2xvYmJ5IHZzIGZhc3QtZ2xvYiBjb21wYXJpc29uOlxuICogLSBCb3RoIHN1cHBvcnQgdGhlIHNhbWUgZ2xvYiBwYXR0ZXJucyBhbmQgaWdub3JlIGZ1bmN0aW9uYWxpdHlcbiAqIC0gQm90aCBhcmUgZmFzdCBhbmQgZWZmaWNpZW50IGZvciBmaWxlIG1hdGNoaW5nXG4gKiAtIHRpbnlnbG9iYnkgaXMgYSBsaWdodGVyIGFsdGVybmF0aXZlIHdpdGggc2ltaWxhciBBUElcbiAqIC0gdGlueWdsb2JieSdzIGdsb2JTeW5jIHJldHVybnMgYWJzb2x1dGUgcGF0aHMgYnkgZGVmYXVsdCB3aGVuIGFic29sdXRlOiB0cnVlIGlzIHNldFxuICogLSB0aW55Z2xvYmJ5IGhhcyBmZXdlciBkZXBlbmRlbmNpZXMgYW5kIHNtYWxsZXIgYnVuZGxlIHNpemVcbiAqXG4gKiBnbG9iU3luYyBvcHRpb25zIGV4cGxhaW5lZDpcbiAqIC0gZG90OiB0cnVlIC0gSW5jbHVkZXMgZmlsZXMvZGlyZWN0b3JpZXMgdGhhdCBzdGFydCB3aXRoIGEgZG90IChlLmcuLCAuZW52LnRlc3QpXG4gKiAtIGFic29sdXRlOiB0cnVlIC0gUmV0dXJucyBhYnNvbHV0ZSBmaWxlIHBhdGhzIGluc3RlYWQgb2YgcmVsYXRpdmUgcGF0aHNcbiAqIC0gaWdub3JlOiBvcHRpb25zLmV4Y2x1ZGUgLSBFeGNsdWRlcyBmaWxlcyBtYXRjaGluZyB0aGUgZXhjbHVkZSBwYXR0ZXJuc1xuICovXG5mdW5jdGlvbiBmaW5kSW5jbHVkZXMob3B0aW9uczoge1xuICB3b3Jrc3BhY2VSb290OiBzdHJpbmc7XG4gIHByb2plY3RSb290OiBzdHJpbmc7XG4gIGluY2x1ZGU6IHN0cmluZ1tdO1xuICBleGNsdWRlOiBzdHJpbmdbXTtcbn0pIHtcbiAgY29uc3QgeyBub3JtYWxpemVQYXRoIH0gPSByZXF1aXJlKCd2aXRlJyk7XG5cbiAgLy8gTm9ybWFsaXplIHByb2plY3Qgcm9vdCBwYXRoIHRvIGVuc3VyZSBjb25zaXN0ZW50IHBhdGggc2VwYXJhdG9ycyBhY3Jvc3MgcGxhdGZvcm1zXG4gIGNvbnN0IHByb2plY3RSb290ID0gbm9ybWFsaXplUGF0aChcbiAgICBwYXRoLnJlc29sdmUob3B0aW9ucy53b3Jrc3BhY2VSb290LCBvcHRpb25zLnByb2plY3RSb290KSxcbiAgKTtcblxuICAvLyBDb25zdHJ1Y3QgZ2xvYiBwYXR0ZXJucyBieSBwcmVwZW5kaW5nIHByb2plY3Qgcm9vdCB0byBlYWNoIGluY2x1ZGUgcGF0dGVyblxuICAvLyBFeGFtcGxlOiBpZiBpbmNsdWRlPVsnKiovKi5zcGVjLnRzJ10gYW5kIHByb2plY3RSb290PScvd29ya3NwYWNlL2FwcHMvbXktYXBwJ1xuICAvLyBSZXN1bHQ6IFsnL3dvcmtzcGFjZS9hcHBzL215LWFwcC8qKi8qLnNwZWMudHMnXVxuICBjb25zdCBnbG9icyA9IFsuLi5vcHRpb25zLmluY2x1ZGUubWFwKChnbG9iKSA9PiBgJHtwcm9qZWN0Um9vdH0vJHtnbG9ifWApXTtcblxuICAvLyBVc2UgZ2xvYlN5bmMgZnJvbSB0aW55Z2xvYmJ5IHRvIGZpbmQgYWxsIGZpbGVzIG1hdGNoaW5nIHRoZSBwYXR0ZXJuc1xuICAvLyBSZXR1cm5zIGFic29sdXRlIGZpbGUgcGF0aHMgdGhhdCBtYXRjaCB0aGUgaW5jbHVkZSBwYXR0ZXJucyB3aGlsZSByZXNwZWN0aW5nIGV4Y2x1c2lvbnNcbiAgcmV0dXJuIGdsb2JTeW5jKGdsb2JzLCB7XG4gICAgZG90OiB0cnVlLCAvLyBJbmNsdWRlIGZpbGVzL2RpcmVjdG9yaWVzIHN0YXJ0aW5nIHdpdGggZG90IChlLmcuLCAuZW52LnRlc3QpXG4gICAgYWJzb2x1dGU6IHRydWUsIC8vIFJldHVybiBhYnNvbHV0ZSBmaWxlIHBhdGhzXG4gICAgaWdub3JlOiBvcHRpb25zLmV4Y2x1ZGUsIC8vIEV4Y2x1ZGUgZmlsZXMgbWF0Y2hpbmcgdGhlc2UgcGF0dGVybnNcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW50cnlQb2ludHMoe1xuICBwcm9qZWN0Um9vdCxcbiAgdGVzdEZpbGVzLFxuICBjb250ZXh0LFxuICBhbmd1bGFyVmVyc2lvbixcbn06IHtcbiAgcHJvamVjdFJvb3Q6IHN0cmluZztcbiAgdGVzdEZpbGVzOiBzdHJpbmdbXTtcbiAgY29udGV4dDogYW55O1xuICBhbmd1bGFyVmVyc2lvbjogbnVtYmVyO1xufSkge1xuICBpZiAoYW5ndWxhclZlcnNpb24gPCAxOSkge1xuICAgIHJldHVybiB0ZXN0RmlsZXM7XG4gIH1cblxuICBjb25zdCBzZWVuID0gbmV3IFNldCgpO1xuXG4gIHJldHVybiBuZXcgTWFwKFxuICAgIEFycmF5LmZyb20odGVzdEZpbGVzLCAodGVzdEZpbGUpID0+IHtcbiAgICAgIGNvbnN0IHJlbGF0aXZlUGF0aCA9IHBhdGhcbiAgICAgICAgLnJlbGF0aXZlKFxuICAgICAgICAgIHRlc3RGaWxlLnN0YXJ0c1dpdGgocHJvamVjdFJvb3QpXG4gICAgICAgICAgICA/IHByb2plY3RSb290XG4gICAgICAgICAgICA6IGNvbnRleHQud29ya3NwYWNlUm9vdCxcbiAgICAgICAgICB0ZXN0RmlsZSxcbiAgICAgICAgKVxuICAgICAgICAucmVwbGFjZSgvXlsuL10rLywgJ18nKVxuICAgICAgICAucmVwbGFjZSgvXFwvL2csICctJyk7XG5cbiAgICAgIGxldCB1bmlxdWVOYW1lID0gYHNwZWMtJHtwYXRoLmJhc2VuYW1lKFxuICAgICAgICByZWxhdGl2ZVBhdGgsXG4gICAgICAgIHBhdGguZXh0bmFtZShyZWxhdGl2ZVBhdGgpLFxuICAgICAgKX1gO1xuICAgICAgbGV0IHN1ZmZpeCA9IDI7XG4gICAgICB3aGlsZSAoc2Vlbi5oYXModW5pcXVlTmFtZSkpIHtcbiAgICAgICAgdW5pcXVlTmFtZSA9IGAke3JlbGF0aXZlUGF0aH0tJHtzdWZmaXh9YDtcbiAgICAgICAgKytzdWZmaXg7XG4gICAgICB9XG4gICAgICBzZWVuLmFkZCh1bmlxdWVOYW1lKTtcblxuICAgICAgcmV0dXJuIFt1bmlxdWVOYW1lLCB0ZXN0RmlsZV07XG4gICAgfSksXG4gICk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUJ1aWxkZXIodml0ZXN0QXBwbGljYXRpb25CdWlsZGVyKSBhcyB1bmtub3duO1xuIl19