@grnsft/if 0.1.2 → 0.1.3

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.
Files changed (53) hide show
  1. package/CONTRIBUTING.md +13 -17
  2. package/README.md +17 -18
  3. package/coverage/clover.xml +111 -65
  4. package/coverage/coverage-final.json +7 -6
  5. package/coverage/lcov-report/config/config.ts.html +12 -3
  6. package/coverage/lcov-report/config/index.html +1 -1
  7. package/coverage/lcov-report/config/index.ts.html +3 -3
  8. package/coverage/lcov-report/config/strings.ts.html +2 -2
  9. package/coverage/lcov-report/index.html +9 -9
  10. package/coverage/lcov-report/lib/index.html +24 -9
  11. package/coverage/lcov-report/lib/models-universe.ts.html +1 -1
  12. package/coverage/lcov-report/lib/observatory.ts.html +7 -7
  13. package/coverage/lcov-report/lib/planet-aggregator.ts.html +253 -0
  14. package/coverage/lcov-report/lib/supercomputer.ts.html +211 -52
  15. package/coverage/lcov-report/util/args.ts.html +1 -1
  16. package/coverage/lcov-report/util/errors.ts.html +10 -7
  17. package/coverage/lcov-report/util/index.html +1 -1
  18. package/coverage/lcov-report/util/yaml.ts.html +1 -1
  19. package/coverage/lcov.info +184 -105
  20. package/examples/impls/case-studies/aggregation.yml +97 -0
  21. package/examples/impls/case-studies/ntt-data-on-premise.yaml +0 -42
  22. package/examples/impls/test/aggregation-test.yml +109 -0
  23. package/examples/impls/test/large-impl.yml +257303 -0
  24. package/examples/ompls/aggregation-test.yml +340 -0
  25. package/package.json +1 -1
  26. package/tsconfig.build.tsbuildinfo +1 -0
  27. package/yarn-error.log +5431 -0
  28. package/build/config/index.d.ts +0 -2
  29. package/build/config/index.js +0 -8
  30. package/build/config/strings.d.ts +0 -14
  31. package/build/config/strings.js +0 -30
  32. package/build/index.d.ts +0 -2
  33. package/build/index.js +0 -46
  34. package/build/lib/models-universe.d.ts +0 -28
  35. package/build/lib/models-universe.js +0 -95
  36. package/build/lib/supercomputer.d.ts +0 -30
  37. package/build/lib/supercomputer.js +0 -109
  38. package/build/types/azure-importer.d.ts +0 -29
  39. package/build/types/azure-importer.js +0 -3
  40. package/build/types/boavizta.d.ts +0 -7
  41. package/build/types/boavizta.js +0 -3
  42. package/build/types/common.d.ts +0 -7
  43. package/build/types/common.js +0 -9
  44. package/build/types/impl.d.ts +0 -40
  45. package/build/types/impl.js +0 -3
  46. package/build/types/models-universe.d.ts +0 -24
  47. package/build/types/models-universe.js +0 -3
  48. package/build/util/args.d.ts +0 -8
  49. package/build/util/helpers.d.ts +0 -4
  50. package/build/util/validations.d.ts +0 -25
  51. package/build/util/validations.js +0 -52
  52. package/build/util/yaml.d.ts +0 -13
  53. package/build/util/yaml.js +0 -36
