@kepler.gl/reducers 3.3.0-alpha.15 → 3.3.0-alpha.17
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/column-edit-reconcile.js +100 -0
- package/dist/cjs/column-edit-updaters.spec.js +840 -0
- package/dist/cjs/combined-updaters.js +166 -8
- package/dist/cjs/composers.js +4 -5
- package/dist/cjs/dataset-ops-updaters.js +375 -0
- package/dist/cjs/dataset-ops-updaters.spec.js +382 -0
- package/dist/cjs/export-utils.js +118 -46
- package/dist/cjs/interaction-utils.js +166 -6
- package/dist/cjs/layer-utils.js +135 -9
- package/dist/cjs/ui-state-updaters.js +134 -51
- package/dist/cjs/ui-state.js +2 -2
- package/dist/cjs/vis-state-merger-text-label.spec.js +75 -0
- package/dist/cjs/vis-state-merger.js +99 -25
- package/dist/cjs/vis-state-selectors.js +5 -4
- package/dist/cjs/vis-state-updaters.js +1077 -256
- package/dist/cjs/vis-state.js +2 -2
- package/dist/column-edit-reconcile.d.ts +4 -0
- package/dist/column-edit-updaters.spec.d.ts +1 -0
- package/dist/combined-updaters.d.ts +21 -1
- package/dist/composers.d.ts +3 -0
- package/dist/dataset-ops-updaters.d.ts +21 -0
- package/dist/dataset-ops-updaters.spec.d.ts +1 -0
- package/dist/esm/column-edit-reconcile.js +95 -0
- package/dist/esm/column-edit-updaters.spec.js +839 -0
- package/dist/esm/combined-updaters.js +166 -8
- package/dist/esm/composers.js +3 -2
- package/dist/esm/dataset-ops-updaters.js +357 -0
- package/dist/esm/dataset-ops-updaters.spec.js +381 -0
- package/dist/esm/export-utils.js +117 -45
- package/dist/esm/interaction-utils.js +159 -3
- package/dist/esm/layer-utils.js +133 -9
- package/dist/esm/ui-state-updaters.js +133 -50
- package/dist/esm/ui-state.js +2 -2
- package/dist/esm/vis-state-merger-text-label.spec.js +74 -0
- package/dist/esm/vis-state-merger.js +99 -26
- package/dist/esm/vis-state-selectors.js +5 -4
- package/dist/esm/vis-state-updaters.js +1020 -263
- package/dist/esm/vis-state.js +2 -2
- package/dist/export-utils.d.ts +2 -2
- package/dist/interaction-utils.d.ts +25 -2
- package/dist/layer-utils.d.ts +17 -0
- package/dist/ui-state-updaters.d.ts +30 -0
- package/dist/vis-state-merger-text-label.spec.d.ts +1 -0
- package/dist/vis-state-merger.d.ts +10 -2
- package/dist/vis-state-updaters.d.ts +61 -15
- package/dist/vis-state.d.ts +20 -0
- package/package.json +17 -17
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
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; }
|
|
3
|
+
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) { _defineProperty(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; }
|
|
4
|
+
// SPDX-License-Identifier: MIT
|
|
5
|
+
// Copyright contributors to the kepler.gl project
|
|
6
|
+
|
|
7
|
+
import { ALL_FIELD_TYPES } from '@kepler.gl/constants';
|
|
8
|
+
import { VisStateActions } from '@kepler.gl/actions';
|
|
9
|
+
import { KeplerTable } from '@kepler.gl/table';
|
|
10
|
+
import SchemaManager from '@kepler.gl/schemas';
|
|
11
|
+
import { drainTasksForTesting, succeedTaskWithValues } from '@kepler.gl/tasks';
|
|
12
|
+
import visStateReducer from './vis-state';
|
|
13
|
+
import { INITIAL_VIS_STATE } from './vis-state-updaters';
|
|
14
|
+
var reduceVisState = visStateReducer;
|
|
15
|
+
function makeTable(id, fields, rows) {
|
|
16
|
+
var table = new KeplerTable({
|
|
17
|
+
info: {
|
|
18
|
+
id: id,
|
|
19
|
+
label: id,
|
|
20
|
+
type: 'local'
|
|
21
|
+
},
|
|
22
|
+
color: [0, 0, 0]
|
|
23
|
+
});
|
|
24
|
+
table.updateSchema({
|
|
25
|
+
fields: fields.map(function (field) {
|
|
26
|
+
return {
|
|
27
|
+
name: field.name,
|
|
28
|
+
type: field.type,
|
|
29
|
+
analyzerType: field.type
|
|
30
|
+
};
|
|
31
|
+
}),
|
|
32
|
+
rows: rows
|
|
33
|
+
});
|
|
34
|
+
return table;
|
|
35
|
+
}
|
|
36
|
+
function flushCreateTableTasks(state) {
|
|
37
|
+
var tasks = drainTasksForTesting();
|
|
38
|
+
return tasks.reduce(function (nextState, task) {
|
|
39
|
+
if (!String(task.label || '').includes('CREATE_TABLE_TASK')) {
|
|
40
|
+
return nextState;
|
|
41
|
+
}
|
|
42
|
+
var tables = (Array.isArray(task.payload) ? task.payload : [task.payload]).map(function (payload) {
|
|
43
|
+
var table = new KeplerTable(_objectSpread({
|
|
44
|
+
info: payload.info,
|
|
45
|
+
color: payload.color
|
|
46
|
+
}, payload.opts));
|
|
47
|
+
table.updateSchema(payload.data);
|
|
48
|
+
return table;
|
|
49
|
+
});
|
|
50
|
+
return reduceVisState(nextState, succeedTaskWithValues(task, tables));
|
|
51
|
+
}, state);
|
|
52
|
+
}
|
|
53
|
+
describe('dataset ops vis-state', function () {
|
|
54
|
+
beforeEach(function () {
|
|
55
|
+
drainTasksForTesting();
|
|
56
|
+
});
|
|
57
|
+
test('runGroupBy adds a derived dataset', function () {
|
|
58
|
+
var cities = makeTable('cities', [{
|
|
59
|
+
name: 'region',
|
|
60
|
+
type: ALL_FIELD_TYPES.string
|
|
61
|
+
}, {
|
|
62
|
+
name: 'pop',
|
|
63
|
+
type: ALL_FIELD_TYPES.integer
|
|
64
|
+
}], [['west', 10], ['west', 20], ['east', 40]]);
|
|
65
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
66
|
+
datasets: {
|
|
67
|
+
cities: cities
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
71
|
+
expect(state.groupBys).toHaveLength(1);
|
|
72
|
+
var opId = state.groupBys[0].id;
|
|
73
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(opId, {
|
|
74
|
+
fieldName: 'region',
|
|
75
|
+
aggregations: {
|
|
76
|
+
pop: 'sum'
|
|
77
|
+
}
|
|
78
|
+
}));
|
|
79
|
+
var resultId = state.groupBys[0].resultId;
|
|
80
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(opId));
|
|
81
|
+
state = flushCreateTableTasks(state);
|
|
82
|
+
expect(state.groupBys).toHaveLength(0);
|
|
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: ALL_FIELD_TYPES.string
|
|
95
|
+
}, {
|
|
96
|
+
name: 'pop',
|
|
97
|
+
type: ALL_FIELD_TYPES.integer
|
|
98
|
+
}], [['west', 10]]);
|
|
99
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
100
|
+
datasets: {
|
|
101
|
+
cities: cities
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
105
|
+
var op = state.groupBys[0];
|
|
106
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
|
|
107
|
+
fieldName: 'region',
|
|
108
|
+
aggregations: {
|
|
109
|
+
pop: 'sum'
|
|
110
|
+
}
|
|
111
|
+
}));
|
|
112
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(op.id));
|
|
113
|
+
state = flushCreateTableTasks(state);
|
|
114
|
+
expect(state.groupBys).toHaveLength(0);
|
|
115
|
+
expect(Object.keys(state.datasets)).toHaveLength(2);
|
|
116
|
+
state = reduceVisState(state, VisStateActions.removeDataset('cities'));
|
|
117
|
+
expect(state.datasets.cities).toBeUndefined();
|
|
118
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
119
|
+
expect(state.groupBys).toHaveLength(0);
|
|
120
|
+
});
|
|
121
|
+
test('addGroupBy uses a short random result name', function () {
|
|
122
|
+
var cities = makeTable('cities', [{
|
|
123
|
+
name: 'region',
|
|
124
|
+
type: ALL_FIELD_TYPES.string
|
|
125
|
+
}], [['west']]);
|
|
126
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
127
|
+
datasets: {
|
|
128
|
+
cities: cities
|
|
129
|
+
}
|
|
130
|
+
});
|
|
131
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
132
|
+
expect(state.groupBys[0].resultLabel).toMatch(/^group-by-\d{2}$/);
|
|
133
|
+
});
|
|
134
|
+
test('addJoin uses a short random result name', function () {
|
|
135
|
+
var cities = makeTable('cities', [{
|
|
136
|
+
name: 'id',
|
|
137
|
+
type: ALL_FIELD_TYPES.string
|
|
138
|
+
}], [['1']]);
|
|
139
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
140
|
+
datasets: {
|
|
141
|
+
cities: cities
|
|
142
|
+
}
|
|
143
|
+
});
|
|
144
|
+
state = reduceVisState(state, VisStateActions.addJoin('cities'));
|
|
145
|
+
expect(state.joins[0].resultLabel).toMatch(/^join-dataset-\d{2}$/);
|
|
146
|
+
});
|
|
147
|
+
test('setSpatialJoinConfig updates the predicate', function () {
|
|
148
|
+
var polys = makeTable('polys', [{
|
|
149
|
+
name: 'geom',
|
|
150
|
+
type: ALL_FIELD_TYPES.geojson
|
|
151
|
+
}], []);
|
|
152
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
153
|
+
datasets: {
|
|
154
|
+
polys: polys
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
|
|
158
|
+
var op = state.joins[0];
|
|
159
|
+
expect(state.joins[0].predicate).toBe('intersects');
|
|
160
|
+
expect(state.joins[0].resultLabel).toBe("spatial-join-".concat(state.joins[0].resultId));
|
|
161
|
+
state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
|
|
162
|
+
predicate: 'within'
|
|
163
|
+
}));
|
|
164
|
+
expect(state.joins[0].predicate).toBe('within');
|
|
165
|
+
});
|
|
166
|
+
test('delete spatial join source keeps result snapshot', function () {
|
|
167
|
+
var polygon = {
|
|
168
|
+
type: 'Polygon',
|
|
169
|
+
coordinates: [[[-10, -10], [10, -10], [10, 10], [-10, 10], [-10, -10]]]
|
|
170
|
+
};
|
|
171
|
+
var polys = makeTable('polys', [{
|
|
172
|
+
name: 'name',
|
|
173
|
+
type: ALL_FIELD_TYPES.string
|
|
174
|
+
}, {
|
|
175
|
+
name: 'geom',
|
|
176
|
+
type: ALL_FIELD_TYPES.geojson
|
|
177
|
+
}], [['west', polygon]]);
|
|
178
|
+
var pts = makeTable('pts', [{
|
|
179
|
+
name: 'lat',
|
|
180
|
+
type: ALL_FIELD_TYPES.real
|
|
181
|
+
}, {
|
|
182
|
+
name: 'lng',
|
|
183
|
+
type: ALL_FIELD_TYPES.real
|
|
184
|
+
}, {
|
|
185
|
+
name: 'value',
|
|
186
|
+
type: ALL_FIELD_TYPES.integer
|
|
187
|
+
}], [[0, 0, 10]]);
|
|
188
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
189
|
+
datasets: {
|
|
190
|
+
polys: polys,
|
|
191
|
+
pts: pts
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
state = reduceVisState(state, VisStateActions.addSpatialJoin('polys'));
|
|
195
|
+
var op = state.joins[0];
|
|
196
|
+
state = reduceVisState(state, VisStateActions.setSpatialJoinConfig(op.id, {
|
|
197
|
+
rightDataId: 'pts',
|
|
198
|
+
leftGeo: {
|
|
199
|
+
kind: 'geojson',
|
|
200
|
+
fieldName: 'geom'
|
|
201
|
+
},
|
|
202
|
+
rightGeo: {
|
|
203
|
+
kind: 'latlng',
|
|
204
|
+
latField: 'lat',
|
|
205
|
+
lngField: 'lng'
|
|
206
|
+
},
|
|
207
|
+
aggregations: {
|
|
208
|
+
value: 'sum'
|
|
209
|
+
}
|
|
210
|
+
}));
|
|
211
|
+
state = reduceVisState(state, VisStateActions.runSpatialJoin(op.id));
|
|
212
|
+
state = flushCreateTableTasks(state);
|
|
213
|
+
expect(state.joins).toHaveLength(0);
|
|
214
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
215
|
+
state = reduceVisState(state, VisStateActions.removeDataset('pts'));
|
|
216
|
+
expect(state.datasets.pts).toBeUndefined();
|
|
217
|
+
expect(state.datasets.polys).toBeTruthy();
|
|
218
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
219
|
+
expect(state.joins).toHaveLength(0);
|
|
220
|
+
});
|
|
221
|
+
test('save/load roundtrip keeps the derived dataset and drops the finished group by', function () {
|
|
222
|
+
var _derivedMeta$derivedD, _saved$config$config$;
|
|
223
|
+
var cities = makeTable('cities', [{
|
|
224
|
+
name: 'region',
|
|
225
|
+
type: ALL_FIELD_TYPES.string
|
|
226
|
+
}, {
|
|
227
|
+
name: 'pop',
|
|
228
|
+
type: ALL_FIELD_TYPES.integer
|
|
229
|
+
}], [['west', 10]]);
|
|
230
|
+
var state = _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
231
|
+
datasets: {
|
|
232
|
+
cities: cities
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('cities'));
|
|
236
|
+
var op = state.groupBys[0];
|
|
237
|
+
state = reduceVisState(state, VisStateActions.setGroupByConfig(op.id, {
|
|
238
|
+
fieldName: 'region',
|
|
239
|
+
aggregations: {
|
|
240
|
+
pop: 'sum'
|
|
241
|
+
}
|
|
242
|
+
}));
|
|
243
|
+
state = reduceVisState(state, VisStateActions.runGroupBy(op.id));
|
|
244
|
+
state = flushCreateTableTasks(state);
|
|
245
|
+
var saved = SchemaManager.save({
|
|
246
|
+
visState: state,
|
|
247
|
+
mapState: {},
|
|
248
|
+
mapStyle: {},
|
|
249
|
+
uiState: {}
|
|
250
|
+
});
|
|
251
|
+
var derived = saved.datasets.find(function (dataset) {
|
|
252
|
+
return dataset.data.id === op.resultId;
|
|
253
|
+
});
|
|
254
|
+
var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
|
|
255
|
+
expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD === void 0 ? void 0 : _derivedMeta$derivedD.type).toBe('groupBy');
|
|
256
|
+
expect((_saved$config$config$ = saved.config.config.visState.groupBys) !== null && _saved$config$config$ !== void 0 ? _saved$config$config$ : []).toHaveLength(0);
|
|
257
|
+
});
|
|
258
|
+
});
|
|
259
|
+
describe('suitability vis-state', function () {
|
|
260
|
+
beforeEach(function () {
|
|
261
|
+
drainTasksForTesting();
|
|
262
|
+
});
|
|
263
|
+
function siteState() {
|
|
264
|
+
var sites = makeTable('sites', [{
|
|
265
|
+
name: 'name',
|
|
266
|
+
type: ALL_FIELD_TYPES.string
|
|
267
|
+
}, {
|
|
268
|
+
name: 'lat',
|
|
269
|
+
type: ALL_FIELD_TYPES.real
|
|
270
|
+
}, {
|
|
271
|
+
name: 'lng',
|
|
272
|
+
type: ALL_FIELD_TYPES.real
|
|
273
|
+
}, {
|
|
274
|
+
name: 'access',
|
|
275
|
+
type: ALL_FIELD_TYPES.integer
|
|
276
|
+
}, {
|
|
277
|
+
name: 'cost',
|
|
278
|
+
type: ALL_FIELD_TYPES.integer
|
|
279
|
+
}], [['a', 0, 0, 0, 100], ['b', 1, 1, 5, 200], ['c', 2, 2, 10, 300]]);
|
|
280
|
+
return _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), {}, {
|
|
281
|
+
datasets: {
|
|
282
|
+
sites: sites
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
test('addSuitability seeds numeric weights and a short random result name', function () {
|
|
287
|
+
var state = reduceVisState(siteState(), VisStateActions.addSuitability('sites'));
|
|
288
|
+
expect(state.suitabilities).toHaveLength(1);
|
|
289
|
+
var op = state.suitabilities[0];
|
|
290
|
+
expect(op.weights).toEqual({
|
|
291
|
+
lat: 1,
|
|
292
|
+
lng: 1,
|
|
293
|
+
access: 1,
|
|
294
|
+
cost: 1
|
|
295
|
+
});
|
|
296
|
+
expect(op.weightStandardization).toBe('normalize');
|
|
297
|
+
expect(op.dataStandardization).toBe('range');
|
|
298
|
+
expect(op.outputFieldName).toBe('score');
|
|
299
|
+
expect(op.resultLabel).toMatch(/^suitability-\d{2}$/);
|
|
300
|
+
});
|
|
301
|
+
test('opening a suitability op closes an open group by', function () {
|
|
302
|
+
var state = reduceVisState(siteState(), VisStateActions.addGroupBy('sites'));
|
|
303
|
+
expect(state.groupBys[0].isConfigActive).toBe(true);
|
|
304
|
+
state = reduceVisState(state, VisStateActions.addSuitability('sites'));
|
|
305
|
+
expect(state.groupBys[0].isConfigActive).toBe(false);
|
|
306
|
+
expect(state.suitabilities[0].isConfigActive).toBe(true);
|
|
307
|
+
state = reduceVisState(state, VisStateActions.addGroupBy('sites'));
|
|
308
|
+
expect(state.suitabilities[0].isConfigActive).toBe(false);
|
|
309
|
+
});
|
|
310
|
+
test('runSuitability adds a scored dataset and a default layer', function () {
|
|
311
|
+
var _layer$config$colorFi;
|
|
312
|
+
var state = reduceVisState(siteState(), VisStateActions.addSuitability('sites'));
|
|
313
|
+
var op = state.suitabilities[0];
|
|
314
|
+
state = reduceVisState(state, VisStateActions.setSuitabilityConfig(op.id, {
|
|
315
|
+
weights: {
|
|
316
|
+
access: 1,
|
|
317
|
+
cost: 1
|
|
318
|
+
}
|
|
319
|
+
}));
|
|
320
|
+
state = reduceVisState(state, VisStateActions.runSuitability(op.id));
|
|
321
|
+
state = flushCreateTableTasks(state);
|
|
322
|
+
var result = state.datasets[op.resultId];
|
|
323
|
+
expect(result).toBeTruthy();
|
|
324
|
+
expect(result.metadata.derivedDataset).toEqual({
|
|
325
|
+
type: 'suitability',
|
|
326
|
+
sourceDataIds: ['sites'],
|
|
327
|
+
operationId: op.id
|
|
328
|
+
});
|
|
329
|
+
expect(result.fields.map(function (field) {
|
|
330
|
+
return field.name;
|
|
331
|
+
})).toContain('score');
|
|
332
|
+
expect(state.suitabilities[0].isConfigActive).toBe(false);
|
|
333
|
+
var layer = state.layers.find(function (item) {
|
|
334
|
+
return item.config.dataId === op.resultId;
|
|
335
|
+
});
|
|
336
|
+
expect(layer).toBeTruthy();
|
|
337
|
+
expect(layer === null || layer === void 0 || (_layer$config$colorFi = layer.config.colorField) === null || _layer$config$colorFi === void 0 ? void 0 : _layer$config$colorFi.name).toBe('score');
|
|
338
|
+
});
|
|
339
|
+
test('running without a weighted field surfaces an error instead of a dataset', function () {
|
|
340
|
+
var state = reduceVisState(siteState(), VisStateActions.addSuitability('sites'));
|
|
341
|
+
var op = state.suitabilities[0];
|
|
342
|
+
state = reduceVisState(state, VisStateActions.setSuitabilityConfig(op.id, {
|
|
343
|
+
weights: {}
|
|
344
|
+
}));
|
|
345
|
+
state = reduceVisState(state, VisStateActions.runSuitability(op.id));
|
|
346
|
+
expect(state.suitabilities[0].error).toBe('Select at least one field to score');
|
|
347
|
+
expect(state.suitabilities[0].isConfigActive).toBe(true);
|
|
348
|
+
expect(state.datasets[op.resultId]).toBeUndefined();
|
|
349
|
+
});
|
|
350
|
+
test('deleting the source dataset drops the op but keeps the scored snapshot', function () {
|
|
351
|
+
var state = reduceVisState(siteState(), VisStateActions.addSuitability('sites'));
|
|
352
|
+
var op = state.suitabilities[0];
|
|
353
|
+
state = reduceVisState(state, VisStateActions.runSuitability(op.id));
|
|
354
|
+
state = flushCreateTableTasks(state);
|
|
355
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
356
|
+
state = reduceVisState(state, VisStateActions.removeDataset('sites'));
|
|
357
|
+
expect(state.datasets.sites).toBeUndefined();
|
|
358
|
+
expect(state.datasets[op.resultId]).toBeTruthy();
|
|
359
|
+
expect(state.suitabilities).toHaveLength(0);
|
|
360
|
+
});
|
|
361
|
+
test('the op config stays out of saved maps while the derived dataset persists', function () {
|
|
362
|
+
var _derivedMeta$derivedD2;
|
|
363
|
+
var state = reduceVisState(siteState(), VisStateActions.addSuitability('sites'));
|
|
364
|
+
var op = state.suitabilities[0];
|
|
365
|
+
state = reduceVisState(state, VisStateActions.runSuitability(op.id));
|
|
366
|
+
state = flushCreateTableTasks(state);
|
|
367
|
+
var saved = SchemaManager.save({
|
|
368
|
+
visState: state,
|
|
369
|
+
mapState: {},
|
|
370
|
+
mapStyle: {},
|
|
371
|
+
uiState: {}
|
|
372
|
+
});
|
|
373
|
+
expect(saved.config.config.visState).not.toHaveProperty('suitabilities');
|
|
374
|
+
var derived = saved.datasets.find(function (dataset) {
|
|
375
|
+
return dataset.data.id === op.resultId;
|
|
376
|
+
});
|
|
377
|
+
var derivedMeta = derived === null || derived === void 0 ? void 0 : derived.data.metadata;
|
|
378
|
+
expect(derivedMeta === null || derivedMeta === void 0 || (_derivedMeta$derivedD2 = derivedMeta.derivedDataset) === null || _derivedMeta$derivedD2 === void 0 ? void 0 : _derivedMeta$derivedD2.type).toBe('suitability');
|
|
379
|
+
});
|
|
380
|
+
});
|
|
381
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBTExfRklFTERfVFlQRVMiLCJWaXNTdGF0ZUFjdGlvbnMiLCJLZXBsZXJUYWJsZSIsIlNjaGVtYU1hbmFnZXIiLCJkcmFpblRhc2tzRm9yVGVzdGluZyIsInN1Y2NlZWRUYXNrV2l0aFZhbHVlcyIsInZpc1N0YXRlUmVkdWNlciIsIklOSVRJQUxfVklTX1NUQVRFIiwicmVkdWNlVmlzU3RhdGUiLCJtYWtlVGFibGUiLCJpZCIsImZpZWxkcyIsInJvd3MiLCJ0YWJsZSIsImluZm8iLCJsYWJlbCIsInR5cGUiLCJjb2xvciIsInVwZGF0ZVNjaGVtYSIsIm1hcCIsImZpZWxkIiwibmFtZSIsImFuYWx5emVyVHlwZSIsImZsdXNoQ3JlYXRlVGFibGVUYXNrcyIsInN0YXRlIiwidGFza3MiLCJyZWR1Y2UiLCJuZXh0U3RhdGUiLCJ0YXNrIiwiU3RyaW5nIiwiaW5jbHVkZXMiLCJ0YWJsZXMiLCJBcnJheSIsImlzQXJyYXkiLCJwYXlsb2FkIiwiX29iamVjdFNwcmVhZCIsIm9wdHMiLCJkYXRhIiwiZGVzY3JpYmUiLCJiZWZvcmVFYWNoIiwidGVzdCIsImNpdGllcyIsInN0cmluZyIsImludGVnZXIiLCJkYXRhc2V0cyIsImFkZEdyb3VwQnkiLCJleHBlY3QiLCJncm91cEJ5cyIsInRvSGF2ZUxlbmd0aCIsIm9wSWQiLCJzZXRHcm91cEJ5Q29uZmlnIiwiZmllbGROYW1lIiwiYWdncmVnYXRpb25zIiwicG9wIiwicmVzdWx0SWQiLCJydW5Hcm91cEJ5IiwidG9CZVRydXRoeSIsIm1ldGFkYXRhIiwiZGVyaXZlZERhdGFzZXQiLCJ0b0VxdWFsIiwic291cmNlRGF0YUlkcyIsIm9wZXJhdGlvbklkIiwiZGF0YUNvbnRhaW5lciIsIm51bVJvd3MiLCJ0b0JlIiwib3AiLCJPYmplY3QiLCJrZXlzIiwicmVtb3ZlRGF0YXNldCIsInRvQmVVbmRlZmluZWQiLCJyZXN1bHRMYWJlbCIsInRvTWF0Y2giLCJhZGRKb2luIiwiam9pbnMiLCJwb2x5cyIsImdlb2pzb24iLCJhZGRTcGF0aWFsSm9pbiIsInByZWRpY2F0ZSIsImNvbmNhdCIsInNldFNwYXRpYWxKb2luQ29uZmlnIiwicG9seWdvbiIsImNvb3JkaW5hdGVzIiwicHRzIiwicmVhbCIsInJpZ2h0RGF0YUlkIiwibGVmdEdlbyIsImtpbmQiLCJyaWdodEdlbyIsImxhdEZpZWxkIiwibG5nRmllbGQiLCJ2YWx1ZSIsInJ1blNwYXRpYWxKb2luIiwiX2Rlcml2ZWRNZXRhJGRlcml2ZWREIiwiX3NhdmVkJGNvbmZpZyRjb25maWckIiwic2F2ZWQiLCJzYXZlIiwidmlzU3RhdGUiLCJtYXBTdGF0ZSIsIm1hcFN0eWxlIiwidWlTdGF0ZSIsImRlcml2ZWQiLCJmaW5kIiwiZGF0YXNldCIsImRlcml2ZWRNZXRhIiwiY29uZmlnIiwic2l0ZVN0YXRlIiwic2l0ZXMiLCJhZGRTdWl0YWJpbGl0eSIsInN1aXRhYmlsaXRpZXMiLCJ3ZWlnaHRzIiwibGF0IiwibG5nIiwiYWNjZXNzIiwiY29zdCIsIndlaWdodFN0YW5kYXJkaXphdGlvbiIsImRhdGFTdGFuZGFyZGl6YXRpb24iLCJvdXRwdXRGaWVsZE5hbWUiLCJpc0NvbmZpZ0FjdGl2ZSIsIl9sYXllciRjb25maWckY29sb3JGaSIsInNldFN1aXRhYmlsaXR5Q29uZmlnIiwicnVuU3VpdGFiaWxpdHkiLCJyZXN1bHQiLCJ0b0NvbnRhaW4iLCJsYXllciIsImxheWVycyIsIml0ZW0iLCJkYXRhSWQiLCJjb2xvckZpZWxkIiwiZXJyb3IiLCJfZGVyaXZlZE1ldGEkZGVyaXZlZEQyIiwibm90IiwidG9IYXZlUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvZGF0YXNldC1vcHMtdXBkYXRlcnMuc3BlYy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge0FMTF9GSUVMRF9UWVBFU30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtWaXNTdGF0ZUFjdGlvbnN9IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5pbXBvcnQge0tlcGxlclRhYmxlfSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCBTY2hlbWFNYW5hZ2VyLCB7VmlzU3RhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvc2NoZW1hcyc7XG5pbXBvcnQge2RyYWluVGFza3NGb3JUZXN0aW5nLCBzdWNjZWVkVGFza1dpdGhWYWx1ZXN9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuXG5pbXBvcnQgdmlzU3RhdGVSZWR1Y2VyIGZyb20gJy4vdmlzLXN0YXRlJztcbmltcG9ydCB7SU5JVElBTF9WSVNfU1RBVEV9IGZyb20gJy4vdmlzLXN0YXRlLXVwZGF0ZXJzJztcblxuY29uc3QgcmVkdWNlVmlzU3RhdGUgPSB2aXNTdGF0ZVJlZHVjZXIgYXMgKHN0YXRlOiBWaXNTdGF0ZSwgYWN0aW9uOiB1bmtub3duKSA9PiBWaXNTdGF0ZTtcblxuZnVuY3Rpb24gbWFrZVRhYmxlKGlkOiBzdHJpbmcsIGZpZWxkczoge25hbWU6IHN0cmluZzsgdHlwZTogc3RyaW5nfVtdLCByb3dzOiBhbnlbXVtdKSB7XG4gIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtcbiAgICBpbmZvOiB7aWQsIGxhYmVsOiBpZCwgdHlwZTogJ2xvY2FsJ30sXG4gICAgY29sb3I6IFswLCAwLCAwXVxuICB9KTtcbiAgdGFibGUudXBkYXRlU2NoZW1hKHtcbiAgICBmaWVsZHM6IGZpZWxkcy5tYXAoZmllbGQgPT4gKHtcbiAgICAgIG5hbWU6IGZpZWxkLm5hbWUsXG4gICAgICB0eXBlOiBmaWVsZC50eXBlLFxuICAgICAgYW5hbHl6ZXJUeXBlOiBmaWVsZC50eXBlXG4gICAgfSkpLFxuICAgIHJvd3NcbiAgfSk7XG4gIHJldHVybiB0YWJsZTtcbn1cblxuZnVuY3Rpb24gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlOiBWaXNTdGF0ZSkge1xuICBjb25zdCB0YXNrcyA9IGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIHJldHVybiB0YXNrcy5yZWR1Y2UoKG5leHRTdGF0ZSwgdGFzaykgPT4ge1xuICAgIGlmICghU3RyaW5nKHRhc2subGFiZWwgfHwgJycpLmluY2x1ZGVzKCdDUkVBVEVfVEFCTEVfVEFTSycpKSB7XG4gICAgICByZXR1cm4gbmV4dFN0YXRlO1xuICAgIH1cbiAgICBjb25zdCB0YWJsZXMgPSAoQXJyYXkuaXNBcnJheSh0YXNrLnBheWxvYWQpID8gdGFzay5wYXlsb2FkIDogW3Rhc2sucGF5bG9hZF0pLm1hcChwYXlsb2FkID0+IHtcbiAgICAgIGNvbnN0IHRhYmxlID0gbmV3IEtlcGxlclRhYmxlKHtpbmZvOiBwYXlsb2FkLmluZm8sIGNvbG9yOiBwYXlsb2FkLmNvbG9yLCAuLi5wYXlsb2FkLm9wdHN9KTtcbiAgICAgIHRhYmxlLnVwZGF0ZVNjaGVtYShwYXlsb2FkLmRhdGEpO1xuICAgICAgcmV0dXJuIHRhYmxlO1xuICAgIH0pO1xuICAgIHJldHVybiByZWR1Y2VWaXNTdGF0ZShuZXh0U3RhdGUsIHN1Y2NlZWRUYXNrV2l0aFZhbHVlcyh0YXNrLCB0YWJsZXMpKTtcbiAgfSwgc3RhdGUpO1xufVxuXG5kZXNjcmliZSgnZGF0YXNldCBvcHMgdmlzLXN0YXRlJywgKCkgPT4ge1xuICBiZWZvcmVFYWNoKCgpID0+IHtcbiAgICBkcmFpblRhc2tzRm9yVGVzdGluZygpO1xuICB9KTtcblxuICB0ZXN0KCdydW5Hcm91cEJ5IGFkZHMgYSBkZXJpdmVkIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgY29uc3QgY2l0aWVzID0gbWFrZVRhYmxlKFxuICAgICAgJ2NpdGllcycsXG4gICAgICBbXG4gICAgICAgIHtuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAncG9wJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ3dlc3QnLCAxMF0sXG4gICAgICAgIFsnd2VzdCcsIDIwXSxcbiAgICAgICAgWydlYXN0JywgNDBdXG4gICAgICBdXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcElkID0gc3RhdGUuZ3JvdXBCeXNbMF0uaWQ7XG5cbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcElkLCB7XG4gICAgICAgIGZpZWxkTmFtZTogJ3JlZ2lvbicsXG4gICAgICAgIGFnZ3JlZ2F0aW9uczoge3BvcDogJ3N1bSd9XG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0SWQgPSBzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRJZDtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuR3JvdXBCeShvcElkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tyZXN1bHRJZF0ubWV0YWRhdGEuZGVyaXZlZERhdGFzZXQpLnRvRXF1YWwoe1xuICAgICAgdHlwZTogJ2dyb3VwQnknLFxuICAgICAgc291cmNlRGF0YUlkczogWydjaXRpZXMnXSxcbiAgICAgIG9wZXJhdGlvbklkOiBvcElkXG4gICAgfSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW3Jlc3VsdElkXS5kYXRhQ29udGFpbmVyLm51bVJvd3MoKSkudG9CZSgyKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRlIHBhcmVudCBrZWVwcyBkZXJpdmVkIGNoaWxkIHNuYXBzaG90JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzKS50b0hhdmVMZW5ndGgoMCk7XG4gICAgZXhwZWN0KE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKSkudG9IYXZlTGVuZ3RoKDIpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdjaXRpZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzLmNpdGllcykudG9CZVVuZGVmaW5lZCgpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkR3JvdXBCeSB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW3tuYW1lOiAncmVnaW9uJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ31dLFxuICAgICAgW1snd2VzdCddXVxuICAgICk7XG4gICAgbGV0IHN0YXRlOiBWaXNTdGF0ZSA9IHtcbiAgICAgIC4uLklOSVRJQUxfVklTX1NUQVRFLFxuICAgICAgZGF0YXNldHM6IHtjaXRpZXN9XG4gICAgfTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnY2l0aWVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5ncm91cEJ5c1swXS5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXmdyb3VwLWJ5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnYWRkSm9pbiB1c2VzIGEgc2hvcnQgcmFuZG9tIHJlc3VsdCBuYW1lJywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZSgnY2l0aWVzJywgW3tuYW1lOiAnaWQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfV0sIFtbJzEnXV0pO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7Y2l0aWVzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEpvaW4oJ2NpdGllcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvTWF0Y2goL15qb2luLWRhdGFzZXQtXFxkezJ9JC8pO1xuICB9KTtcblxuICB0ZXN0KCdzZXRTcGF0aWFsSm9pbkNvbmZpZyB1cGRhdGVzIHRoZSBwcmVkaWNhdGUnLCAoKSA9PiB7XG4gICAgY29uc3QgcG9seXMgPSBtYWtlVGFibGUoJ3BvbHlzJywgW3tuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufV0sIFtdKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge3BvbHlzfVxuICAgIH07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFNwYXRpYWxKb2luKCdwb2x5cycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLmpvaW5zWzBdO1xuICAgIGV4cGVjdChzdGF0ZS5qb2luc1swXS5wcmVkaWNhdGUpLnRvQmUoJ2ludGVyc2VjdHMnKTtcbiAgICBleHBlY3Qoc3RhdGUuam9pbnNbMF0ucmVzdWx0TGFiZWwpLnRvQmUoYHNwYXRpYWwtam9pbi0ke3N0YXRlLmpvaW5zWzBdLnJlc3VsdElkfWApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoXG4gICAgICBzdGF0ZSxcbiAgICAgIFZpc1N0YXRlQWN0aW9ucy5zZXRTcGF0aWFsSm9pbkNvbmZpZyhvcC5pZCwge3ByZWRpY2F0ZTogJ3dpdGhpbid9KVxuICAgICk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zWzBdLnByZWRpY2F0ZSkudG9CZSgnd2l0aGluJyk7XG4gIH0pO1xuXG4gIHRlc3QoJ2RlbGV0ZSBzcGF0aWFsIGpvaW4gc291cmNlIGtlZXBzIHJlc3VsdCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBjb25zdCBwb2x5Z29uID0ge1xuICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgY29vcmRpbmF0ZXM6IFtcbiAgICAgICAgW1xuICAgICAgICAgIFstMTAsIC0xMF0sXG4gICAgICAgICAgWzEwLCAtMTBdLFxuICAgICAgICAgIFsxMCwgMTBdLFxuICAgICAgICAgIFstMTAsIDEwXSxcbiAgICAgICAgICBbLTEwLCAtMTBdXG4gICAgICAgIF1cbiAgICAgIF1cbiAgICB9O1xuICAgIGNvbnN0IHBvbHlzID0gbWFrZVRhYmxlKFxuICAgICAgJ3BvbHlzJyxcbiAgICAgIFtcbiAgICAgICAge25hbWU6ICduYW1lJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnN0cmluZ30sXG4gICAgICAgIHtuYW1lOiAnZ2VvbScsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5nZW9qc29ufVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCBwb2x5Z29uXV1cbiAgICApO1xuICAgIGNvbnN0IHB0cyA9IG1ha2VUYWJsZShcbiAgICAgICdwdHMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ2xhdCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5yZWFsfSxcbiAgICAgICAge25hbWU6ICdsbmcnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAndmFsdWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuaW50ZWdlcn1cbiAgICAgIF0sXG4gICAgICBbWzAsIDAsIDEwXV1cbiAgICApO1xuICAgIGxldCBzdGF0ZTogVmlzU3RhdGUgPSB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIGRhdGFzZXRzOiB7cG9seXMsIHB0c31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRTcGF0aWFsSm9pbigncG9seXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5qb2luc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0U3BhdGlhbEpvaW5Db25maWcob3AuaWQsIHtcbiAgICAgICAgcmlnaHREYXRhSWQ6ICdwdHMnLFxuICAgICAgICBsZWZ0R2VvOiB7a2luZDogJ2dlb2pzb24nLCBmaWVsZE5hbWU6ICdnZW9tJ30sXG4gICAgICAgIHJpZ2h0R2VvOiB7a2luZDogJ2xhdGxuZycsIGxhdEZpZWxkOiAnbGF0JywgbG5nRmllbGQ6ICdsbmcnfSxcbiAgICAgICAgYWdncmVnYXRpb25zOiB7dmFsdWU6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5TcGF0aWFsSm9pbihvcC5pZCkpO1xuICAgIHN0YXRlID0gZmx1c2hDcmVhdGVUYWJsZVRhc2tzKHN0YXRlKTtcblxuICAgIGV4cGVjdChzdGF0ZS5qb2lucykudG9IYXZlTGVuZ3RoKDApO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVUcnV0aHkoKTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucmVtb3ZlRGF0YXNldCgncHRzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0cy5wdHMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMucG9seXMpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLmpvaW5zKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xuXG4gIHRlc3QoJ3NhdmUvbG9hZCByb3VuZHRyaXAga2VlcHMgdGhlIGRlcml2ZWQgZGF0YXNldCBhbmQgZHJvcHMgdGhlIGZpbmlzaGVkIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGNvbnN0IGNpdGllcyA9IG1ha2VUYWJsZShcbiAgICAgICdjaXRpZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ3JlZ2lvbicsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5zdHJpbmd9LFxuICAgICAgICB7bmFtZTogJ3BvcCcsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfVxuICAgICAgXSxcbiAgICAgIFtbJ3dlc3QnLCAxMF1dXG4gICAgKTtcbiAgICBsZXQgc3RhdGU6IFZpc1N0YXRlID0ge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICBkYXRhc2V0czoge2NpdGllc31cbiAgICB9O1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5hZGRHcm91cEJ5KCdjaXRpZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5ncm91cEJ5c1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKFxuICAgICAgc3RhdGUsXG4gICAgICBWaXNTdGF0ZUFjdGlvbnMuc2V0R3JvdXBCeUNvbmZpZyhvcC5pZCwge1xuICAgICAgICBmaWVsZE5hbWU6ICdyZWdpb24nLFxuICAgICAgICBhZ2dyZWdhdGlvbnM6IHtwb3A6ICdzdW0nfVxuICAgICAgfSlcbiAgICApO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5ydW5Hcm91cEJ5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3Qgc2F2ZWQgPSBTY2hlbWFNYW5hZ2VyLnNhdmUoe1xuICAgICAgdmlzU3RhdGU6IHN0YXRlLFxuICAgICAgbWFwU3RhdGU6IHt9LFxuICAgICAgbWFwU3R5bGU6IHt9LFxuICAgICAgdWlTdGF0ZToge31cbiAgICB9KTtcbiAgICBjb25zdCBkZXJpdmVkID0gc2F2ZWQuZGF0YXNldHMuZmluZChkYXRhc2V0ID0+IGRhdGFzZXQuZGF0YS5pZCA9PT0gb3AucmVzdWx0SWQpO1xuICAgIGNvbnN0IGRlcml2ZWRNZXRhID0gZGVyaXZlZD8uZGF0YS5tZXRhZGF0YSBhc1xuICAgICAgfCB7ZGVyaXZlZERhdGFzZXQ/OiB7dHlwZT86IHN0cmluZ30gfCBudWxsfVxuICAgICAgfCB1bmRlZmluZWQ7XG4gICAgZXhwZWN0KGRlcml2ZWRNZXRhPy5kZXJpdmVkRGF0YXNldD8udHlwZSkudG9CZSgnZ3JvdXBCeScpO1xuICAgIGV4cGVjdChzYXZlZC5jb25maWcuY29uZmlnLnZpc1N0YXRlLmdyb3VwQnlzID8/IFtdKS50b0hhdmVMZW5ndGgoMCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdzdWl0YWJpbGl0eSB2aXMtc3RhdGUnLCAoKSA9PiB7XG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIGRyYWluVGFza3NGb3JUZXN0aW5nKCk7XG4gIH0pO1xuXG4gIGZ1bmN0aW9uIHNpdGVTdGF0ZSgpOiBWaXNTdGF0ZSB7XG4gICAgY29uc3Qgc2l0ZXMgPSBtYWtlVGFibGUoXG4gICAgICAnc2l0ZXMnLFxuICAgICAgW1xuICAgICAgICB7bmFtZTogJ25hbWUnLCB0eXBlOiBBTExfRklFTERfVFlQRVMuc3RyaW5nfSxcbiAgICAgICAge25hbWU6ICdsYXQnLCB0eXBlOiBBTExfRklFTERfVFlQRVMucmVhbH0sXG4gICAgICAgIHtuYW1lOiAnbG5nJywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLnJlYWx9LFxuICAgICAgICB7bmFtZTogJ2FjY2VzcycsIHR5cGU6IEFMTF9GSUVMRF9UWVBFUy5pbnRlZ2VyfSxcbiAgICAgICAge25hbWU6ICdjb3N0JywgdHlwZTogQUxMX0ZJRUxEX1RZUEVTLmludGVnZXJ9XG4gICAgICBdLFxuICAgICAgW1xuICAgICAgICBbJ2EnLCAwLCAwLCAwLCAxMDBdLFxuICAgICAgICBbJ2InLCAxLCAxLCA1LCAyMDBdLFxuICAgICAgICBbJ2MnLCAyLCAyLCAxMCwgMzAwXVxuICAgICAgXVxuICAgICk7XG4gICAgcmV0dXJuIHsuLi5JTklUSUFMX1ZJU19TVEFURSwgZGF0YXNldHM6IHtzaXRlc319O1xuICB9XG5cbiAgdGVzdCgnYWRkU3VpdGFiaWxpdHkgc2VlZHMgbnVtZXJpYyB3ZWlnaHRzIGFuZCBhIHNob3J0IHJhbmRvbSByZXN1bHQgbmFtZScsICgpID0+IHtcbiAgICBjb25zdCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuXG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgxKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgZXhwZWN0KG9wLndlaWdodHMpLnRvRXF1YWwoe2xhdDogMSwgbG5nOiAxLCBhY2Nlc3M6IDEsIGNvc3Q6IDF9KTtcbiAgICBleHBlY3Qob3Aud2VpZ2h0U3RhbmRhcmRpemF0aW9uKS50b0JlKCdub3JtYWxpemUnKTtcbiAgICBleHBlY3Qob3AuZGF0YVN0YW5kYXJkaXphdGlvbikudG9CZSgncmFuZ2UnKTtcbiAgICBleHBlY3Qob3Aub3V0cHV0RmllbGROYW1lKS50b0JlKCdzY29yZScpO1xuICAgIGV4cGVjdChvcC5yZXN1bHRMYWJlbCkudG9NYXRjaCgvXnN1aXRhYmlsaXR5LVxcZHsyfSQvKTtcbiAgfSk7XG5cbiAgdGVzdCgnb3BlbmluZyBhIHN1aXRhYmlsaXR5IG9wIGNsb3NlcyBhbiBvcGVuIGdyb3VwIGJ5JywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkR3JvdXBCeSgnc2l0ZXMnKSk7XG4gICAgZXhwZWN0KHN0YXRlLmdyb3VwQnlzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZ3JvdXBCeXNbMF0uaXNDb25maWdBY3RpdmUpLnRvQmUoZmFsc2UpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLmFkZEdyb3VwQnkoJ3NpdGVzJykpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKGZhbHNlKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVuU3VpdGFiaWxpdHkgYWRkcyBhIHNjb3JlZCBkYXRhc2V0IGFuZCBhIGRlZmF1bHQgbGF5ZXInLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShcbiAgICAgIHN0YXRlLFxuICAgICAgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge2FjY2VzczogMSwgY29zdDogMX19KVxuICAgICk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdO1xuICAgIGV4cGVjdChyZXN1bHQpLnRvQmVUcnV0aHkoKTtcbiAgICBleHBlY3QocmVzdWx0Lm1ldGFkYXRhLmRlcml2ZWREYXRhc2V0KS50b0VxdWFsKHtcbiAgICAgIHR5cGU6ICdzdWl0YWJpbGl0eScsXG4gICAgICBzb3VyY2VEYXRhSWRzOiBbJ3NpdGVzJ10sXG4gICAgICBvcGVyYXRpb25JZDogb3AuaWRcbiAgICB9KTtcbiAgICBleHBlY3QocmVzdWx0LmZpZWxkcy5tYXAoZmllbGQgPT4gZmllbGQubmFtZSkpLnRvQ29udGFpbignc2NvcmUnKTtcbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5pc0NvbmZpZ0FjdGl2ZSkudG9CZShmYWxzZSk7XG5cbiAgICBjb25zdCBsYXllciA9IHN0YXRlLmxheWVycy5maW5kKGl0ZW0gPT4gaXRlbS5jb25maWcuZGF0YUlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgZXhwZWN0KGxheWVyKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KGxheWVyPy5jb25maWcuY29sb3JGaWVsZD8ubmFtZSkudG9CZSgnc2NvcmUnKTtcbiAgfSk7XG5cbiAgdGVzdCgncnVubmluZyB3aXRob3V0IGEgd2VpZ2h0ZWQgZmllbGQgc3VyZmFjZXMgYW4gZXJyb3IgaW5zdGVhZCBvZiBhIGRhdGFzZXQnLCAoKSA9PiB7XG4gICAgbGV0IHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc2l0ZVN0YXRlKCksIFZpc1N0YXRlQWN0aW9ucy5hZGRTdWl0YWJpbGl0eSgnc2l0ZXMnKSk7XG4gICAgY29uc3Qgb3AgPSBzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdO1xuXG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnNldFN1aXRhYmlsaXR5Q29uZmlnKG9wLmlkLCB7d2VpZ2h0czoge319KSk7XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG5cbiAgICBleHBlY3Qoc3RhdGUuc3VpdGFiaWxpdGllc1swXS5lcnJvcikudG9CZSgnU2VsZWN0IGF0IGxlYXN0IG9uZSBmaWVsZCB0byBzY29yZScpO1xuICAgIGV4cGVjdChzdGF0ZS5zdWl0YWJpbGl0aWVzWzBdLmlzQ29uZmlnQWN0aXZlKS50b0JlKHRydWUpO1xuICAgIGV4cGVjdChzdGF0ZS5kYXRhc2V0c1tvcC5yZXN1bHRJZF0pLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgdGVzdCgnZGVsZXRpbmcgdGhlIHNvdXJjZSBkYXRhc2V0IGRyb3BzIHRoZSBvcCBidXQga2VlcHMgdGhlIHNjb3JlZCBzbmFwc2hvdCcsICgpID0+IHtcbiAgICBsZXQgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzaXRlU3RhdGUoKSwgVmlzU3RhdGVBY3Rpb25zLmFkZFN1aXRhYmlsaXR5KCdzaXRlcycpKTtcbiAgICBjb25zdCBvcCA9IHN0YXRlLnN1aXRhYmlsaXRpZXNbMF07XG4gICAgc3RhdGUgPSByZWR1Y2VWaXNTdGF0ZShzdGF0ZSwgVmlzU3RhdGVBY3Rpb25zLnJ1blN1aXRhYmlsaXR5KG9wLmlkKSk7XG4gICAgc3RhdGUgPSBmbHVzaENyZWF0ZVRhYmxlVGFza3Moc3RhdGUpO1xuXG4gICAgZXhwZWN0KHN0YXRlLmRhdGFzZXRzW29wLnJlc3VsdElkXSkudG9CZVRydXRoeSgpO1xuICAgIHN0YXRlID0gcmVkdWNlVmlzU3RhdGUoc3RhdGUsIFZpc1N0YXRlQWN0aW9ucy5yZW1vdmVEYXRhc2V0KCdzaXRlcycpKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHMuc2l0ZXMpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3Qoc3RhdGUuZGF0YXNldHNbb3AucmVzdWx0SWRdKS50b0JlVHJ1dGh5KCk7XG4gICAgZXhwZWN0KHN0YXRlLnN1aXRhYmlsaXRpZXMpLnRvSGF2ZUxlbmd0aCgwKTtcbiAgfSk7XG5cbiAgdGVzdCgndGhlIG9wIGNvbmZpZyBzdGF5cyBvdXQgb2Ygc2F2ZWQgbWFwcyB3aGlsZSB0aGUgZGVyaXZlZCBkYXRhc2V0IHBlcnNpc3RzJywgKCkgPT4ge1xuICAgIGxldCBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHNpdGVTdGF0ZSgpLCBWaXNTdGF0ZUFjdGlvbnMuYWRkU3VpdGFiaWxpdHkoJ3NpdGVzJykpO1xuICAgIGNvbnN0IG9wID0gc3RhdGUuc3VpdGFiaWxpdGllc1swXTtcbiAgICBzdGF0ZSA9IHJlZHVjZVZpc1N0YXRlKHN0YXRlLCBWaXNTdGF0ZUFjdGlvbnMucnVuU3VpdGFiaWxpdHkob3AuaWQpKTtcbiAgICBzdGF0ZSA9IGZsdXNoQ3JlYXRlVGFibGVUYXNrcyhzdGF0ZSk7XG5cbiAgICBjb25zdCBzYXZlZCA9IFNjaGVtYU1hbmFnZXIuc2F2ZSh7XG4gICAgICB2aXNTdGF0ZTogc3RhdGUsXG4gICAgICBtYXBTdGF0ZToge30sXG4gICAgICBtYXBTdHlsZToge30sXG4gICAgICB1aVN0YXRlOiB7fVxuICAgIH0pO1xuXG4gICAgZXhwZWN0KHNhdmVkLmNvbmZpZy5jb25maWcudmlzU3RhdGUpLm5vdC50b0hhdmVQcm9wZXJ0eSgnc3VpdGFiaWxpdGllcycpO1xuICAgIGNvbnN0IGRlcml2ZWQgPSBzYXZlZC5kYXRhc2V0cy5maW5kKGRhdGFzZXQgPT4gZGF0YXNldC5kYXRhLmlkID09PSBvcC5yZXN1bHRJZCk7XG4gICAgY29uc3QgZGVyaXZlZE1ldGEgPSBkZXJpdmVkPy5kYXRhLm1ldGFkYXRhIGFzXG4gICAgICB8IHtkZXJpdmVkRGF0YXNldD86IHt0eXBlPzogc3RyaW5nfSB8IG51bGx9XG4gICAgICB8IHVuZGVmaW5lZDtcbiAgICBleHBlY3QoZGVyaXZlZE1ldGE/LmRlcml2ZWREYXRhc2V0Py50eXBlKS50b0JlKCdzdWl0YWJpbGl0eScpO1xuICB9KTtcbn0pO1xuIl0sIm1hcHBpbmdzIjoiOzs7QUFBQTtBQUNBOztBQUVBLFNBQVFBLGVBQWUsUUFBTyxzQkFBc0I7QUFDcEQsU0FBUUMsZUFBZSxRQUFPLG9CQUFvQjtBQUNsRCxTQUFRQyxXQUFXLFFBQU8sa0JBQWtCO0FBQzVDLE9BQU9DLGFBQWEsTUFBa0Isb0JBQW9C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
|