@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.
- package/CONTRIBUTING.md +13 -17
- package/README.md +17 -18
- package/coverage/clover.xml +111 -65
- package/coverage/coverage-final.json +7 -6
- package/coverage/lcov-report/config/config.ts.html +12 -3
- package/coverage/lcov-report/config/index.html +1 -1
- package/coverage/lcov-report/config/index.ts.html +3 -3
- package/coverage/lcov-report/config/strings.ts.html +2 -2
- package/coverage/lcov-report/index.html +9 -9
- package/coverage/lcov-report/lib/index.html +24 -9
- package/coverage/lcov-report/lib/models-universe.ts.html +1 -1
- package/coverage/lcov-report/lib/observatory.ts.html +7 -7
- package/coverage/lcov-report/lib/planet-aggregator.ts.html +253 -0
- package/coverage/lcov-report/lib/supercomputer.ts.html +211 -52
- package/coverage/lcov-report/util/args.ts.html +1 -1
- package/coverage/lcov-report/util/errors.ts.html +10 -7
- package/coverage/lcov-report/util/index.html +1 -1
- package/coverage/lcov-report/util/yaml.ts.html +1 -1
- package/coverage/lcov.info +184 -105
- package/examples/impls/case-studies/aggregation.yml +97 -0
- package/examples/impls/case-studies/ntt-data-on-premise.yaml +0 -42
- package/examples/impls/test/aggregation-test.yml +109 -0
- package/examples/impls/test/large-impl.yml +257303 -0
- package/examples/ompls/aggregation-test.yml +340 -0
- package/package.json +1 -1
- package/tsconfig.build.tsbuildinfo +1 -0
- package/yarn-error.log +5431 -0
- package/build/config/index.d.ts +0 -2
- package/build/config/index.js +0 -8
- package/build/config/strings.d.ts +0 -14
- package/build/config/strings.js +0 -30
- package/build/index.d.ts +0 -2
- package/build/index.js +0 -46
- package/build/lib/models-universe.d.ts +0 -28
- package/build/lib/models-universe.js +0 -95
- package/build/lib/supercomputer.d.ts +0 -30
- package/build/lib/supercomputer.js +0 -109
- package/build/types/azure-importer.d.ts +0 -29
- package/build/types/azure-importer.js +0 -3
- package/build/types/boavizta.d.ts +0 -7
- package/build/types/boavizta.js +0 -3
- package/build/types/common.d.ts +0 -7
- package/build/types/common.js +0 -9
- package/build/types/impl.d.ts +0 -40
- package/build/types/impl.js +0 -3
- package/build/types/models-universe.d.ts +0 -24
- package/build/types/models-universe.js +0 -3
- package/build/util/args.d.ts +0 -8
- package/build/util/helpers.d.ts +0 -4
- package/build/util/validations.d.ts +0 -25
- package/build/util/validations.js +0 -52
- package/build/util/yaml.d.ts +0 -13
- 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=
|
package/build/util/yaml.d.ts
DELETED
|
@@ -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;
|
package/build/util/yaml.js
DELETED
|
@@ -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
|