@oneteme/jquery-organizer 0.0.1 → 0.0.2
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 +159 -60
- package/esm2022/lib/models/organizer-chart-adapter.mjs +37 -3
- package/esm2022/lib/models/organizer-config.interface.mjs +1 -1
- package/esm2022/lib/models/organizer-utils.mjs +127 -1
- package/esm2022/lib/organizer-button/organizer-button.component.mjs +38 -18
- package/esm2022/lib/organizer-button/template-manager.utility.mjs +7 -0
- package/esm2022/public-api.mjs +2 -2
- package/fesm2022/oneteme-jquery-organizer.mjs +229 -45
- package/fesm2022/oneteme-jquery-organizer.mjs.map +1 -1
- package/lib/models/organizer-chart-adapter.d.ts +10 -0
- package/lib/models/organizer-config.interface.d.ts +1 -0
- package/lib/models/organizer-utils.d.ts +4 -1
- package/lib/organizer-button/organizer-button.component.d.ts +1 -0
- package/lib/organizer-button/template-manager.utility.d.ts +4 -0
- package/package.json +1 -1
- package/public-api.d.ts +1 -1
|
@@ -23,4 +23,130 @@ export function buildYFields(indicators) {
|
|
|
23
23
|
export function resolveYKey(selectedY, selectedYAggregate) {
|
|
24
24
|
return selectedYAggregate ?? selectedY;
|
|
25
25
|
}
|
|
26
|
-
|
|
26
|
+
export function normalizeOrganizerState(state, config) {
|
|
27
|
+
const base = state || {};
|
|
28
|
+
const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);
|
|
29
|
+
const selectedX = hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined;
|
|
30
|
+
const selectedGroupBy = hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined;
|
|
31
|
+
const selectedSlices = (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId));
|
|
32
|
+
const normalized = {
|
|
33
|
+
...base,
|
|
34
|
+
selectedX,
|
|
35
|
+
selectedY: normalizedY.selectedY,
|
|
36
|
+
selectedYAggregate: normalizedY.selectedYAggregate,
|
|
37
|
+
selectedGroupBy,
|
|
38
|
+
selectedSlices,
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
...normalized,
|
|
42
|
+
selectedTemplate: resolveMatchingTemplateId(config.templates, normalized, config)
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
export function normalizeTemplateToState(template, currentState, config) {
|
|
46
|
+
const base = normalizeOrganizerState(currentState, config);
|
|
47
|
+
const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, base);
|
|
48
|
+
const nextState = {
|
|
49
|
+
viewMode: base.viewMode,
|
|
50
|
+
visibleFields: base.visibleFields,
|
|
51
|
+
selectedX: hasOption(config.xFields, template.xField) ? template.xField : base.selectedX,
|
|
52
|
+
selectedY: normalizedY.selectedY,
|
|
53
|
+
selectedYAggregate: normalizedY.selectedYAggregate,
|
|
54
|
+
selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : base.selectedGroupBy,
|
|
55
|
+
selectedSlices: (template.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),
|
|
56
|
+
};
|
|
57
|
+
const resolvedTemplateId = resolveMatchingTemplateId(config.templates, nextState, config);
|
|
58
|
+
return {
|
|
59
|
+
...nextState,
|
|
60
|
+
selectedTemplate: resolvedTemplateId ?? template.id
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
export function resolveMatchingTemplateId(templates, state, config) {
|
|
64
|
+
if (!templates?.length)
|
|
65
|
+
return undefined;
|
|
66
|
+
const normalizedState = normalizeStateWithoutTemplate(state, config);
|
|
67
|
+
return templates.find(template => {
|
|
68
|
+
const templateState = normalizeStateWithoutTemplate(normalizeTemplateToComparableState(template, normalizedState, config), config);
|
|
69
|
+
return sameOrganizerState(templateState, normalizedState);
|
|
70
|
+
})?.id;
|
|
71
|
+
}
|
|
72
|
+
function normalizeTemplateToComparableState(template, baseState, config) {
|
|
73
|
+
const normalizedY = normalizeYSelection(template.yField, template.yAggregate, config.yFields, baseState);
|
|
74
|
+
return {
|
|
75
|
+
...baseState,
|
|
76
|
+
selectedX: hasOption(config.xFields, template.xField) ? template.xField : baseState.selectedX,
|
|
77
|
+
selectedY: normalizedY.selectedY,
|
|
78
|
+
selectedYAggregate: normalizedY.selectedYAggregate,
|
|
79
|
+
selectedGroupBy: hasOption(config.groups, template.groupBy) ? template.groupBy : baseState.selectedGroupBy,
|
|
80
|
+
selectedSlices: template.selectedSlices
|
|
81
|
+
? template.selectedSlices.filter(sliceId => hasOption(config.slices, sliceId))
|
|
82
|
+
: (baseState.selectedSlices || []),
|
|
83
|
+
selectedTemplate: undefined,
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
function normalizeStateWithoutTemplate(state, config) {
|
|
87
|
+
const base = state || {};
|
|
88
|
+
const normalizedY = normalizeYSelection(base.selectedY, base.selectedYAggregate, config.yFields);
|
|
89
|
+
return {
|
|
90
|
+
...base,
|
|
91
|
+
selectedX: hasOption(config.xFields, base.selectedX) ? base.selectedX : undefined,
|
|
92
|
+
selectedY: normalizedY.selectedY,
|
|
93
|
+
selectedYAggregate: normalizedY.selectedYAggregate,
|
|
94
|
+
selectedGroupBy: hasOption(config.groups, base.selectedGroupBy) ? base.selectedGroupBy : undefined,
|
|
95
|
+
selectedSlices: (base.selectedSlices || []).filter(sliceId => hasOption(config.slices, sliceId)),
|
|
96
|
+
selectedTemplate: undefined,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
function normalizeYSelection(selectedY, selectedYAggregate, yFields, fallbackState) {
|
|
100
|
+
if (!selectedY) {
|
|
101
|
+
return {
|
|
102
|
+
selectedY: fallbackState?.selectedY,
|
|
103
|
+
selectedYAggregate: fallbackState?.selectedYAggregate,
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
const directField = yFields?.find(field => field.id === selectedY);
|
|
107
|
+
if (directField) {
|
|
108
|
+
if (!directField.aggregates?.length) {
|
|
109
|
+
return { selectedY: directField.id, selectedYAggregate: undefined };
|
|
110
|
+
}
|
|
111
|
+
const matchedAggregate = selectedYAggregate
|
|
112
|
+
? directField.aggregates.find(aggregate => aggregate.id === selectedYAggregate)
|
|
113
|
+
: undefined;
|
|
114
|
+
const fallbackAggregate = fallbackState?.selectedY === directField.id
|
|
115
|
+
? directField.aggregates.find(aggregate => aggregate.id === fallbackState.selectedYAggregate)
|
|
116
|
+
: undefined;
|
|
117
|
+
const resolvedAggregate = matchedAggregate ?? fallbackAggregate ?? directField.aggregates[0];
|
|
118
|
+
return {
|
|
119
|
+
selectedY: directField.id,
|
|
120
|
+
selectedYAggregate: resolvedAggregate?.id,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
const aggregateParent = yFields?.find(field => field.aggregates?.some(aggregate => aggregate.id === selectedY));
|
|
124
|
+
if (aggregateParent) {
|
|
125
|
+
return {
|
|
126
|
+
selectedY: aggregateParent.id,
|
|
127
|
+
selectedYAggregate: selectedY,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
selectedY: fallbackState?.selectedY,
|
|
132
|
+
selectedYAggregate: fallbackState?.selectedYAggregate,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
function sameOrganizerState(left, right) {
|
|
136
|
+
return left.selectedX === right.selectedX
|
|
137
|
+
&& left.selectedY === right.selectedY
|
|
138
|
+
&& left.selectedYAggregate === right.selectedYAggregate
|
|
139
|
+
&& left.selectedGroupBy === right.selectedGroupBy
|
|
140
|
+
&& sameSlices(left.selectedSlices || [], right.selectedSlices || []);
|
|
141
|
+
}
|
|
142
|
+
function sameSlices(left, right) {
|
|
143
|
+
if (left.length !== right.length)
|
|
144
|
+
return false;
|
|
145
|
+
const sortedLeft = [...left].sort((a, b) => a.localeCompare(b));
|
|
146
|
+
const sortedRight = [...right].sort((a, b) => a.localeCompare(b));
|
|
147
|
+
return sortedLeft.every((value, index) => value === sortedRight[index]);
|
|
148
|
+
}
|
|
149
|
+
function hasOption(items, id) {
|
|
150
|
+
return !!id && !!items?.some(item => item.id === id);
|
|
151
|
+
}
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3JnYW5pemVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvb25ldGVtZS9qcXVlcnktb3JnYW5pemVyL3NyYy9saWIvbW9kZWxzL29yZ2FuaXplci11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFRQSxNQUFNLFVBQVUsWUFBWSxDQUFDLFVBQWlDO0lBQzVELE1BQU0sT0FBTyxHQUFhLEVBQUUsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsRUFBMkIsQ0FBQztJQUUvQyxLQUFLLE1BQU0sU0FBUyxJQUFJLFVBQVUsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ2pDLElBQUksUUFBUSxFQUFFO1lBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQ3ZCLEdBQUcsQ0FBQyxHQUFHLENBQUMsUUFBUSxFQUFFLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1lBQ0QsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNqQyxJQUFJLE1BQU0sRUFBRSxVQUFVLEVBQUU7Z0JBQ3RCLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ3RFO1NBQ0Y7YUFBTTtZQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFB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QUFJLENBQUMsZUFBZSxLQUFLLEtBQUssQ0FBQyxlQUFlO1dBQzlDLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxJQUFJLEVBQUUsRUFBRSxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxTQUFTLFVBQVUsQ0FBQyxJQUFjLEVBQUUsS0FBZTtJQUNqRCxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssS0FBSyxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMvQyxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbEUsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUF3QyxFQUFFLEVBQXNCO0lBQ2pGLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9yZ2FuaXplckNvbmZpZywgT3JnYW5pemVyU3RhdGUsIE9yZ2FuaXplclRlbXBsYXRlLCBPcmdhbml6ZXJZRmllbGQgfSBmcm9tICcuL29yZ2FuaXplci1jb25maWcuaW50ZXJmYWNlJztcblxuZXhwb3J0IGludGVyZmFjZSBPcmdhbml6ZXJZSW5kaWNhdG9yIHtcbiAgaWQ6IHN0cmluZztcbiAgbGFiZWw6IHN0cmluZztcbiAgZ3JvdXA/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFlGaWVsZHMoaW5kaWNhdG9yczogT3JnYW5pemVyWUluZGljYXRvcltdKTogT3JnYW5pemVyWUZpZWxkW10ge1xuICBjb25zdCBvcmRlcmVkOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCBtYXAgPSBuZXcgTWFwPHN0cmluZywgT3JnYW5pemVyWUZpZWxkPigpO1xuXG4gIGZvciAoY29uc3QgaW5kaWNhdG9yIG9mIGluZGljYXRvcnMpIHtcbiAgICBjb25zdCBncm91cEtleSA9IGluZGljYXRvci5ncm91cDtcbiAgICBpZiAoZ3JvdXBLZXkpIHtcbiAgICAgIGlmICghbWFwLmhhcyhncm91cEtleSkpIHtcbiAgICAgICAgb3JkZXJlZC5wdXNoKGdyb3VwS2V5KTtcbiAgICAgICAgbWFwLnNldChncm91cEtleSwgeyBpZDogZ3JvdXBLZXksIGxhYmVsOiBncm91cEtleSwgYWdncmVnYXRlczogW10gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJlbnQgPSBtYXAuZ2V0KGdyb3VwS2V5KTtcbiAgICAgIGlmIChwYXJlbnQ/LmFnZ3JlZ2F0ZXMpIHtcbiAgICAgICAgcGFyZW50LmFnZ3JlZ2F0ZXMucHVzaCh7IGlkOiBpbmRpY2F0b3IuaWQsIGxhYmVsOiBpbmRpY2F0b3IubGFiZWwgfSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG9yZGVyZWQucHVzaChpbmRpY2F0b3IuaWQpO1xuICAgICAgbWFwLnNldChpbmRpY2F0b3IuaWQsIHsgaWQ6IGluZGljYXRvci5pZCwgbGFiZWw6IGluZGljYXRvci5sYWJlbCB9KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3JkZXJlZC5tYXAoayA9PiBtYXAuZ2V0KGspKS5maWx0ZXIoKGYpOiBmIGlzIE9yZ2FuaXplcllGaWVsZCA9PiAhIWYpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZVlLZXkoXG4gIHNlbGVjdGVkWTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHN0cmluZyB8IHVuZGVmaW5lZFxuKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgcmV0dXJuIHNlbGVjdGVkWUFnZ3JlZ2F0ZSA/PyBzZWxlY3RlZFk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVPcmdhbml6ZXJTdGF0ZShcbiAgc3RhdGU6IE9yZ2FuaXplclN0YXRlIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IGJhc2UgPSBzdGF0ZSB8fCB7fTtcbiAgY29uc3Qgbm9ybWFsaXplZFkgPSBub3JtYWxpemVZU2VsZWN0aW9uKGJhc2Uuc2VsZWN0ZWRZLCBiYXNlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSwgY29uZmlnLnlGaWVsZHMpO1xuICBjb25zdCBzZWxlY3RlZFggPSBoYXNPcHRpb24oY29uZmlnLnhGaWVsZHMsIGJhc2Uuc2VsZWN0ZWRYKSA/IGJhc2Uuc2VsZWN0ZWRYIDogdW5kZWZpbmVkO1xuICBjb25zdCBzZWxlY3RlZEdyb3VwQnkgPSBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgYmFzZS5zZWxlY3RlZEdyb3VwQnkpID8gYmFzZS5zZWxlY3RlZEdyb3VwQnkgOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHNlbGVjdGVkU2xpY2VzID0gKGJhc2Uuc2VsZWN0ZWRTbGljZXMgfHwgW10pLmZpbHRlcihzbGljZUlkID0+IGhhc09wdGlvbihjb25maWcuc2xpY2VzLCBzbGljZUlkKSk7XG5cbiAgY29uc3Qgbm9ybWFsaXplZDogT3JnYW5pemVyU3RhdGUgPSB7XG4gICAgLi4uYmFzZSxcbiAgICBzZWxlY3RlZFgsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5LFxuICAgIHNlbGVjdGVkU2xpY2VzLFxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4ubm9ybWFsaXplZCxcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiByZXNvbHZlTWF0Y2hpbmdUZW1wbGF0ZUlkKGNvbmZpZy50ZW1wbGF0ZXMsIG5vcm1hbGl6ZWQsIGNvbmZpZylcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZVRlbXBsYXRlVG9TdGF0ZShcbiAgdGVtcGxhdGU6IE9yZ2FuaXplclRlbXBsYXRlLFxuICBjdXJyZW50U3RhdGU6IE9yZ2FuaXplclN0YXRlIHwgdW5kZWZpbmVkLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IGJhc2UgPSBub3JtYWxpemVPcmdhbml6ZXJTdGF0ZShjdXJyZW50U3RhdGUsIGNvbmZpZyk7XG4gIGNvbnN0IG5vcm1hbGl6ZWRZID0gbm9ybWFsaXplWVNlbGVjdGlvbih0ZW1wbGF0ZS55RmllbGQsIHRlbXBsYXRlLnlBZ2dyZWdhdGUsIGNvbmZpZy55RmllbGRzLCBiYXNlKTtcblxuICBjb25zdCBuZXh0U3RhdGU6IE9yZ2FuaXplclN0YXRlID0ge1xuICAgIHZpZXdNb2RlOiBiYXNlLnZpZXdNb2RlLFxuICAgIHZpc2libGVGaWVsZHM6IGJhc2UudmlzaWJsZUZpZWxkcyxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgdGVtcGxhdGUueEZpZWxkKSA/IHRlbXBsYXRlLnhGaWVsZCA6IGJhc2Uuc2VsZWN0ZWRYLFxuICAgIHNlbGVjdGVkWTogbm9ybWFsaXplZFkuc2VsZWN0ZWRZLFxuICAgIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogbm9ybWFsaXplZFkuc2VsZWN0ZWRZQWdncmVnYXRlLFxuICAgIHNlbGVjdGVkR3JvdXBCeTogaGFzT3B0aW9uKGNvbmZpZy5ncm91cHMsIHRlbXBsYXRlLmdyb3VwQnkpID8gdGVtcGxhdGUuZ3JvdXBCeSA6IGJhc2Uuc2VsZWN0ZWRHcm91cEJ5LFxuICAgIHNlbGVjdGVkU2xpY2VzOiAodGVtcGxhdGUuc2VsZWN0ZWRTbGljZXMgfHwgW10pLmZpbHRlcihzbGljZUlkID0+IGhhc09wdGlvbihjb25maWcuc2xpY2VzLCBzbGljZUlkKSksXG4gIH07XG5cbiAgY29uc3QgcmVzb2x2ZWRUZW1wbGF0ZUlkID0gcmVzb2x2ZU1hdGNoaW5nVGVtcGxhdGVJZChjb25maWcudGVtcGxhdGVzLCBuZXh0U3RhdGUsIGNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgLi4ubmV4dFN0YXRlLFxuICAgIHNlbGVjdGVkVGVtcGxhdGU6IHJlc29sdmVkVGVtcGxhdGVJZCA/PyB0ZW1wbGF0ZS5pZFxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1hdGNoaW5nVGVtcGxhdGVJZChcbiAgdGVtcGxhdGVzOiBPcmdhbml6ZXJUZW1wbGF0ZVtdIHwgdW5kZWZpbmVkLFxuICBzdGF0ZTogT3JnYW5pemVyU3RhdGUgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGljazxPcmdhbml6ZXJDb25maWcsICd4RmllbGRzJyB8ICd5RmllbGRzJyB8ICdncm91cHMnIHwgJ3NsaWNlcycgfCAndGVtcGxhdGVzJz5cbik6IHN0cmluZyB8IHVuZGVmaW5lZCB7XG4gIGlmICghdGVtcGxhdGVzPy5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgY29uc3Qgbm9ybWFsaXplZFN0YXRlID0gbm9ybWFsaXplU3RhdGVXaXRob3V0VGVtcGxhdGUoc3RhdGUsIGNvbmZpZyk7XG4gIHJldHVybiB0ZW1wbGF0ZXMuZmluZCh0ZW1wbGF0ZSA9PiB7XG4gICAgY29uc3QgdGVtcGxhdGVTdGF0ZSA9IG5vcm1hbGl6ZVN0YXRlV2l0aG91dFRlbXBsYXRlKFxuICAgICAgbm9ybWFsaXplVGVtcGxhdGVUb0NvbXBhcmFibGVTdGF0ZSh0ZW1wbGF0ZSwgbm9ybWFsaXplZFN0YXRlLCBjb25maWcpLFxuICAgICAgY29uZmlnXG4gICAgKTtcbiAgICByZXR1cm4gc2FtZU9yZ2FuaXplclN0YXRlKHRlbXBsYXRlU3RhdGUsIG5vcm1hbGl6ZWRTdGF0ZSk7XG4gIH0pPy5pZDtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplVGVtcGxhdGVUb0NvbXBhcmFibGVTdGF0ZShcbiAgdGVtcGxhdGU6IE9yZ2FuaXplclRlbXBsYXRlLFxuICBiYXNlU3RhdGU6IE9yZ2FuaXplclN0YXRlLFxuICBjb25maWc6IFBpY2s8T3JnYW5pemVyQ29uZmlnLCAneEZpZWxkcycgfCAneUZpZWxkcycgfCAnZ3JvdXBzJyB8ICdzbGljZXMnIHwgJ3RlbXBsYXRlcyc+XG4pOiBPcmdhbml6ZXJTdGF0ZSB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRZID0gbm9ybWFsaXplWVNlbGVjdGlvbih0ZW1wbGF0ZS55RmllbGQsIHRlbXBsYXRlLnlBZ2dyZWdhdGUsIGNvbmZpZy55RmllbGRzLCBiYXNlU3RhdGUpO1xuICByZXR1cm4ge1xuICAgIC4uLmJhc2VTdGF0ZSxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgdGVtcGxhdGUueEZpZWxkKSA/IHRlbXBsYXRlLnhGaWVsZCA6IGJhc2VTdGF0ZS5zZWxlY3RlZFgsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgdGVtcGxhdGUuZ3JvdXBCeSkgPyB0ZW1wbGF0ZS5ncm91cEJ5IDogYmFzZVN0YXRlLnNlbGVjdGVkR3JvdXBCeSxcbiAgICBzZWxlY3RlZFNsaWNlczogdGVtcGxhdGUuc2VsZWN0ZWRTbGljZXNcbiAgICAgID8gdGVtcGxhdGUuc2VsZWN0ZWRTbGljZXMuZmlsdGVyKHNsaWNlSWQgPT4gaGFzT3B0aW9uKGNvbmZpZy5zbGljZXMsIHNsaWNlSWQpKVxuICAgICAgOiAoYmFzZVN0YXRlLnNlbGVjdGVkU2xpY2VzIHx8IFtdKSxcbiAgICBzZWxlY3RlZFRlbXBsYXRlOiB1bmRlZmluZWQsXG4gIH07XG59XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVN0YXRlV2l0aG91dFRlbXBsYXRlKFxuICBzdGF0ZTogT3JnYW5pemVyU3RhdGUgfCB1bmRlZmluZWQsXG4gIGNvbmZpZzogUGljazxPcmdhbml6ZXJDb25maWcsICd4RmllbGRzJyB8ICd5RmllbGRzJyB8ICdncm91cHMnIHwgJ3NsaWNlcycgfCAndGVtcGxhdGVzJz5cbik6IE9yZ2FuaXplclN0YXRlIHtcbiAgY29uc3QgYmFzZSA9IHN0YXRlIHx8IHt9O1xuICBjb25zdCBub3JtYWxpemVkWSA9IG5vcm1hbGl6ZVlTZWxlY3Rpb24oYmFzZS5zZWxlY3RlZFksIGJhc2Uuc2VsZWN0ZWRZQWdncmVnYXRlLCBjb25maWcueUZpZWxkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uYmFzZSxcbiAgICBzZWxlY3RlZFg6IGhhc09wdGlvbihjb25maWcueEZpZWxkcywgYmFzZS5zZWxlY3RlZFgpID8gYmFzZS5zZWxlY3RlZFggOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRZOiBub3JtYWxpemVkWS5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBub3JtYWxpemVkWS5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgc2VsZWN0ZWRHcm91cEJ5OiBoYXNPcHRpb24oY29uZmlnLmdyb3VwcywgYmFzZS5zZWxlY3RlZEdyb3VwQnkpID8gYmFzZS5zZWxlY3RlZEdyb3VwQnkgOiB1bmRlZmluZWQsXG4gICAgc2VsZWN0ZWRTbGljZXM6IChiYXNlLnNlbGVjdGVkU2xpY2VzIHx8IFtdKS5maWx0ZXIoc2xpY2VJZCA9PiBoYXNPcHRpb24oY29uZmlnLnNsaWNlcywgc2xpY2VJZCkpLFxuICAgIHNlbGVjdGVkVGVtcGxhdGU6IHVuZGVmaW5lZCxcbiAgfTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplWVNlbGVjdGlvbihcbiAgc2VsZWN0ZWRZOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogc3RyaW5nIHwgdW5kZWZpbmVkLFxuICB5RmllbGRzOiBPcmdhbml6ZXJZRmllbGRbXSB8IHVuZGVmaW5lZCxcbiAgZmFsbGJhY2tTdGF0ZT86IE9yZ2FuaXplclN0YXRlXG4pOiBQaWNrPE9yZ2FuaXplclN0YXRlLCAnc2VsZWN0ZWRZJyB8ICdzZWxlY3RlZFlBZ2dyZWdhdGUnPiB7XG4gIGlmICghc2VsZWN0ZWRZKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogZmFsbGJhY2tTdGF0ZT8uc2VsZWN0ZWRZLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IGRpcmVjdEZpZWxkID0geUZpZWxkcz8uZmluZChmaWVsZCA9PiBmaWVsZC5pZCA9PT0gc2VsZWN0ZWRZKTtcbiAgaWYgKGRpcmVjdEZpZWxkKSB7XG4gICAgaWYgKCFkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzPy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7IHNlbGVjdGVkWTogZGlyZWN0RmllbGQuaWQsIHNlbGVjdGVkWUFnZ3JlZ2F0ZTogdW5kZWZpbmVkIH07XG4gICAgfVxuXG4gICAgY29uc3QgbWF0Y2hlZEFnZ3JlZ2F0ZSA9IHNlbGVjdGVkWUFnZ3JlZ2F0ZVxuICAgICAgPyBkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzLmZpbmQoYWdncmVnYXRlID0+IGFnZ3JlZ2F0ZS5pZCA9PT0gc2VsZWN0ZWRZQWdncmVnYXRlKVxuICAgICAgOiB1bmRlZmluZWQ7XG4gICAgY29uc3QgZmFsbGJhY2tBZ2dyZWdhdGUgPSBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFkgPT09IGRpcmVjdEZpZWxkLmlkXG4gICAgICA/IGRpcmVjdEZpZWxkLmFnZ3JlZ2F0ZXMuZmluZChhZ2dyZWdhdGUgPT4gYWdncmVnYXRlLmlkID09PSBmYWxsYmFja1N0YXRlLnNlbGVjdGVkWUFnZ3JlZ2F0ZSlcbiAgICAgIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlc29sdmVkQWdncmVnYXRlID0gbWF0Y2hlZEFnZ3JlZ2F0ZSA/PyBmYWxsYmFja0FnZ3JlZ2F0ZSA/PyBkaXJlY3RGaWVsZC5hZ2dyZWdhdGVzWzBdO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogZGlyZWN0RmllbGQuaWQsXG4gICAgICBzZWxlY3RlZFlBZ2dyZWdhdGU6IHJlc29sdmVkQWdncmVnYXRlPy5pZCxcbiAgICB9O1xuICB9XG5cbiAgY29uc3QgYWdncmVnYXRlUGFyZW50ID0geUZpZWxkcz8uZmluZChmaWVsZCA9PiBmaWVsZC5hZ2dyZWdhdGVzPy5zb21lKGFnZ3JlZ2F0ZSA9PiBhZ2dyZWdhdGUuaWQgPT09IHNlbGVjdGVkWSkpO1xuICBpZiAoYWdncmVnYXRlUGFyZW50KSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHNlbGVjdGVkWTogYWdncmVnYXRlUGFyZW50LmlkLFxuICAgICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBzZWxlY3RlZFksXG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRZOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFksXG4gICAgc2VsZWN0ZWRZQWdncmVnYXRlOiBmYWxsYmFja1N0YXRlPy5zZWxlY3RlZFlBZ2dyZWdhdGUsXG4gIH07XG59XG5cbmZ1bmN0aW9uIHNhbWVPcmdhbml6ZXJTdGF0ZShsZWZ0OiBPcmdhbml6ZXJTdGF0ZSwgcmlnaHQ6IE9yZ2FuaXplclN0YXRlKTogYm9vbGVhbiB7XG4gIHJldHVybiBsZWZ0LnNlbGVjdGVkWCA9PT0gcmlnaHQuc2VsZWN0ZWRYXG4gICAgJiYgbGVmdC5zZWxlY3RlZFkgPT09IHJpZ2h0LnNlbGVjdGVkWVxuICAgICYmIGxlZnQuc2VsZWN0ZWRZQWdncmVnYXRlID09PSByaWdodC5zZWxlY3RlZFlBZ2dyZWdhdGVcbiAgICAmJiBsZWZ0LnNlbGVjdGVkR3JvdXBCeSA9PT0gcmlnaHQuc2VsZWN0ZWRHcm91cEJ5XG4gICAgJiYgc2FtZVNsaWNlcyhsZWZ0LnNlbGVjdGVkU2xpY2VzIHx8IFtdLCByaWdodC5zZWxlY3RlZFNsaWNlcyB8fCBbXSk7XG59XG5cbmZ1bmN0aW9uIHNhbWVTbGljZXMobGVmdDogc3RyaW5nW10sIHJpZ2h0OiBzdHJpbmdbXSk6IGJvb2xlYW4ge1xuICBpZiAobGVmdC5sZW5ndGggIT09IHJpZ2h0Lmxlbmd0aCkgcmV0dXJuIGZhbHNlO1xuICBjb25zdCBzb3J0ZWRMZWZ0ID0gWy4uLmxlZnRdLnNvcnQoKGEsIGIpID0+IGEubG9jYWxlQ29tcGFyZShiKSk7XG4gIGNvbnN0IHNvcnRlZFJpZ2h0ID0gWy4uLnJpZ2h0XS5zb3J0KChhLCBiKSA9PiBhLmxvY2FsZUNvbXBhcmUoYikpO1xuICByZXR1cm4gc29ydGVkTGVmdC5ldmVyeSgodmFsdWUsIGluZGV4KSA9PiB2YWx1ZSA9PT0gc29ydGVkUmlnaHRbaW5kZXhdKTtcbn1cblxuZnVuY3Rpb24gaGFzT3B0aW9uKGl0ZW1zOiBBcnJheTx7IGlkOiBzdHJpbmcgfT4gfCB1bmRlZmluZWQsIGlkOiBzdHJpbmcgfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgcmV0dXJuICEhaWQgJiYgISFpdGVtcz8uc29tZShpdGVtID0+IGl0ZW0uaWQgPT09IGlkKTtcbn1cbiJdfQ==
|