@kepler.gl/reducers 3.0.0 → 3.1.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +26 -20
- package/dist/combined-updaters.d.ts +0 -79
- package/dist/combined-updaters.js +0 -423
- package/dist/composer-helpers.d.ts +0 -24
- package/dist/composer-helpers.js +0 -122
- package/dist/composers.d.ts +0 -18
- package/dist/composers.js +0 -27
- package/dist/core.d.ts +0 -64
- package/dist/core.js +0 -139
- package/dist/data-utils.d.ts +0 -8
- package/dist/data-utils.js +0 -42
- package/dist/export-utils.d.ts +0 -21
- package/dist/export-utils.js +0 -104
- package/dist/index.d.ts +0 -35
- package/dist/index.js +0 -373
- package/dist/interaction-utils.d.ts +0 -31
- package/dist/interaction-utils.js +0 -129
- package/dist/layer-utils.d.ts +0 -95
- package/dist/layer-utils.js +0 -344
- package/dist/map-state-updaters.d.ts +0 -93
- package/dist/map-state-updaters.js +0 -489
- package/dist/map-state.d.ts +0 -75
- package/dist/map-state.js +0 -47
- package/dist/map-style-updaters.d.ts +0 -186
- package/dist/map-style-updaters.js +0 -737
- package/dist/map-style.d.ts +0 -4
- package/dist/map-style.js +0 -46
- package/dist/merger-handler.d.ts +0 -10
- package/dist/merger-handler.js +0 -123
- package/dist/middleware.d.ts +0 -8
- package/dist/middleware.js +0 -30
- package/dist/provider-state-updaters.d.ts +0 -35
- package/dist/provider-state-updaters.js +0 -422
- package/dist/provider-state.d.ts +0 -4
- package/dist/provider-state.js +0 -46
- package/dist/root.d.ts +0 -24
- package/dist/root.js +0 -229
- package/dist/ui-state-updaters.d.ts +0 -362
- package/dist/ui-state-updaters.js +0 -871
- package/dist/ui-state.d.ts +0 -3
- package/dist/ui-state.js +0 -48
- package/dist/vis-state-merger.d.ts +0 -140
- package/dist/vis-state-merger.js +0 -915
- package/dist/vis-state-selectors.d.ts +0 -2
- package/dist/vis-state-selectors.js +0 -37
- package/dist/vis-state-updaters.d.ts +0 -545
- package/dist/vis-state-updaters.js +0 -3154
- package/dist/vis-state.d.ts +0 -211
- package/dist/vis-state.js +0 -46
|
@@ -1,3154 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
6
|
-
|
|
7
|
-
Object.defineProperty(exports, "__esModule", {
|
|
8
|
-
value: true
|
|
9
|
-
});
|
|
10
|
-
exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
|
|
11
|
-
exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
|
|
12
|
-
exports.applyLayerConfigUpdater = applyLayerConfigUpdater;
|
|
13
|
-
exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
|
|
14
|
-
exports.layerSetIsValidUpdater = layerSetIsValidUpdater;
|
|
15
|
-
exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
|
|
16
|
-
exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
|
|
17
|
-
exports.setInitialLayerConfig = setInitialLayerConfig;
|
|
18
|
-
exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
|
|
19
|
-
exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
|
|
20
|
-
exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
|
|
21
|
-
exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
|
|
22
|
-
exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
|
|
23
|
-
exports.setFilterUpdater = setFilterUpdater;
|
|
24
|
-
exports.removeLayerUpdater = removeLayerUpdater;
|
|
25
|
-
exports.removeDatasetUpdater = removeDatasetUpdater;
|
|
26
|
-
exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
|
|
27
|
-
exports.applyMergersUpdater = applyMergersUpdater;
|
|
28
|
-
exports.renameDatasetUpdater = renameDatasetUpdater;
|
|
29
|
-
exports.updateDatasetPropsUpdater = updateDatasetPropsUpdater;
|
|
30
|
-
exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
|
|
31
|
-
exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
|
|
32
|
-
exports.loadNextFileUpdater = loadNextFileUpdater;
|
|
33
|
-
exports.makeLoadFileTask = makeLoadFileTask;
|
|
34
|
-
exports.processFileContentUpdater = processFileContentUpdater;
|
|
35
|
-
exports.parseProgress = parseProgress;
|
|
36
|
-
exports.addDefaultLayers = addDefaultLayers;
|
|
37
|
-
exports.addDefaultTooltips = addDefaultTooltips;
|
|
38
|
-
exports.initialFileLoadingProgress = initialFileLoadingProgress;
|
|
39
|
-
exports.updateFileLoadingProgressUpdater = updateFileLoadingProgressUpdater;
|
|
40
|
-
exports.updateAllLayerDomainData = updateAllLayerDomainData;
|
|
41
|
-
exports.updateAnimationDomain = updateAnimationDomain;
|
|
42
|
-
exports.setFeaturesUpdater = setFeaturesUpdater;
|
|
43
|
-
exports.deleteFeatureUpdater = deleteFeatureUpdater;
|
|
44
|
-
exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
|
|
45
|
-
exports.sortTableColumnUpdater = sortTableColumnUpdater;
|
|
46
|
-
exports.pinTableColumnUpdater = pinTableColumnUpdater;
|
|
47
|
-
exports.copyTableColumnUpdater = copyTableColumnUpdater;
|
|
48
|
-
exports.setColumnDisplayFormatUpdater = setColumnDisplayFormatUpdater;
|
|
49
|
-
exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
|
|
50
|
-
exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
|
|
51
|
-
exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
|
|
52
|
-
exports.prepareStateForDatasetReplace = prepareStateForDatasetReplace;
|
|
53
|
-
exports.replaceDatasetDepsInState = replaceDatasetDepsInState;
|
|
54
|
-
exports.setSelectedFeatureUpdater = exports.setEditorModeUpdater = exports.setMapInfoUpdater = exports.applyCPUFilterUpdater = exports.loadFilesErrUpdater = exports.nextFileBatchUpdater = exports.loadFilesUpdater = exports.updateVisDataUpdater = exports.toggleLayerForMapUpdater = exports.toggleSplitMapUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = exports.layerClickUpdater = exports.layerHoverUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.updateTableColorUpdater = exports.showDatasetTableUpdater = exports.updateOverlayBlendingUpdater = exports.updateLayerBlendingUpdater = exports.updateEffectUpdater = exports.reorderEffectUpdater = exports.removeEffectUpdater = exports.addEffectUpdater = exports.duplicateLayerUpdater = exports.reorderLayerUpdater = exports.addLayerUpdater = exports.removeFilterUpdater = exports.toggleFilterFeatureUpdater = exports.setFilterViewUpdater = exports.updateLayerAnimationSpeedUpdater = exports.setLayerAnimationTimeUpdater = exports.updateFilterAnimationSpeedUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationUpdater = exports.toggleFilterAnimationUpdater = exports.layerColorUIChangeUpdater = exports.addFilterUpdater = exports.setFilterPlotUpdater = exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = exports.defaultInteractionConfig = void 0;
|
|
55
|
-
|
|
56
|
-
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
|
57
|
-
|
|
58
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
59
|
-
|
|
60
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
61
|
-
|
|
62
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
63
|
-
|
|
64
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
65
|
-
|
|
66
|
-
var _bbox = _interopRequireDefault(require("@turf/bbox"));
|
|
67
|
-
|
|
68
|
-
var _window = require("global/window");
|
|
69
|
-
|
|
70
|
-
var _tasks = require("react-palm/tasks");
|
|
71
|
-
|
|
72
|
-
var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
|
|
73
|
-
|
|
74
|
-
var _lodash2 = _interopRequireDefault(require("lodash.uniq"));
|
|
75
|
-
|
|
76
|
-
var _lodash3 = _interopRequireDefault(require("lodash.get"));
|
|
77
|
-
|
|
78
|
-
var _lodash4 = _interopRequireDefault(require("lodash.xor"));
|
|
79
|
-
|
|
80
|
-
var _lodash5 = _interopRequireDefault(require("lodash.pick"));
|
|
81
|
-
|
|
82
|
-
var _lodash6 = _interopRequireDefault(require("lodash.isequal"));
|
|
83
|
-
|
|
84
|
-
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
85
|
-
|
|
86
|
-
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
87
|
-
|
|
88
|
-
var _tasks2 = require("@kepler.gl/tasks");
|
|
89
|
-
|
|
90
|
-
var _actions = require("@kepler.gl/actions");
|
|
91
|
-
|
|
92
|
-
var _utils = require("@kepler.gl/utils");
|
|
93
|
-
|
|
94
|
-
var _visStateMerger = require("./vis-state-merger");
|
|
95
|
-
|
|
96
|
-
var _mergerHandler = require("./merger-handler");
|
|
97
|
-
|
|
98
|
-
var _layers = require("@kepler.gl/layers");
|
|
99
|
-
|
|
100
|
-
var _constants = require("@kepler.gl/constants");
|
|
101
|
-
|
|
102
|
-
var _composerHelpers = require("./composer-helpers");
|
|
103
|
-
|
|
104
|
-
var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
|
|
105
|
-
|
|
106
|
-
var _layerUtils = require("./layer-utils");
|
|
107
|
-
|
|
108
|
-
var _table = require("@kepler.gl/table");
|
|
109
|
-
|
|
110
|
-
var _interactionUtils = require("./interaction-utils");
|
|
111
|
-
|
|
112
|
-
var _effects = require("@kepler.gl/effects");
|
|
113
|
-
|
|
114
|
-
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
115
|
-
|
|
116
|
-
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
117
|
-
|
|
118
|
-
function _createForOfIteratorHelper(o, allowArrayLike) { var it; if (typeof Symbol === "undefined" || o[Symbol.iterator] == null) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = o[Symbol.iterator](); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; }
|
|
119
|
-
|
|
120
|
-
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
121
|
-
|
|
122
|
-
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
|
|
123
|
-
|
|
124
|
-
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
|
|
125
|
-
|
|
126
|
-
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
|
|
127
|
-
|
|
128
|
-
// react-palm
|
|
129
|
-
// disable capture exception for react-palm call to withTask
|
|
130
|
-
(0, _tasks.disableStackCapturing)();
|
|
131
|
-
/**
|
|
132
|
-
* Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
|
|
133
|
-
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
134
|
-
*
|
|
135
|
-
* @public
|
|
136
|
-
* @example
|
|
137
|
-
*
|
|
138
|
-
* import keplerGlReducer, {visStateUpdaters} from 'kepler.gl/reducers';
|
|
139
|
-
* // Root Reducer
|
|
140
|
-
* const reducers = combineReducers({
|
|
141
|
-
* keplerGl: keplerGlReducer,
|
|
142
|
-
* app: appReducer
|
|
143
|
-
* });
|
|
144
|
-
*
|
|
145
|
-
* const composedReducer = (state, action) => {
|
|
146
|
-
* switch (action.type) {
|
|
147
|
-
* case 'CLICK_BUTTON':
|
|
148
|
-
* return {
|
|
149
|
-
* ...state,
|
|
150
|
-
* keplerGl: {
|
|
151
|
-
* ...state.keplerGl,
|
|
152
|
-
* foo: {
|
|
153
|
-
* ...state.keplerGl.foo,
|
|
154
|
-
* visState: visStateUpdaters.enlargeFilterUpdater(
|
|
155
|
-
* state.keplerGl.foo.visState,
|
|
156
|
-
* {idx: 0}
|
|
157
|
-
* )
|
|
158
|
-
* }
|
|
159
|
-
* }
|
|
160
|
-
* };
|
|
161
|
-
* }
|
|
162
|
-
* return reducers(state, action);
|
|
163
|
-
* };
|
|
164
|
-
*
|
|
165
|
-
* export default composedReducer;
|
|
166
|
-
*/
|
|
167
|
-
|
|
168
|
-
/* eslint-disable no-unused-vars */
|
|
169
|
-
// @ts-ignore
|
|
170
|
-
|
|
171
|
-
var visStateUpdaters = null;
|
|
172
|
-
/* eslint-enable no-unused-vars */
|
|
173
|
-
|
|
174
|
-
var defaultInteractionConfig = {
|
|
175
|
-
tooltip: {
|
|
176
|
-
id: 'tooltip',
|
|
177
|
-
label: 'interactions.tooltip',
|
|
178
|
-
enabled: true,
|
|
179
|
-
config: {
|
|
180
|
-
fieldsToShow: {},
|
|
181
|
-
compareMode: false,
|
|
182
|
-
compareType: _constants.COMPARE_TYPES.ABSOLUTE
|
|
183
|
-
}
|
|
184
|
-
},
|
|
185
|
-
geocoder: {
|
|
186
|
-
id: 'geocoder',
|
|
187
|
-
label: 'interactions.geocoder',
|
|
188
|
-
enabled: false,
|
|
189
|
-
position: null
|
|
190
|
-
},
|
|
191
|
-
brush: {
|
|
192
|
-
id: 'brush',
|
|
193
|
-
label: 'interactions.brush',
|
|
194
|
-
enabled: false,
|
|
195
|
-
config: {
|
|
196
|
-
// size is in km
|
|
197
|
-
size: 0.5
|
|
198
|
-
}
|
|
199
|
-
},
|
|
200
|
-
coordinate: {
|
|
201
|
-
id: 'coordinate',
|
|
202
|
-
label: 'interactions.coordinate',
|
|
203
|
-
enabled: false,
|
|
204
|
-
position: null
|
|
205
|
-
}
|
|
206
|
-
};
|
|
207
|
-
exports.defaultInteractionConfig = defaultInteractionConfig;
|
|
208
|
-
var DEFAULT_ANIMATION_CONFIG = {
|
|
209
|
-
domain: null,
|
|
210
|
-
currentTime: null,
|
|
211
|
-
speed: 1,
|
|
212
|
-
isAnimating: false,
|
|
213
|
-
timeFormat: null,
|
|
214
|
-
timezone: null,
|
|
215
|
-
defaultTimeFormat: null,
|
|
216
|
-
hideControl: false,
|
|
217
|
-
duration: null
|
|
218
|
-
};
|
|
219
|
-
exports.DEFAULT_ANIMATION_CONFIG = DEFAULT_ANIMATION_CONFIG;
|
|
220
|
-
var DEFAULT_EDITOR = {
|
|
221
|
-
mode: _constants.EDITOR_MODES.DRAW_POLYGON,
|
|
222
|
-
features: [],
|
|
223
|
-
selectedFeature: null,
|
|
224
|
-
visible: true
|
|
225
|
-
};
|
|
226
|
-
/**
|
|
227
|
-
* Default initial `visState`
|
|
228
|
-
* @memberof visStateUpdaters
|
|
229
|
-
* @constant
|
|
230
|
-
* @public
|
|
231
|
-
*/
|
|
232
|
-
|
|
233
|
-
exports.DEFAULT_EDITOR = DEFAULT_EDITOR;
|
|
234
|
-
var INITIAL_VIS_STATE = {
|
|
235
|
-
// map info
|
|
236
|
-
mapInfo: {
|
|
237
|
-
title: '',
|
|
238
|
-
description: ''
|
|
239
|
-
},
|
|
240
|
-
// layers
|
|
241
|
-
layers: [],
|
|
242
|
-
layerData: [],
|
|
243
|
-
layerToBeMerged: [],
|
|
244
|
-
layerOrder: [],
|
|
245
|
-
// filters
|
|
246
|
-
filters: [],
|
|
247
|
-
filterToBeMerged: [],
|
|
248
|
-
// a collection of multiple dataset
|
|
249
|
-
datasets: {},
|
|
250
|
-
editingDataset: undefined,
|
|
251
|
-
// effects
|
|
252
|
-
effects: [],
|
|
253
|
-
effectOrder: [],
|
|
254
|
-
interactionConfig: defaultInteractionConfig,
|
|
255
|
-
interactionToBeMerged: {},
|
|
256
|
-
layerBlending: 'normal',
|
|
257
|
-
overlayBlending: 'normal',
|
|
258
|
-
hoverInfo: undefined,
|
|
259
|
-
clicked: undefined,
|
|
260
|
-
mousePos: {},
|
|
261
|
-
maxDefaultTooltips: _constants.MAX_DEFAULT_TOOLTIPS,
|
|
262
|
-
// this is used when user split maps
|
|
263
|
-
splitMaps: [// this will contain a list of objects to
|
|
264
|
-
// describe the state of layer availability and visibility for each map
|
|
265
|
-
// [
|
|
266
|
-
// {
|
|
267
|
-
// layers: {layer_id: true | false}
|
|
268
|
-
// }
|
|
269
|
-
// ]
|
|
270
|
-
],
|
|
271
|
-
splitMapsToBeMerged: [],
|
|
272
|
-
isMergingDatasets: {},
|
|
273
|
-
// defaults layer classes
|
|
274
|
-
layerClasses: _layers.LayerClasses,
|
|
275
|
-
// default animation
|
|
276
|
-
// time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
|
|
277
|
-
animationConfig: DEFAULT_ANIMATION_CONFIG,
|
|
278
|
-
editor: DEFAULT_EDITOR,
|
|
279
|
-
fileLoading: false,
|
|
280
|
-
fileLoadingProgress: {},
|
|
281
|
-
loaders: [],
|
|
282
|
-
loadOptions: {},
|
|
283
|
-
// visStateMergers
|
|
284
|
-
mergers: _visStateMerger.VIS_STATE_MERGERS,
|
|
285
|
-
// kepler schemas
|
|
286
|
-
schema: _schemas["default"]
|
|
287
|
-
};
|
|
288
|
-
exports.INITIAL_VIS_STATE = INITIAL_VIS_STATE;
|
|
289
|
-
|
|
290
|
-
/**
|
|
291
|
-
* Update state with updated layer and layerData
|
|
292
|
-
*
|
|
293
|
-
*/
|
|
294
|
-
function updateStateWithLayerAndData(state, _ref) {
|
|
295
|
-
var layerData = _ref.layerData,
|
|
296
|
-
layer = _ref.layer,
|
|
297
|
-
idx = _ref.idx;
|
|
298
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
299
|
-
layers: state.layers.map(function (lyr, i) {
|
|
300
|
-
return i === idx ? layer : lyr;
|
|
301
|
-
}),
|
|
302
|
-
layerData: layerData ? state.layerData.map(function (d, i) {
|
|
303
|
-
return i === idx ? layerData : d;
|
|
304
|
-
}) : state.layerData
|
|
305
|
-
});
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function updateStateOnLayerVisibilityChange(state, layer) {
|
|
309
|
-
var newState = state;
|
|
310
|
-
|
|
311
|
-
if (state.splitMaps.length) {
|
|
312
|
-
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
313
|
-
splitMaps: layer.config.isVisible ? (0, _utils.addNewLayersToSplitMap)(state.splitMaps, layer) : (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layer)
|
|
314
|
-
});
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
if (layer.config.animation.enabled) {
|
|
318
|
-
newState = updateAnimationDomain(state);
|
|
319
|
-
}
|
|
320
|
-
|
|
321
|
-
return newState;
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Compares two objects (or arrays) and returns a new object with only the
|
|
325
|
-
* properties that have changed between the two objects.
|
|
326
|
-
*/
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
function pickChangedProps(prev, next) {
|
|
330
|
-
var changedProps = {};
|
|
331
|
-
|
|
332
|
-
var pickPropsOf = function pickPropsOf(obj) {
|
|
333
|
-
Object.keys(obj).forEach(function (key) {
|
|
334
|
-
if (!changedProps.hasOwnProperty(key) && !(0, _lodash6["default"])(prev[key], next[key])) {
|
|
335
|
-
changedProps[key] = next[key];
|
|
336
|
-
}
|
|
337
|
-
});
|
|
338
|
-
};
|
|
339
|
-
|
|
340
|
-
pickPropsOf(prev);
|
|
341
|
-
pickPropsOf(next);
|
|
342
|
-
return changedProps;
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
|
|
346
|
-
/**
|
|
347
|
-
* Apply layer config
|
|
348
|
-
* @memberof visStateUpdaters
|
|
349
|
-
* @returns nextState
|
|
350
|
-
*/
|
|
351
|
-
// eslint-disable-next-line complexity, max-statements
|
|
352
|
-
|
|
353
|
-
function applyLayerConfigUpdater(state, action) {
|
|
354
|
-
var _serializeLayer;
|
|
355
|
-
|
|
356
|
-
var oldLayerId = action.oldLayerId,
|
|
357
|
-
newLayerConfig = action.newLayerConfig,
|
|
358
|
-
layerIndex = action.layerIndex;
|
|
359
|
-
var newParsedLayer = // will move visualChannels to the config prop
|
|
360
|
-
(0, _visStateMerger.parseLayerConfig)(state.schema, newLayerConfig);
|
|
361
|
-
var oldLayer = state.layers.find(function (l) {
|
|
362
|
-
return l.id === oldLayerId;
|
|
363
|
-
});
|
|
364
|
-
|
|
365
|
-
if (!oldLayer || !newParsedLayer) {
|
|
366
|
-
return state;
|
|
367
|
-
}
|
|
368
|
-
|
|
369
|
-
if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
|
|
370
|
-
// layerIndex is provided, but it doesn't match the oldLayer
|
|
371
|
-
return state;
|
|
372
|
-
}
|
|
373
|
-
|
|
374
|
-
var dataset = state.datasets[newParsedLayer.config.dataId];
|
|
375
|
-
|
|
376
|
-
if (!dataset) {
|
|
377
|
-
return state;
|
|
378
|
-
} // Make sure the layer is valid and convert it to Layer
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
var newLayer = (0, _visStateMerger.validateLayerWithData)(dataset, newParsedLayer, state.layerClasses);
|
|
382
|
-
|
|
383
|
-
if (!newLayer) {
|
|
384
|
-
return state;
|
|
385
|
-
}
|
|
386
|
-
|
|
387
|
-
var nextState = state;
|
|
388
|
-
|
|
389
|
-
if (newLayer.type && newLayer.type !== oldLayer.type) {
|
|
390
|
-
var oldLayerIndex = state.layers.findIndex(function (l) {
|
|
391
|
-
return l.id === oldLayerId;
|
|
392
|
-
});
|
|
393
|
-
|
|
394
|
-
if (oldLayerIndex >= 0) {
|
|
395
|
-
nextState = layerTypeChangeUpdater(nextState, (0, _actions.layerTypeChange)(oldLayer, newLayer.type)); // layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
|
|
396
|
-
// but first make sure that the layer was not removed
|
|
397
|
-
|
|
398
|
-
if (nextState.layers.length === state.layers.length) {
|
|
399
|
-
var newLayerId = nextState.layers[oldLayerIndex].id;
|
|
400
|
-
nextState = applyLayerConfigUpdater(nextState, (0, _actions.applyLayerConfig)(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
|
|
401
|
-
id: newLayerId
|
|
402
|
-
})));
|
|
403
|
-
}
|
|
404
|
-
}
|
|
405
|
-
|
|
406
|
-
return nextState;
|
|
407
|
-
} // serializeLayer() might return null if the old layer is not valid,
|
|
408
|
-
// we should still apply the changes in that case
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
var serializedOldLayer = (_serializeLayer = (0, _visStateMerger.serializeLayer)(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
|
|
412
|
-
config: {}
|
|
413
|
-
};
|
|
414
|
-
var serializedNewLayer = (0, _visStateMerger.serializeLayer)(newLayer, state.schema);
|
|
415
|
-
|
|
416
|
-
if (!serializedNewLayer) {
|
|
417
|
-
return state;
|
|
418
|
-
}
|
|
419
|
-
|
|
420
|
-
if (!(0, _lodash6["default"])(serializedOldLayer, serializedNewLayer)) {
|
|
421
|
-
var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
|
|
422
|
-
|
|
423
|
-
if ('visConfig' in changed) {
|
|
424
|
-
if (changed.visConfig) {
|
|
425
|
-
nextState = layerVisConfigChangeUpdater(nextState, (0, _actions.layerVisConfigChange)(oldLayer, changed.visConfig));
|
|
426
|
-
}
|
|
427
|
-
|
|
428
|
-
delete changed.visConfig;
|
|
429
|
-
}
|
|
430
|
-
|
|
431
|
-
Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
|
|
432
|
-
var channel = oldLayer.visualChannels[channelName];
|
|
433
|
-
var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
|
|
434
|
-
return channel[prop];
|
|
435
|
-
});
|
|
436
|
-
|
|
437
|
-
if (channelPropNames.some(function (prop) {
|
|
438
|
-
return prop in changed;
|
|
439
|
-
})) {
|
|
440
|
-
nextState = layerVisualChannelChangeUpdater(nextState, (0, _actions.layerVisualChannelConfigChange)(oldLayer, (0, _lodash5["default"])(newLayer.config, channelPropNames), channelName));
|
|
441
|
-
|
|
442
|
-
var _iterator = _createForOfIteratorHelper(channelPropNames),
|
|
443
|
-
_step;
|
|
444
|
-
|
|
445
|
-
try {
|
|
446
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
447
|
-
var prop = _step.value;
|
|
448
|
-
delete changed[prop];
|
|
449
|
-
}
|
|
450
|
-
} catch (err) {
|
|
451
|
-
_iterator.e(err);
|
|
452
|
-
} finally {
|
|
453
|
-
_iterator.f();
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
});
|
|
457
|
-
|
|
458
|
-
if (Object.keys(changed).length > 0) {
|
|
459
|
-
nextState = layerConfigChangeUpdater(nextState, (0, _actions.layerConfigChange)(oldLayer, (0, _lodash5["default"])(newLayer.config, Object.keys(changed))));
|
|
460
|
-
}
|
|
461
|
-
}
|
|
462
|
-
|
|
463
|
-
return nextState;
|
|
464
|
-
}
|
|
465
|
-
/**
|
|
466
|
-
* Update layer base config: dataId, label, column, isVisible
|
|
467
|
-
* @memberof visStateUpdaters
|
|
468
|
-
* @returns nextState
|
|
469
|
-
*/
|
|
470
|
-
// eslint-disable-next-line complexity
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
function layerConfigChangeUpdater(state, action) {
|
|
474
|
-
var oldLayer = action.oldLayer;
|
|
475
|
-
var idx = state.layers.findIndex(function (l) {
|
|
476
|
-
return l.id === oldLayer.id;
|
|
477
|
-
});
|
|
478
|
-
var props = Object.keys(action.newConfig);
|
|
479
|
-
|
|
480
|
-
if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
|
|
481
|
-
var _action$newConfig = action.newConfig,
|
|
482
|
-
dataId = _action$newConfig.dataId,
|
|
483
|
-
restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, ["dataId"]);
|
|
484
|
-
var stateWithDataId = layerDataIdChangeUpdater(state, {
|
|
485
|
-
oldLayer: oldLayer,
|
|
486
|
-
newConfig: {
|
|
487
|
-
dataId: dataId
|
|
488
|
-
}
|
|
489
|
-
});
|
|
490
|
-
var nextLayer = stateWithDataId.layers.find(function (l) {
|
|
491
|
-
return l.id === oldLayer.id;
|
|
492
|
-
});
|
|
493
|
-
return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
|
|
494
|
-
oldLayer: nextLayer,
|
|
495
|
-
newConfig: restConfig
|
|
496
|
-
}) : stateWithDataId;
|
|
497
|
-
}
|
|
498
|
-
|
|
499
|
-
var newLayer = oldLayer.updateLayerConfig(action.newConfig);
|
|
500
|
-
var layerData;
|
|
501
|
-
|
|
502
|
-
if (newLayer.shouldCalculateLayerData(props)) {
|
|
503
|
-
var oldLayerData = state.layerData[idx];
|
|
504
|
-
var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
|
|
505
|
-
newLayer = updateLayerDataResult.layer;
|
|
506
|
-
layerData = updateLayerDataResult.layerData;
|
|
507
|
-
}
|
|
508
|
-
|
|
509
|
-
var newState = state;
|
|
510
|
-
|
|
511
|
-
if ('isVisible' in action.newConfig) {
|
|
512
|
-
newState = updateStateOnLayerVisibilityChange(state, newLayer);
|
|
513
|
-
}
|
|
514
|
-
|
|
515
|
-
return updateStateWithLayerAndData(newState, {
|
|
516
|
-
layer: newLayer,
|
|
517
|
-
layerData: layerData,
|
|
518
|
-
idx: idx
|
|
519
|
-
});
|
|
520
|
-
}
|
|
521
|
-
/**
|
|
522
|
-
* Updates isValid flag of a layer.
|
|
523
|
-
* Updates isVisible based on the value of isValid.
|
|
524
|
-
* Triggers update of data for the layer in order to get errors again during next update iteration.
|
|
525
|
-
* @memberof visStateUpdaters
|
|
526
|
-
* @returns nextState
|
|
527
|
-
*/
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
function layerSetIsValidUpdater(state, action) {
|
|
531
|
-
var oldLayer = action.oldLayer,
|
|
532
|
-
isValid = action.isValid;
|
|
533
|
-
var idx = state.layers.findIndex(function (l) {
|
|
534
|
-
return l.id === oldLayer.id;
|
|
535
|
-
});
|
|
536
|
-
var layerToUpdate = state.layers[idx];
|
|
537
|
-
|
|
538
|
-
if (layerToUpdate) {
|
|
539
|
-
var newLayer;
|
|
540
|
-
var newData = null;
|
|
541
|
-
|
|
542
|
-
if (isValid) {
|
|
543
|
-
// Trigger data update in order to show errors again if present.
|
|
544
|
-
var _calculateLayerData = (0, _layerUtils.calculateLayerData)(layerToUpdate, state, undefined),
|
|
545
|
-
layer = _calculateLayerData.layer,
|
|
546
|
-
layerData = _calculateLayerData.layerData;
|
|
547
|
-
|
|
548
|
-
newLayer = layer;
|
|
549
|
-
newData = layerData;
|
|
550
|
-
} else {
|
|
551
|
-
newLayer = layerToUpdate.updateLayerConfig({
|
|
552
|
-
isVisible: false
|
|
553
|
-
});
|
|
554
|
-
newLayer.isValid = false;
|
|
555
|
-
}
|
|
556
|
-
|
|
557
|
-
return updateStateWithLayerAndData(state, {
|
|
558
|
-
idx: idx,
|
|
559
|
-
layer: newLayer,
|
|
560
|
-
layerData: newData
|
|
561
|
-
});
|
|
562
|
-
}
|
|
563
|
-
|
|
564
|
-
return state;
|
|
565
|
-
}
|
|
566
|
-
|
|
567
|
-
function addOrRemoveTextLabels(newFields, textLabel) {
|
|
568
|
-
var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.DEFAULT_TEXT_LABEL;
|
|
569
|
-
var newTextLabel = textLabel.slice();
|
|
570
|
-
var currentFields = textLabel.map(function (tl) {
|
|
571
|
-
return tl.field && tl.field.name;
|
|
572
|
-
}).filter(function (d) {
|
|
573
|
-
return d;
|
|
574
|
-
});
|
|
575
|
-
var addFields = newFields.filter(function (f) {
|
|
576
|
-
return !currentFields.includes(f.name);
|
|
577
|
-
});
|
|
578
|
-
var deleteFields = currentFields.filter(function (f) {
|
|
579
|
-
return !newFields.find(function (fd) {
|
|
580
|
-
return fd.name === f;
|
|
581
|
-
});
|
|
582
|
-
}); // delete
|
|
583
|
-
|
|
584
|
-
newTextLabel = newTextLabel.filter(function (tl) {
|
|
585
|
-
return tl.field && !deleteFields.includes(tl.field.name);
|
|
586
|
-
});
|
|
587
|
-
newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel; // add
|
|
588
|
-
|
|
589
|
-
newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
|
|
590
|
-
return tl.field;
|
|
591
|
-
})), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
|
|
592
|
-
return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
|
|
593
|
-
field: af
|
|
594
|
-
});
|
|
595
|
-
})));
|
|
596
|
-
return newTextLabel;
|
|
597
|
-
}
|
|
598
|
-
|
|
599
|
-
function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
|
|
600
|
-
if (!textLabel[idx].hasOwnProperty(prop)) {
|
|
601
|
-
return textLabel;
|
|
602
|
-
}
|
|
603
|
-
|
|
604
|
-
var newTextLabel = textLabel.slice();
|
|
605
|
-
|
|
606
|
-
if (prop === 'field' && value === null && textLabel.length > 1) {
|
|
607
|
-
// remove label when field value is set to null
|
|
608
|
-
newTextLabel.splice(idx, 1);
|
|
609
|
-
} else if (prop) {
|
|
610
|
-
newTextLabel = textLabel.map(function (tl, i) {
|
|
611
|
-
return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
|
|
612
|
-
});
|
|
613
|
-
}
|
|
614
|
-
|
|
615
|
-
return newTextLabel;
|
|
616
|
-
}
|
|
617
|
-
/**
|
|
618
|
-
* Update layer base config: dataId, label, column, isVisible
|
|
619
|
-
* @memberof visStateUpdaters
|
|
620
|
-
* @returns nextState
|
|
621
|
-
*/
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
function layerTextLabelChangeUpdater(state, action) {
|
|
625
|
-
var _oldLayer$getDefaultL, _oldLayer$getDefaultL2, _oldLayer$getDefaultL3;
|
|
626
|
-
|
|
627
|
-
var oldLayer = action.oldLayer,
|
|
628
|
-
idx = action.idx,
|
|
629
|
-
prop = action.prop,
|
|
630
|
-
value = action.value;
|
|
631
|
-
var textLabel = oldLayer.config.textLabel; // when adding a new empty text label,
|
|
632
|
-
// rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
|
|
633
|
-
|
|
634
|
-
var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
|
|
635
|
-
dataId: ''
|
|
636
|
-
})) === null || _oldLayer$getDefaultL2 === void 0 ? void 0 : (_oldLayer$getDefaultL3 = _oldLayer$getDefaultL2.textLabel) === null || _oldLayer$getDefaultL3 === void 0 ? void 0 : _oldLayer$getDefaultL3[0]) !== null && _oldLayer$getDefaultL !== void 0 ? _oldLayer$getDefaultL : _constants.DEFAULT_TEXT_LABEL;
|
|
637
|
-
var newTextLabel = textLabel.slice();
|
|
638
|
-
|
|
639
|
-
if (!textLabel[idx] && idx === textLabel.length) {
|
|
640
|
-
// if idx is set to length, add empty text label
|
|
641
|
-
newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [defaultTextLabel]);
|
|
642
|
-
}
|
|
643
|
-
|
|
644
|
-
if (idx === 'all' && prop === 'fields') {
|
|
645
|
-
newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
|
|
646
|
-
} else {
|
|
647
|
-
newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
|
|
648
|
-
} // update text label prop and value
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
return layerConfigChangeUpdater(state, {
|
|
652
|
-
oldLayer: oldLayer,
|
|
653
|
-
newConfig: {
|
|
654
|
-
textLabel: newTextLabel
|
|
655
|
-
}
|
|
656
|
-
});
|
|
657
|
-
}
|
|
658
|
-
|
|
659
|
-
function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
|
|
660
|
-
var loadedLayer = (0, _visStateMerger.serializeLayer)(layer, schema);
|
|
661
|
-
return loadedLayer ? (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
|
|
662
|
-
allowEmptyColumn: true
|
|
663
|
-
}) : null;
|
|
664
|
-
}
|
|
665
|
-
/**
|
|
666
|
-
* Update layer config dataId
|
|
667
|
-
* @memberof visStateUpdaters
|
|
668
|
-
* @returns nextState
|
|
669
|
-
*/
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
function layerDataIdChangeUpdater(state, action) {
|
|
673
|
-
var oldLayer = action.oldLayer,
|
|
674
|
-
newConfig = action.newConfig;
|
|
675
|
-
var dataId = newConfig.dataId;
|
|
676
|
-
|
|
677
|
-
if (!oldLayer || !state.datasets[dataId]) {
|
|
678
|
-
return state;
|
|
679
|
-
}
|
|
680
|
-
|
|
681
|
-
var idx = state.layers.findIndex(function (l) {
|
|
682
|
-
return l.id === oldLayer.id;
|
|
683
|
-
});
|
|
684
|
-
var newLayer = oldLayer.updateLayerConfig({
|
|
685
|
-
dataId: dataId
|
|
686
|
-
}); // this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
|
|
687
|
-
|
|
688
|
-
if (newLayer.isValidToSave()) {
|
|
689
|
-
var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema); // if cant validate it with data create a new one
|
|
690
|
-
|
|
691
|
-
if (!validated) {
|
|
692
|
-
// @ts-expect-error TODO: checking oldLayer.type !== null
|
|
693
|
-
newLayer = new state.layerClasses[oldLayer.type]({
|
|
694
|
-
dataId: dataId,
|
|
695
|
-
id: oldLayer.id
|
|
696
|
-
});
|
|
697
|
-
} else {
|
|
698
|
-
newLayer = validated;
|
|
699
|
-
}
|
|
700
|
-
}
|
|
701
|
-
|
|
702
|
-
newLayer = newLayer.updateLayerConfig({
|
|
703
|
-
isVisible: oldLayer.config.isVisible,
|
|
704
|
-
isConfigActive: true
|
|
705
|
-
});
|
|
706
|
-
newLayer.updateLayerDomain(state.datasets);
|
|
707
|
-
|
|
708
|
-
var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
|
|
709
|
-
layerData = _calculateLayerData2.layerData,
|
|
710
|
-
layer = _calculateLayerData2.layer;
|
|
711
|
-
|
|
712
|
-
return updateStateWithLayerAndData(state, {
|
|
713
|
-
layerData: layerData,
|
|
714
|
-
layer: layer,
|
|
715
|
-
idx: idx
|
|
716
|
-
});
|
|
717
|
-
}
|
|
718
|
-
|
|
719
|
-
function setInitialLayerConfig(layer, datasets, layerClasses) {
|
|
720
|
-
var newLayer = layer;
|
|
721
|
-
|
|
722
|
-
if (!Object.keys(datasets).length) {
|
|
723
|
-
// no data is loaded
|
|
724
|
-
return layer;
|
|
725
|
-
}
|
|
726
|
-
|
|
727
|
-
if (!layer.config.dataId) {
|
|
728
|
-
// set layer dataId
|
|
729
|
-
newLayer = layer.updateLayerConfig({
|
|
730
|
-
dataId: Object.keys(datasets)[0]
|
|
731
|
-
});
|
|
732
|
-
}
|
|
733
|
-
|
|
734
|
-
var dataset = datasets[newLayer.config.dataId];
|
|
735
|
-
|
|
736
|
-
if (!dataset) {
|
|
737
|
-
return layer;
|
|
738
|
-
} // find defaut layer props
|
|
739
|
-
|
|
740
|
-
|
|
741
|
-
var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
|
|
742
|
-
props: []
|
|
743
|
-
}; // an array of possible props, use 1st one
|
|
744
|
-
|
|
745
|
-
var props = Array.isArray(result) ? result : result.props || [];
|
|
746
|
-
|
|
747
|
-
if (props.length) {
|
|
748
|
-
newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
|
|
749
|
-
label: newLayer.config.label,
|
|
750
|
-
dataId: newLayer.config.dataId,
|
|
751
|
-
isVisible: true,
|
|
752
|
-
isConfigActive: newLayer.config.isConfigActive
|
|
753
|
-
}));
|
|
754
|
-
return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
|
|
755
|
-
}
|
|
756
|
-
|
|
757
|
-
return newLayer;
|
|
758
|
-
}
|
|
759
|
-
/**
|
|
760
|
-
* Update layer type. Previews layer config will be copied if applicable.
|
|
761
|
-
* @memberof visStateUpdaters
|
|
762
|
-
* @public
|
|
763
|
-
*/
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
function layerTypeChangeUpdater(state, action) {
|
|
767
|
-
var oldLayer = action.oldLayer,
|
|
768
|
-
newType = action.newType;
|
|
769
|
-
|
|
770
|
-
if (!oldLayer) {
|
|
771
|
-
return state;
|
|
772
|
-
}
|
|
773
|
-
|
|
774
|
-
var oldId = oldLayer.id;
|
|
775
|
-
var idx = state.layers.findIndex(function (l) {
|
|
776
|
-
return l.id === oldId;
|
|
777
|
-
});
|
|
778
|
-
|
|
779
|
-
if (!state.layerClasses[newType]) {
|
|
780
|
-
_window.console.error("".concat(newType, " is not a valid layer type"));
|
|
781
|
-
|
|
782
|
-
return state;
|
|
783
|
-
}
|
|
784
|
-
|
|
785
|
-
var newLayer = new state.layerClasses[newType]({
|
|
786
|
-
// keep old layer lable and isConfigActive
|
|
787
|
-
label: oldLayer.config.label,
|
|
788
|
-
isConfigActive: oldLayer.config.isConfigActive,
|
|
789
|
-
dataId: oldLayer.config.dataId
|
|
790
|
-
});
|
|
791
|
-
|
|
792
|
-
if (!oldLayer.type) {
|
|
793
|
-
// if setting layer type on an empty layer
|
|
794
|
-
newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
|
|
795
|
-
} else {
|
|
796
|
-
// get a mint layer, with new id and type
|
|
797
|
-
// because deck.gl uses id to match between new and old layer.
|
|
798
|
-
// If type has changed but id is the same, it will break
|
|
799
|
-
newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings);
|
|
800
|
-
newLayer.updateLayerDomain(state.datasets);
|
|
801
|
-
}
|
|
802
|
-
|
|
803
|
-
var clicked = state.clicked,
|
|
804
|
-
hoverInfo = state.hoverInfo;
|
|
805
|
-
|
|
806
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
807
|
-
clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
|
|
808
|
-
hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
|
|
809
|
-
});
|
|
810
|
-
|
|
811
|
-
var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
|
|
812
|
-
layerData = _calculateLayerData3.layerData,
|
|
813
|
-
layer = _calculateLayerData3.layer;
|
|
814
|
-
|
|
815
|
-
newState = updateStateWithLayerAndData(newState, {
|
|
816
|
-
layerData: layerData,
|
|
817
|
-
layer: layer,
|
|
818
|
-
idx: idx
|
|
819
|
-
});
|
|
820
|
-
|
|
821
|
-
if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
|
|
822
|
-
newState = updateAnimationDomain(newState);
|
|
823
|
-
} // update splitMap layer id
|
|
824
|
-
|
|
825
|
-
|
|
826
|
-
if (state.splitMaps.length) {
|
|
827
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
828
|
-
splitMaps: newState.splitMaps.map(function (settings) {
|
|
829
|
-
var _settings$layers = settings.layers,
|
|
830
|
-
oldLayerMap = _settings$layers[oldId],
|
|
831
|
-
otherLayers = (0, _objectWithoutProperties2["default"])(_settings$layers, [oldId].map(_toPropertyKey));
|
|
832
|
-
return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
|
|
833
|
-
layers: _objectSpread(_objectSpread({}, otherLayers), {}, (0, _defineProperty2["default"])({}, layer.id, oldLayerMap))
|
|
834
|
-
}) : settings;
|
|
835
|
-
})
|
|
836
|
-
});
|
|
837
|
-
} // update layerOrder with new id
|
|
838
|
-
|
|
839
|
-
|
|
840
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
841
|
-
layerOrder: newState.layerOrder.map(function (layerId) {
|
|
842
|
-
return layerId === oldLayer.id ? newLayer.id : layerId;
|
|
843
|
-
})
|
|
844
|
-
});
|
|
845
|
-
return newState;
|
|
846
|
-
}
|
|
847
|
-
/**
|
|
848
|
-
* Update layer visual channel
|
|
849
|
-
* @memberof visStateUpdaters
|
|
850
|
-
* @returns {Object} nextState
|
|
851
|
-
* @public
|
|
852
|
-
*/
|
|
853
|
-
|
|
854
|
-
|
|
855
|
-
function layerVisualChannelChangeUpdater(state, action) {
|
|
856
|
-
var oldLayer = action.oldLayer,
|
|
857
|
-
newConfig = action.newConfig,
|
|
858
|
-
channel = action.channel;
|
|
859
|
-
|
|
860
|
-
if (!oldLayer.config.dataId) {
|
|
861
|
-
return state;
|
|
862
|
-
}
|
|
863
|
-
|
|
864
|
-
var dataset = state.datasets[oldLayer.config.dataId];
|
|
865
|
-
var idx = state.layers.findIndex(function (l) {
|
|
866
|
-
return l.id === oldLayer.id;
|
|
867
|
-
});
|
|
868
|
-
var newLayer = oldLayer.updateLayerConfig(newConfig);
|
|
869
|
-
newLayer.updateLayerVisualChannel(dataset, channel);
|
|
870
|
-
var oldLayerData = state.layerData[idx];
|
|
871
|
-
|
|
872
|
-
var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
|
|
873
|
-
layerData = _calculateLayerData4.layerData,
|
|
874
|
-
layer = _calculateLayerData4.layer;
|
|
875
|
-
|
|
876
|
-
return updateStateWithLayerAndData(state, {
|
|
877
|
-
layerData: layerData,
|
|
878
|
-
layer: layer,
|
|
879
|
-
idx: idx
|
|
880
|
-
});
|
|
881
|
-
}
|
|
882
|
-
/**
|
|
883
|
-
* Update layer `visConfig`
|
|
884
|
-
* @memberof visStateUpdaters
|
|
885
|
-
* @public
|
|
886
|
-
*/
|
|
887
|
-
|
|
888
|
-
|
|
889
|
-
function layerVisConfigChangeUpdater(state, action) {
|
|
890
|
-
var oldLayer = action.oldLayer;
|
|
891
|
-
var idx = state.layers.findIndex(function (l) {
|
|
892
|
-
return l.id === oldLayer.id;
|
|
893
|
-
});
|
|
894
|
-
var props = Object.keys(action.newVisConfig);
|
|
895
|
-
|
|
896
|
-
var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
|
|
897
|
-
|
|
898
|
-
var newLayer = oldLayer.updateLayerConfig({
|
|
899
|
-
visConfig: newVisConfig
|
|
900
|
-
});
|
|
901
|
-
|
|
902
|
-
if (newLayer.shouldCalculateLayerData(props)) {
|
|
903
|
-
var oldLayerData = state.layerData[idx];
|
|
904
|
-
|
|
905
|
-
var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData),
|
|
906
|
-
layerData = _calculateLayerData5.layerData,
|
|
907
|
-
layer = _calculateLayerData5.layer;
|
|
908
|
-
|
|
909
|
-
return updateStateWithLayerAndData(state, {
|
|
910
|
-
layerData: layerData,
|
|
911
|
-
layer: layer,
|
|
912
|
-
idx: idx
|
|
913
|
-
});
|
|
914
|
-
}
|
|
915
|
-
|
|
916
|
-
return updateStateWithLayerAndData(state, {
|
|
917
|
-
layer: newLayer,
|
|
918
|
-
idx: idx
|
|
919
|
-
});
|
|
920
|
-
}
|
|
921
|
-
/**
|
|
922
|
-
* Update filter property
|
|
923
|
-
* @memberof visStateUpdaters
|
|
924
|
-
* @public
|
|
925
|
-
*/
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
function setFilterAnimationTimeUpdater(state, action) {
|
|
929
|
-
return setFilterUpdater(state, action);
|
|
930
|
-
}
|
|
931
|
-
/**
|
|
932
|
-
* Update filter animation window
|
|
933
|
-
* @memberof visStateUpdaters
|
|
934
|
-
* @public
|
|
935
|
-
*/
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
function setFilterAnimationWindowUpdater(state, _ref2) {
|
|
939
|
-
var id = _ref2.id,
|
|
940
|
-
animationWindow = _ref2.animationWindow;
|
|
941
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
942
|
-
filters: state.filters.map(function (f) {
|
|
943
|
-
return f.id === id ? _objectSpread(_objectSpread({}, f), {}, {
|
|
944
|
-
animationWindow: animationWindow
|
|
945
|
-
}) : f;
|
|
946
|
-
})
|
|
947
|
-
});
|
|
948
|
-
}
|
|
949
|
-
/**
|
|
950
|
-
* Update filter property
|
|
951
|
-
* @memberof visStateUpdaters
|
|
952
|
-
* @public
|
|
953
|
-
*/
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
function setFilterUpdater(state, action) {
|
|
957
|
-
var _newFilter$layerId;
|
|
958
|
-
|
|
959
|
-
var idx = action.idx,
|
|
960
|
-
prop = action.prop,
|
|
961
|
-
value = action.value,
|
|
962
|
-
_action$valueIndex = action.valueIndex,
|
|
963
|
-
valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
|
|
964
|
-
var oldFilter = state.filters[idx];
|
|
965
|
-
|
|
966
|
-
if (!oldFilter) {
|
|
967
|
-
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
968
|
-
|
|
969
|
-
return state;
|
|
970
|
-
}
|
|
971
|
-
|
|
972
|
-
var newFilter = (0, _utils.set)([prop], value, oldFilter);
|
|
973
|
-
var newState = state;
|
|
974
|
-
var _newFilter = newFilter,
|
|
975
|
-
dataId = _newFilter.dataId; // Ensuring backward compatibility
|
|
976
|
-
|
|
977
|
-
var datasetIds = (0, _utils.toArray)(dataId);
|
|
978
|
-
|
|
979
|
-
switch (prop) {
|
|
980
|
-
// TODO: Next PR for UI if we update dataId, we need to consider two cases:
|
|
981
|
-
// 1. dataId is empty: create a default filter
|
|
982
|
-
// 2. Add a new dataset id
|
|
983
|
-
case _utils.FILTER_UPDATER_PROPS.dataId:
|
|
984
|
-
// if trying to update filter dataId. create an empty new filter
|
|
985
|
-
newFilter = (0, _utils.updateFilterDataId)(dataId);
|
|
986
|
-
break;
|
|
987
|
-
|
|
988
|
-
case _utils.FILTER_UPDATER_PROPS.name:
|
|
989
|
-
// we are supporting the current functionality
|
|
990
|
-
// TODO: Next PR for UI filter name will only update filter name but it won't have side effects
|
|
991
|
-
// we are gonna use pair of datasets and fieldIdx to update the filter
|
|
992
|
-
var datasetId = newFilter.dataId[valueIndex];
|
|
993
|
-
|
|
994
|
-
var _applyFilterFieldName = (0, _utils.applyFilterFieldName)(newFilter, state.datasets[datasetId], value, valueIndex, {
|
|
995
|
-
mergeDomain: false
|
|
996
|
-
}),
|
|
997
|
-
updatedFilter = _applyFilterFieldName.filter,
|
|
998
|
-
newDataset = _applyFilterFieldName.dataset;
|
|
999
|
-
|
|
1000
|
-
if (!updatedFilter) {
|
|
1001
|
-
return state;
|
|
1002
|
-
}
|
|
1003
|
-
|
|
1004
|
-
newFilter = updatedFilter;
|
|
1005
|
-
|
|
1006
|
-
if (newFilter.gpu) {
|
|
1007
|
-
newFilter = (0, _table.setFilterGpuMode)(newFilter, state.filters);
|
|
1008
|
-
newFilter = (0, _table.assignGpuChannel)(newFilter, state.filters);
|
|
1009
|
-
}
|
|
1010
|
-
|
|
1011
|
-
newState = (0, _utils.set)(['datasets', datasetId], newDataset, state); // only filter the current dataset
|
|
1012
|
-
|
|
1013
|
-
break;
|
|
1014
|
-
|
|
1015
|
-
case _utils.FILTER_UPDATER_PROPS.layerId:
|
|
1016
|
-
// We need to update only datasetId/s if we have added/removed layers
|
|
1017
|
-
// - check for layerId changes (XOR works because of string values)
|
|
1018
|
-
// if no differences between layerIds, don't do any filtering
|
|
1019
|
-
// @ts-ignore
|
|
1020
|
-
var layerIdDifference = (0, _lodash4["default"])(newFilter.layerId, oldFilter.layerId);
|
|
1021
|
-
var layerDataIds = (0, _lodash2["default"])(layerIdDifference.map(function (lid) {
|
|
1022
|
-
return (0, _lodash3["default"])(state.layers.find(function (l) {
|
|
1023
|
-
return l.id === lid;
|
|
1024
|
-
}), ['config', 'dataId']);
|
|
1025
|
-
}).filter(function (d) {
|
|
1026
|
-
return d;
|
|
1027
|
-
})); // only filter datasetsIds
|
|
1028
|
-
|
|
1029
|
-
datasetIds = layerDataIds; // Update newFilter dataIds
|
|
1030
|
-
|
|
1031
|
-
var newDataIds = (0, _lodash2["default"])((_newFilter$layerId = newFilter.layerId) === null || _newFilter$layerId === void 0 ? void 0 : _newFilter$layerId.map(function (lid) {
|
|
1032
|
-
return (0, _lodash3["default"])(state.layers.find(function (l) {
|
|
1033
|
-
return l.id === lid;
|
|
1034
|
-
}), ['config', 'dataId']);
|
|
1035
|
-
}).filter(function (d) {
|
|
1036
|
-
return d;
|
|
1037
|
-
}));
|
|
1038
|
-
newFilter = _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
1039
|
-
dataId: newDataIds
|
|
1040
|
-
});
|
|
1041
|
-
break;
|
|
1042
|
-
|
|
1043
|
-
default:
|
|
1044
|
-
break;
|
|
1045
|
-
}
|
|
1046
|
-
|
|
1047
|
-
var enlargedFilter = state.filters.find(function (f) {
|
|
1048
|
-
return f.view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
1049
|
-
});
|
|
1050
|
-
|
|
1051
|
-
if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
|
|
1052
|
-
// there should be only one enlarged filter
|
|
1053
|
-
newFilter.view = _constants.FILTER_VIEW_TYPES.side;
|
|
1054
|
-
} // save new filters to newState
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
newState = (0, _utils.set)(['filters', idx], newFilter, newState); // if we are currently setting a prop that only requires to filter the current
|
|
1058
|
-
// dataset we will pass only the current dataset to applyFiltersToDatasets and
|
|
1059
|
-
// updateAllLayerDomainData otherwise we pass the all list of datasets as defined in dataId
|
|
1060
|
-
|
|
1061
|
-
var datasetIdsToFilter = _utils.LIMITED_FILTER_EFFECT_PROPS[prop] ? [datasetIds[valueIndex]] : datasetIds; // filter data
|
|
1062
|
-
|
|
1063
|
-
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(datasetIdsToFilter, newState.datasets, newState.filters, newState.layers);
|
|
1064
|
-
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState); // dataId is an array
|
|
1065
|
-
// pass only the dataset we need to update
|
|
1066
|
-
|
|
1067
|
-
newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
|
|
1068
|
-
return newState;
|
|
1069
|
-
}
|
|
1070
|
-
/**
|
|
1071
|
-
* Set the property of a filter plot
|
|
1072
|
-
* @memberof visStateUpdaters
|
|
1073
|
-
* @public
|
|
1074
|
-
*/
|
|
1075
|
-
|
|
1076
|
-
|
|
1077
|
-
var setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref3) {
|
|
1078
|
-
var idx = _ref3.idx,
|
|
1079
|
-
newProp = _ref3.newProp,
|
|
1080
|
-
_ref3$valueIndex = _ref3.valueIndex,
|
|
1081
|
-
valueIndex = _ref3$valueIndex === void 0 ? 0 : _ref3$valueIndex;
|
|
1082
|
-
|
|
1083
|
-
var newFilter = _objectSpread(_objectSpread({}, state.filters[idx]), newProp);
|
|
1084
|
-
|
|
1085
|
-
var prop = Object.keys(newProp)[0];
|
|
1086
|
-
|
|
1087
|
-
if (prop === 'yAxis') {
|
|
1088
|
-
var plotType = (0, _utils.getDefaultFilterPlotType)(newFilter); // TODO: plot is not supported in multi dataset filter for now
|
|
1089
|
-
|
|
1090
|
-
if (plotType) {
|
|
1091
|
-
newFilter = _objectSpread(_objectSpread(_objectSpread({}, newFilter), (0, _utils.getFilterPlot)(_objectSpread(_objectSpread({}, newFilter), {}, {
|
|
1092
|
-
plotType: plotType
|
|
1093
|
-
}), state.datasets[newFilter.dataId[valueIndex]])), {}, {
|
|
1094
|
-
plotType: plotType
|
|
1095
|
-
});
|
|
1096
|
-
}
|
|
1097
|
-
}
|
|
1098
|
-
|
|
1099
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1100
|
-
filters: state.filters.map(function (f, i) {
|
|
1101
|
-
return i === idx ? newFilter : f;
|
|
1102
|
-
})
|
|
1103
|
-
});
|
|
1104
|
-
};
|
|
1105
|
-
/**
|
|
1106
|
-
* Add a new filter
|
|
1107
|
-
* @memberof visStateUpdaters
|
|
1108
|
-
* @public
|
|
1109
|
-
*/
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
exports.setFilterPlotUpdater = setFilterPlotUpdater;
|
|
1113
|
-
|
|
1114
|
-
var addFilterUpdater = function addFilterUpdater(state, action) {
|
|
1115
|
-
return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
|
|
1116
|
-
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)({
|
|
1117
|
-
dataId: action.dataId,
|
|
1118
|
-
id: action.id
|
|
1119
|
-
})])
|
|
1120
|
-
});
|
|
1121
|
-
};
|
|
1122
|
-
/**
|
|
1123
|
-
* Set layer color palette ui state
|
|
1124
|
-
* @memberof visStateUpdaters
|
|
1125
|
-
*/
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
exports.addFilterUpdater = addFilterUpdater;
|
|
1129
|
-
|
|
1130
|
-
var layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref4) {
|
|
1131
|
-
var oldLayer = _ref4.oldLayer,
|
|
1132
|
-
prop = _ref4.prop,
|
|
1133
|
-
newConfig = _ref4.newConfig;
|
|
1134
|
-
var oldVixConfig = oldLayer.config.visConfig[prop];
|
|
1135
|
-
var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
|
|
1136
|
-
var newVisConfig = newLayer.config.visConfig[prop];
|
|
1137
|
-
|
|
1138
|
-
if (oldVixConfig !== newVisConfig) {
|
|
1139
|
-
return layerVisConfigChangeUpdater(state, {
|
|
1140
|
-
oldLayer: oldLayer,
|
|
1141
|
-
newVisConfig: (0, _defineProperty2["default"])({}, prop, newVisConfig)
|
|
1142
|
-
});
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1146
|
-
layers: state.layers.map(function (l) {
|
|
1147
|
-
return l.id === oldLayer.id ? newLayer : l;
|
|
1148
|
-
})
|
|
1149
|
-
});
|
|
1150
|
-
};
|
|
1151
|
-
/**
|
|
1152
|
-
* Start and end filter animation
|
|
1153
|
-
* @memberof visStateUpdaters
|
|
1154
|
-
* @public
|
|
1155
|
-
*/
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
exports.layerColorUIChangeUpdater = layerColorUIChangeUpdater;
|
|
1159
|
-
|
|
1160
|
-
var toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
|
|
1161
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1162
|
-
filters: state.filters.map(function (f, i) {
|
|
1163
|
-
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1164
|
-
isAnimating: !f.isAnimating
|
|
1165
|
-
}) : f;
|
|
1166
|
-
})
|
|
1167
|
-
});
|
|
1168
|
-
};
|
|
1169
|
-
/**
|
|
1170
|
-
* @memberof visStateUpdaters
|
|
1171
|
-
* @public
|
|
1172
|
-
*/
|
|
1173
|
-
|
|
1174
|
-
|
|
1175
|
-
exports.toggleFilterAnimationUpdater = toggleFilterAnimationUpdater;
|
|
1176
|
-
|
|
1177
|
-
var toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
|
|
1178
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1179
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1180
|
-
isAnimating: !state.animationConfig.isAnimating
|
|
1181
|
-
})
|
|
1182
|
-
});
|
|
1183
|
-
};
|
|
1184
|
-
/**
|
|
1185
|
-
* Hide and show layer animation control
|
|
1186
|
-
* @memberof visStateUpdaters
|
|
1187
|
-
* @public
|
|
1188
|
-
*/
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
exports.toggleLayerAnimationUpdater = toggleLayerAnimationUpdater;
|
|
1192
|
-
|
|
1193
|
-
var toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state, action) {
|
|
1194
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1195
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1196
|
-
hideControl: !state.animationConfig.hideControl
|
|
1197
|
-
})
|
|
1198
|
-
});
|
|
1199
|
-
};
|
|
1200
|
-
/**
|
|
1201
|
-
* Change filter animation speed
|
|
1202
|
-
* @memberof visStateUpdaters
|
|
1203
|
-
* @public
|
|
1204
|
-
*/
|
|
1205
|
-
|
|
1206
|
-
|
|
1207
|
-
exports.toggleLayerAnimationControlUpdater = toggleLayerAnimationControlUpdater;
|
|
1208
|
-
|
|
1209
|
-
var updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
|
|
1210
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1211
|
-
filters: state.filters.map(function (f, i) {
|
|
1212
|
-
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1213
|
-
speed: action.speed
|
|
1214
|
-
}) : f;
|
|
1215
|
-
})
|
|
1216
|
-
});
|
|
1217
|
-
};
|
|
1218
|
-
/**
|
|
1219
|
-
* Reset animation config current time to a specified value
|
|
1220
|
-
* @memberof visStateUpdaters
|
|
1221
|
-
* @public
|
|
1222
|
-
*
|
|
1223
|
-
*/
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
exports.updateFilterAnimationSpeedUpdater = updateFilterAnimationSpeedUpdater;
|
|
1227
|
-
|
|
1228
|
-
var setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref5) {
|
|
1229
|
-
var value = _ref5.value;
|
|
1230
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1231
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1232
|
-
currentTime: value
|
|
1233
|
-
})
|
|
1234
|
-
});
|
|
1235
|
-
};
|
|
1236
|
-
/**
|
|
1237
|
-
* Update animation speed with the vertical speed slider
|
|
1238
|
-
* @memberof visStateUpdaters
|
|
1239
|
-
* @public
|
|
1240
|
-
*
|
|
1241
|
-
*/
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
exports.setLayerAnimationTimeUpdater = setLayerAnimationTimeUpdater;
|
|
1245
|
-
|
|
1246
|
-
var updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref6) {
|
|
1247
|
-
var speed = _ref6.speed;
|
|
1248
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1249
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1250
|
-
speed: speed
|
|
1251
|
-
})
|
|
1252
|
-
});
|
|
1253
|
-
};
|
|
1254
|
-
/**
|
|
1255
|
-
* Show larger time filter at bottom for time playback (apply to time filter only)
|
|
1256
|
-
* @memberof visStateUpdaters
|
|
1257
|
-
* @public
|
|
1258
|
-
*/
|
|
1259
|
-
|
|
1260
|
-
|
|
1261
|
-
exports.updateLayerAnimationSpeedUpdater = updateLayerAnimationSpeedUpdater;
|
|
1262
|
-
|
|
1263
|
-
var setFilterViewUpdater = function setFilterViewUpdater(state, action) {
|
|
1264
|
-
var view = action.view,
|
|
1265
|
-
idx = action.idx;
|
|
1266
|
-
var shouldResetOtherFiltersView = view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
1267
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1268
|
-
filters: state.filters.map(function (f, i) {
|
|
1269
|
-
return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1270
|
-
view: view
|
|
1271
|
-
}) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1272
|
-
view: _constants.FILTER_VIEW_TYPES.side
|
|
1273
|
-
}) : f;
|
|
1274
|
-
})
|
|
1275
|
-
});
|
|
1276
|
-
};
|
|
1277
|
-
/**
|
|
1278
|
-
* Toggles filter feature visibility
|
|
1279
|
-
* @memberof visStateUpdaters
|
|
1280
|
-
*/
|
|
1281
|
-
|
|
1282
|
-
|
|
1283
|
-
exports.setFilterViewUpdater = setFilterViewUpdater;
|
|
1284
|
-
|
|
1285
|
-
var toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
|
|
1286
|
-
var filter = state.filters[action.idx];
|
|
1287
|
-
var isVisible = (0, _lodash3["default"])(filter, ['value', 'properties', 'isVisible']);
|
|
1288
|
-
var newState = setFilterUpdater(state, {
|
|
1289
|
-
idx: action.idx,
|
|
1290
|
-
prop: 'enabled',
|
|
1291
|
-
value: !isVisible
|
|
1292
|
-
});
|
|
1293
|
-
newState = setFilterUpdater(newState, {
|
|
1294
|
-
idx: action.idx,
|
|
1295
|
-
prop: 'value',
|
|
1296
|
-
value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
|
|
1297
|
-
isVisible: !isVisible
|
|
1298
|
-
})
|
|
1299
|
-
});
|
|
1300
|
-
return newState;
|
|
1301
|
-
};
|
|
1302
|
-
/**
|
|
1303
|
-
* Remove a filter
|
|
1304
|
-
* @memberof visStateUpdaters
|
|
1305
|
-
* @public
|
|
1306
|
-
*/
|
|
1307
|
-
|
|
1308
|
-
|
|
1309
|
-
exports.toggleFilterFeatureUpdater = toggleFilterFeatureUpdater;
|
|
1310
|
-
|
|
1311
|
-
var removeFilterUpdater = function removeFilterUpdater(state, action) {
|
|
1312
|
-
var idx = action.idx;
|
|
1313
|
-
var _state$filters$idx = state.filters[idx],
|
|
1314
|
-
dataId = _state$filters$idx.dataId,
|
|
1315
|
-
id = _state$filters$idx.id;
|
|
1316
|
-
var newFilters = [].concat((0, _toConsumableArray2["default"])(state.filters.slice(0, idx)), (0, _toConsumableArray2["default"])(state.filters.slice(idx + 1, state.filters.length)));
|
|
1317
|
-
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(dataId, state.datasets, newFilters, state.layers);
|
|
1318
|
-
var newEditor = (0, _utils.getFilterIdInFeature)(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
1319
|
-
selectedFeature: null
|
|
1320
|
-
}) : state.editor;
|
|
1321
|
-
var newState = (0, _utils.set)(['filters'], newFilters, state);
|
|
1322
|
-
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
1323
|
-
newState = (0, _utils.set)(['editor'], newEditor, newState);
|
|
1324
|
-
return updateAllLayerDomainData(newState, dataId, undefined);
|
|
1325
|
-
};
|
|
1326
|
-
/**
|
|
1327
|
-
* Add a new layer
|
|
1328
|
-
* @memberof visStateUpdaters
|
|
1329
|
-
* @public
|
|
1330
|
-
*/
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
exports.removeFilterUpdater = removeFilterUpdater;
|
|
1334
|
-
|
|
1335
|
-
var addLayerUpdater = function addLayerUpdater(state, action) {
|
|
1336
|
-
var newLayer;
|
|
1337
|
-
var newLayerData;
|
|
1338
|
-
|
|
1339
|
-
if (action.config) {
|
|
1340
|
-
newLayer = (0, _visStateMerger.createLayerFromConfig)(state, action.config);
|
|
1341
|
-
|
|
1342
|
-
if (!newLayer) {
|
|
1343
|
-
_window.console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
|
|
1344
|
-
|
|
1345
|
-
return state;
|
|
1346
|
-
}
|
|
1347
|
-
|
|
1348
|
-
var result = (0, _layerUtils.calculateLayerData)(newLayer, state);
|
|
1349
|
-
newLayer = result.layer;
|
|
1350
|
-
newLayerData = result.layerData;
|
|
1351
|
-
} else {
|
|
1352
|
-
var _action$datasetId;
|
|
1353
|
-
|
|
1354
|
-
// create an empty layer with a specific dataset or a default one
|
|
1355
|
-
var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
|
|
1356
|
-
newLayer = new _layers.Layer({
|
|
1357
|
-
isVisible: true,
|
|
1358
|
-
isConfigActive: true,
|
|
1359
|
-
dataId: defaultDataset
|
|
1360
|
-
});
|
|
1361
|
-
newLayerData = {};
|
|
1362
|
-
}
|
|
1363
|
-
|
|
1364
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1365
|
-
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
|
|
1366
|
-
layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
|
|
1367
|
-
// add new layer at the top
|
|
1368
|
-
layerOrder: [newLayer.id].concat((0, _toConsumableArray2["default"])(state.layerOrder)),
|
|
1369
|
-
splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
|
|
1370
|
-
});
|
|
1371
|
-
|
|
1372
|
-
if (newLayer.config.animation.enabled) {
|
|
1373
|
-
newState = updateAnimationDomain(newState);
|
|
1374
|
-
}
|
|
1375
|
-
|
|
1376
|
-
return newState;
|
|
1377
|
-
};
|
|
1378
|
-
/**
|
|
1379
|
-
* remove layer
|
|
1380
|
-
* @memberof visStateUpdaters
|
|
1381
|
-
* @public
|
|
1382
|
-
*/
|
|
1383
|
-
|
|
1384
|
-
|
|
1385
|
-
exports.addLayerUpdater = addLayerUpdater;
|
|
1386
|
-
|
|
1387
|
-
function removeLayerUpdater(state, _ref7) {
|
|
1388
|
-
var id = _ref7.id;
|
|
1389
|
-
var idx = Number.isFinite(id) ? // support older API, remove layer by idx
|
|
1390
|
-
Number(id) : state.layers.findIndex(function (l) {
|
|
1391
|
-
return l.id === id;
|
|
1392
|
-
});
|
|
1393
|
-
|
|
1394
|
-
if (idx < 0 || idx >= state.layers.length) {
|
|
1395
|
-
// invalid index
|
|
1396
|
-
_window.console.warn("can not remove layer with invalid id|idx ".concat(id));
|
|
1397
|
-
|
|
1398
|
-
return state;
|
|
1399
|
-
}
|
|
1400
|
-
|
|
1401
|
-
var layers = state.layers,
|
|
1402
|
-
layerData = state.layerData,
|
|
1403
|
-
layerOrder = state.layerOrder,
|
|
1404
|
-
clicked = state.clicked,
|
|
1405
|
-
hoverInfo = state.hoverInfo;
|
|
1406
|
-
var layerToRemove = layers[idx];
|
|
1407
|
-
|
|
1408
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1409
|
-
layers: (0, _composerHelpers.filterOutById)(layerToRemove.id)(layers),
|
|
1410
|
-
layerData: (0, _composerHelpers.removeElementAtIndex)(idx)(layerData),
|
|
1411
|
-
layerOrder: layerOrder.filter(function (layerId) {
|
|
1412
|
-
return layerId !== layerToRemove.id;
|
|
1413
|
-
}),
|
|
1414
|
-
clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
|
|
1415
|
-
hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
|
|
1416
|
-
splitMaps: (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove) // TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
|
|
1417
|
-
|
|
1418
|
-
});
|
|
1419
|
-
|
|
1420
|
-
return updateAnimationDomain(newState);
|
|
1421
|
-
}
|
|
1422
|
-
/**
|
|
1423
|
-
* Reorder layer
|
|
1424
|
-
* @memberof visStateUpdaters
|
|
1425
|
-
* @public
|
|
1426
|
-
*/
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
var reorderLayerUpdater = function reorderLayerUpdater(state, _ref8) {
|
|
1430
|
-
var order = _ref8.order;
|
|
1431
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1432
|
-
layerOrder: order
|
|
1433
|
-
});
|
|
1434
|
-
};
|
|
1435
|
-
/**
|
|
1436
|
-
* duplicate layer
|
|
1437
|
-
* @memberof visStateUpdaters
|
|
1438
|
-
* @public
|
|
1439
|
-
*/
|
|
1440
|
-
|
|
1441
|
-
|
|
1442
|
-
exports.reorderLayerUpdater = reorderLayerUpdater;
|
|
1443
|
-
|
|
1444
|
-
var duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref9) {
|
|
1445
|
-
var id = _ref9.id;
|
|
1446
|
-
var idx = Number.isFinite(id) ? // support older API, remove layer by idx
|
|
1447
|
-
Number(id) : state.layers.findIndex(function (l) {
|
|
1448
|
-
return l.id === id;
|
|
1449
|
-
});
|
|
1450
|
-
|
|
1451
|
-
if (idx < 0 || !state.layers[idx]) {
|
|
1452
|
-
_window.console.warn("layer ".concat(idx, " not found in layerOrder"));
|
|
1453
|
-
|
|
1454
|
-
return state;
|
|
1455
|
-
}
|
|
1456
|
-
|
|
1457
|
-
var layers = state.layers;
|
|
1458
|
-
var original = layers[idx];
|
|
1459
|
-
var originalLayerOrderIdx = state.layerOrder.findIndex(function (lid) {
|
|
1460
|
-
return lid === original.id;
|
|
1461
|
-
});
|
|
1462
|
-
var newLabel = "Copy of ".concat(original.config.label);
|
|
1463
|
-
var postfix = 0; // eslint-disable-next-line no-loop-func
|
|
1464
|
-
|
|
1465
|
-
while (layers.find(function (l) {
|
|
1466
|
-
return l.config.label === newLabel;
|
|
1467
|
-
})) {
|
|
1468
|
-
newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
|
|
1469
|
-
} // collect layer config from original
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
var loadedLayer = (0, _visStateMerger.serializeLayer)(original, state.schema); // assign new id and label to copied layer
|
|
1473
|
-
|
|
1474
|
-
if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
|
|
1475
|
-
return state;
|
|
1476
|
-
}
|
|
1477
|
-
|
|
1478
|
-
loadedLayer.config.label = newLabel;
|
|
1479
|
-
loadedLayer.id = (0, _utils.generateHashId)(_layers.LAYER_ID_LENGTH); // add layer to state
|
|
1480
|
-
|
|
1481
|
-
var nextState = addLayerUpdater(state, {
|
|
1482
|
-
config: loadedLayer
|
|
1483
|
-
}); // retrieve newly created layer
|
|
1484
|
-
|
|
1485
|
-
var newLayer = nextState.layers[nextState.layers.length - 1]; // update layer order with newLyaer.id
|
|
1486
|
-
|
|
1487
|
-
var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
|
|
1488
|
-
nextState = reorderLayerUpdater(nextState, {
|
|
1489
|
-
order: newLayerOrder
|
|
1490
|
-
});
|
|
1491
|
-
return updateAnimationDomain(nextState);
|
|
1492
|
-
};
|
|
1493
|
-
/**
|
|
1494
|
-
* Add a new effect
|
|
1495
|
-
* @memberof visStateUpdaters
|
|
1496
|
-
* @public
|
|
1497
|
-
*/
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
exports.duplicateLayerUpdater = duplicateLayerUpdater;
|
|
1501
|
-
|
|
1502
|
-
var addEffectUpdater = function addEffectUpdater(state, action) {
|
|
1503
|
-
var newEffect = (0, _effects.createEffect)(action.config); // collapse configurators for other effects
|
|
1504
|
-
|
|
1505
|
-
state.effects.forEach(function (effect) {
|
|
1506
|
-
return effect.setProps({
|
|
1507
|
-
isConfigActive: false
|
|
1508
|
-
});
|
|
1509
|
-
});
|
|
1510
|
-
var effects = [].concat((0, _toConsumableArray2["default"])(state.effects), [newEffect]);
|
|
1511
|
-
var effectOrder = (0, _utils.fixEffectOrder)(effects, [newEffect.id].concat((0, _toConsumableArray2["default"])(state.effectOrder)));
|
|
1512
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1513
|
-
effects: effects,
|
|
1514
|
-
effectOrder: effectOrder
|
|
1515
|
-
});
|
|
1516
|
-
};
|
|
1517
|
-
/**
|
|
1518
|
-
* remove effect
|
|
1519
|
-
* @memberof visStateUpdaters
|
|
1520
|
-
* @public
|
|
1521
|
-
*/
|
|
1522
|
-
|
|
1523
|
-
|
|
1524
|
-
exports.addEffectUpdater = addEffectUpdater;
|
|
1525
|
-
|
|
1526
|
-
var removeEffectUpdater = function removeEffectUpdater(state, _ref10) {
|
|
1527
|
-
var id = _ref10.id;
|
|
1528
|
-
var idx = state.effects.findIndex(function (l) {
|
|
1529
|
-
return l.id === id;
|
|
1530
|
-
});
|
|
1531
|
-
|
|
1532
|
-
if (idx < 0 || idx >= state.effects.length) {
|
|
1533
|
-
_window.console.warn("can not remove effect with invalid id ".concat(id));
|
|
1534
|
-
|
|
1535
|
-
return state;
|
|
1536
|
-
}
|
|
1537
|
-
|
|
1538
|
-
var effects = state.effects,
|
|
1539
|
-
effectOrder = state.effectOrder;
|
|
1540
|
-
var effectToRemove = effects[idx];
|
|
1541
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1542
|
-
// @ts-expect-error fixed in ts
|
|
1543
|
-
effects: (0, _composerHelpers.filterOutById)(effectToRemove.id)(effects),
|
|
1544
|
-
effectOrder: effectOrder.filter(function (effectId) {
|
|
1545
|
-
return effectId !== effectToRemove.id;
|
|
1546
|
-
})
|
|
1547
|
-
});
|
|
1548
|
-
};
|
|
1549
|
-
/**
|
|
1550
|
-
* Reorder effect
|
|
1551
|
-
* @memberof visStateUpdaters
|
|
1552
|
-
* @public
|
|
1553
|
-
*/
|
|
1554
|
-
|
|
1555
|
-
|
|
1556
|
-
exports.removeEffectUpdater = removeEffectUpdater;
|
|
1557
|
-
|
|
1558
|
-
var reorderEffectUpdater = function reorderEffectUpdater(state, _ref11) {
|
|
1559
|
-
var order = _ref11.order;
|
|
1560
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1561
|
-
effectOrder: (0, _utils.fixEffectOrder)(state.effects, (0, _toConsumableArray2["default"])(order))
|
|
1562
|
-
});
|
|
1563
|
-
};
|
|
1564
|
-
/**
|
|
1565
|
-
* Update effect
|
|
1566
|
-
* @memberof visStateUpdaters
|
|
1567
|
-
* @public
|
|
1568
|
-
*/
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
exports.reorderEffectUpdater = reorderEffectUpdater;
|
|
1572
|
-
|
|
1573
|
-
var updateEffectUpdater = function updateEffectUpdater(state, _ref12) {
|
|
1574
|
-
var id = _ref12.id,
|
|
1575
|
-
props = _ref12.props;
|
|
1576
|
-
var idx = state.effects.findIndex(function (l) {
|
|
1577
|
-
return l.id === id;
|
|
1578
|
-
});
|
|
1579
|
-
|
|
1580
|
-
if (idx < 0 || idx >= state.effects.length) {
|
|
1581
|
-
_window.console.warn("can not update effect with invalid id ".concat(id));
|
|
1582
|
-
|
|
1583
|
-
return state;
|
|
1584
|
-
}
|
|
1585
|
-
|
|
1586
|
-
var effectOrder = state.effectOrder;
|
|
1587
|
-
|
|
1588
|
-
if (props.id !== undefined && props.id !== id) {
|
|
1589
|
-
var idx2 = state.effects.findIndex(function (l) {
|
|
1590
|
-
return l.id === props.id;
|
|
1591
|
-
});
|
|
1592
|
-
|
|
1593
|
-
if (idx2 >= 0) {
|
|
1594
|
-
_window.console.warn("can not update effect with existing effect id ".concat(id));
|
|
1595
|
-
|
|
1596
|
-
return state;
|
|
1597
|
-
}
|
|
1598
|
-
|
|
1599
|
-
effectOrder = effectOrder.map(function (effectOrderId) {
|
|
1600
|
-
return effectOrderId === id ? props.id : effectOrderId;
|
|
1601
|
-
});
|
|
1602
|
-
}
|
|
1603
|
-
|
|
1604
|
-
var newEffects = (0, _toConsumableArray2["default"])(state.effects);
|
|
1605
|
-
newEffects[idx].setProps(props);
|
|
1606
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1607
|
-
effects: newEffects,
|
|
1608
|
-
effectOrder: effectOrder
|
|
1609
|
-
});
|
|
1610
|
-
};
|
|
1611
|
-
/**
|
|
1612
|
-
* Remove a dataset and all layers, filters, tooltip configs that based on it
|
|
1613
|
-
* @memberof visStateUpdaters
|
|
1614
|
-
* @public
|
|
1615
|
-
*/
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
exports.updateEffectUpdater = updateEffectUpdater;
|
|
1619
|
-
|
|
1620
|
-
function removeDatasetUpdater(state, action) {
|
|
1621
|
-
// extract dataset key
|
|
1622
|
-
var datasetKey = action.dataId;
|
|
1623
|
-
var datasets = state.datasets; // check if dataset is present
|
|
1624
|
-
|
|
1625
|
-
if (!datasets[datasetKey]) {
|
|
1626
|
-
return state;
|
|
1627
|
-
}
|
|
1628
|
-
/* eslint-disable no-unused-vars */
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
var layers = state.layers,
|
|
1632
|
-
_state$datasets = state.datasets,
|
|
1633
|
-
dataset = _state$datasets[datasetKey],
|
|
1634
|
-
newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
|
|
1635
|
-
/* eslint-enable no-unused-vars */
|
|
1636
|
-
|
|
1637
|
-
var layersToRemove = layers.filter(function (l) {
|
|
1638
|
-
return l.config.dataId === datasetKey;
|
|
1639
|
-
}).map(function (l) {
|
|
1640
|
-
return l.id;
|
|
1641
|
-
}); // remove layers and datasets
|
|
1642
|
-
|
|
1643
|
-
var newState = layersToRemove.reduce(function (accu, id) {
|
|
1644
|
-
return removeLayerUpdater(accu, {
|
|
1645
|
-
id: id
|
|
1646
|
-
});
|
|
1647
|
-
}, _objectSpread(_objectSpread({}, state), {}, {
|
|
1648
|
-
datasets: newDatasets
|
|
1649
|
-
})); // remove filters
|
|
1650
|
-
|
|
1651
|
-
var filters = newState.filters.filter(function (filter) {
|
|
1652
|
-
return !filter.dataId.includes(datasetKey);
|
|
1653
|
-
});
|
|
1654
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
1655
|
-
filters: filters
|
|
1656
|
-
});
|
|
1657
|
-
return removeDatasetFromInteractionConfig(newState, {
|
|
1658
|
-
dataId: datasetKey
|
|
1659
|
-
});
|
|
1660
|
-
}
|
|
1661
|
-
|
|
1662
|
-
function removeDatasetFromInteractionConfig(state, _ref13) {
|
|
1663
|
-
var dataId = _ref13.dataId;
|
|
1664
|
-
var interactionConfig = state.interactionConfig;
|
|
1665
|
-
var _interactionConfig = interactionConfig,
|
|
1666
|
-
tooltip = _interactionConfig.tooltip;
|
|
1667
|
-
|
|
1668
|
-
if (tooltip) {
|
|
1669
|
-
var config = tooltip.config;
|
|
1670
|
-
/* eslint-disable no-unused-vars */
|
|
1671
|
-
|
|
1672
|
-
var _config$fieldsToShow = config.fieldsToShow,
|
|
1673
|
-
fields = _config$fieldsToShow[dataId],
|
|
1674
|
-
fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [dataId].map(_toPropertyKey));
|
|
1675
|
-
/* eslint-enable no-unused-vars */
|
|
1676
|
-
|
|
1677
|
-
interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
1678
|
-
tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
|
|
1679
|
-
config: _objectSpread(_objectSpread({}, config), {}, {
|
|
1680
|
-
fieldsToShow: fieldsToShow
|
|
1681
|
-
})
|
|
1682
|
-
})
|
|
1683
|
-
});
|
|
1684
|
-
}
|
|
1685
|
-
|
|
1686
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1687
|
-
interactionConfig: interactionConfig
|
|
1688
|
-
});
|
|
1689
|
-
}
|
|
1690
|
-
/**
|
|
1691
|
-
* update layer blending mode
|
|
1692
|
-
* @memberof visStateUpdaters
|
|
1693
|
-
* @public
|
|
1694
|
-
*/
|
|
1695
|
-
|
|
1696
|
-
|
|
1697
|
-
var updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
|
|
1698
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1699
|
-
layerBlending: action.mode
|
|
1700
|
-
});
|
|
1701
|
-
};
|
|
1702
|
-
/**
|
|
1703
|
-
* update overlay blending mode
|
|
1704
|
-
* @memberof visStateUpdaters
|
|
1705
|
-
* @public
|
|
1706
|
-
*/
|
|
1707
|
-
|
|
1708
|
-
|
|
1709
|
-
exports.updateLayerBlendingUpdater = updateLayerBlendingUpdater;
|
|
1710
|
-
|
|
1711
|
-
var updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
|
|
1712
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1713
|
-
overlayBlending: action.mode
|
|
1714
|
-
});
|
|
1715
|
-
};
|
|
1716
|
-
/**
|
|
1717
|
-
* Display dataset table in a modal
|
|
1718
|
-
* @memberof visStateUpdaters
|
|
1719
|
-
* @public
|
|
1720
|
-
*/
|
|
1721
|
-
|
|
1722
|
-
|
|
1723
|
-
exports.updateOverlayBlendingUpdater = updateOverlayBlendingUpdater;
|
|
1724
|
-
|
|
1725
|
-
var showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
|
|
1726
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1727
|
-
editingDataset: action.dataId
|
|
1728
|
-
});
|
|
1729
|
-
};
|
|
1730
|
-
/**
|
|
1731
|
-
* Add custom color for datasets and layers
|
|
1732
|
-
* @memberof visStateUpdaters
|
|
1733
|
-
* @public
|
|
1734
|
-
*/
|
|
1735
|
-
|
|
1736
|
-
|
|
1737
|
-
exports.showDatasetTableUpdater = showDatasetTableUpdater;
|
|
1738
|
-
|
|
1739
|
-
var updateTableColorUpdater = function updateTableColorUpdater(state, action) {
|
|
1740
|
-
return updateDatasetPropsUpdater(state, {
|
|
1741
|
-
dataId: action.dataId,
|
|
1742
|
-
props: {
|
|
1743
|
-
color: action.newColor
|
|
1744
|
-
}
|
|
1745
|
-
});
|
|
1746
|
-
};
|
|
1747
|
-
/**
|
|
1748
|
-
* reset visState to initial State
|
|
1749
|
-
* @memberof visStateUpdaters
|
|
1750
|
-
* @public
|
|
1751
|
-
*/
|
|
1752
|
-
|
|
1753
|
-
|
|
1754
|
-
exports.updateTableColorUpdater = updateTableColorUpdater;
|
|
1755
|
-
|
|
1756
|
-
var resetMapConfigUpdater = function resetMapConfigUpdater(state) {
|
|
1757
|
-
return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
|
|
1758
|
-
initialState: state.initialState
|
|
1759
|
-
});
|
|
1760
|
-
};
|
|
1761
|
-
/**
|
|
1762
|
-
* Propagate `visState` reducer with a new configuration. Current config will be override.
|
|
1763
|
-
* @memberof visStateUpdaters
|
|
1764
|
-
* @public
|
|
1765
|
-
*/
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
exports.resetMapConfigUpdater = resetMapConfigUpdater;
|
|
1769
|
-
|
|
1770
|
-
var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref14) {
|
|
1771
|
-
var _ref14$payload = _ref14.payload,
|
|
1772
|
-
_ref14$payload$config = _ref14$payload.config,
|
|
1773
|
-
config = _ref14$payload$config === void 0 ? {} : _ref14$payload$config,
|
|
1774
|
-
_ref14$payload$option = _ref14$payload.options,
|
|
1775
|
-
options = _ref14$payload$option === void 0 ? {} : _ref14$payload$option;
|
|
1776
|
-
|
|
1777
|
-
if (!config.visState) {
|
|
1778
|
-
return state;
|
|
1779
|
-
}
|
|
1780
|
-
|
|
1781
|
-
var keepExistingConfig = options.keepExistingConfig; // reset config if keepExistingConfig is falsy
|
|
1782
|
-
|
|
1783
|
-
var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
|
|
1784
|
-
|
|
1785
|
-
var _iterator2 = _createForOfIteratorHelper(state.mergers),
|
|
1786
|
-
_step2;
|
|
1787
|
-
|
|
1788
|
-
try {
|
|
1789
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
1790
|
-
var merger = _step2.value;
|
|
1791
|
-
|
|
1792
|
-
if ((0, _mergerHandler.isValidMerger)(merger) && (0, _mergerHandler.hasPropsToMerge)(config.visState, merger.prop)) {
|
|
1793
|
-
mergedState = merger.merge(mergedState, (0, _mergerHandler.getPropValueToMerger)(config.visState, merger.prop, merger.toMergeProp), // fromConfig
|
|
1794
|
-
true);
|
|
1795
|
-
}
|
|
1796
|
-
}
|
|
1797
|
-
} catch (err) {
|
|
1798
|
-
_iterator2.e(err);
|
|
1799
|
-
} finally {
|
|
1800
|
-
_iterator2.f();
|
|
1801
|
-
}
|
|
1802
|
-
|
|
1803
|
-
return mergedState;
|
|
1804
|
-
};
|
|
1805
|
-
/**
|
|
1806
|
-
* Trigger layer hover event with hovered object
|
|
1807
|
-
* @memberof visStateUpdaters
|
|
1808
|
-
* @public
|
|
1809
|
-
*/
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
|
|
1813
|
-
|
|
1814
|
-
var layerHoverUpdater = function layerHoverUpdater(state, action) {
|
|
1815
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1816
|
-
hoverInfo: _objectSpread({}, action.info)
|
|
1817
|
-
});
|
|
1818
|
-
};
|
|
1819
|
-
/* eslint-enable max-statements */
|
|
1820
|
-
|
|
1821
|
-
/**
|
|
1822
|
-
* Update `interactionConfig`
|
|
1823
|
-
* @memberof visStateUpdaters
|
|
1824
|
-
* @public
|
|
1825
|
-
*/
|
|
1826
|
-
|
|
1827
|
-
|
|
1828
|
-
exports.layerHoverUpdater = layerHoverUpdater;
|
|
1829
|
-
|
|
1830
|
-
function interactionConfigChangeUpdater(state, action) {
|
|
1831
|
-
var config = action.config;
|
|
1832
|
-
|
|
1833
|
-
var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), (0, _defineProperty2["default"])({}, config.id, config)); // Don't enable tooltip and brush at the same time
|
|
1834
|
-
// but coordinates can be shown at all time
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
var contradict = ['brush', 'tooltip'];
|
|
1838
|
-
|
|
1839
|
-
if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
|
|
1840
|
-
// only enable one interaction at a time
|
|
1841
|
-
contradict.forEach(function (k) {
|
|
1842
|
-
if (k !== config.id) {
|
|
1843
|
-
interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
|
|
1844
|
-
enabled: false
|
|
1845
|
-
});
|
|
1846
|
-
}
|
|
1847
|
-
});
|
|
1848
|
-
}
|
|
1849
|
-
|
|
1850
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1851
|
-
interactionConfig: interactionConfig
|
|
1852
|
-
});
|
|
1853
|
-
|
|
1854
|
-
if (config.id === 'geocoder' && !config.enabled) {
|
|
1855
|
-
return removeDatasetUpdater(newState, {
|
|
1856
|
-
dataId: 'geocoder_dataset'
|
|
1857
|
-
});
|
|
1858
|
-
}
|
|
1859
|
-
|
|
1860
|
-
return newState;
|
|
1861
|
-
}
|
|
1862
|
-
/**
|
|
1863
|
-
* Trigger layer click event with clicked object
|
|
1864
|
-
* @memberof visStateUpdaters
|
|
1865
|
-
* @public
|
|
1866
|
-
*/
|
|
1867
|
-
|
|
1868
|
-
|
|
1869
|
-
var layerClickUpdater = function layerClickUpdater(state, action) {
|
|
1870
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1871
|
-
mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
|
|
1872
|
-
pinned: state.mousePos.pinned ? null : (0, _lodash["default"])(state.mousePos)
|
|
1873
|
-
}) : state.mousePos,
|
|
1874
|
-
clicked: action.info && action.info.picked ? action.info : null
|
|
1875
|
-
});
|
|
1876
|
-
};
|
|
1877
|
-
/**
|
|
1878
|
-
* Trigger map click event, unselect clicked object
|
|
1879
|
-
* @memberof visStateUpdaters
|
|
1880
|
-
* @public
|
|
1881
|
-
*/
|
|
1882
|
-
|
|
1883
|
-
|
|
1884
|
-
exports.layerClickUpdater = layerClickUpdater;
|
|
1885
|
-
|
|
1886
|
-
var mapClickUpdater = function mapClickUpdater(state, action) {
|
|
1887
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1888
|
-
clicked: null
|
|
1889
|
-
});
|
|
1890
|
-
};
|
|
1891
|
-
/**
|
|
1892
|
-
* Trigger map move event
|
|
1893
|
-
* @memberof visStateUpdaters
|
|
1894
|
-
* @public
|
|
1895
|
-
*/
|
|
1896
|
-
|
|
1897
|
-
|
|
1898
|
-
exports.mapClickUpdater = mapClickUpdater;
|
|
1899
|
-
|
|
1900
|
-
var mouseMoveUpdater = function mouseMoveUpdater(state, _ref15) {
|
|
1901
|
-
var evt = _ref15.evt;
|
|
1902
|
-
|
|
1903
|
-
if (Object.values(state.interactionConfig).some(function (config) {
|
|
1904
|
-
return config.enabled;
|
|
1905
|
-
})) {
|
|
1906
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1907
|
-
mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
|
|
1908
|
-
mousePosition: (0, _toConsumableArray2["default"])(evt.point)
|
|
1909
|
-
} : {}), Array.isArray(evt.lngLat) ? {
|
|
1910
|
-
coordinate: (0, _toConsumableArray2["default"])(evt.lngLat)
|
|
1911
|
-
} : {})
|
|
1912
|
-
});
|
|
1913
|
-
}
|
|
1914
|
-
|
|
1915
|
-
return state;
|
|
1916
|
-
};
|
|
1917
|
-
/**
|
|
1918
|
-
* Toggle visibility of a layer for a split map
|
|
1919
|
-
* @memberof visStateUpdaters
|
|
1920
|
-
* @public
|
|
1921
|
-
*/
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
exports.mouseMoveUpdater = mouseMoveUpdater;
|
|
1925
|
-
|
|
1926
|
-
var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
1927
|
-
return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
|
|
1928
|
-
// maybe we should use an array to store state for a single map as well
|
|
1929
|
-
// if current maps length is equal to 0 it means that we are about to split the view
|
|
1930
|
-
splitMaps: (0, _utils.computeSplitMapLayers)(state.layers, {
|
|
1931
|
-
duplicate: false
|
|
1932
|
-
})
|
|
1933
|
-
}) : closeSpecificMapAtIndex(state, action);
|
|
1934
|
-
};
|
|
1935
|
-
/**
|
|
1936
|
-
* Toggle visibility of a layer in a split map
|
|
1937
|
-
* @memberof visStateUpdaters
|
|
1938
|
-
* @public
|
|
1939
|
-
*/
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
|
|
1943
|
-
|
|
1944
|
-
var toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref16) {
|
|
1945
|
-
var mapIndex = _ref16.mapIndex,
|
|
1946
|
-
layerId = _ref16.layerId;
|
|
1947
|
-
var splitMaps = state.splitMaps;
|
|
1948
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1949
|
-
splitMaps: splitMaps.map(function (sm, i) {
|
|
1950
|
-
return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
|
|
1951
|
-
layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, (0, _defineProperty2["default"])({}, layerId, !splitMaps[i].layers[layerId]))
|
|
1952
|
-
}) : sm;
|
|
1953
|
-
})
|
|
1954
|
-
});
|
|
1955
|
-
};
|
|
1956
|
-
/**
|
|
1957
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
1958
|
-
* @memberof visStateUpdaters
|
|
1959
|
-
* @public
|
|
1960
|
-
*/
|
|
1961
|
-
// eslint-disable-next-line complexity
|
|
1962
|
-
|
|
1963
|
-
|
|
1964
|
-
exports.toggleLayerForMapUpdater = toggleLayerForMapUpdater;
|
|
1965
|
-
|
|
1966
|
-
var updateVisDataUpdater = function updateVisDataUpdater(state, action) {
|
|
1967
|
-
// datasets can be a single data entries or an array of multiple data entries
|
|
1968
|
-
var config = action.config,
|
|
1969
|
-
options = action.options; // apply config if passed from action
|
|
1970
|
-
// TODO: we don't handle asyn mergers here yet
|
|
1971
|
-
|
|
1972
|
-
var previousState = config ? receiveMapConfigUpdater(state, {
|
|
1973
|
-
payload: {
|
|
1974
|
-
config: config,
|
|
1975
|
-
options: options
|
|
1976
|
-
}
|
|
1977
|
-
}) : state;
|
|
1978
|
-
var datasets = (0, _utils.toArray)(action.datasets);
|
|
1979
|
-
var newDataEntries = datasets.reduce( // @ts-expect-error Type '{}' is missing the following properties from type 'ProtoDataset': data, info
|
|
1980
|
-
function (accu) {
|
|
1981
|
-
var _ref17 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
1982
|
-
_ref17$info = _ref17.info,
|
|
1983
|
-
info = _ref17$info === void 0 ? {} : _ref17$info,
|
|
1984
|
-
rest = (0, _objectWithoutProperties2["default"])(_ref17, ["info"]);
|
|
1985
|
-
|
|
1986
|
-
return _objectSpread(_objectSpread({}, accu), (0, _table.createNewDataEntry)(_objectSpread({
|
|
1987
|
-
info: info
|
|
1988
|
-
}, rest), state.datasets) || {});
|
|
1989
|
-
}, {}); // save new dataset entry to state
|
|
1990
|
-
|
|
1991
|
-
var mergedState = _objectSpread(_objectSpread({}, previousState), {}, {
|
|
1992
|
-
datasets: (0, _visStateMerger.mergeDatasetsByOrder)(previousState, newDataEntries)
|
|
1993
|
-
}); // merge state with config to be merged
|
|
1994
|
-
|
|
1995
|
-
|
|
1996
|
-
var layerMergers = state.mergers.filter(function (m) {
|
|
1997
|
-
return m.waitForLayerData;
|
|
1998
|
-
});
|
|
1999
|
-
var datasetMergers = state.mergers.filter(function (m) {
|
|
2000
|
-
return !layerMergers.includes(m);
|
|
2001
|
-
});
|
|
2002
|
-
var newDataIds = Object.keys(newDataEntries);
|
|
2003
|
-
var postMergerPayload = {
|
|
2004
|
-
newDataIds: newDataIds,
|
|
2005
|
-
options: options,
|
|
2006
|
-
layerMergers: layerMergers
|
|
2007
|
-
};
|
|
2008
|
-
return applyMergersUpdater(mergedState, {
|
|
2009
|
-
mergers: datasetMergers,
|
|
2010
|
-
postMergerPayload: postMergerPayload
|
|
2011
|
-
});
|
|
2012
|
-
};
|
|
2013
|
-
/**
|
|
2014
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2015
|
-
*/
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
exports.updateVisDataUpdater = updateVisDataUpdater;
|
|
2019
|
-
|
|
2020
|
-
function applyMergersUpdater(state, action) {
|
|
2021
|
-
var mergers = action.mergers,
|
|
2022
|
-
postMergerPayload = action.postMergerPayload; // merge state with config to be merged
|
|
2023
|
-
|
|
2024
|
-
var mergeStateResult = (0, _mergerHandler.mergeStateFromMergers)(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers, // newDataIds,
|
|
2025
|
-
postMergerPayload); // if all merged, kickup post merge process
|
|
2026
|
-
// if not wait
|
|
2027
|
-
|
|
2028
|
-
return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
|
|
2029
|
-
}
|
|
2030
|
-
/**
|
|
2031
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2032
|
-
*/
|
|
2033
|
-
|
|
2034
|
-
|
|
2035
|
-
function postMergeUpdater(mergedState, postMergerPayload) {
|
|
2036
|
-
var newDataIds = postMergerPayload.newDataIds,
|
|
2037
|
-
options = postMergerPayload.options,
|
|
2038
|
-
layerMergers = postMergerPayload.layerMergers;
|
|
2039
|
-
var newFilters = mergedState.filters.filter(function (f) {
|
|
2040
|
-
return f.dataId.find(function (fDataId) {
|
|
2041
|
-
return newDataIds.includes(fDataId);
|
|
2042
|
-
});
|
|
2043
|
-
});
|
|
2044
|
-
var datasetFiltered = (0, _lodash2["default"])(newFilters.reduce(function (accu, f) {
|
|
2045
|
-
return [].concat((0, _toConsumableArray2["default"])(accu), (0, _toConsumableArray2["default"])(f.dataId));
|
|
2046
|
-
}, []));
|
|
2047
|
-
var dataEmpty = newDataIds.length < 1;
|
|
2048
|
-
var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
|
|
2049
|
-
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2050
|
-
}) : [];
|
|
2051
|
-
var newDataEntries = newDataIds.reduce(function (accu, id) {
|
|
2052
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, mergedState.datasets[id]));
|
|
2053
|
-
}, {});
|
|
2054
|
-
|
|
2055
|
-
if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
|
|
2056
|
-
// no layer merged, find defaults
|
|
2057
|
-
var result = addDefaultLayers(mergedState, newDataEntries);
|
|
2058
|
-
mergedState = result.state;
|
|
2059
|
-
newLayers = result.newLayers;
|
|
2060
|
-
}
|
|
2061
|
-
|
|
2062
|
-
if (mergedState.splitMaps.length) {
|
|
2063
|
-
// if map is split, add new layers to splitMaps
|
|
2064
|
-
newLayers = mergedState.layers.filter(function (l) {
|
|
2065
|
-
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2066
|
-
});
|
|
2067
|
-
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
|
|
2068
|
-
splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
|
|
2069
|
-
});
|
|
2070
|
-
} // if no tooltips merged add default tooltips
|
|
2071
|
-
|
|
2072
|
-
|
|
2073
|
-
newDataIds.forEach(function (dataId) {
|
|
2074
|
-
var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId]; // loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
|
|
2075
|
-
|
|
2076
|
-
if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
|
|
2077
|
-
// adding dataset: autoCreateTooltips is true
|
|
2078
|
-
mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
|
|
2079
|
-
}
|
|
2080
|
-
});
|
|
2081
|
-
var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : (0, _lodash2["default"])(Object.keys(newDataEntries).concat(datasetFiltered));
|
|
2082
|
-
var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined); // register layer animation domain,
|
|
2083
|
-
// need to be called after layer data is calculated
|
|
2084
|
-
|
|
2085
|
-
updatedState = updateAnimationDomain(updatedState); // try to process layerMergers after dataset+datasetMergers
|
|
2086
|
-
|
|
2087
|
-
return layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
|
|
2088
|
-
mergers: layerMergers,
|
|
2089
|
-
postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
|
|
2090
|
-
layerMergers: []
|
|
2091
|
-
})
|
|
2092
|
-
}) : updatedState;
|
|
2093
|
-
}
|
|
2094
|
-
/**
|
|
2095
|
-
* Rename an existing dataset in `visState`
|
|
2096
|
-
* @memberof visStateUpdaters
|
|
2097
|
-
* @public
|
|
2098
|
-
*/
|
|
2099
|
-
|
|
2100
|
-
|
|
2101
|
-
function renameDatasetUpdater(state, action) {
|
|
2102
|
-
return updateDatasetPropsUpdater(state, {
|
|
2103
|
-
dataId: action.dataId,
|
|
2104
|
-
props: {
|
|
2105
|
-
label: action.label
|
|
2106
|
-
}
|
|
2107
|
-
});
|
|
2108
|
-
}
|
|
2109
|
-
|
|
2110
|
-
var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
|
|
2111
|
-
/**
|
|
2112
|
-
* Validates properties before updating the dataset.
|
|
2113
|
-
* Makes sure each property is in the allowed list
|
|
2114
|
-
* Makes sure color value is RGB
|
|
2115
|
-
* Performs deep merge when updating metadata
|
|
2116
|
-
*/
|
|
2117
|
-
|
|
2118
|
-
var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
|
|
2119
|
-
var validatedProps = Object.entries(props).reduce(function (acc, entry) {
|
|
2120
|
-
var _entry = (0, _slicedToArray2["default"])(entry, 2),
|
|
2121
|
-
key = _entry[0],
|
|
2122
|
-
value = _entry[1]; // is it allowed ?
|
|
2123
|
-
|
|
2124
|
-
|
|
2125
|
-
if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
|
|
2126
|
-
return acc;
|
|
2127
|
-
} // if we are adding a color but it is not RGB we don't accept the value
|
|
2128
|
-
// in the future as we add more props we should change this if into a switch
|
|
2129
|
-
|
|
2130
|
-
|
|
2131
|
-
if (key === 'color' && !(0, _utils.isRgbColor)(value)) {
|
|
2132
|
-
return acc;
|
|
2133
|
-
} // do we need deep merge ?
|
|
2134
|
-
|
|
2135
|
-
|
|
2136
|
-
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(value) ? (0, _deepmerge["default"])(dataset[key] || {}, value) : value));
|
|
2137
|
-
}, {});
|
|
2138
|
-
return validatedProps;
|
|
2139
|
-
};
|
|
2140
|
-
/**
|
|
2141
|
-
* Update Dataset props (label, color, meta). Do not use to update data or any related properties
|
|
2142
|
-
* @memberof visStateUpdaters
|
|
2143
|
-
* @public
|
|
2144
|
-
*/
|
|
2145
|
-
|
|
2146
|
-
|
|
2147
|
-
function updateDatasetPropsUpdater(state, action) {
|
|
2148
|
-
var dataId = action.dataId,
|
|
2149
|
-
props = action.props;
|
|
2150
|
-
var datasets = state.datasets;
|
|
2151
|
-
var existing = datasets[dataId];
|
|
2152
|
-
|
|
2153
|
-
if (existing) {
|
|
2154
|
-
var validatedProps = validateDatasetUpdateProps(props, existing); // validate props: just color for now
|
|
2155
|
-
// we only allow label, color and meta to be updated
|
|
2156
|
-
// const newTable = copyTableAndUpdate(existing, validatedProps);
|
|
2157
|
-
|
|
2158
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2159
|
-
datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, validatedProps)))
|
|
2160
|
-
});
|
|
2161
|
-
}
|
|
2162
|
-
|
|
2163
|
-
return state;
|
|
2164
|
-
}
|
|
2165
|
-
/**
|
|
2166
|
-
* When a user clicks on the specific map closing icon
|
|
2167
|
-
* the application will close the selected map
|
|
2168
|
-
* and will merge the remaining one with the global state
|
|
2169
|
-
* TODO: i think in the future this action should be called merge map layers with global settings
|
|
2170
|
-
* @param {Object} state `visState`
|
|
2171
|
-
* @param {Object} action action
|
|
2172
|
-
* @returns {Object} nextState
|
|
2173
|
-
*/
|
|
2174
|
-
|
|
2175
|
-
|
|
2176
|
-
function closeSpecificMapAtIndex(state, action) {
|
|
2177
|
-
var _state$splitMaps$inde;
|
|
2178
|
-
|
|
2179
|
-
// retrieve layers meta data from the remaining map that we need to keep
|
|
2180
|
-
var indexToRetrieve = 1 - action.payload;
|
|
2181
|
-
var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
|
|
2182
|
-
var layers = state.layers; // update layer visibility
|
|
2183
|
-
|
|
2184
|
-
var newLayers = layers.map(function (layer) {
|
|
2185
|
-
return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
|
|
2186
|
-
// if layer.id is not in mapLayers, it should be inVisible
|
|
2187
|
-
isVisible: false
|
|
2188
|
-
}) : layer;
|
|
2189
|
-
}); // delete map
|
|
2190
|
-
|
|
2191
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2192
|
-
layers: newLayers,
|
|
2193
|
-
splitMaps: []
|
|
2194
|
-
});
|
|
2195
|
-
}
|
|
2196
|
-
/**
|
|
2197
|
-
* Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
|
|
2198
|
-
* @memberof visStateUpdaters
|
|
2199
|
-
* @public
|
|
2200
|
-
*/
|
|
2201
|
-
|
|
2202
|
-
|
|
2203
|
-
var loadFilesUpdater = function loadFilesUpdater(state, action) {
|
|
2204
|
-
var files = action.files,
|
|
2205
|
-
_action$onFinish = action.onFinish,
|
|
2206
|
-
onFinish = _action$onFinish === void 0 ? _actions.loadFilesSuccess : _action$onFinish;
|
|
2207
|
-
|
|
2208
|
-
if (!files.length) {
|
|
2209
|
-
return state;
|
|
2210
|
-
}
|
|
2211
|
-
|
|
2212
|
-
var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
|
|
2213
|
-
return (0, _composerHelpers.merge_)(initialFileLoadingProgress(f, i))(accu);
|
|
2214
|
-
}, {});
|
|
2215
|
-
var fileLoading = {
|
|
2216
|
-
fileCache: [],
|
|
2217
|
-
filesToLoad: files,
|
|
2218
|
-
onFinish: onFinish
|
|
2219
|
-
};
|
|
2220
|
-
var nextState = (0, _composerHelpers.merge_)({
|
|
2221
|
-
fileLoadingProgress: fileLoadingProgress,
|
|
2222
|
-
fileLoading: fileLoading
|
|
2223
|
-
})(state);
|
|
2224
|
-
return loadNextFileUpdater(nextState);
|
|
2225
|
-
};
|
|
2226
|
-
/**
|
|
2227
|
-
* Sucessfully loaded one file, move on to the next one
|
|
2228
|
-
* @memberof visStateUpdaters
|
|
2229
|
-
* @public
|
|
2230
|
-
*/
|
|
2231
|
-
|
|
2232
|
-
|
|
2233
|
-
exports.loadFilesUpdater = loadFilesUpdater;
|
|
2234
|
-
|
|
2235
|
-
function loadFileStepSuccessUpdater(state, action) {
|
|
2236
|
-
if (!state.fileLoading) {
|
|
2237
|
-
return state;
|
|
2238
|
-
}
|
|
2239
|
-
|
|
2240
|
-
var fileName = action.fileName,
|
|
2241
|
-
fileCache = action.fileCache;
|
|
2242
|
-
var _state$fileLoading = state.fileLoading,
|
|
2243
|
-
filesToLoad = _state$fileLoading.filesToLoad,
|
|
2244
|
-
onFinish = _state$fileLoading.onFinish;
|
|
2245
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2246
|
-
fileName: fileName,
|
|
2247
|
-
progress: {
|
|
2248
|
-
percent: 1,
|
|
2249
|
-
message: 'Done'
|
|
2250
|
-
}
|
|
2251
|
-
}); // save processed file to fileCache
|
|
2252
|
-
|
|
2253
|
-
var stateWithCache = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2254
|
-
fileCache: fileCache
|
|
2255
|
-
}))(stateWithProgress);
|
|
2256
|
-
return (0, _tasks.withTask)(stateWithCache, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2257
|
-
return onFinish(fileCache);
|
|
2258
|
-
}));
|
|
2259
|
-
} // withTask<T>(state: T, task: any): T
|
|
2260
|
-
|
|
2261
|
-
/**
|
|
2262
|
-
*
|
|
2263
|
-
* @memberof visStateUpdaters
|
|
2264
|
-
* @public
|
|
2265
|
-
*/
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
function loadNextFileUpdater(state) {
|
|
2269
|
-
if (!state.fileLoading) {
|
|
2270
|
-
return state;
|
|
2271
|
-
}
|
|
2272
|
-
|
|
2273
|
-
var filesToLoad = state.fileLoading.filesToLoad;
|
|
2274
|
-
|
|
2275
|
-
var _filesToLoad = (0, _toArray2["default"])(filesToLoad),
|
|
2276
|
-
file = _filesToLoad[0],
|
|
2277
|
-
remainingFilesToLoad = _filesToLoad.slice(1); // save filesToLoad to state
|
|
2278
|
-
|
|
2279
|
-
|
|
2280
|
-
var nextState = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2281
|
-
filesToLoad: remainingFilesToLoad
|
|
2282
|
-
}))(state);
|
|
2283
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
|
|
2284
|
-
fileName: file.name,
|
|
2285
|
-
progress: {
|
|
2286
|
-
percent: 0,
|
|
2287
|
-
message: 'loading...'
|
|
2288
|
-
}
|
|
2289
|
-
});
|
|
2290
|
-
var loaders = state.loaders,
|
|
2291
|
-
loadOptions = state.loadOptions;
|
|
2292
|
-
return (0, _tasks.withTask)(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
|
|
2293
|
-
}
|
|
2294
|
-
|
|
2295
|
-
function makeLoadFileTask(file, fileCache) {
|
|
2296
|
-
var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
2297
|
-
var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
2298
|
-
return (0, _tasks2.LOAD_FILE_TASK)({
|
|
2299
|
-
file: file,
|
|
2300
|
-
fileCache: fileCache,
|
|
2301
|
-
loaders: loaders,
|
|
2302
|
-
loadOptions: loadOptions
|
|
2303
|
-
}).bimap( // prettier ignore
|
|
2304
|
-
// success
|
|
2305
|
-
function (gen) {
|
|
2306
|
-
return (0, _actions.nextFileBatch)({
|
|
2307
|
-
gen: gen,
|
|
2308
|
-
fileName: file.name,
|
|
2309
|
-
onFinish: function onFinish(result) {
|
|
2310
|
-
return (0, _actions.processFileContent)({
|
|
2311
|
-
content: result,
|
|
2312
|
-
fileCache: fileCache
|
|
2313
|
-
});
|
|
2314
|
-
}
|
|
2315
|
-
});
|
|
2316
|
-
}, // error
|
|
2317
|
-
function (err) {
|
|
2318
|
-
return (0, _actions.loadFilesErr)(file.name, err);
|
|
2319
|
-
});
|
|
2320
|
-
}
|
|
2321
|
-
/**
|
|
2322
|
-
*
|
|
2323
|
-
* @memberof visStateUpdaters
|
|
2324
|
-
* @public
|
|
2325
|
-
*/
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
function processFileContentUpdater(state, action) {
|
|
2329
|
-
var _action$payload = action.payload,
|
|
2330
|
-
content = _action$payload.content,
|
|
2331
|
-
fileCache = _action$payload.fileCache;
|
|
2332
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2333
|
-
fileName: content.fileName,
|
|
2334
|
-
progress: {
|
|
2335
|
-
percent: 1,
|
|
2336
|
-
message: 'processing...'
|
|
2337
|
-
}
|
|
2338
|
-
});
|
|
2339
|
-
return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.PROCESS_FILE_DATA)({
|
|
2340
|
-
content: content,
|
|
2341
|
-
fileCache: fileCache
|
|
2342
|
-
}).bimap(function (result) {
|
|
2343
|
-
return (0, _actions.loadFileStepSuccess)({
|
|
2344
|
-
fileName: content.fileName,
|
|
2345
|
-
fileCache: result
|
|
2346
|
-
});
|
|
2347
|
-
}, function (err) {
|
|
2348
|
-
return (0, _actions.loadFilesErr)(content.fileName, err);
|
|
2349
|
-
}));
|
|
2350
|
-
}
|
|
2351
|
-
|
|
2352
|
-
function parseProgress() {
|
|
2353
|
-
var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
2354
|
-
var progress = arguments.length > 1 ? arguments[1] : undefined;
|
|
2355
|
-
|
|
2356
|
-
// This happens when receiving query metadata or other cases we don't
|
|
2357
|
-
// have an update for the user.
|
|
2358
|
-
if (!progress || !progress.percent) {
|
|
2359
|
-
return {};
|
|
2360
|
-
}
|
|
2361
|
-
|
|
2362
|
-
return {
|
|
2363
|
-
percent: progress.percent
|
|
2364
|
-
};
|
|
2365
|
-
}
|
|
2366
|
-
/**
|
|
2367
|
-
* gets called with payload = AsyncGenerator<???>
|
|
2368
|
-
* @memberof visStateUpdaters
|
|
2369
|
-
* @public
|
|
2370
|
-
*/
|
|
2371
|
-
|
|
2372
|
-
|
|
2373
|
-
var nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref18) {
|
|
2374
|
-
var _accumulated$data;
|
|
2375
|
-
|
|
2376
|
-
var _ref18$payload = _ref18.payload,
|
|
2377
|
-
gen = _ref18$payload.gen,
|
|
2378
|
-
fileName = _ref18$payload.fileName,
|
|
2379
|
-
progress = _ref18$payload.progress,
|
|
2380
|
-
accumulated = _ref18$payload.accumulated,
|
|
2381
|
-
onFinish = _ref18$payload.onFinish;
|
|
2382
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2383
|
-
fileName: fileName,
|
|
2384
|
-
progress: parseProgress(state.fileLoadingProgress[fileName], progress)
|
|
2385
|
-
});
|
|
2386
|
-
return (0, _tasks.withTask)(stateWithProgress, [].concat((0, _toConsumableArray2["default"])(fileName.endsWith('arrow') && (accumulated === null || accumulated === void 0 ? void 0 : (_accumulated$data = accumulated.data) === null || _accumulated$data === void 0 ? void 0 : _accumulated$data.length) > 0 ? [(0, _tasks2.PROCESS_FILE_DATA)({
|
|
2387
|
-
content: accumulated,
|
|
2388
|
-
fileCache: []
|
|
2389
|
-
}).bimap(function (result) {
|
|
2390
|
-
return (0, _actions.loadFilesSuccess)(result);
|
|
2391
|
-
}, function (err) {
|
|
2392
|
-
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2393
|
-
})] : []), [(0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref19) {
|
|
2394
|
-
var value = _ref19.value,
|
|
2395
|
-
done = _ref19.done;
|
|
2396
|
-
return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
|
|
2397
|
-
gen: gen,
|
|
2398
|
-
fileName: fileName,
|
|
2399
|
-
progress: value.progress,
|
|
2400
|
-
accumulated: value,
|
|
2401
|
-
onFinish: onFinish
|
|
2402
|
-
});
|
|
2403
|
-
}, function (err) {
|
|
2404
|
-
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2405
|
-
})]));
|
|
2406
|
-
};
|
|
2407
|
-
/**
|
|
2408
|
-
* Trigger loading file error
|
|
2409
|
-
* @memberof visStateUpdaters
|
|
2410
|
-
* @public
|
|
2411
|
-
*/
|
|
2412
|
-
|
|
2413
|
-
|
|
2414
|
-
exports.nextFileBatchUpdater = nextFileBatchUpdater;
|
|
2415
|
-
|
|
2416
|
-
var loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref20) {
|
|
2417
|
-
var error = _ref20.error,
|
|
2418
|
-
fileName = _ref20.fileName;
|
|
2419
|
-
|
|
2420
|
-
// update ui with error message
|
|
2421
|
-
_window.console.warn(error);
|
|
2422
|
-
|
|
2423
|
-
if (!state.fileLoading) {
|
|
2424
|
-
return state;
|
|
2425
|
-
}
|
|
2426
|
-
|
|
2427
|
-
var _state$fileLoading2 = state.fileLoading,
|
|
2428
|
-
filesToLoad = _state$fileLoading2.filesToLoad,
|
|
2429
|
-
onFinish = _state$fileLoading2.onFinish,
|
|
2430
|
-
fileCache = _state$fileLoading2.fileCache;
|
|
2431
|
-
var nextState = updateFileLoadingProgressUpdater(state, {
|
|
2432
|
-
fileName: fileName,
|
|
2433
|
-
progress: {
|
|
2434
|
-
error: error
|
|
2435
|
-
}
|
|
2436
|
-
}); // kick off next file or finish
|
|
2437
|
-
|
|
2438
|
-
return (0, _tasks.withTask)(nextState, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2439
|
-
return onFinish(fileCache);
|
|
2440
|
-
}));
|
|
2441
|
-
};
|
|
2442
|
-
/**
|
|
2443
|
-
* When select dataset for export, apply cpu filter to selected dataset
|
|
2444
|
-
* @memberof visStateUpdaters
|
|
2445
|
-
* @public
|
|
2446
|
-
*/
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
exports.loadFilesErrUpdater = loadFilesErrUpdater;
|
|
2450
|
-
|
|
2451
|
-
var applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref21) {
|
|
2452
|
-
var dataId = _ref21.dataId;
|
|
2453
|
-
// apply cpuFilter
|
|
2454
|
-
var dataIds = (0, _utils.toArray)(dataId);
|
|
2455
|
-
return dataIds.reduce(function (accu, id) {
|
|
2456
|
-
return (0, _utils.filterDatasetCPU)(accu, id);
|
|
2457
|
-
}, state);
|
|
2458
|
-
};
|
|
2459
|
-
/**
|
|
2460
|
-
* User input to update the info of the map
|
|
2461
|
-
* @memberof visStateUpdaters
|
|
2462
|
-
* @public
|
|
2463
|
-
*/
|
|
2464
|
-
|
|
2465
|
-
|
|
2466
|
-
exports.applyCPUFilterUpdater = applyCPUFilterUpdater;
|
|
2467
|
-
|
|
2468
|
-
var setMapInfoUpdater = function setMapInfoUpdater(state, action) {
|
|
2469
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2470
|
-
mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
|
|
2471
|
-
});
|
|
2472
|
-
};
|
|
2473
|
-
/**
|
|
2474
|
-
* Helper function to update All layer domain and layer data of state
|
|
2475
|
-
*/
|
|
2476
|
-
|
|
2477
|
-
|
|
2478
|
-
exports.setMapInfoUpdater = setMapInfoUpdater;
|
|
2479
|
-
|
|
2480
|
-
function addDefaultLayers(state, datasets) {
|
|
2481
|
-
var empty = [];
|
|
2482
|
-
var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
|
|
2483
|
-
var foundLayers = (0, _layerUtils.findDefaultLayer)(dataset, state.layerClasses);
|
|
2484
|
-
return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
|
|
2485
|
-
}, empty);
|
|
2486
|
-
return {
|
|
2487
|
-
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
2488
|
-
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
|
|
2489
|
-
layerOrder: [].concat((0, _toConsumableArray2["default"])((0, _layerUtils.getLayerOrderFromLayers)(defaultLayers)), (0, _toConsumableArray2["default"])(state.layerOrder))
|
|
2490
|
-
}),
|
|
2491
|
-
newLayers: defaultLayers
|
|
2492
|
-
};
|
|
2493
|
-
}
|
|
2494
|
-
/**
|
|
2495
|
-
* helper function to find default tooltips
|
|
2496
|
-
* @param {Object} state
|
|
2497
|
-
* @param {Object} dataset
|
|
2498
|
-
* @returns {Object} nextState
|
|
2499
|
-
*/
|
|
2500
|
-
|
|
2501
|
-
|
|
2502
|
-
function addDefaultTooltips(state, dataset) {
|
|
2503
|
-
var tooltipFields = (0, _interactionUtils.findFieldsToShow)(_objectSpread(_objectSpread({}, dataset), {}, {
|
|
2504
|
-
maxDefaultTooltips: state.maxDefaultTooltips
|
|
2505
|
-
}));
|
|
2506
|
-
|
|
2507
|
-
var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
|
|
2508
|
-
|
|
2509
|
-
return (0, _utils.set)(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
|
|
2510
|
-
}
|
|
2511
|
-
|
|
2512
|
-
function initialFileLoadingProgress(file, index) {
|
|
2513
|
-
var fileName = file.name || "Untitled File ".concat(index);
|
|
2514
|
-
return (0, _defineProperty2["default"])({}, fileName, {
|
|
2515
|
-
// percent of current file
|
|
2516
|
-
percent: 0,
|
|
2517
|
-
message: '',
|
|
2518
|
-
fileName: fileName,
|
|
2519
|
-
error: null
|
|
2520
|
-
});
|
|
2521
|
-
}
|
|
2522
|
-
|
|
2523
|
-
function updateFileLoadingProgressUpdater(state, _ref23) {
|
|
2524
|
-
var fileName = _ref23.fileName,
|
|
2525
|
-
progress = _ref23.progress;
|
|
2526
|
-
// @ts-expect-error
|
|
2527
|
-
return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
|
|
2528
|
-
}
|
|
2529
|
-
/**
|
|
2530
|
-
* Helper function to update layer domains for an array of datasets
|
|
2531
|
-
*/
|
|
2532
|
-
|
|
2533
|
-
|
|
2534
|
-
function updateAllLayerDomainData(state, dataId, updatedFilter) {
|
|
2535
|
-
var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
|
|
2536
|
-
var newLayers = [];
|
|
2537
|
-
var newLayerData = [];
|
|
2538
|
-
state.layers.forEach(function (oldLayer, i) {
|
|
2539
|
-
if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
|
|
2540
|
-
// No need to recalculate layer domain if filter has fixed domain
|
|
2541
|
-
var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
|
|
2542
|
-
|
|
2543
|
-
var _calculateLayerData6 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
|
|
2544
|
-
layerData = _calculateLayerData6.layerData,
|
|
2545
|
-
layer = _calculateLayerData6.layer;
|
|
2546
|
-
|
|
2547
|
-
newLayers.push(layer);
|
|
2548
|
-
newLayerData.push(layerData);
|
|
2549
|
-
} else {
|
|
2550
|
-
newLayers.push(oldLayer);
|
|
2551
|
-
newLayerData.push(state.layerData[i]);
|
|
2552
|
-
}
|
|
2553
|
-
});
|
|
2554
|
-
|
|
2555
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2556
|
-
layers: newLayers,
|
|
2557
|
-
layerData: newLayerData
|
|
2558
|
-
});
|
|
2559
|
-
|
|
2560
|
-
return newState;
|
|
2561
|
-
}
|
|
2562
|
-
|
|
2563
|
-
function updateAnimationDomain(state) {
|
|
2564
|
-
// merge all animatable layer domain and update global config
|
|
2565
|
-
var animatableLayers = state.layers.filter(function (l) {
|
|
2566
|
-
return l.config.isVisible && l.config.animation && l.config.animation.enabled && // @ts-expect-error trip-layer-only
|
|
2567
|
-
Array.isArray(l.animationDomain);
|
|
2568
|
-
});
|
|
2569
|
-
|
|
2570
|
-
if (!animatableLayers.length) {
|
|
2571
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2572
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2573
|
-
domain: null,
|
|
2574
|
-
defaultTimeFormat: null
|
|
2575
|
-
})
|
|
2576
|
-
});
|
|
2577
|
-
}
|
|
2578
|
-
|
|
2579
|
-
var mergedDomain = animatableLayers.reduce(function (accu, layer) {
|
|
2580
|
-
return [// @ts-expect-error trip-layer-only
|
|
2581
|
-
Math.min(accu[0], layer.animationDomain[0]), // @ts-expect-error trip-layer-only
|
|
2582
|
-
Math.max(accu[1], layer.animationDomain[1])];
|
|
2583
|
-
}, [Number(Infinity), -Infinity]);
|
|
2584
|
-
var defaultTimeFormat = (0, _utils.getTimeWidgetTitleFormatter)(mergedDomain);
|
|
2585
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2586
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2587
|
-
currentTime: (0, _utils.isInRange)(state.animationConfig.currentTime, mergedDomain) ? state.animationConfig.currentTime : mergedDomain[0],
|
|
2588
|
-
domain: mergedDomain,
|
|
2589
|
-
defaultTimeFormat: defaultTimeFormat
|
|
2590
|
-
})
|
|
2591
|
-
});
|
|
2592
|
-
}
|
|
2593
|
-
/**
|
|
2594
|
-
* Update the status of the editor
|
|
2595
|
-
* @memberof visStateUpdaters
|
|
2596
|
-
*/
|
|
2597
|
-
|
|
2598
|
-
|
|
2599
|
-
var setEditorModeUpdater = function setEditorModeUpdater(state, _ref24) {
|
|
2600
|
-
var mode = _ref24.mode;
|
|
2601
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2602
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2603
|
-
mode: mode,
|
|
2604
|
-
selectedFeature: null
|
|
2605
|
-
})
|
|
2606
|
-
});
|
|
2607
|
-
}; // const featureToFilterValue = (feature) => ({...feature, id: feature.id});
|
|
2608
|
-
|
|
2609
|
-
/**
|
|
2610
|
-
* Update editor features
|
|
2611
|
-
* @memberof visStateUpdaters
|
|
2612
|
-
*/
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
exports.setEditorModeUpdater = setEditorModeUpdater;
|
|
2616
|
-
|
|
2617
|
-
function setFeaturesUpdater(state, _ref25) {
|
|
2618
|
-
var _ref25$features = _ref25.features,
|
|
2619
|
-
features = _ref25$features === void 0 ? [] : _ref25$features;
|
|
2620
|
-
var lastFeature = features.length && features[features.length - 1];
|
|
2621
|
-
|
|
2622
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2623
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2624
|
-
// only save none filter features to editor
|
|
2625
|
-
features: features.filter(function (f) {
|
|
2626
|
-
return !(0, _utils.getFilterIdInFeature)(f);
|
|
2627
|
-
}),
|
|
2628
|
-
mode: lastFeature && lastFeature.properties.isClosed ? _constants.EDITOR_MODES.EDIT : state.editor.mode
|
|
2629
|
-
})
|
|
2630
|
-
}); // Retrieve existing feature
|
|
2631
|
-
|
|
2632
|
-
|
|
2633
|
-
var selectedFeature = state.editor.selectedFeature; // If no feature is selected we can simply return since no operations
|
|
2634
|
-
|
|
2635
|
-
if (!selectedFeature) {
|
|
2636
|
-
return newState;
|
|
2637
|
-
} // TODO: check if the feature has changed
|
|
2638
|
-
|
|
2639
|
-
|
|
2640
|
-
var feature = features.find(function (f) {
|
|
2641
|
-
return f.id === selectedFeature.id;
|
|
2642
|
-
}); // if feature is part of a filter
|
|
2643
|
-
|
|
2644
|
-
var filterId = feature && (0, _utils.getFilterIdInFeature)(feature);
|
|
2645
|
-
|
|
2646
|
-
if (filterId && feature) {
|
|
2647
|
-
// add bbox for polygon filter to speed up filtering
|
|
2648
|
-
if (feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
|
|
2649
|
-
var featureValue = (0, _utils.featureToFilterValue)(feature, filterId);
|
|
2650
|
-
var filterIdx = state.filters.findIndex(function (fil) {
|
|
2651
|
-
return fil.id === filterId;
|
|
2652
|
-
}); // @ts-ignore
|
|
2653
|
-
|
|
2654
|
-
return setFilterUpdater(newState, {
|
|
2655
|
-
idx: filterIdx,
|
|
2656
|
-
prop: 'value',
|
|
2657
|
-
value: featureValue
|
|
2658
|
-
});
|
|
2659
|
-
}
|
|
2660
|
-
|
|
2661
|
-
return newState;
|
|
2662
|
-
}
|
|
2663
|
-
/**
|
|
2664
|
-
* Set the current selected feature
|
|
2665
|
-
* @memberof uiStateUpdaters
|
|
2666
|
-
*/
|
|
2667
|
-
|
|
2668
|
-
|
|
2669
|
-
var setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref26) {
|
|
2670
|
-
var feature = _ref26.feature,
|
|
2671
|
-
selectionContext = _ref26.selectionContext;
|
|
2672
|
-
// add bbox for polygon filter to speed up filtering
|
|
2673
|
-
if (feature && feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
|
|
2674
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2675
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2676
|
-
selectedFeature: feature,
|
|
2677
|
-
selectionContext: selectionContext
|
|
2678
|
-
})
|
|
2679
|
-
});
|
|
2680
|
-
};
|
|
2681
|
-
/**
|
|
2682
|
-
* Delete existing feature from filters
|
|
2683
|
-
* @memberof visStateUpdaters
|
|
2684
|
-
*/
|
|
2685
|
-
|
|
2686
|
-
|
|
2687
|
-
exports.setSelectedFeatureUpdater = setSelectedFeatureUpdater;
|
|
2688
|
-
|
|
2689
|
-
function deleteFeatureUpdater(state, _ref27) {
|
|
2690
|
-
var feature = _ref27.feature;
|
|
2691
|
-
|
|
2692
|
-
if (!feature) {
|
|
2693
|
-
return state;
|
|
2694
|
-
}
|
|
2695
|
-
|
|
2696
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2697
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2698
|
-
selectedFeature: null
|
|
2699
|
-
})
|
|
2700
|
-
});
|
|
2701
|
-
|
|
2702
|
-
if ((0, _utils.getFilterIdInFeature)(feature)) {
|
|
2703
|
-
var filterIdx = newState.filters.findIndex(function (f) {
|
|
2704
|
-
return f.id === (0, _utils.getFilterIdInFeature)(feature);
|
|
2705
|
-
});
|
|
2706
|
-
return filterIdx > -1 ? removeFilterUpdater(newState, {
|
|
2707
|
-
idx: filterIdx
|
|
2708
|
-
}) : newState;
|
|
2709
|
-
} // modify editor object
|
|
2710
|
-
|
|
2711
|
-
|
|
2712
|
-
var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2713
|
-
features: state.editor.features.filter(function (f) {
|
|
2714
|
-
return f.id !== feature.id;
|
|
2715
|
-
}),
|
|
2716
|
-
selectedFeature: null
|
|
2717
|
-
});
|
|
2718
|
-
|
|
2719
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2720
|
-
editor: newEditor
|
|
2721
|
-
});
|
|
2722
|
-
}
|
|
2723
|
-
/**
|
|
2724
|
-
* Toggle feature as layer filter
|
|
2725
|
-
* @memberof visStateUpdaters
|
|
2726
|
-
*/
|
|
2727
|
-
|
|
2728
|
-
|
|
2729
|
-
function setPolygonFilterLayerUpdater(state, payload) {
|
|
2730
|
-
var layer = payload.layer,
|
|
2731
|
-
feature = payload.feature;
|
|
2732
|
-
var filterId = (0, _utils.getFilterIdInFeature)(feature); // let newFilter = null;
|
|
2733
|
-
|
|
2734
|
-
var filterIdx;
|
|
2735
|
-
var newLayerId = [layer.id];
|
|
2736
|
-
var newState = state; // If polygon filter already exists, we need to find out if the current layer is already included
|
|
2737
|
-
|
|
2738
|
-
if (filterId) {
|
|
2739
|
-
filterIdx = state.filters.findIndex(function (f) {
|
|
2740
|
-
return f.id === filterId;
|
|
2741
|
-
});
|
|
2742
|
-
|
|
2743
|
-
if (!state.filters[filterIdx]) {
|
|
2744
|
-
// what if filter doesn't exist?... not possible.
|
|
2745
|
-
// because features in the editor is passed in from filters and editors.
|
|
2746
|
-
// but we will move this feature back to editor just in case
|
|
2747
|
-
var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
|
|
2748
|
-
properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
|
|
2749
|
-
filterId: null
|
|
2750
|
-
})
|
|
2751
|
-
});
|
|
2752
|
-
|
|
2753
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2754
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2755
|
-
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), [noneFilterFeature]),
|
|
2756
|
-
selectedFeature: noneFilterFeature
|
|
2757
|
-
})
|
|
2758
|
-
});
|
|
2759
|
-
}
|
|
2760
|
-
|
|
2761
|
-
var filter = state.filters[filterIdx];
|
|
2762
|
-
var _filter$layerId = filter.layerId,
|
|
2763
|
-
layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
|
|
2764
|
-
var isLayerIncluded = layerId.includes(layer.id);
|
|
2765
|
-
newLayerId = isLayerIncluded ? // if layer is included, remove it
|
|
2766
|
-
layerId.filter(function (l) {
|
|
2767
|
-
return l !== layer.id;
|
|
2768
|
-
}) : [].concat((0, _toConsumableArray2["default"])(layerId), [layer.id]);
|
|
2769
|
-
} else {
|
|
2770
|
-
// if we haven't create the polygon filter, create it
|
|
2771
|
-
var newFilter = (0, _utils.generatePolygonFilter)([], feature);
|
|
2772
|
-
filterIdx = state.filters.length; // add feature, remove feature from eidtor
|
|
2773
|
-
|
|
2774
|
-
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2775
|
-
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
|
|
2776
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2777
|
-
features: state.editor.features.filter(function (f) {
|
|
2778
|
-
return f.id !== feature.id;
|
|
2779
|
-
}),
|
|
2780
|
-
selectedFeature: newFilter.value
|
|
2781
|
-
})
|
|
2782
|
-
});
|
|
2783
|
-
}
|
|
2784
|
-
|
|
2785
|
-
return setFilterUpdater(newState, {
|
|
2786
|
-
idx: filterIdx,
|
|
2787
|
-
prop: 'layerId',
|
|
2788
|
-
value: newLayerId
|
|
2789
|
-
});
|
|
2790
|
-
}
|
|
2791
|
-
/**
|
|
2792
|
-
* @memberof visStateUpdaters
|
|
2793
|
-
* @public
|
|
2794
|
-
*/
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
function sortTableColumnUpdater(state, _ref28) {
|
|
2798
|
-
var dataId = _ref28.dataId,
|
|
2799
|
-
column = _ref28.column,
|
|
2800
|
-
mode = _ref28.mode;
|
|
2801
|
-
var dataset = state.datasets[dataId];
|
|
2802
|
-
|
|
2803
|
-
if (!dataset) {
|
|
2804
|
-
return state;
|
|
2805
|
-
}
|
|
2806
|
-
|
|
2807
|
-
var sortMode = mode;
|
|
2808
|
-
|
|
2809
|
-
if (!sortMode) {
|
|
2810
|
-
var currentMode = (0, _lodash3["default"])(dataset, ['sortColumn', column]); // @ts-ignore - should be fixable in a TS file
|
|
2811
|
-
|
|
2812
|
-
sortMode = currentMode ? Object.keys(_constants.SORT_ORDER).find(function (m) {
|
|
2813
|
-
return m !== currentMode;
|
|
2814
|
-
}) : _constants.SORT_ORDER.ASCENDING;
|
|
2815
|
-
}
|
|
2816
|
-
|
|
2817
|
-
var sorted = (0, _table.sortDatasetByColumn)(dataset, column, sortMode);
|
|
2818
|
-
return (0, _utils.set)(['datasets', dataId], sorted, state);
|
|
2819
|
-
}
|
|
2820
|
-
/**
|
|
2821
|
-
* @memberof visStateUpdaters
|
|
2822
|
-
* @public
|
|
2823
|
-
*/
|
|
2824
|
-
|
|
2825
|
-
|
|
2826
|
-
function pinTableColumnUpdater(state, _ref29) {
|
|
2827
|
-
var dataId = _ref29.dataId,
|
|
2828
|
-
column = _ref29.column;
|
|
2829
|
-
var dataset = state.datasets[dataId];
|
|
2830
|
-
|
|
2831
|
-
if (!dataset) {
|
|
2832
|
-
return state;
|
|
2833
|
-
}
|
|
2834
|
-
|
|
2835
|
-
var newDataset = (0, _table.pinTableColumns)(dataset, column);
|
|
2836
|
-
return (0, _utils.set)(['datasets', dataId], newDataset, state);
|
|
2837
|
-
}
|
|
2838
|
-
/**
|
|
2839
|
-
* Copy column content as strings
|
|
2840
|
-
* @memberof visStateUpdaters
|
|
2841
|
-
* @public
|
|
2842
|
-
*/
|
|
2843
|
-
|
|
2844
|
-
|
|
2845
|
-
function copyTableColumnUpdater(state, _ref30) {
|
|
2846
|
-
var dataId = _ref30.dataId,
|
|
2847
|
-
column = _ref30.column;
|
|
2848
|
-
var dataset = state.datasets[dataId];
|
|
2849
|
-
|
|
2850
|
-
if (!dataset) {
|
|
2851
|
-
return state;
|
|
2852
|
-
}
|
|
2853
|
-
|
|
2854
|
-
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
2855
|
-
return f.name === column;
|
|
2856
|
-
});
|
|
2857
|
-
|
|
2858
|
-
if (fieldIdx < 0) {
|
|
2859
|
-
return state;
|
|
2860
|
-
}
|
|
2861
|
-
|
|
2862
|
-
var type = dataset.fields[fieldIdx].type;
|
|
2863
|
-
var text = dataset.dataContainer.map(function (row) {
|
|
2864
|
-
return (0, _utils.parseFieldValue)(row.valueAt(fieldIdx), type);
|
|
2865
|
-
}, true).join('\n');
|
|
2866
|
-
(0, _copyToClipboard["default"])(text);
|
|
2867
|
-
return state;
|
|
2868
|
-
}
|
|
2869
|
-
/**
|
|
2870
|
-
* Set display format from columns from user selection
|
|
2871
|
-
* @memberof visStateUpdaters
|
|
2872
|
-
* @public
|
|
2873
|
-
*/
|
|
2874
|
-
|
|
2875
|
-
|
|
2876
|
-
function setColumnDisplayFormatUpdater(state, _ref31) {
|
|
2877
|
-
var dataId = _ref31.dataId,
|
|
2878
|
-
formats = _ref31.formats;
|
|
2879
|
-
var dataset = state.datasets[dataId];
|
|
2880
|
-
|
|
2881
|
-
if (!dataset) {
|
|
2882
|
-
return state;
|
|
2883
|
-
}
|
|
2884
|
-
|
|
2885
|
-
var newFields = dataset.fields;
|
|
2886
|
-
Object.keys(formats).forEach(function (column) {
|
|
2887
|
-
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
2888
|
-
return f.name === column;
|
|
2889
|
-
});
|
|
2890
|
-
|
|
2891
|
-
if (fieldIdx >= 0) {
|
|
2892
|
-
var displayFormat = formats[column];
|
|
2893
|
-
var field = newFields[fieldIdx];
|
|
2894
|
-
newFields = (0, _composerHelpers.swap_)((0, _composerHelpers.merge_)({
|
|
2895
|
-
displayFormat: displayFormat
|
|
2896
|
-
})(field))(newFields);
|
|
2897
|
-
}
|
|
2898
|
-
});
|
|
2899
|
-
var newDataset = (0, _table.copyTableAndUpdate)(dataset, {
|
|
2900
|
-
fields: newFields
|
|
2901
|
-
});
|
|
2902
|
-
return (0, _composerHelpers.pick_)('datasets')((0, _composerHelpers.merge_)((0, _defineProperty2["default"])({}, dataId, newDataset)))(state);
|
|
2903
|
-
}
|
|
2904
|
-
/**
|
|
2905
|
-
* Update editor
|
|
2906
|
-
*/
|
|
2907
|
-
|
|
2908
|
-
|
|
2909
|
-
function toggleEditorVisibilityUpdater(state, action) {
|
|
2910
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2911
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
2912
|
-
visible: !state.editor.visible
|
|
2913
|
-
})
|
|
2914
|
-
});
|
|
2915
|
-
}
|
|
2916
|
-
|
|
2917
|
-
function setFilterAnimationTimeConfigUpdater(state, _ref32) {
|
|
2918
|
-
var idx = _ref32.idx,
|
|
2919
|
-
config = _ref32.config;
|
|
2920
|
-
var oldFilter = state.filters[idx];
|
|
2921
|
-
|
|
2922
|
-
if (!oldFilter) {
|
|
2923
|
-
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
2924
|
-
|
|
2925
|
-
return state;
|
|
2926
|
-
}
|
|
2927
|
-
|
|
2928
|
-
if (oldFilter.type !== _constants.FILTER_TYPES.timeRange) {
|
|
2929
|
-
_window.console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
|
|
2930
|
-
|
|
2931
|
-
return state;
|
|
2932
|
-
}
|
|
2933
|
-
|
|
2934
|
-
var updates = checkTimeConfigArgs(config);
|
|
2935
|
-
return (0, _composerHelpers.pick_)('filters')((0, _composerHelpers.swap_)((0, _composerHelpers.merge_)(updates)(oldFilter)))(state);
|
|
2936
|
-
}
|
|
2937
|
-
|
|
2938
|
-
function checkTimeConfigArgs(config) {
|
|
2939
|
-
var allowed = ['timeFormat', 'timezone'];
|
|
2940
|
-
return Object.keys(config).reduce(function (accu, prop) {
|
|
2941
|
-
if (!allowed.includes(prop)) {
|
|
2942
|
-
_window.console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
|
|
2943
|
-
|
|
2944
|
-
return accu;
|
|
2945
|
-
} // here we are NOT checking if timezone or timeFormat input is valid
|
|
2946
|
-
|
|
2947
|
-
|
|
2948
|
-
accu[prop] = config[prop];
|
|
2949
|
-
return accu;
|
|
2950
|
-
}, {});
|
|
2951
|
-
}
|
|
2952
|
-
/**
|
|
2953
|
-
* Update editor
|
|
2954
|
-
*/
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
function setLayerAnimationTimeConfigUpdater(state, _ref33) {
|
|
2958
|
-
var config = _ref33.config;
|
|
2959
|
-
|
|
2960
|
-
if (!config) {
|
|
2961
|
-
return state;
|
|
2962
|
-
}
|
|
2963
|
-
|
|
2964
|
-
var updates = checkTimeConfigArgs(config);
|
|
2965
|
-
return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
|
|
2966
|
-
} // Find dataId from a saved visState property:
|
|
2967
|
-
// layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
|
|
2968
|
-
// replace it with another dataId
|
|
2969
|
-
|
|
2970
|
-
|
|
2971
|
-
function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
|
|
2972
|
-
var _value$config, _value$config2;
|
|
2973
|
-
|
|
2974
|
-
if (Array.isArray(value)) {
|
|
2975
|
-
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
2976
|
-
var replaced = value.map(function (v) {
|
|
2977
|
-
return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
|
|
2978
|
-
}).filter(function (d) {
|
|
2979
|
-
return d;
|
|
2980
|
-
});
|
|
2981
|
-
return replaced.length ? replaced : null;
|
|
2982
|
-
}
|
|
2983
|
-
|
|
2984
|
-
if (typeof value.dataId === 'string' && value.dataId === dataId) {
|
|
2985
|
-
// others
|
|
2986
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
2987
|
-
dataId: dataIdToReplace
|
|
2988
|
-
});
|
|
2989
|
-
} else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
|
|
2990
|
-
// filter
|
|
2991
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
2992
|
-
dataId: value.dataId.map(function (d) {
|
|
2993
|
-
return d === dataId ? dataIdToReplace : d;
|
|
2994
|
-
})
|
|
2995
|
-
});
|
|
2996
|
-
} else if ((_value$config = value.config) !== null && _value$config !== void 0 && _value$config.dataId && ((_value$config2 = value.config) === null || _value$config2 === void 0 ? void 0 : _value$config2.dataId) === dataId) {
|
|
2997
|
-
// layer
|
|
2998
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
2999
|
-
config: _objectSpread(_objectSpread({}, value.config), {}, {
|
|
3000
|
-
dataId: dataIdToReplace
|
|
3001
|
-
})
|
|
3002
|
-
});
|
|
3003
|
-
} else if ((0, _utils.isObject)(value) && value.hasOwnProperty(dataId)) {
|
|
3004
|
-
// for value saved as {[dataId]: {...}}
|
|
3005
|
-
return (0, _defineProperty2["default"])({}, dataIdToReplace, value[dataId]);
|
|
3006
|
-
}
|
|
3007
|
-
|
|
3008
|
-
return null;
|
|
3009
|
-
} // Find datasetIds derived a saved visState Property;
|
|
3010
|
-
|
|
3011
|
-
|
|
3012
|
-
function findChildDatasetIds(value) {
|
|
3013
|
-
var _value$newDataset;
|
|
3014
|
-
|
|
3015
|
-
if (Array.isArray(value)) {
|
|
3016
|
-
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
3017
|
-
var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
|
|
3018
|
-
return d;
|
|
3019
|
-
});
|
|
3020
|
-
return childDataIds.length ? childDataIds : null;
|
|
3021
|
-
} // child data id usually stores in the derived dataset info
|
|
3022
|
-
|
|
3023
|
-
|
|
3024
|
-
return (value === null || value === void 0 ? void 0 : (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
|
|
3025
|
-
} // moved unmerged layers, filters, interactions
|
|
3026
|
-
|
|
3027
|
-
|
|
3028
|
-
function moveValueToBeMerged(state, propValues, _ref35) {
|
|
3029
|
-
var prop = _ref35.prop,
|
|
3030
|
-
toMergeProp = _ref35.toMergeProp,
|
|
3031
|
-
saveUnmerged = _ref35.saveUnmerged;
|
|
3032
|
-
|
|
3033
|
-
// remove prop value from state
|
|
3034
|
-
// TODO: should we add remove updater to merger as well?
|
|
3035
|
-
if (!propValues) {
|
|
3036
|
-
return state;
|
|
3037
|
-
}
|
|
3038
|
-
|
|
3039
|
-
var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
|
|
3040
|
-
return removeLayerUpdater(accu, {
|
|
3041
|
-
id: propValue.id
|
|
3042
|
-
});
|
|
3043
|
-
}, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, state[prop].filter(function (p) {
|
|
3044
|
-
return !propValues.find(function (propValue) {
|
|
3045
|
-
return p.id === propValue.id;
|
|
3046
|
-
});
|
|
3047
|
-
}))) : // if not array, we won't remove it, remove dataset should handle it
|
|
3048
|
-
state; // move to stateToBeMerged
|
|
3049
|
-
|
|
3050
|
-
var toBeMerged = (0, _defineProperty2["default"])({}, toMergeProp, saveUnmerged ? // call merge saveUnmerged method
|
|
3051
|
-
saveUnmerged(stateRemoved, propValues) : // if toMergeProp is araay, append to it
|
|
3052
|
-
Array.isArray(stateRemoved[toMergeProp]) ? [].concat((0, _toConsumableArray2["default"])(stateRemoved[toMergeProp]), (0, _toConsumableArray2["default"])(propValues)) : // save propValues to toMerge
|
|
3053
|
-
(0, _utils.isObject)(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
|
|
3054
|
-
return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
|
|
3055
|
-
}
|
|
3056
|
-
|
|
3057
|
-
function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
|
|
3058
|
-
return (0, _composerHelpers.compose_)([(0, _composerHelpers.apply_)(replaceDatasetDepsInState, {
|
|
3059
|
-
dataId: dataId,
|
|
3060
|
-
dataIdToUse: dataIdToUse
|
|
3061
|
-
}), (0, _composerHelpers.apply_)(removeDatasetUpdater, {
|
|
3062
|
-
dataId: dataId
|
|
3063
|
-
})])(state);
|
|
3064
|
-
}
|
|
3065
|
-
|
|
3066
|
-
function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
|
|
3067
|
-
var _nextState$layerToBeM;
|
|
3068
|
-
|
|
3069
|
-
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3070
|
-
var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse); // make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
|
|
3071
|
-
|
|
3072
|
-
var preserveLayerOrder = (0, _toConsumableArray2["default"])(state.layerOrder); // preserve dataset order
|
|
3073
|
-
|
|
3074
|
-
nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
|
|
3075
|
-
return d === dataId ? dataIdToUse : d;
|
|
3076
|
-
}); // preserveLayerOrder
|
|
3077
|
-
|
|
3078
|
-
if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
|
|
3079
|
-
var _serializedState$spli;
|
|
3080
|
-
|
|
3081
|
-
// copy split maps to be merged, because it will be reset in remove layer
|
|
3082
|
-
nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
|
|
3083
|
-
nextState.layerOrder = (0, _toConsumableArray2["default"])(preserveLayerOrder);
|
|
3084
|
-
}
|
|
3085
|
-
|
|
3086
|
-
return nextState;
|
|
3087
|
-
}
|
|
3088
|
-
|
|
3089
|
-
function replaceDatasetDepsInState(state, _ref36) {
|
|
3090
|
-
var dataId = _ref36.dataId,
|
|
3091
|
-
dataIdToUse = _ref36.dataIdToUse;
|
|
3092
|
-
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3093
|
-
var nextState = state.mergers.reduce(function (accuState, _ref37) {
|
|
3094
|
-
var prop = _ref37.prop,
|
|
3095
|
-
toMergeProp = _ref37.toMergeProp,
|
|
3096
|
-
replaceParentDatasetIds = _ref37.replaceParentDatasetIds,
|
|
3097
|
-
getChildDatasetIds = _ref37.getChildDatasetIds,
|
|
3098
|
-
saveUnmerged = _ref37.saveUnmerged,
|
|
3099
|
-
preserveOrder = _ref37.preserveOrder;
|
|
3100
|
-
// get dataset ids that are depends on this dataset
|
|
3101
|
-
var props = (0, _utils.toArray)(prop);
|
|
3102
|
-
var toMergeProps = (0, _utils.toArray)(toMergeProp);
|
|
3103
|
-
var savedProps = serializedState ? props.map(function (p) {
|
|
3104
|
-
return serializedState[p];
|
|
3105
|
-
}) : [];
|
|
3106
|
-
var replacedState = accuState;
|
|
3107
|
-
savedProps.forEach(function (propValue, i) {
|
|
3108
|
-
var _replacedState$merger;
|
|
3109
|
-
|
|
3110
|
-
var mergerOptions = {
|
|
3111
|
-
prop: props[i],
|
|
3112
|
-
toMergeProp: toMergeProps[i],
|
|
3113
|
-
getChildDatasetIds: getChildDatasetIds,
|
|
3114
|
-
saveUnmerged: saveUnmerged
|
|
3115
|
-
};
|
|
3116
|
-
var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
|
|
3117
|
-
replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
|
|
3118
|
-
|
|
3119
|
-
if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
|
|
3120
|
-
replacedState[preserveOrder] = propValue.map(function (item) {
|
|
3121
|
-
return item.id;
|
|
3122
|
-
});
|
|
3123
|
-
}
|
|
3124
|
-
});
|
|
3125
|
-
return replacedState;
|
|
3126
|
-
}, state);
|
|
3127
|
-
return nextState;
|
|
3128
|
-
}
|
|
3129
|
-
|
|
3130
|
-
function replacePropValueInState(state, replacedItem, _ref38) {
|
|
3131
|
-
var prop = _ref38.prop,
|
|
3132
|
-
toMergeProp = _ref38.toMergeProp,
|
|
3133
|
-
getChildDatasetIds = _ref38.getChildDatasetIds,
|
|
3134
|
-
saveUnmerged = _ref38.saveUnmerged;
|
|
3135
|
-
// prop is depends on the dataset to be replaced
|
|
3136
|
-
// remove prop from state, and move it to toBeMerged
|
|
3137
|
-
var nextState = moveValueToBeMerged(state, replacedItem, {
|
|
3138
|
-
prop: prop,
|
|
3139
|
-
toMergeProp: toMergeProp,
|
|
3140
|
-
saveUnmerged: saveUnmerged
|
|
3141
|
-
});
|
|
3142
|
-
var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
|
|
3143
|
-
|
|
3144
|
-
if (childDataIds) {
|
|
3145
|
-
nextState = (0, _utils.toArray)(childDataIds).reduce(function (accu, childDataId) {
|
|
3146
|
-
// shouldn't need to change child dataset id,
|
|
3147
|
-
// but still need to move out of state and merge back in
|
|
3148
|
-
return replaceDatasetAndDeps(accu, childDataId, childDataId);
|
|
3149
|
-
}, nextState);
|
|
3150
|
-
}
|
|
3151
|
-
|
|
3152
|
-
return nextState;
|
|
3153
|
-
}
|
|
3154
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy92aXMtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsidmlzU3RhdGVVcGRhdGVycyIsImRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyIsInRvb2x0aXAiLCJpZCIsImxhYmVsIiwiZW5hYmxlZCIsImNvbmZpZyIsImZpZWxkc1RvU2hvdyIsImNvbXBhcmVNb2RlIiwiY29tcGFyZVR5cGUiLCJDT01QQVJFX1RZUEVTIiwiQUJTT0xVVEUiLCJnZW9jb2RlciIsInBvc2l0aW9uIiwiYnJ1c2giLCJzaXplIiwiY29vcmRpbmF0ZSIsIkRFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyIsImRvbWFpbiIsImN1cnJlbnRUaW1lIiwic3BlZWQiLCJpc0FuaW1hdGluZyIsInRpbWVGb3JtYXQiLCJ0aW1lem9uZSIsImRlZmF1bHRUaW1lRm9ybWF0IiwiaGlkZUNvbnRyb2wiLCJkdXJhdGlvbiIsIkRFRkFVTFRfRURJVE9SIiwibW9kZSIsIkVESVRPUl9NT0RFUyIsIkRSQVdfUE9MWUdPTiIsImZlYXR1cmVzIiwic2VsZWN0ZWRGZWF0dXJlIiwidmlzaWJsZSIsIklOSVRJQUxfVklTX1NUQVRFIiwibWFwSW5mbyIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJsYXllcnMiLCJsYXllckRhdGEiLCJsYXllclRvQmVNZXJnZWQiLCJsYXllck9yZGVyIiwiZmlsdGVycyIsImZpbHRlclRvQmVNZXJnZWQiLCJkYXRhc2V0cyIsImVkaXRpbmdEYXRhc2V0IiwidW5kZWZpbmVkIiwiZWZmZWN0cyIsImVmZmVjdE9yZGVyIiwiaW50ZXJhY3Rpb25Db25maWciLCJpbnRlcmFjdGlvblRvQmVNZXJnZWQiLCJsYXllckJsZW5kaW5nIiwib3ZlcmxheUJsZW5kaW5nIiwiaG92ZXJJbmZvIiwiY2xpY2tlZCIsIm1vdXNlUG9zIiwibWF4RGVmYXVsdFRvb2x0aXBzIiwiTUFYX0RFRkFVTFRfVE9PTFRJUFMiLCJzcGxpdE1hcHMiLCJzcGxpdE1hcHNUb0JlTWVyZ2VkIiwiaXNNZXJnaW5nRGF0YXNldHMiLCJsYXllckNsYXNzZXMiLCJMYXllckNsYXNzZXMiLCJhbmltYXRpb25Db25maWciLCJlZGl0b3IiLCJmaWxlTG9hZGluZyIsImZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJsb2FkZXJzIiwibG9hZE9wdGlvbnMiLCJtZXJnZXJzIiwiVklTX1NUQVRFX01FUkdFUlMiLCJzY2hlbWEiLCJLZXBsZXJHTFNjaGVtYSIsInVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YSIsInN0YXRlIiwibGF5ZXIiLCJpZHgiLCJtYXAiLCJseXIiLCJpIiwiZCIsInVwZGF0ZVN0YXRlT25MYXllclZpc2liaWxpdHlDaGFuZ2UiLCJuZXdTdGF0ZSIsImxlbmd0aCIsImlzVmlzaWJsZSIsImFuaW1hdGlvbiIsInVwZGF0ZUFuaW1hdGlvbkRvbWFpbiIsInBpY2tDaGFuZ2VkUHJvcHMiLCJwcmV2IiwibmV4dCIsImNoYW5nZWRQcm9wcyIsInBpY2tQcm9wc09mIiwib2JqIiwiT2JqZWN0Iiwia2V5cyIsImZvckVhY2giLCJrZXkiLCJoYXNPd25Qcm9wZXJ0eSIsIlZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMiLCJhcHBseUxheWVyQ29uZmlnVXBkYXRlciIsImFjdGlvbiIsIm9sZExheWVySWQiLCJuZXdMYXllckNvbmZpZyIsImxheWVySW5kZXgiLCJuZXdQYXJzZWRMYXllciIsIm9sZExheWVyIiwiZmluZCIsImwiLCJkYXRhc2V0IiwiZGF0YUlkIiwibmV3TGF5ZXIiLCJuZXh0U3RhdGUiLCJ0eXBlIiwib2xkTGF5ZXJJbmRleCIsImZpbmRJbmRleCIsImxheWVyVHlwZUNoYW5nZVVwZGF0ZXIiLCJuZXdMYXllcklkIiwic2VyaWFsaXplZE9sZExheWVyIiwic2VyaWFsaXplZE5ld0xheWVyIiwiY2hhbmdlZCIsInZpc0NvbmZpZyIsImxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlciIsInZpc3VhbENoYW5uZWxzIiwiY2hhbm5lbE5hbWUiLCJjaGFubmVsIiwiY2hhbm5lbFByb3BOYW1lcyIsInByb3AiLCJzb21lIiwibGF5ZXJWaXN1YWxDaGFubmVsQ2hhbmdlVXBkYXRlciIsImxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlciIsInByb3BzIiwibmV3Q29uZmlnIiwicmVzdENvbmZpZyIsInN0YXRlV2l0aERhdGFJZCIsImxheWVyRGF0YUlkQ2hhbmdlVXBkYXRlciIsIm5leHRMYXllciIsInVwZGF0ZUxheWVyQ29uZmlnIiwic2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhIiwib2xkTGF5ZXJEYXRhIiwidXBkYXRlTGF5ZXJEYXRhUmVzdWx0IiwibGF5ZXJTZXRJc1ZhbGlkVXBkYXRlciIsImlzVmFsaWQiLCJsYXllclRvVXBkYXRlIiwibmV3RGF0YSIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsImRlZmF1bHRUZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJuZXdUZXh0TGFiZWwiLCJzbGljZSIsImN1cnJlbnRGaWVsZHMiLCJ0bCIsImZpZWxkIiwibmFtZSIsImZpbHRlciIsImFkZEZpZWxkcyIsImYiLCJpbmNsdWRlcyIsImRlbGV0ZUZpZWxkcyIsImZkIiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJ2YWx1ZSIsInNwbGljZSIsImxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlciIsImdldERlZmF1bHRMYXllckNvbmZpZyIsInZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhIiwibG9hZGVkTGF5ZXIiLCJhbGxvd0VtcHR5Q29sdW1uIiwiaXNWYWxpZFRvU2F2ZSIsInZhbGlkYXRlZCIsImlzQ29uZmlnQWN0aXZlIiwidXBkYXRlTGF5ZXJEb21haW4iLCJzZXRJbml0aWFsTGF5ZXJDb25maWciLCJyZXN1bHQiLCJmaW5kRGVmYXVsdExheWVyUHJvcHMiLCJBcnJheSIsImlzQXJyYXkiLCJuZXdUeXBlIiwib2xkSWQiLCJDb25zb2xlIiwiZXJyb3IiLCJhc3NpZ25Db25maWdUb0xheWVyIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJpc0xheWVySG92ZXJlZCIsInNldHRpbmdzIiwib2xkTGF5ZXJNYXAiLCJvdGhlckxheWVycyIsImxheWVySWQiLCJ1cGRhdGVMYXllclZpc3VhbENoYW5uZWwiLCJuZXdWaXNDb25maWciLCJzZXRGaWx0ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsInNldEZpbHRlclVwZGF0ZXIiLCJzZXRGaWx0ZXJBbmltYXRpb25XaW5kb3dVcGRhdGVyIiwiYW5pbWF0aW9uV2luZG93IiwidmFsdWVJbmRleCIsIm9sZEZpbHRlciIsIm5ld0ZpbHRlciIsImRhdGFzZXRJZHMiLCJGSUxURVJfVVBEQVRFUl9QUk9QUyIsImRhdGFzZXRJZCIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJsYXllcklkRGlmZmVyZW5jZSIsImxheWVyRGF0YUlkcyIsImxpZCIsIm5ld0RhdGFJZHMiLCJlbmxhcmdlZEZpbHRlciIsInZpZXciLCJGSUxURVJfVklFV19UWVBFUyIsImVubGFyZ2VkIiwic2lkZSIsImRhdGFzZXRJZHNUb0ZpbHRlciIsIkxJTUlURURfRklMVEVSX0VGRkVDVF9QUk9QUyIsImZpbHRlcmVkRGF0YXNldHMiLCJ1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEiLCJzZXRGaWx0ZXJQbG90VXBkYXRlciIsIm5ld1Byb3AiLCJwbG90VHlwZSIsImFkZEZpbHRlclVwZGF0ZXIiLCJsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyIiwib2xkVml4Q29uZmlnIiwidXBkYXRlTGF5ZXJDb2xvclVJIiwidG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciIsInRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIiLCJ1cGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJzZXRGaWx0ZXJWaWV3VXBkYXRlciIsInNob3VsZFJlc2V0T3RoZXJGaWx0ZXJzVmlldyIsInRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyIiwicmVtb3ZlRmlsdGVyVXBkYXRlciIsIm5ld0ZpbHRlcnMiLCJuZXdFZGl0b3IiLCJhZGRMYXllclVwZGF0ZXIiLCJuZXdMYXllckRhdGEiLCJ3YXJuIiwiZGVmYXVsdERhdGFzZXQiLCJMYXllciIsInJlbW92ZUxheWVyVXBkYXRlciIsIk51bWJlciIsImlzRmluaXRlIiwibGF5ZXJUb1JlbW92ZSIsInJlb3JkZXJMYXllclVwZGF0ZXIiLCJvcmRlciIsImR1cGxpY2F0ZUxheWVyVXBkYXRlciIsIm9yaWdpbmFsIiwib3JpZ2luYWxMYXllck9yZGVySWR4IiwibmV3TGFiZWwiLCJwb3N0Zml4IiwiTEFZRVJfSURfTEVOR1RIIiwibmV3TGF5ZXJPcmRlciIsImFkZEVmZmVjdFVwZGF0ZXIiLCJuZXdFZmZlY3QiLCJlZmZlY3QiLCJzZXRQcm9wcyIsInJlbW92ZUVmZmVjdFVwZGF0ZXIiLCJlZmZlY3RUb1JlbW92ZSIsImVmZmVjdElkIiwicmVvcmRlckVmZmVjdFVwZGF0ZXIiLCJ1cGRhdGVFZmZlY3RVcGRhdGVyIiwiaWR4MiIsImVmZmVjdE9yZGVySWQiLCJuZXdFZmZlY3RzIiwicmVtb3ZlRGF0YXNldFVwZGF0ZXIiLCJkYXRhc2V0S2V5IiwibmV3RGF0YXNldHMiLCJsYXllcnNUb1JlbW92ZSIsInJlZHVjZSIsImFjY3UiLCJyZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnIiwiZmllbGRzIiwidXBkYXRlTGF5ZXJCbGVuZGluZ1VwZGF0ZXIiLCJ1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyIiwic2hvd0RhdGFzZXRUYWJsZVVwZGF0ZXIiLCJ1cGRhdGVUYWJsZUNvbG9yVXBkYXRlciIsInVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIiLCJjb2xvciIsIm5ld0NvbG9yIiwicmVzZXRNYXBDb25maWdVcGRhdGVyIiwiaW5pdGlhbFN0YXRlIiwicmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIiLCJwYXlsb2FkIiwib3B0aW9ucyIsInZpc1N0YXRlIiwia2VlcEV4aXN0aW5nQ29uZmlnIiwibWVyZ2VkU3RhdGUiLCJtZXJnZXIiLCJtZXJnZSIsInRvTWVyZ2VQcm9wIiwibGF5ZXJIb3ZlclVwZGF0ZXIiLCJpbmZvIiwiaW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyIiwiY29udHJhZGljdCIsImsiLCJsYXllckNsaWNrVXBkYXRlciIsInBpbm5lZCIsInBpY2tlZCIsIm1hcENsaWNrVXBkYXRlciIsIm1vdXNlTW92ZVVwZGF0ZXIiLCJldnQiLCJ2YWx1ZXMiLCJwb2ludCIsIm1vdXNlUG9zaXRpb24iLCJsbmdMYXQiLCJ0b2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJkdXBsaWNhdGUiLCJjbG9zZVNwZWNpZmljTWFwQXRJbmRleCIsInRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlciIsIm1hcEluZGV4Iiwic20iLCJ1cGRhdGVWaXNEYXRhVXBkYXRlciIsInByZXZpb3VzU3RhdGUiLCJuZXdEYXRhRW50cmllcyIsInJlc3QiLCJsYXllck1lcmdlcnMiLCJtIiwid2FpdEZvckxheWVyRGF0YSIsImRhdGFzZXRNZXJnZXJzIiwicG9zdE1lcmdlclBheWxvYWQiLCJhcHBseU1lcmdlcnNVcGRhdGVyIiwibWVyZ2VTdGF0ZVJlc3VsdCIsImFsbE1lcmdlZCIsInBvc3RNZXJnZVVwZGF0ZXIiLCJmRGF0YUlkIiwiZGF0YXNldEZpbHRlcmVkIiwiZGF0YUVtcHR5IiwibmV3TGF5ZXJzIiwiYXV0b0NyZWF0ZUxheWVycyIsImFkZERlZmF1bHRMYXllcnMiLCJ0b29sdGlwRmllbGRzIiwiYXV0b0NyZWF0ZVRvb2x0aXBzIiwiYWRkRGVmYXVsdFRvb2x0aXBzIiwidXBkYXRlZERhdGFzZXRzIiwiY29uY2F0IiwidXBkYXRlZFN0YXRlIiwicmVuYW1lRGF0YXNldFVwZGF0ZXIiLCJBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTIiwidmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMiLCJ2YWxpZGF0ZWRQcm9wcyIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsImV4aXN0aW5nIiwiaW5kZXhUb1JldHJpZXZlIiwibWFwTGF5ZXJzIiwibG9hZEZpbGVzVXBkYXRlciIsImZpbGVzIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiZnJvbSIsImluaXRpYWxGaWxlTG9hZGluZ1Byb2dyZXNzIiwiZmlsZUNhY2hlIiwiZmlsZXNUb0xvYWQiLCJsb2FkTmV4dEZpbGVVcGRhdGVyIiwibG9hZEZpbGVTdGVwU3VjY2Vzc1VwZGF0ZXIiLCJmaWxlTmFtZSIsInN0YXRlV2l0aFByb2dyZXNzIiwidXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIiLCJwcm9ncmVzcyIsInBlcmNlbnQiLCJtZXNzYWdlIiwic3RhdGVXaXRoQ2FjaGUiLCJsb2FkTmV4dEZpbGUiLCJmaWxlIiwicmVtYWluaW5nRmlsZXNUb0xvYWQiLCJtYWtlTG9hZEZpbGVUYXNrIiwiYmltYXAiLCJnZW4iLCJjb250ZW50IiwiZXJyIiwicHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlciIsInBhcnNlUHJvZ3Jlc3MiLCJwcmV2UHJvZ3Jlc3MiLCJuZXh0RmlsZUJhdGNoVXBkYXRlciIsImFjY3VtdWxhdGVkIiwiZW5kc1dpdGgiLCJkYXRhIiwiZG9uZSIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJhcHBseUNQVUZpbHRlclVwZGF0ZXIiLCJkYXRhSWRzIiwic2V0TWFwSW5mb1VwZGF0ZXIiLCJlbXB0eSIsImRlZmF1bHRMYXllcnMiLCJmb3VuZExheWVycyIsIm1lcmdlZCIsImluZGV4IiwiZml4ZWREb21haW4iLCJwdXNoIiwiYW5pbWF0YWJsZUxheWVycyIsImFuaW1hdGlvbkRvbWFpbiIsIm1lcmdlZERvbWFpbiIsIk1hdGgiLCJtaW4iLCJtYXgiLCJJbmZpbml0eSIsInNldEVkaXRvck1vZGVVcGRhdGVyIiwic2V0RmVhdHVyZXNVcGRhdGVyIiwibGFzdEZlYXR1cmUiLCJwcm9wZXJ0aWVzIiwiaXNDbG9zZWQiLCJFRElUIiwiZmVhdHVyZSIsImZpbHRlcklkIiwiYmJveCIsImZlYXR1cmVWYWx1ZSIsImZpbHRlcklkeCIsImZpbCIsInNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIiLCJzZWxlY3Rpb25Db250ZXh0IiwiZGVsZXRlRmVhdHVyZVVwZGF0ZXIiLCJzZXRQb2x5Z29uRmlsdGVyTGF5ZXJVcGRhdGVyIiwibm9uZUZpbHRlckZlYXR1cmUiLCJpc0xheWVySW5jbHVkZWQiLCJzb3J0VGFibGVDb2x1bW5VcGRhdGVyIiwiY29sdW1uIiwic29ydE1vZGUiLCJjdXJyZW50TW9kZSIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJzb3J0ZWQiLCJwaW5UYWJsZUNvbHVtblVwZGF0ZXIiLCJjb3B5VGFibGVDb2x1bW5VcGRhdGVyIiwiZmllbGRJZHgiLCJ0ZXh0IiwiZGF0YUNvbnRhaW5lciIsInJvdyIsInZhbHVlQXQiLCJqb2luIiwic2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIiLCJmb3JtYXRzIiwiZGlzcGxheUZvcm1hdCIsInRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyIiwic2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ1VwZGF0ZXIiLCJGSUxURVJfVFlQRVMiLCJ0aW1lUmFuZ2UiLCJ1cGRhdGVzIiwiY2hlY2tUaW1lQ29uZmlnQXJncyIsImFsbG93ZWQiLCJzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiZGVmYXVsdFJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIiwiZGF0YUlkVG9SZXBsYWNlIiwicmVwbGFjZWQiLCJ2IiwiZmluZENoaWxkRGF0YXNldElkcyIsImNoaWxkRGF0YUlkcyIsIm1vdmVWYWx1ZVRvQmVNZXJnZWQiLCJwcm9wVmFsdWVzIiwic2F2ZVVubWVyZ2VkIiwic3RhdGVSZW1vdmVkIiwicHJvcFZhbHVlIiwicCIsInRvQmVNZXJnZWQiLCJyZXBsYWNlRGF0YXNldEFuZERlcHMiLCJkYXRhSWRUb1VzZSIsInJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSIsInNlcmlhbGl6ZWRTdGF0ZSIsInByZXNlcnZlTGF5ZXJPcmRlciIsInByZXNlcnZlRGF0YXNldE9yZGVyIiwiYWNjdVN0YXRlIiwicmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJnZXRDaGlsZERhdGFzZXRJZHMiLCJwcmVzZXJ2ZU9yZGVyIiwidG9NZXJnZVByb3BzIiwic2F2ZWRQcm9wcyIsInJlcGxhY2VkU3RhdGUiLCJtZXJnZXJPcHRpb25zIiwicmVwbGFjZWRJdGVtIiwicmVwbGFjZVByb3BWYWx1ZUluU3RhdGUiLCJpdGVtIiwiY2hpbGREYXRhSWQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBQ0E7O0FBRUE7O0FBRUE7O0FBbUJBOztBQTZCQTs7QUFRQTs7QUFDQTs7QUFDQTs7QUFTQTs7QUFVQTs7QUFLQTs7QUFDQTs7QUFTQTs7QUFJQTs7Ozs7Ozs7Ozs7Ozs7OztBQUVBO0FBQ0E7QUFDQTtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOztBQUNBLElBQU1BLGdCQUFnQixHQUFHLElBQXpCO0FBQ0E7O0FBRU8sSUFBTUMsd0JBQTJDLEdBQUc7QUFDekRDLEVBQUFBLE9BQU8sRUFBRTtBQUNQQyxJQUFBQSxFQUFFLEVBQUUsU0FERztBQUVQQyxJQUFBQSxLQUFLLEVBQUUsc0JBRkE7QUFHUEMsSUFBQUEsT0FBTyxFQUFFLElBSEY7QUFJ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dEJEO0FBd0JBLFdBQU9vZCxhQUFQO0FBQ0QsR0FwQ2UsRUFxQ2hCN1ksS0FyQ2dCLENBQWxCO0FBd0NBLFNBQU9xQyxTQUFQO0FBQ0Q7O0FBRUQsU0FBUzJXLHVCQUFULENBQ0VoWixLQURGLEVBRUUrWSxZQUZGLFVBSUU7QUFBQSxNQURDM1YsSUFDRCxVQURDQSxJQUNEO0FBQUEsTUFET3VLLFdBQ1AsVUFET0EsV0FDUDtBQUFBLE1BRG9COEssa0JBQ3BCLFVBRG9CQSxrQkFDcEI7QUFBQSxNQUR3Q2QsWUFDeEMsVUFEd0NBLFlBQ3hDO0FBQ0E7QUFDQTtBQUNBLE1BQUl0VixTQUFTLEdBQUdvVixtQkFBbUIsQ0FBQ3pYLEtBQUQsRUFBUStZLFlBQVIsRUFBc0I7QUFBQzNWLElBQUFBLElBQUksRUFBSkEsSUFBRDtBQUFPdUssSUFBQUEsV0FBVyxFQUFYQSxXQUFQO0FBQW9CZ0ssSUFBQUEsWUFBWSxFQUFaQTtBQUFwQixHQUF0QixDQUFuQztBQUNBLE1BQU1ILFlBQVksR0FBRyxDQUFBaUIsa0JBQWtCLFNBQWxCLElBQUFBLGtCQUFrQixXQUFsQixZQUFBQSxrQkFBa0IsQ0FBR00sWUFBSCxDQUFsQixLQUFzQ3hCLG1CQUFtQixDQUFDd0IsWUFBRCxDQUE5RTs7QUFFQSxNQUFJdkIsWUFBSixFQUFrQjtBQUNoQm5WLElBQUFBLFNBQVMsR0FBRyxvQkFBUW1WLFlBQVIsRUFBc0JsTCxNQUF0QixDQUE2QixVQUFDQyxJQUFELEVBQU8yTSxXQUFQLEVBQXVCO0FBQzlEO0FBQ0E7QUFDQSxhQUFPbEIscUJBQXFCLENBQUN6TCxJQUFELEVBQU8yTSxXQUFQLEVBQW9CQSxXQUFwQixDQUE1QjtBQUNELEtBSlcsRUFJVDdXLFNBSlMsQ0FBWjtBQUtEOztBQUNELFNBQU9BLFNBQVA7QUFDRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBiYm94IGZyb20gJ0B0dXJmL2Jib3gnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IHtkaXNhYmxlU3RhY2tDYXB0dXJpbmcsIHdpdGhUYXNrfSBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcbmltcG9ydCBjbG9uZURlZXAgZnJvbSAnbG9kYXNoLmNsb25lZGVlcCc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gudW5pcSc7XG5pbXBvcnQgZ2V0IGZyb20gJ2xvZGFzaC5nZXQnO1xuaW1wb3J0IHhvciBmcm9tICdsb2Rhc2gueG9yJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcbmltcG9ydCBpc0VxdWFsIGZyb20gJ2xvZGFzaC5pc2VxdWFsJztcbmltcG9ydCBjb3B5IGZyb20gJ2NvcHktdG8tY2xpcGJvYXJkJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbi8vIFRhc2tzXG5pbXBvcnQge0xPQURfRklMRV9UQVNLLCBVTldSQVBfVEFTSywgUFJPQ0VTU19GSUxFX0RBVEEsIERFTEFZX1RBU0t9IGZyb20gJ0BrZXBsZXIuZ2wvdGFza3MnO1xuLy8gQWN0aW9uc1xuaW1wb3J0IHtcbiAgYXBwbHlMYXllckNvbmZpZyxcbiAgbGF5ZXJDb25maWdDaGFuZ2UsXG4gIGxheWVyVHlwZUNoYW5nZSxcbiAgbGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgbG9hZEZpbGVzRXJyLFxuICBsb2FkRmlsZXNTdWNjZXNzLFxuICBsb2FkRmlsZVN0ZXBTdWNjZXNzLFxuICBsb2FkTmV4dEZpbGUsXG4gIG5leHRGaWxlQmF0Y2gsXG4gIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLFxuICBWaXNTdGF0ZUFjdGlvbnMsXG4gIE1hcFN0YXRlQWN0aW9ucyxcbiAgcHJvY2Vzc0ZpbGVDb250ZW50LFxuICBBY3Rpb25UeXBlc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgc2V0LFxuICB0b0FycmF5LFxuICBhcnJheUluc2VydCxcbiAgZ2VuZXJhdGVIYXNoSWQsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGlzT2JqZWN0LFxuICBhZGROZXdMYXllcnNUb1NwbGl0TWFwLFxuICBjb21wdXRlU3BsaXRNYXBMYXllcnMsXG4gIHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyxcbiAgaXNSZ2JDb2xvcixcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICBhcHBseUZpbHRlckZpZWxkTmFtZSxcbiAgYXBwbHlGaWx0ZXJzVG9EYXRhc2V0cyxcbiAgZmVhdHVyZVRvRmlsdGVyVmFsdWUsXG4gIGZpbHRlckRhdGFzZXRDUFUsXG4gIEZJTFRFUl9VUERBVEVSX1BST1BTLFxuICBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIsXG4gIGdldERlZmF1bHRGaWx0ZXIsXG4gIGdldEZpbHRlcklkSW5GZWF0dXJlLFxuICBnZXRUaW1lV2lkZ2V0VGl0bGVGb3JtYXR0ZXIsXG4gIGlzSW5SYW5nZSxcbiAgTElNSVRFRF9GSUxURVJfRUZGRUNUX1BST1BTLFxuICB1cGRhdGVGaWx0ZXJEYXRhSWQsXG4gIGdldEZpbHRlclBsb3QsXG4gIGdldERlZmF1bHRGaWx0ZXJQbG90VHlwZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcblxuLy8gTWVyZ2Vyc1xuaW1wb3J0IHtcbiAgVklTX1NUQVRFX01FUkdFUlMsXG4gIHZhbGlkYXRlTGF5ZXJXaXRoRGF0YSxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBzZXJpYWxpemVMYXllcixcbiAgc2VyaWFsaXplVmlzU3RhdGUsXG4gIHBhcnNlTGF5ZXJDb25maWdcbn0gZnJvbSAnLi92aXMtc3RhdGUtbWVyZ2VyJztcbmltcG9ydCB7bWVyZ2VTdGF0ZUZyb21NZXJnZXJzLCBpc1ZhbGlkTWVyZ2VyfSBmcm9tICcuL21lcmdlci1oYW5kbGVyJztcbmltcG9ydCB7TGF5ZXIsIExheWVyQ2xhc3NlcywgTEFZRVJfSURfTEVOR1RIfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBFRElUT1JfTU9ERVMsXG4gIFNPUlRfT1JERVIsXG4gIEZJTFRFUl9UWVBFUyxcbiAgRklMVEVSX1ZJRVdfVFlQRVMsXG4gIE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIENPTVBBUkVfVFlQRVNcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtcbiAgcGlja18sXG4gIG1lcmdlXyxcbiAgc3dhcF8sXG4gIGFwcGx5XyxcbiAgY29tcG9zZV8sXG4gIHJlbW92ZUVsZW1lbnRBdEluZGV4LFxuICBmaWx0ZXJPdXRCeUlkXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge1Zpc1N0YXRlLCBNZXJnZXIsIFBvc3RNZXJnZXJQYXlsb2FkfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge0ZpbHRlciwgSW50ZXJhY3Rpb25Db25maWcsIEFuaW1hdGlvbkNvbmZpZywgRWRpdG9yLCBGaWVsZH0gZnJvbSAnQGtlcGxlci5nbC90eXBlcyc7XG5pbXBvcnQge0xvYWRlcn0gZnJvbSAnQGxvYWRlcnMuZ2wvbG9hZGVyLXV0aWxzJztcblxuaW1wb3J0IHtjYWxjdWxhdGVMYXllckRhdGEsIGZpbmREZWZhdWx0TGF5ZXIsIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzfSBmcm9tICcuL2xheWVyLXV0aWxzJztcbmltcG9ydCB7XG4gIGNvcHlUYWJsZUFuZFVwZGF0ZSxcbiAgRGF0YXNldHMsXG4gIHBpblRhYmxlQ29sdW1ucyxcbiAgc29ydERhdGFzZXRCeUNvbHVtbixcbiAgYXNzaWduR3B1Q2hhbm5lbCxcbiAgc2V0RmlsdGVyR3B1TW9kZSxcbiAgY3JlYXRlTmV3RGF0YUVudHJ5XG59IGZyb20gJ0BrZXBsZXIuZ2wvdGFibGUnO1xuaW1wb3J0IHtmaW5kRmllbGRzVG9TaG93fSBmcm9tICcuL2ludGVyYWN0aW9uLXV0aWxzJztcbmltcG9ydCB7aGFzUHJvcHNUb01lcmdlLCBnZXRQcm9wVmFsdWVUb01lcmdlcn0gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge21lcmdlRGF0YXNldHNCeU9yZGVyfSBmcm9tICcuL3Zpcy1zdGF0ZS1tZXJnZXInO1xuaW1wb3J0IHtmaXhFZmZlY3RPcmRlcn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2NyZWF0ZUVmZmVjdH0gZnJvbSAnQGtlcGxlci5nbC9lZmZlY3RzJztcblxuLy8gcmVhY3QtcGFsbVxuLy8gZGlzYWJsZSBjYXB0dXJlIGV4Y2VwdGlvbiBmb3IgcmVhY3QtcGFsbSBjYWxsIHRvIHdpdGhUYXNrXG5kaXNhYmxlU3RhY2tDYXB0dXJpbmcoKTtcblxuLyoqXG4gKiBVcGRhdGVycyBmb3IgYHZpc1N0YXRlYCByZWR1Y2VyLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHt2aXNTdGF0ZVVwZGF0ZXJzfSBmcm9tICdrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIHZpc1N0YXRlOiB2aXNTdGF0ZVVwZGF0ZXJzLmVubGFyZ2VGaWx0ZXJVcGRhdGVyKFxuICogICAgICAgICAgICAgICBzdGF0ZS5rZXBsZXJHbC5mb28udmlzU3RhdGUsXG4gKiAgICAgICAgICAgICAgIHtpZHg6IDB9XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IHZpc1N0YXRlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEludGVyYWN0aW9uQ29uZmlnOiBJbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgdG9vbHRpcDoge1xuICAgIGlkOiAndG9vbHRpcCcsXG4gICAgbGFiZWw6ICdpbnRlcmFjdGlvbnMudG9vbHRpcCcsXG4gICAgZW5hYmxlZDogdHJ1ZSxcbiAgICBjb25maWc6IHtcbiAgICAgIGZpZWxkc1RvU2hvdzoge30sXG4gICAgICBjb21wYXJlTW9kZTogZmFsc2UsXG4gICAgICBjb21wYXJlVHlwZTogQ09NUEFSRV9UWVBFUy5BQlNPTFVURVxuICAgIH1cbiAgfSxcbiAgZ2VvY29kZXI6IHtcbiAgICBpZDogJ2dlb2NvZGVyJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5nZW9jb2RlcicsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgcG9zaXRpb246IG51bGxcbiAgfSxcbiAgYnJ1c2g6IHtcbiAgICBpZDogJ2JydXNoJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5icnVzaCcsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgY29uZmlnOiB7XG4gICAgICAvLyBzaXplIGlzIGluIGttXG4gICAgICBzaXplOiAwLjVcbiAgICB9XG4gIH0sXG4gIGNvb3JkaW5hdGU6IHtcbiAgICBpZDogJ2Nvb3JkaW5hdGUnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmNvb3JkaW5hdGUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOSU1BVElPTl9DT05GSUc6IEFuaW1hdGlvbkNvbmZpZyA9IHtcbiAgZG9tYWluOiBudWxsLFxuICBjdXJyZW50VGltZTogbnVsbCxcbiAgc3BlZWQ6IDEsXG4gIGlzQW5pbWF0aW5nOiBmYWxzZSxcbiAgdGltZUZvcm1hdDogbnVsbCxcbiAgdGltZXpvbmU6IG51bGwsXG4gIGRlZmF1bHRUaW1lRm9ybWF0OiBudWxsLFxuICBoaWRlQ29udHJvbDogZmFsc2UsXG4gIGR1cmF0aW9uOiBudWxsXG59O1xuXG5leHBvcnQgY29uc3QgREVGQVVMVF9FRElUT1I6IEVkaXRvciA9IHtcbiAgbW9kZTogRURJVE9SX01PREVTLkRSQVdfUE9MWUdPTixcbiAgZmVhdHVyZXM6IFtdLFxuICBzZWxlY3RlZEZlYXR1cmU6IG51bGwsXG4gIHZpc2libGU6IHRydWVcbn07XG5cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGB2aXNTdGF0ZWBcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfVklTX1NUQVRFOiBWaXNTdGF0ZSA9IHtcbiAgLy8gbWFwIGluZm9cbiAgbWFwSW5mbzoge1xuICAgIHRpdGxlOiAnJyxcbiAgICBkZXNjcmlwdGlvbjogJydcbiAgfSxcbiAgLy8gbGF5ZXJzXG4gIGxheWVyczogW10sXG4gIGxheWVyRGF0YTogW10sXG4gIGxheWVyVG9CZU1lcmdlZDogW10sXG4gIGxheWVyT3JkZXI6IFtdLFxuXG4gIC8vIGZpbHRlcnNcbiAgZmlsdGVyczogW10sXG4gIGZpbHRlclRvQmVNZXJnZWQ6IFtdLFxuXG4gIC8vIGEgY29sbGVjdGlvbiBvZiBtdWx0aXBsZSBkYXRhc2V0XG4gIGRhdGFzZXRzOiB7fSxcbiAgZWRpdGluZ0RhdGFzZXQ6IHVuZGVmaW5lZCxcblxuICAvLyBlZmZlY3RzXG4gIGVmZmVjdHM6IFtdLFxuICBlZmZlY3RPcmRlcjogW10sXG5cbiAgaW50ZXJhY3Rpb25Db25maWc6IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB7fSxcblxuICBsYXllckJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgb3ZlcmxheUJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgaG92ZXJJbmZvOiB1bmRlZmluZWQsXG4gIGNsaWNrZWQ6IHVuZGVmaW5lZCxcbiAgbW91c2VQb3M6IHt9LFxuICBtYXhEZWZhdWx0VG9vbHRpcHM6IE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuXG4gIC8vIHRoaXMgaXMgdXNlZCB3aGVuIHVzZXIgc3BsaXQgbWFwc1xuICBzcGxpdE1hcHM6IFtcbiAgICAvLyB0aGlzIHdpbGwgY29udGFpbiBhIGxpc3Qgb2Ygb2JqZWN0cyB0b1xuICAgIC8vIGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiBsYXllciBhdmFpbGFiaWxpdHkgYW5kIHZpc2liaWxpdHkgZm9yIGVhY2ggbWFwXG4gICAgLy8gW1xuICAgIC8vICAge1xuICAgIC8vICAgICAgbGF5ZXJzOiB7bGF5ZXJfaWQ6IHRydWUgfCBmYWxzZX1cbiAgICAvLyAgIH1cbiAgICAvLyBdXG4gIF0sXG4gIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFtdLFxuICBpc01lcmdpbmdEYXRhc2V0czoge30sXG4gIC8vIGRlZmF1bHRzIGxheWVyIGNsYXNzZXNcbiAgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXMsXG5cbiAgLy8gZGVmYXVsdCBhbmltYXRpb25cbiAgLy8gdGltZSBpbiB1bml4IHRpbWVzdGFtcCAobWlsbGlzZWNvbmRzKSAodGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IEVwb2NoKVxuICBhbmltYXRpb25Db25maWc6IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyxcblxuICBlZGl0b3I6IERFRkFVTFRfRURJVE9SLFxuXG4gIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgZmlsZUxvYWRpbmdQcm9ncmVzczoge30sXG5cbiAgbG9hZGVyczogW10sXG4gIGxvYWRPcHRpb25zOiB7fSxcblxuICAvLyB2aXNTdGF0ZU1lcmdlcnNcbiAgbWVyZ2VyczogVklTX1NUQVRFX01FUkdFUlMsXG5cbiAgLy8ga2VwbGVyIHNjaGVtYXNcbiAgc2NoZW1hOiBLZXBsZXJHTFNjaGVtYVxufTtcblxudHlwZSBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlID0ge1xuICBsYXllcnM6IExheWVyW107XG4gIGxheWVyRGF0YTogYW55W107XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBzdGF0ZSB3aXRoIHVwZGF0ZWQgbGF5ZXIgYW5kIGxheWVyRGF0YVxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YTxTIGV4dGVuZHMgVXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhVHlwZT4oXG4gIHN0YXRlOiBTLFxuICB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fToge2xheWVyRGF0YT86IGFueTsgbGF5ZXI6IExheWVyOyBpZHg6IG51bWJlcn1cbik6IFMge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogc3RhdGUubGF5ZXJzLm1hcCgobHlyLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXIgOiBseXIpKSxcbiAgICBsYXllckRhdGE6IGxheWVyRGF0YVxuICAgICAgPyBzdGF0ZS5sYXllckRhdGEubWFwKChkLCBpKSA9PiAoaSA9PT0gaWR4ID8gbGF5ZXJEYXRhIDogZCkpXG4gICAgICA6IHN0YXRlLmxheWVyRGF0YVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZTxTIGV4dGVuZHMgVmlzU3RhdGU+KHN0YXRlOiBTLCBsYXllcjogTGF5ZXIpOiBTIHtcbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbGF5ZXIuY29uZmlnLmlzVmlzaWJsZVxuICAgICAgICA/IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICAgICAgOiByZW1vdmVMYXllckZyb21TcGxpdE1hcHMoc3RhdGUuc3BsaXRNYXBzLCBsYXllcilcbiAgICB9O1xuICB9XG5cbiAgaWYgKGxheWVyLmNvbmZpZy5hbmltYXRpb24uZW5hYmxlZCkge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKHN0YXRlKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyB0d28gb2JqZWN0cyAob3IgYXJyYXlzKSBhbmQgcmV0dXJucyBhIG5ldyBvYmplY3Qgd2l0aCBvbmx5IHRoZVxuICogcHJvcGVydGllcyB0aGF0IGhhdmUgY2hhbmdlZCBiZXR3ZWVuIHRoZSB0d28gb2JqZWN0cy5cbiAqL1xuZnVuY3Rpb24gcGlja0NoYW5nZWRQcm9wczxUPihwcmV2OiBULCBuZXh0OiBUKTogUGFydGlhbDxUPiB7XG4gIGNvbnN0IGNoYW5nZWRQcm9wczogUGFydGlhbDxUPiA9IHt9O1xuICBjb25zdCBwaWNrUHJvcHNPZiA9IG9iaiA9PiB7XG4gICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBpZiAoIWNoYW5nZWRQcm9wcy5oYXNPd25Qcm9wZXJ0eShrZXkpICYmICFpc0VxdWFsKHByZXZba2V5XSwgbmV4dFtrZXldKSkge1xuICAgICAgICBjaGFuZ2VkUHJvcHNba2V5XSA9IG5leHRba2V5XTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfTtcbiAgcGlja1Byb3BzT2YocHJldik7XG4gIHBpY2tQcm9wc09mKG5leHQpO1xuICByZXR1cm4gY2hhbmdlZFByb3BzO1xufVxuXG5jb25zdCBWSVNVQUxfQ0hBTk5FTF9QUk9QX1RZUEVTID0gWydmaWVsZCcsICdzY2FsZScsICdkb21haW4nLCAnYWdncmVnYXRpb24nXTtcblxuLyoqXG4gKiBBcHBseSBsYXllciBjb25maWdcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHksIG1heC1zdGF0ZW1lbnRzXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlMYXllckNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQXBwbHlMYXllckNvbmZpZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVySWQsIG5ld0xheWVyQ29uZmlnLCBsYXllckluZGV4fSA9IGFjdGlvbjtcbiAgY29uc3QgbmV3UGFyc2VkTGF5ZXIgPVxuICAgIC8vIHdpbGwgbW92ZSB2aXN1YWxDaGFubmVscyB0byB0aGUgY29uZmlnIHByb3BcbiAgICBwYXJzZUxheWVyQ29uZmlnKHN0YXRlLnNjaGVtYSwgbmV3TGF5ZXJDb25maWcpO1xuICBjb25zdCBvbGRMYXllciA9IHN0YXRlLmxheWVycy5maW5kKGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXJJZCk7XG4gIGlmICghb2xkTGF5ZXIgfHwgIW5ld1BhcnNlZExheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChsYXllckluZGV4ICE9PSBudWxsICYmIGxheWVySW5kZXggIT09IHVuZGVmaW5lZCAmJiBzdGF0ZS5sYXllcnNbbGF5ZXJJbmRleF0gIT09IG9sZExheWVyKSB7XG4gICAgLy8gbGF5ZXJJbmRleCBpcyBwcm92aWRlZCwgYnV0IGl0IGRvZXNuJ3QgbWF0Y2ggdGhlIG9sZExheWVyXG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tuZXdQYXJzZWRMYXllci5jb25maWcuZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIE1ha2Ugc3VyZSB0aGUgbGF5ZXIgaXMgdmFsaWQgYW5kIGNvbnZlcnQgaXQgdG8gTGF5ZXJcbiAgY29uc3QgbmV3TGF5ZXIgPSB2YWxpZGF0ZUxheWVyV2l0aERhdGEoZGF0YXNldCwgbmV3UGFyc2VkTGF5ZXIsIHN0YXRlLmxheWVyQ2xhc3Nlcyk7XG4gIGlmICghbmV3TGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgbmV4dFN0YXRlID0gc3RhdGU7XG5cbiAgaWYgKG5ld0xheWVyLnR5cGUgJiYgbmV3TGF5ZXIudHlwZSAhPT0gb2xkTGF5ZXIudHlwZSkge1xuICAgIGNvbnN0IG9sZExheWVySW5kZXggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXJJZCk7XG4gICAgaWYgKG9sZExheWVySW5kZXggPj0gMCkge1xuICAgICAgbmV4dFN0YXRlID0gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcihuZXh0U3RhdGUsIGxheWVyVHlwZUNoYW5nZShvbGRMYXllciwgbmV3TGF5ZXIudHlwZSkpO1xuICAgICAgLy8gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciBjaGFuZ2VzIHRoZSBpZCBvZiB0aGUgbGF5ZXIsIHNvIHdlIG5lZWQgdG8gb2J0YWluIHRoZSBuZXcgaWRcbiAgICAgIC8vIGJ1dCBmaXJzdCBtYWtlIHN1cmUgdGhhdCB0aGUgbGF5ZXIgd2FzIG5vdCByZW1vdmVkXG4gICAgICBpZiAobmV4dFN0YXRlLmxheWVycy5sZW5ndGggPT09IHN0YXRlLmxheWVycy5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgbmV3TGF5ZXJJZCA9IG5leHRTdGF0ZS5sYXllcnNbb2xkTGF5ZXJJbmRleF0uaWQ7XG4gICAgICAgIG5leHRTdGF0ZSA9IGFwcGx5TGF5ZXJDb25maWdVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBhcHBseUxheWVyQ29uZmlnKG5ld0xheWVySWQsIHsuLi5uZXdMYXllckNvbmZpZywgaWQ6IG5ld0xheWVySWR9KVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbmV4dFN0YXRlO1xuICB9XG5cbiAgLy8gc2VyaWFsaXplTGF5ZXIoKSBtaWdodCByZXR1cm4gbnVsbCBpZiB0aGUgb2xkIGxheWVyIGlzIG5vdCB2YWxpZCxcbiAgLy8gd2Ugc2hvdWxkIHN0aWxsIGFwcGx5IHRoZSBjaGFuZ2VzIGluIHRoYXQgY2FzZVxuICBjb25zdCBzZXJpYWxpemVkT2xkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihvbGRMYXllciwgc3RhdGUuc2NoZW1hKSA/PyB7Y29uZmlnOiB7fX07XG4gIGNvbnN0IHNlcmlhbGl6ZWROZXdMYXllciA9IHNlcmlhbGl6ZUxheWVyKG5ld0xheWVyLCBzdGF0ZS5zY2hlbWEpO1xuICBpZiAoIXNlcmlhbGl6ZWROZXdMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAoIWlzRXF1YWwoc2VyaWFsaXplZE9sZExheWVyLCBzZXJpYWxpemVkTmV3TGF5ZXIpKSB7XG4gICAgY29uc3QgY2hhbmdlZCA9IHBpY2tDaGFuZ2VkUHJvcHMoc2VyaWFsaXplZE9sZExheWVyLmNvbmZpZywgc2VyaWFsaXplZE5ld0xheWVyLmNvbmZpZyk7XG5cbiAgICBpZiAoJ3Zpc0NvbmZpZycgaW4gY2hhbmdlZCkge1xuICAgICAgaWYgKGNoYW5nZWQudmlzQ29uZmlnKSB7XG4gICAgICAgIG5leHRTdGF0ZSA9IGxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgbGF5ZXJWaXNDb25maWdDaGFuZ2Uob2xkTGF5ZXIsIGNoYW5nZWQudmlzQ29uZmlnKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgZGVsZXRlIGNoYW5nZWQudmlzQ29uZmlnO1xuICAgIH1cblxuICAgIE9iamVjdC5rZXlzKG9sZExheWVyLnZpc3VhbENoYW5uZWxzKS5mb3JFYWNoKGNoYW5uZWxOYW1lID0+IHtcbiAgICAgIGNvbnN0IGNoYW5uZWwgPSBvbGRMYXllci52aXN1YWxDaGFubmVsc1tjaGFubmVsTmFtZV07XG4gICAgICBjb25zdCBjaGFubmVsUHJvcE5hbWVzID0gVklTVUFMX0NIQU5ORUxfUFJPUF9UWVBFUy5tYXAocHJvcCA9PiBjaGFubmVsW3Byb3BdKTtcbiAgICAgIGlmIChjaGFubmVsUHJvcE5hbWVzLnNvbWUocHJvcCA9PiBwcm9wIGluIGNoYW5nZWQpKSB7XG4gICAgICAgIG5leHRTdGF0ZSA9IGxheWVyVmlzdWFsQ2hhbm5lbENoYW5nZVVwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZShcbiAgICAgICAgICAgIG9sZExheWVyLFxuICAgICAgICAgICAgcGljayhuZXdMYXllci5jb25maWcsIGNoYW5uZWxQcm9wTmFtZXMpLFxuICAgICAgICAgICAgY2hhbm5lbE5hbWVcbiAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgcHJvcCBvZiBjaGFubmVsUHJvcE5hbWVzKSB7XG4gICAgICAgICAgZGVsZXRlIGNoYW5nZWRbcHJvcF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmIChPYmplY3Qua2V5cyhjaGFuZ2VkKS5sZW5ndGggPiAwKSB7XG4gICAgICBuZXh0U3RhdGUgPSBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgbGF5ZXJDb25maWdDaGFuZ2Uob2xkTGF5ZXIsIHBpY2sobmV3TGF5ZXIuY29uZmlnLCBPYmplY3Qua2V5cyhjaGFuZ2VkKSkpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJhc2UgY29uZmlnOiBkYXRhSWQsIGxhYmVsLCBjb2x1bW4sIGlzVmlzaWJsZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY29tcGxleGl0eVxuZXhwb3J0IGZ1bmN0aW9uIGxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhhY3Rpb24ubmV3Q29uZmlnKTtcbiAgaWYgKFxuICAgIHR5cGVvZiBhY3Rpb24ubmV3Q29uZmlnLmRhdGFJZCA9PT0gJ3N0cmluZycgJiZcbiAgICBhY3Rpb24ubmV3Q29uZmlnLmRhdGFJZCAhPT0gb2xkTGF5ZXIuY29uZmlnLmRhdGFJZFxuICApIHtcbiAgICBjb25zdCB7ZGF0YUlkLCAuLi5yZXN0Q29uZmlnfSA9IGFjdGlvbi5uZXdDb25maWc7XG4gICAgY29uc3Qgc3RhdGVXaXRoRGF0YUlkID0gbGF5ZXJEYXRhSWRDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgICBvbGRMYXllcixcbiAgICAgIG5ld0NvbmZpZzoge2RhdGFJZH1cbiAgICB9KTtcbiAgICBjb25zdCBuZXh0TGF5ZXIgPSBzdGF0ZVdpdGhEYXRhSWQubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gICAgcmV0dXJuIG5leHRMYXllciAmJiBPYmplY3Qua2V5cyhyZXN0Q29uZmlnKS5sZW5ndGhcbiAgICAgID8gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlV2l0aERhdGFJZCwge29sZExheWVyOiBuZXh0TGF5ZXIsIG5ld0NvbmZpZzogcmVzdENvbmZpZ30pXG4gICAgICA6IHN0YXRlV2l0aERhdGFJZDtcbiAgfVxuXG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKGFjdGlvbi5uZXdDb25maWcpO1xuXG4gIGxldCBsYXllckRhdGE7XG5cbiAgaWYgKG5ld0xheWVyLnNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykpIHtcbiAgICBjb25zdCBvbGRMYXllckRhdGEgPSBzdGF0ZS5sYXllckRhdGFbaWR4XTtcblxuICAgIGNvbnN0IHVwZGF0ZUxheWVyRGF0YVJlc3VsdCA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIG9sZExheWVyRGF0YSk7XG4gICAgbmV3TGF5ZXIgPSB1cGRhdGVMYXllckRhdGFSZXN1bHQubGF5ZXI7XG4gICAgbGF5ZXJEYXRhID0gdXBkYXRlTGF5ZXJEYXRhUmVzdWx0LmxheWVyRGF0YTtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuICBpZiAoJ2lzVmlzaWJsZScgaW4gYWN0aW9uLm5ld0NvbmZpZykge1xuICAgIG5ld1N0YXRlID0gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZShzdGF0ZSwgbmV3TGF5ZXIpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgIGxheWVyOiBuZXdMYXllcixcbiAgICBsYXllckRhdGEsXG4gICAgaWR4XG4gIH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgaXNWYWxpZCBmbGFnIG9mIGEgbGF5ZXIuXG4gKiBVcGRhdGVzIGlzVmlzaWJsZSBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgaXNWYWxpZC5cbiAqIFRyaWdnZXJzIHVwZGF0ZSBvZiBkYXRhIGZvciB0aGUgbGF5ZXIgaW4gb3JkZXIgdG8gZ2V0IGVycm9ycyBhZ2FpbiBkdXJpbmcgbmV4dCB1cGRhdGUgaXRlcmF0aW9uLlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJTZXRJc1ZhbGlkVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclNldElzVmFsaWRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgaXNWYWxpZH0gPSBhY3Rpb247XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgbGF5ZXJUb1VwZGF0ZSA9IHN0YXRlLmxheWVyc1tpZHhdO1xuICBpZiAobGF5ZXJUb1VwZGF0ZSkge1xuICAgIGxldCBuZXdMYXllcjtcbiAgICBsZXQgbmV3RGF0YSA9IG51bGw7XG5cbiAgICBpZiAoaXNWYWxpZCkge1xuICAgICAgLy8gVHJpZ2dlciBkYXRhIHVwZGF0ZSBpbiBvcmRlciB0byBzaG93IGVycm9ycyBhZ2FpbiBpZiBwcmVzZW50LlxuICAgICAgY29uc3Qge2xheWVyLCBsYXllckRhdGF9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKGxheWVyVG9VcGRhdGUsIHN0YXRlLCB1bmRlZmluZWQpO1xuICAgICAgbmV3TGF5ZXIgPSBsYXllcjtcbiAgICAgIG5ld0RhdGEgPSBsYXllckRhdGE7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5ld0xheWVyID0gbGF5ZXJUb1VwZGF0ZS51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgIGlzVmlzaWJsZTogZmFsc2VcbiAgICAgIH0pO1xuICAgICAgbmV3TGF5ZXIuaXNWYWxpZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtpZHgsIGxheWVyOiBuZXdMYXllciwgbGF5ZXJEYXRhOiBuZXdEYXRhfSk7XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59XG5cbmZ1bmN0aW9uIGFkZE9yUmVtb3ZlVGV4dExhYmVscyhuZXdGaWVsZHMsIHRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbCA9IERFRkFVTFRfVEVYVF9MQUJFTCkge1xuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG5cbiAgY29uc3QgY3VycmVudEZpZWxkcyA9IHRleHRMYWJlbC5tYXAodGwgPT4gdGwuZmllbGQgJiYgdGwuZmllbGQubmFtZSkuZmlsdGVyKGQgPT4gZCk7XG5cbiAgY29uc3QgYWRkRmllbGRzID0gbmV3RmllbGRzLmZpbHRlcihmID0+ICFjdXJyZW50RmllbGRzLmluY2x1ZGVzKGYubmFtZSkpO1xuICBjb25zdCBkZWxldGVGaWVsZHMgPSBjdXJyZW50RmllbGRzLmZpbHRlcihmID0+ICFuZXdGaWVsZHMuZmluZChmZCA9PiBmZC5uYW1lID09PSBmKSk7XG5cbiAgLy8gZGVsZXRlXG4gIG5ld1RleHRMYWJlbCA9IG5ld1RleHRMYWJlbC5maWx0ZXIodGwgPT4gdGwuZmllbGQgJiYgIWRlbGV0ZUZpZWxkcy5pbmNsdWRlcyh0bC5maWVsZC5uYW1lKSk7XG4gIG5ld1RleHRMYWJlbCA9ICFuZXdUZXh0TGFiZWwubGVuZ3RoID8gW2RlZmF1bHRUZXh0TGFiZWxdIDogbmV3VGV4dExhYmVsO1xuXG4gIC8vIGFkZFxuICBuZXdUZXh0TGFiZWwgPSBbXG4gICAgLi4ubmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCksXG4gICAgLi4uYWRkRmllbGRzLm1hcChhZiA9PiAoe1xuICAgICAgLi4uZGVmYXVsdFRleHRMYWJlbCxcbiAgICAgIGZpZWxkOiBhZlxuICAgIH0pKVxuICBdO1xuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCB0ZXh0TGFiZWwpIHtcbiAgaWYgKCF0ZXh0TGFiZWxbaWR4XS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkge1xuICAgIHJldHVybiB0ZXh0TGFiZWw7XG4gIH1cblxuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG5cbiAgaWYgKHByb3AgPT09ICdmaWVsZCcgJiYgdmFsdWUgPT09IG51bGwgJiYgdGV4dExhYmVsLmxlbmd0aCA+IDEpIHtcbiAgICAvLyByZW1vdmUgbGFiZWwgd2hlbiBmaWVsZCB2YWx1ZSBpcyBzZXQgdG8gbnVsbFxuICAgIG5ld1RleHRMYWJlbC5zcGxpY2UoaWR4LCAxKTtcbiAgfSBlbHNlIGlmIChwcm9wKSB7XG4gICAgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLm1hcCgodGwsIGkpID0+IChpID09PSBpZHggPyB7Li4udGwsIFtwcm9wXTogdmFsdWV9IDogdGwpKTtcbiAgfVxuXG4gIHJldHVybiBuZXdUZXh0TGFiZWw7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGJhc2UgY29uZmlnOiBkYXRhSWQsIGxhYmVsLCBjb2x1bW4sIGlzVmlzaWJsZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUZXh0TGFiZWxDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIGlkeCwgcHJvcCwgdmFsdWV9ID0gYWN0aW9uO1xuICBjb25zdCB7dGV4dExhYmVsfSA9IG9sZExheWVyLmNvbmZpZztcblxuICAvLyB3aGVuIGFkZGluZyBhIG5ldyBlbXB0eSB0ZXh0IGxhYmVsLFxuICAvLyByZWx5IG9uIHRoZSBsYXllcidzIGRlZmF1bHQgY29uZmlnLCBvciB1c2UgdGhlIGNvbnN0YW50IERFRkFVTFRfVEVYVF9MQUJFTFxuICBjb25zdCBkZWZhdWx0VGV4dExhYmVsID1cbiAgICBvbGRMYXllci5nZXREZWZhdWx0TGF5ZXJDb25maWcoe2RhdGFJZDogJyd9KT8udGV4dExhYmVsPy5bMF0gPz8gREVGQVVMVF9URVhUX0xBQkVMO1xuXG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcbiAgaWYgKCF0ZXh0TGFiZWxbaWR4XSAmJiBpZHggPT09IHRleHRMYWJlbC5sZW5ndGgpIHtcbiAgICAvLyBpZiBpZHggaXMgc2V0IHRvIGxlbmd0aCwgYWRkIGVtcHR5IHRleHQgbGFiZWxcbiAgICBuZXdUZXh0TGFiZWwgPSBbLi4udGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsXTtcbiAgfVxuXG4gIGlmIChpZHggPT09ICdhbGwnICYmIHByb3AgPT09ICdmaWVsZHMnKSB7XG4gICAgbmV3VGV4dExhYmVsID0gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKHZhbHVlLCB0ZXh0TGFiZWwsIGRlZmF1bHRUZXh0TGFiZWwpO1xuICB9IGVsc2Uge1xuICAgIG5ld1RleHRMYWJlbCA9IHVwZGF0ZVRleHRMYWJlbFByb3BBbmRWYWx1ZShpZHgsIHByb3AsIHZhbHVlLCBuZXdUZXh0TGFiZWwpO1xuICB9XG4gIC8vIHVwZGF0ZSB0ZXh0IGxhYmVsIHByb3AgYW5kIHZhbHVlXG4gIHJldHVybiBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICBvbGRMYXllcixcbiAgICBuZXdDb25maWc6IHt0ZXh0TGFiZWw6IG5ld1RleHRMYWJlbH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKGRhdGFzZXQsIGxheWVyQ2xhc3NlcywgbGF5ZXIsIHNjaGVtYSkge1xuICBjb25zdCBsb2FkZWRMYXllciA9IHNlcmlhbGl6ZUxheWVyKGxheWVyLCBzY2hlbWEpO1xuICByZXR1cm4gbG9hZGVkTGF5ZXJcbiAgICA/IHZhbGlkYXRlTGF5ZXJXaXRoRGF0YShkYXRhc2V0LCBsb2FkZWRMYXllciwgbGF5ZXJDbGFzc2VzLCB7XG4gICAgICAgIGFsbG93RW1wdHlDb2x1bW46IHRydWVcbiAgICAgIH0pXG4gICAgOiBudWxsO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBjb25maWcgZGF0YUlkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiB7XG4gICAgb2xkTGF5ZXI6IExheWVyO1xuICAgIG5ld0NvbmZpZzoge1xuICAgICAgZGF0YUlkOiBzdHJpbmc7XG4gICAgfTtcbiAgfVxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIG5ld0NvbmZpZ30gPSBhY3Rpb247XG4gIGNvbnN0IHtkYXRhSWR9ID0gbmV3Q29uZmlnO1xuXG4gIGlmICghb2xkTGF5ZXIgfHwgIXN0YXRlLmRhdGFzZXRzW2RhdGFJZF0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcblxuICBsZXQgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyh7ZGF0YUlkfSk7XG4gIC8vIHRoaXMgbWF5IGhhcHBlbiB3aGVuIGEgbGF5ZXIgaXMgbmV3ICh0eXBlOiBudWxsIGFuZCBubyBjb2x1bW5zKSBidXQgaXQncyBub3QgcmVhZHkgdG8gYmUgc2F2ZWRcbiAgaWYgKG5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKFxuICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YUlkXSxcbiAgICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICAgIG5ld0xheWVyLFxuICAgICAgc3RhdGUuc2NoZW1hXG4gICAgKTtcbiAgICAvLyBpZiBjYW50IHZhbGlkYXRlIGl0IHdpdGggZGF0YSBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKCF2YWxpZGF0ZWQpIHtcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgVE9ETzogY2hlY2tpbmcgb2xkTGF5ZXIudHlwZSAhPT0gbnVsbFxuICAgICAgbmV3TGF5ZXIgPSBuZXcgc3RhdGUubGF5ZXJDbGFzc2VzW29sZExheWVyLnR5cGVdKHtkYXRhSWQsIGlkOiBvbGRMYXllci5pZH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdMYXllciA9IHZhbGlkYXRlZDtcbiAgICB9XG4gIH1cblxuICBuZXdMYXllciA9IG5ld0xheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICBpc1Zpc2libGU6IG9sZExheWVyLmNvbmZpZy5pc1Zpc2libGUsXG4gICAgaXNDb25maWdBY3RpdmU6IHRydWVcbiAgfSk7XG5cbiAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCB1bmRlZmluZWQpO1xuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEoc3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNldEluaXRpYWxMYXllckNvbmZpZyhsYXllciwgZGF0YXNldHMsIGxheWVyQ2xhc3Nlcyk6IExheWVyIHtcbiAgbGV0IG5ld0xheWVyID0gbGF5ZXI7XG4gIGlmICghT2JqZWN0LmtleXMoZGF0YXNldHMpLmxlbmd0aCkge1xuICAgIC8vIG5vIGRhdGEgaXMgbG9hZGVkXG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG4gIGlmICghbGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIC8vIHNldCBsYXllciBkYXRhSWRcbiAgICBuZXdMYXllciA9IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtkYXRhSWQ6IE9iamVjdC5rZXlzKGRhdGFzZXRzKVswXX0pO1xuICB9XG4gIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0c1tuZXdMYXllci5jb25maWcuZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIGxheWVyO1xuICB9XG5cbiAgLy8gZmluZCBkZWZhdXQgbGF5ZXIgcHJvcHNcbiAgY29uc3QgcmVzdWx0ID1cbiAgICB0eXBlb2YgbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBsYXllckNsYXNzZXNbbmV3TGF5ZXIudHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzKGRhdGFzZXQsIFtdKVxuICAgICAgOiB7cHJvcHM6IFtdfTtcblxuICAvLyBhbiBhcnJheSBvZiBwb3NzaWJsZSBwcm9wcywgdXNlIDFzdCBvbmVcbiAgY29uc3QgcHJvcHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiByZXN1bHQucHJvcHMgfHwgW107XG5cbiAgaWYgKHByb3BzLmxlbmd0aCkge1xuICAgIG5ld0xheWVyID0gbmV3IGxheWVyQ2xhc3Nlc1tsYXllci50eXBlXSh7XG4gICAgICAuLi5wcm9wc1swXSxcbiAgICAgIGxhYmVsOiBuZXdMYXllci5jb25maWcubGFiZWwsXG4gICAgICBkYXRhSWQ6IG5ld0xheWVyLmNvbmZpZy5kYXRhSWQsXG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogbmV3TGF5ZXIuY29uZmlnLmlzQ29uZmlnQWN0aXZlXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdHlwZW9mIG5ld0xheWVyLnNldEluaXRpYWxMYXllckNvbmZpZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICAgIDogbmV3TGF5ZXI7XG4gIH1cblxuICByZXR1cm4gbmV3TGF5ZXI7XG59XG4vKipcbiAqIFVwZGF0ZSBsYXllciB0eXBlLiBQcmV2aWV3cyBsYXllciBjb25maWcgd2lsbCBiZSBjb3BpZWQgaWYgYXBwbGljYWJsZS5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclR5cGVDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdUeXBlfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBvbGRJZCA9IG9sZExheWVyLmlkO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkSWQpO1xuXG4gIGlmICghc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKSB7XG4gICAgQ29uc29sZS5lcnJvcihgJHtuZXdUeXBlfSBpcyBub3QgYSB2YWxpZCBsYXllciB0eXBlYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdMYXllciA9IG5ldyBzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0oe1xuICAgIC8vIGtlZXAgb2xkIGxheWVyIGxhYmxlIGFuZCBpc0NvbmZpZ0FjdGl2ZVxuICAgIGxhYmVsOiBvbGRMYXllci5jb25maWcubGFiZWwsXG4gICAgaXNDb25maWdBY3RpdmU6IG9sZExheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZSxcbiAgICBkYXRhSWQ6IG9sZExheWVyLmNvbmZpZy5kYXRhSWRcbiAgfSk7XG5cbiAgaWYgKCFvbGRMYXllci50eXBlKSB7XG4gICAgLy8gaWYgc2V0dGluZyBsYXllciB0eXBlIG9uIGFuIGVtcHR5IGxheWVyXG4gICAgbmV3TGF5ZXIgPSBzZXRJbml0aWFsTGF5ZXJDb25maWcobmV3TGF5ZXIsIHN0YXRlLmRhdGFzZXRzLCBzdGF0ZS5sYXllckNsYXNzZXMpO1xuICB9IGVsc2Uge1xuICAgIC8vIGdldCBhIG1pbnQgbGF5ZXIsIHdpdGggbmV3IGlkIGFuZCB0eXBlXG4gICAgLy8gYmVjYXVzZSBkZWNrLmdsIHVzZXMgaWQgdG8gbWF0Y2ggYmV0d2VlbiBuZXcgYW5kIG9sZCBsYXllci5cbiAgICAvLyBJZiB0eXBlIGhhcyBjaGFuZ2VkIGJ1dCBpZCBpcyB0aGUgc2FtZSwgaXQgd2lsbCBicmVha1xuICAgIG5ld0xheWVyLmFzc2lnbkNvbmZpZ1RvTGF5ZXIob2xkTGF5ZXIuY29uZmlnLCBvbGRMYXllci52aXNDb25maWdTZXR0aW5ncyk7XG4gICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICB9XG5cbiAgY29uc3Qge2NsaWNrZWQsIGhvdmVySW5mb30gPSBzdGF0ZTtcblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgY2xpY2tlZDogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoY2xpY2tlZCkgPyB1bmRlZmluZWQgOiBjbGlja2VkLFxuICAgIGhvdmVySW5mbzogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mb1xuICB9O1xuXG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuXG4gIGlmIChsYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgfHwgb2xkTGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHNwbGl0TWFwIGxheWVyIGlkXG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbmV3U3RhdGUuc3BsaXRNYXBzLm1hcChzZXR0aW5ncyA9PiB7XG4gICAgICAgIGNvbnN0IHtbb2xkSWRdOiBvbGRMYXllck1hcCwgLi4ub3RoZXJMYXllcnN9ID0gc2V0dGluZ3MubGF5ZXJzO1xuICAgICAgICByZXR1cm4gb2xkSWQgaW4gc2V0dGluZ3MubGF5ZXJzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICBsYXllcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5vdGhlckxheWVycyxcbiAgICAgICAgICAgICAgICBbbGF5ZXIuaWRdOiBvbGRMYXllck1hcFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBzZXR0aW5ncztcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBsYXllck9yZGVyIHdpdGggbmV3IGlkXG4gIG5ld1N0YXRlID0ge1xuICAgIC4uLm5ld1N0YXRlLFxuICAgIGxheWVyT3JkZXI6IG5ld1N0YXRlLmxheWVyT3JkZXIubWFwKGxheWVySWQgPT5cbiAgICAgIGxheWVySWQgPT09IG9sZExheWVyLmlkID8gbmV3TGF5ZXIuaWQgOiBsYXllcklkXG4gICAgKVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdmlzdWFsIGNoYW5uZWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzdWFsQ2hhbm5lbENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIG5ld0NvbmZpZywgY2hhbm5lbH0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbb2xkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG5cbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyhuZXdDb25maWcpO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbChkYXRhc2V0LCBjaGFubmVsKTtcblxuICBjb25zdCBvbGRMYXllckRhdGEgPSBzdGF0ZS5sYXllckRhdGFbaWR4XTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGB2aXNDb25maWdgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGFjdGlvbi5uZXdWaXNDb25maWcpO1xuICBjb25zdCBuZXdWaXNDb25maWcgPSB7XG4gICAgLi4ub2xkTGF5ZXIuY29uZmlnLnZpc0NvbmZpZyxcbiAgICAuLi5hY3Rpb24ubmV3VmlzQ29uZmlnXG4gIH07XG5cbiAgY29uc3QgbmV3TGF5ZXIgPSBvbGRMYXllci51cGRhdGVMYXllckNvbmZpZyh7dmlzQ29uZmlnOiBuZXdWaXNDb25maWd9KTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuICAgIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgc3RhdGUsIG9sZExheWVyRGF0YSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyOiBuZXdMYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBwcm9wZXJ0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKHN0YXRlLCBhY3Rpb24pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgYW5pbWF0aW9uIHdpbmRvd1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkLCBhbmltYXRpb25XaW5kb3d9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyQW5pbWF0aW9uV2luZG93VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKGYgPT5cbiAgICAgIGYuaWQgPT09IGlkXG4gICAgICAgID8ge1xuICAgICAgICAgICAgLi4uZixcbiAgICAgICAgICAgIGFuaW1hdGlvbldpbmRvd1xuICAgICAgICAgIH1cbiAgICAgICAgOiBmXG4gICAgKVxuICB9O1xufVxuLyoqXG4gKiBVcGRhdGUgZmlsdGVyIHByb3BlcnR5XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtpZHgsIHByb3AsIHZhbHVlLCB2YWx1ZUluZGV4ID0gMH0gPSBhY3Rpb247XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcblxuICBpZiAoIW9sZEZpbHRlcikge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnMuJHtpZHh9IGlzIHVuZGVmaW5lZGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3RmlsdGVyID0gc2V0KFtwcm9wXSwgdmFsdWUsIG9sZEZpbHRlcik7XG4gIGxldCBuZXdTdGF0ZSA9IHN0YXRlO1xuXG4gIGNvbnN0IHtkYXRhSWR9ID0gbmV3RmlsdGVyO1xuXG4gIC8vIEVuc3VyaW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHlcbiAgbGV0IGRhdGFzZXRJZHMgPSB0b0FycmF5KGRhdGFJZCk7XG5cbiAgc3dpdGNoIChwcm9wKSB7XG4gICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgaWYgd2UgdXBkYXRlIGRhdGFJZCwgd2UgbmVlZCB0byBjb25zaWRlciB0d28gY2FzZXM6XG4gICAgLy8gMS4gZGF0YUlkIGlzIGVtcHR5OiBjcmVhdGUgYSBkZWZhdWx0IGZpbHRlclxuICAgIC8vIDIuIEFkZCBhIG5ldyBkYXRhc2V0IGlkXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5kYXRhSWQ6XG4gICAgICAvLyBpZiB0cnlpbmcgdG8gdXBkYXRlIGZpbHRlciBkYXRhSWQuIGNyZWF0ZSBhbiBlbXB0eSBuZXcgZmlsdGVyXG4gICAgICBuZXdGaWx0ZXIgPSB1cGRhdGVGaWx0ZXJEYXRhSWQoZGF0YUlkKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5uYW1lOlxuICAgICAgLy8gd2UgYXJlIHN1cHBvcnRpbmcgdGhlIGN1cnJlbnQgZnVuY3Rpb25hbGl0eVxuICAgICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgZmlsdGVyIG5hbWUgd2lsbCBvbmx5IHVwZGF0ZSBmaWx0ZXIgbmFtZSBidXQgaXQgd29uJ3QgaGF2ZSBzaWRlIGVmZmVjdHNcbiAgICAgIC8vIHdlIGFyZSBnb25uYSB1c2UgcGFpciBvZiBkYXRhc2V0cyBhbmQgZmllbGRJZHggdG8gdXBkYXRlIHRoZSBmaWx0ZXJcbiAgICAgIGNvbnN0IGRhdGFzZXRJZCA9IG5ld0ZpbHRlci5kYXRhSWRbdmFsdWVJbmRleF07XG4gICAgICBjb25zdCB7ZmlsdGVyOiB1cGRhdGVkRmlsdGVyLCBkYXRhc2V0OiBuZXdEYXRhc2V0fSA9IGFwcGx5RmlsdGVyRmllbGROYW1lKFxuICAgICAgICBuZXdGaWx0ZXIsXG4gICAgICAgIHN0YXRlLmRhdGFzZXRzW2RhdGFzZXRJZF0sXG4gICAgICAgIHZhbHVlLFxuICAgICAgICB2YWx1ZUluZGV4LFxuICAgICAgICB7bWVyZ2VEb21haW46IGZhbHNlfVxuICAgICAgKTtcbiAgICAgIGlmICghdXBkYXRlZEZpbHRlcikge1xuICAgICAgICByZXR1cm4gc3RhdGU7XG4gICAgICB9XG5cbiAgICAgIG5ld0ZpbHRlciA9IHVwZGF0ZWRGaWx0ZXI7XG5cbiAgICAgIGlmIChuZXdGaWx0ZXIuZ3B1KSB7XG4gICAgICAgIG5ld0ZpbHRlciA9IHNldEZpbHRlckdwdU1vZGUobmV3RmlsdGVyLCBzdGF0ZS5maWx0ZXJzKTtcbiAgICAgICAgbmV3RmlsdGVyID0gYXNzaWduR3B1Q2hhbm5lbChuZXdGaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgfVxuXG4gICAgICBuZXdTdGF0ZSA9IHNldChbJ2RhdGFzZXRzJywgZGF0YXNldElkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xuXG4gICAgICAvLyBvbmx5IGZpbHRlciB0aGUgY3VycmVudCBkYXRhc2V0XG4gICAgICBicmVhaztcbiAgICBjYXNlIEZJTFRFUl9VUERBVEVSX1BST1BTLmxheWVySWQ6XG4gICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IGRhdGFzZXRJZC9zIGlmIHdlIGhhdmUgYWRkZWQvcmVtb3ZlZCBsYXllcnNcbiAgICAgIC8vIC0gY2hlY2sgZm9yIGxheWVySWQgY2hhbmdlcyAoWE9SIHdvcmtzIGJlY2F1c2Ugb2Ygc3RyaW5nIHZhbHVlcylcbiAgICAgIC8vIGlmIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4gbGF5ZXJJZHMsIGRvbid0IGRvIGFueSBmaWx0ZXJpbmdcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGxheWVySWREaWZmZXJlbmNlID0geG9yKG5ld0ZpbHRlci5sYXllcklkLCBvbGRGaWx0ZXIubGF5ZXJJZCk7XG5cbiAgICAgIGNvbnN0IGxheWVyRGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHMgPSBsYXllckRhdGFJZHM7XG5cbiAgICAgIC8vIFVwZGF0ZSBuZXdGaWx0ZXIgZGF0YUlkc1xuICAgICAgY29uc3QgbmV3RGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgbmV3RmlsdGVyLmxheWVySWRcbiAgICAgICAgICA/Lm1hcChsaWQgPT5cbiAgICAgICAgICAgIGdldChcbiAgICAgICAgICAgICAgc3RhdGUubGF5ZXJzLmZpbmQobCA9PiBsLmlkID09PSBsaWQpLFxuICAgICAgICAgICAgICBbJ2NvbmZpZycsICdkYXRhSWQnXVxuICAgICAgICAgICAgKVxuICAgICAgICAgIClcbiAgICAgICAgICAuZmlsdGVyKGQgPT4gZCkgYXMgc3RyaW5nW11cbiAgICAgICk7XG5cbiAgICAgIG5ld0ZpbHRlciA9IHtcbiAgICAgICAgLi4ubmV3RmlsdGVyLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG5cbiAgICAgIGJyZWFrO1xuICAgIGRlZmF1bHQ6XG4gICAgICBicmVhaztcbiAgfVxuXG4gIGNvbnN0IGVubGFyZ2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycy5maW5kKGYgPT4gZi52aWV3ID09PSBGSUxURVJfVklFV19UWVBFUy5lbmxhcmdlZCk7XG5cbiAgaWYgKGVubGFyZ2VkRmlsdGVyICYmIGVubGFyZ2VkRmlsdGVyLmlkICE9PSBuZXdGaWx0ZXIuaWQpIHtcbiAgICAvLyB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgZW5sYXJnZWQgZmlsdGVyXG4gICAgbmV3RmlsdGVyLnZpZXcgPSBGSUxURVJfVklFV19UWVBFUy5zaWRlO1xuICB9XG5cbiAgLy8gc2F2ZSBuZXcgZmlsdGVycyB0byBuZXdTdGF0ZVxuICBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnLCBpZHhdLCBuZXdGaWx0ZXIsIG5ld1N0YXRlKTtcblxuICAvLyBpZiB3ZSBhcmUgY3VycmVudGx5IHNldHRpbmcgYSBwcm9wIHRoYXQgb25seSByZXF1aXJlcyB0byBmaWx0ZXIgdGhlIGN1cnJlbnRcbiAgLy8gZGF0YXNldCB3ZSB3aWxsIHBhc3Mgb25seSB0aGUgY3VycmVudCBkYXRhc2V0IHRvIGFwcGx5RmlsdGVyc1RvRGF0YXNldHMgYW5kXG4gIC8vIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YSBvdGhlcndpc2Ugd2UgcGFzcyB0aGUgYWxsIGxpc3Qgb2YgZGF0YXNldHMgYXMgZGVmaW5lZCBpbiBkYXRhSWRcbiAgY29uc3QgZGF0YXNldElkc1RvRmlsdGVyID0gTElNSVRFRF9GSUxURVJfRUZGRUNUX1BST1BTW3Byb3BdXG4gICAgPyBbZGF0YXNldElkc1t2YWx1ZUluZGV4XV1cbiAgICA6IGRhdGFzZXRJZHM7XG5cbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgZGF0YXNldElkc1RvRmlsdGVyLFxuICAgIG5ld1N0YXRlLmRhdGFzZXRzLFxuICAgIG5ld1N0YXRlLmZpbHRlcnMsXG4gICAgbmV3U3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgbmV3U3RhdGUgPSBzZXQoWydkYXRhc2V0cyddLCBmaWx0ZXJlZERhdGFzZXRzLCBuZXdTdGF0ZSk7XG4gIC8vIGRhdGFJZCBpcyBhbiBhcnJheVxuICAvLyBwYXNzIG9ubHkgdGhlIGRhdGFzZXQgd2UgbmVlZCB0byB1cGRhdGVcbiAgbmV3U3RhdGUgPSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEobmV3U3RhdGUsIGRhdGFzZXRJZHNUb0ZpbHRlciwgbmV3RmlsdGVyKTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogU2V0IHRoZSBwcm9wZXJ0eSBvZiBhIGZpbHRlciBwbG90XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0RmlsdGVyUGxvdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkeCwgbmV3UHJvcCwgdmFsdWVJbmRleCA9IDB9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyUGxvdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgbGV0IG5ld0ZpbHRlciA9IHsuLi5zdGF0ZS5maWx0ZXJzW2lkeF0sIC4uLm5ld1Byb3B9O1xuICBjb25zdCBwcm9wID0gT2JqZWN0LmtleXMobmV3UHJvcClbMF07XG4gIGlmIChwcm9wID09PSAneUF4aXMnKSB7XG4gICAgY29uc3QgcGxvdFR5cGUgPSBnZXREZWZhdWx0RmlsdGVyUGxvdFR5cGUobmV3RmlsdGVyKTtcbiAgICAvLyBUT0RPOiBwbG90IGlzIG5vdCBzdXBwb3J0ZWQgaW4gbXVsdGkgZGF0YXNldCBmaWx0ZXIgZm9yIG5vd1xuICAgIGlmIChwbG90VHlwZSkge1xuICAgICAgbmV3RmlsdGVyID0ge1xuICAgICAgICAuLi5uZXdGaWx0ZXIsXG4gICAgICAgIC4uLmdldEZpbHRlclBsb3Qoey4uLm5ld0ZpbHRlciwgcGxvdFR5cGV9LCBzdGF0ZS5kYXRhc2V0c1tuZXdGaWx0ZXIuZGF0YUlkW3ZhbHVlSW5kZXhdXSksXG4gICAgICAgIHBsb3RUeXBlXG4gICAgICB9O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBpZHggPyBuZXdGaWx0ZXIgOiBmKSlcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT5cbiAgIWFjdGlvbi5kYXRhSWRcbiAgICA/IHN0YXRlXG4gICAgOiB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBmaWx0ZXJzOiBbLi4uc3RhdGUuZmlsdGVycywgZ2V0RGVmYXVsdEZpbHRlcih7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBpZDogYWN0aW9uLmlkfSldXG4gICAgICB9O1xuXG4vKipcbiAqIFNldCBsYXllciBjb2xvciBwYWxldHRlIHVpIHN0YXRlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7b2xkTGF5ZXIsIHByb3AsIG5ld0NvbmZpZ306IFZpc1N0YXRlQWN0aW9ucy5MYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IG9sZFZpeENvbmZpZyA9IG9sZExheWVyLmNvbmZpZy52aXNDb25maWdbcHJvcF07XG4gIGNvbnN0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb2xvclVJKHByb3AsIG5ld0NvbmZpZyk7XG4gIGNvbnN0IG5ld1Zpc0NvbmZpZyA9IG5ld0xheWVyLmNvbmZpZy52aXNDb25maWdbcHJvcF07XG4gIGlmIChvbGRWaXhDb25maWcgIT09IG5ld1Zpc0NvbmZpZykge1xuICAgIHJldHVybiBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICAgIG9sZExheWVyLFxuICAgICAgbmV3VmlzQ29uZmlnOiB7XG4gICAgICAgIFtwcm9wXTogbmV3VmlzQ29uZmlnXG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IHN0YXRlLmxheWVycy5tYXAobCA9PiAobC5pZCA9PT0gb2xkTGF5ZXIuaWQgPyBuZXdMYXllciA6IGwpKVxuICB9O1xufTtcblxuLyoqXG4gKiBTdGFydCBhbmQgZW5kIGZpbHRlciBhbmltYXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVGaWx0ZXJBbmltYXRpb25VcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUZpbHRlckFuaW1hdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGFjdGlvbi5pZHggPyB7Li4uZiwgaXNBbmltYXRpbmc6ICFmLmlzQW5pbWF0aW5nfSA6IGYpKVxufSk7XG5cbi8qKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUxheWVyQW5pbWF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaXNBbmltYXRpbmc6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaXNBbmltYXRpbmdcbiAgfVxufSk7XG5cbi8qKlxuICogSGlkZSBhbmQgc2hvdyBsYXllciBhbmltYXRpb24gY29udHJvbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuVG9nZ2xlTGF5ZXJBbmltYXRpb25Db250cm9sVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICBoaWRlQ29udHJvbDogIXN0YXRlLmFuaW1hdGlvbkNvbmZpZy5oaWRlQ29udHJvbFxuICB9XG59KTtcblxuLyoqXG4gKiBDaGFuZ2UgZmlsdGVyIGFuaW1hdGlvbiBzcGVlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGFjdGlvbi5pZHggPyB7Li4uZiwgc3BlZWQ6IGFjdGlvbi5zcGVlZH0gOiBmKSlcbn0pO1xuXG4vKipcbiAqIFJlc2V0IGFuaW1hdGlvbiBjb25maWcgY3VycmVudCB0aW1lIHRvIGEgc3BlY2lmaWVkIHZhbHVlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICpcbiAqL1xuZXhwb3J0IGNvbnN0IHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge3ZhbHVlfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgY3VycmVudFRpbWU6IHZhbHVlXG4gIH1cbn0pO1xuXG4vKipcbiAqIFVwZGF0ZSBhbmltYXRpb24gc3BlZWQgd2l0aCB0aGUgdmVydGljYWwgc3BlZWQgc2xpZGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICpcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtzcGVlZH06IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgc3BlZWRcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFNob3cgbGFyZ2VyIHRpbWUgZmlsdGVyIGF0IGJvdHRvbSBmb3IgdGltZSBwbGF5YmFjayAoYXBwbHkgdG8gdGltZSBmaWx0ZXIgb25seSlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJWaWV3VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJWaWV3VXBkYXRlckFjdGlvblxuKSA9PiB7XG4gIGNvbnN0IHt2aWV3LCBpZHh9ID0gYWN0aW9uO1xuICBjb25zdCBzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXcgPSB2aWV3ID09PSBGSUxURVJfVklFV19UWVBFUy5lbmxhcmdlZDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT5cbiAgICAgIGkgPT09IGlkeFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICB2aWV3XG4gICAgICAgICAgfVxuICAgICAgICA6IHNob3VsZFJlc2V0T3RoZXJGaWx0ZXJzVmlld1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICB2aWV3OiBGSUxURVJfVklFV19UWVBFUy5zaWRlXG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgZmlsdGVyIGZlYXR1cmUgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbYWN0aW9uLmlkeF07XG4gIGNvbnN0IGlzVmlzaWJsZSA9IGdldChmaWx0ZXIsIFsndmFsdWUnLCAncHJvcGVydGllcycsICdpc1Zpc2libGUnXSk7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihzdGF0ZSwge1xuICAgIGlkeDogYWN0aW9uLmlkeCxcbiAgICBwcm9wOiAnZW5hYmxlZCcsXG4gICAgdmFsdWU6ICFpc1Zpc2libGVcbiAgfSk7XG5cbiAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBhY3Rpb24uaWR4LFxuICAgIHByb3A6ICd2YWx1ZScsXG4gICAgdmFsdWU6IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZpbHRlci52YWx1ZSwgZmlsdGVyLmlkLCB7XG4gICAgICBpc1Zpc2libGU6ICFpc1Zpc2libGVcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZCwgaWR9ID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGNvbnN0IG5ld0ZpbHRlcnMgPSBbXG4gICAgLi4uc3RhdGUuZmlsdGVycy5zbGljZSgwLCBpZHgpLFxuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoaWR4ICsgMSwgc3RhdGUuZmlsdGVycy5sZW5ndGgpXG4gIF07XG5cbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoZGF0YUlkLCBzdGF0ZS5kYXRhc2V0cywgbmV3RmlsdGVycywgc3RhdGUubGF5ZXJzKTtcbiAgY29uc3QgbmV3RWRpdG9yID1cbiAgICBnZXRGaWx0ZXJJZEluRmVhdHVyZShzdGF0ZS5lZGl0b3Iuc2VsZWN0ZWRGZWF0dXJlKSA9PT0gaWRcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICAgICAgfVxuICAgICAgOiBzdGF0ZS5lZGl0b3I7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycyddLCBuZXdGaWx0ZXJzLCBzdGF0ZSk7XG4gIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnXSwgZmlsdGVyZWREYXRhc2V0cywgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2VkaXRvciddLCBuZXdFZGl0b3IsIG5ld1N0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG5ld1N0YXRlLCBkYXRhSWQsIHVuZGVmaW5lZCk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZExheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgbGV0IG5ld0xheWVyO1xuICBsZXQgbmV3TGF5ZXJEYXRhO1xuICBpZiAoYWN0aW9uLmNvbmZpZykge1xuICAgIG5ld0xheWVyID0gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlLCBhY3Rpb24uY29uZmlnKTtcbiAgICBpZiAoIW5ld0xheWVyKSB7XG4gICAgICBDb25zb2xlLndhcm4oXG4gICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIGxheWVyIGZyb20gY29uZmlnLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBjb25maWcgaXMgbm90IGJlIGluIGNvcnJlY3QgZm9ybWF0JyxcbiAgICAgICAgYWN0aW9uLmNvbmZpZ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlKTtcbiAgICBuZXdMYXllciA9IHJlc3VsdC5sYXllcjtcbiAgICBuZXdMYXllckRhdGEgPSByZXN1bHQubGF5ZXJEYXRhO1xuICB9IGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBsYXllciB3aXRoIGEgc3BlY2lmaWMgZGF0YXNldCBvciBhIGRlZmF1bHQgb25lXG4gICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBhY3Rpb24uZGF0YXNldElkID8/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKVswXTtcbiAgICBuZXdMYXllciA9IG5ldyBMYXllcih7XG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGRhdGFJZDogZGVmYXVsdERhdGFzZXRcbiAgICB9KTtcbiAgICBuZXdMYXllckRhdGEgPSB7fTtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IFsuLi5zdGF0ZS5sYXllcnMsIG5ld0xheWVyXSxcbiAgICBsYXllckRhdGE6IFsuLi5zdGF0ZS5sYXllckRhdGEsIG5ld0xheWVyRGF0YV0sXG4gICAgLy8gYWRkIG5ldyBsYXllciBhdCB0aGUgdG9wXG4gICAgbGF5ZXJPcmRlcjogW25ld0xheWVyLmlkLCAuLi5zdGF0ZS5sYXllck9yZGVyXSxcbiAgICBzcGxpdE1hcHM6IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAoc3RhdGUuc3BsaXRNYXBzLCBuZXdMYXllcilcbiAgfTtcblxuICBpZiAobmV3TGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiByZW1vdmUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMYXllclVwZGF0ZXI8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICBjb25zdCBpZHggPSBOdW1iZXIuaXNGaW5pdGUoaWQpXG4gICAgPyAvLyBzdXBwb3J0IG9sZGVyIEFQSSwgcmVtb3ZlIGxheWVyIGJ5IGlkeFxuICAgICAgTnVtYmVyKGlkKVxuICAgIDogc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmxheWVycy5sZW5ndGgpIHtcbiAgICAvLyBpbnZhbGlkIGluZGV4XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHJlbW92ZSBsYXllciB3aXRoIGludmFsaWQgaWR8aWR4ICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhLCBsYXllck9yZGVyLCBjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG4gIGNvbnN0IGxheWVyVG9SZW1vdmUgPSBsYXllcnNbaWR4XTtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBmaWx0ZXJPdXRCeUlkKGxheWVyVG9SZW1vdmUuaWQpKGxheWVycyksXG4gICAgbGF5ZXJEYXRhOiByZW1vdmVFbGVtZW50QXRJbmRleChpZHgpKGxheWVyRGF0YSksXG4gICAgbGF5ZXJPcmRlcjogbGF5ZXJPcmRlci5maWx0ZXIobGF5ZXJJZCA9PiBsYXllcklkICE9PSBsYXllclRvUmVtb3ZlLmlkKSxcbiAgICBjbGlja2VkOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGNsaWNrZWQpID8gdW5kZWZpbmVkIDogY2xpY2tlZCxcbiAgICBob3ZlckluZm86IGxheWVyVG9SZW1vdmUuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mbyxcbiAgICBzcGxpdE1hcHM6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyVG9SZW1vdmUpXG4gICAgLy8gVE9ETzogdXBkYXRlIGZpbHRlcnMsIGNyZWF0ZSBoZWxwZXIgdG8gcmVtb3ZlIGxheWVyIGZvcm0gZmlsdGVyIChyZW1vdmUgbGF5ZXJpZCBhbmQgZGF0YWlkKSBpZiBtYXBwZWRcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbn1cblxuLyoqXG4gKiBSZW9yZGVyIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckxheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7b3JkZXJ9OiBWaXNTdGF0ZUFjdGlvbnMuUmVvcmRlckxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxheWVyT3JkZXI6IG9yZGVyXG59KTtcblxuLyoqXG4gKiBkdXBsaWNhdGUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLkR1cGxpY2F0ZUxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBOdW1iZXIuaXNGaW5pdGUoaWQpXG4gICAgPyAvLyBzdXBwb3J0IG9sZGVyIEFQSSwgcmVtb3ZlIGxheWVyIGJ5IGlkeFxuICAgICAgTnVtYmVyKGlkKVxuICAgIDogc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgIXN0YXRlLmxheWVyc1tpZHhdKSB7XG4gICAgQ29uc29sZS53YXJuKGBsYXllciAke2lkeH0gbm90IGZvdW5kIGluIGxheWVyT3JkZXJgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7bGF5ZXJzfSA9IHN0YXRlO1xuICBjb25zdCBvcmlnaW5hbCA9IGxheWVyc1tpZHhdO1xuXG4gIGNvbnN0IG9yaWdpbmFsTGF5ZXJPcmRlcklkeCA9IHN0YXRlLmxheWVyT3JkZXIuZmluZEluZGV4KGxpZCA9PiBsaWQgPT09IG9yaWdpbmFsLmlkKTtcbiAgbGV0IG5ld0xhYmVsID0gYENvcHkgb2YgJHtvcmlnaW5hbC5jb25maWcubGFiZWx9YDtcbiAgbGV0IHBvc3RmaXggPSAwO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gIHdoaWxlIChsYXllcnMuZmluZChsID0+IGwuY29uZmlnLmxhYmVsID09PSBuZXdMYWJlbCkpIHtcbiAgICBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfSAkeysrcG9zdGZpeH1gO1xuICB9XG5cbiAgLy8gY29sbGVjdCBsYXllciBjb25maWcgZnJvbSBvcmlnaW5hbFxuICBjb25zdCBsb2FkZWRMYXllciA9IHNlcmlhbGl6ZUxheWVyKG9yaWdpbmFsLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIC8vIGFzc2lnbiBuZXcgaWQgYW5kIGxhYmVsIHRvIGNvcGllZCBsYXllclxuICBpZiAoIWxvYWRlZExheWVyPy5jb25maWcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbG9hZGVkTGF5ZXIuY29uZmlnLmxhYmVsID0gbmV3TGFiZWw7XG4gIGxvYWRlZExheWVyLmlkID0gZ2VuZXJhdGVIYXNoSWQoTEFZRVJfSURfTEVOR1RIKTtcblxuICAvLyBhZGQgbGF5ZXIgdG8gc3RhdGVcbiAgbGV0IG5leHRTdGF0ZSA9IGFkZExheWVyVXBkYXRlcihzdGF0ZSwge2NvbmZpZzogbG9hZGVkTGF5ZXJ9KTtcbiAgLy8gcmV0cmlldmUgbmV3bHkgY3JlYXRlZCBsYXllclxuICBjb25zdCBuZXdMYXllciA9IG5leHRTdGF0ZS5sYXllcnNbbmV4dFN0YXRlLmxheWVycy5sZW5ndGggLSAxXTtcbiAgLy8gdXBkYXRlIGxheWVyIG9yZGVyIHdpdGggbmV3THlhZXIuaWRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGFycmF5SW5zZXJ0KFxuICAgIG5leHRTdGF0ZS5sYXllck9yZGVyLnNsaWNlKDEsIG5leHRTdGF0ZS5sYXllck9yZGVyLmxlbmd0aCksXG4gICAgb3JpZ2luYWxMYXllck9yZGVySWR4LFxuICAgIG5ld0xheWVyLmlkXG4gICk7XG5cbiAgbmV4dFN0YXRlID0gcmVvcmRlckxheWVyVXBkYXRlcihuZXh0U3RhdGUsIHtvcmRlcjogbmV3TGF5ZXJPcmRlcn0pO1xuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBuZXdFZmZlY3QgPSBjcmVhdGVFZmZlY3QoYWN0aW9uLmNvbmZpZyk7XG5cbiAgLy8gY29sbGFwc2UgY29uZmlndXJhdG9ycyBmb3Igb3RoZXIgZWZmZWN0c1xuICBzdGF0ZS5lZmZlY3RzLmZvckVhY2goZWZmZWN0ID0+IGVmZmVjdC5zZXRQcm9wcyh7aXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xuXG4gIGNvbnN0IGVmZmVjdHMgPSBbLi4uc3RhdGUuZWZmZWN0cywgbmV3RWZmZWN0XTtcbiAgY29uc3QgZWZmZWN0T3JkZXIgPSBmaXhFZmZlY3RPcmRlcihlZmZlY3RzLCBbbmV3RWZmZWN0LmlkLCAuLi5zdGF0ZS5lZmZlY3RPcmRlcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBzdGF0ZS5lZmZlY3RzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmVmZmVjdHMubGVuZ3RoKSB7XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHJlbW92ZSBlZmZlY3Qgd2l0aCBpbnZhbGlkIGlkICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2VmZmVjdHMsIGVmZmVjdE9yZGVyfSA9IHN0YXRlO1xuICBjb25zdCBlZmZlY3RUb1JlbW92ZSA9IGVmZmVjdHNbaWR4XTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeGVkIGluIHRzXG4gICAgZWZmZWN0czogZmlsdGVyT3V0QnlJZChlZmZlY3RUb1JlbW92ZS5pZCkoZWZmZWN0cyksXG4gICAgZWZmZWN0T3JkZXI6IGVmZmVjdE9yZGVyLmZpbHRlcihlZmZlY3RJZCA9PiBlZmZlY3RJZCAhPT0gZWZmZWN0VG9SZW1vdmUuaWQpXG4gIH07XG59O1xuXG4vKipcbiAqIFJlb3JkZXIgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZWZmZWN0T3JkZXI6IGZpeEVmZmVjdE9yZGVyKHN0YXRlLmVmZmVjdHMsIFsuLi5vcmRlcl0pXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIHByb3BzfTogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5lZmZlY3RzLmxlbmd0aCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgZWZmZWN0IHdpdGggaW52YWxpZCBpZCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxldCBlZmZlY3RPcmRlciA9IHN0YXRlLmVmZmVjdE9yZGVyO1xuICBpZiAocHJvcHMuaWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5pZCAhPT0gaWQpIHtcbiAgICBjb25zdCBpZHgyID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBwcm9wcy5pZCk7XG4gICAgaWYgKGlkeDIgPj0gMCkge1xuICAgICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHVwZGF0ZSBlZmZlY3Qgd2l0aCBleGlzdGluZyBlZmZlY3QgaWQgJHtpZH1gKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBlZmZlY3RPcmRlciA9IGVmZmVjdE9yZGVyLm1hcChlZmZlY3RPcmRlcklkID0+XG4gICAgICBlZmZlY3RPcmRlcklkID09PSBpZCA/IChwcm9wcy5pZCBhcyBzdHJpbmcpIDogZWZmZWN0T3JkZXJJZFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXdFZmZlY3RzID0gWy4uLnN0YXRlLmVmZmVjdHNdO1xuICBuZXdFZmZlY3RzW2lkeF0uc2V0UHJvcHMocHJvcHMpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0czogbmV3RWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLyoqXG4gKiBSZW1vdmUgYSBkYXRhc2V0IGFuZCBhbGwgbGF5ZXJzLCBmaWx0ZXJzLCB0b29sdGlwIGNvbmZpZ3MgdGhhdCBiYXNlZCBvbiBpdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZURhdGFzZXRVcGRhdGVyPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVEYXRhc2V0VXBkYXRlckFjdGlvblxuKTogVCB7XG4gIC8vIGV4dHJhY3QgZGF0YXNldCBrZXlcbiAgY29uc3Qge2RhdGFJZDogZGF0YXNldEtleX0gPSBhY3Rpb247XG4gIGNvbnN0IHtkYXRhc2V0c30gPSBzdGF0ZTtcblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGlzIHByZXNlbnRcbiAgaWYgKCFkYXRhc2V0c1tkYXRhc2V0S2V5XSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gIGNvbnN0IHtcbiAgICBsYXllcnMsXG4gICAgZGF0YXNldHM6IHtbZGF0YXNldEtleV06IGRhdGFzZXQsIC4uLm5ld0RhdGFzZXRzfVxuICB9ID0gc3RhdGU7XG4gIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuICBjb25zdCBsYXllcnNUb1JlbW92ZSA9IGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXRLZXkpLm1hcChsID0+IGwuaWQpO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGxldCBuZXdTdGF0ZSA9IGxheWVyc1RvUmVtb3ZlLnJlZHVjZSgoYWNjdSwgaWQpID0+IHJlbW92ZUxheWVyVXBkYXRlcihhY2N1LCB7aWR9KSwge1xuICAgIC4uLnN0YXRlLFxuICAgIGRhdGFzZXRzOiBuZXdEYXRhc2V0c1xuICB9KTtcblxuICAvLyByZW1vdmUgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzID0gbmV3U3RhdGUuZmlsdGVycy5maWx0ZXIoZmlsdGVyID0+ICFmaWx0ZXIuZGF0YUlkLmluY2x1ZGVzKGRhdGFzZXRLZXkpKTtcblxuICBuZXdTdGF0ZSA9IHsuLi5uZXdTdGF0ZSwgZmlsdGVyc307XG5cbiAgcmV0dXJuIHJlbW92ZURhdGFzZXRGcm9tSW50ZXJhY3Rpb25Db25maWcobmV3U3RhdGUsIHtkYXRhSWQ6IGRhdGFzZXRLZXl9KTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhzdGF0ZSwge2RhdGFJZH0pIHtcbiAgbGV0IHtpbnRlcmFjdGlvbkNvbmZpZ30gPSBzdGF0ZTtcbiAgY29uc3Qge3Rvb2x0aXB9ID0gaW50ZXJhY3Rpb25Db25maWc7XG4gIGlmICh0b29sdGlwKSB7XG4gICAgY29uc3Qge2NvbmZpZ30gPSB0b29sdGlwO1xuICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4gICAgY29uc3Qge1tkYXRhSWRdOiBmaWVsZHMsIC4uLmZpZWxkc1RvU2hvd30gPSBjb25maWcuZmllbGRzVG9TaG93O1xuICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbiAgICBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDogey4uLnRvb2x0aXAsIGNvbmZpZzogey4uLmNvbmZpZywgZmllbGRzVG9TaG93fX1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9O1xufVxuLyoqXG4gKiB1cGRhdGUgbGF5ZXIgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIHVwZGF0ZSBvdmVybGF5IGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBvdmVybGF5QmxlbmRpbmc6IGFjdGlvbi5tb2RlXG59KTtcblxuLyoqXG4gKiBEaXNwbGF5IGRhdGFzZXQgdGFibGUgaW4gYSBtb2RhbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNob3dEYXRhc2V0VGFibGVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdGluZ0RhdGFzZXQ6IGFjdGlvbi5kYXRhSWRcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGN1c3RvbSBjb2xvciBmb3IgZGF0YXNldHMgYW5kIGxheWVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRDb2xvclVwZGF0ZXJcbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7Y29sb3I6IGFjdGlvbi5uZXdDb2xvcn19KTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7fSwgb3B0aW9ucyA9IHt9fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKCFjb25maWcudmlzU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7a2VlcEV4aXN0aW5nQ29uZmlnfSA9IG9wdGlvbnM7XG5cbiAgLy8gcmVzZXQgY29uZmlnIGlmIGtlZXBFeGlzdGluZ0NvbmZpZyBpcyBmYWxzeVxuICBsZXQgbWVyZ2VkU3RhdGUgPSAha2VlcEV4aXN0aW5nQ29uZmlnID8gcmVzZXRNYXBDb25maWdVcGRhdGVyKHN0YXRlKSA6IHN0YXRlO1xuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBzdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBoYXNQcm9wc1RvTWVyZ2UoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCkpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKFxuICAgICAgICBtZXJnZWRTdGF0ZSxcbiAgICAgICAgZ2V0UHJvcFZhbHVlVG9NZXJnZXIoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKSxcbiAgICAgICAgLy8gZnJvbUNvbmZpZ1xuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBob3ZlciBldmVudCB3aXRoIGhvdmVyZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJIb3ZlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckhvdmVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGhvdmVySW5mbzoge1xuICAgIC8vIGRlY2suZ2wgaW5mbyBpcyBtdXRhYmxlXG4gICAgLi4uYWN0aW9uLmluZm9cbiAgfVxufSk7XG5cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBVcGRhdGUgYGludGVyYWN0aW9uQ29uZmlnYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGludGVyYWN0aW9uQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5JbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2NvbmZpZ30gPSBhY3Rpb247XG5cbiAgY29uc3QgaW50ZXJhY3Rpb25Db25maWcgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcsXG4gICAgLi4ue1tjb25maWcuaWRdOiBjb25maWd9XG4gIH07XG5cbiAgLy8gRG9uJ3QgZW5hYmxlIHRvb2x0aXAgYW5kIGJydXNoIGF0IHRoZSBzYW1lIHRpbWVcbiAgLy8gYnV0IGNvb3JkaW5hdGVzIGNhbiBiZSBzaG93biBhdCBhbGwgdGltZVxuICBjb25zdCBjb250cmFkaWN0ID0gWydicnVzaCcsICd0b29sdGlwJ107XG5cbiAgaWYgKFxuICAgIGNvbnRyYWRpY3QuaW5jbHVkZXMoY29uZmlnLmlkKSAmJlxuICAgIGNvbmZpZy5lbmFibGVkICYmXG4gICAgIXN0YXRlLmludGVyYWN0aW9uQ29uZmlnW2NvbmZpZy5pZF0uZW5hYmxlZFxuICApIHtcbiAgICAvLyBvbmx5IGVuYWJsZSBvbmUgaW50ZXJhY3Rpb24gYXQgYSB0aW1lXG4gICAgY29udHJhZGljdC5mb3JFYWNoKGsgPT4ge1xuICAgICAgaWYgKGsgIT09IGNvbmZpZy5pZCkge1xuICAgICAgICBpbnRlcmFjdGlvbkNvbmZpZ1trXSA9IHsuLi5pbnRlcmFjdGlvbkNvbmZpZ1trXSwgZW5hYmxlZDogZmFsc2V9O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgaW50ZXJhY3Rpb25Db25maWdcbiAgfTtcblxuICBpZiAoY29uZmlnLmlkID09PSAnZ2VvY29kZXInICYmICFjb25maWcuZW5hYmxlZCkge1xuICAgIHJldHVybiByZW1vdmVEYXRhc2V0VXBkYXRlcihuZXdTdGF0ZSwge2RhdGFJZDogJ2dlb2NvZGVyX2RhdGFzZXQnfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBjbGljayBldmVudCB3aXRoIGNsaWNrZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckNsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIG1vdXNlUG9zOiBzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy5jb29yZGluYXRlLmVuYWJsZWRcbiAgICA/IHtcbiAgICAgICAgLi4uc3RhdGUubW91c2VQb3MsXG4gICAgICAgIHBpbm5lZDogc3RhdGUubW91c2VQb3MucGlubmVkID8gbnVsbCA6IGNsb25lRGVlcChzdGF0ZS5tb3VzZVBvcylcbiAgICAgIH1cbiAgICA6IHN0YXRlLm1vdXNlUG9zLFxuICBjbGlja2VkOiBhY3Rpb24uaW5mbyAmJiBhY3Rpb24uaW5mby5waWNrZWQgPyBhY3Rpb24uaW5mbyA6IG51bGxcbn0pO1xuXG4vKipcbiAqIFRyaWdnZXIgbWFwIGNsaWNrIGV2ZW50LCB1bnNlbGVjdCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcENsaWNrVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Pbk1hcENsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG51bGxcbiAgfTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgbW92ZSBldmVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1vdXNlTW92ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2V2dH06IFZpc1N0YXRlQWN0aW9ucy5Pbk1vdXNlTW92ZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUuaW50ZXJhY3Rpb25Db25maWcpLnNvbWUoY29uZmlnID0+IGNvbmZpZy5lbmFibGVkKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1vdXNlUG9zOiB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQucG9pbnQpID8ge21vdXNlUG9zaXRpb246IFsuLi5ldnQucG9pbnRdfSA6IHt9KSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LmxuZ0xhdCkgPyB7Y29vcmRpbmF0ZTogWy4uLmV2dC5sbmdMYXRdfSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGZvciBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gIHN0YXRlLnNwbGl0TWFwcyAmJiBzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID09PSAwXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGFuIGFycmF5IHRvIHN0b3JlIHN0YXRlIGZvciBhIHNpbmdsZSBtYXAgYXMgd2VsbFxuICAgICAgICAvLyBpZiBjdXJyZW50IG1hcHMgbGVuZ3RoIGlzIGVxdWFsIHRvIDAgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3BsaXQgdGhlIHZpZXdcbiAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMoc3RhdGUubGF5ZXJzLCB7ZHVwbGljYXRlOiBmYWxzZX0pXG4gICAgICB9XG4gICAgOiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleChzdGF0ZSwgYWN0aW9uKTtcblxuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGluIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHttYXBJbmRleCwgbGF5ZXJJZH06IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckZvck1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3NwbGl0TWFwc30gPSBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogc3BsaXRNYXBzLm1hcCgoc20sIGkpID0+XG4gICAgICBpID09PSBtYXBJbmRleFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXSxcbiAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAuLi5zcGxpdE1hcHNbaV0ubGF5ZXJzLFxuICAgICAgICAgICAgICAvLyBpZiBsYXllcklkIG5vdCBpbiBsYXllcnMsIHNldCBpdCB0byB2aXNpYmxlXG4gICAgICAgICAgICAgIFtsYXllcklkXTogIXNwbGl0TWFwc1tpXS5sYXllcnNbbGF5ZXJJZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc21cbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcblxuICAvLyBhcHBseSBjb25maWcgaWYgcGFzc2VkIGZyb20gYWN0aW9uXG4gIC8vIFRPRE86IHdlIGRvbid0IGhhbmRsZSBhc3luIG1lcmdlcnMgaGVyZSB5ZXRcbiAgY29uc3QgcHJldmlvdXNTdGF0ZSA9IGNvbmZpZ1xuICAgID8gcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIoc3RhdGUsIHtcbiAgICAgICAgcGF5bG9hZDoge2NvbmZpZywgb3B0aW9uc31cbiAgICAgIH0pXG4gICAgOiBzdGF0ZTtcblxuICBjb25zdCBkYXRhc2V0cyA9IHRvQXJyYXkoYWN0aW9uLmRhdGFzZXRzKTtcblxuICBjb25zdCBuZXdEYXRhRW50cmllcyA9IGRhdGFzZXRzLnJlZHVjZShcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yICBUeXBlICd7fScgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlICdQcm90b0RhdGFzZXQnOiBkYXRhLCBpbmZvXG4gICAgKGFjY3UsIHtpbmZvID0ge30sIC4uLnJlc3R9ID0ge30pID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKSB8fCB7fSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIC8vIHNhdmUgbmV3IGRhdGFzZXQgZW50cnkgdG8gc3RhdGVcbiAgY29uc3QgbWVyZ2VkU3RhdGUgPSB7XG4gICAgLi4ucHJldmlvdXNTdGF0ZSxcbiAgICBkYXRhc2V0czogbWVyZ2VEYXRhc2V0c0J5T3JkZXIocHJldmlvdXNTdGF0ZSwgbmV3RGF0YUVudHJpZXMpXG4gIH07XG5cbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IGxheWVyTWVyZ2VycyA9IHN0YXRlLm1lcmdlcnMuZmlsdGVyKG0gPT4gbS53YWl0Rm9yTGF5ZXJEYXRhKTtcbiAgY29uc3QgZGF0YXNldE1lcmdlcnMgPSBzdGF0ZS5tZXJnZXJzLmZpbHRlcihtID0+ICFsYXllck1lcmdlcnMuaW5jbHVkZXMobSkpO1xuXG4gIGNvbnN0IG5ld0RhdGFJZHMgPSBPYmplY3Qua2V5cyhuZXdEYXRhRW50cmllcyk7XG4gIGNvbnN0IHBvc3RNZXJnZXJQYXlsb2FkID0ge1xuICAgIG5ld0RhdGFJZHMsXG4gICAgb3B0aW9ucyxcbiAgICBsYXllck1lcmdlcnNcbiAgfTtcblxuICByZXR1cm4gYXBwbHlNZXJnZXJzVXBkYXRlcihtZXJnZWRTdGF0ZSwge21lcmdlcnM6IGRhdGFzZXRNZXJnZXJzLCBwb3N0TWVyZ2VyUGF5bG9hZH0pO1xufTtcblxuLyoqXG4gKiBBZGQgbmV3IGRhdGFzZXQgdG8gYHZpc1N0YXRlYCwgd2l0aCBvcHRpb24gdG8gbG9hZCBhIG1hcCBjb25maWcgYWxvbmcgd2l0aCB0aGUgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TWVyZ2Vyc1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiB7XG4gICAgbWVyZ2VyczogTWVyZ2VyPGFueT5bXTtcbiAgICBwb3N0TWVyZ2VyUGF5bG9hZDogUG9zdE1lcmdlclBheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge21lcmdlcnMsIHBvc3RNZXJnZXJQYXlsb2FkfSA9IGFjdGlvbjtcblxuICAvLyBtZXJnZSBzdGF0ZSB3aXRoIGNvbmZpZyB0byBiZSBtZXJnZWRcbiAgY29uc3QgbWVyZ2VTdGF0ZVJlc3VsdCA9IG1lcmdlU3RhdGVGcm9tTWVyZ2VycyhcbiAgICBzdGF0ZSxcbiAgICB7XG4gICAgICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgICAgIC4uLnN0YXRlLmluaXRpYWxTdGF0ZVxuICAgIH0sXG4gICAgbWVyZ2VycyxcbiAgICAvLyBuZXdEYXRhSWRzLFxuICAgIHBvc3RNZXJnZXJQYXlsb2FkXG4gICk7XG5cbiAgLy8gaWYgYWxsIG1lcmdlZCwga2lja3VwIHBvc3QgbWVyZ2UgcHJvY2Vzc1xuICAvLyBpZiBub3Qgd2FpdFxuICByZXR1cm4gbWVyZ2VTdGF0ZVJlc3VsdC5hbGxNZXJnZWRcbiAgICA/IHBvc3RNZXJnZVVwZGF0ZXIobWVyZ2VTdGF0ZVJlc3VsdC5tZXJnZWRTdGF0ZSwgcG9zdE1lcmdlclBheWxvYWQpXG4gICAgOiBtZXJnZVN0YXRlUmVzdWx0Lm1lcmdlZFN0YXRlO1xufVxuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICovXG5mdW5jdGlvbiBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlZFN0YXRlOiBWaXNTdGF0ZSwgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkKTogVmlzU3RhdGUge1xuICBjb25zdCB7bmV3RGF0YUlkcywgb3B0aW9ucywgbGF5ZXJNZXJnZXJzfSA9IHBvc3RNZXJnZXJQYXlsb2FkO1xuICBjb25zdCBuZXdGaWx0ZXJzID0gbWVyZ2VkU3RhdGUuZmlsdGVycy5maWx0ZXIoZiA9PlxuICAgIGYuZGF0YUlkLmZpbmQoZkRhdGFJZCA9PiBuZXdEYXRhSWRzLmluY2x1ZGVzKGZEYXRhSWQpKVxuICApO1xuICBjb25zdCBkYXRhc2V0RmlsdGVyZWQ6IHN0cmluZ1tdID0gdW5pcShcbiAgICBuZXdGaWx0ZXJzLnJlZHVjZSgoYWNjdSwgZikgPT4gWy4uLmFjY3UsIC4uLmYuZGF0YUlkXSwgW10gYXMgc3RyaW5nW10pXG4gICk7XG4gIGNvbnN0IGRhdGFFbXB0eSA9IG5ld0RhdGFJZHMubGVuZ3RoIDwgMTtcblxuICBsZXQgbmV3TGF5ZXJzID0gIWRhdGFFbXB0eVxuICAgID8gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBuZXdEYXRhSWRzLmluY2x1ZGVzKGwuY29uZmlnLmRhdGFJZCkpXG4gICAgOiBbXTtcblxuICBjb25zdCBuZXdEYXRhRW50cmllcyA9IG5ld0RhdGFJZHMucmVkdWNlKFxuICAgIChhY2N1LCBpZCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbaWRdOiBtZXJnZWRTdGF0ZS5kYXRhc2V0c1tpZF1cbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIGlmICghbmV3TGF5ZXJzLmxlbmd0aCAmJiAob3B0aW9ucyB8fCB7fSkuYXV0b0NyZWF0ZUxheWVycyAhPT0gZmFsc2UpIHtcbiAgICAvLyBubyBsYXllciBtZXJnZWQsIGZpbmQgZGVmYXVsdHNcbiAgICBjb25zdCByZXN1bHQgPSBhZGREZWZhdWx0TGF5ZXJzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllcyk7XG4gICAgbWVyZ2VkU3RhdGUgPSByZXN1bHQuc3RhdGU7XG4gICAgbmV3TGF5ZXJzID0gcmVzdWx0Lm5ld0xheWVycztcbiAgfVxuXG4gIGlmIChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgLy8gaWYgbWFwIGlzIHNwbGl0LCBhZGQgbmV3IGxheWVycyB0byBzcGxpdE1hcHNcbiAgICBuZXdMYXllcnMgPSBtZXJnZWRTdGF0ZS5sYXllcnMuZmlsdGVyKFxuICAgICAgbCA9PiBsLmNvbmZpZy5kYXRhSWQgJiYgbmV3RGF0YUlkcy5pbmNsdWRlcyhsLmNvbmZpZy5kYXRhSWQpXG4gICAgKTtcbiAgICBtZXJnZWRTdGF0ZSA9IHtcbiAgICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKG1lcmdlZFN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXJzKVxuICAgIH07XG4gIH1cblxuICAvLyBpZiBubyB0b29sdGlwcyBtZXJnZWQgYWRkIGRlZmF1bHQgdG9vbHRpcHNcbiAgbmV3RGF0YUlkcy5mb3JFYWNoKGRhdGFJZCA9PiB7XG4gICAgY29uc3QgdG9vbHRpcEZpZWxkcyA9IG1lcmdlZFN0YXRlLmludGVyYWN0aW9uQ29uZmlnLnRvb2x0aXAuY29uZmlnLmZpZWxkc1RvU2hvd1tkYXRhSWRdO1xuICAgIC8vIGxvYWRpbmcgZGF0YXNldDogYXV0b0NyZWF0ZVRvb2x0aXBzIGlzIGZhbHNlIGFuZCB3ZSBkb24ndCB3YW50IHRvIHJ1biBhZGREZWZhdWx0VG9vbHRpcHMgd2hlbiB0b29sdGlwRmllbGRzIGlzIGVtcHR5XG4gICAgaWYgKFxuICAgICAgb3B0aW9ucz8uYXV0b0NyZWF0ZVRvb2x0aXBzICE9PSBmYWxzZSAmJlxuICAgICAgKCFBcnJheS5pc0FycmF5KHRvb2x0aXBGaWVsZHMpIHx8ICF0b29sdGlwRmllbGRzLmxlbmd0aClcbiAgICApIHtcbiAgICAgIC8vIGFkZGluZyBkYXRhc2V0OiBhdXRvQ3JlYXRlVG9vbHRpcHMgaXMgdHJ1ZVxuICAgICAgbWVyZ2VkU3RhdGUgPSBhZGREZWZhdWx0VG9vbHRpcHMobWVyZ2VkU3RhdGUsIG5ld0RhdGFFbnRyaWVzW2RhdGFJZF0pO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgdXBkYXRlZERhdGFzZXRzID0gZGF0YUVtcHR5XG4gICAgPyBPYmplY3Qua2V5cyhtZXJnZWRTdGF0ZS5kYXRhc2V0cylcbiAgICA6IHVuaXEoT2JqZWN0LmtleXMobmV3RGF0YUVudHJpZXMpLmNvbmNhdChkYXRhc2V0RmlsdGVyZWQpKTtcblxuICBsZXQgdXBkYXRlZFN0YXRlID0gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG1lcmdlZFN0YXRlLCB1cGRhdGVkRGF0YXNldHMsIHVuZGVmaW5lZCk7XG5cbiAgLy8gcmVnaXN0ZXIgbGF5ZXIgYW5pbWF0aW9uIGRvbWFpbixcbiAgLy8gbmVlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgbGF5ZXIgZGF0YSBpcyBjYWxjdWxhdGVkXG4gIHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFuaW1hdGlvbkRvbWFpbih1cGRhdGVkU3RhdGUpO1xuXG4gIC8vIHRyeSB0byBwcm9jZXNzIGxheWVyTWVyZ2VycyBhZnRlciBkYXRhc2V0K2RhdGFzZXRNZXJnZXJzXG4gIHJldHVybiBsYXllck1lcmdlcnMgJiYgbGF5ZXJNZXJnZXJzLmxlbmd0aCA+IDBcbiAgICA/IGFwcGx5TWVyZ2Vyc1VwZGF0ZXIodXBkYXRlZFN0YXRlLCB7XG4gICAgICAgIG1lcmdlcnM6IGxheWVyTWVyZ2VycyxcbiAgICAgICAgcG9zdE1lcmdlclBheWxvYWQ6IHsuLi5wb3N0TWVyZ2VyUGF5bG9hZCwgbGF5ZXJNZXJnZXJzOiBbXX1cbiAgICAgIH0pXG4gICAgOiB1cGRhdGVkU3RhdGU7XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZURhdGFzZXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbmFtZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBwcm9wczoge2xhYmVsOiBhY3Rpb24ubGFiZWx9fSk7XG59XG5cbmNvbnN0IEFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMgPSBbJ2xhYmVsJywgJ2NvbG9yJywgJ21ldGFkYXRhJ107XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBkYXRhc2V0LlxuICogTWFrZXMgc3VyZSBlYWNoIHByb3BlcnR5IGlzIGluIHRoZSBhbGxvd2VkIGxpc3RcbiAqIE1ha2VzIHN1cmUgY29sb3IgdmFsdWUgaXMgUkdCXG4gKiBQZXJmb3JtcyBkZWVwIG1lcmdlIHdoZW4gdXBkYXRpbmcgbWV0YWRhdGFcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMgPSAocHJvcHMsIGRhdGFzZXQpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgLy8gaXMgaXQgYWxsb3dlZCA/XG4gICAgaWYgKCFBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGFkZGluZyBhIGNvbG9yIGJ1dCBpdCBpcyBub3QgUkdCIHdlIGRvbid0IGFjY2VwdCB0aGUgdmFsdWVcbiAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIHdlIGFkZCBtb3JlIHByb3BzIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyBpZiBpbnRvIGEgc3dpdGNoXG4gICAgaWYgKGtleSA9PT0gJ2NvbG9yJyAmJiAhaXNSZ2JDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gZG8gd2UgbmVlZCBkZWVwIG1lcmdlID9cbiAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGlzUGxhaW5PYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGRhdGFzZXRba2V5XSB8fCB7fSwgdmFsdWUpIDogdmFsdWV9O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlZFByb3BzO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgRGF0YXNldCBwcm9wcyAobGFiZWwsIGNvbG9yLCBtZXRhKS4gRG8gbm90IHVzZSB0byB1cGRhdGUgZGF0YSBvciBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtkYXRhSWQsIHByb3BzfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuICBjb25zdCBleGlzdGluZyA9IGRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyhwcm9wcywgZXhpc3RpbmcpO1xuICAgIC8vICB2YWxpZGF0ZSBwcm9wczoganVzdCBjb2xvciBmb3Igbm93XG4gICAgLy8gIHdlIG9ubHkgYWxsb3cgbGFiZWwsIGNvbG9yIGFuZCBtZXRhIHRvIGJlIHVwZGF0ZWRcbiAgICAvLyBjb25zdCBuZXdUYWJsZSA9IGNvcHlUYWJsZUFuZFVwZGF0ZShleGlzdGluZywgdmFsaWRhdGVkUHJvcHMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcylcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFdoZW4gYSB1c2VyIGNsaWNrcyBvbiB0aGUgc3BlY2lmaWMgbWFwIGNsb3NpbmcgaWNvblxuICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2xvc2UgdGhlIHNlbGVjdGVkIG1hcFxuICogYW5kIHdpbGwgbWVyZ2UgdGhlIHJlbWFpbmluZyBvbmUgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlXG4gKiBUT0RPOiBpIHRoaW5rIGluIHRoZSBmdXR1cmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBtZXJnZSBtYXAgbGF5ZXJzIHdpdGggZ2xvYmFsIHNldHRpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgYHZpc1N0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBhY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VTcGVjaWZpY01hcEF0SW5kZXg8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIC8vIHJldHJpZXZlIGxheWVycyBtZXRhIGRhdGEgZnJvbSB0aGUgcmVtYWluaW5nIG1hcCB0aGF0IHdlIG5lZWQgdG8ga2VlcFxuICBjb25zdCBpbmRleFRvUmV0cmlldmUgPSAxIC0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG1hcExheWVycyA9IHN0YXRlLnNwbGl0TWFwc1tpbmRleFRvUmV0cmlldmVdPy5sYXllcnM7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG5cbiAgLy8gdXBkYXRlIGxheWVyIHZpc2liaWxpdHlcbiAgY29uc3QgbmV3TGF5ZXJzID0gbGF5ZXJzLm1hcChsYXllciA9PlxuICAgIG1hcExheWVycyAmJiAhbWFwTGF5ZXJzW2xheWVyLmlkXSAmJiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBpdCBzaG91bGQgYmUgaW5WaXNpYmxlXG4gICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgOiBsYXllclxuICApO1xuXG4gIC8vIGRlbGV0ZSBtYXBcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBzcGxpdE1hcHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtmaWxlcywgb25GaW5pc2ggPSBsb2FkRmlsZXNTdWNjZXNzfSA9IGFjdGlvbjtcbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWxlTG9hZGluZ1Byb2dyZXNzID0gQXJyYXkuZnJvbShmaWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBmLCBpKSA9PiBtZXJnZV8oaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZiwgaSkpKGFjY3UpLFxuICAgIHt9XG4gICk7XG5cbiAgY29uc3QgZmlsZUxvYWRpbmcgPSB7XG4gICAgZmlsZUNhY2hlOiBbXSxcbiAgICBmaWxlc1RvTG9hZDogZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBtZXJnZV8oe2ZpbGVMb2FkaW5nUHJvZ3Jlc3MsIGZpbGVMb2FkaW5nfSkoc3RhdGUpO1xuXG4gIHJldHVybiBsb2FkTmV4dEZpbGVVcGRhdGVyKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFN1Y2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZVN0ZXBTdWNjZXNzQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVOYW1lLCBmaWxlQ2FjaGV9ID0gYWN0aW9uO1xuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNofSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAxLCBtZXNzYWdlOiAnRG9uZSd9XG4gIH0pO1xuXG4gIC8vIHNhdmUgcHJvY2Vzc2VkIGZpbGUgdG8gZmlsZUNhY2hlXG4gIGNvbnN0IHN0YXRlV2l0aENhY2hlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlQ2FjaGV9KSkoc3RhdGVXaXRoUHJvZ3Jlc3MpO1xuXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBzdGF0ZVdpdGhDYWNoZSxcbiAgICBERUxBWV9UQVNLKDIwMCkubWFwKGZpbGVzVG9Mb2FkLmxlbmd0aCA/IGxvYWROZXh0RmlsZSA6ICgpID0+IG9uRmluaXNoKGZpbGVDYWNoZSkpXG4gICk7XG59XG5cbi8vIHdpdGhUYXNrPFQ+KHN0YXRlOiBULCB0YXNrOiBhbnkpOiBUXG5cbi8qKlxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTmV4dEZpbGVVcGRhdGVyKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWR9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IFtmaWxlLCAuLi5yZW1haW5pbmdGaWxlc1RvTG9hZF0gPSBmaWxlc1RvTG9hZDtcblxuICAvLyBzYXZlIGZpbGVzVG9Mb2FkIHRvIHN0YXRlXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHBpY2tfKCdmaWxlTG9hZGluZycpKG1lcmdlXyh7ZmlsZXNUb0xvYWQ6IHJlbWFpbmluZ0ZpbGVzVG9Mb2FkfSkpKHN0YXRlKTtcblxuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKG5leHRTdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAwLCBtZXNzYWdlOiAnbG9hZGluZy4uLid9XG4gIH0pO1xuXG4gIGNvbnN0IHtsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBzdGF0ZTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIG1ha2VMb2FkRmlsZVRhc2soXG4gICAgICBmaWxlLFxuICAgICAgbmV4dFN0YXRlLmZpbGVMb2FkaW5nICYmIG5leHRTdGF0ZS5maWxlTG9hZGluZy5maWxlQ2FjaGUsXG4gICAgICBsb2FkZXJzLFxuICAgICAgbG9hZE9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9hZEZpbGVUYXNrKGZpbGUsIGZpbGVDYWNoZSwgbG9hZGVyczogTG9hZGVyW10gPSBbXSwgbG9hZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gTE9BRF9GSUxFX1RBU0soe2ZpbGUsIGZpbGVDYWNoZSwgbG9hZGVycywgbG9hZE9wdGlvbnN9KS5iaW1hcChcbiAgICAvLyBwcmV0dGllciBpZ25vcmVcbiAgICAvLyBzdWNjZXNzXG4gICAgZ2VuID0+XG4gICAgICBuZXh0RmlsZUJhdGNoKHtcbiAgICAgICAgZ2VuLFxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBvbkZpbmlzaDogcmVzdWx0ID0+XG4gICAgICAgICAgcHJvY2Vzc0ZpbGVDb250ZW50KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGZpbGVDYWNoZVxuICAgICAgICAgIH0pXG4gICAgICB9KSxcblxuICAgIC8vIGVycm9yXG4gICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlLm5hbWUsIGVycilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29udGVudCwgZmlsZUNhY2hlfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdwcm9jZXNzaW5nLi4uJ31cbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFBST0NFU1NfRklMRV9EQVRBKHtjb250ZW50LCBmaWxlQ2FjaGV9KS5iaW1hcChcbiAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSwgZmlsZUNhY2hlOiByZXN1bHR9KSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoY29udGVudC5maWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvZ3Jlc3MocHJldlByb2dyZXNzID0ge30sIHByb2dyZXNzKSB7XG4gIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlY2VpdmluZyBxdWVyeSBtZXRhZGF0YSBvciBvdGhlciBjYXNlcyB3ZSBkb24ndFxuICAvLyBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhlIHVzZXIuXG4gIGlmICghcHJvZ3Jlc3MgfHwgIXByb2dyZXNzLnBlcmNlbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmNlbnQ6IHByb2dyZXNzLnBlcmNlbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBnZXRzIGNhbGxlZCB3aXRoIHBheWxvYWQgPSBBc3luY0dlbmVyYXRvcjw/Pz8+XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbmV4dEZpbGVCYXRjaFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtnZW4sIGZpbGVOYW1lLCBwcm9ncmVzcywgYWNjdW11bGF0ZWQsIG9uRmluaXNofVxuICB9OiBWaXNTdGF0ZUFjdGlvbnMuTmV4dEZpbGVCYXRjaFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiBwYXJzZVByb2dyZXNzKHN0YXRlLmZpbGVMb2FkaW5nUHJvZ3Jlc3NbZmlsZU5hbWVdLCBwcm9ncmVzcylcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKHN0YXRlV2l0aFByb2dyZXNzLCBbXG4gICAgLi4uKGZpbGVOYW1lLmVuZHNXaXRoKCdhcnJvdycpICYmIGFjY3VtdWxhdGVkPy5kYXRhPy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICBQUk9DRVNTX0ZJTEVfREFUQSh7Y29udGVudDogYWNjdW11bGF0ZWQsIGZpbGVDYWNoZTogW119KS5iaW1hcChcbiAgICAgICAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCksXG4gICAgICAgICAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnIpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICBVTldSQVBfVEFTSyhnZW4ubmV4dCgpKS5iaW1hcChcbiAgICAgICh7dmFsdWUsIGRvbmV9KSA9PiB7XG4gICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgPyBvbkZpbmlzaChhY2N1bXVsYXRlZClcbiAgICAgICAgICA6IG5leHRGaWxlQmF0Y2goe1xuICAgICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICBwcm9ncmVzczogdmFsdWUucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgb25GaW5pc2hcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycilcbiAgICApXG4gIF0pO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxvYWRpbmcgZmlsZSBlcnJvclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2Vycm9yLCBmaWxlTmFtZX06IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIHVwZGF0ZSB1aSB3aXRoIGVycm9yIG1lc3NhZ2VcbiAgQ29uc29sZS53YXJuKGVycm9yKTtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNoLCBmaWxlQ2FjaGV9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge2Vycm9yfVxuICB9KTtcblxuICAvLyBraWNrIG9mZiBuZXh0IGZpbGUgb3IgZmluaXNoXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBuZXh0U3RhdGUsXG4gICAgREVMQVlfVEFTSygyMDApLm1hcChmaWxlc1RvTG9hZC5sZW5ndGggPyBsb2FkTmV4dEZpbGUgOiAoKSA9PiBvbkZpbmlzaChmaWxlQ2FjaGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBXaGVuIHNlbGVjdCBkYXRhc2V0IGZvciBleHBvcnQsIGFwcGx5IGNwdSBmaWx0ZXIgdG8gc2VsZWN0ZWQgZGF0YXNldFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q1BVRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkfTogVmlzU3RhdGVBY3Rpb25zLkFwcGx5Q1BVRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhcHBseSBjcHVGaWx0ZXJcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICByZXR1cm4gZGF0YUlkcy5yZWR1Y2UoKGFjY3UsIGlkKSA9PiBmaWx0ZXJEYXRhc2V0Q1BVKGFjY3UsIGlkKSwgc3RhdGUpO1xufTtcblxuLyoqXG4gKiBVc2VyIGlucHV0IHRvIHVwZGF0ZSB0aGUgaW5mbyBvZiB0aGUgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwSW5mb1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0TWFwSW5mb1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBJbmZvOiB7XG4gICAgLi4uc3RhdGUubWFwSW5mbyxcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbGwgbGF5ZXIgZG9tYWluIGFuZCBsYXllciBkYXRhIG9mIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0TGF5ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0c1xuKToge3N0YXRlOiBWaXNTdGF0ZTsgbmV3TGF5ZXJzOiBMYXllcltdfSB7XG4gIGNvbnN0IGVtcHR5OiBMYXllcltdID0gW107XG4gIGNvbnN0IGRlZmF1bHRMYXllcnMgPSBPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5yZWR1Y2UoKGFjY3U6IExheWVyW10sIGRhdGFzZXQpID0+IHtcbiAgICBjb25zdCBmb3VuZExheWVycyA9IGZpbmREZWZhdWx0TGF5ZXIoZGF0YXNldCwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgICByZXR1cm4gZm91bmRMYXllcnMgJiYgZm91bmRMYXllcnMubGVuZ3RoID8gYWNjdS5jb25jYXQoZm91bmRMYXllcnMpIDogYWNjdTtcbiAgfSwgZW1wdHkpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCAuLi5kZWZhdWx0TGF5ZXJzXSxcbiAgICAgIGxheWVyT3JkZXI6IFtcbiAgICAgICAgLy8gcHV0IG5ldyBsYXllcnMgb24gdG9wIG9mIG9sZCBvbmVzIGluIHJldmVyc2VcbiAgICAgICAgLi4uZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMoZGVmYXVsdExheWVycyksXG4gICAgICAgIC4uLnN0YXRlLmxheWVyT3JkZXJcbiAgICAgIF1cbiAgICB9LFxuICAgIG5ld0xheWVyczogZGVmYXVsdExheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRlZmF1bHQgdG9vbHRpcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFRvb2x0aXBzKHN0YXRlLCBkYXRhc2V0KSB7XG4gIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBmaW5kRmllbGRzVG9TaG93KHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIG1heERlZmF1bHRUb29sdGlwczogc3RhdGUubWF4RGVmYXVsdFRvb2x0aXBzXG4gIH0pO1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93LFxuICAgIC4uLnRvb2x0aXBGaWVsZHNcbiAgfTtcblxuICByZXR1cm4gc2V0KFsnaW50ZXJhY3Rpb25Db25maWcnLCAndG9vbHRpcCcsICdjb25maWcnLCAnZmllbGRzVG9TaG93J10sIG1lcmdlZCwgc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZmlsZSwgaW5kZXgpIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgYFVudGl0bGVkIEZpbGUgJHtpbmRleH1gO1xuICByZXR1cm4ge1xuICAgIFtmaWxlTmFtZV06IHtcbiAgICAgIC8vIHBlcmNlbnQgb2YgY3VycmVudCBmaWxlXG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtmaWxlTmFtZSwgcHJvZ3Jlc3N9KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIHBpY2tfKCdmaWxlTG9hZGluZ1Byb2dyZXNzJykocGlja18oZmlsZU5hbWUpKG1lcmdlXyhwcm9ncmVzcykpKShzdGF0ZSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgbGF5ZXIgZG9tYWlucyBmb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBkYXRhSWQ6IHN0cmluZyB8IHN0cmluZ1tdLFxuICB1cGRhdGVkRmlsdGVyPzogRmlsdGVyXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFJZHMgPSB0eXBlb2YgZGF0YUlkID09PSAnc3RyaW5nJyA/IFtkYXRhSWRdIDogZGF0YUlkO1xuICBjb25zdCBuZXdMYXllcnM6IExheWVyW10gPSBbXTtcbiAgY29uc3QgbmV3TGF5ZXJEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHN0YXRlLmxheWVycy5mb3JFYWNoKChvbGRMYXllciwgaSkgPT4ge1xuICAgIGlmIChvbGRMYXllci5jb25maWcuZGF0YUlkICYmIGRhdGFJZHMuaW5jbHVkZXMob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGF5ZXIgZG9tYWluIGlmIGZpbHRlciBoYXMgZml4ZWQgZG9tYWluXG4gICAgICBjb25zdCBuZXdMYXllciA9XG4gICAgICAgIHVwZGF0ZWRGaWx0ZXIgJiYgdXBkYXRlZEZpbHRlci5maXhlZERvbWFpblxuICAgICAgICAgID8gb2xkTGF5ZXJcbiAgICAgICAgICA6IG9sZExheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzLCB1cGRhdGVkRmlsdGVyKTtcblxuICAgICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgc3RhdGUubGF5ZXJEYXRhW2ldKTtcblxuICAgICAgbmV3TGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2gobGF5ZXJEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXJzLnB1c2gob2xkTGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2goc3RhdGUubGF5ZXJEYXRhW2ldKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIGxheWVyRGF0YTogbmV3TGF5ZXJEYXRhXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uRG9tYWluPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcbiAgLy8gbWVyZ2UgYWxsIGFuaW1hdGFibGUgbGF5ZXIgZG9tYWluIGFuZCB1cGRhdGUgZ2xvYmFsIGNvbmZpZ1xuICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gc3RhdGUubGF5ZXJzLmZpbHRlcihcbiAgICBsID0+XG4gICAgICBsLmNvbmZpZy5pc1Zpc2libGUgJiZcbiAgICAgIGwuY29uZmlnLmFuaW1hdGlvbiAmJlxuICAgICAgbC5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgJiZcbiAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgdHJpcC1sYXllci1vbmx5XG4gICAgICBBcnJheS5pc0FycmF5KGwuYW5pbWF0aW9uRG9tYWluKVxuICApO1xuXG4gIGlmICghYW5pbWF0YWJsZUxheWVycy5sZW5ndGgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4uc3RhdGUsXG4gICAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgICBkb21haW46IG51bGwsXG4gICAgICAgIGRlZmF1bHRUaW1lRm9ybWF0OiBudWxsXG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG1lcmdlZERvbWFpbjogW251bWJlciwgbnVtYmVyXSA9IGFuaW1hdGFibGVMYXllcnMucmVkdWNlKFxuICAgIChhY2N1LCBsYXllcikgPT4gW1xuICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciB0cmlwLWxheWVyLW9ubHlcbiAgICAgIE1hdGgubWluKGFjY3VbMF0sIGxheWVyLmFuaW1hdGlvbkRvbWFpblswXSksXG4gICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIHRyaXAtbGF5ZXItb25seVxuICAgICAgTWF0aC5tYXgoYWNjdVsxXSwgbGF5ZXIuYW5pbWF0aW9uRG9tYWluWzFdKVxuICAgIF0sXG4gICAgW051bWJlcihJbmZpbml0eSksIC1JbmZpbml0eV1cbiAgKTtcbiAgY29uc3QgZGVmYXVsdFRpbWVGb3JtYXQgPSBnZXRUaW1lV2lkZ2V0VGl0bGVGb3JtYXR0ZXIobWVyZ2VkRG9tYWluKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgY3VycmVudFRpbWU6IGlzSW5SYW5nZShzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWUsIG1lcmdlZERvbWFpbilcbiAgICAgICAgPyBzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWVcbiAgICAgICAgOiBtZXJnZWREb21haW5bMF0sXG4gICAgICBkb21haW46IG1lcmdlZERvbWFpbixcbiAgICAgIGRlZmF1bHRUaW1lRm9ybWF0XG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0b3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFZGl0b3JNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7bW9kZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRFZGl0b3JNb2RlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVkaXRvcjoge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBtb2RlLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9XG59KTtcblxuLy8gY29uc3QgZmVhdHVyZVRvRmlsdGVyVmFsdWUgPSAoZmVhdHVyZSkgPT4gKHsuLi5mZWF0dXJlLCBpZDogZmVhdHVyZS5pZH0pO1xuLyoqXG4gKiBVcGRhdGUgZWRpdG9yIGZlYXR1cmVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlcyA9IFtdfTogVmlzU3RhdGVBY3Rpb25zLlNldEZlYXR1cmVzVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBsYXN0RmVhdHVyZSA9IGZlYXR1cmVzLmxlbmd0aCAmJiBmZWF0dXJlc1tmZWF0dXJlcy5sZW5ndGggLSAxXTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIC8vIG9ubHkgc2F2ZSBub25lIGZpbHRlciBmZWF0dXJlcyB0byBlZGl0b3JcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5maWx0ZXIoZiA9PiAhZ2V0RmlsdGVySWRJbkZlYXR1cmUoZikpLFxuICAgICAgbW9kZTogbGFzdEZlYXR1cmUgJiYgbGFzdEZlYXR1cmUucHJvcGVydGllcy5pc0Nsb3NlZCA/IEVESVRPUl9NT0RFUy5FRElUIDogc3RhdGUuZWRpdG9yLm1vZGVcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgZXhpc3RpbmcgZmVhdHVyZVxuICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHN0YXRlLmVkaXRvcjtcblxuICAvLyBJZiBubyBmZWF0dXJlIGlzIHNlbGVjdGVkIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHNpbmNlIG5vIG9wZXJhdGlvbnNcbiAgaWYgKCFzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZmVhdHVyZSBoYXMgY2hhbmdlZFxuICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZS5pZCk7XG5cbiAgLy8gaWYgZmVhdHVyZSBpcyBwYXJ0IG9mIGEgZmlsdGVyXG4gIGNvbnN0IGZpbHRlcklkID0gZmVhdHVyZSAmJiBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcbiAgaWYgKGZpbHRlcklkICYmIGZlYXR1cmUpIHtcbiAgICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICAgIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZlYXR1cmUsIGZpbHRlcklkKTtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmaWwgPT4gZmlsLmlkID09PSBmaWx0ZXJJZCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogZmVhdHVyZVZhbHVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGZlYXR1cmVcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmUsIHNlbGVjdGlvbkNvbnRleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICBpZiAoZmVhdHVyZSAmJiBmZWF0dXJlLnByb3BlcnRpZXMpIGZlYXR1cmUucHJvcGVydGllcy5iYm94ID0gYmJveChmZWF0dXJlKTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZTogZmVhdHVyZSxcbiAgICAgIHNlbGVjdGlvbkNvbnRleHRcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIERlbGV0ZSBleGlzdGluZyBmZWF0dXJlIGZyb20gZmlsdGVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlfTogVmlzU3RhdGVBY3Rpb25zLkRlbGV0ZUZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghZmVhdHVyZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gICAgfVxuICB9O1xuXG4gIGlmIChnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKSkge1xuICAgIGNvbnN0IGZpbHRlcklkeCA9IG5ld1N0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSkpO1xuXG4gICAgcmV0dXJuIGZpbHRlcklkeCA+IC0xID8gcmVtb3ZlRmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge2lkeDogZmlsdGVySWR4fSkgOiBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIG1vZGlmeSBlZGl0b3Igb2JqZWN0XG4gIGNvbnN0IG5ld0VkaXRvciA9IHtcbiAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgZmVhdHVyZXM6IHN0YXRlLmVkaXRvci5mZWF0dXJlcy5maWx0ZXIoZiA9PiBmLmlkICE9PSBmZWF0dXJlLmlkKSxcbiAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjogbmV3RWRpdG9yXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGZlYXR1cmUgYXMgbGF5ZXIgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBwYXlsb2FkOiBWaXNTdGF0ZUFjdGlvbnMuU2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7bGF5ZXIsIGZlYXR1cmV9ID0gcGF5bG9hZDtcbiAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcblxuICAvLyBsZXQgbmV3RmlsdGVyID0gbnVsbDtcbiAgbGV0IGZpbHRlcklkeDtcbiAgbGV0IG5ld0xheWVySWQgPSBbbGF5ZXIuaWRdO1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgLy8gSWYgcG9seWdvbiBmaWx0ZXIgYWxyZWFkeSBleGlzdHMsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhlIGN1cnJlbnQgbGF5ZXIgaXMgYWxyZWFkeSBpbmNsdWRlZFxuICBpZiAoZmlsdGVySWQpIHtcbiAgICBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGZpbHRlcklkKTtcblxuICAgIGlmICghc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdKSB7XG4gICAgICAvLyB3aGF0IGlmIGZpbHRlciBkb2Vzbid0IGV4aXN0Py4uLiBub3QgcG9zc2libGUuXG4gICAgICAvLyBiZWNhdXNlIGZlYXR1cmVzIGluIHRoZSBlZGl0b3IgaXMgcGFzc2VkIGluIGZyb20gZmlsdGVycyBhbmQgZWRpdG9ycy5cbiAgICAgIC8vIGJ1dCB3ZSB3aWxsIG1vdmUgdGhpcyBmZWF0dXJlIGJhY2sgdG8gZWRpdG9yIGp1c3QgaW4gY2FzZVxuICAgICAgY29uc3Qgbm9uZUZpbHRlckZlYXR1cmUgPSB7XG4gICAgICAgIC4uLmZlYXR1cmUsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi5mZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgZmlsdGVySWQ6IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGVkaXRvcjoge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBmZWF0dXJlczogWy4uLnN0YXRlLmVkaXRvci5mZWF0dXJlcywgbm9uZUZpbHRlckZlYXR1cmVdLFxuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbm9uZUZpbHRlckZlYXR1cmVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdO1xuICAgIGNvbnN0IHtsYXllcklkID0gW119ID0gZmlsdGVyO1xuICAgIGNvbnN0IGlzTGF5ZXJJbmNsdWRlZCA9IGxheWVySWQuaW5jbHVkZXMobGF5ZXIuaWQpO1xuXG4gICAgbmV3TGF5ZXJJZCA9IGlzTGF5ZXJJbmNsdWRlZFxuICAgICAgPyAvLyBpZiBsYXllciBpcyBpbmNsdWRlZCwgcmVtb3ZlIGl0XG4gICAgICAgIGxheWVySWQuZmlsdGVyKGwgPT4gbCAhPT0gbGF5ZXIuaWQpXG4gICAgICA6IFsuLi5sYXllcklkLCBsYXllci5pZF07XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBjcmVhdGUgdGhlIHBvbHlnb24gZmlsdGVyLCBjcmVhdGUgaXRcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIoW10sIGZlYXR1cmUpO1xuICAgIGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMubGVuZ3RoO1xuXG4gICAgLy8gYWRkIGZlYXR1cmUsIHJlbW92ZSBmZWF0dXJlIGZyb20gZWlkdG9yXG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBuZXdGaWx0ZXJdLFxuICAgICAgZWRpdG9yOiB7XG4gICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgZmVhdHVyZXM6IHN0YXRlLmVkaXRvci5mZWF0dXJlcy5maWx0ZXIoZiA9PiBmLmlkICE9PSBmZWF0dXJlLmlkKSxcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBuZXdGaWx0ZXIudmFsdWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZHg6IGZpbHRlcklkeCxcbiAgICBwcm9wOiAnbGF5ZXJJZCcsXG4gICAgdmFsdWU6IG5ld0xheWVySWRcbiAgfSk7XG59XG5cbi8qKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvcnRUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1uLCBtb2RlfTogVmlzU3RhdGVBY3Rpb25zLlNvcnRUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgc29ydE1vZGUgPSBtb2RlO1xuICBpZiAoIXNvcnRNb2RlKSB7XG4gICAgY29uc3QgY3VycmVudE1vZGUgPSBnZXQoZGF0YXNldCwgWydzb3J0Q29sdW1uJywgY29sdW1uXSk7XG4gICAgLy8gQHRzLWlnbm9yZSAtIHNob3VsZCBiZSBmaXhhYmxlIGluIGEgVFMgZmlsZVxuICAgIHNvcnRNb2RlID0gY3VycmVudE1vZGVcbiAgICAgID8gT2JqZWN0LmtleXMoU09SVF9PUkRFUikuZmluZChtID0+IG0gIT09IGN1cnJlbnRNb2RlKVxuICAgICAgOiBTT1JUX09SREVSLkFTQ0VORElORztcbiAgfVxuXG4gIGNvbnN0IHNvcnRlZCA9IHNvcnREYXRhc2V0QnlDb2x1bW4oZGF0YXNldCwgY29sdW1uLCBzb3J0TW9kZSk7XG4gIHJldHVybiBzZXQoWydkYXRhc2V0cycsIGRhdGFJZF0sIHNvcnRlZCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwaW5UYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLlBpblRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IG5ld0RhdGFzZXQgPSBwaW5UYWJsZUNvbHVtbnMoZGF0YXNldCwgY29sdW1uKTtcblxuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG59XG5cbi8qKlxuICogQ29weSBjb2x1bW4gY29udGVudCBhcyBzdHJpbmdzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29weVRhYmxlQ29sdW1uVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBjb2x1bW59OiBWaXNTdGF0ZUFjdGlvbnMuQ29weVRhYmxlQ29sdW1uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGZpZWxkSWR4ID0gZGF0YXNldC5maWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICBpZiAoZmllbGRJZHggPCAwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHt0eXBlfSA9IGRhdGFzZXQuZmllbGRzW2ZpZWxkSWR4XTtcbiAgY29uc3QgdGV4dCA9IGRhdGFzZXQuZGF0YUNvbnRhaW5lclxuICAgIC5tYXAocm93ID0+IHBhcnNlRmllbGRWYWx1ZShyb3cudmFsdWVBdChmaWVsZElkeCksIHR5cGUpLCB0cnVlKVxuICAgIC5qb2luKCdcXG4nKTtcblxuICBjb3B5KHRleHQpO1xuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuLyoqXG4gKiBTZXQgZGlzcGxheSBmb3JtYXQgZnJvbSBjb2x1bW5zIGZyb20gdXNlciBzZWxlY3Rpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRDb2x1bW5EaXNwbGF5Rm9ybWF0VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkLCBmb3JtYXRzfTogVmlzU3RhdGVBY3Rpb25zLlNldENvbHVtbkRpc3BsYXlGb3JtYXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IG5ld0ZpZWxkcyA9IGRhdGFzZXQuZmllbGRzO1xuICBPYmplY3Qua2V5cyhmb3JtYXRzKS5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgY29uc3QgZmllbGRJZHggPSBkYXRhc2V0LmZpZWxkcy5maW5kSW5kZXgoZiA9PiBmLm5hbWUgPT09IGNvbHVtbik7XG4gICAgaWYgKGZpZWxkSWR4ID49IDApIHtcbiAgICAgIGNvbnN0IGRpc3BsYXlGb3JtYXQgPSBmb3JtYXRzW2NvbHVtbl07XG4gICAgICBjb25zdCBmaWVsZCA9IG5ld0ZpZWxkc1tmaWVsZElkeF07XG4gICAgICBuZXdGaWVsZHMgPSBzd2FwXyhtZXJnZV8oe2Rpc3BsYXlGb3JtYXR9KShmaWVsZCkgYXMge2lkOiBzdHJpbmd9KShcbiAgICAgICAgbmV3RmllbGRzIGFzIHtpZDogc3RyaW5nfVtdXG4gICAgICApIGFzIEZpZWxkW107XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBuZXdEYXRhc2V0ID0gY29weVRhYmxlQW5kVXBkYXRlKGRhdGFzZXQsIHtmaWVsZHM6IG5ld0ZpZWxkcyBhcyBGaWVsZFtdfSk7XG4gIHJldHVybiBwaWNrXygnZGF0YXNldHMnKShtZXJnZV8oe1tkYXRhSWRdOiBuZXdEYXRhc2V0fSkpKHN0YXRlKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgdmlzaWJsZTogIXN0YXRlLmVkaXRvci52aXNpYmxlXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkeCwgY29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qgb2xkRmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuICBpZiAoIW9sZEZpbHRlcikge1xuICAgIENvbnNvbGUuZXJyb3IoYGZpbHRlcnMuJHtpZHh9IGlzIHVuZGVmaW5lZGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAob2xkRmlsdGVyLnR5cGUgIT09IEZJTFRFUl9UWVBFUy50aW1lUmFuZ2UpIHtcbiAgICBDb25zb2xlLmVycm9yKFxuICAgICAgYHNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWcgY2FuIG9ubHkgYmUgY2FsbGVkIHRvIHVwZGF0ZSBhIHRpbWUgZmlsdGVyLiBjaGVjayBmaWx0ZXIudHlwZSA9PT0gJ3RpbWVSYW5nZSdgXG4gICAgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB1cGRhdGVzID0gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpO1xuXG4gIHJldHVybiBwaWNrXygnZmlsdGVycycpKHN3YXBfKG1lcmdlXyh1cGRhdGVzKShvbGRGaWx0ZXIpKSkoc3RhdGUpO1xufVxuXG5mdW5jdGlvbiBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZykge1xuICBjb25zdCBhbGxvd2VkID0gWyd0aW1lRm9ybWF0JywgJ3RpbWV6b25lJ107XG4gIHJldHVybiBPYmplY3Qua2V5cyhjb25maWcpLnJlZHVjZSgoYWNjdSwgcHJvcCkgPT4ge1xuICAgIGlmICghYWxsb3dlZC5pbmNsdWRlcyhwcm9wKSkge1xuICAgICAgQ29uc29sZS5lcnJvcihcbiAgICAgICAgYHNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZyB0YWtlcyB0aW1lRm9ybWF0IGFuZC9vciB0aW1lem9uZSBhcyBvcHRpb25zLCBmb3VuZCAke3Byb3B9YFxuICAgICAgKTtcbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH1cblxuICAgIC8vIGhlcmUgd2UgYXJlIE5PVCBjaGVja2luZyBpZiB0aW1lem9uZSBvciB0aW1lRm9ybWF0IGlucHV0IGlzIHZhbGlkXG4gICAgYWNjdVtwcm9wXSA9IGNvbmZpZ1twcm9wXTtcbiAgICByZXR1cm4gYWNjdTtcbiAgfSwge30pO1xufVxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRMYXllckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghY29uZmlnKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHVwZGF0ZXMgPSBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZyk7XG4gIHJldHVybiBwaWNrXygnYW5pbWF0aW9uQ29uZmlnJykobWVyZ2VfKHVwZGF0ZXMpKShzdGF0ZSk7XG59XG5cbi8vIEZpbmQgZGF0YUlkIGZyb20gYSBzYXZlZCB2aXNTdGF0ZSBwcm9wZXJ0eTpcbi8vIGxheWVycywgZmlsdGVycywgaW50ZXJhY3Rpb25zLCBsYXllckJsZW5kaW5nLCBvdmVybGF5QmxlbmRpbmcsIHNwbGl0TWFwcywgYW5pbWF0aW9uQ29uZmlnLCBlZGl0b3Jcbi8vIHJlcGxhY2UgaXQgd2l0aCBhbm90aGVyIGRhdGFJZFxuZnVuY3Rpb24gZGVmYXVsdFJlcGxhY2VQYXJlbnREYXRhc2V0SWRzKHZhbHVlOiBhbnksIGRhdGFJZDogc3RyaW5nLCBkYXRhSWRUb1JlcGxhY2U6IHN0cmluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBmb3IgbGF5ZXJzLCBmaWx0ZXJzLCBjYWxsIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyBvbiBlYWNoIGl0ZW0gaW4gYXJyYXlcbiAgICBjb25zdCByZXBsYWNlZCA9IHZhbHVlXG4gICAgICAubWFwKHYgPT4gZGVmYXVsdFJlcGxhY2VQYXJlbnREYXRhc2V0SWRzKHYsIGRhdGFJZCwgZGF0YUlkVG9SZXBsYWNlKSlcbiAgICAgIC5maWx0ZXIoZCA9PiBkKTtcbiAgICByZXR1cm4gcmVwbGFjZWQubGVuZ3RoID8gcmVwbGFjZWQgOiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgdmFsdWUuZGF0YUlkID09PSAnc3RyaW5nJyAmJiB2YWx1ZS5kYXRhSWQgPT09IGRhdGFJZCkge1xuICAgIC8vIG90aGVyc1xuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGRhdGFJZDogZGF0YUlkVG9SZXBsYWNlXG4gICAgfTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlLmRhdGFJZCkgJiYgdmFsdWUuZGF0YUlkLmluY2x1ZGVzKGRhdGFJZCkpIHtcbiAgICAvLyBmaWx0ZXJcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBkYXRhSWQ6IHZhbHVlLmRhdGFJZC5tYXAoZCA9PiAoZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9SZXBsYWNlIDogZCkpXG4gICAgfTtcbiAgfSBlbHNlIGlmICh2YWx1ZS5jb25maWc/LmRhdGFJZCAmJiB2YWx1ZS5jb25maWc/LmRhdGFJZCA9PT0gZGF0YUlkKSB7XG4gICAgLy8gbGF5ZXJcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmFsdWUsXG4gICAgICBjb25maWc6IHtcbiAgICAgICAgLi4udmFsdWUuY29uZmlnLFxuICAgICAgICBkYXRhSWQ6IGRhdGFJZFRvUmVwbGFjZVxuICAgICAgfVxuICAgIH07XG4gIH0gZWxzZSBpZiAoaXNPYmplY3QodmFsdWUpICYmIHZhbHVlLmhhc093blByb3BlcnR5KGRhdGFJZCkpIHtcbiAgICAvLyBmb3IgdmFsdWUgc2F2ZWQgYXMge1tkYXRhSWRdOiB7Li4ufX1cbiAgICByZXR1cm4ge1tkYXRhSWRUb1JlcGxhY2VdOiB2YWx1ZVtkYXRhSWRdfTtcbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vLyBGaW5kIGRhdGFzZXRJZHMgZGVyaXZlZCBhIHNhdmVkIHZpc1N0YXRlIFByb3BlcnR5O1xuZnVuY3Rpb24gZmluZENoaWxkRGF0YXNldElkcyh2YWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyBmb3IgbGF5ZXJzLCBmaWx0ZXJzLCBjYWxsIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyBvbiBlYWNoIGl0ZW0gaW4gYXJyYXlcbiAgICBjb25zdCBjaGlsZERhdGFJZHMgPSB2YWx1ZS5tYXAoZmluZENoaWxkRGF0YXNldElkcykuZmlsdGVyKGQgPT4gZCk7XG4gICAgcmV0dXJuIGNoaWxkRGF0YUlkcy5sZW5ndGggPyBjaGlsZERhdGFJZHMgOiBudWxsO1xuICB9XG5cbiAgLy8gY2hpbGQgZGF0YSBpZCB1c3VhbGx5IHN0b3JlcyBpbiB0aGUgZGVyaXZlZCBkYXRhc2V0IGluZm9cbiAgcmV0dXJuIHZhbHVlPy5uZXdEYXRhc2V0Py5pbmZvLmlkIHx8IG51bGw7XG59XG5cbi8vIG1vdmVkIHVubWVyZ2VkIGxheWVycywgZmlsdGVycywgaW50ZXJhY3Rpb25zXG5mdW5jdGlvbiBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCBwcm9wVmFsdWVzLCB7cHJvcCwgdG9NZXJnZVByb3AsIHNhdmVVbm1lcmdlZH0pIHtcbiAgLy8gcmVtb3ZlIHByb3AgdmFsdWUgZnJvbSBzdGF0ZVxuICAvLyBUT0RPOiBzaG91bGQgd2UgYWRkIHJlbW92ZSB1cGRhdGVyIHRvIG1lcmdlciBhcyB3ZWxsP1xuICBpZiAoIXByb3BWYWx1ZXMpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgc3RhdGVSZW1vdmVkID1cbiAgICBwcm9wID09PSAnbGF5ZXJzJ1xuICAgICAgPyBwcm9wVmFsdWVzLnJlZHVjZSgoYWNjdSwgcHJvcFZhbHVlKSA9PiByZW1vdmVMYXllclVwZGF0ZXIoYWNjdSwge2lkOiBwcm9wVmFsdWUuaWR9KSwgc3RhdGUpXG4gICAgICA6IEFycmF5LmlzQXJyYXkoc3RhdGVbcHJvcF0pXG4gICAgICA/IHtcbiAgICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgICBbcHJvcF06IHN0YXRlW3Byb3BdLmZpbHRlcihwID0+ICFwcm9wVmFsdWVzLmZpbmQocHJvcFZhbHVlID0+IHAuaWQgPT09IHByb3BWYWx1ZS5pZCkpXG4gICAgICAgIH1cbiAgICAgIDogLy8gaWYgbm90IGFycmF5LCB3ZSB3b24ndCByZW1vdmUgaXQsIHJlbW92ZSBkYXRhc2V0IHNob3VsZCBoYW5kbGUgaXRcbiAgICAgICAgc3RhdGU7XG5cbiAgLy8gbW92ZSB0byBzdGF0ZVRvQmVNZXJnZWRcbiAgY29uc3QgdG9CZU1lcmdlZCA9IHtcbiAgICBbdG9NZXJnZVByb3BdOiBzYXZlVW5tZXJnZWRcbiAgICAgID8gLy8gY2FsbCBtZXJnZSBzYXZlVW5tZXJnZWQgbWV0aG9kXG4gICAgICAgIHNhdmVVbm1lcmdlZChzdGF0ZVJlbW92ZWQsIHByb3BWYWx1ZXMpXG4gICAgICA6IC8vIGlmIHRvTWVyZ2VQcm9wIGlzIGFyYWF5LCBhcHBlbmQgdG8gaXRcbiAgICAgIEFycmF5LmlzQXJyYXkoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8gWy4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sIC4uLnByb3BWYWx1ZXNdXG4gICAgICA6IC8vIHNhdmUgcHJvcFZhbHVlcyB0byB0b01lcmdlXG4gICAgICBpc09iamVjdChzdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSxcbiAgICAgICAgICAuLi5wcm9wVmFsdWVzXG4gICAgICAgIH1cbiAgICAgIDogc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXVxuICB9O1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGVSZW1vdmVkLFxuICAgIC4uLnRvQmVNZXJnZWRcbiAgfTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZURhdGFzZXRBbmREZXBzPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIHJldHVybiBjb21wb3NlXzxUPihbXG4gICAgYXBwbHlfKHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGUsIHtkYXRhSWQsIGRhdGFJZFRvVXNlfSksXG4gICAgYXBwbHlfKHJlbW92ZURhdGFzZXRVcGRhdGVyLCB7ZGF0YUlkfSlcbiAgXSkoc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2U8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIGRhdGFJZDogc3RyaW5nLFxuICBkYXRhSWRUb1VzZTogc3RyaW5nXG4pOiBUIHtcbiAgY29uc3Qgc2VyaWFsaXplZFN0YXRlID0gc2VyaWFsaXplVmlzU3RhdGUoc3RhdGUsIHN0YXRlLnNjaGVtYSk7XG4gIGNvbnN0IG5leHRTdGF0ZSA9IHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhzdGF0ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSk7XG4gIC8vIG1ha2UgYSBjb3B5IG9mIGxheWVyT3JkZXIsIGJlY2F1c2UgbGF5ZXIgaWQgd2lsbCBiZSByZW1vdmVkIGZyb20gaXQgYnkgY2FsbGluZyByZW1vdmVMYXllclVwZGF0ZXJcbiAgY29uc3QgcHJlc2VydmVMYXllck9yZGVyID0gWy4uLnN0YXRlLmxheWVyT3JkZXJdO1xuXG4gIC8vIHByZXNlcnZlIGRhdGFzZXQgb3JkZXJcbiAgbmV4dFN0YXRlLnByZXNlcnZlRGF0YXNldE9yZGVyID0gT2JqZWN0LmtleXMoc3RhdGUuZGF0YXNldHMpLm1hcChkID0+XG4gICAgZCA9PT0gZGF0YUlkID8gZGF0YUlkVG9Vc2UgOiBkXG4gICk7XG5cbiAgLy8gcHJlc2VydmVMYXllck9yZGVyXG4gIGlmIChuZXh0U3RhdGUubGF5ZXJUb0JlTWVyZ2VkPy5sZW5ndGgpIHtcbiAgICAvLyBjb3B5IHNwbGl0IG1hcHMgdG8gYmUgbWVyZ2VkLCBiZWNhdXNlIGl0IHdpbGwgYmUgcmVzZXQgaW4gcmVtb3ZlIGxheWVyXG4gICAgbmV4dFN0YXRlLnNwbGl0TWFwc1RvQmVNZXJnZWQgPSBzZXJpYWxpemVkU3RhdGU/LnNwbGl0TWFwcyA/PyBbXTtcbiAgICBuZXh0U3RhdGUubGF5ZXJPcmRlciA9IFsuLi5wcmVzZXJ2ZUxheWVyT3JkZXJdO1xuICB9XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0RGVwc0luU3RhdGU8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtkYXRhSWQsIGRhdGFJZFRvVXNlfToge2RhdGFJZDogc3RyaW5nOyBkYXRhSWRUb1VzZTogc3RyaW5nfVxuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHN0YXRlLm1lcmdlcnMucmVkdWNlKFxuICAgIChcbiAgICAgIGFjY3VTdGF0ZSxcbiAgICAgIHtwcm9wLCB0b01lcmdlUHJvcCwgcmVwbGFjZVBhcmVudERhdGFzZXRJZHMsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkLCBwcmVzZXJ2ZU9yZGVyfVxuICAgICkgPT4ge1xuICAgICAgLy8gZ2V0IGRhdGFzZXQgaWRzIHRoYXQgYXJlIGRlcGVuZHMgb24gdGhpcyBkYXRhc2V0XG4gICAgICBjb25zdCBwcm9wcyA9IHRvQXJyYXkocHJvcCk7XG4gICAgICBjb25zdCB0b01lcmdlUHJvcHMgPSB0b0FycmF5KHRvTWVyZ2VQcm9wKTtcbiAgICAgIGNvbnN0IHNhdmVkUHJvcHMgPSBzZXJpYWxpemVkU3RhdGUgPyBwcm9wcy5tYXAocCA9PiBzZXJpYWxpemVkU3RhdGVbcF0pIDogW107XG5cbiAgICAgIGxldCByZXBsYWNlZFN0YXRlID0gYWNjdVN0YXRlO1xuICAgICAgc2F2ZWRQcm9wcy5mb3JFYWNoKChwcm9wVmFsdWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgbWVyZ2VyT3B0aW9ucyA9IHtcbiAgICAgICAgICBwcm9wOiBwcm9wc1tpXSxcbiAgICAgICAgICB0b01lcmdlUHJvcDogdG9NZXJnZVByb3BzW2ldLFxuICAgICAgICAgIGdldENoaWxkRGF0YXNldElkcyxcbiAgICAgICAgICBzYXZlVW5tZXJnZWRcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCByZXBsYWNlZEl0ZW0gPVxuICAgICAgICAgIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzPy4ocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKSB8fFxuICAgICAgICAgIGRlZmF1bHRSZXBsYWNlUGFyZW50RGF0YXNldElkcyhwcm9wVmFsdWUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAgICAgICByZXBsYWNlZFN0YXRlID0gcmVwbGFjZWRJdGVtXG4gICAgICAgICAgPyByZXBsYWNlUHJvcFZhbHVlSW5TdGF0ZShyZXBsYWNlZFN0YXRlLCByZXBsYWNlZEl0ZW0sIG1lcmdlck9wdGlvbnMpXG4gICAgICAgICAgOiByZXBsYWNlZFN0YXRlO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBtZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW21lcmdlck9wdGlvbnMudG9NZXJnZVByb3BdPy5sZW5ndGggJiZcbiAgICAgICAgICBwcmVzZXJ2ZU9yZGVyXG4gICAgICAgICkge1xuICAgICAgICAgIHJlcGxhY2VkU3RhdGVbcHJlc2VydmVPcmRlcl0gPSBwcm9wVmFsdWUubWFwKGl0ZW0gPT4gaXRlbS5pZCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gcmVwbGFjZWRTdGF0ZTtcbiAgICB9LFxuICAgIHN0YXRlXG4gICk7XG5cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cblxuZnVuY3Rpb24gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUoXG4gIHN0YXRlLFxuICByZXBsYWNlZEl0ZW0sXG4gIHtwcm9wLCB0b01lcmdlUHJvcCwgZ2V0Q2hpbGREYXRhc2V0SWRzLCBzYXZlVW5tZXJnZWR9XG4pIHtcbiAgLy8gcHJvcCBpcyBkZXBlbmRzIG9uIHRoZSBkYXRhc2V0IHRvIGJlIHJlcGxhY2VkXG4gIC8vIHJlbW92ZSBwcm9wIGZyb20gc3RhdGUsIGFuZCBtb3ZlIGl0IHRvIHRvQmVNZXJnZWRcbiAgbGV0IG5leHRTdGF0ZSA9IG1vdmVWYWx1ZVRvQmVNZXJnZWQoc3RhdGUsIHJlcGxhY2VkSXRlbSwge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KTtcbiAgY29uc3QgY2hpbGREYXRhSWRzID0gZ2V0Q2hpbGREYXRhc2V0SWRzPy4ocmVwbGFjZWRJdGVtKSB8fCBmaW5kQ2hpbGREYXRhc2V0SWRzKHJlcGxhY2VkSXRlbSk7XG5cbiAgaWYgKGNoaWxkRGF0YUlkcykge1xuICAgIG5leHRTdGF0ZSA9IHRvQXJyYXkoY2hpbGREYXRhSWRzKS5yZWR1Y2UoKGFjY3UsIGNoaWxkRGF0YUlkKSA9PiB7XG4gICAgICAvLyBzaG91bGRuJ3QgbmVlZCB0byBjaGFuZ2UgY2hpbGQgZGF0YXNldCBpZCxcbiAgICAgIC8vIGJ1dCBzdGlsbCBuZWVkIHRvIG1vdmUgb3V0IG9mIHN0YXRlIGFuZCBtZXJnZSBiYWNrIGluXG4gICAgICByZXR1cm4gcmVwbGFjZURhdGFzZXRBbmREZXBzKGFjY3UsIGNoaWxkRGF0YUlkLCBjaGlsZERhdGFJZCk7XG4gICAgfSwgbmV4dFN0YXRlKTtcbiAgfVxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuIl19
|