@kepler.gl/reducers 3.3.0-alpha.14 → 3.3.0-alpha.16
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/dist/cjs/combined-updaters.js +166 -8
- package/dist/cjs/composers.js +4 -5
- package/dist/cjs/dataset-ops-updaters.js +289 -0
- package/dist/cjs/dataset-ops-updaters.spec.js +257 -0
- package/dist/cjs/interaction-utils.js +156 -4
- package/dist/cjs/layer-utils.js +133 -8
- package/dist/cjs/ui-state-updaters.js +115 -48
- package/dist/cjs/ui-state.js +2 -2
- package/dist/cjs/vis-state-merger.js +35 -4
- package/dist/cjs/vis-state-selectors.js +5 -4
- package/dist/cjs/vis-state-updaters.js +731 -232
- package/dist/cjs/vis-state.js +2 -2
- package/dist/combined-updaters.d.ts +21 -1
- package/dist/composers.d.ts +3 -0
- package/dist/dataset-ops-updaters.d.ts +18 -0
- package/dist/dataset-ops-updaters.spec.d.ts +1 -0
- package/dist/esm/combined-updaters.js +166 -8
- package/dist/esm/composers.js +3 -2
- package/dist/esm/dataset-ops-updaters.js +274 -0
- package/dist/esm/dataset-ops-updaters.spec.js +256 -0
- package/dist/esm/interaction-utils.js +150 -1
- package/dist/esm/layer-utils.js +131 -8
- package/dist/esm/ui-state-updaters.js +115 -48
- package/dist/esm/ui-state.js +2 -2
- package/dist/esm/vis-state-merger.js +35 -4
- package/dist/esm/vis-state-selectors.js +5 -4
- package/dist/esm/vis-state-updaters.js +687 -237
- package/dist/esm/vis-state.js +2 -2
- package/dist/interaction-utils.d.ts +21 -1
- package/dist/layer-utils.d.ts +16 -0
- package/dist/ui-state-updaters.d.ts +32 -0
- package/dist/vis-state-updaters.d.ts +38 -12
- package/dist/vis-state.d.ts +20 -0
- package/package.json +16 -16
|
@@ -0,0 +1,289 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.addGroupByUpdater = addGroupByUpdater;
|
|
8
|
+
exports.addJoinUpdater = addJoinUpdater;
|
|
9
|
+
exports.addSpatialJoinUpdater = addSpatialJoinUpdater;
|
|
10
|
+
exports.executeGroupBy = executeGroupBy;
|
|
11
|
+
exports.executeJoin = executeJoin;
|
|
12
|
+
exports.executeSpatialJoin = executeSpatialJoin;
|
|
13
|
+
exports.removeDatasetOpUpdater = removeDatasetOpUpdater;
|
|
14
|
+
exports.removeOpsForDatasets = removeOpsForDatasets;
|
|
15
|
+
exports.setGroupByConfigUpdater = setGroupByConfigUpdater;
|
|
16
|
+
exports.setJoinConfigUpdater = setJoinConfigUpdater;
|
|
17
|
+
exports.setSpatialJoinConfigUpdater = setSpatialJoinConfigUpdater;
|
|
18
|
+
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
19
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
20
|
+
var _commonUtils = require("@kepler.gl/common-utils");
|
|
21
|
+
var _table = require("@kepler.gl/table");
|
|
22
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
23
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
|
|
24
|
+
// Copyright contributors to the kepler.gl project
|
|
25
|
+
function deactivateOps(ops) {
|
|
26
|
+
return ops.map(function (op) {
|
|
27
|
+
return _objectSpread(_objectSpread({}, op), {}, {
|
|
28
|
+
isConfigActive: false
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function randomTwoDigitSuffix() {
|
|
33
|
+
return String(Math.floor(Math.random() * 100)).padStart(2, '0');
|
|
34
|
+
}
|
|
35
|
+
function defaultGroupByLabel() {
|
|
36
|
+
return "group-by-".concat(randomTwoDigitSuffix());
|
|
37
|
+
}
|
|
38
|
+
function defaultJoinLabel() {
|
|
39
|
+
return "join-dataset-".concat(randomTwoDigitSuffix());
|
|
40
|
+
}
|
|
41
|
+
function defaultSpatialJoinLabel(resultId) {
|
|
42
|
+
return "spatial-join-".concat(resultId);
|
|
43
|
+
}
|
|
44
|
+
function addGroupByUpdater(state, action) {
|
|
45
|
+
var dataset = state.datasets[action.dataId];
|
|
46
|
+
if (!(0, _table.isTabularDatasetForOps)(dataset)) {
|
|
47
|
+
return state;
|
|
48
|
+
}
|
|
49
|
+
var id = (0, _commonUtils.generateHashId)(6);
|
|
50
|
+
var resultId = (0, _commonUtils.generateHashId)(6);
|
|
51
|
+
var op = {
|
|
52
|
+
id: id,
|
|
53
|
+
dataId: action.dataId,
|
|
54
|
+
fieldName: null,
|
|
55
|
+
aggregations: (0, _table.defaultAggregationsForFields)(dataset.fields),
|
|
56
|
+
resultId: resultId,
|
|
57
|
+
resultLabel: defaultGroupByLabel(),
|
|
58
|
+
isConfigActive: true,
|
|
59
|
+
error: null
|
|
60
|
+
};
|
|
61
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
62
|
+
groupBys: [].concat((0, _toConsumableArray2["default"])(deactivateOps(state.groupBys)), [op]),
|
|
63
|
+
joins: deactivateOps(state.joins)
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
function setGroupByConfigUpdater(state, action) {
|
|
67
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
68
|
+
groupBys: state.groupBys.map(function (op) {
|
|
69
|
+
var _action$config$error;
|
|
70
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
71
|
+
error: (_action$config$error = action.config.error) !== null && _action$config$error !== void 0 ? _action$config$error : null
|
|
72
|
+
}) : op;
|
|
73
|
+
})
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
function executeGroupBy(state, action) {
|
|
77
|
+
var op = state.groupBys.find(function (item) {
|
|
78
|
+
return item.id === action.id;
|
|
79
|
+
});
|
|
80
|
+
var dataset = op ? state.datasets[op.dataId] : undefined;
|
|
81
|
+
if (!op || !dataset || !op.fieldName) {
|
|
82
|
+
return {
|
|
83
|
+
state: setGroupByConfigUpdater(state, {
|
|
84
|
+
id: action.id,
|
|
85
|
+
config: {
|
|
86
|
+
error: 'Select a grouping field'
|
|
87
|
+
}
|
|
88
|
+
})
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
try {
|
|
92
|
+
var proto = (0, _table.groupByDataset)(dataset, {
|
|
93
|
+
fieldName: op.fieldName,
|
|
94
|
+
aggregations: op.aggregations,
|
|
95
|
+
label: op.resultLabel,
|
|
96
|
+
resultId: op.resultId,
|
|
97
|
+
operationId: op.id
|
|
98
|
+
});
|
|
99
|
+
return {
|
|
100
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
101
|
+
groupBys: state.groupBys.map(function (item) {
|
|
102
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
103
|
+
isConfigActive: false,
|
|
104
|
+
error: null
|
|
105
|
+
}) : item;
|
|
106
|
+
})
|
|
107
|
+
}),
|
|
108
|
+
proto: proto
|
|
109
|
+
};
|
|
110
|
+
} catch (error) {
|
|
111
|
+
return {
|
|
112
|
+
state: setGroupByConfigUpdater(state, {
|
|
113
|
+
id: action.id,
|
|
114
|
+
config: {
|
|
115
|
+
error: error instanceof Error ? error.message : String(error)
|
|
116
|
+
}
|
|
117
|
+
})
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function addJoinUpdater(state, action) {
|
|
122
|
+
var dataset = state.datasets[action.dataId];
|
|
123
|
+
if (!(0, _table.isTabularDatasetForOps)(dataset)) {
|
|
124
|
+
return state;
|
|
125
|
+
}
|
|
126
|
+
var implementation = action.implementation || 'simple';
|
|
127
|
+
var id = (0, _commonUtils.generateHashId)(6);
|
|
128
|
+
var resultId = (0, _commonUtils.generateHashId)(6);
|
|
129
|
+
var op = {
|
|
130
|
+
id: id,
|
|
131
|
+
implementation: implementation,
|
|
132
|
+
leftDataId: action.dataId,
|
|
133
|
+
rightDataId: null,
|
|
134
|
+
leftField: null,
|
|
135
|
+
rightField: null,
|
|
136
|
+
type: 'LEFT',
|
|
137
|
+
aggregations: {},
|
|
138
|
+
leftGeo: implementation === 'spatial' ? (0, _table.suggestSpatialGeo)(dataset.fields) : null,
|
|
139
|
+
rightGeo: null,
|
|
140
|
+
predicate: implementation === 'spatial' ? 'intersects' : undefined,
|
|
141
|
+
resultId: resultId,
|
|
142
|
+
resultLabel: implementation === 'spatial' ? defaultSpatialJoinLabel(resultId) : defaultJoinLabel(),
|
|
143
|
+
isConfigActive: true,
|
|
144
|
+
error: null
|
|
145
|
+
};
|
|
146
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
147
|
+
joins: [].concat((0, _toConsumableArray2["default"])(deactivateOps(state.joins)), [op]),
|
|
148
|
+
groupBys: deactivateOps(state.groupBys)
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
function setJoinConfigUpdater(state, action) {
|
|
152
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
153
|
+
joins: state.joins.map(function (op) {
|
|
154
|
+
var _action$config$error2;
|
|
155
|
+
return op.id === action.id ? _objectSpread(_objectSpread(_objectSpread({}, op), action.config), {}, {
|
|
156
|
+
error: (_action$config$error2 = action.config.error) !== null && _action$config$error2 !== void 0 ? _action$config$error2 : null
|
|
157
|
+
}) : op;
|
|
158
|
+
})
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
function executeJoin(state, action) {
|
|
162
|
+
var op = state.joins.find(function (item) {
|
|
163
|
+
return item.id === action.id && item.implementation !== 'spatial';
|
|
164
|
+
});
|
|
165
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
166
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
167
|
+
if (!op || !left || !right || !op.leftField || !op.rightField) {
|
|
168
|
+
return {
|
|
169
|
+
state: setJoinConfigUpdater(state, {
|
|
170
|
+
id: action.id,
|
|
171
|
+
config: {
|
|
172
|
+
error: 'Select datasets and join keys'
|
|
173
|
+
}
|
|
174
|
+
})
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
try {
|
|
178
|
+
var proto = (0, _table.joinDatasets)(left, right, {
|
|
179
|
+
leftField: op.leftField,
|
|
180
|
+
rightField: op.rightField,
|
|
181
|
+
type: op.type,
|
|
182
|
+
leftColumns: op.leftColumns,
|
|
183
|
+
rightColumns: op.rightColumns,
|
|
184
|
+
label: op.resultLabel,
|
|
185
|
+
resultId: op.resultId,
|
|
186
|
+
operationId: op.id
|
|
187
|
+
});
|
|
188
|
+
return {
|
|
189
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
190
|
+
joins: state.joins.map(function (item) {
|
|
191
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
192
|
+
isConfigActive: false,
|
|
193
|
+
error: null
|
|
194
|
+
}) : item;
|
|
195
|
+
})
|
|
196
|
+
}),
|
|
197
|
+
proto: proto
|
|
198
|
+
};
|
|
199
|
+
} catch (error) {
|
|
200
|
+
return {
|
|
201
|
+
state: setJoinConfigUpdater(state, {
|
|
202
|
+
id: action.id,
|
|
203
|
+
config: {
|
|
204
|
+
error: error instanceof Error ? error.message : String(error)
|
|
205
|
+
}
|
|
206
|
+
})
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
function addSpatialJoinUpdater(state, action) {
|
|
211
|
+
return addJoinUpdater(state, {
|
|
212
|
+
dataId: action.dataId,
|
|
213
|
+
implementation: 'spatial'
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function setSpatialJoinConfigUpdater(state, action) {
|
|
217
|
+
return setJoinConfigUpdater(state, action);
|
|
218
|
+
}
|
|
219
|
+
function executeSpatialJoin(state, action) {
|
|
220
|
+
var op = state.joins.find(function (item) {
|
|
221
|
+
return item.id === action.id && item.implementation === 'spatial';
|
|
222
|
+
});
|
|
223
|
+
var left = op ? state.datasets[op.leftDataId] : undefined;
|
|
224
|
+
var right = op !== null && op !== void 0 && op.rightDataId ? state.datasets[op.rightDataId] : undefined;
|
|
225
|
+
if (!op || !left || !right || !op.leftGeo || !op.rightGeo) {
|
|
226
|
+
return {
|
|
227
|
+
state: setJoinConfigUpdater(state, {
|
|
228
|
+
id: action.id,
|
|
229
|
+
config: {
|
|
230
|
+
error: 'Select datasets and geometry fields'
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
try {
|
|
236
|
+
var proto = (0, _table.spatialJoinDatasets)(left, right, {
|
|
237
|
+
leftGeo: op.leftGeo,
|
|
238
|
+
rightGeo: op.rightGeo,
|
|
239
|
+
aggregations: op.aggregations,
|
|
240
|
+
leftColumns: op.leftColumns,
|
|
241
|
+
predicate: op.predicate || 'intersects',
|
|
242
|
+
label: op.resultLabel,
|
|
243
|
+
resultId: op.resultId,
|
|
244
|
+
operationId: op.id
|
|
245
|
+
});
|
|
246
|
+
return {
|
|
247
|
+
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
248
|
+
joins: state.joins.map(function (item) {
|
|
249
|
+
return item.id === op.id ? _objectSpread(_objectSpread({}, item), {}, {
|
|
250
|
+
isConfigActive: false,
|
|
251
|
+
error: null
|
|
252
|
+
}) : item;
|
|
253
|
+
})
|
|
254
|
+
}),
|
|
255
|
+
proto: proto
|
|
256
|
+
};
|
|
257
|
+
} catch (error) {
|
|
258
|
+
return {
|
|
259
|
+
state: setJoinConfigUpdater(state, {
|
|
260
|
+
id: action.id,
|
|
261
|
+
config: {
|
|
262
|
+
error: error instanceof Error ? error.message : String(error)
|
|
263
|
+
}
|
|
264
|
+
})
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
function removeDatasetOpUpdater(state, action) {
|
|
269
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
270
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
271
|
+
return op.id !== action.id;
|
|
272
|
+
}),
|
|
273
|
+
joins: state.joins.filter(function (op) {
|
|
274
|
+
return op.id !== action.id;
|
|
275
|
+
})
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
function removeOpsForDatasets(state, dataIds) {
|
|
279
|
+
var ids = new Set(dataIds);
|
|
280
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
281
|
+
groupBys: state.groupBys.filter(function (op) {
|
|
282
|
+
return !ids.has(op.dataId) && !ids.has(op.resultId);
|
|
283
|
+
}),
|
|
284
|
+
joins: state.joins.filter(function (op) {
|
|
285
|
+
return !ids.has(op.leftDataId) && !(op.rightDataId && ids.has(op.rightDataId)) && !ids.has(op.resultId);
|
|
286
|
+
})
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29tbW9uVXRpbHMiLCJyZXF1aXJlIiwiX3RhYmxlIiwib3duS2V5cyIsImUiLCJyIiwidCIsIk9iamVjdCIsImtleXMiLCJnZXRPd25Qcm9wZXJ0eVN5bWJvbHMiLCJvIiwiZmlsdGVyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIiwiZW51bWVyYWJsZSIsInB1c2giLCJhcHBseSIsIl9vYmplY3RTcHJlYWQiLCJhcmd1bWVudHMiLCJsZW5ndGgiLCJmb3JFYWNoIiwiX2RlZmluZVByb3BlcnR5MiIsImdldE93blByb3BlcnR5RGVzY3JpcHRvcnMiLCJkZWZpbmVQcm9wZXJ0aWVzIiwiZGVmaW5lUHJvcGVydHkiLCJkZWFjdGl2YXRlT3BzIiwib3BzIiwibWFwIiwib3AiLCJpc0NvbmZpZ0FjdGl2ZSIsInJhbmRvbVR3b0RpZ2l0U3VmZml4IiwiU3RyaW5nIiwiTWF0aCIsImZsb29yIiwicmFuZG9tIiwicGFkU3RhcnQiLCJkZWZhdWx0R3JvdXBCeUxhYmVsIiwiY29uY2F0IiwiZGVmYXVsdEpvaW5MYWJlbCIsImRlZmF1bHRTcGF0aWFsSm9pbkxhYmVsIiwicmVzdWx0SWQiLCJhZGRHcm91cEJ5VXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwiZGF0YXNldCIsImRhdGFzZXRzIiwiZGF0YUlkIiwiaXNUYWJ1bGFyRGF0YXNldEZvck9wcyIsImlkIiwiZ2VuZXJhdGVIYXNoSWQiLCJmaWVsZE5hbWUiLCJhZ2dyZWdhdGlvbnMiLCJkZWZhdWx0QWdncmVnYXRpb25zRm9yRmllbGRzIiwiZmllbGRzIiwicmVzdWx0TGFiZWwiLCJlcnJvciIsImdyb3VwQnlzIiwiX3RvQ29uc3VtYWJsZUFycmF5MiIsImpvaW5zIiwic2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvciIsImNvbmZpZyIsImV4ZWN1dGVHcm91cEJ5IiwiZmluZCIsIml0ZW0iLCJ1bmRlZmluZWQiLCJwcm90byIsImdyb3VwQnlEYXRhc2V0IiwibGFiZWwiLCJvcGVyYXRpb25JZCIsIkVycm9yIiwibWVzc2FnZSIsImFkZEpvaW5VcGRhdGVyIiwiaW1wbGVtZW50YXRpb24iLCJsZWZ0RGF0YUlkIiwicmlnaHREYXRhSWQiLCJsZWZ0RmllbGQiLCJyaWdodEZpZWxkIiwidHlwZSIsImxlZnRHZW8iLCJzdWdnZXN0U3BhdGlhbEdlbyIsInJpZ2h0R2VvIiwicHJlZGljYXRlIiwic2V0Sm9pbkNvbmZpZ1VwZGF0ZXIiLCJfYWN0aW9uJGNvbmZpZyRlcnJvcjIiLCJleGVjdXRlSm9pbiIsImxlZnQiLCJyaWdodCIsImpvaW5EYXRhc2V0cyIsImxlZnRDb2x1bW5zIiwicmlnaHRDb2x1bW5zIiwiYWRkU3BhdGlhbEpvaW5VcGRhdGVyIiwic2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyIiwiZXhlY3V0ZVNwYXRpYWxKb2luIiwic3BhdGlhbEpvaW5EYXRhc2V0cyIsInJlbW92ZURhdGFzZXRPcFVwZGF0ZXIiLCJyZW1vdmVPcHNGb3JEYXRhc2V0cyIsImRhdGFJZHMiLCJpZHMiLCJTZXQiLCJoYXMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtnZW5lcmF0ZUhhc2hJZH0gZnJvbSAnQGtlcGxlci5nbC9jb21tb24tdXRpbHMnO1xuaW1wb3J0IHtcbiAgZGVmYXVsdEFnZ3JlZ2F0aW9uc0ZvckZpZWxkcyxcbiAgZ3JvdXBCeURhdGFzZXQsXG4gIGlzVGFidWxhckRhdGFzZXRGb3JPcHMsXG4gIGpvaW5EYXRhc2V0cyxcbiAgc3BhdGlhbEpvaW5EYXRhc2V0cyxcbiAgc3VnZ2VzdFNwYXRpYWxHZW8sXG4gIEdyb3VwQnlPcCxcbiAgSm9pbk9wXG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtQcm90b0RhdGFzZXR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5leHBvcnQgdHlwZSBEZXJpdmVkRGF0YXNldE9wUmVzdWx0ID0ge1xuICBzdGF0ZTogVmlzU3RhdGU7XG4gIHByb3RvPzogUHJvdG9EYXRhc2V0O1xufTtcblxuZnVuY3Rpb24gZGVhY3RpdmF0ZU9wczxUIGV4dGVuZHMge2lzQ29uZmlnQWN0aXZlPzogYm9vbGVhbn0+KG9wczogVFtdKTogVFtdIHtcbiAgcmV0dXJuIG9wcy5tYXAob3AgPT4gKHsuLi5vcCwgaXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xufVxuXG5mdW5jdGlvbiByYW5kb21Ud29EaWdpdFN1ZmZpeCgpOiBzdHJpbmcge1xuICByZXR1cm4gU3RyaW5nKE1hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDEwMCkpLnBhZFN0YXJ0KDIsICcwJyk7XG59XG5cbmZ1bmN0aW9uIGRlZmF1bHRHcm91cEJ5TGFiZWwoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBncm91cC1ieS0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdEpvaW5MYWJlbCgpOiBzdHJpbmcge1xuICByZXR1cm4gYGpvaW4tZGF0YXNldC0ke3JhbmRvbVR3b0RpZ2l0U3VmZml4KCl9YDtcbn1cblxuZnVuY3Rpb24gZGVmYXVsdFNwYXRpYWxKb2luTGFiZWwocmVzdWx0SWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgc3BhdGlhbC1qb2luLSR7cmVzdWx0SWR9YDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZEdyb3VwQnlVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEdyb3VwQnlVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1thY3Rpb24uZGF0YUlkXTtcbiAgaWYgKCFpc1RhYnVsYXJEYXRhc2V0Rm9yT3BzKGRhdGFzZXQpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGlkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IHJlc3VsdElkID0gZ2VuZXJhdGVIYXNoSWQoNik7XG4gIGNvbnN0IG9wOiBHcm91cEJ5T3AgPSB7XG4gICAgaWQsXG4gICAgZGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIGZpZWxkTmFtZTogbnVsbCxcbiAgICBhZ2dyZWdhdGlvbnM6IGRlZmF1bHRBZ2dyZWdhdGlvbnNGb3JGaWVsZHMoZGF0YXNldC5maWVsZHMpLFxuICAgIHJlc3VsdElkLFxuICAgIHJlc3VsdExhYmVsOiBkZWZhdWx0R3JvdXBCeUxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpLCBvcF0sXG4gICAgam9pbnM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRHcm91cEJ5Q29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGdyb3VwQnlzOiBzdGF0ZS5ncm91cEJ5cy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlR3JvdXBCeShcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Hcm91cEJ5VXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCk7XG4gIGNvbnN0IGRhdGFzZXQgPSBvcCA/IHN0YXRlLmRhdGFzZXRzW29wLmRhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWRhdGFzZXQgfHwgIW9wLmZpZWxkTmFtZSkge1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZTogc2V0R3JvdXBCeUNvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgaWQ6IGFjdGlvbi5pZCxcbiAgICAgICAgY29uZmlnOiB7ZXJyb3I6ICdTZWxlY3QgYSBncm91cGluZyBmaWVsZCd9XG4gICAgICB9KVxuICAgIH07XG4gIH1cblxuICB0cnkge1xuICAgIGNvbnN0IHByb3RvID0gZ3JvdXBCeURhdGFzZXQoZGF0YXNldCwge1xuICAgICAgZmllbGROYW1lOiBvcC5maWVsZE5hbWUsXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRHcm91cEJ5Q29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGRKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRKb2luVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbYWN0aW9uLmRhdGFJZF07XG4gIGlmICghaXNUYWJ1bGFyRGF0YXNldEZvck9wcyhkYXRhc2V0KSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IGFjdGlvbi5pbXBsZW1lbnRhdGlvbiB8fCAnc2ltcGxlJztcbiAgY29uc3QgaWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3QgcmVzdWx0SWQgPSBnZW5lcmF0ZUhhc2hJZCg2KTtcbiAgY29uc3Qgb3A6IEpvaW5PcCA9IHtcbiAgICBpZCxcbiAgICBpbXBsZW1lbnRhdGlvbixcbiAgICBsZWZ0RGF0YUlkOiBhY3Rpb24uZGF0YUlkLFxuICAgIHJpZ2h0RGF0YUlkOiBudWxsLFxuICAgIGxlZnRGaWVsZDogbnVsbCxcbiAgICByaWdodEZpZWxkOiBudWxsLFxuICAgIHR5cGU6ICdMRUZUJyxcbiAgICBhZ2dyZWdhdGlvbnM6IHt9LFxuICAgIGxlZnRHZW86IGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBzdWdnZXN0U3BhdGlhbEdlbyhkYXRhc2V0LmZpZWxkcykgOiBudWxsLFxuICAgIHJpZ2h0R2VvOiBudWxsLFxuICAgIHByZWRpY2F0ZTogaW1wbGVtZW50YXRpb24gPT09ICdzcGF0aWFsJyA/ICdpbnRlcnNlY3RzJyA6IHVuZGVmaW5lZCxcbiAgICByZXN1bHRJZCxcbiAgICByZXN1bHRMYWJlbDpcbiAgICAgIGltcGxlbWVudGF0aW9uID09PSAnc3BhdGlhbCcgPyBkZWZhdWx0U3BhdGlhbEpvaW5MYWJlbChyZXN1bHRJZCkgOiBkZWZhdWx0Sm9pbkxhYmVsKCksXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWUsXG4gICAgZXJyb3I6IG51bGxcbiAgfTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBqb2luczogWy4uLmRlYWN0aXZhdGVPcHMoc3RhdGUuam9pbnMpLCBvcF0sXG4gICAgZ3JvdXBCeXM6IGRlYWN0aXZhdGVPcHMoc3RhdGUuZ3JvdXBCeXMpXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRKb2luQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRKb2luQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5tYXAob3AgPT5cbiAgICAgIG9wLmlkID09PSBhY3Rpb24uaWQgPyB7Li4ub3AsIC4uLmFjdGlvbi5jb25maWcsIGVycm9yOiBhY3Rpb24uY29uZmlnLmVycm9yID8/IG51bGx9IDogb3BcbiAgICApXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5Kb2luVXBkYXRlckFjdGlvblxuKTogRGVyaXZlZERhdGFzZXRPcFJlc3VsdCB7XG4gIGNvbnN0IG9wID0gc3RhdGUuam9pbnMuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGFjdGlvbi5pZCAmJiBpdGVtLmltcGxlbWVudGF0aW9uICE9PSAnc3BhdGlhbCcpO1xuICBjb25zdCBsZWZ0ID0gb3AgPyBzdGF0ZS5kYXRhc2V0c1tvcC5sZWZ0RGF0YUlkXSA6IHVuZGVmaW5lZDtcbiAgY29uc3QgcmlnaHQgPSBvcD8ucmlnaHREYXRhSWQgPyBzdGF0ZS5kYXRhc2V0c1tvcC5yaWdodERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGlmICghb3AgfHwgIWxlZnQgfHwgIXJpZ2h0IHx8ICFvcC5sZWZ0RmllbGQgfHwgIW9wLnJpZ2h0RmllbGQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBqb2luIGtleXMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IGpvaW5EYXRhc2V0cyhsZWZ0LCByaWdodCwge1xuICAgICAgbGVmdEZpZWxkOiBvcC5sZWZ0RmllbGQsXG4gICAgICByaWdodEZpZWxkOiBvcC5yaWdodEZpZWxkLFxuICAgICAgdHlwZTogb3AudHlwZSxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHJpZ2h0Q29sdW1uczogb3AucmlnaHRDb2x1bW5zLFxuICAgICAgbGFiZWw6IG9wLnJlc3VsdExhYmVsLFxuICAgICAgcmVzdWx0SWQ6IG9wLnJlc3VsdElkLFxuICAgICAgb3BlcmF0aW9uSWQ6IG9wLmlkXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBqb2luczogc3RhdGUuam9pbnMubWFwKGl0ZW0gPT5cbiAgICAgICAgICBpdGVtLmlkID09PSBvcC5pZCA/IHsuLi5pdGVtLCBpc0NvbmZpZ0FjdGl2ZTogZmFsc2UsIGVycm9yOiBudWxsfSA6IGl0ZW1cbiAgICAgICAgKVxuICAgICAgfSxcbiAgICAgIHByb3RvXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcil9XG4gICAgICB9KVxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFkZFNwYXRpYWxKb2luVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRTcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIGFkZEpvaW5VcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBpbXBsZW1lbnRhdGlvbjogJ3NwYXRpYWwnfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRTcGF0aWFsSm9pbkNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0U3BhdGlhbEpvaW5Db25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwgYWN0aW9uKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4ZWN1dGVTcGF0aWFsSm9pbihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SdW5TcGF0aWFsSm9pblVwZGF0ZXJBY3Rpb25cbik6IERlcml2ZWREYXRhc2V0T3BSZXN1bHQge1xuICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBhY3Rpb24uaWQgJiYgaXRlbS5pbXBsZW1lbnRhdGlvbiA9PT0gJ3NwYXRpYWwnKTtcbiAgY29uc3QgbGVmdCA9IG9wID8gc3RhdGUuZGF0YXNldHNbb3AubGVmdERhdGFJZF0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IHJpZ2h0ID0gb3A/LnJpZ2h0RGF0YUlkID8gc3RhdGUuZGF0YXNldHNbb3AucmlnaHREYXRhSWRdIDogdW5kZWZpbmVkO1xuICBpZiAoIW9wIHx8ICFsZWZ0IHx8ICFyaWdodCB8fCAhb3AubGVmdEdlbyB8fCAhb3AucmlnaHRHZW8pIHtcbiAgICByZXR1cm4ge1xuICAgICAgc3RhdGU6IHNldEpvaW5Db25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIGlkOiBhY3Rpb24uaWQsXG4gICAgICAgIGNvbmZpZzoge2Vycm9yOiAnU2VsZWN0IGRhdGFzZXRzIGFuZCBnZW9tZXRyeSBmaWVsZHMnfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBwcm90byA9IHNwYXRpYWxKb2luRGF0YXNldHMobGVmdCwgcmlnaHQsIHtcbiAgICAgIGxlZnRHZW86IG9wLmxlZnRHZW8sXG4gICAgICByaWdodEdlbzogb3AucmlnaHRHZW8sXG4gICAgICBhZ2dyZWdhdGlvbnM6IG9wLmFnZ3JlZ2F0aW9ucyxcbiAgICAgIGxlZnRDb2x1bW5zOiBvcC5sZWZ0Q29sdW1ucyxcbiAgICAgIHByZWRpY2F0ZTogb3AucHJlZGljYXRlIHx8ICdpbnRlcnNlY3RzJyxcbiAgICAgIGxhYmVsOiBvcC5yZXN1bHRMYWJlbCxcbiAgICAgIHJlc3VsdElkOiBvcC5yZXN1bHRJZCxcbiAgICAgIG9wZXJhdGlvbklkOiBvcC5pZFxuICAgIH0pO1xuICAgIHJldHVybiB7XG4gICAgICBzdGF0ZToge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgam9pbnM6IHN0YXRlLmpvaW5zLm1hcChpdGVtID0+XG4gICAgICAgICAgaXRlbS5pZCA9PT0gb3AuaWQgPyB7Li4uaXRlbSwgaXNDb25maWdBY3RpdmU6IGZhbHNlLCBlcnJvcjogbnVsbH0gOiBpdGVtXG4gICAgICAgIClcbiAgICAgIH0sXG4gICAgICBwcm90b1xuICAgIH07XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHN0YXRlOiBzZXRKb2luQ29uZmlnVXBkYXRlcihzdGF0ZSwge1xuICAgICAgICBpZDogYWN0aW9uLmlkLFxuICAgICAgICBjb25maWc6IHtlcnJvcjogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiBTdHJpbmcoZXJyb3IpfVxuICAgICAgfSlcbiAgICB9O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0T3BVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbW92ZURhdGFzZXRPcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBncm91cEJ5czogc3RhdGUuZ3JvdXBCeXMuZmlsdGVyKG9wID0+IG9wLmlkICE9PSBhY3Rpb24uaWQpLFxuICAgIGpvaW5zOiBzdGF0ZS5qb2lucy5maWx0ZXIob3AgPT4gb3AuaWQgIT09IGFjdGlvbi5pZClcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZU9wc0ZvckRhdGFzZXRzKHN0YXRlOiBWaXNTdGF0ZSwgZGF0YUlkczogc3RyaW5nW10pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGlkcyA9IG5ldyBTZXQoZGF0YUlkcyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZ3JvdXBCeXM6IHN0YXRlLmdyb3VwQnlzLmZpbHRlcihvcCA9PiAhaWRzLmhhcyhvcC5kYXRhSWQpICYmICFpZHMuaGFzKG9wLnJlc3VsdElkKSksXG4gICAgam9pbnM6IHN0YXRlLmpvaW5zLmZpbHRlcihcbiAgICAgIG9wID0+XG4gICAgICAgICFpZHMuaGFzKG9wLmxlZnREYXRhSWQpICYmXG4gICAgICAgICEob3AucmlnaHREYXRhSWQgJiYgaWRzLmhhcyhvcC5yaWdodERhdGFJZCkpICYmXG4gICAgICAgICFpZHMuaGFzKG9w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
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
5
|
+
var _constants = require("@kepler.gl/constants");
|
|
6
|
+
var _actions = require("@kepler.gl/actions");
|
|
7
|
+
var _table = require("@kepler.gl/table");
|
|
8
|
+
var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
|
|
9
|
+
var _tasks = require("@kepler.gl/tasks");
|
|
10
|
+
var _visState = _interopRequireDefault(require("./vis-state"));
|
|
11
|
+
var _visStateUpdaters = require("./vis-state-updaters");
|
|
12
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
13
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } // SPDX-License-Identifier: MIT
|
|
14
|
+
// Copyright contributors to the kepler.gl project
|
|
15
|
+
var reduceVisState = _visState["default"];
|
|
16
|
+
function makeTable(id, fields, rows) {
|
|
17
|
+
var table = new _table.KeplerTable({
|
|
18
|
+
info: {
|
|
19
|
+
id: id,
|
|
20
|
+
label: id,
|
|
21
|
+
type: 'local'
|
|
22
|
+
},
|
|
23
|
+
color: [0, 0, 0]
|
|
24
|
+
});
|
|
25
|
+
table.updateSchema({
|
|
26
|
+
fields: fields.map(function (field) {
|
|
27
|
+
return {
|
|
28
|
+
name: field.name,
|
|
29
|
+
type: field.type,
|
|
30
|
+
analyzerType: field.type
|
|
31
|
+
};
|
|
32
|
+
}),
|
|
33
|
+
rows: rows
|
|
34
|
+
});
|
|
35
|
+
return table;
|
|
36
|
+
}
|
|
37
|
+
function flushCreateTableTasks(state) {
|
|
38
|
+
var tasks = (0, _tasks.drainTasksForTesting)();
|
|
39
|
+
return tasks.reduce(function (nextState, task) {
|
|
40
|
+
if (!String(task.label || '').includes('CREATE_TABLE_TASK')) {
|
|
41
|
+
return nextState;
|
|
42
|
+
}
|
|
43
|
+
var tables = (Array.isArray(task.payload) ? task.payload : [task.payload]).map(function (payload) {
|
|
44
|
+
var table = new _table.KeplerTable(_objectSpread({
|
|
45
|
+
info: payload.info,
|
|
46
|
+
color: payload.color
|
|
47
|
+
}, payload.opts));
|
|
48
|
+
table.updateSchema(payload.data);
|
|
49
|
+
return table;
|
|
50
|
+
});
|
|
51
|
+
return reduceVisState(nextState, (0, _tasks.succeedTaskWithValues)(task, tables));
|
|
52
|
+
}, state);
|
|
53
|
+
}
|
|
54
|
+
describe('dataset ops vis-state', function () {
|
|
55
|
+
beforeEach(function () {
|
|
56
|
+
(0, _tasks.drainTasksForTesting)();
|
|
57
|
+
});
|
|
58
|
+
test('runGroupBy adds a derived dataset', function () {
|
|
59
|
+
var cities = makeTable('cities', [{
|
|
60
|
+
name: 'region',
|
|
61
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
62
|
+
}, {
|
|
63
|
+
name: 'pop',
|
|
64
|
+
type: _constants.ALL_FIELD_TYPES.integer
|
|
65
|
+
}], [['west', 10], ['west', 20], ['east', 40]]);
|
|
66
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
67
|
+
datasets: {
|
|
68
|
+
cities: cities
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
|
|
72
|
+
expect(state.groupBys).toHaveLength(1);
|
|
73
|
+
var opId = state.groupBys[0].id;
|
|
74
|
+
state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(opId, {
|
|
75
|
+
fieldName: 'region',
|
|
76
|
+
aggregations: {
|
|
77
|
+
pop: 'sum'
|
|
78
|
+
}
|
|
79
|
+
}));
|
|
80
|
+
state = reduceVisState(state, _actions.VisStateActions.runGroupBy(opId));
|
|
81
|
+
state = flushCreateTableTasks(state);
|
|
82
|
+
var resultId = state.groupBys[0].resultId;
|
|
83
|
+
expect(state.datasets[resultId]).toBeTruthy();
|
|
84
|
+
expect(state.datasets[resultId].metadata.derivedDataset).toEqual({
|
|
85
|
+
type: 'groupBy',
|
|
86
|
+
sourceDataIds: ['cities'],
|
|
87
|
+
operationId: opId
|
|
88
|
+
});
|
|
89
|
+
expect(state.datasets[resultId].dataContainer.numRows()).toBe(2);
|
|
90
|
+
});
|
|
91
|
+
test('delete parent keeps derived child snapshot', function () {
|
|
92
|
+
var cities = makeTable('cities', [{
|
|
93
|
+
name: 'region',
|
|
94
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
95
|
+
}, {
|
|
96
|
+
name: 'pop',
|
|
97
|
+
type: _constants.ALL_FIELD_TYPES.integer
|
|
98
|
+
}], [['west', 10]]);
|
|
99
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
100
|
+
datasets: {
|
|
101
|
+
cities: cities
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
|
|
105
|
+
var op = state.groupBys[0];
|
|
106
|
+
state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
|
|
107
|
+
fieldName: 'region',
|
|
108
|
+
aggregations: {
|
|
109
|
+
pop: 'sum'
|
|
110
|
+
}
|
|
111
|
+
}));
|
|
112
|
+
state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
|
|
113
|
+
state = flushCreateTableTasks(state);
|
|
114
|
+
expect(Object.keys(state.datasets)).toHaveLength(2);
|
|
115
|
+
state = reduceVisState(state, _actions.VisStateActions.removeDataset('cities'));
|
|
116
|
+
expect(state.datasets.cities).toBeUndefined();
|
|
117
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
118
|
+
expect(state.groupBys).toHaveLength(0);
|
|
119
|
+
});
|
|
120
|
+
test('addGroupBy uses a short random result name', function () {
|
|
121
|
+
var cities = makeTable('cities', [{
|
|
122
|
+
name: 'region',
|
|
123
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
124
|
+
}], [['west']]);
|
|
125
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
126
|
+
datasets: {
|
|
127
|
+
cities: cities
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
|
|
131
|
+
expect(state.groupBys[0].resultLabel).toMatch(/^group-by-\d{2}$/);
|
|
132
|
+
});
|
|
133
|
+
test('addJoin uses a short random result name', function () {
|
|
134
|
+
var cities = makeTable('cities', [{
|
|
135
|
+
name: 'id',
|
|
136
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
137
|
+
}], [['1']]);
|
|
138
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
139
|
+
datasets: {
|
|
140
|
+
cities: cities
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
state = reduceVisState(state, _actions.VisStateActions.addJoin('cities'));
|
|
144
|
+
expect(state.joins[0].resultLabel).toMatch(/^join-dataset-\d{2}$/);
|
|
145
|
+
});
|
|
146
|
+
test('setSpatialJoinConfig updates the predicate', function () {
|
|
147
|
+
var polys = makeTable('polys', [{
|
|
148
|
+
name: 'geom',
|
|
149
|
+
type: _constants.ALL_FIELD_TYPES.geojson
|
|
150
|
+
}], []);
|
|
151
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
152
|
+
datasets: {
|
|
153
|
+
polys: polys
|
|
154
|
+
}
|
|
155
|
+
});
|
|
156
|
+
state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
|
|
157
|
+
var op = state.joins[0];
|
|
158
|
+
expect(state.joins[0].predicate).toBe('intersects');
|
|
159
|
+
expect(state.joins[0].resultLabel).toBe("spatial-join-".concat(state.joins[0].resultId));
|
|
160
|
+
state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
|
|
161
|
+
predicate: 'within'
|
|
162
|
+
}));
|
|
163
|
+
expect(state.joins[0].predicate).toBe('within');
|
|
164
|
+
});
|
|
165
|
+
test('delete spatial join source keeps result snapshot', function () {
|
|
166
|
+
var polygon = {
|
|
167
|
+
type: 'Polygon',
|
|
168
|
+
coordinates: [[[-10, -10], [10, -10], [10, 10], [-10, 10], [-10, -10]]]
|
|
169
|
+
};
|
|
170
|
+
var polys = makeTable('polys', [{
|
|
171
|
+
name: 'name',
|
|
172
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
173
|
+
}, {
|
|
174
|
+
name: 'geom',
|
|
175
|
+
type: _constants.ALL_FIELD_TYPES.geojson
|
|
176
|
+
}], [['west', polygon]]);
|
|
177
|
+
var pts = makeTable('pts', [{
|
|
178
|
+
name: 'lat',
|
|
179
|
+
type: _constants.ALL_FIELD_TYPES.real
|
|
180
|
+
}, {
|
|
181
|
+
name: 'lng',
|
|
182
|
+
type: _constants.ALL_FIELD_TYPES.real
|
|
183
|
+
}, {
|
|
184
|
+
name: 'value',
|
|
185
|
+
type: _constants.ALL_FIELD_TYPES.integer
|
|
186
|
+
}], [[0, 0, 10]]);
|
|
187
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
188
|
+
datasets: {
|
|
189
|
+
polys: polys,
|
|
190
|
+
pts: pts
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
state = reduceVisState(state, _actions.VisStateActions.addSpatialJoin('polys'));
|
|
194
|
+
var op = state.joins[0];
|
|
195
|
+
state = reduceVisState(state, _actions.VisStateActions.setSpatialJoinConfig(op.id, {
|
|
196
|
+
rightDataId: 'pts',
|
|
197
|
+
leftGeo: {
|
|
198
|
+
kind: 'geojson',
|
|
199
|
+
fieldName: 'geom'
|
|
200
|
+
},
|
|
201
|
+
rightGeo: {
|
|
202
|
+
kind: 'latlng',
|
|
203
|
+
latField: 'lat',
|
|
204
|
+
lngField: 'lng'
|
|
205
|
+
},
|
|
206
|
+
aggregations: {
|
|
207
|
+
value: 'sum'
|
|
208
|
+
}
|
|
209
|
+
}));
|
|
210
|
+
state = reduceVisState(state, _actions.VisStateActions.runSpatialJoin(op.id));
|
|
211
|
+
state = flushCreateTableTasks(state);
|
|
212
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
213
|
+
state = reduceVisState(state, _actions.VisStateActions.removeDataset('pts'));
|
|
214
|
+
expect(state.datasets.pts).toBeUndefined();
|
|
215
|
+
expect(state.datasets.polys).toBeTruthy();
|
|
216
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
217
|
+
expect(state.joins).toHaveLength(0);
|
|
218
|
+
});
|
|
219
|
+
test('save/load roundtrip keeps derivedDataset metadata and drafts', function () {
|
|
220
|
+
var _derivedMeta$derivedD, _saved$config$config$;
|
|
221
|
+
var cities = makeTable('cities', [{
|
|
222
|
+
name: 'region',
|
|
223
|
+
type: _constants.ALL_FIELD_TYPES.string
|
|
224
|
+
}, {
|
|
225
|
+
name: 'pop',
|
|
226
|
+
type: _constants.ALL_FIELD_TYPES.integer
|
|
227
|
+
}], [['west', 10]]);
|
|
228
|
+
var state = _objectSpread(_objectSpread({}, _visStateUpdaters.INITIAL_VIS_STATE), {}, {
|
|
229
|
+
datasets: {
|
|
230
|
+
cities: cities
|
|
231
|
+
}
|
|
232
|
+
});
|
|
233
|
+
state = reduceVisState(state, _actions.VisStateActions.addGroupBy('cities'));
|
|
234
|
+
var op = state.groupBys[0];
|
|
235
|
+
state = reduceVisState(state, _actions.VisStateActions.setGroupByConfig(op.id, {
|
|
236
|
+
fieldName: 'region',
|
|
237
|
+
aggregations: {
|
|
238
|
+
pop: 'sum'
|
|
239
|
+
}
|
|
240
|
+
}));
|
|
241
|
+
state = reduceVisState(state, _actions.VisStateActions.runGroupBy(op.id));
|
|
242
|
+
state = flushCreateTableTasks(state);
|
|
243
|
+
var saved = _schemas["default"].save({
|
|
244
|
+
visState: state,
|
|
245
|
+
mapState: {},
|
|
246
|
+
mapStyle: {},
|
|
247
|
+
uiState: {}
|
|
248
|
+
});
|
|
249
|
+
var derived = saved.datasets.find(function (dataset) {
|
|
250
|
+
return dataset.data.id === op.resultId;
|
|
251
|
+
});
|
|
252
|
+
var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
|
|
253
|
+
expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD === void 0 ? void 0 : _derivedMeta$derivedD.type).toBe('groupBy');
|
|
254
|
+
expect((_saved$config$config$ = saved.config.config.visState.groupBys) === null || _saved$config$config$ === void 0 ? void 0 : _saved$config$config$[0].fieldName).toBe('region');
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfY29uc3RhbnRzIiwicmVxdWlyZSIsIl9hY3Rpb25zIiwiX3RhYmxlIiwiX3NjaGVtYXMiLCJfaW50ZXJvcFJlcXVpcmVEZWZhdWx0IiwiX3Rhc2tzIiwiX3Zpc1N0YXRlIiwiX3Zpc1N0YXRlVXBkYXRlcnMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsInJlZHVjZVZpc1N0YXRlIiwidmlzU3RhdGVSZWR1Y2VyIiwibWFrZVRhYmxlIiwiaWQiLCJmaWVsZHMiLCJyb3dzIiwidGFibGUiLCJLZXBsZXJUYWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInJlZHVjZSIsIm5leHRTdGF0ZSIsInRhc2siLCJTdHJpbmciLCJpbmNsdWRlcyIsInRhYmxlcyIsIkFycmF5IiwiaXNBcnJheSIsInBheWxvYWQiLCJvcHRzIiwiZGF0YSIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsImRlc2NyaWJlIiwiYmVmb3JlRWFjaCIsInRlc3QiLCJjaXRpZXMiLCJBTExfRklFTERfVFlQRVMiLCJzdHJpbmciLCJpbnRlZ2VyIiwiSU5JVElBTF9WSVNfU1RBVEUiLCJkYXRhc2V0cyIsIlZpc1N0YXRlQWN0aW9ucyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicnVuR3JvdXBCeSIsInJlc3VsdElkIiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJyZW1vdmVEYXRhc2V0IiwidG9CZVVuZGVmaW5lZCIsInJlc3VsdExhYmVsIiwidG9NYXRjaCIsImFkZEpvaW4iLCJqb2lucyIsInBvbHlzIiwiZ2VvanNvbiIsImFkZFNwYXRpYWxKb2luIiwicHJlZGljYXRlIiwiY29uY2F0Iiwic2V0U3BhdGlhbEpvaW5Db25maWciLCJwb2x5Z29uIiwiY29vcmRpbmF0ZXMiLCJwdHMiLCJyZWFsIiwicmlnaHREYXRhSWQiLCJsZWZ0R2VvIiwia2luZCIsInJpZ2h0R2VvIiwibGF0RmllbGQiLCJsbmdGaWVsZCIsInZhbHVlIiwicnVuU3BhdGlhbEpvaW4iLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQiLCJfc2F2ZWQkY29uZmlnJGNvbmZpZyQiLCJzYXZlZCIsIlNjaGVtYU1hbmFnZXIiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFzZXQtb3BzLXVwZGF0ZXJzLnNwZWMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IHtBTExfRklFTERfVFlQRVN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7VmlzU3RhdGVBY3Rpb25zfSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtLZXBsZXJUYWJsZX0gZnJvbSAnQGtlcGxlci5nbC90YWJsZSc7XG5pbXBvcnQgU2NoZW1hTWFuYWdlciwge1Zpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuaW1wb3J0IHtkcmFpblRhc2tzRm9yVGVzdGluZywgc3VjY2VlZFRhc2tXaXRoVmFsdWVzfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcblxuaW1wb3J0IHZpc1N0YXRlUmVkdWNlciBmcm9tICcuL3Zpcy1zdGF0ZSc7XG5pbXBvcnQge0lOSVRJQUxfVklTX1NUQVRFfSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5cbmNvbnN0IHJlZHVjZVZpc1N0YXRlID0gdmlzU3RhdGVSZWR1Y2VyIGFzIChzdGF0ZTogVmlzU3RhdGUsIGFjdGlvbjogdW5rbm93bikgPT4gVmlzU3RhdGU7XG5cbmZ1bmN0aW9uIG1ha2VUYWJsZShpZDogc3RyaW5nLCBmaWVsZHM6IHtuYW1lOiBzdHJpbmc7IHR5cGU6IHN0cmluZ31bXSwgcm93czogYW55W11bXSkge1xuICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7XG4gICAgaW5mbzoge2lkLCBsYWJlbDogaWQsIHR5cGU6ICdsb2NhbCd9LFxuICAgIGNvbG9yOiBbMCwgMCwgMF1cbiAgfSk7XG4gIHRhYmxlLnVwZGF0ZVNjaGVtYSh7XG4gICAgZmllbGRzOiBmaWVsZHMubWFwKGZpZWxkID0+ICh7XG4gICAgICBuYW1lOiBmaWVsZC5uYW1lLFxuICAgICAgdHlwZTogZmllbGQudHlwZSxcbiAgICAgIGFuYWx5emVyVHlwZTogZmllbGQudHlwZVxuICAgIH0pKSxcbiAgICByb3dzXG4gIH0pO1xuICByZXR1cm4gdGFibGU7XG59XG5cbmZ1bmN0aW9uIGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZTogVmlzU3RhdGUpIHtcbiAgY29uc3QgdGFza3MgPSBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICByZXR1cm4gdGFza3MucmVkdWNlKChuZXh0U3RhdGUsIHRhc2spID0+IHtcbiAgICBpZiAoIVN0cmluZyh0YXNrLmxhYmVsIHx8ICcnKS5pbmNsdWRlcygnQ1JFQVRFX1RBQkxFX1RBU0snKSkge1xuICAgICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgICB9XG4gICAgY29uc3QgdGFibGVzID0gKEFycmF5LmlzQXJyYXkodGFzay5wYXlsb2FkKSA/IHRhc2sucGF5bG9hZCA6IFt0YXNrLnBheWxvYWRdKS5tYXAocGF5bG9hZCA9PiB7XG4gICAgICBjb25zdCB0YWJsZSA9IG5ldyBLZXBsZXJUYWJsZSh7aW5mbzogcGF5bG9hZC5pbmZvLCBjb2xvcjogcGF5bG9hZC5jb2xvciwgLi4ucGF5bG9hZC5vcHRzfSk7XG4gICAgICB0YWJsZS51cGRhdGVTY2hlbWEocGF5bG9hZC5kYXRhKTtcbiAgICAgIHJldHVybiB0YWJsZTtcbiAgICB9KTtcbiAgICByZXR1cm4gcmVkdWNlVmlzU3RhdGUobmV4dFN0YXRlLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXModGFzaywgdGFibGVzKSk7XG4gIH0sIHN0YXRlKTtcbn1cblxuZGVzY3JpYmUoJ2RhdGFzZXQgb3BzIHZpcy1zdGF0ZScsICgpID0+IHtcbiAgYmVmb3JlRWFjaCgoKSA9PiB7XG4gICAgZHJhaW5UYXNrc0ZvclRlc3RpbmcoKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuR3JvdXBCeSBhZGRzIGEgZGVyaXZlZCBkYXRhc2V0JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtcbiAgICAgICAgWyd3ZXN0JywgMTBdLFxuICAgICAgICBbJ3dlc3QnLCAyMF0sXG4gICAgICAgIFsnZWFzdCcsIDQwXVxuICAgICAgXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcblxuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMSk7XG4gICAgY29uc3Qgb3BJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLmlkO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3BJZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wSWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCByZXN1bHRJZCA9IHN0YXRlLmdyb3VwQnlzWzBdLnJlc3VsdElkO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbcmVzdWx0SWRdLm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdncm91cEJ5JyxcbiAgICAgIHNvdXJjZURhdGFJZHM6IFsnY2l0aWVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3BJZFxuICAgIH0pO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0uZGF0YUNvbnRhaW5lci5udW1Sb3dzKCkpLnRvQmUoMik7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBwYXJlbnQga2VlcHMgZGVyaXZlZCBjaGlsZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdyZWdpb24nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdwb3AnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgMTBdXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuZ3JvdXBCeXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldEdyb3VwQnlDb25maWcob3AuaWQsIHtcbiAgICAgICAgZmllbGROYW1lOiAncmVnaW9uJyxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7cG9wOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChPYmplY3Qua2V5cyhzdGF0ZS5kYXRhc2V0cykpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5jaXRpZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEdyb3VwQnkgdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoXG4gICAgICAnY2l0aWVzJyxcbiAgICAgIFt7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9XSxcbiAgICAgIFtbJ3dlc3QnXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15ncm91cC1ieS1cXGR7Mn0kLyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2FkZEpvaW4gdXNlcyBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBjaXRpZXMgPSBtYWtlVGFibGUoJ2NpdGllcycsIFt7bmFtZTogJ2lkJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLCBbWycxJ11dKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRKb2luKCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b01hdGNoKC9eam9pbi1kYXRhc2V0LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnc2V0U3BhdGlhbEpvaW5Db25maWcgdXBkYXRlcyB0aGUgcHJlZGljYXRlJywgKCkgPT4ge1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKCdwb2x5cycsIFt7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1dLCBbXSk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtwb2x5c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucHJlZGljYXRlKS50b0JlKCdpbnRlcnNlY3RzJyk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnJlc3VsdExhYmVsKS50b0JlKGBzcGF0aWFsLWpvaW4tJHtzdGF0ZS5qb2luc1swXS5yZXN1bHRJZH1gKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtwcmVkaWNhdGU6ICd3aXRoaW4nfSlcbiAgICApO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ3dpdGhpbicpO1xuICB9KTtcblxuICB0ZXN0KCdkZWxldGUgc3BhdGlhbCBqb2luIHNvdXJjZSBrZWVwcyByZXN1bHQgc25hcHNob3QnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seWdvbiA9IHtcbiAgICAgIHR5cGU6ICdQb2x5Z29uJyxcbiAgICAgIGNvb3JkaW5hdGVzOiBbXG4gICAgICAgIFtcbiAgICAgICAgICBbLTEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgLTEwXSxcbiAgICAgICAgICBbMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAxMF0sXG4gICAgICAgICAgWy0xMCwgLTEwXVxuICAgICAgICBdXG4gICAgICBdXG4gICAgfTtcbiAgICBjb25zdCBwb2x5cyA9IG1ha2VUYWJsZShcbiAgICAgICdwb2x5cycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAnbmFtZScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ2dlb20nLCB0eXBlOiBBTExfRklFTERfVFlQRVMuZ2VvanNvbn1cbiAgICAgIF0sXG4gICAgICBbWyd3ZXN0JywgcG9seWdvbl1dXG4gICAgKTtcbiAgICBjb25zdCBwdHMgPSBtYWtlVGFibGUoXG4gICAgICAncHRzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ3ZhbHVlJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1swLCAwLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzLCBwdHN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3BhdGlhbEpvaW4oJ3BvbHlzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuam9pbnNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFNwYXRpYWxKb2luQ29uZmlnKG9wLmlkLCB7XG4gICAgICAgIHJpZ2h0RGF0YUlkOiAncHRzJyxcbiAgICAgICAgbGVmdEdlbzoge2tpbmQ6ICdnZW9qc29uJywgZmllbGROYW1lOiAnZ2VvbSd9LFxuICAgICAgICByaWdodEdlbzoge2tpbmQ6ICdsYXRsbmcnLCBsYXRGaWVsZDogJ2xhdCcsIGxuZ0ZpZWxkOiAnbG5nJ30sXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3ZhbHVlOiAnc3VtJ31cbiAgICAgIH0pXG4gICAgKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3BhdGlhbEpvaW4ob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJlbW92ZURhdGFzZXQoJ3B0cycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucHRzKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLnBvbHlzKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICB9KTtcblxuICB0ZXN0KCdzYXZlL2xvYWQgcm91bmR0cmlwIGtlZXBzIGRlcml2ZWREYXRhc2V0IG1ldGFkYXRhIGFuZCBkcmFmdHMnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1snd2VzdCcsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmdyb3VwQnlzWzBdO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRHcm91cEJ5Q29uZmlnKG9wLmlkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1bkdyb3VwQnkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdncm91cEJ5Jyk7XG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUuZ3JvdXBCeXM/LlswXS5maWVsZE5hbWUpLnRvQmUoJ3JlZ2lvbicpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7O0FBR0EsSUFBQUEsVUFBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsUUFBQSxHQUFBRCxPQUFBO0FBQ0EsSUFBQUUsTUFBQSxHQUFBRixPQUFBO0FBQ0EsSUFBQUcsUUFBQSxHQUFBQyxzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQUssTUFBQSxHQUFBTCxPQUFBO0FBRUEsSUFBQU0sU0FBQSxHQUFBRixzQkFBQSxDQUFBSixPQUFBO0FBQ0EsSUFBQU8saUJBQUEsR0FBQVAsT0FBQTtBQUF1RCxTQUFBUSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVks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
|