@@ -1,52 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.validateImpl = void 0;
4
- const zod_1 = require("zod");
5
- const errors_1 = require("./errors");
6
- const { ImplValidationError } = errors_1.ERRORS;
7
- const implValidation = zod_1.z.object({
8
- name: zod_1.z.string(),
9
- description: zod_1.z.string().nullable(),
10
- tags: zod_1.z
11
- .object({
12
- kind: zod_1.z.string().optional(),
13
- complexity: zod_1.z.string().optional(),
14
- category: zod_1.z.string().optional(),
15
- })
16
- .nullable(),
17
- initialize: zod_1.z.object({
18
- models: zod_1.z.array(zod_1.z.object({
19
- name: zod_1.z.string(),
20
- kind: zod_1.z.string().optional(),
21
- path: zod_1.z.string().optional(),
22
- model: zod_1.z.string().optional(),
23
- config: zod_1.z.record(zod_1.z.string(), zod_1.z.any()).optional(),
24
- })),
25
- }),
26
- graph: zod_1.z
27
- .object({
28
- children: zod_1.z.record(zod_1.z.string(), zod_1.z.any()),
29
- })
30
- .required(),
31
- });
32
- /**
33
- * Validates given `impl` object to match pattern.
34
- */
35
- const validateImpl = (impl) => {
36
- const validatedImpl = implValidation.safeParse(impl);
37
- if (!validatedImpl.success) {
38
- const prettifyErrorMessage = (issues) => {
39
- const issuesArray = JSON.parse(issues);
40
- return issuesArray.map((issue) => {
41
- const { code, path, message } = issue;
42
- const flattenPath = path.map(part => typeof part === 'number' ? `[${part}]` : part);
43
- const fullPath = flattenPath.join('.');
44
- return `"${fullPath}" parameter is ${message.toLowerCase()}. Error code: ${code}.`;
45
- });
46
- };
47
- throw new ImplValidationError(prettifyErrorMessage(validatedImpl.error.message));
48
- }
49
- return validatedImpl.data;
50
- };
51
- exports.validateImpl = validateImpl;
52
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbC92YWxpZGF0aW9ucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSw2QkFBZ0M7QUFFaEMscUNBQWdDO0FBSWhDLE1BQU0sRUFBQyxtQkFBbUIsRUFBQyxHQUFHLGVBQU0sQ0FBQztBQUVyQyxNQUFNLGNBQWMsR0FBRyxPQUFDLENBQUMsTUFBTSxDQUFDO0lBQzlCLElBQUksRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFO0lBQ2hCLFdBQVcsRUFBRSxPQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFO0lBQ2xDLElBQUksRUFBRSxPQUFDO1NBQ0osTUFBTSxDQUFDO1FBQ04sSUFBSSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDM0IsVUFBVSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7UUFDakMsUUFBUSxFQUFFLE9BQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLEVBQUU7S0FDaEMsQ0FBQztTQUNELFFBQVEsRUFBRTtJQUNiLFVBQVUsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDO1FBQ25CLE1BQU0sRUFBRSxPQUFDLENBQUMsS0FBSyxDQUNiLE9BQUMsQ0FBQyxNQUFNLENBQUM7WUFDUCxJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRTtZQUNoQixJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUMzQixJQUFJLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUMzQixLQUFLLEVBQUUsT0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRTtZQUM1QixNQUFNLEVBQUUsT0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsT0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFO1NBQ2pELENBQUMsQ0FDSDtLQUNGLENBQUM7SUFDRixLQUFLLEVBQUUsT0FBQztTQUNMLE1BQU0sQ0FBQztRQUNOLFFBQVEsRUFBRSxPQUFDLENBQUMsTUFBTSxDQUFDLE9BQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRSxPQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDeEMsQ0FBQztTQUNELFFBQVEsRUFBRTtDQUNkLENBQUMsQ0FBQztBQUVIOztHQUVHO0FBQ0ksTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFVLEVBQUUsRUFBRTtJQUN6QyxNQUFNLGFBQWEsR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJELElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxFQUFFO1FBQzFCLE1BQU0sb0JBQW9CLEdBQUcsQ0FBQyxNQUFjLEVBQUUsRUFBRTtZQUM5QyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBRXZDLE9BQU8sV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQWUsRUFBRSxFQUFFO2dCQUN6QyxNQUFNLEVBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7Z0JBQ3BDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FDbEMsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQzlDLENBQUM7Z0JBQ0YsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFFdkMsT0FBTyxJQUFJLFFBQVEsa0JBQWtCLE9BQU8sQ0FBQyxXQUFXLEVBQUUsaUJBQWlCLElBQUksR0FBRyxDQUFDO1lBQ3JGLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDO1FBRUYsTUFBTSxJQUFJLG1CQUFtQixDQUMzQixvQkFBb0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUNsRCxDQUFDO0tBQ0g7SUFFRCxPQUFPLGFBQWEsQ0FBQyxJQUFJLENBQUM7QUFDNUIsQ0FBQyxDQUFDO0FBeEJXLFFBQUEsWUFBWSxnQkF3QnZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtab2RJc3N1ZSwgen0gZnJvbSAnem9kJztcblxuaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4vZXJyb3JzJztcblxuaW1wb3J0IHtJbXBsfSBmcm9tICcuLi90eXBlcy9pbXBsJztcblxuY29uc3Qge0ltcGxWYWxpZGF0aW9uRXJyb3J9ID0gRVJST1JTO1xuXG5jb25zdCBpbXBsVmFsaWRhdGlvbiA9IHoub2JqZWN0KHtcbiAgbmFtZTogei5zdHJpbmcoKSxcbiAgZGVzY3JpcHRpb246IHouc3RyaW5nKCkubnVsbGFibGUoKSxcbiAgdGFnczogelxuICAgIC5vYmplY3Qoe1xuICAgICAga2luZDogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgY29tcGxleGl0eTogei5zdHJpbmcoKS5vcHRpb25hbCgpLFxuICAgICAgY2F0ZWdvcnk6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICB9KVxuICAgIC5udWxsYWJsZSgpLFxuICBpbml0aWFsaXplOiB6Lm9iamVjdCh7XG4gICAgbW9kZWxzOiB6LmFycmF5KFxuICAgICAgei5vYmplY3Qoe1xuICAgICAgICBuYW1lOiB6LnN0cmluZygpLFxuICAgICAgICBraW5kOiB6LnN0cmluZygpLm9wdGlvbmFsKCksXG4gICAgICAgIHBhdGg6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgbW9kZWw6IHouc3RyaW5nKCkub3B0aW9uYWwoKSxcbiAgICAgICAgY29uZmlnOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKS5vcHRpb25hbCgpLFxuICAgICAgfSlcbiAgICApLFxuICB9KSxcbiAgZ3JhcGg6IHpcbiAgICAub2JqZWN0KHtcbiAgICAgIGNoaWxkcmVuOiB6LnJlY29yZCh6LnN0cmluZygpLCB6LmFueSgpKSxcbiAgICB9KVxuICAgIC5yZXF1aXJlZCgpLFxufSk7XG5cbi8qKlxuICogVmFsaWRhdGVzIGdpdmVuIGBpbXBsYCBvYmplY3QgdG8gbWF0Y2ggcGF0dGVybi5cbiAqL1xuZXhwb3J0IGNvbnN0IHZhbGlkYXRlSW1wbCA9IChpbXBsOiBJbXBsKSA9PiB7XG4gIGNvbnN0IHZhbGlkYXRlZEltcGwgPSBpbXBsVmFsaWRhdGlvbi5zYWZlUGFyc2UoaW1wbCk7XG5cbiAgaWYgKCF2YWxpZGF0ZWRJbXBsLnN1Y2Nlc3MpIHtcbiAgICBjb25zdCBwcmV0dGlmeUVycm9yTWVzc2FnZSA9IChpc3N1ZXM6IHN0cmluZykgPT4ge1xuICAgICAgY29uc3QgaXNzdWVzQXJyYXkgPSBKU09OLnBhcnNlKGlzc3Vlcyk7XG5cbiAgICAgIHJldHVybiBpc3N1ZXNBcnJheS5tYXAoKGlzc3VlOiBab2RJc3N1ZSkgPT4ge1xuICAgICAgICBjb25zdCB7Y29kZSwgcGF0aCwgbWVzc2FnZX0gPSBpc3N1ZTtcbiAgICAgICAgY29uc3QgZmxhdHRlblBhdGggPSBwYXRoLm1hcChwYXJ0ID0+XG4gICAgICAgICAgdHlwZW9mIHBhcnQgPT09ICdudW1iZXInID8gYFske3BhcnR9XWAgOiBwYXJ0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGZ1bGxQYXRoID0gZmxhdHRlblBhdGguam9pbignLicpO1xuXG4gICAgICAgIHJldHVybiBgXCIke2Z1bGxQYXRofVwiIHBhcmFtZXRlciBpcyAke21lc3NhZ2UudG9Mb3dlckNhc2UoKX0uIEVycm9yIGNvZGU6ICR7Y29kZX0uYDtcbiAgICAgIH0pO1xuICAgIH07XG5cbiAgICB0aHJvdyBuZXcgSW1wbFZhbGlkYXRpb25FcnJvcihcbiAgICAgIHByZXR0aWZ5RXJyb3JNZXNzYWdlKHZhbGlkYXRlZEltcGwuZXJyb3IubWVzc2FnZSlcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIHZhbGlkYXRlZEltcGwuZGF0YTtcbn07XG4iXX0=
@@ -1,13 +0,0 @@
1
- import { Impl } from '../types/impl';
2
- /**
3
- * Reads and parses `yaml` file to object.
4
- */
5
- export declare const openYamlFileAsObject: (filePath: string) => Promise<Impl>;
6
- /**
7
- * Saves given `yaml` dump as a file.
8
- */
9
- export declare const saveYamlFileAs: (object: any, pathToFile: string) => Promise<void>;
10
- /**
11
- * Checks if given `fileName` is yaml.
12
- */
13
- export declare const checkIfFileIsYaml: (fileName: string) => boolean;
@@ -1,36 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.checkIfFileIsYaml = exports.saveYamlFileAs = exports.openYamlFileAsObject = void 0;
4
- const fs = require("fs/promises");
5
- const path = require("path");
6
- const YAML = require("js-yaml");
7
- /**
8
- * Reads and parses `yaml` file to object.
9
- */
10
- const openYamlFileAsObject = async (filePath) => {
11
- const yamlFileBuffer = await fs.readFile(filePath, 'utf8');
12
- return YAML.load(yamlFileBuffer);
13
- };
14
- exports.openYamlFileAsObject = openYamlFileAsObject;
15
- /**
16
- * Saves given `yaml` dump as a file.
17
- */
18
- const saveYamlFileAs = async (object, pathToFile) => {
19
- const dirPath = path.dirname(pathToFile);
20
- await fs.mkdir(dirPath, { recursive: true });
21
- const yamlString = YAML.dump(object, { noRefs: true });
22
- return fs.writeFile(pathToFile, yamlString);
23
- };
24
- exports.saveYamlFileAs = saveYamlFileAs;
25
- /**
26
- * Checks if given `fileName` is yaml.
27
- */
28
- const checkIfFileIsYaml = (fileName) => {
29
- const yamlFileTypes = ['yaml', 'yml'];
30
- const splittedParts = fileName.split('.');
31
- const lastIndex = splittedParts.length - 1;
32
- const extension = splittedParts[lastIndex];
33
- return yamlFileTypes.includes(extension);
34
- };
35
- exports.checkIfFileIsYaml = checkIfFileIsYaml;
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoieWFtbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsL3lhbWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsa0NBQWtDO0FBQ2xDLDZCQUE2QjtBQUU3QixnQ0FBZ0M7QUFJaEM7O0dBRUc7QUFDSSxNQUFNLG9CQUFvQixHQUFHLEtBQUssRUFBRSxRQUFnQixFQUFpQixFQUFFO0lBQzVFLE1BQU0sY0FBYyxHQUFHLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBUyxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQUpXLFFBQUEsb0JBQW9CLHdCQUkvQjtBQUVGOztHQUVHO0FBQ0ksTUFBTSxjQUFjLEdBQUcsS0FBSyxFQUFFLE1BQVcsRUFBRSxVQUFrQixFQUFFLEVBQUU7SUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN6QyxNQUFNLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBQyxNQUFNLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztJQUVyRCxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzlDLENBQUMsQ0FBQztBQU5XLFFBQUEsY0FBYyxrQkFNekI7QUFFRjs7R0FFRztBQUNJLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUU7SUFDcEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUMzQyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFM0MsT0FBTyxhQUFhLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0FBQzNDLENBQUMsQ0FBQztBQVBXLFFBQUEsaUJBQWlCLHFCQU81QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGZzIGZyb20gJ2ZzL3Byb21pc2VzJztcbmltcG9ydCAqIGFzIHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCAqIGFzIFlBTUwgZnJvbSAnanMteWFtbCc7XG5cbmltcG9ydCB7SW1wbH0gZnJvbSAnLi4vdHlwZXMvaW1wbCc7XG5cbi8qKlxuICogUmVhZHMgYW5kIHBhcnNlcyBgeWFtbGAgZmlsZSB0byBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBvcGVuWWFtbEZpbGVBc09iamVjdCA9IGFzeW5jIChmaWxlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxJbXBsPiA9PiB7XG4gIGNvbnN0IHlhbWxGaWxlQnVmZmVyID0gYXdhaXQgZnMucmVhZEZpbGUoZmlsZVBhdGgsICd1dGY4Jyk7XG5cbiAgcmV0dXJuIFlBTUwubG9hZCh5YW1sRmlsZUJ1ZmZlcikgYXMgSW1wbDtcbn07XG5cbi8qKlxuICogU2F2ZXMgZ2l2ZW4gYHlhbWxgIGR1bXAgYXMgYSBmaWxlLlxuICovXG5leHBvcnQgY29uc3Qgc2F2ZVlhbWxGaWxlQXMgPSBhc3luYyAob2JqZWN0OiBhbnksIHBhdGhUb0ZpbGU6IHN0cmluZykgPT4ge1xuICBjb25zdCBkaXJQYXRoID0gcGF0aC5kaXJuYW1lKHBhdGhUb0ZpbGUpO1xuICBhd2FpdCBmcy5ta2RpcihkaXJQYXRoLCB7cmVjdXJzaXZlOiB0cnVlfSk7XG4gIGNvbnN0IHlhbWxTdHJpbmcgPSBZQU1MLmR1bXAob2JqZWN0LCB7bm9SZWZzOiB0cnVlfSk7XG5cbiAgcmV0dXJuIGZzLndyaXRlRmlsZShwYXRoVG9GaWxlLCB5YW1sU3RyaW5nKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIGlmIGdpdmVuIGBmaWxlTmFtZWAgaXMgeWFtbC5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrSWZGaWxlSXNZYW1sID0gKGZpbGVOYW1lOiBzdHJpbmcpID0+IHtcbiAgY29uc3QgeWFtbEZpbGVUeXBlcyA9IFsneWFtbCcsICd5bWwnXTtcbiAgY29uc3Qgc3BsaXR0ZWRQYXJ0cyA9IGZpbGVOYW1lLnNwbGl0KCcuJyk7XG4gIGNvbnN0IGxhc3RJbmRleCA9IHNwbGl0dGVkUGFydHMubGVuZ3RoIC0gMTtcbiAgY29uc3QgZXh0ZW5zaW9uID0gc3BsaXR0ZWRQYXJ0c1tsYXN0SW5kZXhdO1xuXG4gIHJldHVybiB5YW1sRmlsZVR5cGVzLmluY2x1ZGVzKGV4dGVuc2lvbik7XG59O1xuIl19