@grnsft/if 0.2.1 → 0.3.1
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/.commitlintrc.js +4 -7
- package/README.md +5 -1
- package/Refactor-migration-guide.md +342 -0
- package/build/{models/export-csv.d.ts → builtins/export-csv-raw.d.ts} +1 -1
- package/build/builtins/export-csv-raw.js +129 -0
- package/build/builtins/export-csv.d.ts +10 -0
- package/build/builtins/export-csv.js +86 -0
- package/build/builtins/export-log.js +18 -0
- package/build/builtins/export-yaml.js +27 -0
- package/build/builtins/group-by.d.ts +5 -0
- package/build/builtins/group-by.js +56 -0
- package/build/{models → builtins}/index.js +1 -1
- package/build/{models → builtins}/time-sync.d.ts +2 -2
- package/build/builtins/time-sync.js +304 -0
- package/build/config/config.js +2 -2
- package/build/config/params.js +56 -1
- package/build/config/strings.d.ts +4 -2
- package/build/config/strings.js +7 -9
- package/build/index.js +3 -1
- package/build/lib/aggregate.d.ts +1 -1
- package/build/lib/aggregate.js +4 -3
- package/build/lib/compute.js +9 -10
- package/build/lib/exhaust.js +8 -5
- package/build/lib/initialize.d.ts +2 -2
- package/build/lib/initialize.js +9 -5
- package/build/lib/load.d.ts +33 -2
- package/build/lib/load.js +4 -4
- package/build/lib/parameterize.d.ts +1 -1
- package/build/lib/parameterize.js +6 -4
- package/build/types/aggregation.d.ts +0 -1
- package/build/types/aggregation.js +1 -1
- package/build/types/compute.d.ts +3 -3
- package/build/types/compute.js +1 -1
- package/build/types/interface.d.ts +14 -1
- package/build/types/interface.js +6 -1
- package/build/types/manifest.d.ts +9 -40
- package/build/types/manifest.js +1 -1
- package/build/types/parameters.d.ts +2 -12
- package/build/types/parameters.js +1 -1
- package/build/types/plugin-storage.d.ts +6 -0
- package/build/types/plugin-storage.js +3 -0
- package/build/util/aggregation-helper.d.ts +1 -1
- package/build/util/aggregation-helper.js +11 -12
- package/build/util/errors.d.ts +1 -1
- package/build/util/errors.js +2 -2
- package/build/util/json.js +25 -5
- package/build/util/log-memoize.d.ts +3 -0
- package/build/util/log-memoize.js +19 -0
- package/build/util/logger.d.ts +1 -1
- package/build/util/logger.js +2 -3
- package/build/util/plugin-storage.d.ts +14 -0
- package/build/util/plugin-storage.js +34 -0
- package/build/util/validations.d.ts +144 -11
- package/build/util/validations.js +19 -17
- package/examples/manifests/asim-demo.yml +74 -0
- package/examples/manifests/basic-demo.yml +4 -9
- package/examples/manifests/boavizta-cloud.yml +20 -0
- package/examples/manifests/cim.yml +3 -3
- package/examples/manifests/divide.yml +38 -0
- package/examples/manifests/generics.yml +4 -4
- package/examples/manifests/group-by.yml +13 -13
- package/examples/manifests/mock-observation.yml +2 -2
- package/examples/manifests/nesting-demo.yml +2 -2
- package/examples/manifests/nesting.yml +16 -16
- package/examples/manifests/pipeline-demo-1.yml +4 -4
- package/examples/manifests/pipeline-demo-2.yml +9 -9
- package/examples/manifests/pipeline-demo.yml +10 -10
- package/examples/manifests/pipeline-teads-sci.yml +4 -4
- package/examples/manifests/pipeline-with-generics.yml +8 -8
- package/examples/manifests/pipeline-with-mocks.yml +10 -10
- package/examples/manifests/regex.yml +23 -0
- package/package.json +6 -3
- package/src/builtins/README.md +852 -0
- package/build/models/export-csv.js +0 -129
- package/build/models/export-log.js +0 -18
- package/build/models/export-yaml.js +0 -24
- package/build/models/group-by.d.ts +0 -11
- package/build/models/group-by.js +0 -56
- package/build/models/time-sync.js +0 -304
- package/build/types/initialize.d.ts +0 -4
- package/build/types/initialize.js +0 -3
- package/build/types/load.d.ts +0 -7
- package/build/types/load.js +0 -3
- package/src/models/README.md +0 -268
- /package/build/{models → builtins}/export-log.d.ts +0 -0
- /package/build/{models → builtins}/export-yaml.d.ts +0 -0
- /package/build/{models → builtins}/index.d.ts +0 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ExportYaml = void 0;
|
|
4
|
+
const yaml_1 = require("../util/yaml");
|
|
5
|
+
const errors_1 = require("../util/errors");
|
|
6
|
+
const { CliInputError } = errors_1.ERRORS;
|
|
7
|
+
const ExportYaml = () => {
|
|
8
|
+
/** Takes string before hashtag. */
|
|
9
|
+
const stripHashtag = (path) => path.split('#')[0];
|
|
10
|
+
/**
|
|
11
|
+
* Saves output file in YAML format.
|
|
12
|
+
*/
|
|
13
|
+
const execute = async (tree, context, outputPath) => {
|
|
14
|
+
if (!outputPath) {
|
|
15
|
+
throw new CliInputError('Output path is required.');
|
|
16
|
+
}
|
|
17
|
+
const outputFile = {
|
|
18
|
+
...context,
|
|
19
|
+
tree,
|
|
20
|
+
};
|
|
21
|
+
const path = stripHashtag(outputPath);
|
|
22
|
+
await (0, yaml_1.saveYamlFileAs)(outputFile, `${path}.yaml`);
|
|
23
|
+
};
|
|
24
|
+
return { execute };
|
|
25
|
+
};
|
|
26
|
+
exports.ExportYaml = ExportYaml;
|
|
27
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LXlhbWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbHRpbnMvZXhwb3J0LXlhbWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQTRDO0FBRTVDLDJDQUFzQztBQUl0QyxNQUFNLEVBQUMsYUFBYSxFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRXhCLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtJQUM3QixtQ0FBbUM7SUFDbkMsTUFBTSxZQUFZLEdBQUcsQ0FBQyxJQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUQ7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxLQUFLLEVBQUUsSUFBUyxFQUFFLE9BQWdCLEVBQUUsVUFBa0IsRUFBRSxFQUFFO1FBQ3hFLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDZixNQUFNLElBQUksYUFBYSxDQUFDLDBCQUEwQixDQUFDLENBQUM7U0FDckQ7UUFFRCxNQUFNLFVBQVUsR0FBRztZQUNqQixHQUFHLE9BQU87WUFDVixJQUFJO1NBQ0wsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUV0QyxNQUFNLElBQUEscUJBQWMsRUFBQyxVQUFVLEVBQUUsR0FBRyxJQUFJLE9BQU8sQ0FBQyxDQUFDO0lBQ25ELENBQUMsQ0FBQztJQUVGLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQztBQUNuQixDQUFDLENBQUM7QUF0QlcsUUFBQSxVQUFVLGNBc0JyQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7c2F2ZVlhbWxGaWxlQXN9IGZyb20gJy4uL3V0aWwveWFtbCc7XG5cbmltcG9ydCB7RVJST1JTfSBmcm9tICcuLi91dGlsL2Vycm9ycyc7XG5cbmltcG9ydCB7Q29udGV4dH0gZnJvbSAnLi4vdHlwZXMvbWFuaWZlc3QnO1xuXG5jb25zdCB7Q2xpSW5wdXRFcnJvcn0gPSBFUlJPUlM7XG5cbmV4cG9ydCBjb25zdCBFeHBvcnRZYW1sID0gKCkgPT4ge1xuICAvKiogVGFrZXMgc3RyaW5nIGJlZm9yZSBoYXNodGFnLiAqL1xuICBjb25zdCBzdHJpcEhhc2h0YWcgPSAocGF0aDogc3RyaW5nKSA9PiBwYXRoLnNwbGl0KCcjJylbMF07XG5cbiAgLyoqXG4gICAqIFNhdmVzIG91dHB1dCBmaWxlIGluIFlBTUwgZm9ybWF0LlxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IGFzeW5jICh0cmVlOiBhbnksIGNvbnRleHQ6IENvbnRleHQsIG91dHB1dFBhdGg6IHN0cmluZykgPT4ge1xuICAgIGlmICghb3V0cHV0UGF0aCkge1xuICAgICAgdGhyb3cgbmV3IENsaUlucHV0RXJyb3IoJ091dHB1dCBwYXRoIGlzIHJlcXVpcmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dEZpbGUgPSB7XG4gICAgICAuLi5jb250ZXh0LFxuICAgICAgdHJlZSxcbiAgICB9O1xuICAgIGNvbnN0IHBhdGggPSBzdHJpcEhhc2h0YWcob3V0cHV0UGF0aCk7XG5cbiAgICBhd2FpdCBzYXZlWWFtbEZpbGVBcyhvdXRwdXRGaWxlLCBgJHtwYXRofS55YW1sYCk7XG4gIH07XG5cbiAgcmV0dXJuIHtleGVjdXRlfTtcbn07XG4iXX0=
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.GroupBy = void 0;
|
|
4
|
+
const errors_1 = require("../util/errors");
|
|
5
|
+
const config_1 = require("../config");
|
|
6
|
+
const { InvalidGrouping } = errors_1.ERRORS;
|
|
7
|
+
const { INVALID_GROUP_BY } = config_1.STRINGS;
|
|
8
|
+
/**
|
|
9
|
+
* Plugin for inputs grouping.
|
|
10
|
+
*/
|
|
11
|
+
const GroupBy = () => {
|
|
12
|
+
const metadata = {
|
|
13
|
+
kind: 'groupby',
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Creates structure to insert inputs by groups.
|
|
17
|
+
*/
|
|
18
|
+
const appendGroup = (value, object, groups) => {
|
|
19
|
+
if (groups.length > 0) {
|
|
20
|
+
const group = groups.shift();
|
|
21
|
+
object.children = object.children ?? {};
|
|
22
|
+
object.children[group] = object.children[group] ?? {};
|
|
23
|
+
if (groups.length === 0) {
|
|
24
|
+
if (object.children[group].inputs &&
|
|
25
|
+
object.children[group].inputs.length > 0) {
|
|
26
|
+
object.children[group].inputs.push(value);
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
object.children[group].inputs = [value];
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
appendGroup(value, object.children[group], groups);
|
|
33
|
+
}
|
|
34
|
+
return object;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Interates over inputs, grabs config-group types values for each one.
|
|
38
|
+
* Based on grouping types, initializes the structure grouped structure.
|
|
39
|
+
*/
|
|
40
|
+
const execute = (inputs, config) => inputs.reduce((acc, input) => {
|
|
41
|
+
const groups = config.group.map(groupType => {
|
|
42
|
+
if (!input[groupType]) {
|
|
43
|
+
throw new InvalidGrouping(INVALID_GROUP_BY(groupType));
|
|
44
|
+
}
|
|
45
|
+
return input[groupType];
|
|
46
|
+
});
|
|
47
|
+
acc = {
|
|
48
|
+
...acc,
|
|
49
|
+
...appendGroup(input, acc, groups),
|
|
50
|
+
};
|
|
51
|
+
return acc;
|
|
52
|
+
}, {}).children;
|
|
53
|
+
return { metadata, execute };
|
|
54
|
+
};
|
|
55
|
+
exports.GroupBy = GroupBy;
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JvdXAtYnkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbHRpbnMvZ3JvdXAtYnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsMkNBQXNDO0FBRXRDLHNDQUFrQztBQUtsQyxNQUFNLEVBQUMsZUFBZSxFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRWpDLE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLGdCQUFPLENBQUM7QUFFbkM7O0dBRUc7QUFDSSxNQUFNLE9BQU8sR0FBRyxHQUFrQixFQUFFO0lBQ3pDLE1BQU0sUUFBUSxHQUFHO1FBQ2YsSUFBSSxFQUFFLFNBQVM7S0FDaEIsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSxXQUFXLEdBQUcsQ0FDbEIsS0FBbUIsRUFDbkIsTUFBVyxFQUNYLE1BQWdCLEVBQ1gsRUFBRTtRQUNQLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBWSxDQUFDO1lBRXZDLE1BQU0sQ0FBQyxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDeEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUV0RCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixJQUNFLE1BQU0sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTTtvQkFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEM7b0JBQ0EsTUFBTSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUMzQztxQkFBTTtvQkFDTCxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2lCQUN6QzthQUNGO1lBRUQsV0FBVyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1NBQ3BEO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRUY7OztPQUdHO0lBQ0gsTUFBTSxPQUFPLEdBQUcsQ0FBQyxNQUFzQixFQUFFLE1BQXFCLEVBQUUsRUFBRSxDQUNoRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxFQUFFO1FBQzNCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQzFDLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxlQUFlLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzthQUN4RDtZQUVELE9BQU8sS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzFCLENBQUMsQ0FBQyxDQUFDO1FBRUgsR0FBRyxHQUFHO1lBQ0osR0FBRyxHQUFHO1lBQ04sR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUM7U0FDbkMsQ0FBQztRQUVGLE9BQU8sR0FBRyxDQUFDO0lBQ2IsQ0FBQyxFQUFFLEVBQVMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztJQUV6QixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQTNEVyxRQUFBLE9BQU8sV0EyRGxCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4uL3V0aWwvZXJyb3JzJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbXBvcnQge0dyb3VwQnlQbHVnaW4sIFBsdWdpblBhcmFtc30gZnJvbSAnLi4vdHlwZXMvaW50ZXJmYWNlJztcbmltcG9ydCB7R3JvdXBCeUNvbmZpZ30gZnJvbSAnLi4vdHlwZXMvZ3JvdXAtYnknO1xuXG5jb25zdCB7SW52YWxpZEdyb3VwaW5nfSA9IEVSUk9SUztcblxuY29uc3Qge0lOVkFMSURfR1JPVVBfQll9ID0gU1RSSU5HUztcblxuLyoqXG4gKiBQbHVnaW4gZm9yIGlucHV0cyBncm91cGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IEdyb3VwQnkgPSAoKTogR3JvdXBCeVBsdWdpbiA9PiB7XG4gIGNvbnN0IG1ldGFkYXRhID0ge1xuICAgIGtpbmQ6ICdncm91cGJ5JyxcbiAgfTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBzdHJ1Y3R1cmUgdG8gaW5zZXJ0IGlucHV0cyBieSBncm91cHMuXG4gICAqL1xuICBjb25zdCBhcHBlbmRHcm91cCA9IChcbiAgICB2YWx1ZTogUGx1Z2luUGFyYW1zLFxuICAgIG9iamVjdDogYW55LFxuICAgIGdyb3Vwczogc3RyaW5nW11cbiAgKTogYW55ID0+IHtcbiAgICBpZiAoZ3JvdXBzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGdyb3VwID0gZ3JvdXBzLnNoaWZ0KCkgYXMgc3RyaW5nO1xuXG4gICAgICBvYmplY3QuY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW4gPz8ge307XG4gICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdID0gb2JqZWN0LmNoaWxkcmVuW2dyb3VwXSA/PyB7fTtcblxuICAgICAgaWYgKGdyb3Vwcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIG9iamVjdC5jaGlsZHJlbltncm91cF0uaW5wdXRzICYmXG4gICAgICAgICAgb2JqZWN0LmNoaWxkcmVuW2dyb3VwXS5pbnB1dHMubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdLmlucHV0cy5wdXNoKHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvYmplY3QuY2hpbGRyZW5bZ3JvdXBdLmlucHV0cyA9IFt2YWx1ZV07XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgYXBwZW5kR3JvdXAodmFsdWUsIG9iamVjdC5jaGlsZHJlbltncm91cF0sIGdyb3Vwcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iamVjdDtcbiAgfTtcblxuICAvKipcbiAgICogSW50ZXJhdGVzIG92ZXIgaW5wdXRzLCBncmFicyBjb25maWctZ3JvdXAgdHlwZXMgdmFsdWVzIGZvciBlYWNoIG9uZS5cbiAgICogQmFzZWQgb24gZ3JvdXBpbmcgdHlwZXMsIGluaXRpYWxpemVzIHRoZSBzdHJ1Y3R1cmUgZ3JvdXBlZCBzdHJ1Y3R1cmUuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10sIGNvbmZpZzogR3JvdXBCeUNvbmZpZykgPT5cbiAgICBpbnB1dHMucmVkdWNlKChhY2MsIGlucHV0KSA9PiB7XG4gICAgICBjb25zdCBncm91cHMgPSBjb25maWcuZ3JvdXAubWFwKGdyb3VwVHlwZSA9PiB7XG4gICAgICAgIGlmICghaW5wdXRbZ3JvdXBUeXBlXSkge1xuICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkR3JvdXBpbmcoSU5WQUxJRF9HUk9VUF9CWShncm91cFR5cGUpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbnB1dFtncm91cFR5cGVdO1xuICAgICAgfSk7XG5cbiAgICAgIGFjYyA9IHtcbiAgICAgICAgLi4uYWNjLFxuICAgICAgICAuLi5hcHBlbmRHcm91cChpbnB1dCwgYWNjLCBncm91cHMpLFxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBhbnkpLmNoaWxkcmVuO1xuXG4gIHJldHVybiB7bWV0YWRhdGEsIGV4ZWN1dGV9O1xufTtcbiJdfQ==
|
|
@@ -5,4 +5,4 @@ var group_by_1 = require("./group-by");
|
|
|
5
5
|
Object.defineProperty(exports, "GroupBy", { enumerable: true, get: function () { return group_by_1.GroupBy; } });
|
|
6
6
|
var time_sync_1 = require("./time-sync");
|
|
7
7
|
Object.defineProperty(exports, "TimeSync", { enumerable: true, get: function () { return time_sync_1.TimeSync; } });
|
|
8
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYnVpbHRpbnMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsdUNBQW1DO0FBQTNCLG1HQUFBLE9BQU8sT0FBQTtBQUNmLHlDQUFxQztBQUE3QixxR0FBQSxRQUFRLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQge0dyb3VwQnl9IGZyb20gJy4vZ3JvdXAtYnknO1xuZXhwb3J0IHtUaW1lU3luY30gZnJvbSAnLi90aW1lLXN5bmMnO1xuIl19
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
+
import { ExecutePlugin } from '../types/interface';
|
|
1
2
|
import { TimeNormalizerConfig } from '../types/time-sync';
|
|
2
|
-
|
|
3
|
-
export declare const TimeSync: (globalConfig: TimeNormalizerConfig) => PluginInterface;
|
|
3
|
+
export declare const TimeSync: (globalConfig: TimeNormalizerConfig) => ExecutePlugin;
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TimeSync = void 0;
|
|
4
|
+
const types_1 = require("node:util/types");
|
|
5
|
+
const luxon_1 = require("luxon");
|
|
6
|
+
const zod_1 = require("zod");
|
|
7
|
+
const parameterize_1 = require("../lib/parameterize");
|
|
8
|
+
const errors_1 = require("../util/errors");
|
|
9
|
+
const config_1 = require("../config");
|
|
10
|
+
const validations_1 = require("../util/validations");
|
|
11
|
+
const { InputValidationError } = errors_1.ERRORS;
|
|
12
|
+
const { INVALID_TIME_NORMALIZATION, INVALID_OBSERVATION_OVERLAP, AVOIDING_PADDING_BY_EDGES, } = config_1.STRINGS;
|
|
13
|
+
const TimeSync = (globalConfig) => {
|
|
14
|
+
const metadata = {
|
|
15
|
+
kind: 'execute',
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Take input array and return time-synchronized input array.
|
|
19
|
+
*/
|
|
20
|
+
const execute = (inputs) => {
|
|
21
|
+
const validatedConfig = validateGlobalConfig();
|
|
22
|
+
const timeParams = {
|
|
23
|
+
startTime: luxon_1.DateTime.fromISO(validatedConfig['start-time']),
|
|
24
|
+
endTime: luxon_1.DateTime.fromISO(validatedConfig['end-time']),
|
|
25
|
+
interval: validatedConfig.interval,
|
|
26
|
+
allowPadding: validatedConfig['allow-padding'],
|
|
27
|
+
};
|
|
28
|
+
const pad = checkForPadding(inputs, timeParams);
|
|
29
|
+
validatePadding(pad, timeParams);
|
|
30
|
+
const paddedInputs = padInputs(inputs, pad, timeParams);
|
|
31
|
+
const flattenInputs = paddedInputs.reduce((acc, input, index) => {
|
|
32
|
+
const safeInput = Object.assign({}, input, validateInput(input, index));
|
|
33
|
+
const currentMoment = parseDate(safeInput.timestamp);
|
|
34
|
+
/** Checks if not the first input, then check consistency with previous ones. */
|
|
35
|
+
if (index > 0) {
|
|
36
|
+
const previousInput = paddedInputs[index - 1];
|
|
37
|
+
const previousInputTimestamp = parseDate(previousInput.timestamp);
|
|
38
|
+
/** Checks for timestamps overlap. */
|
|
39
|
+
if (parseDate(previousInput.timestamp).plus({
|
|
40
|
+
seconds: previousInput.duration,
|
|
41
|
+
}) > currentMoment) {
|
|
42
|
+
throw new InputValidationError(INVALID_OBSERVATION_OVERLAP);
|
|
43
|
+
}
|
|
44
|
+
const compareableTime = previousInputTimestamp.plus({
|
|
45
|
+
seconds: previousInput.duration,
|
|
46
|
+
});
|
|
47
|
+
const timelineGapSize = currentMoment
|
|
48
|
+
.diff(compareableTime)
|
|
49
|
+
.as('seconds');
|
|
50
|
+
/** Checks if there is gap in timeline. */
|
|
51
|
+
if (timelineGapSize > 1) {
|
|
52
|
+
acc.push(...getZeroishInputPerSecondBetweenRange(compareableTime, currentMoment, safeInput));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
/** Break down current observation. */
|
|
56
|
+
for (let i = 0; i < safeInput.duration; i++) {
|
|
57
|
+
const normalizedInput = breakDownInput(safeInput, i);
|
|
58
|
+
acc.push(normalizedInput);
|
|
59
|
+
}
|
|
60
|
+
return trimInputsByGlobalTimeline(acc, timeParams);
|
|
61
|
+
}, []);
|
|
62
|
+
const sortedInputs = flattenInputs.sort((a, b) => parseDate(a.timestamp).diff(parseDate(b.timestamp)).as('seconds'));
|
|
63
|
+
return resampleInputs(sortedInputs, timeParams);
|
|
64
|
+
};
|
|
65
|
+
const parseDate = (date) => {
|
|
66
|
+
if (!date)
|
|
67
|
+
return luxon_1.DateTime.invalid('Invalid date');
|
|
68
|
+
// dates are passed to time-sync.ts both in ISO 8601 format
|
|
69
|
+
// and as a Date object (from the deserialization of a YAML file)
|
|
70
|
+
// if the YAML parser fails to identify as a date, it passes as a string
|
|
71
|
+
if ((0, types_1.isDate)(date)) {
|
|
72
|
+
return luxon_1.DateTime.fromJSDate(date);
|
|
73
|
+
}
|
|
74
|
+
if (typeof date === 'string') {
|
|
75
|
+
return luxon_1.DateTime.fromISO(date);
|
|
76
|
+
}
|
|
77
|
+
throw new InputValidationError(`Unexpected date datatype: ${typeof date}: ${date}`);
|
|
78
|
+
};
|
|
79
|
+
/**
|
|
80
|
+
* Validates input parameters.
|
|
81
|
+
*/
|
|
82
|
+
const validateInput = (input, index) => {
|
|
83
|
+
const schema = zod_1.z.object({
|
|
84
|
+
timestamp: zod_1.z
|
|
85
|
+
.string({
|
|
86
|
+
required_error: `required in input[${index}]`,
|
|
87
|
+
})
|
|
88
|
+
.datetime({
|
|
89
|
+
message: `invalid datetime in input[${index}]`,
|
|
90
|
+
})
|
|
91
|
+
.or(zod_1.z.date()),
|
|
92
|
+
duration: zod_1.z.number(),
|
|
93
|
+
});
|
|
94
|
+
return (0, validations_1.validate)(schema, input);
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* Validates global config parameters.
|
|
98
|
+
*/
|
|
99
|
+
const validateGlobalConfig = () => {
|
|
100
|
+
if (globalConfig === undefined) {
|
|
101
|
+
throw new InputValidationError(INVALID_TIME_NORMALIZATION);
|
|
102
|
+
}
|
|
103
|
+
const schema = zod_1.z
|
|
104
|
+
.object({
|
|
105
|
+
'start-time': zod_1.z.string().datetime(),
|
|
106
|
+
'end-time': zod_1.z.string().datetime(),
|
|
107
|
+
interval: zod_1.z.number(),
|
|
108
|
+
'allow-padding': zod_1.z.boolean(),
|
|
109
|
+
})
|
|
110
|
+
.refine(data => data['start-time'] < data['end-time'], {
|
|
111
|
+
message: '`start-time` should be lower than `end-time`',
|
|
112
|
+
});
|
|
113
|
+
return (0, validations_1.validate)(schema, globalConfig);
|
|
114
|
+
};
|
|
115
|
+
/**
|
|
116
|
+
* Calculates minimal factor.
|
|
117
|
+
*/
|
|
118
|
+
const convertPerInterval = (value, duration) => value / duration;
|
|
119
|
+
/**
|
|
120
|
+
* Normalize time per given second.
|
|
121
|
+
*/
|
|
122
|
+
const normalizeTimePerSecond = (currentRoundMoment, i) => {
|
|
123
|
+
const thisMoment = parseDate(currentRoundMoment).startOf('second');
|
|
124
|
+
return thisMoment.plus({ seconds: i });
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Breaks down input per minimal time unit.
|
|
128
|
+
*/
|
|
129
|
+
const breakDownInput = (input, i) => {
|
|
130
|
+
const inputKeys = Object.keys(input);
|
|
131
|
+
return inputKeys.reduce((acc, key) => {
|
|
132
|
+
const method = parameterize_1.parameterize.getAggregationMethod(key);
|
|
133
|
+
if (key === 'timestamp') {
|
|
134
|
+
const perSecond = normalizeTimePerSecond(input.timestamp, i);
|
|
135
|
+
acc[key] = perSecond.toUTC().toISO() ?? '';
|
|
136
|
+
return acc;
|
|
137
|
+
}
|
|
138
|
+
/** @todo use user defined resolution later */
|
|
139
|
+
if (key === 'duration') {
|
|
140
|
+
acc[key] = 1;
|
|
141
|
+
return acc;
|
|
142
|
+
}
|
|
143
|
+
acc[key] =
|
|
144
|
+
method === 'sum'
|
|
145
|
+
? convertPerInterval(input[key], input['duration'])
|
|
146
|
+
: input[key];
|
|
147
|
+
return acc;
|
|
148
|
+
}, {});
|
|
149
|
+
};
|
|
150
|
+
/**
|
|
151
|
+
* Populates object to fill the gaps in observational timeline using zeroish values.
|
|
152
|
+
*/
|
|
153
|
+
const fillWithZeroishInput = (input, missingTimestamp) => {
|
|
154
|
+
const metrics = Object.keys(input);
|
|
155
|
+
return metrics.reduce((acc, metric) => {
|
|
156
|
+
if (metric === 'timestamp') {
|
|
157
|
+
acc[metric] = missingTimestamp.startOf('second').toUTC().toISO() ?? '';
|
|
158
|
+
return acc;
|
|
159
|
+
}
|
|
160
|
+
/** @todo later will be changed to user defined interval */
|
|
161
|
+
if (metric === 'duration') {
|
|
162
|
+
acc[metric] = 1;
|
|
163
|
+
return acc;
|
|
164
|
+
}
|
|
165
|
+
if (metric === 'time-reserved') {
|
|
166
|
+
acc[metric] = acc['duration'];
|
|
167
|
+
return acc;
|
|
168
|
+
}
|
|
169
|
+
const method = parameterize_1.parameterize.getAggregationMethod(metric);
|
|
170
|
+
if (method === 'avg' || method === 'sum') {
|
|
171
|
+
acc[metric] = 0;
|
|
172
|
+
return acc;
|
|
173
|
+
}
|
|
174
|
+
acc[metric] = input[metric];
|
|
175
|
+
return acc;
|
|
176
|
+
}, {});
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Checks if `error on padding` is enabled and padding is needed. If so, then throws error.
|
|
180
|
+
*/
|
|
181
|
+
const validatePadding = (pad, params) => {
|
|
182
|
+
const { start, end } = pad;
|
|
183
|
+
const isPaddingNeeded = start || end;
|
|
184
|
+
if (!params.allowPadding && isPaddingNeeded) {
|
|
185
|
+
throw new InputValidationError(AVOIDING_PADDING_BY_EDGES(start, end));
|
|
186
|
+
}
|
|
187
|
+
};
|
|
188
|
+
/**
|
|
189
|
+
* Checks if padding is needed either at start of the timeline or the end and returns status.
|
|
190
|
+
*/
|
|
191
|
+
const checkForPadding = (inputs, params) => {
|
|
192
|
+
const startDiffInSeconds = parseDate(inputs[0].timestamp)
|
|
193
|
+
.diff(params.startTime)
|
|
194
|
+
.as('seconds');
|
|
195
|
+
const lastInput = inputs[inputs.length - 1];
|
|
196
|
+
const endDiffInSeconds = parseDate(lastInput.timestamp)
|
|
197
|
+
.plus({ second: lastInput.duration })
|
|
198
|
+
.diff(params.endTime)
|
|
199
|
+
.as('seconds');
|
|
200
|
+
return {
|
|
201
|
+
start: startDiffInSeconds > 0,
|
|
202
|
+
end: endDiffInSeconds < 0,
|
|
203
|
+
};
|
|
204
|
+
};
|
|
205
|
+
/**
|
|
206
|
+
* Iterates over given inputs frame, meanwhile checking if aggregation method is `sum`, then calculates it.
|
|
207
|
+
* For methods is `avg` and `none` calculating average of the frame.
|
|
208
|
+
*/
|
|
209
|
+
const resampleInputFrame = (inputsInTimeslot) => {
|
|
210
|
+
return inputsInTimeslot.reduce((acc, input, index, inputs) => {
|
|
211
|
+
const metrics = Object.keys(input);
|
|
212
|
+
metrics.forEach(metric => {
|
|
213
|
+
const method = parameterize_1.parameterize.getAggregationMethod(metric);
|
|
214
|
+
acc[metric] = acc[metric] ?? 0;
|
|
215
|
+
if (metric === 'timestamp') {
|
|
216
|
+
acc[metric] = inputs[0][metric];
|
|
217
|
+
return;
|
|
218
|
+
}
|
|
219
|
+
if (method === 'sum') {
|
|
220
|
+
acc[metric] += input[metric];
|
|
221
|
+
return;
|
|
222
|
+
}
|
|
223
|
+
if (method === 'none') {
|
|
224
|
+
acc[metric] = input[metric];
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* If timeslot contains records more than one, then divide each metric by the timeslot length,
|
|
229
|
+
* so that their sum yields the timeslot average.
|
|
230
|
+
*/
|
|
231
|
+
if (inputsInTimeslot.length > 1 &&
|
|
232
|
+
index === inputsInTimeslot.length - 1) {
|
|
233
|
+
acc[metric] /= inputsInTimeslot.length;
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
acc[metric] += input[metric];
|
|
237
|
+
});
|
|
238
|
+
return acc;
|
|
239
|
+
}, {});
|
|
240
|
+
};
|
|
241
|
+
/**
|
|
242
|
+
* Takes each array frame with interval length, then aggregating them together as from units.yaml file.
|
|
243
|
+
*/
|
|
244
|
+
const resampleInputs = (inputs, params) => {
|
|
245
|
+
return inputs.reduce((acc, _input, index, inputs) => {
|
|
246
|
+
const frameStart = index * params.interval;
|
|
247
|
+
const frameEnd = (index + 1) * params.interval;
|
|
248
|
+
const inputsFrame = inputs.slice(frameStart, frameEnd);
|
|
249
|
+
const resampledInput = resampleInputFrame(inputsFrame);
|
|
250
|
+
/** Checks if resampled input is not empty, then includes in result. */
|
|
251
|
+
if (Object.keys(resampledInput).length > 0) {
|
|
252
|
+
acc.push(resampledInput);
|
|
253
|
+
}
|
|
254
|
+
return acc;
|
|
255
|
+
}, []);
|
|
256
|
+
};
|
|
257
|
+
/**
|
|
258
|
+
* Pads zeroish inputs from the beginning or at the end of the inputs if needed.
|
|
259
|
+
*/
|
|
260
|
+
const padInputs = (inputs, pad, params) => {
|
|
261
|
+
const { start, end } = pad;
|
|
262
|
+
const paddedFromBeginning = [];
|
|
263
|
+
if (start) {
|
|
264
|
+
paddedFromBeginning.push(...getZeroishInputPerSecondBetweenRange(params.startTime, parseDate(inputs[0].timestamp), inputs[0]));
|
|
265
|
+
}
|
|
266
|
+
const paddedArray = paddedFromBeginning.concat(inputs);
|
|
267
|
+
if (end) {
|
|
268
|
+
const lastInput = inputs[inputs.length - 1];
|
|
269
|
+
const lastInputEnd = parseDate(lastInput.timestamp).plus({
|
|
270
|
+
seconds: lastInput.duration,
|
|
271
|
+
});
|
|
272
|
+
paddedArray.push(...getZeroishInputPerSecondBetweenRange(lastInputEnd, params.endTime.plus({ seconds: 1 }), lastInput));
|
|
273
|
+
}
|
|
274
|
+
return paddedArray;
|
|
275
|
+
};
|
|
276
|
+
const getZeroishInputPerSecondBetweenRange = (startDate, endDate, templateInput) => {
|
|
277
|
+
const array = [];
|
|
278
|
+
const dateRange = luxon_1.Interval.fromDateTimes(startDate, endDate);
|
|
279
|
+
for (const interval of dateRange.splitBy({ second: 1 })) {
|
|
280
|
+
array.push(fillWithZeroishInput(templateInput,
|
|
281
|
+
// as far as I can tell, start will never be null
|
|
282
|
+
// because if we pass an invalid start/endDate to
|
|
283
|
+
// Interval, we get a zero length array as the range
|
|
284
|
+
interval.start || luxon_1.DateTime.invalid('not expected - start is null')));
|
|
285
|
+
}
|
|
286
|
+
return array;
|
|
287
|
+
};
|
|
288
|
+
/*
|
|
289
|
+
* Checks if input's timestamp is included in global specified period then leaves it, otherwise.
|
|
290
|
+
*/
|
|
291
|
+
const trimInputsByGlobalTimeline = (inputs, params) => {
|
|
292
|
+
return inputs.reduce((acc, item) => {
|
|
293
|
+
const { timestamp } = item;
|
|
294
|
+
if (parseDate(timestamp) >= params.startTime &&
|
|
295
|
+
parseDate(timestamp) <= params.endTime) {
|
|
296
|
+
acc.push(item);
|
|
297
|
+
}
|
|
298
|
+
return acc;
|
|
299
|
+
}, []);
|
|
300
|
+
};
|
|
301
|
+
return { metadata, execute };
|
|
302
|
+
};
|
|
303
|
+
exports.TimeSync = TimeSync;
|
|
304
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZS1zeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2J1aWx0aW5zL3RpbWUtc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwyQ0FBdUM7QUFDdkMsaUNBQTZEO0FBQzdELDZCQUFzQjtBQUV0QixzREFBaUQ7QUFFakQsMkNBQXNDO0FBRXRDLHNDQUFrQztBQVFsQyxxREFBNkM7QUFFN0MsTUFBTSxFQUFDLG9CQUFvQixFQUFDLEdBQUcsZUFBTSxDQUFDO0FBRXRDLE1BQU0sRUFDSiwwQkFBMEIsRUFDMUIsMkJBQTJCLEVBQzNCLHlCQUF5QixHQUMxQixHQUFHLGdCQUFPLENBQUM7QUFFTCxNQUFNLFFBQVEsR0FBRyxDQUFDLFlBQWtDLEVBQWlCLEVBQUU7SUFDNUUsTUFBTSxRQUFRLEdBQUc7UUFDZixJQUFJLEVBQUUsU0FBUztLQUNoQixDQUFDO0lBRUY7O09BRUc7SUFDSCxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQXNCLEVBQWtCLEVBQUU7UUFDekQsTUFBTSxlQUFlLEdBQUcsb0JBQW9CLEVBQUUsQ0FBQztRQUMvQyxNQUFNLFVBQVUsR0FBRztZQUNqQixTQUFTLEVBQUUsZ0JBQVEsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQzFELE9BQU8sRUFBRSxnQkFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDdEQsUUFBUSxFQUFFLGVBQWUsQ0FBQyxRQUFRO1lBQ2xDLFlBQVksRUFBRSxlQUFlLENBQUMsZUFBZSxDQUFDO1NBQy9DLENBQUM7UUFFRixNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2hELGVBQWUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFakMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFF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USxDQUFDLGFBQWEsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0QsS0FBSyxNQUFNLFFBQVEsSUFBSSxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLENBQUMsRUFBQyxDQUFDLEVBQUU7WUFDckQsS0FBSyxDQUFDLElBQUksQ0FDUixvQkFBb0IsQ0FDbEIsYUFBYTtZQUNiLGlEQUFpRDtZQUNqRCxpREFBaUQ7WUFDakQsb0RBQW9EO1lBQ3BELFFBQVEsQ0FBQyxLQUFLLElBQUksZ0JBQVEsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FDbkUsQ0FDRixDQUFDO1NBQ0g7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUMsQ0FBQztJQUVGOztPQUVHO0lBQ0gsTUFBTSwwQkFBMEIsR0FBRyxDQUNqQyxNQUFzQixFQUN0QixNQUFrQixFQUNGLEVBQUU7UUFDbEIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBbUIsRUFBRSxJQUFJLEVBQUUsRUFBRTtZQUNqRCxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsSUFBSSxDQUFDO1lBRXpCLElBQ0UsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTO2dCQUN4QyxTQUFTLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFDdEM7Z0JBQ0EsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNoQjtZQUVELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQW9CLENBQUMsQ0FBQztJQUMzQixDQUFDLENBQUM7SUFFRixPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQztBQTlaVyxRQUFBLFFBQVEsWUE4Wm5CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtpc0RhdGV9IGZyb20gJ25vZGU6dXRpbC90eXBlcyc7XG5pbXBvcnQge0RhdGVUaW1lLCBEYXRlVGltZU1heWJlVmFsaWQsIEludGVydmFsfSBmcm9tICdsdXhvbic7XG5pbXBvcnQge3p9IGZyb20gJ3pvZCc7XG5cbmltcG9ydCB7cGFyYW1ldGVyaXplfSBmcm9tICcuLi9saWIvcGFyYW1ldGVyaXplJztcblxuaW1wb3J0IHtFUlJPUlN9IGZyb20gJy4uL3V0aWwvZXJyb3JzJztcblxuaW1wb3J0IHtTVFJJTkdTfSBmcm9tICcuLi9jb25maWcnO1xuXG5pbXBvcnQge0V4ZWN1dGVQbHVnaW4sIFBsdWdpblBhcmFtc30gZnJvbSAnLi4vdHlwZXMvaW50ZXJmYWNlJztcbmltcG9ydCB7XG4gIFBhZGRpbmdSZWNlaXB0LFxuICBUaW1lTm9ybWFsaXplckNvbmZpZyxcbiAgVGltZVBhcmFtcyxcbn0gZnJvbSAnLi4vdHlwZXMvdGltZS1zeW5jJztcbmltcG9ydCB7dmFsaWRhdGV9IGZyb20gJy4uL3V0aWwvdmFsaWRhdGlvbnMnO1xuXG5jb25zdCB7SW5wdXRWYWxpZGF0aW9uRXJyb3J9ID0gRVJST1JTO1xuXG5jb25zdCB7XG4gIElOVkFMSURfVElNRV9OT1JNQUxJWkFUSU9OLFxuICBJTlZBTElEX09CU0VSVkFUSU9OX09WRVJMQVAsXG4gIEFWT0lESU5HX1BBRERJTkdfQllfRURHRVMsXG59ID0gU1RSSU5HUztcblxuZXhwb3J0IGNvbnN0IFRpbWVTeW5jID0gKGdsb2JhbENvbmZpZzogVGltZU5vcm1hbGl6ZXJDb25maWcpOiBFeGVjdXRlUGx1Z2luID0+IHtcbiAgY29uc3QgbWV0YWRhdGEgPSB7XG4gICAga2luZDogJ2V4ZWN1dGUnLFxuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlIGlucHV0IGFycmF5IGFuZCByZXR1cm4gdGltZS1zeW5jaHJvbml6ZWQgaW5wdXQgYXJyYXkuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gKGlucHV0czogUGx1Z2luUGFyYW1zW10pOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgY29uc3QgdmFsaWRhdGVkQ29uZmlnID0gdmFsaWRhdGVHbG9iYWxDb25maWcoKTtcbiAgICBjb25zdCB0aW1lUGFyYW1zID0ge1xuICAgICAgc3RhcnRUaW1lOiBEYXRlVGltZS5mcm9tSVNPKHZhbGlkYXRlZENvbmZpZ1snc3RhcnQtdGltZSddKSxcbiAgICAgIGVuZFRpbWU6IERhdGVUaW1lLmZyb21JU08odmFsaWRhdGVkQ29uZmlnWydlbmQtdGltZSddKSxcbiAgICAgIGludGVydmFsOiB2YWxpZGF0ZWRDb25maWcuaW50ZXJ2YWwsXG4gICAgICBhbGxvd1BhZGRpbmc6IHZhbGlkYXRlZENvbmZpZ1snYWxsb3ctcGFkZGluZyddLFxuICAgIH07XG5cbiAgICBjb25zdCBwYWQgPSBjaGVja0ZvclBhZGRpbmcoaW5wdXRzLCB0aW1lUGFyYW1zKTtcbiAgICB2YWxpZGF0ZVBhZGRpbmcocGFkLCB0aW1lUGFyYW1zKTtcblxuICAgIGNvbnN0IHBhZGRlZElucHV0cyA9IHBhZElucHV0cyhpbnB1dHMsIHBhZCwgdGltZVBhcmFtcyk7XG5cbiAgICBjb25zdCBmbGF0dGVuSW5wdXRzID0gcGFkZGVkSW5wdXRzLnJlZHVjZShcbiAgICAgIChhY2M6IFBsdWdpblBhcmFtc1tdLCBpbnB1dCwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3Qgc2FmZUlucHV0ID0gT2JqZWN0LmFzc2lnbih7fSwgaW5wdXQsIHZhbGlkYXRlSW5wdXQoaW5wdXQsIGluZGV4KSk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRNb21lbnQgPSBwYXJzZURhdGUoc2FmZUlucHV0LnRpbWVzdGFtcCk7XG5cbiAgICAgICAgLyoqIENoZWNrcyBpZiBub3QgdGhlIGZpcnN0IGlucHV0LCB0aGVuIGNoZWNrIGNvbnNpc3RlbmN5IHdpdGggcHJldmlvdXMgb25lcy4gKi9cbiAgICAgICAgaWYgKGluZGV4ID4gMCkge1xuICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5wdXQgPSBwYWRkZWRJbnB1dHNbaW5kZXggLSAxXTtcbiAgICAgICAgICBjb25zdCBwcmV2aW91c0lucHV0VGltZXN0YW1wID0gcGFyc2VEYXRlKHByZXZpb3VzSW5wdXQudGltZXN0YW1wKTtcblxuICAgICAgICAgIC8qKiBDaGVja3MgZm9yIHRpbWVzdGFtcHMgb3ZlcmxhcC4gKi9cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBwYXJzZURhdGUocHJldmlvdXNJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICAgICAgICBzZWNvbmRzOiBwcmV2aW91c0lucHV0LmR1cmF0aW9uLFxuICAgICAgICAgICAgfSkgPiBjdXJyZW50TW9tZW50XG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgSW5wdXRWYWxpZGF0aW9uRXJyb3IoSU5WQUxJRF9PQlNFUlZBVElPTl9PVkVSTEFQKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjb21wYXJlYWJsZVRpbWUgPSBwcmV2aW91c0lucHV0VGltZXN0YW1wLnBsdXMoe1xuICAgICAgICAgICAgc2Vjb25kczogcHJldmlvdXNJbnB1dC5kdXJhdGlvbixcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGNvbnN0IHRpbWVsaW5lR2FwU2l6ZSA9IGN1cnJlbnRNb21lbnRcbiAgICAgICAgICAgIC5kaWZmKGNvbXBhcmVhYmxlVGltZSlcbiAgICAgICAgICAgIC5hcygnc2Vjb25kcycpO1xuXG4gICAgICAgICAgLyoqIENoZWNrcyBpZiB0aGVyZSBpcyBnYXAgaW4gdGltZWxpbmUuICovXG4gICAgICAgICAgaWYgKHRpbWVsaW5lR2FwU2l6ZSA+IDEpIHtcbiAgICAgICAgICAgIGFjYy5wdXNoKFxuICAgICAgICAgICAgICAuLi5nZXRaZXJvaXNoSW5wdXRQZXJTZWNvbmRCZXR3ZWVuUmFuZ2UoXG4gICAgICAgICAgICAgICAgY29tcGFyZWFibGVUaW1lLFxuICAgICAgICAgICAgICAgIGN1cnJlbnRNb21lbnQsXG4gICAgICAgICAgICAgICAgc2FmZUlucHV0XG4gICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qKiBCcmVhayBkb3duIGN1cnJlbnQgb2JzZXJ2YXRpb24uICovXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2FmZUlucHV0LmR1cmF0aW9uOyBpKyspIHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkSW5wdXQgPSBicmVha0Rvd25JbnB1dChzYWZlSW5wdXQsIGkpO1xuXG4gICAgICAgICAgYWNjLnB1c2gobm9ybWFsaXplZElucHV0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZShhY2MsIHRpbWVQYXJhbXMpO1xuICAgICAgfSxcbiAgICAgIFtdIGFzIFBsdWdpblBhcmFtc1tdXG4gICAgKTtcblxuICAgIGNvbnN0IHNvcnRlZElucHV0cyA9IGZsYXR0ZW5JbnB1dHMuc29ydCgoYSwgYikgPT5cbiAgICAgIHBhcnNlRGF0ZShhLnRpbWVzdGFtcCkuZGlmZihwYXJzZURhdGUoYi50aW1lc3RhbXApKS5hcygnc2Vjb25kcycpXG4gICAgKTtcblxuICAgIHJldHVybiByZXNhbXBsZUlucHV0cyhzb3J0ZWRJbnB1dHMsIHRpbWVQYXJhbXMpIGFzIFBsdWdpblBhcmFtc1tdO1xuICB9O1xuXG4gIGNvbnN0IHBhcnNlRGF0ZSA9IChkYXRlOiBEYXRlIHwgc3RyaW5nKSA9PiB7XG4gICAgaWYgKCFkYXRlKSByZXR1cm4gRGF0ZVRpbWUuaW52YWxpZCgnSW52YWxpZCBkYXRlJyk7XG4gICAgLy8gZGF0ZXMgYXJlIHBhc3NlZCB0byB0aW1lLXN5bmMudHMgYm90aCBpbiBJU08gODYwMSBmb3JtYXRcbiAgICAvLyBhbmQgYXMgYSBEYXRlIG9iamVjdCAoZnJvbSB0aGUgZGVzZXJpYWxpemF0aW9uIG9mIGEgWUFNTCBmaWxlKVxuICAgIC8vIGlmIHRoZSBZQU1MIHBhcnNlciBmYWlscyB0byBpZGVudGlmeSBhcyBhIGRhdGUsIGl0IHBhc3NlcyBhcyBhIHN0cmluZ1xuICAgIGlmIChpc0RhdGUoZGF0ZSkpIHtcbiAgICAgIHJldHVybiBEYXRlVGltZS5mcm9tSlNEYXRlKGRhdGUpO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIGRhdGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gRGF0ZVRpbWUuZnJvbUlTTyhkYXRlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKFxuICAgICAgYFVuZXhwZWN0ZWQgZGF0ZSBkYXRhdHlwZTogJHt0eXBlb2YgZGF0ZX06ICR7ZGF0ZX1gXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIGlucHV0IHBhcmFtZXRlcnMuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZUlucHV0ID0gKGlucHV0OiBQbHVnaW5QYXJhbXMsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICBjb25zdCBzY2hlbWEgPSB6Lm9iamVjdCh7XG4gICAgICB0aW1lc3RhbXA6IHpcbiAgICAgICAgLnN0cmluZyh7XG4gICAgICAgICAgcmVxdWlyZWRfZXJyb3I6IGByZXF1aXJlZCBpbiBpbnB1dFske2luZGV4fV1gLFxuICAgICAgICB9KVxuICAgICAgICAuZGF0ZXRpbWUoe1xuICAgICAgICAgIG1lc3NhZ2U6IGBpbnZhbGlkIGRhdGV0aW1lIGluIGlucHV0WyR7aW5kZXh9XWAsXG4gICAgICAgIH0pXG4gICAgICAgIC5vcih6LmRhdGUoKSksXG4gICAgICBkdXJhdGlvbjogei5udW1iZXIoKSxcbiAgICB9KTtcblxuICAgIHJldHVybiB2YWxpZGF0ZTx6LmluZmVyPHR5cGVvZiBzY2hlbWE+PihzY2hlbWEsIGlucHV0KTtcbiAgfTtcblxuICAvKipcbiAgICogVmFsaWRhdGVzIGdsb2JhbCBjb25maWcgcGFyYW1ldGVycy5cbiAgICovXG4gIGNvbnN0IHZhbGlkYXRlR2xvYmFsQ29uZmlnID0gKCkgPT4ge1xuICAgIGlmIChnbG9iYWxDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IElucHV0VmFsaWRhdGlvbkVycm9yKElOVkFMSURfVElNRV9OT1JNQUxJWkFUSU9OKTtcbiAgICB9XG5cbiAgICBjb25zdCBzY2hlbWEgPSB6XG4gICAgICAub2JqZWN0KHtcbiAgICAgICAgJ3N0YXJ0LXRpbWUnOiB6LnN0cmluZygpLmRhdGV0aW1lKCksXG4gICAgICAgICdlbmQtdGltZSc6IHouc3RyaW5nKCkuZGF0ZXRpbWUoKSxcbiAgICAgICAgaW50ZXJ2YWw6IHoubnVtYmVyKCksXG4gICAgICAgICdhbGxvdy1wYWRkaW5nJzogei5ib29sZWFuKCksXG4gICAgICB9KVxuICAgICAgLnJlZmluZShkYXRhID0+IGRhdGFbJ3N0YXJ0LXRpbWUnXSA8IGRhdGFbJ2VuZC10aW1lJ10sIHtcbiAgICAgICAgbWVzc2FnZTogJ2BzdGFydC10aW1lYCBzaG91bGQgYmUgbG93ZXIgdGhhbiBgZW5kLXRpbWVgJyxcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHZhbGlkYXRlPHouaW5mZXI8dHlwZW9mIHNjaGVtYT4+KHNjaGVtYSwgZ2xvYmFsQ29uZmlnKTtcbiAgfTtcblxuICAvKipcbiAgICogQ2FsY3VsYXRlcyBtaW5pbWFsIGZhY3Rvci5cbiAgICovXG4gIGNvbnN0IGNvbnZlcnRQZXJJbnRlcnZhbCA9ICh2YWx1ZTogbnVtYmVyLCBkdXJhdGlvbjogbnVtYmVyKSA9PlxuICAgIHZhbHVlIC8gZHVyYXRpb247XG5cbiAgLyoqXG4gICAqIE5vcm1hbGl6ZSB0aW1lIHBlciBnaXZlbiBzZWNvbmQuXG4gICAqL1xuICBjb25zdCBub3JtYWxpemVUaW1lUGVyU2Vjb25kID0gKFxuICAgIGN1cnJlbnRSb3VuZE1vbWVudDogRGF0ZSB8IHN0cmluZyxcbiAgICBpOiBudW1iZXJcbiAgKSA9PiB7XG4gICAgY29uc3QgdGhpc01vbWVudCA9IHBhcnNlRGF0ZShjdXJyZW50Um91bmRNb21lbnQpLnN0YXJ0T2YoJ3NlY29uZCcpO1xuICAgIHJldHVybiB0aGlzTW9tZW50LnBsdXMoe3NlY29uZHM6IGl9KTtcbiAgfTtcbiAgLyoqXG4gICAqIEJyZWFrcyBkb3duIGlucHV0IHBlciBtaW5pbWFsIHRpbWUgdW5pdC5cbiAgICovXG4gIGNvbnN0IGJyZWFrRG93bklucHV0ID0gKGlucHV0OiBQbHVnaW5QYXJhbXMsIGk6IG51bWJlcikgPT4ge1xuICAgIGNvbnN0IGlucHV0S2V5cyA9IE9iamVjdC5rZXlzKGlucHV0KTtcblxuICAgIHJldHVybiBpbnB1dEtleXMucmVkdWNlKChhY2MsIGtleSkgPT4ge1xuICAgICAgY29uc3QgbWV0aG9kID0gcGFyYW1ldGVyaXplLmdldEFnZ3JlZ2F0aW9uTWV0aG9kKGtleSk7XG5cbiAgICAgIGlmIChrZXkgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgIGNvbnN0IHBlclNlY29uZCA9IG5vcm1hbGl6ZVRpbWVQZXJTZWNvbmQoaW5wdXQudGltZXN0YW1wLCBpKTtcbiAgICAgICAgYWNjW2tleV0gPSBwZXJTZWNvbmQudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIC8qKiBAdG9kbyB1c2UgdXNlciBkZWZpbmVkIHJlc29sdXRpb24gbGF0ZXIgKi9cbiAgICAgIGlmIChrZXkgPT09ICdkdXJhdGlvbicpIHtcbiAgICAgICAgYWNjW2tleV0gPSAxO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGFjY1trZXldID1cbiAgICAgICAgbWV0aG9kID09PSAnc3VtJ1xuICAgICAgICAgID8gY29udmVydFBlckludGVydmFsKGlucHV0W2tleV0sIGlucHV0WydkdXJhdGlvbiddKVxuICAgICAgICAgIDogaW5wdXRba2V5XTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQb3B1bGF0ZXMgb2JqZWN0IHRvIGZpbGwgdGhlIGdhcHMgaW4gb2JzZXJ2YXRpb25hbCB0aW1lbGluZSB1c2luZyB6ZXJvaXNoIHZhbHVlcy5cbiAgICovXG4gIGNvbnN0IGZpbGxXaXRoWmVyb2lzaElucHV0ID0gKFxuICAgIGlucHV0OiBQbHVnaW5QYXJhbXMsXG4gICAgbWlzc2luZ1RpbWVzdGFtcDogRGF0ZVRpbWVNYXliZVZhbGlkXG4gICkgPT4ge1xuICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG5cbiAgICByZXR1cm4gbWV0cmljcy5yZWR1Y2UoKGFjYywgbWV0cmljKSA9PiB7XG4gICAgICBpZiAobWV0cmljID09PSAndGltZXN0YW1wJykge1xuICAgICAgICBhY2NbbWV0cmljXSA9IG1pc3NpbmdUaW1lc3RhbXAuc3RhcnRPZignc2Vjb25kJykudG9VVEMoKS50b0lTTygpID8/ICcnO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIC8qKiBAdG9kbyBsYXRlciB3aWxsIGJlIGNoYW5nZWQgdG8gdXNlciBkZWZpbmVkIGludGVydmFsICovXG4gICAgICBpZiAobWV0cmljID09PSAnZHVyYXRpb24nKSB7XG4gICAgICAgIGFjY1ttZXRyaWNdID0gMTtcblxuICAgICAgICByZXR1cm4gYWNjO1xuICAgICAgfVxuXG4gICAgICBpZiAobWV0cmljID09PSAndGltZS1yZXNlcnZlZCcpIHtcbiAgICAgICAgYWNjW21ldHJpY10gPSBhY2NbJ2R1cmF0aW9uJ107XG5cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgIH1cblxuICAgICAgY29uc3QgbWV0aG9kID0gcGFyYW1ldGVyaXplLmdldEFnZ3JlZ2F0aW9uTWV0aG9kKG1ldHJpYyk7XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdhdmcnIHx8IG1ldGhvZCA9PT0gJ3N1bScpIHtcbiAgICAgICAgYWNjW21ldHJpY10gPSAwO1xuXG4gICAgICAgIHJldHVybiBhY2M7XG4gICAgICB9XG5cbiAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYGVycm9yIG9uIHBhZGRpbmdgIGlzIGVuYWJsZWQgYW5kIHBhZGRpbmcgaXMgbmVlZGVkLiBJZiBzbywgdGhlbiB0aHJvd3MgZXJyb3IuXG4gICAqL1xuICBjb25zdCB2YWxpZGF0ZVBhZGRpbmcgPSAocGFkOiBQYWRkaW5nUmVjZWlwdCwgcGFyYW1zOiBUaW1lUGFyYW1zKTogdm9pZCA9PiB7XG4gICAgY29uc3Qge3N0YXJ0LCBlbmR9ID0gcGFkO1xuICAgIGNvbnN0IGlzUGFkZGluZ05lZWRlZCA9IHN0YXJ0IHx8IGVuZDtcbiAgICBpZiAoIXBhcmFtcy5hbGxvd1BhZGRpbmcgJiYgaXNQYWRkaW5nTmVlZGVkKSB7XG4gICAgICB0aHJvdyBuZXcgSW5wdXRWYWxpZGF0aW9uRXJyb3IoQVZPSURJTkdfUEFERElOR19CWV9FREdFUyhzdGFydCwgZW5kKSk7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgcGFkZGluZyBpcyBuZWVkZWQgZWl0aGVyIGF0IHN0YXJ0IG9mIHRoZSB0aW1lbGluZSBvciB0aGUgZW5kIGFuZCByZXR1cm5zIHN0YXR1cy5cbiAgICovXG4gIGNvbnN0IGNoZWNrRm9yUGFkZGluZyA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhcmFtczogVGltZVBhcmFtc1xuICApOiBQYWRkaW5nUmVjZWlwdCA9PiB7XG4gICAgY29uc3Qgc3RhcnREaWZmSW5TZWNvbmRzID0gcGFyc2VEYXRlKGlucHV0c1swXS50aW1lc3RhbXApXG4gICAgICAuZGlmZihwYXJhbXMuc3RhcnRUaW1lKVxuICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuXG4gICAgY29uc3QgZW5kRGlmZkluU2Vjb25kcyA9IHBhcnNlRGF0ZShsYXN0SW5wdXQudGltZXN0YW1wKVxuICAgICAgLnBsdXMoe3NlY29uZDogbGFzdElucHV0LmR1cmF0aW9ufSlcbiAgICAgIC5kaWZmKHBhcmFtcy5lbmRUaW1lKVxuICAgICAgLmFzKCdzZWNvbmRzJyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHN0YXJ0RGlmZkluU2Vjb25kcyA+IDAsXG4gICAgICBlbmQ6IGVuZERpZmZJblNlY29uZHMgPCAwLFxuICAgIH07XG4gIH07XG5cbiAgLyoqXG4gICAqIEl0ZXJhdGVzIG92ZXIgZ2l2ZW4gaW5wdXRzIGZyYW1lLCBtZWFud2hpbGUgY2hlY2tpbmcgaWYgYWdncmVnYXRpb24gbWV0aG9kIGlzIGBzdW1gLCB0aGVuIGNhbGN1bGF0ZXMgaXQuXG4gICAqIEZvciBtZXRob2RzIGlzIGBhdmdgIGFuZCBgbm9uZWAgY2FsY3VsYXRpbmcgYXZlcmFnZSBvZiB0aGUgZnJhbWUuXG4gICAqL1xuICBjb25zdCByZXNhbXBsZUlucHV0RnJhbWUgPSAoaW5wdXRzSW5UaW1lc2xvdDogUGx1Z2luUGFyYW1zW10pID0+IHtcbiAgICByZXR1cm4gaW5wdXRzSW5UaW1lc2xvdC5yZWR1Y2UoKGFjYywgaW5wdXQsIGluZGV4LCBpbnB1dHMpID0+IHtcbiAgICAgIGNvbnN0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhpbnB1dCk7XG5cbiAgICAgIG1ldHJpY3MuZm9yRWFjaChtZXRyaWMgPT4ge1xuICAgICAgICBjb25zdCBtZXRob2QgPSBwYXJhbWV0ZXJpemUuZ2V0QWdncmVnYXRpb25NZXRob2QobWV0cmljKTtcbiAgICAgICAgYWNjW21ldHJpY10gPSBhY2NbbWV0cmljXSA/PyAwO1xuXG4gICAgICAgIGlmIChtZXRyaWMgPT09ICd0aW1lc3RhbXAnKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gPSBpbnB1dHNbMF1bbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdzdW0nKSB7XG4gICAgICAgICAgYWNjW21ldHJpY10gKz0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChtZXRob2QgPT09ICdub25lJykge1xuICAgICAgICAgIGFjY1ttZXRyaWNdID0gaW5wdXRbbWV0cmljXTtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBJZiB0aW1lc2xvdCBjb250YWlucyByZWNvcmRzIG1vcmUgdGhhbiBvbmUsIHRoZW4gZGl2aWRlIGVhY2ggbWV0cmljIGJ5IHRoZSB0aW1lc2xvdCBsZW5ndGgsXG4gICAgICAgICAqICBzbyB0aGF0IHRoZWlyIHN1bSB5aWVsZHMgdGhlIHRpbWVzbG90IGF2ZXJhZ2UuXG4gICAgICAgICAqL1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaW5wdXRzSW5UaW1lc2xvdC5sZW5ndGggPiAxICYmXG4gICAgICAgICAgaW5kZXggPT09IGlucHV0c0luVGltZXNsb3QubGVuZ3RoIC0gMVxuICAgICAgICApIHtcbiAgICAgICAgICBhY2NbbWV0cmljXSAvPSBpbnB1dHNJblRpbWVzbG90Lmxlbmd0aDtcblxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGFjY1ttZXRyaWNdICs9IGlucHV0W21ldHJpY107XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBQbHVnaW5QYXJhbXMpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBUYWtlcyBlYWNoIGFycmF5IGZyYW1lIHdpdGggaW50ZXJ2YWwgbGVuZ3RoLCB0aGVuIGFnZ3JlZ2F0aW5nIHRoZW0gdG9nZXRoZXIgYXMgZnJvbSB1bml0cy55YW1sIGZpbGUuXG4gICAqL1xuICBjb25zdCByZXNhbXBsZUlucHV0cyA9IChpbnB1dHM6IFBsdWdpblBhcmFtc1tdLCBwYXJhbXM6IFRpbWVQYXJhbXMpID0+IHtcbiAgICByZXR1cm4gaW5wdXRzLnJlZHVjZSgoYWNjOiBQbHVnaW5QYXJhbXNbXSwgX2lucHV0LCBpbmRleCwgaW5wdXRzKSA9PiB7XG4gICAgICBjb25zdCBmcmFtZVN0YXJ0ID0gaW5kZXggKiBwYXJhbXMuaW50ZXJ2YWw7XG4gICAgICBjb25zdCBmcmFtZUVuZCA9IChpbmRleCArIDEpICogcGFyYW1zLmludGVydmFsO1xuICAgICAgY29uc3QgaW5wdXRzRnJhbWUgPSBpbnB1dHMuc2xpY2UoZnJhbWVTdGFydCwgZnJhbWVFbmQpO1xuXG4gICAgICBjb25zdCByZXNhbXBsZWRJbnB1dCA9IHJlc2FtcGxlSW5wdXRGcmFtZShpbnB1dHNGcmFtZSk7XG5cbiAgICAgIC8qKiBDaGVja3MgaWYgcmVzYW1wbGVkIGlucHV0IGlzIG5vdCBlbXB0eSwgdGhlbiBpbmNsdWRlcyBpbiByZXN1bHQuICovXG4gICAgICBpZiAoT2JqZWN0LmtleXMocmVzYW1wbGVkSW5wdXQpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYWNjLnB1c2gocmVzYW1wbGVkSW5wdXQpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIFtdIGFzIFBsdWdpblBhcmFtc1tdKTtcbiAgfTtcblxuICAvKipcbiAgICogUGFkcyB6ZXJvaXNoIGlucHV0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb3IgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXRzIGlmIG5lZWRlZC5cbiAgICovXG4gIGNvbnN0IHBhZElucHV0cyA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhZDogUGFkZGluZ1JlY2VpcHQsXG4gICAgcGFyYW1zOiBUaW1lUGFyYW1zXG4gICk6IFBsdWdpblBhcmFtc1tdID0+IHtcbiAgICBjb25zdCB7c3RhcnQsIGVuZH0gPSBwYWQ7XG4gICAgY29uc3QgcGFkZGVkRnJvbUJlZ2lubmluZyA9IFtdO1xuXG4gICAgaWYgKHN0YXJ0KSB7XG4gICAgICBwYWRkZWRGcm9tQmVnaW5uaW5nLnB1c2goXG4gICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICBwYXJhbXMuc3RhcnRUaW1lLFxuICAgICAgICAgIHBhcnNlRGF0ZShpbnB1dHNbMF0udGltZXN0YW1wKSxcbiAgICAgICAgICBpbnB1dHNbMF1cbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYWRkZWRBcnJheSA9IHBhZGRlZEZyb21CZWdpbm5pbmcuY29uY2F0KGlucHV0cyk7XG5cbiAgICBpZiAoZW5kKSB7XG4gICAgICBjb25zdCBsYXN0SW5wdXQgPSBpbnB1dHNbaW5wdXRzLmxlbmd0aCAtIDFdO1xuICAgICAgY29uc3QgbGFzdElucHV0RW5kID0gcGFyc2VEYXRlKGxhc3RJbnB1dC50aW1lc3RhbXApLnBsdXMoe1xuICAgICAgICBzZWNvbmRzOiBsYXN0SW5wdXQuZHVyYXRpb24sXG4gICAgICB9KTtcbiAgICAgIHBhZGRlZEFycmF5LnB1c2goXG4gICAgICAgIC4uLmdldFplcm9pc2hJbnB1dFBlclNlY29uZEJldHdlZW5SYW5nZShcbiAgICAgICAgICBsYXN0SW5wdXRFbmQsXG4gICAgICAgICAgcGFyYW1zLmVuZFRpbWUucGx1cyh7c2Vjb25kczogMX0pLFxuICAgICAgICAgIGxhc3RJbnB1dFxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcGFkZGVkQXJyYXk7XG4gIH07XG5cbiAgY29uc3QgZ2V0WmVyb2lzaElucHV0UGVyU2Vjb25kQmV0d2VlblJhbmdlID0gKFxuICAgIHN0YXJ0RGF0ZTogRGF0ZVRpbWVNYXliZVZhbGlkLFxuICAgIGVuZERhdGU6IERhdGVUaW1lTWF5YmVWYWxpZCxcbiAgICB0ZW1wbGF0ZUlucHV0OiBQbHVnaW5QYXJhbXNcbiAgKSA9PiB7XG4gICAgY29uc3QgYXJyYXk6IFBsdWdpblBhcmFtc1tdID0gW107XG4gICAgY29uc3QgZGF0ZVJhbmdlID0gSW50ZXJ2YWwuZnJvbURhdGVUaW1lcyhzdGFydERhdGUsIGVuZERhdGUpO1xuICAgIGZvciAoY29uc3QgaW50ZXJ2YWwgb2YgZGF0ZVJhbmdlLnNwbGl0Qnkoe3NlY29uZDogMX0pKSB7XG4gICAgICBhcnJheS5wdXNoKFxuICAgICAgICBmaWxsV2l0aFplcm9pc2hJbnB1dChcbiAgICAgICAgICB0ZW1wbGF0ZUlucHV0LFxuICAgICAgICAgIC8vIGFzIGZhciBhcyBJIGNhbiB0ZWxsLCBzdGFydCB3aWxsIG5ldmVyIGJlIG51bGxcbiAgICAgICAgICAvLyBiZWNhdXNlIGlmIHdlIHBhc3MgYW4gaW52YWxpZCBzdGFydC9lbmREYXRlIHRvXG4gICAgICAgICAgLy8gSW50ZXJ2YWwsIHdlIGdldCBhIHplcm8gbGVuZ3RoIGFycmF5IGFzIHRoZSByYW5nZVxuICAgICAgICAgIGludGVydmFsLnN0YXJ0IHx8IERhdGVUaW1lLmludmFsaWQoJ25vdCBleHBlY3RlZCAtIHN0YXJ0IGlzIG51bGwnKVxuICAgICAgICApXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gYXJyYXk7XG4gIH07XG5cbiAgLypcbiAgICogQ2hlY2tzIGlmIGlucHV0J3MgdGltZXN0YW1wIGlzIGluY2x1ZGVkIGluIGdsb2JhbCBzcGVjaWZpZWQgcGVyaW9kIHRoZW4gbGVhdmVzIGl0LCBvdGhlcndpc2UuXG4gICAqL1xuICBjb25zdCB0cmltSW5wdXRzQnlHbG9iYWxUaW1lbGluZSA9IChcbiAgICBpbnB1dHM6IFBsdWdpblBhcmFtc1tdLFxuICAgIHBhcmFtczogVGltZVBhcmFtc1xuICApOiBQbHVnaW5QYXJhbXNbXSA9PiB7XG4gICAgcmV0dXJuIGlucHV0cy5yZWR1Y2UoKGFjYzogUGx1Z2luUGFyYW1zW10sIGl0ZW0pID0+IHtcbiAgICAgIGNvbnN0IHt0aW1lc3RhbXB9ID0gaXRlbTtcblxuICAgICAgaWYgKFxuICAgICAgICBwYXJzZURhdGUodGltZXN0YW1wKSA+PSBwYXJhbXMuc3RhcnRUaW1lICYmXG4gICAgICAgIHBhcnNlRGF0ZSh0aW1lc3RhbXApIDw9IHBhcmFtcy5lbmRUaW1lXG4gICAgICApIHtcbiAgICAgICAgYWNjLnB1c2goaXRlbSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwgW10gYXMgUGx1Z2luUGFyYW1zW10pO1xuICB9O1xuXG4gIHJldHVybiB7bWV0YWRhdGEsIGV4ZWN1dGV9O1xufTtcbiJdfQ==
|
package/build/config/config.js
CHANGED
|
@@ -52,7 +52,7 @@ exports.CONFIG = {
|
|
|
52
52
|
`,
|
|
53
53
|
},
|
|
54
54
|
GITHUB_PATH: 'https://github.com',
|
|
55
|
-
NATIVE_PLUGIN: 'if-
|
|
55
|
+
NATIVE_PLUGIN: 'if-plugins',
|
|
56
56
|
AGGREGATION_ADDITIONAL_PARAMS: ['timestamp', 'duration'],
|
|
57
57
|
};
|
|
58
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBSWEsUUFBQSxNQUFNLEdBQUc7SUFDcEIsTUFBTSxFQUFFO1FBQ04sSUFBSSxFQUFFO1lBQ0osUUFBUSxFQUFFO2dCQUNSLElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2dCQUNkLEtBQUssRUFBRSxHQUFHO2dCQUNWLFdBQVcsRUFBRSxpQ0FBaUM7YUFDL0M7WUFDRCxNQUFNLEVBQUU7Z0JBQ04sSUFBSSxFQUFFLE1BQU07Z0JBQ1osUUFBUSxFQUFFLElBQUk7Z0JBQ2QsV0FBVyxFQUNULDhGQUE4RjthQUNqRztZQUNELGlCQUFpQixFQUFFO2dCQUNqQixJQUFJLEVBQUUsTUFBTTtnQkFDWixRQUFRLEVBQUUsSUFBSTtnQkFDZCxXQUFXLEVBQUUsdURBQXVEO2FBQ3JFO1lBQ0QsTUFBTSxFQUFFO2dCQUNOLElBQUksRUFBRSxNQUFNO2dCQUNaLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFDVCw2SUFBNkk7Z0JBQy9JLFlBQVksRUFBRSxNQUFNO2FBQ3JCO1lBQ0QsT0FBTyxFQUFFO2dCQUNQLElBQUksRUFBRSxPQUFPO2dCQUNiLFFBQVEsRUFBRSxJQUFJO2dCQUNkLFdBQVcsRUFDVCwwRkFBMEY7YUFDN0Y7WUFDRCxJQUFJLEVBQUU7Z0JBQ0osSUFBSSxFQUFFLE9BQU87Z0JBQ2IsUUFBUSxFQUFFLElBQUk7Z0JBQ2QsS0FBSyxFQUFFLEdBQUc7Z0JBQ1YsV0FBVyxFQUFFLDBCQUEwQjthQUN4QztTQUNxQztRQUN4QyxJQUFJLEVBQUU7Ozs7Ozs7Ozs7O0dBV1A7S0FDQTtJQUNELFdBQVcsRUFBRSxvQkFBb0I7SUFDakMsYUFBYSxFQUFFLFlBQVk7SUFDM0IsNkJBQTZCLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVSxDQUFDO0NBQ3pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0FyZ3VtZW50Q29uZmlnfSBmcm9tICd0cy1jb21tYW5kLWxpbmUtYXJncyc7XG5cbmltcG9ydCB7TWFuaWZlc3RQcm9jZXNzQXJnc30gZnJvbSAnLi4vdHlwZXMvcHJvY2Vzcy1hcmdzJztcblxuZXhwb3J0IGNvbnN0IENPTkZJRyA9IHtcbiAgaW1wYWN0OiB7XG4gICAgQVJHUzoge1xuICAgICAgbWFuaWZlc3Q6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgYWxpYXM6ICdpJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQYXRoIHRvIGFuIGlucHV0IG1hbmlmZXN0IGZpbGUuJyxcbiAgICAgIH0sXG4gICAgICBvdXRwdXQ6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1BhdGggdG8gdGhlIG91dHB1dCBmaWxlIHdoZXJlIHRoZSByZXN1bHRzIGFzIHNhdmVkLCBpZiBub25lIGlzIHByb3ZpZGVkIGl0IHByaW50cyB0byBzdGRvdXQuJyxcbiAgICAgIH0sXG4gICAgICAnb3ZlcnJpZGUtcGFyYW1zJzoge1xuICAgICAgICB0eXBlOiBTdHJpbmcsXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1BhdGggdG8gYSBwYXJhbWV0ZXIgZmlsZSB0aGF0IG92ZXJyaWRlcyBvdXIgZGVmYXVsdHMuJyxcbiAgICAgIH0sXG4gICAgICBmb3JtYXQ6IHtcbiAgICAgICAgdHlwZTogU3RyaW5nLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICAgJ1RoZSBvdXRwdXQgZmlsZSBmb3JtYXQuIGRlZmF1bHQgdG8geWFtbCBidXQgaWYgY3N2IGlzIHNwZWNpZmllZCB0aGVuIGl0IGZvcm1hdHMgdGhlIG91dHB1dHMgYXMgYSBjc3YgZmlsZSBmb3IgbG9hZGluZyBpbnRvIGFub3RoZXIgcHJvZ3JhbS4nLFxuICAgICAgICBkZWZhdWx0VmFsdWU6ICd5YW1sJyxcbiAgICAgIH0sXG4gICAgICB2ZXJib3NlOiB7XG4gICAgICAgIHR5cGU6IEJvb2xlYW4sXG4gICAgICAgIG9wdGlvbmFsOiB0cnVlLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnSG93IG11Y2ggaW5mb3JtYXRpb24gdG8gb3V0cHV0IGFib3V0IHRoZSBjYWxjdWxhdGlvbiB0byBhaWQgaW52ZXN0aWdhdGlvbiBhbmQgZGVidWdnaW5nLicsXG4gICAgICB9LFxuICAgICAgaGVscDoge1xuICAgICAgICB0eXBlOiBCb29sZWFuLFxuICAgICAgICBvcHRpb25hbDogdHJ1ZSxcbiAgICAgICAgYWxpYXM6ICdoJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdQcmludHMgdGhpcyB1c2FnZSBndWlkZS4nLFxuICAgICAgfSxcbiAgICB9IGFzIEFyZ3VtZW50Q29uZmlnPE1hbmlmZXN0UHJvY2Vzc0FyZ3M+LFxuICAgIEhFTFA6IGBpbXBhY3QgXG4gIC1tYW5pZmVzdCBbcGF0aCB0byB0aGUgaW5wdXQgZmlsZV1cbiAgLW91dHB1dCBbcGF0aCB0byB0aGUgb3V0cHV0IGZpbGVdXG4gIC1mb3JtYXQgW3lhbWx8Y3N2XSBcbiAgLXZlcmJvc2VcbiAgLWhlbHAgXG4gIG1hbmlmZXN0OiBwYXRoIHRvIGFuIGlucHV0IG1hbmlmZXN0XG4gIG91dHB1dDogcGF0aCB0byB0aGUgb3V0cHV0IGZpbGUgd2hlcmUgdGhlIHJlc3VsdHMgYXMgc2F2ZWQsIGlmIG5vbmUgaXMgcHJvdmlkZWQgaXQgcHJpbnRzIHRvIHN0ZG91dC5cbiAgZm9ybWF0OiB0aGUgb3V0cHV0IGZpbGUgZm9ybWF0LiBkZWZhdWx0IHRvIHlhbWwgYnV0IGlmIGNzdiBpcyBzcGVjaWZpZWQgdGhlbiBpdCBmb3JtYXRzIHRoZSBvdXRwdXRzIGFzIGEgY3N2IGZpbGUgZm9yIGxvYWRpbmcgaW50byBhbm90aGVyIHByb2dyYW0uXG4gIHZlcmJvc2U6IGhvdyBtdWNoIGluZm9ybWF0aW9uIHRvIG91dHB1dCBhYm91dCB0aGUgY2FsY3VsYXRpb24gdG8gYWlkIGludmVzdGlnYXRpb24gYW5kIGRlYnVnZ2luZy5cbiAgaGVscDogcHJpbnRzIG91dCB0aGUgYWJvdmUgaGVscCBpbnN0cnVjdGlvbi5cbiAgYCxcbiAgfSxcbiAgR0lUSFVCX1BBVEg6ICdodHRwczovL2dpdGh1Yi5jb20nLFxuICBOQVRJVkVfUExVR0lOOiAnaWYtcGx1Z2lucycsXG4gIEFHR1JFR0FUSU9OX0FERElUSU9OQUxfUEFSQU1TOiBbJ3RpbWVzdGFtcCcsICdkdXJhdGlvbiddLFxufTtcbiJdfQ==
|
package/build/config/params.js
CHANGED
|
@@ -97,11 +97,21 @@ exports.PARAMETERS = {
|
|
|
97
97
|
unit: 'None',
|
|
98
98
|
aggregation: 'none',
|
|
99
99
|
},
|
|
100
|
+
'cloud/region': {
|
|
101
|
+
description: 'region cloud instance runs in',
|
|
102
|
+
unit: 'None',
|
|
103
|
+
aggregation: 'none',
|
|
104
|
+
},
|
|
100
105
|
'cloud/vendor': {
|
|
101
106
|
description: 'Name of the cloud service provider in the ccf model. Can be aws, gcp or azure',
|
|
102
107
|
unit: 'None',
|
|
103
108
|
aggregation: 'none',
|
|
104
109
|
},
|
|
110
|
+
name: {
|
|
111
|
+
description: 'arbitrary name parameter.',
|
|
112
|
+
unit: 'None',
|
|
113
|
+
aggregation: 'none',
|
|
114
|
+
},
|
|
105
115
|
'ram-alloc': {
|
|
106
116
|
description: 'refers to GB of memory allocated.',
|
|
107
117
|
unit: 'GB',
|
|
@@ -142,5 +152,50 @@ exports.PARAMETERS = {
|
|
|
142
152
|
unit: 'count',
|
|
143
153
|
aggregation: 'none',
|
|
144
154
|
},
|
|
155
|
+
'vcpus-allocated': {
|
|
156
|
+
description: 'number of vcpus allocated to particular resource',
|
|
157
|
+
unit: 'count',
|
|
158
|
+
aggregation: 'none',
|
|
159
|
+
},
|
|
160
|
+
'vcpus-total': {
|
|
161
|
+
description: 'total number of vcpus available on a particular resource',
|
|
162
|
+
unit: 'count',
|
|
163
|
+
aggregation: 'none',
|
|
164
|
+
},
|
|
165
|
+
'memory-available': {
|
|
166
|
+
description: 'total amount of memory available on a particular resource',
|
|
167
|
+
unit: 'GB',
|
|
168
|
+
aggregation: 'none',
|
|
169
|
+
},
|
|
170
|
+
'physical-processor': {
|
|
171
|
+
description: 'name of the physical processor being used in a specific instance type',
|
|
172
|
+
unit: 'None',
|
|
173
|
+
aggregation: 'none',
|
|
174
|
+
},
|
|
175
|
+
'cloud/region-cfe': {
|
|
176
|
+
description: 'cloud region name in cfe format',
|
|
177
|
+
unit: 'None',
|
|
178
|
+
aggregation: 'none',
|
|
179
|
+
},
|
|
180
|
+
'cloud/region-em-zone-id': {
|
|
181
|
+
description: 'cloud region name in electricity maps format',
|
|
182
|
+
unit: 'None',
|
|
183
|
+
aggregation: 'none',
|
|
184
|
+
},
|
|
185
|
+
'cloud/region-wt-id': {
|
|
186
|
+
description: 'cloud region name in watt-time format',
|
|
187
|
+
unit: 'None',
|
|
188
|
+
aggregation: 'none',
|
|
189
|
+
},
|
|
190
|
+
'cloud/region-location': {
|
|
191
|
+
description: 'cloud region name in our IF format',
|
|
192
|
+
unit: 'None',
|
|
193
|
+
aggregation: 'none',
|
|
194
|
+
},
|
|
195
|
+
'cloud/region-geolocation': {
|
|
196
|
+
description: 'location expressed as decimal coordinates (lat/lon)',
|
|
197
|
+
unit: 'decimal degrees',
|
|
198
|
+
aggregation: 'none',
|
|
199
|
+
},
|
|
145
200
|
};
|
|
146
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxVQUFVLEdBQWU7SUFDcEMsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLElBQUk7UUFDVixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxxQ0FBcUM7UUFDbEQsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxxREFBcUQ7UUFDbEUsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGVBQWUsRUFBRTtRQUNmLFdBQVcsRUFBRSxnREFBZ0Q7UUFDN0QsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFBRSxxQ0FBcUM7UUFDbEQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGdCQUFnQixFQUFFO1FBQ2hCLFdBQVcsRUFBRSxpREFBaUQ7UUFDOUQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFDVCx3R0FBd0c7UUFDMUcsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELHNCQUFzQixFQUFFO1FBQ3RCLFdBQVcsRUFDVCx5R0FBeUc7UUFDM0csSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELFVBQVUsRUFBRTtRQUNWLFdBQVcsRUFBRSw0QkFBNEI7UUFDekMsSUFBSSxFQUFFLFlBQVk7UUFDbEIsV0FBVyxFQUFFLEtBQUs7S0FDbkI7SUFDRCx1QkFBdUIsRUFBRTtRQUN2QixXQUFXLEVBQUUsK0JBQStCO1FBQzVDLElBQUksRUFBRSxZQUFZO1FBQ2xCLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QscUJBQXFCLEVBQUU7UUFDckIsV0FBVyxFQUFFLDZEQUE2RDtRQUMxRSxJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUNULCtJQUErSTtRQUNqSixJQUFJLEVBQUUsNENBQTRDO1FBQ2xELFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0Qsb0JBQW9CLEVBQUU7UUFDcEIsV0FBVyxFQUFFLHdDQUF3QztRQUNyRCxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLGdDQUFnQztRQUM3QyxJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsY0FBYyxFQUFFO1FBQ2QsV0FBVyxFQUNULCtFQUErRTtRQUNqRixJQUFJLEVBQUUsTUFBTTtRQUNaLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsV0FBVyxFQUFFO1FBQ1gsV0FBVyxFQUFFLG1DQUFtQztRQUNoRCxJQUFJLEVBQUUsSUFBSTtRQUNWLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0QsVUFBVSxFQUFFO1FBQ1YsV0FBVyxFQUFFLDBDQUEwQztRQUN2RCxJQUFJLEVBQUUsWUFBWTtRQUNsQixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLFdBQVcsRUFBRSx1Q0FBdUM7UUFDcEQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxzQ0FBc0M7UUFDbkQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELDJCQUEyQixFQUFFO1FBQzNCLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSwrQ0FBK0M7UUFDNUQsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELGVBQWUsRUFBRTtRQUNmLFdBQVcsRUFBRSwrQkFBK0I7UUFDNUMsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFBRSwyQkFBMkI7UUFDeEMsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtZXRlcnN9IGZyb20gJy4uL3R5cGVzL3BhcmFtZXRlcnMnO1xuXG5leHBvcnQgY29uc3QgUEFSQU1FVEVSUzogUGFyYW1ldGVycyA9IHtcbiAgY2FyYm9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdhbiBhbW91bnQgb2YgY2FyYm9uIGVtaXR0ZWQgaW50byB0aGUgYXRtb3NwaGVyZScsXG4gICAgdW5pdDogJ2dDTzJlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdjcHUvbnVtYmVyLWNvcmVzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnbnVtYmVyIG9mIGNvcmVzIGF2YWlsYWJsZScsXG4gICAgdW5pdDogJ2NvcmVzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY3B1L3V0aWxpemF0aW9uJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIENQVSB1dGlsaXphdGlvbi4nLFxuICAgIHVuaXQ6ICdwZXJjZW50YWdlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdkaXNrLWlvJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIEdCIG9mIGRhdGEgd3JpdHRlbi9yZWFkIGZyb20gZGlzaycsXG4gICAgdW5pdDogJ0dCJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gIGR1cmF0aW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBpbnB1dCcsXG4gICAgdW5pdDogJ3NlY29uZHMnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgZW5lcmd5OiB7XG4gICAgZGVzY3JpcHRpb246ICdhbW91bnQgb2YgZW5lcmd5IHV0aWxpc2VkIGJ5IHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdrV2gnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIENQVSBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAna1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdkZXZpY2UvZXhwZWN0ZWQtbGlmZXNwYW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBFeHBlY3RlZCBMaWZlc3BhbiBvZiB0aGUgQ29tcG9uZW50IGluIFNlY29uZHMnLFxuICAgIHVuaXQ6ICdzZWNvbmRzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdtZW1vcnkvZW5lcmd5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW5lcmd5IGNvbnN1bWVkIGJ5IHRoZSBNZW1vcnkgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnY2FyYm9uLWVtYm9kaWVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW1ib2RpZWQgRW1pc3Npb25zIG9mIHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdnQ08yZScsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnbmV0d29yay9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIE5ldHdvcmsgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnZnVuY3Rpb25hbC11bml0Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbmFsIHVuaXQgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSB2YWx1ZSBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIHJlcXVlc3RzLCB1c2VycycsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2Z1bmN0aW9uYWwtdW5pdC10aW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3N0cmluZyBkZXNjcmliaW5nIHRoZSB1bml0IG9mIHRpbWUgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSBjYWxjdWxhdGlvbiBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIFwiMS1taW5cIicsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdncHUtdXRpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3JlZmVycyB0byBDUFUgdXRpbGl6YXRpb24uJyxcbiAgICB1bml0OiAncGVyY2VudGFnZScsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAnZ3JpZC9jYXJib24taW50ZW5zaXR5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2FyYm9uIGludGVuc2l0eSBmb3IgdGhlIGdyaWQnLFxuICAgIHVuaXQ6ICdnQ08yZXEva1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdjbG91ZC9pbnN0YW5jZS10eXBlJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVHlwZSBvZiBDbG91ZCBJbnN0YW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNsb3VkIHByb3ZpZGVyIEFQSXMnLFxuICAgIHVuaXQ6ICdOb25lJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICBnZW9sb2NhdGlvbjoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0dlb2dyYXBoaWMgbG9jYXRpb24gb2YgcHJvdmlkZXIgYXMgc3RyaW5nIChmb3Igd2F0dC10aW1lIG1vZGVsIGl0IGlzIHByb3ZpZGVkIGFzIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUsIGNvbW1hIHNlcGFyYXRlZCwgaW4gZGVjaW1hbCBkZWdyZWVzKScsXG4gICAgdW5pdDogJ05vbmUgKGRlY2ltYWwgZGVncmVlcyBmb3Igd2F0dC10aW1lIG1vZGVsKScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2NhcmJvbi1vcGVyYXRpb25hbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbmFsIEVtaXNzaW9ucyBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAnZ0NPMmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9uYW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgcGh5c2ljYWwgcHJvY2Vzc29yJyxcbiAgICB1bml0OiAnTm9uZScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2Nsb3VkL3ZlbmRvcic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdOYW1lIG9mIHRoZSBjbG91ZCBzZXJ2aWNlIHByb3ZpZGVyIGluIHRoZSBjY2YgbW9kZWwuIENhbiBiZSBhd3MsIGdjcCBvciBhenVyZScsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdyYW0tYWxsb2MnOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gR0Igb2YgbWVtb3J5IGFsbG9jYXRlZC4nLFxuICAgIHVuaXQ6ICdHQicsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmFtLXV0aWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gcGVyY2VudGFnZSBvZiBtZW1vcnkgdXRpbGl6ZWQuJyxcbiAgICB1bml0OiAncGVyY2VudGFnZScsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmVzb3VyY2VzLXJlc2VydmVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVzb3VyY2VzIHJlc2VydmVkIGZvciBhbiBhcHBsaWNhdGlvbicsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY3B1L3RoZXJtYWwtZGVzaWduLXBvd2VyJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndGhlcm1hbCBkZXNpZ24gcG93ZXIgZm9yIGEgcHJvY2Vzc29yJyxcbiAgICB1bml0OiAna3doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdkZXZpY2UvZW1pc3Npb25zLWVtYm9kaWVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndG90YWwgZW1ib2RpZWQgZW1pc3Npb25zIG9mIHNvbWUgY29tcG9uZW50JyxcbiAgICB1bml0OiAnZ0NPMmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgdGltZXN0YW1wOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIHRpbWUgb2Ygb2NjdXJyZW5jZSBvZiB0aGUgaW5wdXQnLFxuICAgIHVuaXQ6ICdSRkMzMzM5JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAndGltZS1yZXNlcnZlZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RpbWUgcmVzZXJ2ZWQgZm9yIGEgY29tcG9uZW50JyxcbiAgICB1bml0OiAnc2Vjb25kcycsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAncmVzb3VyY2VzLXRvdGFsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAndG90YWwgcmVzb3VyY2VzIGF2YWlsYWJsZScsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxufTtcbiJdfQ==
|
|
201
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbmZpZy9wYXJhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSxVQUFVLEdBQWU7SUFDcEMsTUFBTSxFQUFFO1FBQ04sV0FBVyxFQUFFLGlEQUFpRDtRQUM5RCxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxLQUFLO0tBQ25CO0lBQ0Qsa0JBQWtCLEVBQUU7UUFDbEIsV0FBVyxFQUFFLDJCQUEyQjtRQUN4QyxJQUFJLEVBQUUsT0FBTztRQUNiLFdBQVcsRUFBRSxNQUFNO0tBQ3BCO0lBQ0QsaUJBQWlCLEVBQUU7UUFDakIsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxJQUFJLEVBQUUsWUFBWTtRQUNsQixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFNBQVMsRUFBRTtRQUNULFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLElBQUk7UUFDVixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFFBQVEsRUFBRTtRQUNSLFdBQVcsRUFBRSxxQ0FBcUM7UUFDbEQsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELE1BQU0sRUFBRTtRQUNOLFdBQVcsRUFBRSw0Q0FBNEM7UUFDekQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELFlBQVksRUFBRTtRQUNaLFdBQVcsRUFBRSw2Q0FBNkM7UUFDMUQsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxxREFBcUQ7UUFDbEUsSUFBSSxFQUFFLFNBQVM7UUFDZixXQUFXLEVBQUUsS0FBSztLQUNuQjtJQUNELGVBQWUsRUFBRTtRQUNmLFdBQVcsRUFBRSxnREFBZ0Q7UUFDN0QsSUFBSSxFQUFFLEtBQUs7UUFDWCxXQUFXLEVBQUUsS0FBSztLQUNu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QUNwQjtJQUNELGlCQUFpQixFQUFFO1FBQ2pCLFdBQVcsRUFBRSxrREFBa0Q7UUFDL0QsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELGFBQWEsRUFBRTtRQUNiLFdBQVcsRUFBRSwwREFBMEQ7UUFDdkUsSUFBSSxFQUFFLE9BQU87UUFDYixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLFdBQVcsRUFBRSwyREFBMkQ7UUFDeEUsSUFBSSxFQUFFLElBQUk7UUFDVixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLFdBQVcsRUFDVCx1RUFBdUU7UUFDekUsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELGtCQUFrQixFQUFFO1FBQ2xCLFdBQVcsRUFBRSxpQ0FBaUM7UUFDOUMsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELHlCQUF5QixFQUFFO1FBQ3pCLFdBQVcsRUFBRSw4Q0FBOEM7UUFDM0QsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELG9CQUFvQixFQUFFO1FBQ3BCLFdBQVcsRUFBRSx1Q0FBdUM7UUFDcEQsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELHVCQUF1QixFQUFFO1FBQ3ZCLFdBQVcsRUFBRSxvQ0FBb0M7UUFDakQsSUFBSSxFQUFFLE1BQU07UUFDWixXQUFXLEVBQUUsTUFBTTtLQUNwQjtJQUNELDBCQUEwQixFQUFFO1FBQzFCLFdBQVcsRUFBRSxxREFBcUQ7UUFDbEUsSUFBSSxFQUFFLGlCQUFpQjtRQUN2QixXQUFXLEVBQUUsTUFBTTtLQUNwQjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1BhcmFtZXRlcnN9IGZyb20gJy4uL3R5cGVzL3BhcmFtZXRlcnMnO1xuXG5leHBvcnQgY29uc3QgUEFSQU1FVEVSUzogUGFyYW1ldGVycyA9IHtcbiAgY2FyYm9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdhbiBhbW91bnQgb2YgY2FyYm9uIGVtaXR0ZWQgaW50byB0aGUgYXRtb3NwaGVyZScsXG4gICAgdW5pdDogJ2dDTzJlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdjcHUvbnVtYmVyLWNvcmVzJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnbnVtYmVyIG9mIGNvcmVzIGF2YWlsYWJsZScsXG4gICAgdW5pdDogJ2NvcmVzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY3B1L3V0aWxpemF0aW9uJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIENQVSB1dGlsaXphdGlvbi4nLFxuICAgIHVuaXQ6ICdwZXJjZW50YWdlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdkaXNrLWlvJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIEdCIG9mIGRhdGEgd3JpdHRlbi9yZWFkIGZyb20gZGlzaycsXG4gICAgdW5pdDogJ0dCJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gIGR1cmF0aW9uOiB7XG4gICAgZGVzY3JpcHRpb246ICdyZWZlcnMgdG8gdGhlIGR1cmF0aW9uIG9mIHRoZSBpbnB1dCcsXG4gICAgdW5pdDogJ3NlY29uZHMnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgZW5lcmd5OiB7XG4gICAgZGVzY3JpcHRpb246ICdhbW91bnQgb2YgZW5lcmd5IHV0aWxpc2VkIGJ5IHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdrV2gnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIENQVSBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAna1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdkZXZpY2UvZXhwZWN0ZWQtbGlmZXNwYW4nOiB7XG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBFeHBlY3RlZCBMaWZlc3BhbiBvZiB0aGUgQ29tcG9uZW50IGluIFNlY29uZHMnLFxuICAgIHVuaXQ6ICdzZWNvbmRzJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gICdtZW1vcnkvZW5lcmd5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW5lcmd5IGNvbnN1bWVkIGJ5IHRoZSBNZW1vcnkgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnY2FyYm9uLWVtYm9kaWVkJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnRW1ib2RpZWQgRW1pc3Npb25zIG9mIHRoZSBjb21wb25lbnQnLFxuICAgIHVuaXQ6ICdnQ08yZScsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnbmV0d29yay9lbmVyZ3knOiB7XG4gICAgZGVzY3JpcHRpb246ICdFbmVyZ3kgY29uc3VtZWQgYnkgdGhlIE5ldHdvcmsgb2YgdGhlIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2tXaCcsXG4gICAgYWdncmVnYXRpb246ICdzdW0nLFxuICB9LFxuICAnZnVuY3Rpb25hbC11bml0Jzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3RoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbmFsIHVuaXQgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSB2YWx1ZSBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIHJlcXVlc3RzLCB1c2VycycsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2Z1bmN0aW9uYWwtdW5pdC10aW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ3N0cmluZyBkZXNjcmliaW5nIHRoZSB1bml0IG9mIHRpbWUgaW4gd2hpY2ggdGhlIGZpbmFsIFNDSSBjYWxjdWxhdGlvbiBzaG91bGQgYmUgZXhwcmVzc2VkLCBlLmcuIFwiMS1taW5cIicsXG4gICAgdW5pdDogJ25vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdncHUtdXRpbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3JlZmVycyB0byBDUFUgdXRpbGl6YXRpb24uJyxcbiAgICB1bml0OiAncGVyY2VudGFnZScsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAnZ3JpZC9jYXJib24taW50ZW5zaXR5Jzoge1xuICAgIGRlc2NyaXB0aW9uOiAnQ2FyYm9uIGludGVuc2l0eSBmb3IgdGhlIGdyaWQnLFxuICAgIHVuaXQ6ICdnQ08yZXEva1doJyxcbiAgICBhZ2dyZWdhdGlvbjogJ2F2ZycsXG4gIH0sXG4gICdjbG91ZC9pbnN0YW5jZS10eXBlJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnVHlwZSBvZiBDbG91ZCBJbnN0YW5jZSBuYW1lIHVzZWQgaW4gdGhlIGNsb3VkIHByb3ZpZGVyIEFQSXMnLFxuICAgIHVuaXQ6ICdOb25lJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICBnZW9sb2NhdGlvbjoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ0dlb2dyYXBoaWMgbG9jYXRpb24gb2YgcHJvdmlkZXIgYXMgc3RyaW5nIChmb3Igd2F0dC10aW1lIG1vZGVsIGl0IGlzIHByb3ZpZGVkIGFzIGxhdGl0dWRlIGFuZCBsb25naXR1ZGUsIGNvbW1hIHNlcGFyYXRlZCwgaW4gZGVjaW1hbCBkZWdyZWVzKScsXG4gICAgdW5pdDogJ05vbmUgKGRlY2ltYWwgZGVncmVlcyBmb3Igd2F0dC10aW1lIG1vZGVsKScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2NhcmJvbi1vcGVyYXRpb25hbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ09wZXJhdGlvbmFsIEVtaXNzaW9ucyBvZiB0aGUgY29tcG9uZW50JyxcbiAgICB1bml0OiAnZ0NPMmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnc3VtJyxcbiAgfSxcbiAgJ2NwdS9uYW1lJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnTmFtZSBvZiB0aGUgcGh5c2ljYWwgcHJvY2Vzc29yJyxcbiAgICB1bml0OiAnTm9uZScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2Nsb3VkL3JlZ2lvbic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3JlZ2lvbiBjbG91ZCBpbnN0YW5jZSBydW5zIGluJyxcbiAgICB1bml0OiAnTm9uZScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2Nsb3VkL3ZlbmRvcic6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdOYW1lIG9mIHRoZSBjbG91ZCBzZXJ2aWNlIHByb3ZpZGVyIGluIHRoZSBjY2YgbW9kZWwuIENhbiBiZSBhd3MsIGdjcCBvciBhenVyZScsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gIG5hbWU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2FyYml0cmFyeSBuYW1lIHBhcmFtZXRlci4nLFxuICAgIHVuaXQ6ICdOb25lJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAncmFtLWFsbG9jJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIEdCIG9mIG1lbW9yeSBhbGxvY2F0ZWQuJyxcbiAgICB1bml0OiAnR0InLFxuICAgIGFnZ3JlZ2F0aW9uOiAnYXZnJyxcbiAgfSxcbiAgJ3JhbS11dGlsJzoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIHBlcmNlbnRhZ2Ugb2YgbWVtb3J5IHV0aWxpemVkLicsXG4gICAgdW5pdDogJ3BlcmNlbnRhZ2UnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnYXZnJyxcbiAgfSxcbiAgJ3Jlc291cmNlcy1yZXNlcnZlZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3Jlc291cmNlcyByZXNlcnZlZCBmb3IgYW4gYXBwbGljYXRpb24nLFxuICAgIHVuaXQ6ICdjb3VudCcsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2NwdS90aGVybWFsLWRlc2lnbi1wb3dlcic6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RoZXJtYWwgZGVzaWduIHBvd2VyIGZvciBhIHByb2Nlc3NvcicsXG4gICAgdW5pdDogJ2t3aCcsXG4gICAgYWdncmVnYXRpb246ICdhdmcnLFxuICB9LFxuICAnZGV2aWNlL2VtaXNzaW9ucy1lbWJvZGllZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RvdGFsIGVtYm9kaWVkIGVtaXNzaW9ucyBvZiBzb21lIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ2dDTzJlJyxcbiAgICBhZ2dyZWdhdGlvbjogJ3N1bScsXG4gIH0sXG4gIHRpbWVzdGFtcDoge1xuICAgIGRlc2NyaXB0aW9uOiAncmVmZXJzIHRvIHRoZSB0aW1lIG9mIG9jY3VycmVuY2Ugb2YgdGhlIGlucHV0JyxcbiAgICB1bml0OiAnUkZDMzMzOScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ3RpbWUtcmVzZXJ2ZWQnOiB7XG4gICAgZGVzY3JpcHRpb246ICd0aW1lIHJlc2VydmVkIGZvciBhIGNvbXBvbmVudCcsXG4gICAgdW5pdDogJ3NlY29uZHMnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnYXZnJyxcbiAgfSxcbiAgJ3Jlc291cmNlcy10b3RhbCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RvdGFsIHJlc291cmNlcyBhdmFpbGFibGUnLFxuICAgIHVuaXQ6ICdjb3VudCcsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ3ZjcHVzLWFsbG9jYXRlZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ251bWJlciBvZiB2Y3B1cyBhbGxvY2F0ZWQgdG8gcGFydGljdWxhciByZXNvdXJjZScsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAndmNwdXMtdG90YWwnOiB7XG4gICAgZGVzY3JpcHRpb246ICd0b3RhbCBudW1iZXIgb2YgdmNwdXMgYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciByZXNvdXJjZScsXG4gICAgdW5pdDogJ2NvdW50JyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnbWVtb3J5LWF2YWlsYWJsZSc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ3RvdGFsIGFtb3VudCBvZiBtZW1vcnkgYXZhaWxhYmxlIG9uIGEgcGFydGljdWxhciByZXNvdXJjZScsXG4gICAgdW5pdDogJ0dCJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAncGh5c2ljYWwtcHJvY2Vzc29yJzoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ25hbWUgb2YgdGhlIHBoeXNpY2FsIHByb2Nlc3NvciBiZWluZyB1c2VkIGluIGEgc3BlY2lmaWMgaW5zdGFuY2UgdHlwZScsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdjbG91ZC9yZWdpb24tY2ZlJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnY2xvdWQgcmVnaW9uIG5hbWUgaW4gY2ZlIGZvcm1hdCcsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdjbG91ZC9yZWdpb24tZW0tem9uZS1pZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2Nsb3VkIHJlZ2lvbiBuYW1lIGluIGVsZWN0cmljaXR5IG1hcHMgZm9ybWF0JyxcbiAgICB1bml0OiAnTm9uZScsXG4gICAgYWdncmVnYXRpb246ICdub25lJyxcbiAgfSxcbiAgJ2Nsb3VkL3JlZ2lvbi13dC1pZCc6IHtcbiAgICBkZXNjcmlwdGlvbjogJ2Nsb3VkIHJlZ2lvbiBuYW1lIGluIHdhdHQtdGltZSBmb3JtYXQnLFxuICAgIHVuaXQ6ICdOb25lJyxcbiAgICBhZ2dyZWdhdGlvbjogJ25vbmUnLFxuICB9LFxuICAnY2xvdWQvcmVnaW9uLWxvY2F0aW9uJzoge1xuICAgIGRlc2NyaXB0aW9uOiAnY2xvdWQgcmVnaW9uIG5hbWUgaW4gb3VyIElGIGZvcm1hdCcsXG4gICAgdW5pdDogJ05vbmUnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG4gICdjbG91ZC9yZWdpb24tZ2VvbG9jYXRpb24nOiB7XG4gICAgZGVzY3JpcHRpb246ICdsb2NhdGlvbiBleHByZXNzZWQgYXMgZGVjaW1hbCBjb29yZGluYXRlcyAobGF0L2xvbiknLFxuICAgIHVuaXQ6ICdkZWNpbWFsIGRlZ3JlZXMnLFxuICAgIGFnZ3JlZ2F0aW9uOiAnbm9uZScsXG4gIH0sXG59O1xuIl19
|