@hestia-earth/ui-components 0.0.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/README.md +24 -0
- package/auth/auth.service.d.ts +10 -0
- package/auth/public-api.d.ts +1 -0
- package/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.d.ts +40 -0
- package/bibliographies/bibliographies.module.d.ts +10 -0
- package/bibliographies/public-api.d.ts +2 -0
- package/bundles/hestia-earth-ui-components.umd.js +7570 -0
- package/bundles/hestia-earth-ui-components.umd.js.map +1 -0
- package/common/bind-once.directive.d.ts +10 -0
- package/common/blank-node-diffs/blank-node-diffs.component.d.ts +18 -0
- package/common/blank-node-state/blank-node-state.component.d.ts +36 -0
- package/common/blank-node-state-notice/blank-node-state-notice.component.d.ts +9 -0
- package/common/blank-node-value-delta/blank-node-value-delta.component.d.ts +13 -0
- package/common/click-outside.directive.d.ts +10 -0
- package/common/clipboard/clipboard.component.d.ts +16 -0
- package/common/common.module.d.ts +37 -0
- package/common/common.service.d.ts +11 -0
- package/common/default.pipe.d.ts +7 -0
- package/common/ellipsis.pipe.d.ts +7 -0
- package/common/get.pipe.d.ts +7 -0
- package/common/key-to-label.pipe.d.ts +7 -0
- package/common/keys.pipe.d.ts +7 -0
- package/common/link-key-value/link-key-value.component.d.ts +16 -0
- package/common/logs-utils.d.ts +17 -0
- package/common/maps-drawing-confirm/maps-drawing-confirm.component.d.ts +28 -0
- package/common/maps-utils.d.ts +70 -0
- package/common/pluralize.pipe.d.ts +7 -0
- package/common/popover/popover.component.d.ts +16 -0
- package/common/popover-confirm/popover-confirm.component.d.ts +15 -0
- package/common/precision.pipe.d.ts +7 -0
- package/common/public-api.d.ts +30 -0
- package/common/schema-version-link/schema-version-link.component.d.ts +10 -0
- package/common/skeleton-text/skeleton-text.component.d.ts +11 -0
- package/common/social-tags/social-tags.component.d.ts +12 -0
- package/common/tags-input.directive.d.ts +20 -0
- package/common/times.pipe.d.ts +7 -0
- package/common/toast/toast.component.d.ts +19 -0
- package/common/toast.service.d.ts +16 -0
- package/common/unit-converter/unit-converter.component.d.ts +25 -0
- package/common/utils.d.ts +88 -0
- package/cycles/cycles-activity/cycles-activity.component.d.ts +31 -0
- package/cycles/cycles-activity-logs/cycles-activity-logs.component.d.ts +25 -0
- package/cycles/cycles-completeness/cycles-completeness.component.d.ts +14 -0
- package/cycles/cycles-emissions/cycles-emissions.component.d.ts +40 -0
- package/cycles/cycles-emissions-chart/cycles-emissions-chart.component.d.ts +18 -0
- package/cycles/cycles-emissions-logs/cycles-emissions-logs.component.d.ts +23 -0
- package/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.d.ts +8 -0
- package/cycles/cycles-result/cycles-result.component.d.ts +13 -0
- package/cycles/cycles-suggest-form/cycles-suggest-form.component.d.ts +24 -0
- package/cycles/cycles.model.d.ts +7 -0
- package/cycles/cycles.module.d.ts +19 -0
- package/cycles/public-api.d.ts +10 -0
- package/engine/aggregation-engine.service.d.ts +71 -0
- package/engine/engine.service.d.ts +61 -0
- package/engine/public-api.d.ts +2 -0
- package/esm2015/auth/auth.service.js +19 -0
- package/esm2015/auth/public-api.js +2 -0
- package/esm2015/bibliographies/bibliographies-search-confirm/bibliographies-search-confirm.component.js +100 -0
- package/esm2015/bibliographies/bibliographies.module.js +30 -0
- package/esm2015/bibliographies/public-api.js +3 -0
- package/esm2015/common/bind-once.directive.js +23 -0
- package/esm2015/common/blank-node-diffs/blank-node-diffs.component.js +47 -0
- package/esm2015/common/blank-node-state/blank-node-state.component.js +90 -0
- package/esm2015/common/blank-node-state-notice/blank-node-state-notice.component.js +27 -0
- package/esm2015/common/blank-node-value-delta/blank-node-value-delta.component.js +41 -0
- package/esm2015/common/click-outside.directive.js +28 -0
- package/esm2015/common/clipboard/clipboard.component.js +69 -0
- package/esm2015/common/common.module.js +144 -0
- package/esm2015/common/common.service.js +29 -0
- package/esm2015/common/default.pipe.js +23 -0
- package/esm2015/common/ellipsis.pipe.js +17 -0
- package/esm2015/common/get.pipe.js +17 -0
- package/esm2015/common/key-to-label.pipe.js +18 -0
- package/esm2015/common/keys.pipe.js +20 -0
- package/esm2015/common/link-key-value/link-key-value.component.js +55 -0
- package/esm2015/common/logs-utils.js +49 -0
- package/esm2015/common/maps-drawing-confirm/maps-drawing-confirm.component.js +89 -0
- package/esm2015/common/maps-utils.js +101 -0
- package/esm2015/common/pluralize.pipe.js +17 -0
- package/esm2015/common/popover/popover.component.js +37 -0
- package/esm2015/common/popover-confirm/popover-confirm.component.js +38 -0
- package/esm2015/common/precision.pipe.js +20 -0
- package/esm2015/common/public-api.js +31 -0
- package/esm2015/common/schema-version-link/schema-version-link.component.js +39 -0
- package/esm2015/common/skeleton-text/skeleton-text.component.js +44 -0
- package/esm2015/common/social-tags/social-tags.component.js +37 -0
- package/esm2015/common/tags-input.directive.js +74 -0
- package/esm2015/common/times.pipe.js +16 -0
- package/esm2015/common/toast/toast.component.js +37 -0
- package/esm2015/common/toast.service.js +36 -0
- package/esm2015/common/unit-converter/unit-converter.component.js +73 -0
- package/esm2015/common/utils.js +245 -0
- package/esm2015/cycles/cycles-activity/cycles-activity.component.js +92 -0
- package/esm2015/cycles/cycles-activity-logs/cycles-activity-logs.component.js +48 -0
- package/esm2015/cycles/cycles-completeness/cycles-completeness.component.js +41 -0
- package/esm2015/cycles/cycles-emissions/cycles-emissions.component.js +121 -0
- package/esm2015/cycles/cycles-emissions-chart/cycles-emissions-chart.component.js +93 -0
- package/esm2015/cycles/cycles-emissions-logs/cycles-emissions-logs.component.js +63 -0
- package/esm2015/cycles/cycles-functional-unit-measure/cycles-functional-unit-measure.component.js +22 -0
- package/esm2015/cycles/cycles-result/cycles-result.component.js +92 -0
- package/esm2015/cycles/cycles-suggest-form/cycles-suggest-form.component.js +83 -0
- package/esm2015/cycles/cycles.model.js +2 -0
- package/esm2015/cycles/cycles.module.js +66 -0
- package/esm2015/cycles/public-api.js +11 -0
- package/esm2015/engine/aggregation-engine.service.js +126 -0
- package/esm2015/engine/engine.service.js +78 -0
- package/esm2015/engine/public-api.js +3 -0
- package/esm2015/files/files-error.model.js +180 -0
- package/esm2015/files/files-form/files-form.component.js +439 -0
- package/esm2015/files/files-form.model.js +548 -0
- package/esm2015/files/files.module.js +42 -0
- package/esm2015/files/public-api.js +3 -0
- package/esm2015/fontawesome/fontawesome.module.js +36 -0
- package/esm2015/fontawesome/public-api.js +2 -0
- package/esm2015/hestia-earth-ui-components.js +5 -0
- package/esm2015/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.js +161 -0
- package/esm2015/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.js +142 -0
- package/esm2015/impact-assessments/impact-assessments-products/impact-assessments-products.component.js +252 -0
- package/esm2015/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.js +68 -0
- package/esm2015/impact-assessments/impact-assessments.model.js +2 -0
- package/esm2015/impact-assessments/impact-assessments.module.js +47 -0
- package/esm2015/impact-assessments/public-api.js +7 -0
- package/esm2015/mendeley/mendeley.service.js +35 -0
- package/esm2015/mendeley/public-api.js +2 -0
- package/esm2015/node/node-csv-export-confirm/node-csv-export-confirm.component.js +65 -0
- package/esm2015/node/node-csv-select-headers/node-csv-select-headers.component.js +119 -0
- package/esm2015/node/node-csv.service.js +24 -0
- package/esm2015/node/node-diffs/node-diffs.component.js +67 -0
- package/esm2015/node/node-diffs/node-diffs.model.js +6 -0
- package/esm2015/node/node-icon/node-icon.component.js +37 -0
- package/esm2015/node/node-link/node-link.component.js +33 -0
- package/esm2015/node/node-logs-file/node-logs-file.component.js +63 -0
- package/esm2015/node/node-logs-models/node-logs-models.component.js +188 -0
- package/esm2015/node/node-missing-lookup-factors/node-missing-lookup-factors.component.js +34 -0
- package/esm2015/node/node-value-details/node-value-details.component.js +46 -0
- package/esm2015/node/node.module.js +67 -0
- package/esm2015/node/node.service.js +113 -0
- package/esm2015/node/public-api.js +13 -0
- package/esm2015/public-api.js +16 -0
- package/esm2015/schema/public-api.js +2 -0
- package/esm2015/schema/schema.service.js +167 -0
- package/esm2015/search/public-api.js +4 -0
- package/esm2015/search/search.model.js +204 -0
- package/esm2015/search/search.module.js +13 -0
- package/esm2015/search/search.service.js +99 -0
- package/esm2015/sites/public-api.js +6 -0
- package/esm2015/sites/sites-maps/sites-maps.component.js +162 -0
- package/esm2015/sites/sites-measurements/sites-measurements.component.js +78 -0
- package/esm2015/sites/sites-measurements-logs/sites-measurements-logs.component.js +63 -0
- package/esm2015/sites/sites.model.js +10 -0
- package/esm2015/sites/sites.module.js +42 -0
- package/esm2015/terms/public-api.js +2 -0
- package/esm2015/terms/terms.model.js +184 -0
- package/esm2015/users/public-api.js +2 -0
- package/esm2015/users/users.service.js +17 -0
- package/fesm2015/hestia-earth-ui-components.js +5920 -0
- package/fesm2015/hestia-earth-ui-components.js.map +1 -0
- package/files/files-error.model.d.ts +40 -0
- package/files/files-form/files-form.component.d.ts +94 -0
- package/files/files-form.model.d.ts +113 -0
- package/files/files.module.d.ts +13 -0
- package/files/public-api.d.ts +2 -0
- package/fontawesome/fontawesome.module.d.ts +10 -0
- package/fontawesome/public-api.d.ts +1 -0
- package/hestia-earth-ui-components.d.ts +5 -0
- package/impact-assessments/impact-assessments-indicator-breakdown-chart/impact-assessments-indicator-breakdown-chart.component.d.ts +28 -0
- package/impact-assessments/impact-assessments-indicators-chart/impact-assessments-indicators-chart.component.d.ts +25 -0
- package/impact-assessments/impact-assessments-products/impact-assessments-products.component.d.ts +77 -0
- package/impact-assessments/impact-assessments-products-logs/impact-assessments-products-logs.component.d.ts +25 -0
- package/impact-assessments/impact-assessments.model.d.ts +6 -0
- package/impact-assessments/impact-assessments.module.d.ts +15 -0
- package/impact-assessments/public-api.d.ts +6 -0
- package/mendeley/mendeley.service.d.ts +25 -0
- package/mendeley/public-api.d.ts +1 -0
- package/node/node-csv-export-confirm/node-csv-export-confirm.component.d.ts +32 -0
- package/node/node-csv-select-headers/node-csv-select-headers.component.d.ts +42 -0
- package/node/node-csv.service.d.ts +9 -0
- package/node/node-diffs/node-diffs.component.d.ts +23 -0
- package/node/node-diffs/node-diffs.model.d.ts +4 -0
- package/node/node-icon/node-icon.component.d.ts +8 -0
- package/node/node-link/node-link.component.d.ts +11 -0
- package/node/node-logs-file/node-logs-file.component.d.ts +31 -0
- package/node/node-logs-models/node-logs-models.component.d.ts +72 -0
- package/node/node-missing-lookup-factors/node-missing-lookup-factors.component.d.ts +14 -0
- package/node/node-value-details/node-value-details.component.d.ts +17 -0
- package/node/node.module.d.ts +20 -0
- package/node/node.service.d.ts +70 -0
- package/node/public-api.d.ts +12 -0
- package/package.json +53 -0
- package/public-api.d.ts +15 -0
- package/schema/public-api.d.ts +1 -0
- package/schema/schema.service.d.ts +51 -0
- package/search/public-api.d.ts +3 -0
- package/search/search.model.d.ts +243 -0
- package/search/search.module.d.ts +7 -0
- package/search/search.service.d.ts +129 -0
- package/sites/public-api.d.ts +5 -0
- package/sites/sites-maps/sites-maps.component.d.ts +35 -0
- package/sites/sites-measurements/sites-measurements.component.d.ts +31 -0
- package/sites/sites-measurements-logs/sites-measurements-logs.component.d.ts +23 -0
- package/sites/sites.model.d.ts +10 -0
- package/sites/sites.module.d.ts +13 -0
- package/styles.scss +197 -0
- package/terms/public-api.d.ts +1 -0
- package/terms/terms.model.d.ts +21 -0
- package/users/public-api.d.ts +1 -0
- package/users/users.service.d.ts +7 -0
|
@@ -0,0 +1,548 @@
|
|
|
1
|
+
import { __rest } from "tslib";
|
|
2
|
+
/* eslint-disable complexity */
|
|
3
|
+
const get = require('lodash.get');
|
|
4
|
+
import * as moment from 'moment';
|
|
5
|
+
import 'moment/locale/en-gb';
|
|
6
|
+
import { v4 as uuidv4 } from 'uuid';
|
|
7
|
+
import { diffInDays, isNumber } from '@hestia-earth/utils';
|
|
8
|
+
import { SchemaType, NodeType, isTypeNode, isTypeValid, isExpandable, typeToSchemaType } from '@hestia-earth/schema';
|
|
9
|
+
import { formatCustomErrorMessage, formatError, missingNodeErrorMessage, isMissingPropertyError, errorHasError, errorHasWarning, missingNodeErrors, isMissingOneOfError } from './files-error.model';
|
|
10
|
+
import { schemaRequiredProperties, valueTypeToDefault, definitionToSchemaType, availableProperties, nestingTypeEnabled, nestingEnabled, linkTypeEnabled, isSchemaIri } from '../schema/schema.service';
|
|
11
|
+
import { matchCountry } from '../search/search.model';
|
|
12
|
+
import { baseUrl, mapsUrl, safeJSONParse, safeJSONStringify } from '../common/utils';
|
|
13
|
+
export const ARRAY_DELIMITER = ';';
|
|
14
|
+
const privateKeys = [
|
|
15
|
+
'filepath'
|
|
16
|
+
];
|
|
17
|
+
export const defaultSuggestionType = 'default';
|
|
18
|
+
const stringValue = (value) => (typeof value === 'undefined' || value === null ? '' : value).toString();
|
|
19
|
+
const nonExpandableArrayDataPath = (key) => key.replace(/\[\d+\]$/, '');
|
|
20
|
+
export const keyToDataPath = (key) => (key === null || key === void 0 ? void 0 : key.length) ? `.${key}` : '';
|
|
21
|
+
export const dataPathToKey = (dataPath, trimArray = false) => trimArray ? nonExpandableArrayDataPath(dataPath.substring(1)) : dataPath.substring(1);
|
|
22
|
+
export const parentKey = (key) => {
|
|
23
|
+
const keys = (key.startsWith('.') ? key.substring(1) : key).split('.');
|
|
24
|
+
keys.pop();
|
|
25
|
+
return keys.join('.');
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Sort properties having errors, type, id, ...properties (simple), and finally the groups
|
|
29
|
+
*
|
|
30
|
+
* @param a {INodeProperty}
|
|
31
|
+
* @param b {INodeProperty}
|
|
32
|
+
*/
|
|
33
|
+
export const sortProperties = (a, b) => {
|
|
34
|
+
if (isNumber(a.key) && isNumber(b.key)) {
|
|
35
|
+
return +a.key - +b.key;
|
|
36
|
+
}
|
|
37
|
+
if (a.isExpandable) {
|
|
38
|
+
return b.isExpandable ? a.key.localeCompare(b.key) : 1;
|
|
39
|
+
}
|
|
40
|
+
if (b.isExpandable) {
|
|
41
|
+
return -1;
|
|
42
|
+
}
|
|
43
|
+
if (!a.key) {
|
|
44
|
+
return -1;
|
|
45
|
+
}
|
|
46
|
+
const aKey = a.key.replace('@', '');
|
|
47
|
+
const bKey = b.key.replace('@', '');
|
|
48
|
+
if (aKey === 'type') {
|
|
49
|
+
return -1;
|
|
50
|
+
}
|
|
51
|
+
if (bKey === 'type') {
|
|
52
|
+
return 1;
|
|
53
|
+
}
|
|
54
|
+
if (aKey === 'id' && bKey !== 'type') {
|
|
55
|
+
return -1;
|
|
56
|
+
}
|
|
57
|
+
if (a.hasError || a.hasWarning) {
|
|
58
|
+
return -1;
|
|
59
|
+
}
|
|
60
|
+
return a.key.localeCompare(b.key);
|
|
61
|
+
};
|
|
62
|
+
const defaultPropertyError = {
|
|
63
|
+
max: ({ max }) => `should be <= ${max}`,
|
|
64
|
+
min: ({ min }) => `should be >= ${min}`,
|
|
65
|
+
pattern: ({ requiredPattern }) => `should match pattern "${requiredPattern}"`,
|
|
66
|
+
required: (_e, { schemaType }) => schemaType ? `should be set or linked to another ${schemaType}` : undefined
|
|
67
|
+
};
|
|
68
|
+
export const formatPropertyError = (errors, property) => {
|
|
69
|
+
const key = Object.keys(errors)[0];
|
|
70
|
+
return key in defaultPropertyError ? formatCustomErrorMessage(defaultPropertyError[key](errors[key], property)) : '';
|
|
71
|
+
};
|
|
72
|
+
export const hasError = value => Array.isArray(value) ? value.some(hasError) : value.hasError;
|
|
73
|
+
export const hasWarning = value => Array.isArray(value) ? value.some(hasWarning) : value.hasWarning;
|
|
74
|
+
const compileSuggestionQueries = (key, allOf) => {
|
|
75
|
+
const conditions = (allOf || [])
|
|
76
|
+
.filter(v => { var _c; return (((_c = v.if) === null || _c === void 0 ? void 0 : _c.required) || []).includes(key); })
|
|
77
|
+
.map(v => { var _c; return (_c = v.then) === null || _c === void 0 ? void 0 : _c.properties[key]; })
|
|
78
|
+
.map(v => { var _c; return ((_c = v === null || v === void 0 ? void 0 : v.items) === null || _c === void 0 ? void 0 : _c.properties) || (v === null || v === void 0 ? void 0 : v.properties); })
|
|
79
|
+
.filter(Boolean);
|
|
80
|
+
return conditions.length ? [{
|
|
81
|
+
bool: {
|
|
82
|
+
should: conditions.flatMap(cond => Object.keys(cond).flatMap(k => (cond[k].enum || []).map(v => ({
|
|
83
|
+
match: { [k]: v }
|
|
84
|
+
})))),
|
|
85
|
+
minimum_should_match: 1
|
|
86
|
+
}
|
|
87
|
+
}] : [];
|
|
88
|
+
};
|
|
89
|
+
// default suggest for linking nodes together using the `id` field
|
|
90
|
+
const suggestLinkNodes = (type, fullKey) => {
|
|
91
|
+
const keys = fullKey.split('.');
|
|
92
|
+
const key = keys.pop();
|
|
93
|
+
return key === 'id' && keys.length >= 1 ? { type, isLinkNode: true } : undefined;
|
|
94
|
+
};
|
|
95
|
+
const suggestExistingNode = (type, fullKey) => {
|
|
96
|
+
const keys = fullKey.split('.');
|
|
97
|
+
const key = keys.pop();
|
|
98
|
+
return keys.length >= 1 && ['@id', 'openLCAId'].includes(key) ? { type, isUniqueKey: '@id' } : undefined;
|
|
99
|
+
};
|
|
100
|
+
const defaultNodeTypeSuggestion = (type) => (fullKey) => suggestLinkNodes(type, fullKey) || suggestExistingNode(type, fullKey);
|
|
101
|
+
const termSuggestions = (parent, { allOf }) => ({
|
|
102
|
+
type: NodeType.Term,
|
|
103
|
+
queries: [
|
|
104
|
+
...compileSuggestionQueries(nonExpandableArrayDataPath(parent), allOf),
|
|
105
|
+
...(['country'].includes(parent) ? [matchCountry] : [])
|
|
106
|
+
]
|
|
107
|
+
});
|
|
108
|
+
export const formatLinkNodesSuggestions = (nodeMap, type) => (nodeMap[type] || []).map(id => ({ type, id, name: `Link with ${type}: ${id}` }));
|
|
109
|
+
const typeToSuggestion = {
|
|
110
|
+
[NodeType.Actor]: defaultNodeTypeSuggestion(NodeType.Actor),
|
|
111
|
+
[NodeType.Cycle]: defaultNodeTypeSuggestion(NodeType.Cycle),
|
|
112
|
+
[NodeType.ImpactAssessment]: defaultNodeTypeSuggestion(NodeType.ImpactAssessment),
|
|
113
|
+
[NodeType.Organisation]: defaultNodeTypeSuggestion(NodeType.Organisation),
|
|
114
|
+
[NodeType.Site]: defaultNodeTypeSuggestion(NodeType.Site),
|
|
115
|
+
[NodeType.Source]: defaultNodeTypeSuggestion(NodeType.Source),
|
|
116
|
+
[NodeType.Term]: (fullKey, parentSchema) => {
|
|
117
|
+
const keys = fullKey.split('.');
|
|
118
|
+
const key = keys.pop();
|
|
119
|
+
return ['name'].includes(key) && keys.length >= 1 ?
|
|
120
|
+
termSuggestions(keys.pop(), parentSchema) :
|
|
121
|
+
defaultNodeTypeSuggestion(NodeType.Term)(fullKey);
|
|
122
|
+
},
|
|
123
|
+
[SchemaType.Bibliography]: (fullKey) => {
|
|
124
|
+
const keys = fullKey.split('.');
|
|
125
|
+
const key = keys.pop();
|
|
126
|
+
const parent = keys.pop();
|
|
127
|
+
// prevent replacing a top-level source
|
|
128
|
+
return ['title', 'documentDOI', 'scopus'].includes(key) && parent === 'bibliography' && keys.length >= 1 ? {
|
|
129
|
+
type: NodeType.Source,
|
|
130
|
+
parentLevel: 1
|
|
131
|
+
} : null;
|
|
132
|
+
},
|
|
133
|
+
number: (_a, _b, schema) => {
|
|
134
|
+
const values = schema.const ? [schema.const] : [];
|
|
135
|
+
return {
|
|
136
|
+
type: values.length > 0 ? 'select' : defaultSuggestionType,
|
|
137
|
+
// exclude suggesting SchemaType
|
|
138
|
+
values
|
|
139
|
+
};
|
|
140
|
+
},
|
|
141
|
+
integer: (_a, _b, schema) => {
|
|
142
|
+
const values = schema.const ? [schema.const] : [];
|
|
143
|
+
return {
|
|
144
|
+
type: values.length > 0 ? 'select' : defaultSuggestionType,
|
|
145
|
+
// exclude suggesting SchemaType
|
|
146
|
+
values
|
|
147
|
+
};
|
|
148
|
+
},
|
|
149
|
+
string: (fullKey, _b, schema) => {
|
|
150
|
+
// exclude suggesting SchemaType
|
|
151
|
+
const values = schema.const ?
|
|
152
|
+
[schema.const] :
|
|
153
|
+
(schema.enum || []).filter(val => !Object.values(SchemaType).includes(val));
|
|
154
|
+
const key = fullKey.split('.').pop();
|
|
155
|
+
return {
|
|
156
|
+
type: values.length > 0 && key !== 'type' ? 'select' : defaultSuggestionType,
|
|
157
|
+
values
|
|
158
|
+
};
|
|
159
|
+
},
|
|
160
|
+
boolean: (_a) => ({
|
|
161
|
+
type: 'select',
|
|
162
|
+
values: ['true', 'false']
|
|
163
|
+
})
|
|
164
|
+
};
|
|
165
|
+
const enableSuggestions = (parentSchema, type, fullKey, schema) => {
|
|
166
|
+
const suggestion = type in typeToSuggestion ? typeToSuggestion[type](fullKey, parentSchema) : null;
|
|
167
|
+
return suggestion !== null ? suggestion : (schema && schema.type in typeToSuggestion ?
|
|
168
|
+
typeToSuggestion[schema.type](fullKey, parentSchema, schema) :
|
|
169
|
+
null);
|
|
170
|
+
};
|
|
171
|
+
const formatProperty = (prop) => (Object.assign(Object.assign({ '@type': SchemaType.Property }, prop), { term: Object.assign({ '@type': NodeType.Term }, prop.term) }));
|
|
172
|
+
export const formatSuggestion = (_c) => {
|
|
173
|
+
var { defaultProperties } = _c, node = __rest(_c, ["defaultProperties"]);
|
|
174
|
+
return (Object.assign(Object.assign({}, node), (defaultProperties ? { defaultProperties: defaultProperties.map(formatProperty) } : {})));
|
|
175
|
+
};
|
|
176
|
+
export const nodeAvailableProperties = (node, { fullKey, schema, schemaType }) => availableProperties(schema, schemaType, fullKey ? get(node, fullKey, {}) : node, fullKey.length > 0);
|
|
177
|
+
export const isAddPropertyEnabled = (node, schemaType, schema, fullKey = '') => !!schema &&
|
|
178
|
+
!!Object.keys(nodeAvailableProperties(node, { fullKey, schema })).length &&
|
|
179
|
+
(!fullKey || nestingTypeEnabled(schemaType));
|
|
180
|
+
const editableKey = (key) => !['type', '@type', 'termType'].includes(key);
|
|
181
|
+
export const propertyId = () => uuidv4();
|
|
182
|
+
const propertyUrl = (node, key) => ['@id', 'name'].includes(key) && linkTypeEnabled(node['@type']) ?
|
|
183
|
+
{
|
|
184
|
+
url: `${baseUrl()}/${node['@type'].toLowerCase()}/${node['@id']}`,
|
|
185
|
+
title: 'Open'
|
|
186
|
+
} :
|
|
187
|
+
(node.type === SchemaType.Term && ['name'].includes(key) ? {
|
|
188
|
+
url: `${baseUrl()}/glossary?query=`,
|
|
189
|
+
urlParamValue: true,
|
|
190
|
+
title: 'Search in Glossary'
|
|
191
|
+
} : undefined);
|
|
192
|
+
const propertyMapsUrl = (node, key, value) => ['type'].includes(key) && [
|
|
193
|
+
SchemaType.Site.toString(),
|
|
194
|
+
SchemaType.Organisation.toString()
|
|
195
|
+
].includes(stringValue(value) || node.type) ?
|
|
196
|
+
{
|
|
197
|
+
url: mapsUrl({ lat: node.latitude, lng: node.longitude }),
|
|
198
|
+
title: 'View on maps',
|
|
199
|
+
icon: 'map'
|
|
200
|
+
} :
|
|
201
|
+
undefined;
|
|
202
|
+
const propertyExternalUrl = (node, key, value) => propertyUrl(node, key) ||
|
|
203
|
+
propertyMapsUrl(node, key, value);
|
|
204
|
+
const arrayPlaceholder = (valueType) => `Type a ${valueType} then press Enter`;
|
|
205
|
+
const defaultPlaceholder = ({ type, examples }, valueType) => (examples === null || examples === void 0 ? void 0 : examples.length) ? (Array.isArray(examples[0]) ? arrayPlaceholder(valueType) : examples[0]) : `Must be of type ${type || valueType}`;
|
|
206
|
+
const schemaPlacholder = (schema, fullKey) => {
|
|
207
|
+
const [parent, ...keys] = fullKey.split('.');
|
|
208
|
+
const properties = schema.properties || {};
|
|
209
|
+
const { examples } = parent in properties ? properties[parent] : { examples: [] };
|
|
210
|
+
return (examples === null || examples === void 0 ? void 0 : examples.length) && typeof examples[0] === 'object' ? get(examples[0], keys.join('.'), null) : null;
|
|
211
|
+
};
|
|
212
|
+
const propertyPlaceholder = (schema, valueType, fullKey = '', parentSchema) => schema.type === 'array' ?
|
|
213
|
+
arrayPlaceholder(valueType) : (parentSchema && (fullKey === null || fullKey === void 0 ? void 0 : fullKey.length) ? schemaPlacholder(parentSchema, fullKey) : null) || defaultPlaceholder(schema, valueType);
|
|
214
|
+
const propertyTypeValue = {
|
|
215
|
+
object: val => safeJSONStringify(val),
|
|
216
|
+
array: (val, schema) => {
|
|
217
|
+
const { items } = schema;
|
|
218
|
+
return '$ref' in items ? val : (Array.isArray(val) ?
|
|
219
|
+
val.map(value => propertyValue(items, value)).join(ARRAY_DELIMITER) :
|
|
220
|
+
val);
|
|
221
|
+
},
|
|
222
|
+
json: val => val || '',
|
|
223
|
+
string: val => (`${val}` || '').trim(),
|
|
224
|
+
number: val => +(`${val}` || '0'),
|
|
225
|
+
integer: val => +(`${val}` || '0'),
|
|
226
|
+
boolean: val => (`${val}` || '').toLowerCase() === 'true'
|
|
227
|
+
};
|
|
228
|
+
const propertyValue = (schema, value) => schema.type ? (Array.isArray(schema.type) ?
|
|
229
|
+
propertyTypeValue[typeof value](value, schema) :
|
|
230
|
+
propertyTypeValue[schema.type](value, schema)) :
|
|
231
|
+
safeJSONStringify(value);
|
|
232
|
+
const propertyValueType = (schema, value) => (schema.type ? (Array.isArray(schema.type) ?
|
|
233
|
+
schema.type[0] :
|
|
234
|
+
schema.type === 'array' ?
|
|
235
|
+
propertyValueType(Object.assign(Object.assign({}, schema), { type: [schema.items.type] })) :
|
|
236
|
+
schema.type) : typeof value);
|
|
237
|
+
const propertyTypeParseValue = {
|
|
238
|
+
object: val => safeJSONParse(val),
|
|
239
|
+
array: (val, schema) => {
|
|
240
|
+
const { items } = schema;
|
|
241
|
+
return '$ref' in items ? val : (!val || Array.isArray(val) ? val : val.split(ARRAY_DELIMITER).map(value => parseNewValue(items, value)));
|
|
242
|
+
},
|
|
243
|
+
json: val => val || '',
|
|
244
|
+
string: val => (`${val}` || '').trim(),
|
|
245
|
+
number: val => +(`${val}` || '0'),
|
|
246
|
+
integer: val => +(`${val}` || '0'),
|
|
247
|
+
boolean: val => (`${val}` || '').toLowerCase() === 'true'
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* Convert value to the final type in the schema.
|
|
251
|
+
*
|
|
252
|
+
* @param schema Definition of the value.
|
|
253
|
+
* @param value
|
|
254
|
+
* @returns Value in the correct format.
|
|
255
|
+
*/
|
|
256
|
+
export const parseNewValue = (schema, value) => schema.type ? (Array.isArray(schema.type) ?
|
|
257
|
+
propertyTypeParseValue[typeof value](value, schema) :
|
|
258
|
+
propertyTypeParseValue[schema.type](value, schema)) : value;
|
|
259
|
+
const isOpenDefault = (schemaType) => [
|
|
260
|
+
SchemaType.Term
|
|
261
|
+
].includes(schemaType);
|
|
262
|
+
// can the property be seen when the group is closed
|
|
263
|
+
const isKeyClosedVisible = (key) => ['type', 'id', '@type', '@id'].includes(key);
|
|
264
|
+
const isKeyHidden = (key) => ['type', '@type'].includes(key);
|
|
265
|
+
const isKeyRequired = (key, def) => ['type', 'id'].includes(key) || ((def === null || def === void 0 ? void 0 : def.required) || []).includes(key);
|
|
266
|
+
export const propertyError = (errors) => (dataPath, nonExpandableArray = false) => errors.find(error => (error.dataPath === dataPath || (nonExpandableArray && nonExpandableArrayDataPath(error.dataPath) === nonExpandableArrayDataPath(dataPath))) && (dataPath.length > 0 || !isMissingPropertyError(error)));
|
|
267
|
+
const missingPropertyErrors = (node, errors, parent = '') => {
|
|
268
|
+
const allErrors = errors.filter(error => error.dataPath === keyToDataPath(parent) && isMissingPropertyError(error));
|
|
269
|
+
// check for node not found errors
|
|
270
|
+
const missingNode = missingNodeErrors(allErrors);
|
|
271
|
+
return missingNode.length === 2 ? [{
|
|
272
|
+
id: propertyId(),
|
|
273
|
+
schemaType: node.type,
|
|
274
|
+
suggestions: { type: defaultSuggestionType },
|
|
275
|
+
key: '',
|
|
276
|
+
fullKey: parent,
|
|
277
|
+
value: '',
|
|
278
|
+
error: {
|
|
279
|
+
level: 'error',
|
|
280
|
+
message: missingNodeErrorMessage(node)
|
|
281
|
+
},
|
|
282
|
+
hasError: true,
|
|
283
|
+
properties: [],
|
|
284
|
+
addPropertyEnabled: false
|
|
285
|
+
}] : allErrors.map(error => {
|
|
286
|
+
const { missingProperty } = error.params;
|
|
287
|
+
const fullKey = parent ? `${parent}.${missingProperty}` : missingProperty;
|
|
288
|
+
const missingOneOf = isMissingOneOfError(error);
|
|
289
|
+
return {
|
|
290
|
+
id: propertyId(),
|
|
291
|
+
schemaType: node.type,
|
|
292
|
+
suggestions: { type: defaultSuggestionType },
|
|
293
|
+
key: missingProperty,
|
|
294
|
+
fullKey,
|
|
295
|
+
value: 'Add field to fix',
|
|
296
|
+
editable: false,
|
|
297
|
+
error: formatError(error),
|
|
298
|
+
hasError: missingOneOf ? false : errorHasError(error),
|
|
299
|
+
hasWarning: missingOneOf || errorHasWarning(error),
|
|
300
|
+
properties: [],
|
|
301
|
+
addPropertyEnabled: true
|
|
302
|
+
};
|
|
303
|
+
});
|
|
304
|
+
};
|
|
305
|
+
const propertyFromNode = (schemas, errors, nodeSchema, deepEditable, parent = '', node) => (key) => {
|
|
306
|
+
const value = node[key];
|
|
307
|
+
const expandable = isExpandable(value);
|
|
308
|
+
const isArray = Array.isArray(value);
|
|
309
|
+
const nonExpandableArray = isArray && !expandable;
|
|
310
|
+
const fullKey = Array.isArray(node) ? `${parent}[${key}]` : [
|
|
311
|
+
parent,
|
|
312
|
+
key
|
|
313
|
+
].filter(Boolean).join('.');
|
|
314
|
+
const nodeType = node.type || node['@type'];
|
|
315
|
+
const schemaType = expandable ? (isArray && value.length ? value[0].type || value[0]['@type'] : value.type || value['@type']) : nodeType;
|
|
316
|
+
const schema = (schemas && isTypeValid({ type: schemaType }) ? (expandable ? schemas[schemaType] : schemas[schemaType].properties[key]) : null) || {};
|
|
317
|
+
const isIri = isSchemaIri(schema);
|
|
318
|
+
const error = propertyError(errors)(keyToDataPath(fullKey), nonExpandableArray);
|
|
319
|
+
const parentSchema = expandable ? (
|
|
320
|
+
// TODO: for non-array, should be schema unless last recursion
|
|
321
|
+
isArray ? schema : nodeSchema) : nodeSchema;
|
|
322
|
+
const properties = expandable || isIri ?
|
|
323
|
+
recursiveProperties(schemas, errors, parentSchema, deepEditable, fullKey)(value) : [];
|
|
324
|
+
const inError = errorHasError(error) || hasError(properties);
|
|
325
|
+
const inWarning = errorHasWarning(error) || hasWarning(properties);
|
|
326
|
+
const editable = isTypeNode(node['@type']) || (expandable && isTypeNode(value['@type'])) ?
|
|
327
|
+
false :
|
|
328
|
+
(
|
|
329
|
+
// prevent editing/adding new properties on existing sub-nodes
|
|
330
|
+
!deepEditable && isTypeNode(schemaType) && (expandable ? value.type !== NodeType.Term : parent && node.type !== NodeType.Term) ?
|
|
331
|
+
false :
|
|
332
|
+
// handle IRI
|
|
333
|
+
(!schemaType && key === '@id') || editableKey(key));
|
|
334
|
+
const valueType = propertyValueType(schema, value);
|
|
335
|
+
return {
|
|
336
|
+
id: propertyId(),
|
|
337
|
+
schemaType: isIri ? null : schemaType,
|
|
338
|
+
schema,
|
|
339
|
+
key,
|
|
340
|
+
fullKey,
|
|
341
|
+
value: propertyValue(schema, value),
|
|
342
|
+
editable: inError || editable,
|
|
343
|
+
suggestions: enableSuggestions(nodeSchema, node.type, fullKey, schema),
|
|
344
|
+
addPropertyEnabled: isAddPropertyEnabled(node, schemaType, schema, fullKey),
|
|
345
|
+
newProperty: {},
|
|
346
|
+
newError: { level: 'warning' },
|
|
347
|
+
error: formatError(error),
|
|
348
|
+
isHidden: parent && isKeyHidden(key),
|
|
349
|
+
closedVisible: isKeyClosedVisible(key),
|
|
350
|
+
hasError: inError,
|
|
351
|
+
hasWarning: inWarning,
|
|
352
|
+
isRequired: isKeyRequired(key, schemas[nodeType]),
|
|
353
|
+
isArray,
|
|
354
|
+
isExpandable: expandable,
|
|
355
|
+
isOpen: isOpenDefault(schemaType),
|
|
356
|
+
properties,
|
|
357
|
+
placeholder: propertyPlaceholder(schema, valueType, fullKey, parentSchema),
|
|
358
|
+
externalUrl: propertyExternalUrl(node, key, value)
|
|
359
|
+
};
|
|
360
|
+
};
|
|
361
|
+
export const singleProperty = (schemas, errors, node, fullKey) => {
|
|
362
|
+
const [_t, ...keys] = fullKey.split('.');
|
|
363
|
+
const key = keys.pop();
|
|
364
|
+
const parent = keys.join('.');
|
|
365
|
+
const parentNode = parent.length ? get(node, parent) : node;
|
|
366
|
+
const schemaType = typeToSchemaType(parentNode.type || parentNode['@type']);
|
|
367
|
+
const parentSchema = schemas[schemaType];
|
|
368
|
+
return propertyFromNode(schemas, errors, parentSchema, true, parent, parentNode)(key);
|
|
369
|
+
};
|
|
370
|
+
export const recursiveProperties = (schemas, errors, nodeSchema, deepEditable, parent = '') => (node) => Object.keys(node)
|
|
371
|
+
.filter(key => !privateKeys.includes(key))
|
|
372
|
+
.map(propertyFromNode(schemas, errors, nodeSchema, deepEditable, parent, node))
|
|
373
|
+
.concat(...missingPropertyErrors(node, errors, parent))
|
|
374
|
+
.sort(sortProperties);
|
|
375
|
+
const fullKeyParts = (fullKey) => fullKey.split('.').flatMap(val => {
|
|
376
|
+
if (val.endsWith(']')) {
|
|
377
|
+
const [key, index] = val.split('[');
|
|
378
|
+
return [key, index.replace(']', '')];
|
|
379
|
+
}
|
|
380
|
+
return val;
|
|
381
|
+
});
|
|
382
|
+
export const updateProperties = ({ properties }, updater) => (properties || []).map(prop => updateProperties(updater(prop), updater));
|
|
383
|
+
export const typeToNewProperty = (schemas, schema, nodeSchema, node, fullKey) => {
|
|
384
|
+
const key = fullKeyParts(fullKey).pop();
|
|
385
|
+
const mappings = {
|
|
386
|
+
object: () => {
|
|
387
|
+
const { schemaType, properties } = schemaRequiredProperties(schemas, schema);
|
|
388
|
+
node[key] = node[key] || {};
|
|
389
|
+
node[key].type = schemaType;
|
|
390
|
+
// TODO: handle load schemas from http source
|
|
391
|
+
if (schemaType.startsWith('http')) {
|
|
392
|
+
return typeToNewProperty(schemas, { type: 'json' }, nodeSchema, node, fullKey);
|
|
393
|
+
}
|
|
394
|
+
// TODO: handle nodeSchema should be schema unless last recursion
|
|
395
|
+
const props = properties
|
|
396
|
+
.filter(prop => nestingEnabled(schemaType, prop.key) && !!prop.value)
|
|
397
|
+
.map(v => (Object.assign(Object.assign({}, typeToNewProperty(schemas, v.value, nodeSchema, node[key], `${fullKey}.${v.key}`)), { isRequired: true })));
|
|
398
|
+
const value = props.reduce((prev, curr) => (Object.assign(Object.assign({}, prev), { [curr.key]: curr.value })), {});
|
|
399
|
+
return {
|
|
400
|
+
id: propertyId(),
|
|
401
|
+
isAdded: true,
|
|
402
|
+
schema: schemas[schemaType],
|
|
403
|
+
schemaType,
|
|
404
|
+
key,
|
|
405
|
+
fullKey,
|
|
406
|
+
value,
|
|
407
|
+
editable: editableKey(key),
|
|
408
|
+
isHidden: isKeyHidden(key),
|
|
409
|
+
closedVisible: isKeyClosedVisible(key),
|
|
410
|
+
suggestions: enableSuggestions(nodeSchema, schemaType, fullKey),
|
|
411
|
+
properties: props.sort(sortProperties),
|
|
412
|
+
addPropertyEnabled: isAddPropertyEnabled(node, schemaType, schemas[schemaType], key),
|
|
413
|
+
newProperty: {},
|
|
414
|
+
newError: { level: 'warning' },
|
|
415
|
+
isRequired: isKeyRequired(key, schema),
|
|
416
|
+
isArray: false,
|
|
417
|
+
isExpandable: true,
|
|
418
|
+
isOpen: isOpenDefault(schemaType)
|
|
419
|
+
};
|
|
420
|
+
},
|
|
421
|
+
array: () => {
|
|
422
|
+
const { items } = schema;
|
|
423
|
+
// array of string, number and boolean
|
|
424
|
+
if (items.type) {
|
|
425
|
+
return mappings.default();
|
|
426
|
+
}
|
|
427
|
+
const schemaType = definitionToSchemaType(items);
|
|
428
|
+
node[key] = node[key] || [];
|
|
429
|
+
node[key].push({});
|
|
430
|
+
const property = typeToNewProperty(schemas, items, schemas[schemaType], node[key][0], `${fullKey}[0]`);
|
|
431
|
+
return {
|
|
432
|
+
id: propertyId(),
|
|
433
|
+
isAdded: true,
|
|
434
|
+
schema,
|
|
435
|
+
schemaType,
|
|
436
|
+
key,
|
|
437
|
+
fullKey,
|
|
438
|
+
value: [property.value],
|
|
439
|
+
editable: editableKey(key),
|
|
440
|
+
isHidden: isKeyHidden(key),
|
|
441
|
+
closedVisible: isKeyClosedVisible(key),
|
|
442
|
+
suggestions: undefined,
|
|
443
|
+
properties: [property],
|
|
444
|
+
newProperty: {},
|
|
445
|
+
newError: { level: 'warning' },
|
|
446
|
+
isArray: true,
|
|
447
|
+
isExpandable: true,
|
|
448
|
+
addPropertyEnabled: false
|
|
449
|
+
};
|
|
450
|
+
},
|
|
451
|
+
default: () => {
|
|
452
|
+
const valueType = propertyValueType(schema);
|
|
453
|
+
const value = schema.default || schema.const || valueTypeToDefault[valueType];
|
|
454
|
+
node[key] = value;
|
|
455
|
+
return {
|
|
456
|
+
id: propertyId(),
|
|
457
|
+
isAdded: true,
|
|
458
|
+
schema,
|
|
459
|
+
schemaType: node.type,
|
|
460
|
+
key,
|
|
461
|
+
fullKey,
|
|
462
|
+
value: propertyValue(schema, value),
|
|
463
|
+
editable: editableKey(key),
|
|
464
|
+
isHidden: isKeyHidden(key),
|
|
465
|
+
closedVisible: isKeyClosedVisible(key),
|
|
466
|
+
suggestions: enableSuggestions(nodeSchema, node.type, fullKey, schema),
|
|
467
|
+
placeholder: propertyPlaceholder(schema, valueType, fullKey, nodeSchema),
|
|
468
|
+
externalUrl: propertyExternalUrl(node, key, value),
|
|
469
|
+
properties: [],
|
|
470
|
+
addPropertyEnabled: false
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
};
|
|
474
|
+
const mapped = !schema.type ? mappings.object : (schema.type in mappings ? mappings[schema.type] : mappings.default);
|
|
475
|
+
return mapped();
|
|
476
|
+
};
|
|
477
|
+
export const findProperty = (properties, fullKey) => {
|
|
478
|
+
for (const p of properties) {
|
|
479
|
+
if (p.fullKey === fullKey) {
|
|
480
|
+
return p;
|
|
481
|
+
}
|
|
482
|
+
const childP = findProperty(p.properties, fullKey);
|
|
483
|
+
if (childP) {
|
|
484
|
+
return childP;
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
return null;
|
|
488
|
+
};
|
|
489
|
+
export const parentProperty = (properties, property) => {
|
|
490
|
+
var _c;
|
|
491
|
+
const allKeys = property.fullKey.split('.');
|
|
492
|
+
[...new Array(((_c = property.suggestions) === null || _c === void 0 ? void 0 : _c.parentLevel) || 0)].map(() => allKeys.pop());
|
|
493
|
+
const parentKeys = fullKeyParts(allKeys.join('.'));
|
|
494
|
+
parentKeys.pop();
|
|
495
|
+
const parent = parentKeys.reduce((prev, curr, currIndex) => {
|
|
496
|
+
const prop = prev.find(v => v.key === curr);
|
|
497
|
+
return currIndex === parentKeys.length - 1 ? (prop || {}) : (prop.properties || []);
|
|
498
|
+
}, properties);
|
|
499
|
+
return Array.isArray(parent) ? property : parent;
|
|
500
|
+
};
|
|
501
|
+
export const nestedProperty = ({ properties }, nestedKey) => properties.find(({ key }) => key === nestedKey);
|
|
502
|
+
export const siblingProperty = (properties, property, siblingKey) => {
|
|
503
|
+
const parent = parentProperty(properties, property);
|
|
504
|
+
const parentProperties = parent === property ? properties : parent.properties;
|
|
505
|
+
return parentProperties.find(prop => prop.key === siblingKey);
|
|
506
|
+
};
|
|
507
|
+
export const groupChanged = (properties, key, value) => {
|
|
508
|
+
try {
|
|
509
|
+
const parentKeys = fullKeyParts(key);
|
|
510
|
+
parentKeys.reduce((prev, curr, currIndex) => {
|
|
511
|
+
if (currIndex === parentKeys.length - 1 && value === null) {
|
|
512
|
+
return prev.splice(prev.findIndex(v => v.key === curr), 1);
|
|
513
|
+
}
|
|
514
|
+
else {
|
|
515
|
+
const prop = prev.find(v => v.key === curr);
|
|
516
|
+
prop.changed = true;
|
|
517
|
+
return prop.properties;
|
|
518
|
+
}
|
|
519
|
+
}, properties);
|
|
520
|
+
}
|
|
521
|
+
catch (_err) { }
|
|
522
|
+
};
|
|
523
|
+
export const refreshPropertyKeys = (property) => property.properties.map((prop, i) => {
|
|
524
|
+
prop.fullKey = `${property.fullKey}${property.isArray ? `[${i}]` : `.${prop.key}`}`;
|
|
525
|
+
prop.key = property.isArray ? `${i}` : prop.key;
|
|
526
|
+
return refreshPropertyKeys(prop);
|
|
527
|
+
});
|
|
528
|
+
export const calculateCycleDurationEnabled = (properties, property) => {
|
|
529
|
+
const startDate = siblingProperty(properties, property, 'startDate');
|
|
530
|
+
const endDate = siblingProperty(properties, property, 'endDate');
|
|
531
|
+
return !!(startDate === null || startDate === void 0 ? void 0 : startDate.value) && !!(endDate === null || endDate === void 0 ? void 0 : endDate.value);
|
|
532
|
+
};
|
|
533
|
+
export const calculateCycleDuration = (properties, property) => {
|
|
534
|
+
const startDate = siblingProperty(properties, property, 'startDate');
|
|
535
|
+
const endDate = siblingProperty(properties, property, 'endDate');
|
|
536
|
+
return diffInDays(startDate.value, endDate.value);
|
|
537
|
+
};
|
|
538
|
+
export const calculateCycleStartDateEnabled = (properties, property) => {
|
|
539
|
+
const cycleDuration = siblingProperty(properties, property, 'cycleDuration');
|
|
540
|
+
const endDate = siblingProperty(properties, property, 'endDate');
|
|
541
|
+
return !!(cycleDuration === null || cycleDuration === void 0 ? void 0 : cycleDuration.value) && !!(endDate === null || endDate === void 0 ? void 0 : endDate.value);
|
|
542
|
+
};
|
|
543
|
+
export const calculateCycleStartDate = (properties, property) => {
|
|
544
|
+
const cycleDuration = siblingProperty(properties, property, 'cycleDuration');
|
|
545
|
+
const endDate = siblingProperty(properties, property, 'endDate');
|
|
546
|
+
return moment(endDate.value).locale('en-gb').subtract(cycleDuration.value, 'days').format('YYYY-MM-DD');
|
|
547
|
+
};
|
|
548
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXMtZm9ybS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9maWxlcy9maWxlcy1mb3JtLm1vZGVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSwrQkFBK0I7QUFDL0IsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLE9BQU8sS0FBSyxNQUFNLE1BQU0sUUFBUSxDQUFDO0FBQ2pDLE9BQU8scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUFFLEVBQUUsSUFBSSxNQUFNLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDcEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxPQUFPLEVBQ2UsVUFBVSxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFDakQsZ0JBQWdCLEVBQy9DLE1BQU0sc0JBQXNCLENBQUM7QUFLOUIsT0FBTyxFQUNhLHdCQUF3QixFQUFFLFdBQVcsRUFDdkQsdUJBQXVCLEVBQUUsc0JBQXNCLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFDL0UsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQ3ZDLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLHdCQUF3QixFQUFFLGtCQUFrQixFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixFQUN6RixrQkFBa0IsRUFBRSxjQUFjLEVBQUUsZUFBZSxFQUFFLFdBQVcsRUFDakUsTUFBTSwwQkFBMEIsQ0FBQztBQUNsQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFckYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEdBQUcsQ0FBQztBQUNuQyxNQUFNLFdBQVcsR0FBRztJQUNsQixVQUFVO0NBQ1gs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S0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUMxRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBjb21wbGV4aXR5ICovXG5jb25zdCBnZXQgPSByZXF1aXJlKCdsb2Rhc2guZ2V0Jyk7XG5pbXBvcnQgKiBhcyBtb21lbnQgZnJvbSAnbW9tZW50JztcbmltcG9ydCAnbW9tZW50L2xvY2FsZS9lbi1nYic7XG5pbXBvcnQgeyB2NCBhcyB1dWlkdjQgfSBmcm9tICd1dWlkJztcbmltcG9ydCB7IGRpZmZJbkRheXMsIGlzTnVtYmVyIH0gZnJvbSAnQGhlc3RpYS1lYXJ0aC91dGlscyc7XG5pbXBvcnQge1xuICBKU09OIGFzIEhlc3RpYUpzb24sIFNjaGVtYVR5cGUsIE5vZGVUeXBlLCBpc1R5cGVOb2RlLCBpc1R5cGVWYWxpZCwgaXNFeHBhbmRhYmxlLFxuICBTaXRlLCBPcmdhbmlzYXRpb24sIFByb3BlcnR5LCB0eXBlVG9TY2hlbWFUeXBlXG59IGZyb20gJ0BoZXN0aWEtZWFydGgvc2NoZW1hJztcbmltcG9ydCB7XG4gIGRlZmluaXRpb25zLCBkZWZpbml0aW9uLCBJRGVmaW5pdGlvbk9iamVjdCwgSURlZmluaXRpb25BcnJheSwgZ2VuZXJpY1R5cGVcbn0gZnJvbSAnQGhlc3RpYS1lYXJ0aC9qc29uLXNjaGVtYSc7XG5cbmltcG9ydCB7XG4gIElWYWxpZGF0aW9uRXJyb3IsIGZvcm1hdEN1c3RvbUVycm9yTWVzc2FnZSwgZm9ybWF0RXJyb3IsXG4gIG1pc3NpbmdOb2RlRXJyb3JNZXNzYWdlLCBpc01pc3NpbmdQcm9wZXJ0eUVycm9yLCBlcnJvckhhc0Vycm9yLCBlcnJvckhhc1dhcm5pbmcsIHZhbGlkYXRpb25FcnJvckxldmVsLFxuICBtaXNzaW5nTm9kZUVycm9ycywgaXNNaXNzaW5nT25lT2ZFcnJvclxufSBmcm9tICcuL2ZpbGVzLWVycm9yLm1vZGVsJztcbmltcG9ydCB7XG4gIHNjaGVtYVJlcXVpcmVkUHJvcGVydGllcywgdmFsdWVUeXBlVG9EZWZhdWx0LCBkZWZpbml0aW9uVG9TY2hlbWFUeXBlLCBhdmFpbGFibGVQcm9wZXJ0aWVzLFxuICBuZXN0aW5nVHlwZUVuYWJsZWQsIG5lc3RpbmdFbmFibGVkLCBsaW5rVHlwZUVuYWJsZWQsIGlzU2NoZW1hSXJpXG59IGZyb20gJy4uL3NjaGVtYS9zY2hlbWEuc2VydmljZSc7XG5pbXBvcnQgeyBtYXRjaENvdW50cnkgfSBmcm9tICcuLi9zZWFyY2gvc2VhcmNoLm1vZGVsJztcbmltcG9ydCB7IGJhc2VVcmwsIG1hcHNVcmwsIHNhZmVKU09OUGFyc2UsIHNhZmVKU09OU3RyaW5naWZ5IH0gZnJvbSAnLi4vY29tbW9uL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IEFSUkFZX0RFTElNSVRFUiA9ICc7JztcbmNvbnN0IHByaXZhdGVLZXlzID0gW1xuICAnZmlsZXBhdGgnXG5dO1xuXG5leHBvcnQgdHlwZSBzdWdnZXN0aW9uVHlwZSA9IE5vZGVUeXBlIHwgJ3NlbGVjdCcgfCAnZGVmYXVsdCc7XG5leHBvcnQgY29uc3QgZGVmYXVsdFN1Z2dlc3Rpb25UeXBlOiBzdWdnZXN0aW9uVHlwZSA9ICdkZWZhdWx0JztcblxuaW50ZXJmYWNlIElOb2RlUHJvcGVydHlTdWdnZXN0aW9uIHtcbiAgdHlwZT86IHN1Z2dlc3Rpb25UeXBlO1xuICBxdWVyaWVzPzogYW55W107XG4gIHZhbHVlcz86IHN0cmluZ1tdO1xuICBwYXJlbnRMZXZlbD86IG51bWJlcjtcbiAgaXNMaW5rTm9kZT86IGJvb2xlYW47XG4gIGlzVW5pcXVlS2V5Pzogc3RyaW5nO1xufVxuXG5pbnRlcmZhY2UgSU5ld1Byb3BlcnR5IHtcbiAgbmFtZT86IHN0cmluZztcbiAgcHJvcD86IGRlZmluaXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSUVycm9yUHJvcGVydHkge1xuICBsZXZlbD86IHZhbGlkYXRpb25FcnJvckxldmVsO1xuICBtZXNzYWdlPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElOb2RlUHJvcGVydHkge1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdGhpcyBwcm9wZXJ0eSB3YXMgYWRkZWQgYnkgdGhlIHVzZXJcbiAgICovXG4gIGlkOiBzdHJpbmc7XG4gIGlzQWRkZWQ/OiBib29sZWFuO1xuICBzY2hlbWFUeXBlOiBTY2hlbWFUeXBlO1xuICBrZXk6IHN0cmluZztcbiAgZnVsbEtleTogc3RyaW5nO1xuICB2YWx1ZTogYW55O1xuICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGJvb2xlYW47XG4gIHN1Z2dlc3Rpb25zPzogSU5vZGVQcm9wZXJ0eVN1Z2dlc3Rpb247XG4gIHNjaGVtYT86IGRlZmluaXRpb247XG4gIGVycm9yPzogSVZhbGlkYXRpb25FcnJvcjtcbiAgaGFzRXJyb3I/OiBib29sZWFuO1xuICBoYXNXYXJuaW5nPzogYm9vbGVhbjtcbiAgZWRpdGFibGU/OiBib29sZWFuO1xuICBjbG9zZWRWaXNpYmxlPzogYm9vbGVhbjtcbiAgbmV3UHJvcGVydHk/OiBJTmV3UHJvcGVydHk7XG4gIG5ld0Vycm9yPzogSUVycm9yUHJvcGVydHk7XG4gIGlzUmVxdWlyZWQ/OiBib29sZWFuO1xuICBpc0hpZGRlbj86IGJvb2xlYW47XG4gIGlzQXJyYXk/OiBib29sZWFuO1xuICBpc0V4cGFuZGFibGU/OiBib29sZWFuO1xuICBpc09wZW4/OiBib29sZWFuO1xuICBwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W107XG4gIHBsYWNlaG9sZGVyPzogc3RyaW5nO1xuICBleHRlcm5hbFVybD86IHtcbiAgICB1cmw/OiBzdHJpbmc7XG4gICAgdGl0bGU6IHN0cmluZztcbiAgICAvLyBkZWZhdWx0IGlzIGV4dGVybmFsLWxpbmstYWx0XG4gICAgaWNvbj86IHN0cmluZztcbiAgICB1cmxQYXJhbVZhbHVlPzogYm9vbGVhbjtcbiAgfTtcbiAgLy8gbWFraW5nIGNoYW5nZXMgb24gdGhlIHByb3BlcnR5XG4gIGxvYWRpbmc/OiBib29sZWFuO1xuICAvLyB1c2VyIG1hZGUgY2hhbmdlcyB0byB0aGUgb3JpZ2luYWwgdmFsdWVcbiAgY2hhbmdlZD86IGJvb2xlYW47XG59XG5cbmNvbnN0IHN0cmluZ1ZhbHVlID0gKHZhbHVlOiBhbnkpID0+ICh0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnIHx8IHZhbHVlID09PSBudWxsID8gJycgOiB2YWx1ZSkudG9TdHJpbmcoKTtcbmNvbnN0IG5vbkV4cGFuZGFibGVBcnJheURhdGFQYXRoID0gKGtleTogc3RyaW5nKSA9PiBrZXkucmVwbGFjZSgvXFxbXFxkK1xcXSQvLCAnJyk7XG5leHBvcnQgY29uc3Qga2V5VG9EYXRhUGF0aCA9IChrZXk6IHN0cmluZykgPT4ga2V5Py5sZW5ndGggPyBgLiR7a2V5fWAgOiAnJztcbmV4cG9ydCBjb25zdCBkYXRhUGF0aFRvS2V5ID0gKGRhdGFQYXRoOiBzdHJpbmcsIHRyaW1BcnJheSA9IGZhbHNlKSA9PlxuICB0cmltQXJyYXkgPyBub25FeHBhbmRhYmxlQXJyYXlEYXRhUGF0aChkYXRhUGF0aC5zdWJzdHJpbmcoMSkpIDogZGF0YVBhdGguc3Vic3RyaW5nKDEpO1xuZXhwb3J0IGNvbnN0IHBhcmVudEtleSA9IChrZXk6IHN0cmluZykgPT4ge1xuICBjb25zdCBrZXlzID0gKGtleS5zdGFydHNXaXRoKCcuJykgPyBrZXkuc3Vic3RyaW5nKDEpIDoga2V5KS5zcGxpdCgnLicpO1xuICBrZXlzLnBvcCgpO1xuICByZXR1cm4ga2V5cy5qb2luKCcuJyk7XG59O1xuXG4vKipcbiAqIFNvcnQgcHJvcGVydGllcyBoYXZpbmcgZXJyb3JzLCB0eXBlLCBpZCwgLi4ucHJvcGVydGllcyAoc2ltcGxlKSwgYW5kIGZpbmFsbHkgdGhlIGdyb3Vwc1xuICpcbiAqIEBwYXJhbSBhIHtJTm9kZVByb3BlcnR5fVxuICogQHBhcmFtIGIge0lOb2RlUHJvcGVydHl9XG4gKi9cbmV4cG9ydCBjb25zdCBzb3J0UHJvcGVydGllcyA9IChhOiBJTm9kZVByb3BlcnR5LCBiOiBJTm9kZVByb3BlcnR5KSA9PiB7XG4gIGlmIChpc051bWJlcihhLmtleSkgJiYgaXNOdW1iZXIoYi5rZXkpKSB7XG4gICAgcmV0dXJuICthLmtleSAtICtiLmtleTtcbiAgfVxuICBpZiAoYS5pc0V4cGFuZGFibGUpIHtcbiAgICByZXR1cm4gYi5pc0V4cGFuZGFibGUgPyBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KSA6IDE7XG4gIH1cbiAgaWYgKGIuaXNFeHBhbmRhYmxlKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmICghYS5rZXkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgY29uc3QgYUtleSA9IGEua2V5LnJlcGxhY2UoJ0AnLCAnJyk7XG4gIGNvbnN0IGJLZXkgPSBiLmtleS5yZXBsYWNlKCdAJywgJycpO1xuICBpZiAoYUtleSA9PT0gJ3R5cGUnKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGlmIChiS2V5ID09PSAndHlwZScpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYUtleSA9PT0gJ2lkJyAmJiBiS2V5ICE9PSAndHlwZScpIHtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgaWYgKGEuaGFzRXJyb3IgfHwgYS5oYXNXYXJuaW5nKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIHJldHVybiBhLmtleS5sb2NhbGVDb21wYXJlKGIua2V5KTtcbn07XG5cbmNvbnN0IGRlZmF1bHRQcm9wZXJ0eUVycm9yOiB7XG4gIFtrZXk6IHN0cmluZ106IChlcnJvcjogYW55LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkO1xufSA9IHtcbiAgbWF4OiAoeyBtYXggfSkgPT4gYHNob3VsZCBiZSA8PSAke21heH1gLFxuICBtaW46ICh7IG1pbiB9KSA9PiBgc2hvdWxkIGJlID49ICR7bWlufWAsXG4gIHBhdHRlcm46ICh7IHJlcXVpcmVkUGF0dGVybiB9KSA9PiBgc2hvdWxkIG1hdGNoIHBhdHRlcm4gXCIke3JlcXVpcmVkUGF0dGVybn1cImAsXG4gIHJlcXVpcmVkOiAoX2UsIHsgc2NoZW1hVHlwZSB9KSA9PiBzY2hlbWFUeXBlID8gYHNob3VsZCBiZSBzZXQgb3IgbGlua2VkIHRvIGFub3RoZXIgJHtzY2hlbWFUeXBlfWAgOiB1bmRlZmluZWRcbn07XG5cbmV4cG9ydCBjb25zdCBmb3JtYXRQcm9wZXJ0eUVycm9yID0gKGVycm9yczogYW55LCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBrZXkgPSBPYmplY3Qua2V5cyhlcnJvcnMpWzBdO1xuICByZXR1cm4ga2V5IGluIGRlZmF1bHRQcm9wZXJ0eUVycm9yID8gZm9ybWF0Q3VzdG9tRXJyb3JNZXNzYWdlKGRlZmF1bHRQcm9wZXJ0eUVycm9yW2tleV0oZXJyb3JzW2tleV0sIHByb3BlcnR5KSkgOiAnJztcbn07XG5cbmV4cG9ydCBjb25zdCBoYXNFcnJvciA9IHZhbHVlID0+IEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUuc29tZShoYXNFcnJvcikgOiB2YWx1ZS5oYXNFcnJvcjtcblxuZXhwb3J0IGNvbnN0IGhhc1dhcm5pbmcgPSB2YWx1ZSA9PiBBcnJheS5pc0FycmF5KHZhbHVlKSA/IHZhbHVlLnNvbWUoaGFzV2FybmluZykgOiB2YWx1ZS5oYXNXYXJuaW5nO1xuXG5jb25zdCBjb21waWxlU3VnZ2VzdGlvblF1ZXJpZXMgPSAoa2V5OiBzdHJpbmcsIGFsbE9mOiBhbnlbXSkgPT4ge1xuICBjb25zdCBjb25kaXRpb25zID0gKGFsbE9mIHx8IFtdKVxuICAgIC5maWx0ZXIodiA9PiAodi5pZj8ucmVxdWlyZWQgfHwgW10pLmluY2x1ZGVzKGtleSkpXG4gICAgLm1hcCh2ID0+IHYudGhlbj8ucHJvcGVydGllc1trZXldKVxuICAgIC5tYXAodiA9PiB2Py5pdGVtcz8ucHJvcGVydGllcyB8fCB2Py5wcm9wZXJ0aWVzKVxuICAgIC5maWx0ZXIoQm9vbGVhbik7XG4gIHJldHVybiBjb25kaXRpb25zLmxlbmd0aCA/IFt7XG4gICAgYm9vbDoge1xuICAgICAgc2hvdWxkOiBjb25kaXRpb25zLmZsYXRNYXAoY29uZCA9PiBPYmplY3Qua2V5cyhjb25kKS5mbGF0TWFwKGsgPT4gKGNvbmRba10uZW51bSB8fCBbXSkubWFwKHYgPT4gKHtcbiAgICAgICAgbWF0Y2g6IHsgW2tdOiB2IH1cbiAgICAgIH0pKSkpLFxuICAgICAgbWluaW11bV9zaG91bGRfbWF0Y2g6IDFcbiAgICB9XG4gIH1dIDogW107XG59O1xuXG4vLyBkZWZhdWx0IHN1Z2dlc3QgZm9yIGxpbmtpbmcgbm9kZXMgdG9nZXRoZXIgdXNpbmcgdGhlIGBpZGAgZmllbGRcbmNvbnN0IHN1Z2dlc3RMaW5rTm9kZXMgPSAodHlwZTogTm9kZVR5cGUsIGZ1bGxLZXk6IHN0cmluZyk6IElOb2RlUHJvcGVydHlTdWdnZXN0aW9uIHwgdW5kZWZpbmVkID0+IHtcbiAgY29uc3Qga2V5cyA9IGZ1bGxLZXkuc3BsaXQoJy4nKTtcbiAgY29uc3Qga2V5ID0ga2V5cy5wb3AoKTtcbiAgcmV0dXJuIGtleSA9PT0gJ2lkJyAmJiBrZXlzLmxlbmd0aCA+PSAxID8geyB0eXBlLCBpc0xpbmtOb2RlOiB0cnVlIH0gOiB1bmRlZmluZWQ7XG59O1xuXG5jb25zdCBzdWdnZXN0RXhpc3RpbmdOb2RlID0gKHR5cGU6IE5vZGVUeXBlLCBmdWxsS2V5OiBzdHJpbmcpOiBJTm9kZVByb3BlcnR5U3VnZ2VzdGlvbiB8IHVuZGVmaW5lZCA9PiB7XG4gIGNvbnN0IGtleXMgPSBmdWxsS2V5LnNwbGl0KCcuJyk7XG4gIGNvbnN0IGtleSA9IGtleXMucG9wKCkhO1xuICByZXR1cm4ga2V5cy5sZW5ndGggPj0gMSAmJiBbJ0BpZCcsICdvcGVuTENBSWQnXS5pbmNsdWRlcyhrZXkpID8geyB0eXBlLCBpc1VuaXF1ZUtleTogJ0BpZCcgfSA6IHVuZGVmaW5lZDtcbn07XG5cbmNvbnN0IGRlZmF1bHROb2RlVHlwZVN1Z2dlc3Rpb24gPSAodHlwZTogTm9kZVR5cGUpID0+IChmdWxsS2V5OiBzdHJpbmcpID0+XG4gIHN1Z2dlc3RMaW5rTm9kZXModHlwZSwgZnVsbEtleSkgfHwgc3VnZ2VzdEV4aXN0aW5nTm9kZSh0eXBlLCBmdWxsS2V5KTtcblxuY29uc3QgdGVybVN1Z2dlc3Rpb25zID0gKHBhcmVudDogc3RyaW5nLCB7IGFsbE9mIH06IElEZWZpbml0aW9uT2JqZWN0KSA9PiAoe1xuICB0eXBlOiBOb2RlVHlwZS5UZXJtLFxuICBxdWVyaWVzOiBbXG4gICAgLi4uY29tcGlsZVN1Z2dlc3Rpb25RdWVyaWVzKG5vbkV4cGFuZGFibGVBcnJheURhdGFQYXRoKHBhcmVudCksIGFsbE9mISksXG4gICAgLi4uKFsnY291bnRyeSddLmluY2x1ZGVzKHBhcmVudCkgPyBbbWF0Y2hDb3VudHJ5XSA6IFtdKVxuICBdXG59KTtcblxuZXhwb3J0IGNvbnN0IGZvcm1hdExpbmtOb2Rlc1N1Z2dlc3Rpb25zID0gKG5vZGVNYXA6IHsgW3R5cGUgaW4gTm9kZVR5cGVdPzogc3RyaW5nW10gfSwgdHlwZTogTm9kZVR5cGUpID0+XG4gIChub2RlTWFwW3R5cGVdIHx8IFtdKS5tYXAoaWQgPT4gKHsgdHlwZSwgaWQsIG5hbWU6IGBMaW5rIHdpdGggJHt0eXBlfTogJHtpZH1gIH0pKTtcblxuY29uc3QgdHlwZVRvU3VnZ2VzdGlvbjoge1xuICBbdHlwZSBpbiBTY2hlbWFUeXBlfE5vZGVUeXBlfGdlbmVyaWNUeXBlfCdpbnRlZ2VyJ10/OiAoXG4gICAgZnVsbEtleTogc3RyaW5nLCBwYXJlbnRTY2hlbWE/OiBkZWZpbml0aW9uLCBzY2hlbWE/OiBkZWZpbml0aW9uXG4gICkgPT4gSU5vZGVQcm9wZXJ0eVN1Z2dlc3Rpb258YW55O1xufSA9IHtcbiAgW05vZGVUeXBlLkFjdG9yXTogZGVmYXVsdE5vZGVUeXBlU3VnZ2VzdGlvbihOb2RlVHlwZS5BY3RvciksXG4gIFtOb2RlVHlwZS5DeWNsZV06IGRlZmF1bHROb2RlVHlwZVN1Z2dlc3Rpb24oTm9kZVR5cGUuQ3ljbGUpLFxuICBbTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudF06IGRlZmF1bHROb2RlVHlwZVN1Z2dlc3Rpb24oTm9kZVR5cGUuSW1wYWN0QXNzZXNzbWVudCksXG4gIFtOb2RlVHlwZS5PcmdhbmlzYXRpb25dOiBkZWZhdWx0Tm9kZVR5cGVTdWdnZXN0aW9uKE5vZGVUeXBlLk9yZ2FuaXNhdGlvbiksXG4gIFtOb2RlVHlwZS5TaXRlXTogZGVmYXVsdE5vZGVUeXBlU3VnZ2VzdGlvbihOb2RlVHlwZS5TaXRlKSxcbiAgW05vZGVUeXBlLlNvdXJjZV06IGRlZmF1bHROb2RlVHlwZVN1Z2dlc3Rpb24oTm9kZVR5cGUuU291cmNlKSxcbiAgW05vZGVUeXBlLlRlcm1dOiAoZnVsbEtleSwgcGFyZW50U2NoZW1hKSA9PiB7XG4gICAgY29uc3Qga2V5cyA9IGZ1bGxLZXkuc3BsaXQoJy4nKTtcbiAgICBjb25zdCBrZXkgPSBrZXlzLnBvcCgpITtcbiAgICByZXR1cm4gWyduYW1lJ10uaW5jbHVkZXMoa2V5KSAmJiBrZXlzLmxlbmd0aCA+PSAxID9cbiAgICAgIHRlcm1TdWdnZXN0aW9ucyhrZXlzLnBvcCgpISwgcGFyZW50U2NoZW1hIGFzIElEZWZpbml0aW9uT2JqZWN0KSA6XG4gICAgICBkZWZhdWx0Tm9kZVR5cGVTdWdnZXN0aW9uKE5vZGVUeXBlLlRlcm0pKGZ1bGxLZXkpO1xuICB9LFxuICBbU2NoZW1hVHlwZS5CaWJsaW9ncmFwaHldOiAoZnVsbEtleSkgPT4ge1xuICAgIGNvbnN0IGtleXMgPSBmdWxsS2V5LnNwbGl0KCcuJyk7XG4gICAgY29uc3Qga2V5ID0ga2V5cy5wb3AoKSE7XG4gICAgY29uc3QgcGFyZW50ID0ga2V5cy5wb3AoKSE7XG4gICAgLy8gcHJldmVudCByZXBsYWNpbmcgYSB0b3AtbGV2ZWwgc291cmNlXG4gICAgcmV0dXJuIFsndGl0bGUnLCAnZG9jdW1lbnRET0knLCAnc2NvcHVzJ10uaW5jbHVkZXMoa2V5KSAmJiBwYXJlbnQgPT09ICdiaWJsaW9ncmFwaHknICYmIGtleXMubGVuZ3RoID49IDEgPyB7XG4gICAgICB0eXBlOiBOb2RlVHlwZS5Tb3VyY2UsXG4gICAgICBwYXJlbnRMZXZlbDogMVxuICAgIH0gOiBudWxsO1xuICB9LFxuICBudW1iZXI6IChfYSwgX2IsIHNjaGVtYSkgPT4ge1xuICAgIGNvbnN0IHZhbHVlcyA9IChzY2hlbWEgYXMgYW55KS5jb25zdCA/IFsoc2NoZW1hIGFzIGFueSkuY29uc3RdIDogW107XG4gICAgcmV0dXJuIHtcbiAgICAgIHR5cGU6IHZhbHVlcy5sZW5ndGggPiAwID8gJ3NlbGVjdCcgOiBkZWZhdWx0U3VnZ2VzdGlvblR5cGUsXG4gICAgICAvLyBleGNsdWRlIHN1Z2dlc3RpbmcgU2NoZW1hVHlwZVxuICAgICAgdmFsdWVzXG4gICAgfTtcbiAgfSxcbiAgaW50ZWdlcjogKF9hLCBfYiwgc2NoZW1hKSA9PiB7XG4gICAgY29uc3QgdmFsdWVzID0gKHNjaGVtYSBhcyBhbnkpLmNvbnN0ID8gWyhzY2hlbWEgYXMgYW55KS5jb25zdF0gOiBbXTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdmFsdWVzLmxlbmd0aCA+IDAgPyAnc2VsZWN0JyA6IGRlZmF1bHRTdWdnZXN0aW9uVHlwZSxcbiAgICAgIC8vIGV4Y2x1ZGUgc3VnZ2VzdGluZyBTY2hlbWFUeXBlXG4gICAgICB2YWx1ZXNcbiAgICB9O1xuICB9LFxuICBzdHJpbmc6IChmdWxsS2V5LCBfYiwgc2NoZW1hKSA9PiB7XG4gICAgLy8gZXhjbHVkZSBzdWdnZXN0aW5nIFNjaGVtYVR5cGVcbiAgICBjb25zdCB2YWx1ZXMgPSAoc2NoZW1hIGFzIGFueSkuY29uc3QgP1xuICAgICAgWyhzY2hlbWEgYXMgYW55KS5jb25zdF0gOlxuICAgICAgKChzY2hlbWEgYXMgYW55KS5lbnVtIHx8IFtdKS5maWx0ZXIodmFsID0+ICFPYmplY3QudmFsdWVzKFNjaGVtYVR5cGUpLmluY2x1ZGVzKHZhbCkpO1xuICAgIGNvbnN0IGtleSA9IGZ1bGxLZXkuc3BsaXQoJy4nKS5wb3AoKTtcbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogdmFsdWVzLmxlbmd0aCA+IDAgJiYga2V5ICE9PSAndHlwZScgPyAnc2VsZWN0JyA6IGRlZmF1bHRTdWdnZXN0aW9uVHlwZSxcbiAgICAgIHZhbHVlc1xuICAgIH07XG4gIH0sXG4gIGJvb2xlYW46IChfYSkgPT4gKHtcbiAgICB0eXBlOiAnc2VsZWN0JyxcbiAgICB2YWx1ZXM6IFsndHJ1ZScsICdmYWxzZSddXG4gIH0pXG59O1xuXG5jb25zdCBlbmFibGVTdWdnZXN0aW9ucyA9IChcbiAgcGFyZW50U2NoZW1hOiBkZWZpbml0aW9uLCB0eXBlOiBTY2hlbWFUeXBlIHwgTm9kZVR5cGUgfCBnZW5lcmljVHlwZSwgZnVsbEtleTogc3RyaW5nLCBzY2hlbWE/OiBkZWZpbml0aW9uXG4pID0+IHtcbiAgY29uc3Qgc3VnZ2VzdGlvbiA9IHR5cGUgaW4gdHlwZVRvU3VnZ2VzdGlvbiA/IHR5cGVUb1N1Z2dlc3Rpb25bdHlwZV0hKGZ1bGxLZXksIHBhcmVudFNjaGVtYSkgOiBudWxsO1xuICByZXR1cm4gc3VnZ2VzdGlvbiAhPT0gbnVsbCA/IHN1Z2dlc3Rpb24gOiAoXG4gICAgc2NoZW1hICYmIHNjaGVtYS50eXBlIGFzIGdlbmVyaWNUeXBlIGluIHR5cGVUb1N1Z2dlc3Rpb24gP1xuICAgICAgdHlwZVRvU3VnZ2VzdGlvbltzY2hlbWEudHlwZSBhcyBnZW5lcmljVHlwZV0hKGZ1bGxLZXksIHBhcmVudFNjaGVtYSwgc2NoZW1hKSA6XG4gICAgICBudWxsXG4gICk7XG59O1xuXG5jb25zdCBmb3JtYXRQcm9wZXJ0eSA9IChwcm9wOiBQcm9wZXJ0eSkgPT4gKHtcbiAgJ0B0eXBlJzogU2NoZW1hVHlwZS5Qcm9wZXJ0eSxcbiAgLi4ucHJvcCxcbiAgdGVybToge1xuICAgICdAdHlwZSc6IE5vZGVUeXBlLlRlcm0sXG4gICAgLi4ucHJvcC50ZXJtXG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3QgZm9ybWF0U3VnZ2VzdGlvbiA9ICh7IGRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5ub2RlIH06IGFueSkgPT4gKHtcbiAgLi4ubm9kZSxcbiAgLi4uKGRlZmF1bHRQcm9wZXJ0aWVzID8geyBkZWZhdWx0UHJvcGVydGllczogZGVmYXVsdFByb3BlcnRpZXMubWFwKGZvcm1hdFByb3BlcnR5KSB9IDoge30pXG59KTtcblxuZXhwb3J0IGNvbnN0IG5vZGVBdmFpbGFibGVQcm9wZXJ0aWVzID0gKFxuICBub2RlOiBIZXN0aWFKc29uPFNjaGVtYVR5cGU+LCB7IGZ1bGxLZXksIHNjaGVtYSwgc2NoZW1hVHlwZSB9OiBQYXJ0aWFsPElOb2RlUHJvcGVydHk+XG4pID0+IGF2YWlsYWJsZVByb3BlcnRpZXMoc2NoZW1hISwgc2NoZW1hVHlwZSEsIGZ1bGxLZXkgPyBnZXQobm9kZSwgZnVsbEtleSwge30pIDogbm9kZSwgZnVsbEtleSEubGVuZ3RoID4gMCk7XG5cbmV4cG9ydCBjb25zdCBpc0FkZFByb3BlcnR5RW5hYmxlZCA9IChcbiAgbm9kZTogSGVzdGlhSnNvbjxTY2hlbWFUeXBlPiwgc2NoZW1hVHlwZTogU2NoZW1hVHlwZSwgc2NoZW1hOiBkZWZpbml0aW9uLCBmdWxsS2V5ID0gJydcbikgPT4gISFzY2hlbWEgJiZcbiAgISFPYmplY3Qua2V5cyhub2RlQXZhaWxhYmxlUHJvcGVydGllcyhub2RlLCB7IGZ1bGxLZXksIHNjaGVtYSB9KSkubGVuZ3RoICYmXG4gICghZnVsbEtleSB8fCBuZXN0aW5nVHlwZUVuYWJsZWQoc2NoZW1hVHlwZSkpO1xuXG5jb25zdCBlZGl0YWJsZUtleSA9IChrZXk6IHN0cmluZykgPT4gIVsndHlwZScsICdAdHlwZScsICd0ZXJtVHlwZSddLmluY2x1ZGVzKGtleSk7XG5cbmV4cG9ydCBjb25zdCBwcm9wZXJ0eUlkID0gKCkgPT4gdXVpZHY0KCk7XG5cbmNvbnN0IHByb3BlcnR5VXJsID0gKG5vZGU6IEhlc3RpYUpzb248U2NoZW1hVHlwZT4sIGtleTogc3RyaW5nKSA9PlxuICBbJ0BpZCcsICduYW1lJ10uaW5jbHVkZXMoa2V5KSAmJiBsaW5rVHlwZUVuYWJsZWQobm9kZVsnQHR5cGUnXSkgP1xuICAgIHtcbiAgICAgIHVybDogYCR7YmFzZVVybCgpfS8ke25vZGVbJ0B0eXBlJ10udG9Mb3dlckNhc2UoKX0vJHtub2RlWydAaWQnXX1gLFxuICAgICAgdGl0bGU6ICdPcGVuJ1xuICAgIH0gOlxuICAgIChcbiAgICAgIG5vZGUudHlwZSA9PT0gU2NoZW1hVHlwZS5UZXJtICYmIFsnbmFtZSddLmluY2x1ZGVzKGtleSkgPyB7XG4gICAgICAgIHVybDogYCR7YmFzZVVybCgpfS9nbG9zc2FyeT9xdWVyeT1gLFxuICAgICAgICB1cmxQYXJhbVZhbHVlOiB0cnVlLFxuICAgICAgICB0aXRsZTogJ1NlYXJjaCBpbiBHbG9zc2FyeSdcbiAgICAgIH0gOiB1bmRlZmluZWRcbiAgICApO1xuXG5jb25zdCBwcm9wZXJ0eU1hcHNVcmwgPSAobm9kZTogU2l0ZSB8IE9yZ2FuaXNhdGlvbiwga2V5OiBzdHJpbmcsIHZhbHVlKSA9PlxuICBbJ3R5cGUnXS5pbmNsdWRlcyhrZXkpICYmIFtcbiAgICBTY2hlbWFUeXBlLlNpdGUudG9TdHJpbmcoKSxcbiAgICBTY2hlbWFUeXBlLk9yZ2FuaXNhdGlvbi50b1N0cmluZygpXG4gIF0uaW5jbHVkZXMoc3RyaW5nVmFsdWUodmFsdWUpIHx8IG5vZGUudHlwZSkgP1xuICAgIHtcbiAgICAgIHVybDogbWFwc1VybCh7IGxhdDogbm9kZS5sYXRpdHVkZSwgbG5nOiBub2RlLmxvbmdpdHVkZSB9KSxcbiAgICAgIHRpdGxlOiAnVmlldyBvbiBtYXBzJyxcbiAgICAgIGljb246ICdtYXAnXG4gICAgfSA6XG4gICAgdW5kZWZpbmVkO1xuXG5jb25zdCBwcm9wZXJ0eUV4dGVybmFsVXJsID0gKG5vZGU6IEhlc3RpYUpzb248U2NoZW1hVHlwZT4sIGtleTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PlxuICBwcm9wZXJ0eVVybChub2RlLCBrZXkpIHx8XG4gIHByb3BlcnR5TWFwc1VybChub2RlIGFzIGFueSwga2V5LCB2YWx1ZSk7XG5cbmNvbnN0IGFycmF5UGxhY2Vob2xkZXIgPSAodmFsdWVUeXBlOiBnZW5lcmljVHlwZSkgPT4gYFR5cGUgYSAke3ZhbHVlVHlwZX0gdGhlbiBwcmVzcyBFbnRlcmA7XG5cbmNvbnN0IGRlZmF1bHRQbGFjZWhvbGRlciA9ICh7IHR5cGUsIGV4YW1wbGVzIH06IGFueSwgdmFsdWVUeXBlOiBnZW5lcmljVHlwZSkgPT4gZXhhbXBsZXM/Lmxlbmd0aCA/IChcbiAgQXJyYXkuaXNBcnJheShleGFtcGxlc1swXSkgPyBhcnJheVBsYWNlaG9sZGVyKHZhbHVlVHlwZSkgOiBleGFtcGxlc1swXVxuKSA6IGBNdXN0IGJlIG9mIHR5cGUgJHt0eXBlIHx8IHZhbHVlVHlwZX1gO1xuXG5jb25zdCBzY2hlbWFQbGFjaG9sZGVyID0gKHNjaGVtYTogYW55LCBmdWxsS2V5OiBzdHJpbmcpID0+IHtcbiAgY29uc3QgW3BhcmVudCwgLi4ua2V5c10gPSBmdWxsS2V5LnNwbGl0KCcuJyk7XG4gIGNvbnN0IHByb3BlcnRpZXMgPSBzY2hlbWEucHJvcGVydGllcyB8fCB7fTtcbiAgY29uc3QgeyBleGFtcGxlcyB9ID0gcGFyZW50IGluIHByb3BlcnRpZXMgPyBwcm9wZXJ0aWVzW3BhcmVudF0gOiB7IGV4YW1wbGVzOiBbXSB9O1xuICByZXR1cm4gZXhhbXBsZXM/Lmxlbmd0aCAmJiB0eXBlb2YgZXhhbXBsZXNbMF0gPT09ICdvYmplY3QnID8gZ2V0KGV4YW1wbGVzWzBdLCBrZXlzLmpvaW4oJy4nKSwgbnVsbCk6IG51bGw7XG59O1xuXG5jb25zdCBwcm9wZXJ0eVBsYWNlaG9sZGVyID0gKHNjaGVtYTogYW55LCB2YWx1ZVR5cGU6IGdlbmVyaWNUeXBlLCBmdWxsS2V5ID0gJycsIHBhcmVudFNjaGVtYT86IGFueSkgPT5cbiAgc2NoZW1hLnR5cGUgPT09ICdhcnJheScgP1xuICAgIGFycmF5UGxhY2Vob2xkZXIodmFsdWVUeXBlKSA6IChcbiAgICAgIHBhcmVudFNjaGVtYSAmJiBmdWxsS2V5Py5sZW5ndGggPyBzY2hlbWFQbGFjaG9sZGVyKHBhcmVudFNjaGVtYSwgZnVsbEtleSkgOiBudWxsXG4gICAgKSB8fCBkZWZhdWx0UGxhY2Vob2xkZXIoc2NoZW1hLCB2YWx1ZVR5cGUpO1xuXG5jb25zdCBwcm9wZXJ0eVR5cGVWYWx1ZToge1xuICBbdHlwZTogc3RyaW5nXTogKHZhbHVlOiBhbnksIHNjaGVtYTogZGVmaW5pdGlvbikgPT4gYW55O1xufSA9IHtcbiAgb2JqZWN0OiB2YWwgPT4gc2FmZUpTT05TdHJpbmdpZnkodmFsKSxcbiAgYXJyYXk6ICh2YWwsIHNjaGVtYSkgPT4ge1xuICAgIGNvbnN0IHsgaXRlbXMgfSA9IHNjaGVtYSBhcyBJRGVmaW5pdGlvbkFycmF5O1xuICAgIHJldHVybiAnJHJlZicgaW4gaXRlbXMgPyB2YWwgOiAoXG4gICAgICBBcnJheS5pc0FycmF5KHZhbCkgP1xuICAgICAgICB2YWwubWFwKHZhbHVlID0+IHByb3BlcnR5VmFsdWUoaXRlbXMsIHZhbHVlKSkuam9pbihBUlJBWV9ERUxJTUlURVIpIDpcbiAgICAgICAgdmFsXG4gICAgKTtcbiAgfSxcbiAganNvbjogdmFsID0+IHZhbCB8fCAnJyxcbiAgc3RyaW5nOiB2YWwgPT4gKGAke3ZhbH1gIHx8ICcnKS50cmltKCksXG4gIG51bWJlcjogdmFsID0+ICsoYCR7dmFsfWAgfHwgJzAnKSxcbiAgaW50ZWdlcjogdmFsID0+ICsoYCR7dmFsfWAgfHwgJzAnKSxcbiAgYm9vbGVhbjogdmFsID0+IChgJHt2YWx9YCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59O1xuXG5jb25zdCBwcm9wZXJ0eVZhbHVlID0gKHNjaGVtYTogZGVmaW5pdGlvbiwgdmFsdWU6IGFueSkgPT5cbiAgc2NoZW1hLnR5cGUgPyAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSkgP1xuICAgICAgcHJvcGVydHlUeXBlVmFsdWVbdHlwZW9mIHZhbHVlXSh2YWx1ZSwgc2NoZW1hKSA6XG4gICAgICBwcm9wZXJ0eVR5cGVWYWx1ZVtzY2hlbWEudHlwZSBhcyBzdHJpbmddKHZhbHVlLCBzY2hlbWEpXG4gICkgOlxuICBzYWZlSlNPTlN0cmluZ2lmeSh2YWx1ZSk7XG5cbmNvbnN0IHByb3BlcnR5VmFsdWVUeXBlID0gKHNjaGVtYTogZGVmaW5pdGlvbiwgdmFsdWU/OiBhbnkpID0+XG4gIChzY2hlbWEudHlwZSA/IChcbiAgICBBcnJheS5pc0FycmF5KHNjaGVtYS50eXBlKSA/XG4gICAgICBzY2hlbWEudHlwZVswXSA6XG4gICAgICBzY2hlbWEudHlwZSA9PT0gJ2FycmF5JyA/XG4gICAgICAgIHByb3BlcnR5VmFsdWVUeXBlKHsgLi4uc2NoZW1hLCB0eXBlOiBbc2NoZW1hLml0ZW1zLnR5cGUgYXMgZ2VuZXJpY1R5cGVdIH0pIDpcbiAgICAgICAgc2NoZW1hLnR5cGVcbiAgKSA6IHR5cGVvZiB2YWx1ZSkgYXMgZ2VuZXJpY1R5cGU7XG5cbmNvbnN0IHByb3BlcnR5VHlwZVBhcnNlVmFsdWU6IHtcbiAgW3R5cGU6IHN0cmluZ106ICh2YWx1ZTogYW55LCBzY2hlbWE6IGRlZmluaXRpb24pID0+IGFueTtcbn0gPSB7XG4gIG9iamVjdDogdmFsID0+IHNhZmVKU09OUGFyc2UodmFsKSxcbiAgYXJyYXk6ICh2YWwsIHNjaGVtYSkgPT4ge1xuICAgIGNvbnN0IHsgaXRlbXMgfSA9IHNjaGVtYSBhcyBJRGVmaW5pdGlvbkFycmF5O1xuICAgIHJldHVybiAnJHJlZicgaW4gaXRlbXMgPyB2YWwgOiAoXG4gICAgICAhdmFsIHx8IEFycmF5LmlzQXJyYXkodmFsKSA/IHZhbCA6IHZhbC5zcGxpdChBUlJBWV9ERUxJTUlURVIpLm1hcCh2YWx1ZSA9PiBwYXJzZU5ld1ZhbHVlKGl0ZW1zLCB2YWx1ZSkpXG4gICAgKTtcbiAgfSxcbiAganNvbjogdmFsID0+IHZhbCB8fCAnJyxcbiAgc3RyaW5nOiB2YWwgPT4gKGAke3ZhbH1gIHx8ICcnKS50cmltKCksXG4gIG51bWJlcjogdmFsID0+ICsoYCR7dmFsfWAgfHwgJzAnKSxcbiAgaW50ZWdlcjogdmFsID0+ICsoYCR7dmFsfWAgfHwgJzAnKSxcbiAgYm9vbGVhbjogdmFsID0+IChgJHt2YWx9YCB8fCAnJykudG9Mb3dlckNhc2UoKSA9PT0gJ3RydWUnXG59O1xuXG4vKipcbiAqIENvbnZlcnQgdmFsdWUgdG8gdGhlIGZpbmFsIHR5cGUgaW4gdGhlIHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0gc2NoZW1hIERlZmluaXRpb24gb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIHZhbHVlXG4gKiBAcmV0dXJucyBWYWx1ZSBpbiB0aGUgY29ycmVjdCBmb3JtYXQuXG4gKi9cbmV4cG9ydCBjb25zdCBwYXJzZU5ld1ZhbHVlID0gKHNjaGVtYTogZGVmaW5pdGlvbiwgdmFsdWU6IGFueSkgPT5cbiAgc2NoZW1hLnR5cGUgPyAoXG4gICAgQXJyYXkuaXNBcnJheShzY2hlbWEudHlwZSkgP1xuICAgICAgcHJvcGVydHlUeXBlUGFyc2VWYWx1ZVt0eXBlb2YgdmFsdWVdKHZhbHVlLCBzY2hlbWEpIDpcbiAgICAgIHByb3BlcnR5VHlwZVBhcnNlVmFsdWVbc2NoZW1hLnR5cGUgYXMgc3RyaW5nXSh2YWx1ZSwgc2NoZW1hKVxuICApIDogdmFsdWU7XG5cbmNvbnN0IGlzT3BlbkRlZmF1bHQgPSAoc2NoZW1hVHlwZTogU2NoZW1hVHlwZSkgPT4gW1xuICBTY2hlbWFUeXBlLlRlcm1cbl0uaW5jbHVkZXMoc2NoZW1hVHlwZSk7XG5cbi8vIGNhbiB0aGUgcHJvcGVydHkgYmUgc2VlbiB3aGVuIHRoZSBncm91cCBpcyBjbG9zZWRcbmNvbnN0IGlzS2V5Q2xvc2VkVmlzaWJsZSA9IChrZXk6IHN0cmluZykgPT4gWyd0eXBlJywgJ2lkJywgJ0B0eXBlJywgJ0BpZCddLmluY2x1ZGVzKGtleSk7XG5cbmNvbnN0IGlzS2V5SGlkZGVuID0gKGtleTogc3RyaW5nKSA9PiBbJ3R5cGUnLCAnQHR5cGUnXS5pbmNsdWRlcyhrZXkpO1xuXG5jb25zdCBpc0tleVJlcXVpcmVkID0gKGtleTogc3RyaW5nLCBkZWY/OiBJRGVmaW5pdGlvbk9iamVjdCkgPT5cbiAgWyd0eXBlJywgJ2lkJ10uaW5jbHVkZXMoa2V5KSB8fCAoZGVmPy5yZXF1aXJlZCB8fCBbXSkuaW5jbHVkZXMoa2V5KTtcblxuZXhwb3J0IGNvbnN0IHByb3BlcnR5RXJyb3IgPSAoZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10pID0+IChkYXRhUGF0aDogc3RyaW5nLCBub25FeHBhbmRhYmxlQXJyYXkgPSBmYWxzZSkgPT5cbiAgZXJyb3JzLmZpbmQoZXJyb3IgPT5cbiAgICAoXG4gICAgICBlcnJvci5kYXRhUGF0aCA9PT0gZGF0YVBhdGggfHwgKFxuICAgICAgICBub25FeHBhbmRhYmxlQXJyYXkgJiYgbm9uRXhwYW5kYWJsZUFycmF5RGF0YVBhdGgoZXJyb3IuZGF0YVBhdGghKSA9PT0gbm9uRXhwYW5kYWJsZUFycmF5RGF0YVBhdGgoZGF0YVBhdGgpXG4gICAgICApXG4gICAgKSAmJiAoZGF0YVBhdGgubGVuZ3RoID4gMCB8fCAhaXNNaXNzaW5nUHJvcGVydHlFcnJvcihlcnJvcikpXG4gICk7XG5cbmNvbnN0IG1pc3NpbmdQcm9wZXJ0eUVycm9ycyA9IChcbiAgbm9kZTogSGVzdGlhSnNvbjxTY2hlbWFUeXBlPiwgZXJyb3JzOiBJVmFsaWRhdGlvbkVycm9yW10sIHBhcmVudCA9ICcnXG4pOiBJTm9kZVByb3BlcnR5W10gPT4ge1xuICBjb25zdCBhbGxFcnJvcnMgPSBlcnJvcnMuZmlsdGVyKGVycm9yID0+XG4gICAgZXJyb3IuZGF0YVBhdGggPT09IGtleVRvRGF0YVBhdGgocGFyZW50KSAmJiBpc01pc3NpbmdQcm9wZXJ0eUVycm9yKGVycm9yKVxuICApO1xuICAvLyBjaGVjayBmb3Igbm9kZSBub3QgZm91bmQgZXJyb3JzXG4gIGNvbnN0IG1pc3NpbmdOb2RlID0gbWlzc2luZ05vZGVFcnJvcnMoYWxsRXJyb3JzKTtcbiAgcmV0dXJuIG1pc3NpbmdOb2RlLmxlbmd0aCA9PT0gMiA/IFt7XG4gICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICBzY2hlbWFUeXBlOiBub2RlLnR5cGUsXG4gICAgc3VnZ2VzdGlvbnM6IHsgdHlwZTogZGVmYXVsdFN1Z2dlc3Rpb25UeXBlIH0sXG4gICAga2V5OiAnJyxcbiAgICBmdWxsS2V5OiBwYXJlbnQsXG4gICAgdmFsdWU6ICcnLFxuICAgIGVycm9yOiB7XG4gICAgICBsZXZlbDogJ2Vycm9yJyxcbiAgICAgIG1lc3NhZ2U6IG1pc3NpbmdOb2RlRXJyb3JNZXNzYWdlKG5vZGUpXG4gICAgfSxcbiAgICBoYXNFcnJvcjogdHJ1ZSxcbiAgICBwcm9wZXJ0aWVzOiBbXSxcbiAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGZhbHNlXG4gIH1dIDogYWxsRXJyb3JzLm1hcChlcnJvciA9PiB7XG4gICAgY29uc3QgeyBtaXNzaW5nUHJvcGVydHkgfSA9IGVycm9yLnBhcmFtcyE7XG4gICAgY29uc3QgZnVsbEtleSA9IHBhcmVudCA/IGAke3BhcmVudH0uJHttaXNzaW5nUHJvcGVydHl9YCA6IG1pc3NpbmdQcm9wZXJ0eTtcbiAgICBjb25zdCBtaXNzaW5nT25lT2YgPSBpc01pc3NpbmdPbmVPZkVycm9yKGVycm9yKTtcbiAgICByZXR1cm4ge1xuICAgICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICAgIHNjaGVtYVR5cGU6IG5vZGUudHlwZSxcbiAgICAgIHN1Z2dlc3Rpb25zOiB7IHR5cGU6IGRlZmF1bHRTdWdnZXN0aW9uVHlwZSB9LFxuICAgICAga2V5OiBtaXNzaW5nUHJvcGVydHksXG4gICAgICBmdWxsS2V5LFxuICAgICAgdmFsdWU6ICdBZGQgZmllbGQgdG8gZml4JyxcbiAgICAgIGVkaXRhYmxlOiBmYWxzZSxcbiAgICAgIGVycm9yOiBmb3JtYXRFcnJvcihlcnJvciksXG4gICAgICBoYXNFcnJvcjogbWlzc2luZ09uZU9mID8gZmFsc2UgOiBlcnJvckhhc0Vycm9yKGVycm9yKSxcbiAgICAgIGhhc1dhcm5pbmc6IG1pc3NpbmdPbmVPZiB8fCBlcnJvckhhc1dhcm5pbmcoZXJyb3IpLFxuICAgICAgcHJvcGVydGllczogW10sXG4gICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IHRydWVcbiAgICB9O1xuICB9KTtcbn07XG5cbmNvbnN0IHByb3BlcnR5RnJvbU5vZGUgPSAoXG4gIHNjaGVtYXM6IGRlZmluaXRpb25zLCBlcnJvcnM6IElWYWxpZGF0aW9uRXJyb3JbXSwgbm9kZVNjaGVtYTogZGVmaW5pdGlvbiwgZGVlcEVkaXRhYmxlOiBib29sZWFuLCBwYXJlbnQgPSAnJywgbm9kZTogYW55XG4pID0+IChrZXk6IHN0cmluZykgPT4ge1xuICBjb25zdCB2YWx1ZSA9IG5vZGVba2V5XTtcbiAgY29uc3QgZXhwYW5kYWJsZSA9IGlzRXhwYW5kYWJsZSh2YWx1ZSk7XG4gIGNvbnN0IGlzQXJyYXkgPSBBcnJheS5pc0FycmF5KHZhbHVlKTtcbiAgY29uc3Qgbm9uRXhwYW5kYWJsZUFycmF5ID0gaXNBcnJheSAmJiAhZXhwYW5kYWJsZTtcbiAgY29uc3QgZnVsbEtleSA9IEFycmF5LmlzQXJyYXkobm9kZSkgPyBgJHtwYXJlbnR9WyR7a2V5fV1gIDogW1xuICAgIHBhcmVudCxcbiAgICBrZXlcbiAgXS5maWx0ZXIoQm9vbGVhbikuam9pbignLicpO1xuICBjb25zdCBub2RlVHlwZSA9IG5vZGUudHlwZSB8fCBub2RlWydAdHlwZSddO1xuICBjb25zdCBzY2hlbWFUeXBlID0gZXhwYW5kYWJsZSA/IChcbiAgICBpc0FycmF5ICYmIHZhbHVlLmxlbmd0aCA/IHZhbHVlWzBdLnR5cGUgfHwgdmFsdWVbMF1bJ0B0eXBlJ10gOiB2YWx1ZS50eXBlIHx8IHZhbHVlWydAdHlwZSddXG4gICkgOiBub2RlVHlwZTtcbiAgY29uc3Qgc2NoZW1hID0gKHNjaGVtYXMgJiYgaXNUeXBlVmFsaWQoeyB0eXBlOiBzY2hlbWFUeXBlIH0pID8gKFxuICAgIGV4cGFuZGFibGUgPyBzY2hlbWFzW3NjaGVtYVR5cGVdIDogc2NoZW1hc1tzY2hlbWFUeXBlXS5wcm9wZXJ0aWVzW2tleV1cbiAgKSA6IG51bGwpIHx8IHt9O1xuICBjb25zdCBpc0lyaSA9IGlzU2NoZW1hSXJpKHNjaGVtYSk7XG4gIGNvbnN0IGVycm9yID0gcHJvcGVydHlFcnJvcihlcnJvcnMpKGtleVRvRGF0YVBhdGgoZnVsbEtleSksIG5vbkV4cGFuZGFibGVBcnJheSk7XG4gIGNvbnN0IHBhcmVudFNjaGVtYSA9IGV4cGFuZGFibGUgPyAoXG4gICAgLy8gVE9ETzogZm9yIG5vbi1hcnJheSwgc2hvdWxkIGJlIHNjaGVtYSB1bmxlc3MgbGFzdCByZWN1cnNpb25cbiAgICBpc0FycmF5ID8gc2NoZW1hIDogbm9kZVNjaGVtYVxuICApIDogbm9kZVNjaGVtYTtcbiAgY29uc3QgcHJvcGVydGllcyA9IGV4cGFuZGFibGUgfHwgaXNJcmkgP1xuICAgIHJlY3Vyc2l2ZVByb3BlcnRpZXMoc2NoZW1hcywgZXJyb3JzLCBwYXJlbnRTY2hlbWEsIGRlZXBFZGl0YWJsZSwgZnVsbEtleSkodmFsdWUpIDogW107XG4gIGNvbnN0IGluRXJyb3IgPSBlcnJvckhhc0Vycm9yKGVycm9yKSB8fCBoYXNFcnJvcihwcm9wZXJ0aWVzKTtcbiAgY29uc3QgaW5XYXJuaW5nID0gZXJyb3JIYXNXYXJuaW5nKGVycm9yKSB8fCBoYXNXYXJuaW5nKHByb3BlcnRpZXMpO1xuICBjb25zdCBlZGl0YWJsZSA9IGlzVHlwZU5vZGUobm9kZVsnQHR5cGUnXSkgfHwgKGV4cGFuZGFibGUgJiYgaXNUeXBlTm9kZSh2YWx1ZVsnQHR5cGUnXSkpID9cbiAgICBmYWxzZSA6XG4gICAgKFxuICAgICAgLy8gcHJldmVudCBlZGl0aW5nL2FkZGluZyBuZXcgcHJvcGVydGllcyBvbiBleGlzdGluZyBzdWItbm9kZXNcbiAgICAgICFkZWVwRWRpdGFibGUgJiYgaXNUeXBlTm9kZShzY2hlbWFUeXBlKSAmJiAoXG4gICAgICAgIGV4cGFuZGFibGUgPyB2YWx1ZS50eXBlICE9PSBOb2RlVHlwZS5UZXJtIDogcGFyZW50ICYmIG5vZGUudHlwZSAhPT0gTm9kZVR5cGUuVGVybVxuICAgICAgKSA/XG4gICAgICAgIGZhbHNlIDpcbiAgICAgICAgLy8gaGFuZGxlIElSSVxuICAgICAgICAoIXNjaGVtYVR5cGUgJiYga2V5ID09PSAnQGlkJykgfHwgZWRpdGFibGVLZXkoa2V5KVxuICAgICk7XG4gIGNvbnN0IHZhbHVlVHlwZSA9IHByb3BlcnR5VmFsdWVUeXBlKHNjaGVtYSwgdmFsdWUpO1xuICByZXR1cm4ge1xuICAgIGlkOiBwcm9wZXJ0eUlkKCksXG4gICAgc2NoZW1hVHlwZTogaXNJcmkgPyBudWxsIDogc2NoZW1hVHlwZSxcbiAgICBzY2hlbWEsXG4gICAga2V5LFxuICAgIGZ1bGxLZXksXG4gICAgdmFsdWU6IHByb3BlcnR5VmFsdWUoc2NoZW1hLCB2YWx1ZSksXG4gICAgZWRpdGFibGU6IGluRXJyb3IgfHwgZWRpdGFibGUsXG4gICAgc3VnZ2VzdGlvbnM6IGVuYWJsZVN1Z2dlc3Rpb25zKG5vZGVTY2hlbWEsIG5vZGUudHlwZSwgZnVsbEtleSwgc2NoZW1hKSxcbiAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKG5vZGUsIHNjaGVtYVR5cGUsIHNjaGVtYSwgZnVsbEtleSksXG4gICAgbmV3UHJvcGVydHk6IHt9LFxuICAgIG5ld0Vycm9yOiB7IGxldmVsOiAnd2FybmluZycgfSxcbiAgICBlcnJvcjogZm9ybWF0RXJyb3IoZXJyb3IpLFxuICAgIGlzSGlkZGVuOiBwYXJlbnQgJiYgaXNLZXlIaWRkZW4oa2V5KSxcbiAgICBjbG9zZWRWaXNpYmxlOiBpc0tleUNsb3NlZFZpc2libGUoa2V5KSxcbiAgICBoYXNFcnJvcjogaW5FcnJvcixcbiAgICBoYXNXYXJuaW5nOiBpbldhcm5pbmcsXG4gICAgaXNSZXF1aXJlZDogaXNLZXlSZXF1aXJlZChrZXksIHNjaGVtYXNbbm9kZVR5cGVdKSxcbiAgICBpc0FycmF5LFxuICAgIGlzRXhwYW5kYWJsZTogZXhwYW5kYWJsZSxcbiAgICBpc09wZW46IGlzT3BlbkRlZmF1bHQoc2NoZW1hVHlwZSksXG4gICAgcHJvcGVydGllcyxcbiAgICBwbGFjZWhvbGRlcjogcHJvcGVydHlQbGFjZWhvbGRlcihzY2hlbWEsIHZhbHVlVHlwZSwgZnVsbEtleSwgcGFyZW50U2NoZW1hKSxcbiAgICBleHRlcm5hbFVybDogcHJvcGVydHlFeHRlcm5hbFVybChub2RlLCBrZXksIHZhbHVlKVxuICB9IGFzIElOb2RlUHJvcGVydHk7XG59O1xuXG5leHBvcnQgY29uc3Qgc2luZ2xlUHJvcGVydHkgPSAoc2NoZW1hczogZGVmaW5pdGlvbnMsIGVycm9yczogSVZhbGlkYXRpb25FcnJvcltdLCBub2RlOiBhbnksIGZ1bGxLZXk6IHN0cmluZykgPT4ge1xuICBjb25zdCBbX3QsIC4uLmtleXNdID0gZnVsbEtleS5zcGxpdCgnLicpO1xuICBjb25zdCBrZXkgPSBrZXlzLnBvcCgpITtcbiAgY29uc3QgcGFyZW50ID0ga2V5cy5qb2luKCcuJyk7XG4gIGNvbnN0IHBhcmVudE5vZGUgPSBwYXJlbnQubGVuZ3RoID8gZ2V0KG5vZGUsIHBhcmVudCkgOiBub2RlO1xuICBjb25zdCBzY2hlbWFUeXBlID0gdHlwZVRvU2NoZW1hVHlwZShwYXJlbnROb2RlLnR5cGUgfHwgcGFyZW50Tm9kZVsnQHR5cGUnXSk7XG4gIGNvbnN0IHBhcmVudFNjaGVtYSA9IHNjaGVtYXNbc2NoZW1hVHlwZV07XG4gIHJldHVybiBwcm9wZXJ0eUZyb21Ob2RlKHNjaGVtYXMsIGVycm9ycywgcGFyZW50U2NoZW1hLCB0cnVlLCBwYXJlbnQsIHBhcmVudE5vZGUpKGtleSk7XG59O1xuXG5leHBvcnQgY29uc3QgcmVjdXJzaXZlUHJvcGVydGllcyA9IChcbiAgc2NoZW1hczogZGVmaW5pdGlvbnMsIGVycm9yczogSVZhbGlkYXRpb25FcnJvcltdLCBub2RlU2NoZW1hOiBkZWZpbml0aW9uLCBkZWVwRWRpdGFibGU6IGJvb2xlYW4sIHBhcmVudCA9ICcnXG4pID0+IChub2RlOiBhbnkpOiBJTm9kZVByb3BlcnR5W10gPT5cbiAgT2JqZWN0LmtleXMobm9kZSlcbiAgICAuZmlsdGVyKGtleSA9PiAhcHJpdmF0ZUtleXMuaW5jbHVkZXMoa2V5KSlcbiAgICAubWFwKHByb3BlcnR5RnJvbU5vZGUoc2NoZW1hcywgZXJyb3JzLCBub2RlU2NoZW1hLCBkZWVwRWRpdGFibGUsIHBhcmVudCwgbm9kZSkpXG4gICAgLmNvbmNhdCguLi5taXNzaW5nUHJvcGVydHlFcnJvcnMobm9kZSwgZXJyb3JzLCBwYXJlbnQpKVxuICAgIC5zb3J0KHNvcnRQcm9wZXJ0aWVzKTtcblxuY29uc3QgZnVsbEtleVBhcnRzID0gKGZ1bGxLZXk6IHN0cmluZykgPT4gZnVsbEtleS5zcGxpdCgnLicpLmZsYXRNYXAodmFsID0+IHtcbiAgaWYgKHZhbC5lbmRzV2l0aCgnXScpKSB7XG4gICAgY29uc3QgW2tleSwgaW5kZXhdID0gdmFsLnNwbGl0KCdbJyk7XG4gICAgcmV0dXJuIFtrZXksIGluZGV4LnJlcGxhY2UoJ10nLCAnJyldO1xuICB9XG4gIHJldHVybiB2YWw7XG59KTtcblxuZXhwb3J0IGNvbnN0IHVwZGF0ZVByb3BlcnRpZXMgPSAoeyBwcm9wZXJ0aWVzIH06IFBhcnRpYWw8SU5vZGVQcm9wZXJ0eT4sIHVwZGF0ZXI6IChwcm9wOiBJTm9kZVByb3BlcnR5KSA9PiBJTm9kZVByb3BlcnR5KSA9PlxuICAocHJvcGVydGllcyB8fCBbXSkubWFwKHByb3AgPT4gdXBkYXRlUHJvcGVydGllcyh1cGRhdGVyKHByb3ApLCB1cGRhdGVyKSk7XG5cbmV4cG9ydCBjb25zdCB0eXBlVG9OZXdQcm9wZXJ0eSA9IChcbiAgc2NoZW1hczogZGVmaW5pdGlvbnMsIHNjaGVtYTogZGVmaW5pdGlvbiwgbm9kZVNjaGVtYTogZGVmaW5pdGlvbiwgbm9kZTogYW55LCBmdWxsS2V5OiBzdHJpbmdcbik6IElOb2RlUHJvcGVydHkgPT4ge1xuICBjb25zdCBrZXkgPSBmdWxsS2V5UGFydHMoZnVsbEtleSkucG9wKCkhO1xuICBjb25zdCBtYXBwaW5nczoge1xuICAgIFtrZXk6IHN0cmluZ106ICgpID0+IElOb2RlUHJvcGVydHk7XG4gIH0gPSB7XG4gICAgb2JqZWN0OiAoKSA9PiB7XG4gICAgICBjb25zdCB7IHNjaGVtYVR5cGUsIHByb3BlcnRpZXMgfSA9IHNjaGVtYVJlcXVpcmVkUHJvcGVydGllcyhzY2hlbWFzLCBzY2hlbWEgYXMgSURlZmluaXRpb25PYmplY3QpO1xuICAgICAgbm9kZVtrZXldID0gbm9kZVtrZXldIHx8IHt9O1xuICAgICAgbm9kZVtrZXldLnR5cGUgPSBzY2hlbWFUeXBlO1xuICAgICAgLy8gVE9ETzogaGFuZGxlIGxvYWQgc2NoZW1hcyBmcm9tIGh0dHAgc291cmNlXG4gICAgICBpZiAoc2NoZW1hVHlwZS5zdGFydHNXaXRoKCdodHRwJykpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVUb05ld1Byb3BlcnR5KHNjaGVtYXMsIHsgdHlwZTogJ2pzb24nIH0gYXMgYW55LCBub2RlU2NoZW1hLCBub2RlLCBmdWxsS2V5KTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE86IGhhbmRsZSBub2RlU2NoZW1hIHNob3VsZCBiZSBzY2hlbWEgdW5sZXNzIGxhc3QgcmVjdXJzaW9uXG4gICAgICBjb25zdCBwcm9wcyA9IHByb3BlcnRpZXNcbiAgICAgICAgLmZpbHRlcihwcm9wID0+IG5lc3RpbmdFbmFibGVkKHNjaGVtYVR5cGUsIHByb3Aua2V5KSAmJiAhIXByb3AudmFsdWUpXG4gICAgICAgIC5tYXAoXG4gICAgICAgICAgdiA9PiAoe1xuICAgICAgICAgICAgLi4udHlwZVRvTmV3UHJvcGVydHkoc2NoZW1hcywgdi52YWx1ZSwgbm9kZVNjaGVtYSwgbm9kZVtrZXldLCBgJHtmdWxsS2V5fS4ke3Yua2V5fWApLFxuICAgICAgICAgICAgaXNSZXF1aXJlZDogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHByb3BzLnJlZHVjZSgocHJldiwgY3VycikgPT4gKHsgLi4ucHJldiwgW2N1cnIua2V5XTogY3Vyci52YWx1ZSB9KSwge30pO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICAgICAgaXNBZGRlZDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hOiBzY2hlbWFzW3NjaGVtYVR5cGVdLFxuICAgICAgICBzY2hlbWFUeXBlLFxuICAgICAgICBrZXksXG4gICAgICAgIGZ1bGxLZXksXG4gICAgICAgIHZhbHVlLFxuICAgICAgICBlZGl0YWJsZTogZWRpdGFibGVLZXkoa2V5KSxcbiAgICAgICAgaXNIaWRkZW46IGlzS2V5SGlkZGVuKGtleSksXG4gICAgICAgIGNsb3NlZFZpc2libGU6IGlzS2V5Q2xvc2VkVmlzaWJsZShrZXkpLFxuICAgICAgICBzdWdnZXN0aW9uczogZW5hYmxlU3VnZ2VzdGlvbnMobm9kZVNjaGVtYSwgc2NoZW1hVHlwZSwgZnVsbEtleSksXG4gICAgICAgIHByb3BlcnRpZXM6IHByb3BzLnNvcnQoc29ydFByb3BlcnRpZXMpLFxuICAgICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGlzQWRkUHJvcGVydHlFbmFibGVkKG5vZGUsIHNjaGVtYVR5cGUsIHNjaGVtYXNbc2NoZW1hVHlwZV0sIGtleSksXG4gICAgICAgIG5ld1Byb3BlcnR5OiB7fSxcbiAgICAgICAgbmV3RXJyb3I6IHsgbGV2ZWw6ICd3YXJuaW5nJyB9LFxuICAgICAgICBpc1JlcXVpcmVkOiBpc0tleVJlcXVpcmVkKGtleSwgc2NoZW1hIGFzIGFueSksXG4gICAgICAgIGlzQXJyYXk6IGZhbHNlLFxuICAgICAgICBpc0V4cGFuZGFibGU6IHRydWUsXG4gICAgICAgIGlzT3BlbjogaXNPcGVuRGVmYXVsdChzY2hlbWFUeXBlKVxuICAgICAgfTtcbiAgICB9LFxuICAgIGFycmF5OiAoKSA9PiB7XG4gICAgICBjb25zdCB7IGl0ZW1zIH0gPSBzY2hlbWEgYXMgSURlZmluaXRpb25BcnJheTtcbiAgICAgIC8vIGFycmF5IG9mIHN0cmluZywgbnVtYmVyIGFuZCBib29sZWFuXG4gICAgICBpZiAoaXRlbXMudHlwZSkge1xuICAgICAgICByZXR1cm4gbWFwcGluZ3MuZGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgY29uc3Qgc2NoZW1hVHlwZSA9IGRlZmluaXRpb25Ub1NjaGVtYVR5cGUoaXRlbXMgYXMgSURlZmluaXRpb25PYmplY3QpO1xuICAgICAgbm9kZVtrZXldID0gbm9kZVtrZXldIHx8IFtdO1xuICAgICAgbm9kZVtrZXldLnB1c2goeyB9KTtcbiAgICAgIGNvbnN0IHByb3BlcnR5ID0gdHlwZVRvTmV3UHJvcGVydHkoc2NoZW1hcywgaXRlbXMsIHNjaGVtYXNbc2NoZW1hVHlwZV0sIG5vZGVba2V5XVswXSwgYCR7ZnVsbEtleX1bMF1gKTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGlkOiBwcm9wZXJ0eUlkKCksXG4gICAgICAgIGlzQWRkZWQ6IHRydWUsXG4gICAgICAgIHNjaGVtYSxcbiAgICAgICAgc2NoZW1hVHlwZSxcbiAgICAgICAga2V5LFxuICAgICAgICBmdWxsS2V5LFxuICAgICAgICB2YWx1ZTogW3Byb3BlcnR5LnZhbHVlXSxcbiAgICAgICAgZWRpdGFibGU6IGVkaXRhYmxlS2V5KGtleSksXG4gICAgICAgIGlzSGlkZGVuOiBpc0tleUhpZGRlbihrZXkpLFxuICAgICAgICBjbG9zZWRWaXNpYmxlOiBpc0tleUNsb3NlZFZpc2libGUoa2V5KSxcbiAgICAgICAgc3VnZ2VzdGlvbnM6IHVuZGVmaW5lZCxcbiAgICAgICAgcHJvcGVydGllczogW3Byb3BlcnR5XSxcbiAgICAgICAgbmV3UHJvcGVydHk6IHt9LFxuICAgICAgICBuZXdFcnJvcjogeyBsZXZlbDogJ3dhcm5pbmcnIH0sXG4gICAgICAgIGlzQXJyYXk6IHRydWUsXG4gICAgICAgIGlzRXhwYW5kYWJsZTogdHJ1ZSxcbiAgICAgICAgYWRkUHJvcGVydHlFbmFibGVkOiBmYWxzZVxuICAgICAgfTtcbiAgICB9LFxuICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlVHlwZSA9IHByb3BlcnR5VmFsdWVUeXBlKHNjaGVtYSk7XG4gICAgICBjb25zdCB2YWx1ZSA9IHNjaGVtYS5kZWZhdWx0IHx8IChzY2hlbWEgYXMgYW55KS5jb25zdCB8fCB2YWx1ZVR5cGVUb0RlZmF1bHRbdmFsdWVUeXBlXTtcbiAgICAgIG5vZGVba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHByb3BlcnR5SWQoKSxcbiAgICAgICAgaXNBZGRlZDogdHJ1ZSxcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBzY2hlbWFUeXBlOiBub2RlLnR5cGUsXG4gICAgICAgIGtleSxcbiAgICAgICAgZnVsbEtleSxcbiAgICAgICAgdmFsdWU6IHByb3BlcnR5VmFsdWUoc2NoZW1hLCB2YWx1ZSksXG4gICAgICAgIGVkaXRhYmxlOiBlZGl0YWJsZUtleShrZXkpLFxuICAgICAgICBpc0hpZGRlbjogaXNLZXlIaWRkZW4oa2V5KSxcbiAgICAgICAgY2xvc2VkVmlzaWJsZTogaXNLZXlDbG9zZWRWaXNpYmxlKGtleSksXG4gICAgICAgIHN1Z2dlc3Rpb25zOiBlbmFibGVTdWdnZXN0aW9ucyhub2RlU2NoZW1hLCBub2RlLnR5cGUsIGZ1bGxLZXksIHNjaGVtYSksXG4gICAgICAgIHBsYWNlaG9sZGVyOiBwcm9wZXJ0eVBsYWNlaG9sZGVyKHNjaGVtYSwgdmFsdWVUeXBlLCBmdWxsS2V5LCBub2RlU2NoZW1hKSxcbiAgICAgICAgZXh0ZXJuYWxVcmw6IHByb3BlcnR5RXh0ZXJuYWxVcmwobm9kZSwga2V5LCB2YWx1ZSksXG4gICAgICAgIHByb3BlcnRpZXM6IFtdLFxuICAgICAgICBhZGRQcm9wZXJ0eUVuYWJsZWQ6IGZhbHNlXG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgY29uc3QgbWFwcGVkID0gIXNjaGVtYS50eXBlID8gbWFwcGluZ3Mub2JqZWN0IDogKFxuICAgIHNjaGVtYS50eXBlIGFzIHN0cmluZyBpbiBtYXBwaW5ncyA/IG1hcHBpbmdzW3NjaGVtYS50eXBlIGFzIHN0cmluZ10gOiBtYXBwaW5ncy5kZWZhdWx0XG4gICk7XG4gIHJldHVybiBtYXBwZWQoKTtcbn07XG5cbmV4cG9ydCBjb25zdCBmaW5kUHJvcGVydHkgPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBmdWxsS2V5OiBzdHJpbmcpID0+IHtcbiAgZm9yIChjb25zdCBwIG9mIHByb3BlcnRpZXMpIHtcbiAgICBpZiAocC5mdWxsS2V5ID09PSBmdWxsS2V5KSB7XG4gICAgICByZXR1cm4gcDtcbiAgICB9XG4gICAgY29uc3QgY2hpbGRQID0gZmluZFByb3BlcnR5KHAucHJvcGVydGllcywgZnVsbEtleSk7XG4gICAgaWYgKGNoaWxkUCkge1xuICAgICAgcmV0dXJuIGNoaWxkUDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgY29uc3QgcGFyZW50UHJvcGVydHkgPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBhbGxLZXlzID0gcHJvcGVydHkuZnVsbEtleS5zcGxpdCgnLicpO1xuICBbLi4ubmV3IEFycmF5KHByb3BlcnR5LnN1Z2dlc3Rpb25zPy5wYXJlbnRMZXZlbCB8fCAwKV0ubWFwKCgpID0+IGFsbEtleXMucG9wKCkpO1xuICBjb25zdCBwYXJlbnRLZXlzID0gZnVsbEtleVBhcnRzKGFsbEtleXMuam9pbignLicpKTtcbiAgcGFyZW50S2V5cy5wb3AoKTtcbiAgY29uc3QgcGFyZW50ID0gKHBhcmVudEtleXMucmVkdWNlKChwcmV2LCBjdXJyLCBjdXJySW5kZXgpOiBhbnkgPT4ge1xuICAgIGNvbnN0IHByb3AgPSBwcmV2LmZpbmQodiA9PiB2LmtleSA9PT0gY3Vycik7XG4gICAgcmV0dXJuIGN1cnJJbmRleCA9PT0gcGFyZW50S2V5cy5sZW5ndGggLSAxID8gKHByb3AgfHwge30gYXMgSU5vZGVQcm9wZXJ0eSkgOiAocHJvcCEucHJvcGVydGllcyB8fCBbXSk7XG4gIH0sIHByb3BlcnRpZXMpIGFzIGFueSkgYXMgSU5vZGVQcm9wZXJ0eTtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkocGFyZW50KSA/IHByb3BlcnR5IDogcGFyZW50O1xufTtcblxuZXhwb3J0IGNvbnN0IG5lc3RlZFByb3BlcnR5ID0gKHsgcHJvcGVydGllcyB9OiBJTm9kZVByb3BlcnR5LCBuZXN0ZWRLZXk6IHN0cmluZykgPT5cbiAgcHJvcGVydGllcy5maW5kKCh7IGtleSB9KSA9PiBrZXkgPT09IG5lc3RlZEtleSk7XG5cbmV4cG9ydCBjb25zdCBzaWJsaW5nUHJvcGVydHkgPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSwgc2libGluZ0tleTogc3RyaW5nKSA9PiB7XG4gIGNvbnN0IHBhcmVudCA9IHBhcmVudFByb3BlcnR5KHByb3BlcnRpZXMsIHByb3BlcnR5KTtcbiAgY29uc3QgcGFyZW50UHJvcGVydGllcyA9IHBhcmVudCA9PT0gcHJvcGVydHkgPyBwcm9wZXJ0aWVzIDogcGFyZW50LnByb3BlcnRpZXM7XG4gIHJldHVybiBwYXJlbnRQcm9wZXJ0aWVzLmZpbmQocHJvcCA9PiBwcm9wLmtleSA9PT0gc2libGluZ0tleSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ3JvdXBDaGFuZ2VkID0gKHByb3BlcnRpZXM6IElOb2RlUHJvcGVydHlbXSwga2V5OiBzdHJpbmcsIHZhbHVlPzogYW55KSA9PiB7XG4gIHRyeSB7XG4gICAgY29uc3QgcGFyZW50S2V5cyA9IGZ1bGxLZXlQYXJ0cyhrZXkpO1xuICAgIHBhcmVudEtleXMucmVkdWNlKChwcmV2LCBjdXJyLCBjdXJySW5kZXgpID0+IHtcbiAgICAgIGlmIChjdXJySW5kZXggPT09IHBhcmVudEtleXMubGVuZ3RoIC0gMSAmJiB2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gcHJldi5zcGxpY2UocHJldi5maW5kSW5kZXgodiA9PiB2LmtleSA9PT0gY3VyciksIDEpO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIGNvbnN0IHByb3AgPSBwcmV2LmZpbmQodiA9PiB2LmtleSA9PT0gY3VycikhO1xuICAgICAgICBwcm9wLmNoYW5nZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHJvcC5wcm9wZXJ0aWVzO1xuICAgICAgfVxuICAgIH0sIHByb3BlcnRpZXMpO1xuICB9XG4gIGNhdGNoIChfZXJyKSB7fVxufTtcblxuZXhwb3J0IGNvbnN0IHJlZnJlc2hQcm9wZXJ0eUtleXMgPSAocHJvcGVydHk6IElOb2RlUHJvcGVydHkpID0+XG4gIHByb3BlcnR5LnByb3BlcnRpZXMubWFwKChwcm9wLCBpKSA9PiB7XG4gICAgcHJvcC5mdWxsS2V5ID0gYCR7cHJvcGVydHkuZnVsbEtleX0ke3Byb3BlcnR5LmlzQXJyYXkgPyBgWyR7aX1dYCA6IGAuJHtwcm9wLmtleX1gfWA7XG4gICAgcHJvcC5rZXkgPSBwcm9wZXJ0eS5pc0FycmF5ID8gYCR7aX1gIDogcHJvcC5rZXk7XG4gICAgcmV0dXJuIHJlZnJlc2hQcm9wZXJ0eUtleXMocHJvcCk7XG4gIH0pO1xuXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlQ3ljbGVEdXJhdGlvbkVuYWJsZWQgPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBzdGFydERhdGUgPSBzaWJsaW5nUHJvcGVydHkocHJvcGVydGllcywgcHJvcGVydHksICdzdGFydERhdGUnKTtcbiAgY29uc3QgZW5kRGF0ZSA9IHNpYmxpbmdQcm9wZXJ0eShwcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2VuZERhdGUnKTtcbiAgcmV0dXJuICEhc3RhcnREYXRlPy52YWx1ZSAmJiAhIWVuZERhdGU/LnZhbHVlO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUN5Y2xlRHVyYXRpb24gPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBzdGFydERhdGUgPSBzaWJsaW5nUHJvcGVydHkocHJvcGVydGllcywgcHJvcGVydHksICdzdGFydERhdGUnKSE7XG4gIGNvbnN0IGVuZERhdGUgPSBzaWJsaW5nUHJvcGVydHkocHJvcGVydGllcywgcHJvcGVydHksICdlbmREYXRlJykhO1xuICByZXR1cm4gZGlmZkluRGF5cyhzdGFydERhdGUudmFsdWUsIGVuZERhdGUudmFsdWUpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNhbGN1bGF0ZUN5Y2xlU3RhcnREYXRlRW5hYmxlZCA9IChwcm9wZXJ0aWVzOiBJTm9kZVByb3BlcnR5W10sIHByb3BlcnR5OiBJTm9kZVByb3BlcnR5KSA9PiB7XG4gIGNvbnN0IGN5Y2xlRHVyYXRpb24gPSBzaWJsaW5nUHJvcGVydHkocHJvcGVydGllcywgcHJvcGVydHksICdjeWNsZUR1cmF0aW9uJyk7XG4gIGNvbnN0IGVuZERhdGUgPSBzaWJsaW5nUHJvcGVydHkocHJvcGVydGllcywgcHJvcGVydHksICdlbmREYXRlJyk7XG4gIHJldHVybiAhIWN5Y2xlRHVyYXRpb24/LnZhbHVlICYmICEhZW5kRGF0ZT8udmFsdWU7XG59O1xuXG5leHBvcnQgY29uc3QgY2FsY3VsYXRlQ3ljbGVTdGFydERhdGUgPSAocHJvcGVydGllczogSU5vZGVQcm9wZXJ0eVtdLCBwcm9wZXJ0eTogSU5vZGVQcm9wZXJ0eSkgPT4ge1xuICBjb25zdCBjeWNsZUR1cmF0aW9uID0gc2libGluZ1Byb3BlcnR5KHByb3BlcnRpZXMsIHByb3BlcnR5LCAnY3ljbGVEdXJhdGlvbicpITtcbiAgY29uc3QgZW5kRGF0ZSA9IHNpYmxpbmdQcm9wZXJ0eShwcm9wZXJ0aWVzLCBwcm9wZXJ0eSwgJ2VuZERhdGUnKSE7XG4gIHJldHVybiBtb21lbnQoZW5kRGF0ZS52YWx1ZSkubG9jYWxlKCdlbi1nYicpLnN1YnRyYWN0KGN5Y2xlRHVyYXRpb24udmFsdWUsICdkYXlzJykuZm9ybWF0KCdZWVlZLU1NLUREJyk7XG59O1xuIl19
|