@kepler.gl/reducers 3.3.0-alpha.5 → 3.3.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/combined-updaters.js +491 -0
- package/dist/cjs/composer-helpers.js +101 -0
- package/dist/cjs/composers.js +22 -0
- package/dist/cjs/core.js +105 -0
- package/dist/cjs/data-utils.js +53 -0
- package/dist/cjs/export-utils.js +91 -0
- package/dist/{index.js → cjs/index.js} +1 -1
- package/dist/cjs/interaction-utils.js +105 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +658 -0
- package/dist/cjs/map-state.js +35 -0
- package/dist/cjs/map-style-updaters.js +660 -0
- package/dist/cjs/map-style.js +33 -0
- package/dist/cjs/merger-handler.js +105 -0
- package/dist/cjs/middleware.js +27 -0
- package/dist/cjs/provider-state-updaters.js +465 -0
- package/dist/cjs/provider-state.js +34 -0
- package/dist/cjs/root.js +207 -0
- package/dist/cjs/ui-state-updaters.js +934 -0
- package/dist/cjs/ui-state.js +36 -0
- package/dist/cjs/vis-state-merger.js +1193 -0
- package/dist/cjs/vis-state-selectors.js +30 -0
- package/dist/{vis-state-updaters.js → cjs/vis-state-updaters.js} +338 -47
- package/dist/cjs/vis-state.js +35 -0
- package/dist/combined-updaters.d.ts +1 -1
- package/dist/esm/combined-updaters.js +484 -0
- package/dist/esm/composer-helpers.js +85 -0
- package/dist/esm/composers.js +14 -0
- package/dist/esm/core.js +101 -0
- package/dist/esm/data-utils.js +47 -0
- package/dist/esm/export-utils.js +86 -0
- package/dist/esm/index.js +62 -0
- package/dist/esm/interaction-utils.js +96 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +650 -0
- package/dist/esm/map-state.js +29 -0
- package/dist/esm/map-style-updaters.js +652 -0
- package/dist/esm/map-style.js +27 -0
- package/dist/esm/merger-handler.js +96 -0
- package/dist/esm/middleware.js +19 -0
- package/dist/esm/provider-state-updaters.js +458 -0
- package/dist/esm/provider-state.js +28 -0
- package/dist/esm/root.js +201 -0
- package/dist/esm/ui-state-updaters.js +929 -0
- package/dist/esm/ui-state.js +30 -0
- package/dist/esm/vis-state-merger.js +1161 -0
- package/dist/esm/vis-state-selectors.js +24 -0
- package/dist/esm/vis-state-updaters.js +4320 -0
- package/dist/esm/vis-state.js +29 -0
- package/dist/ui-state-updaters.d.ts +15 -1
- package/dist/vis-state-updaters.d.ts +27 -0
- package/package.json +31 -22
- package/dist/combined-updaters.js +0 -491
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -22
- package/dist/core.js +0 -105
- package/dist/data-utils.js +0 -53
- package/dist/export-utils.js +0 -91
- package/dist/interaction-utils.js +0 -105
- package/dist/layer-utils.js +0 -635
- package/dist/map-state-updaters.js +0 -649
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -660
- package/dist/map-style.js +0 -33
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -465
- package/dist/provider-state.js +0 -34
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -905
- package/dist/ui-state.js +0 -36
- package/dist/vis-state-merger.js +0 -1193
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state.js +0 -35
|
@@ -0,0 +1,484 @@
|
|
|
1
|
+
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
|
|
2
|
+
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
3
|
+
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
4
|
+
// SPDX-License-Identifier: MIT
|
|
5
|
+
// Copyright contributors to the kepler.gl project
|
|
6
|
+
|
|
7
|
+
import { toggleModalUpdater, loadFilesSuccessUpdater as uiStateLoadFilesSuccessUpdater, toggleMapControlUpdater, toggleSplitMapUpdater as uiStateToggleSplitMapUpdater, receiveMapConfigUpdater as uiStateReceiveMapConfigUpdater } from './ui-state-updaters';
|
|
8
|
+
import { updateVisDataUpdater as visStateUpdateVisDataUpdater, setMapInfoUpdater, layerTypeChangeUpdater, toggleSplitMapUpdater as visStateToggleSplitMapUpdater, prepareStateForDatasetReplace } from './vis-state-updaters';
|
|
9
|
+
import { receiveMapConfigUpdater as stateMapConfigUpdater, toggleSplitMapUpdater as mapStateToggleSplitMapUpdater, setMapSplitModeUpdater as mapStateSetMapSplitModeUpdater, setMapViewModeUpdater } from './map-state-updaters';
|
|
10
|
+
import { mapStyleChangeUpdater, receiveMapConfigUpdater as styleMapConfigUpdater } from './map-style-updaters';
|
|
11
|
+
import { filesToDataPayload } from '@kepler.gl/processors';
|
|
12
|
+
import { payload_, apply_, with_, if_, compose_, merge_, pick_ } from './composer-helpers';
|
|
13
|
+
import { isPlainObject, computeSplitMapLayers } from '@kepler.gl/utils';
|
|
14
|
+
import { findMapBounds } from './data-utils';
|
|
15
|
+
import { BASE_MAP_COLOR_MODES, OVERLAY_BLENDINGS, NO_MAP_ID, MapSplitMode } from '@kepler.gl/constants';
|
|
16
|
+
import { getBasemapColorsForStyle, DEFAULT_BASEMAP_COLOR } from '@kepler.gl/deckgl-layers';
|
|
17
|
+
// compose action to apply result multiple reducers, with the output of one
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Some actions will affect the entire kepler.lg instance state.
|
|
21
|
+
* The updaters for these actions is exported as `combinedUpdaters`. These updater take the entire instance state
|
|
22
|
+
* as the first argument. Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
23
|
+
* @public
|
|
24
|
+
* @example
|
|
25
|
+
*
|
|
26
|
+
* import keplerGlReducer, {combinedUpdaters} from '@kepler.gl/reducers';
|
|
27
|
+
* // Root Reducer
|
|
28
|
+
* const reducers = combineReducers({
|
|
29
|
+
* keplerGl: keplerGlReducer,
|
|
30
|
+
* app: appReducer
|
|
31
|
+
* });
|
|
32
|
+
*
|
|
33
|
+
* const composedReducer = (state, action) => {
|
|
34
|
+
* switch (action.type) {
|
|
35
|
+
* // add data to map after receiving data from remote sources
|
|
36
|
+
* case 'LOAD_REMOTE_RESOURCE_SUCCESS':
|
|
37
|
+
* return {
|
|
38
|
+
* ...state,
|
|
39
|
+
* keplerGl: {
|
|
40
|
+
* ...state.keplerGl,
|
|
41
|
+
* // pass in kepler.gl instance state to combinedUpdaters
|
|
42
|
+
* map: combinedUpdaters.addDataToMapUpdater(
|
|
43
|
+
* state.keplerGl.map,
|
|
44
|
+
* {
|
|
45
|
+
* payload: {
|
|
46
|
+
* datasets: action.datasets,
|
|
47
|
+
* options: {readOnly: true},
|
|
48
|
+
* config: action.config
|
|
49
|
+
* }
|
|
50
|
+
* }
|
|
51
|
+
* )
|
|
52
|
+
* }
|
|
53
|
+
* };
|
|
54
|
+
* }
|
|
55
|
+
* return reducers(state, action);
|
|
56
|
+
* };
|
|
57
|
+
*
|
|
58
|
+
* export default composedReducer;
|
|
59
|
+
*/
|
|
60
|
+
|
|
61
|
+
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
62
|
+
// @ts-ignore
|
|
63
|
+
var combinedUpdaters = null;
|
|
64
|
+
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
65
|
+
|
|
66
|
+
export var isValidConfig = function isValidConfig(config) {
|
|
67
|
+
return isPlainObject(config) && isPlainObject(config.config) && config.version;
|
|
68
|
+
};
|
|
69
|
+
export var defaultAddDataToMapOptions = {
|
|
70
|
+
centerMap: true,
|
|
71
|
+
keepExistingConfig: false,
|
|
72
|
+
autoCreateLayers: true,
|
|
73
|
+
autoCreateTooltips: true
|
|
74
|
+
};
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Combine data and full configuration update in a single action
|
|
78
|
+
*
|
|
79
|
+
* @memberof combinedUpdaters
|
|
80
|
+
* @param {Object} state kepler.gl instance state, containing all subreducer state
|
|
81
|
+
* @param {Object} action
|
|
82
|
+
* @param {Object} action.payload `{datasets, options, config}`
|
|
83
|
+
* @param action.payload.datasets - ***required** datasets can be a dataset or an array of datasets
|
|
84
|
+
* Each dataset object needs to have `info` and `data` property.
|
|
85
|
+
* @param [action.payload.options] option object `{centerMap: true, padding: {left: 300}}`
|
|
86
|
+
* @param [action.payload.config] map config
|
|
87
|
+
* @param [action.payload.info] map info contains title and description
|
|
88
|
+
* @returns nextState
|
|
89
|
+
*
|
|
90
|
+
* @typedef {Object} Dataset
|
|
91
|
+
* @property info -info of a dataset
|
|
92
|
+
* @property info.id - id of this dataset. If config is defined, `id` should matches the `dataId` in config.
|
|
93
|
+
* @property info.label - A display name of this dataset
|
|
94
|
+
* @property data - ***required** The data object, in a tabular format with 2 properties `fields` and `rows`
|
|
95
|
+
* @property data.fields - ***required** Array of fields,
|
|
96
|
+
* @property data.fields.name - ***required** Name of the field,
|
|
97
|
+
* @property data.rows - ***required** Array of rows, in a tabular format with `fields` and `rows`
|
|
98
|
+
*
|
|
99
|
+
* @public
|
|
100
|
+
*/
|
|
101
|
+
export var addDataToMapUpdater = function addDataToMapUpdater(state, _ref) {
|
|
102
|
+
var _datasets$, _datasets$2, _datasets$3;
|
|
103
|
+
var payload = _ref.payload;
|
|
104
|
+
var datasets = payload.datasets,
|
|
105
|
+
config = payload.config,
|
|
106
|
+
info = payload.info;
|
|
107
|
+
var options = _objectSpread(_objectSpread({}, defaultAddDataToMapOptions), payload.options);
|
|
108
|
+
|
|
109
|
+
// check if progressive loading dataset by batches, and update visState directly
|
|
110
|
+
var isProgressiveLoading = Array.isArray(datasets) && ((_datasets$ = datasets[0]) === null || _datasets$ === void 0 ? void 0 : _datasets$.info.format) === 'arrow' && ((_datasets$2 = datasets[0]) === null || _datasets$2 === void 0 ? void 0 : _datasets$2.info.id) && ((_datasets$3 = datasets[0]) === null || _datasets$3 === void 0 ? void 0 : _datasets$3.info.id) in state.visState.datasets;
|
|
111
|
+
if (isProgressiveLoading) {
|
|
112
|
+
return compose_([pick_('visState')(apply_(visStateUpdateVisDataUpdater, {
|
|
113
|
+
datasets: datasets,
|
|
114
|
+
options: options,
|
|
115
|
+
config: config
|
|
116
|
+
}))])(state);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// @ts-expect-error
|
|
120
|
+
var parsedConfig = config;
|
|
121
|
+
if (isValidConfig(config)) {
|
|
122
|
+
// if passed in saved config
|
|
123
|
+
// @ts-expect-error
|
|
124
|
+
parsedConfig = state.visState.schema.parseSavedConfig(config);
|
|
125
|
+
}
|
|
126
|
+
var oldLayers = state.visState.layers;
|
|
127
|
+
var filterNewlyAddedLayers = function filterNewlyAddedLayers(layers) {
|
|
128
|
+
return layers.filter(function (nl) {
|
|
129
|
+
return !oldLayers.find(function (ol) {
|
|
130
|
+
return ol === nl;
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// Returns undefined if not found, to make typescript happy
|
|
136
|
+
var findMapBoundsIfCentered = function findMapBoundsIfCentered(layers) {
|
|
137
|
+
var bounds = options.centerMap && findMapBounds(layers);
|
|
138
|
+
return bounds ? bounds : undefined;
|
|
139
|
+
};
|
|
140
|
+
return compose_([pick_('visState')(
|
|
141
|
+
// this part can be async
|
|
142
|
+
apply_(visStateUpdateVisDataUpdater, {
|
|
143
|
+
datasets: datasets,
|
|
144
|
+
options: options,
|
|
145
|
+
config: parsedConfig
|
|
146
|
+
})), if_(Boolean(info), pick_('visState')(apply_(setMapInfoUpdater, {
|
|
147
|
+
info: info
|
|
148
|
+
}))),
|
|
149
|
+
// Note that fit bounds here won't be called in case datasets are created in Tasks.
|
|
150
|
+
// A separate Task to update bounds is created once the datasets are ready.
|
|
151
|
+
with_(function (_ref2) {
|
|
152
|
+
var visState = _ref2.visState;
|
|
153
|
+
return pick_('mapState')(apply_(stateMapConfigUpdater, payload_({
|
|
154
|
+
config: parsedConfig,
|
|
155
|
+
options: options,
|
|
156
|
+
bounds: findMapBoundsIfCentered(filterNewlyAddedLayers(visState.layers))
|
|
157
|
+
})));
|
|
158
|
+
}), pick_('mapStyle')(apply_(styleMapConfigUpdater, payload_({
|
|
159
|
+
config: parsedConfig,
|
|
160
|
+
options: options
|
|
161
|
+
}))), pick_('uiState')(apply_(uiStateReceiveMapConfigUpdater, payload_({
|
|
162
|
+
config: parsedConfig,
|
|
163
|
+
options: options
|
|
164
|
+
}))), pick_('uiState')(apply_(uiStateLoadFilesSuccessUpdater, payload_(null))), pick_('uiState')(apply_(toggleModalUpdater, payload_(null))), pick_('uiState')(merge_(Object.prototype.hasOwnProperty.call(options, 'readOnly') ? {
|
|
165
|
+
readOnly: options.readOnly
|
|
166
|
+
} : {}))])(state);
|
|
167
|
+
};
|
|
168
|
+
export var loadFilesSuccessUpdater = function loadFilesSuccessUpdater(state, action) {
|
|
169
|
+
// still more to load
|
|
170
|
+
var payloads = filesToDataPayload(action.result);
|
|
171
|
+
var nextState = compose_([pick_('visState')(merge_({
|
|
172
|
+
fileLoading: false,
|
|
173
|
+
fileLoadingProgress: {}
|
|
174
|
+
}))])(state);
|
|
175
|
+
// make multiple add data to map calls
|
|
176
|
+
var stateWithData = compose_(payloads.map(function (p) {
|
|
177
|
+
return apply_(addDataToMapUpdater, payload_(p));
|
|
178
|
+
}))(nextState);
|
|
179
|
+
return stateWithData;
|
|
180
|
+
};
|
|
181
|
+
export var addDataToMapComposed = addDataToMapUpdater;
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Helper which updates map overlay blending mode in visState,
|
|
185
|
+
* but only if it's not currently in the `normal` mode.
|
|
186
|
+
*/
|
|
187
|
+
var updateOverlayBlending = function updateOverlayBlending(overlayBlending) {
|
|
188
|
+
return function (visState) {
|
|
189
|
+
if (visState.overlayBlending !== OVERLAY_BLENDINGS.normal.value) {
|
|
190
|
+
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
191
|
+
overlayBlending: overlayBlending
|
|
192
|
+
});
|
|
193
|
+
}
|
|
194
|
+
return visState;
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
|
|
198
|
+
/**
|
|
199
|
+
* Helper which updates `darkBaseMapEnabled` in all the layers in visState which
|
|
200
|
+
* have this config setting (or in one specific layer if the `layerId` param is provided).
|
|
201
|
+
*/
|
|
202
|
+
var updateDarkBaseMapLayers = function updateDarkBaseMapLayers(darkBaseMapEnabled) {
|
|
203
|
+
var layerId = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
204
|
+
return function (visState) {
|
|
205
|
+
return _objectSpread(_objectSpread({}, visState), {}, {
|
|
206
|
+
layers: visState.layers.map(function (layer) {
|
|
207
|
+
if (!layerId || layer.id === layerId) {
|
|
208
|
+
if (Object.prototype.hasOwnProperty.call(layer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
209
|
+
var visConfig = layer.config.visConfig;
|
|
210
|
+
return layer.updateLayerConfig({
|
|
211
|
+
visConfig: _objectSpread(_objectSpread({}, visConfig), {}, {
|
|
212
|
+
darkBaseMapEnabled: darkBaseMapEnabled
|
|
213
|
+
})
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return layer;
|
|
218
|
+
})
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
};
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Updater that changes the map style by calling mapStyleChangeUpdater on visState.
|
|
225
|
+
* In addition to that, it does the following:
|
|
226
|
+
*
|
|
227
|
+
* 1. Update map overlay blending mode in accordance with the colorMode of the
|
|
228
|
+
* base map, but only if it's not in the `normal` mode.
|
|
229
|
+
*
|
|
230
|
+
* 2. Update all the layers which have the `darkBaseMapEnabled` config setting
|
|
231
|
+
* adjusting it in accordance with the colorMode of the base map.
|
|
232
|
+
*
|
|
233
|
+
*/
|
|
234
|
+
export var combinedMapStyleChangeUpdater = function combinedMapStyleChangeUpdater(state, action) {
|
|
235
|
+
var _mapState$globe;
|
|
236
|
+
var payload = action.payload;
|
|
237
|
+
var mapStyle = state.mapStyle;
|
|
238
|
+
var getColorMode = function getColorMode(key) {
|
|
239
|
+
var _mapStyle$mapStyles$k;
|
|
240
|
+
return (_mapStyle$mapStyles$k = mapStyle.mapStyles[key]) === null || _mapStyle$mapStyles$k === void 0 ? void 0 : _mapStyle$mapStyles$k.colorMode;
|
|
241
|
+
};
|
|
242
|
+
var prevColorMode = getColorMode(mapStyle.styleType);
|
|
243
|
+
var nextColorMode = getColorMode(payload.styleType);
|
|
244
|
+
var visState = state.visState,
|
|
245
|
+
mapState = state.mapState;
|
|
246
|
+
if (nextColorMode !== prevColorMode) {
|
|
247
|
+
switch (nextColorMode) {
|
|
248
|
+
case BASE_MAP_COLOR_MODES.DARK:
|
|
249
|
+
visState = compose_([updateOverlayBlending(OVERLAY_BLENDINGS.screen.value), updateDarkBaseMapLayers(true)])(visState);
|
|
250
|
+
break;
|
|
251
|
+
case BASE_MAP_COLOR_MODES.LIGHT:
|
|
252
|
+
visState = compose_([updateOverlayBlending(OVERLAY_BLENDINGS.darken.value), updateDarkBaseMapLayers(false)])(visState);
|
|
253
|
+
break;
|
|
254
|
+
default:
|
|
255
|
+
// do nothing
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
// Update globe config colors when style changes and globe is enabled
|
|
260
|
+
if ((_mapState$globe = mapState.globe) !== null && _mapState$globe !== void 0 && _mapState$globe.enabled) {
|
|
261
|
+
// Switching from "No Basemap" to a basemap - restore basemap sub-toggles
|
|
262
|
+
if (payload.styleType !== NO_MAP_ID && mapStyle.styleType === NO_MAP_ID) {
|
|
263
|
+
mapState = _objectSpread(_objectSpread({}, mapState), {}, {
|
|
264
|
+
globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
|
|
265
|
+
config: _objectSpread(_objectSpread({}, mapState.globe.config), {}, {
|
|
266
|
+
basemap: true,
|
|
267
|
+
labels: true,
|
|
268
|
+
adminLines: true,
|
|
269
|
+
water: true
|
|
270
|
+
})
|
|
271
|
+
})
|
|
272
|
+
});
|
|
273
|
+
}
|
|
274
|
+
mapState = syncGlobeConfigColorsToStyle(mapState, mapStyle, payload.styleType);
|
|
275
|
+
}
|
|
276
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
277
|
+
visState: visState,
|
|
278
|
+
mapState: mapState,
|
|
279
|
+
mapStyle: mapStyleChangeUpdater(mapStyle, {
|
|
280
|
+
payload: _objectSpread({}, payload)
|
|
281
|
+
})
|
|
282
|
+
});
|
|
283
|
+
};
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Derive globe basemap colors (surface / water / admin lines) from a map style and
|
|
287
|
+
* return an updated mapState with those colors written into `globe.config`. Used both
|
|
288
|
+
* when the base map style changes and when entering globe mode, so the globe always
|
|
289
|
+
* reflects the currently selected basemap instead of the static DEFAULT_GLOBE_CONFIG.
|
|
290
|
+
*/
|
|
291
|
+
export function syncGlobeConfigColorsToStyle(mapState, mapStyle, styleType) {
|
|
292
|
+
var _mapState$globe2;
|
|
293
|
+
if (!((_mapState$globe2 = mapState.globe) !== null && _mapState$globe2 !== void 0 && _mapState$globe2.enabled)) {
|
|
294
|
+
return mapState;
|
|
295
|
+
}
|
|
296
|
+
var nextStyleObj = mapStyle.mapStyles[styleType];
|
|
297
|
+
var nextGlobeConfig = _objectSpread({}, mapState.globe.config);
|
|
298
|
+
if (styleType === NO_MAP_ID) {
|
|
299
|
+
nextGlobeConfig.basemap = false;
|
|
300
|
+
nextGlobeConfig.labels = false;
|
|
301
|
+
nextGlobeConfig.adminLines = false;
|
|
302
|
+
nextGlobeConfig.water = false;
|
|
303
|
+
nextGlobeConfig.surfaceColor = DEFAULT_BASEMAP_COLOR.backgroundFillColor;
|
|
304
|
+
nextGlobeConfig.waterColor = DEFAULT_BASEMAP_COLOR.basemapWaterFillColor;
|
|
305
|
+
nextGlobeConfig.adminLinesColor = DEFAULT_BASEMAP_COLOR.basemapAdminLineColor;
|
|
306
|
+
} else {
|
|
307
|
+
var basemapColors = nextStyleObj ? getBasemapColorsForStyle(styleType, {
|
|
308
|
+
style: nextStyleObj.style,
|
|
309
|
+
layerGroups: nextStyleObj.layerGroups
|
|
310
|
+
}) :
|
|
311
|
+
// Style object not yet loaded - use known presets by style type
|
|
312
|
+
getBasemapColorsForStyle(styleType);
|
|
313
|
+
nextGlobeConfig.surfaceColor = basemapColors.backgroundFillColor;
|
|
314
|
+
nextGlobeConfig.waterColor = basemapColors.basemapWaterFillColor;
|
|
315
|
+
nextGlobeConfig.adminLinesColor = basemapColors.basemapAdminLineColor;
|
|
316
|
+
}
|
|
317
|
+
return _objectSpread(_objectSpread({}, mapState), {}, {
|
|
318
|
+
globe: _objectSpread(_objectSpread({}, mapState.globe), {}, {
|
|
319
|
+
config: nextGlobeConfig
|
|
320
|
+
})
|
|
321
|
+
});
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
/**
|
|
325
|
+
* Updater that switches the map view mode (2D / 3D / Globe). Runs the base map-state
|
|
326
|
+
* updater and, when entering globe mode, syncs the globe basemap colors to the
|
|
327
|
+
* currently selected map style so the globe doesn't show stale default colors.
|
|
328
|
+
*/
|
|
329
|
+
export var combinedSetMapViewModeUpdater = function combinedSetMapViewModeUpdater(state, action) {
|
|
330
|
+
var _mapState$globe3;
|
|
331
|
+
var mapState = setMapViewModeUpdater(state.mapState, action);
|
|
332
|
+
if ((_mapState$globe3 = mapState.globe) !== null && _mapState$globe3 !== void 0 && _mapState$globe3.enabled) {
|
|
333
|
+
mapState = syncGlobeConfigColorsToStyle(mapState, state.mapStyle, state.mapStyle.styleType);
|
|
334
|
+
}
|
|
335
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
336
|
+
mapState: mapState
|
|
337
|
+
});
|
|
338
|
+
};
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Updater that changes the layer type by calling `layerTypeChangeUpdater` on visState.
|
|
342
|
+
* In addition to that, if the new layer type has the `darkBaseMapEnabled` config
|
|
343
|
+
* setting, we adjust it in accordance with the colorMode of the base map.s
|
|
344
|
+
*/
|
|
345
|
+
export var combinedLayerTypeChangeUpdater = function combinedLayerTypeChangeUpdater(state, action) {
|
|
346
|
+
var visState = state.visState;
|
|
347
|
+
var oldLayerIndex = visState.layers.findIndex(function (layer) {
|
|
348
|
+
return layer === action.oldLayer;
|
|
349
|
+
});
|
|
350
|
+
visState = layerTypeChangeUpdater(visState, action);
|
|
351
|
+
var newLayer = visState.layers[oldLayerIndex];
|
|
352
|
+
if (Object.prototype.hasOwnProperty.call(newLayer === null || newLayer === void 0 ? void 0 : newLayer.visConfigSettings, 'darkBaseMapEnabled')) {
|
|
353
|
+
var mapStyle = state.mapStyle;
|
|
354
|
+
var colorMode = mapStyle.mapStyles[mapStyle.styleType].colorMode;
|
|
355
|
+
var darkBaseMapEnabled = newLayer.config.visConfig.darkBaseMapEnabled;
|
|
356
|
+
switch (colorMode) {
|
|
357
|
+
case BASE_MAP_COLOR_MODES.DARK:
|
|
358
|
+
if (!darkBaseMapEnabled) {
|
|
359
|
+
visState = updateDarkBaseMapLayers(true, newLayer.id)(visState);
|
|
360
|
+
}
|
|
361
|
+
break;
|
|
362
|
+
case BASE_MAP_COLOR_MODES.LIGHT:
|
|
363
|
+
if (darkBaseMapEnabled) {
|
|
364
|
+
visState = updateDarkBaseMapLayers(false, newLayer.id)(visState);
|
|
365
|
+
}
|
|
366
|
+
break;
|
|
367
|
+
default:
|
|
368
|
+
// do nothing
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
372
|
+
visState: visState
|
|
373
|
+
});
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
/**
|
|
377
|
+
* Make mapLegend active when toggleSplitMap action is called
|
|
378
|
+
*/
|
|
379
|
+
export var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
380
|
+
var _newState$uiState$map;
|
|
381
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
382
|
+
visState: visStateToggleSplitMapUpdater(state.visState, action),
|
|
383
|
+
uiState: uiStateToggleSplitMapUpdater(state.uiState),
|
|
384
|
+
mapState: mapStateToggleSplitMapUpdater(state.mapState)
|
|
385
|
+
});
|
|
386
|
+
var isSplit = newState.visState.splitMaps.length !== 0;
|
|
387
|
+
var isLegendActive = (_newState$uiState$map = newState.uiState.mapControls) === null || _newState$uiState$map === void 0 || (_newState$uiState$map = _newState$uiState$map.mapLegend) === null || _newState$uiState$map === void 0 ? void 0 : _newState$uiState$map.active;
|
|
388
|
+
if (isSplit && !isLegendActive) {
|
|
389
|
+
newState.uiState = toggleMapControlUpdater(newState.uiState, {
|
|
390
|
+
payload: {
|
|
391
|
+
panelId: 'mapLegend',
|
|
392
|
+
index: action.payload
|
|
393
|
+
}
|
|
394
|
+
});
|
|
395
|
+
}
|
|
396
|
+
return newState;
|
|
397
|
+
};
|
|
398
|
+
|
|
399
|
+
/**
|
|
400
|
+
* Set map split mode updater - coordinates state changes across visState, mapState, and uiState
|
|
401
|
+
*/
|
|
402
|
+
export var setMapSplitModeUpdater = function setMapSplitModeUpdater(state, action) {
|
|
403
|
+
var _newUiState$mapContro;
|
|
404
|
+
var mapSplitMode = action.payload.mapSplitMode;
|
|
405
|
+
var prevMode = state.mapState.mapSplitMode;
|
|
406
|
+
if (mapSplitMode === prevMode) {
|
|
407
|
+
return state;
|
|
408
|
+
}
|
|
409
|
+
var newMapState = mapStateSetMapSplitModeUpdater(state.mapState, action);
|
|
410
|
+
var newVisState = _objectSpread({}, state.visState);
|
|
411
|
+
switch (mapSplitMode) {
|
|
412
|
+
case MapSplitMode.SINGLE_MAP:
|
|
413
|
+
newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
|
|
414
|
+
splitMaps: []
|
|
415
|
+
});
|
|
416
|
+
break;
|
|
417
|
+
case MapSplitMode.DUAL_MAP:
|
|
418
|
+
case MapSplitMode.SWIPE_COMPARE:
|
|
419
|
+
if (prevMode === MapSplitMode.SINGLE_MAP) {
|
|
420
|
+
newVisState = _objectSpread(_objectSpread({}, newVisState), {}, {
|
|
421
|
+
splitMaps: computeSplitMapLayers(newVisState.layers, {
|
|
422
|
+
duplicate: mapSplitMode === MapSplitMode.SWIPE_COMPARE
|
|
423
|
+
})
|
|
424
|
+
});
|
|
425
|
+
}
|
|
426
|
+
break;
|
|
427
|
+
default:
|
|
428
|
+
break;
|
|
429
|
+
}
|
|
430
|
+
var newUiState = uiStateToggleSplitMapUpdater(state.uiState);
|
|
431
|
+
var isSplit = newVisState.splitMaps.length !== 0;
|
|
432
|
+
var isLegendActive = (_newUiState$mapContro = newUiState.mapControls) === null || _newUiState$mapContro === void 0 || (_newUiState$mapContro = _newUiState$mapContro.mapLegend) === null || _newUiState$mapContro === void 0 ? void 0 : _newUiState$mapContro.active;
|
|
433
|
+
if (isSplit && !isLegendActive) {
|
|
434
|
+
newUiState = toggleMapControlUpdater(newUiState, {
|
|
435
|
+
payload: {
|
|
436
|
+
panelId: 'mapLegend',
|
|
437
|
+
index: 0
|
|
438
|
+
}
|
|
439
|
+
});
|
|
440
|
+
}
|
|
441
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
442
|
+
mapState: newMapState,
|
|
443
|
+
visState: newVisState,
|
|
444
|
+
uiState: newUiState
|
|
445
|
+
});
|
|
446
|
+
};
|
|
447
|
+
var defaultReplaceDataToMapOptions = {
|
|
448
|
+
keepExistingConfig: true,
|
|
449
|
+
centerMap: true,
|
|
450
|
+
autoCreateLayers: false
|
|
451
|
+
};
|
|
452
|
+
|
|
453
|
+
/**
|
|
454
|
+
* Updater replace a dataset in state
|
|
455
|
+
*/
|
|
456
|
+
export var replaceDataInMapUpdater = function replaceDataInMapUpdater(state, _ref3) {
|
|
457
|
+
var payload = _ref3.payload;
|
|
458
|
+
var datasetToReplaceId = payload.datasetToReplaceId,
|
|
459
|
+
datasetToUse = payload.datasetToUse,
|
|
460
|
+
_payload$options = payload.options,
|
|
461
|
+
options = _payload$options === void 0 ? {} : _payload$options;
|
|
462
|
+
var addDataToMapOptions = _objectSpread(_objectSpread({}, defaultReplaceDataToMapOptions), options);
|
|
463
|
+
|
|
464
|
+
// check if dataset is there
|
|
465
|
+
if (!state.visState.datasets[datasetToReplaceId]) {
|
|
466
|
+
return state;
|
|
467
|
+
}
|
|
468
|
+
// datasetToUse is ProtoDataset
|
|
469
|
+
var dataIdToUse = datasetToUse.info.id;
|
|
470
|
+
if (!dataIdToUse) {
|
|
471
|
+
return state;
|
|
472
|
+
}
|
|
473
|
+
// remove dataset and put dependencies in toBeMerged
|
|
474
|
+
var preparedState = _objectSpread(_objectSpread({}, state), {}, {
|
|
475
|
+
visState: prepareStateForDatasetReplace(state.visState, datasetToReplaceId, dataIdToUse)
|
|
476
|
+
});
|
|
477
|
+
var nextState = addDataToMapUpdater(preparedState, payload_({
|
|
478
|
+
datasets: datasetToUse,
|
|
479
|
+
// should zoom to new dataset
|
|
480
|
+
options: addDataToMapOptions
|
|
481
|
+
}));
|
|
482
|
+
return nextState;
|
|
483
|
+
};
|
|
484
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJ0b2dnbGVNb2RhbFVwZGF0ZXIiLCJsb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsInVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciIsInRvZ2dsZU1hcENvbnRyb2xVcGRhdGVyIiwidG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwidWlTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsInJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwidWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyIiwidXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJ2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyIiwic2V0TWFwSW5mb1VwZGF0ZXIiLCJsYXllclR5cGVDaGFuZ2VVcGRhdGVyIiwidmlzU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIiLCJwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZSIsInN0YXRlTWFwQ29uZmlnVXBkYXRlciIsIm1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyIiwic2V0TWFwU3BsaXRNb2RlVXBkYXRlciIsIm1hcFN0YXRlU2V0TWFwU3BsaXRNb2RlVXBkYXRlciIsInNldE1hcFZpZXdNb2RlVXBkYXRlciIsIm1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsInN0eWxlTWFwQ29uZmlnVXBkYXRlciIsImZpbGVzVG9EYXRhUGF5bG9hZCIsInBheWxvYWRfIiwiYXBwbHlfIiwid2l0aF8iLCJpZl8iLCJjb21wb3NlXyIsIm1lcmdlXyIsInBpY2tfIiwiaXNQbGFpbk9iamVjdCIsImNvbXB1dGVTcGxpdE1hcExheWVycyIsImZpbmRNYXBCb3VuZHMiLCJCQVNFX01BUF9DT0xPUl9NT0RFUyIsIk9WRVJMQVlfQkxFTkRJTkdTIiwiTk9fTUFQX0lEIiwiTWFwU3BsaXRNb2RlIiwiZ2V0QmFzZW1hcENvbG9yc0ZvclN0eWxlIiwiREVGQVVMVF9CQVNFTUFQX0NPTE9SIiwiY29tYmluZWRVcGRhdGVycyIsImlzVmFsaWRDb25maWciLCJjb25maWciLCJ2ZXJzaW9uIiwiZGVmYXVsdEFkZERhdGFUb01hcE9wdGlvbnMiLCJjZW50ZXJNYXAiLCJrZWVwRXhpc3RpbmdDb25maWciLCJhdXRvQ3JlYXRlTGF5ZXJzIiwiYXV0b0NyZWF0ZVRvb2x0aXBzIiwiYWRkRGF0YVRvTWFwVXBkYXRlciIsInN0YXRlIiwiX3JlZiIsIl9kYXRhc2V0cyQiLCJfZGF0YXNldHMkMiIsIl9kYXRhc2V0cyQzIiwicGF5bG9hZCIsImRhdGFzZXRzIiwiaW5mbyIsIm9wdGlvbnMiLCJfb2JqZWN0U3ByZWFkIiwiaXNQcm9ncmVzc2l2ZUxvYWRpbmciLCJBcnJheSIsImlzQXJyYXkiLCJmb3JtYXQiLCJpZCIsInZpc1N0YXRlIiwicGFyc2VkQ29uZmlnIiwic2NoZW1hIiwicGFyc2VTYXZlZENvbmZpZyIsIm9sZExheWVycyIsImxheWVycyIsImZpbHRlck5ld2x5QWRkZWRMYXllcnMiLCJmaWx0ZXIiLCJubCIsImZpbmQiLCJvbCIsImZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkIiwiYm91bmRzIiwidW5kZWZpbmVkIiwiQm9vbGVhbiIsIl9yZWYyIiwiT2JqZWN0IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwicmVhZE9ubHkiLCJhY3Rpb24iLCJwYXlsb2FkcyIsInJlc3VsdCIsIm5leHRTdGF0ZSIsImZpbGVMb2FkaW5nIiwiZmlsZUxvYWRpbmdQcm9ncmVzcyIsInN0YXRlV2l0aERhdGEiLCJtYXAiLCJwIiwiYWRkRGF0YVRvTWFwQ29tcG9zZWQiLCJ1cGRhdGVPdmVybGF5QmxlbmRpbmciLCJvdmVybGF5QmxlbmRpbmciLCJub3JtYWwiLCJ2YWx1ZSIsInVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzIiwiZGFya0Jhc2VNYXBFbmFibGVkIiwibGF5ZXJJZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImxheWVyIiwidmlzQ29uZmlnU2V0dGluZ3MiLCJ2aXNDb25maWciLCJ1cGRhdGVMYXllckNvbmZpZyIsImNvbWJpbmVkTWFwU3R5bGVDaGFuZ2VVcGRhdGVyIiwiX21hcFN0YXRlJGdsb2JlIiwibWFwU3R5bGUiLCJnZXRDb2xvck1vZGUiLCJrZXkiLCJfbWFwU3R5bGUkbWFwU3R5bGVzJGsiLCJtYXBTdHlsZXMiLCJjb2xvck1vZGUiLCJwcmV2Q29sb3JNb2RlIiwic3R5bGVUeXBlIiwibmV4dENvbG9yTW9kZSIsIm1hcFN0YXRlIiwiREFSSyIsInNjcmVlbiIsIkxJR0hUIiwiZGFya2VuIiwiZ2xvYmUiLCJlbmFibGVkIiwiYmFzZW1hcCIsImxhYmVscyIsImFkbWluTGluZXMiLCJ3YXRlciIsInN5bmNHbG9iZUNvbmZpZ0NvbG9yc1RvU3R5bGUiLCJfbWFwU3RhdGUkZ2xvYmUyIiwibmV4dFN0eWxlT2JqIiwibmV4dEdsb2JlQ29uZmlnIiwic3VyZmFjZUNvbG9yIiwiYmFja2dyb3VuZEZpbGxDb2xvciIsIndhdGVyQ29sb3IiLCJiYXNlbWFwV2F0ZXJGaWxsQ29sb3IiLCJhZG1pbkxpbmVzQ29sb3IiLCJiYXNlbWFwQWRtaW5MaW5lQ29sb3IiLCJiYXNlbWFwQ29sb3JzIiwic3R5bGUiLCJsYXllckdyb3VwcyIsImNvbWJpbmVkU2V0TWFwVmlld01vZGVVcGRhdGVyIiwiX21hcFN0YXRlJGdsb2JlMyIsImNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsIm9sZExheWVySW5kZXgiLCJmaW5kSW5kZXgiLCJvbGRMYXllciIsIm5ld0xheWVyIiwiX25ld1N0YXRlJHVpU3RhdGUkbWFwIiwibmV3U3RhdGUiLCJ1aVN0YXRlIiwiaXNTcGxpdCIsInNwbGl0TWFwcyIsImlzTGVnZW5kQWN0aXZlIiwibWFwQ29udHJvbHMiLCJtYXBMZWdlbmQiLCJhY3RpdmUiLCJwYW5lbElkIiwiaW5kZXgiLCJfbmV3VWlTdGF0ZSRtYXBDb250cm8iLCJtYXBTcGxpdE1vZGUiLCJwcmV2TW9kZSIsIm5ld01hcFN0YXRlIiwibmV3VmlzU3RhdGUiLCJTSU5HTEVfTUFQIiwiRFVBTF9NQVAiLCJTV0lQRV9DT01QQVJFIiwiZHVwbGljYXRlIiwibmV3VWlTdGF0ZSIsImRlZmF1bHRSZXBsYWNlRGF0YVRvTWFwT3B0aW9ucyIsInJlcGxhY2VEYXRhSW5NYXBVcGRhdGVyIiwiX3JlZjMiLCJkYXRhc2V0VG9SZXBsYWNlSWQiLCJkYXRhc2V0VG9Vc2UiLCJfcGF5bG9hZCRvcHRpb25zIiwiYWRkRGF0YVRvTWFwT3B0aW9ucyIsImRhdGFJZFRvVXNlIiwicHJlcGFyZWRTdGF0ZSJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb21iaW5lZC11cGRhdGVycy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICB0b2dnbGVNb2RhbFVwZGF0ZXIsXG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyIGFzIHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlcixcbiAgdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyB1aVN0YXRlUmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXJcbn0gZnJvbSAnLi91aS1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICB1cGRhdGVWaXNEYXRhVXBkYXRlciBhcyB2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLFxuICBzZXRNYXBJbmZvVXBkYXRlcixcbiAgbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcixcbiAgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyIGFzIHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyLFxuICBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZVxufSBmcm9tICcuL3Zpcy1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciBhcyBzdGF0ZU1hcENvbmZpZ1VwZGF0ZXIsXG4gIHRvZ2dsZVNwbGl0TWFwVXBkYXRlciBhcyBtYXBTdGF0ZVRvZ2dsZVNwbGl0TWFwVXBkYXRlcixcbiAgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciBhcyBtYXBTdGF0ZVNldE1hcFNwbGl0TW9kZVVwZGF0ZXIsXG4gIHNldE1hcFZpZXdNb2RlVXBkYXRlclxufSBmcm9tICcuL21hcC1zdGF0ZS11cGRhdGVycyc7XG5pbXBvcnQge1xuICBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIsXG4gIHJlY2VpdmVNYXBDb25maWdVcGRhdGVyIGFzIHN0eWxlTWFwQ29uZmlnVXBkYXRlclxufSBmcm9tICcuL21hcC1zdHlsZS11cGRhdGVycyc7XG5pbXBvcnQge2ZpbGVzVG9EYXRhUGF5bG9hZH0gZnJvbSAnQGtlcGxlci5nbC9wcm9jZXNzb3JzJztcbmltcG9ydCB7cGF5bG9hZF8sIGFwcGx5Xywgd2l0aF8sIGlmXywgY29tcG9zZV8sIG1lcmdlXywgcGlja199IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge01hcFN0YXRlLCBVaVN0YXRlLCBBZGREYXRhVG9NYXBQYXlsb2FkLCBQYXJzZWRDb25maWd9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtNYXBTdHlsZX0gZnJvbSAnLi9tYXAtc3R5bGUtdXBkYXRlcnMnO1xuaW1wb3J0IHtQcm92aWRlclN0YXRlfSBmcm9tICcuL3Byb3ZpZGVyLXN0YXRlLXVwZGF0ZXJzJztcbmltcG9ydCB7XG4gIGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uLFxuICBNYXBTdHlsZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIExheWVyVHlwZUNoYW5nZVVwZGF0ZXJBY3Rpb24sXG4gIFRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvbixcbiAgUmVwbGFjZURhdGFJbk1hcFBheWxvYWQsXG4gIE1hcFN0YXRlQWN0aW9uc1xufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuaW1wb3J0IHtWaXNTdGF0ZX0gZnJvbSAnQGtlcGxlci5nbC9zY2hlbWFzJztcbmltcG9ydCB7TGF5ZXJ9IGZyb20gJ0BrZXBsZXIuZ2wvbGF5ZXJzJztcbmltcG9ydCB7aXNQbGFpbk9iamVjdCwgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7ZmluZE1hcEJvdW5kc30gZnJvbSAnLi9kYXRhLXV0aWxzJztcbmltcG9ydCB7QkFTRV9NQVBfQ09MT1JfTU9ERVMsIE9WRVJMQVlfQkxFTkRJTkdTLCBOT19NQVBfSUQsIE1hcFNwbGl0TW9kZX0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtnZXRCYXNlbWFwQ29sb3JzRm9yU3R5bGUsIERFRkFVTFRfQkFTRU1BUF9DT0xPUn0gZnJvbSAnQGtlcGxlci5nbC9kZWNrZ2wtbGF5ZXJzJztcblxuZXhwb3J0IHR5cGUgS2VwbGVyR2xTdGF0ZSA9IHtcbiAgdmlzU3RhdGU6IFZpc1N0YXRlO1xuICBtYXBTdGF0ZTogTWFwU3RhdGU7XG4gIG1hcFN0eWxlOiBNYXBTdHlsZTtcbiAgdWlTdGF0ZTogVWlTdGF0ZTtcbiAgcHJvdmlkZXJTdGF0ZTogUHJvdmlkZXJTdGF0ZTtcbn07XG5cbi8vIGNvbXBvc2UgYWN0aW9uIHRvIGFwcGx5IHJlc3VsdCBtdWx0aXBsZSByZWR1Y2Vycywgd2l0aCB0aGUgb3V0cHV0IG9mIG9uZVxuXG4vKipcbiAqIFNvbWUgYWN0aW9ucyB3aWxsIGFmZmVjdCB0aGUgZW50aXJlIGtlcGxlci5sZyBpbnN0YW5jZSBzdGF0ZS5cbiAqIFRoZSB1cGRhdGVycyBmb3IgdGhlc2UgYWN0aW9ucyBpcyBleHBvcnRlZCBhcyBgY29tYmluZWRVcGRhdGVyc2AuIFRoZXNlIHVwZGF0ZXIgdGFrZSB0aGUgZW50aXJlIGluc3RhbmNlIHN0YXRlXG4gKiBhcyB0aGUgZmlyc3QgYXJndW1lbnQuIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7Y29tYmluZWRVcGRhdGVyc30gZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBhZGQgZGF0YSB0byBtYXAgYWZ0ZXIgcmVjZWl2aW5nIGRhdGEgZnJvbSByZW1vdGUgc291cmNlc1xuICogICAgY2FzZSAnTE9BRF9SRU1PVEVfUkVTT1VSQ0VfU1VDQ0VTUyc6XG4gKiAgICAgIHJldHVybiB7XG4gKiAgICAgICAgLi4uc3RhdGUsXG4gKiAgICAgICAga2VwbGVyR2w6IHtcbiAqICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLFxuICogICAgICAgICAgLy8gcGFzcyBpbiBrZXBsZXIuZ2wgaW5zdGFuY2Ugc3RhdGUgdG8gY29tYmluZWRVcGRhdGVyc1xuICogICAgICAgICAgbWFwOiAgY29tYmluZWRVcGRhdGVycy5hZGREYXRhVG9NYXBVcGRhdGVyKFxuICogICAgICAgICAgIHN0YXRlLmtlcGxlckdsLm1hcCxcbiAqICAgICAgICAgICB7XG4gKiAgICAgICAgICAgICBwYXlsb2FkOiB7XG4gKiAgICAgICAgICAgICAgIGRhdGFzZXRzOiBhY3Rpb24uZGF0YXNldHMsXG4gKiAgICAgICAgICAgICAgIG9wdGlvbnM6IHtyZWFkT25seTogdHJ1ZX0sXG4gKiAgICAgICAgICAgICAgIGNvbmZpZzogYWN0aW9uLmNvbmZpZ1xuICogICAgICAgICAgICAgIH1cbiAqICAgICAgICAgICAgfVxuICogICAgICAgICAgKVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cblxuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBjb21iaW5lZFVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBpc1ZhbGlkQ29uZmlnID0gY29uZmlnID0+XG4gIGlzUGxhaW5PYmplY3QoY29uZmlnKSAmJiBpc1BsYWluT2JqZWN0KGNvbmZpZy5jb25maWcpICYmIGNvbmZpZy52ZXJzaW9uO1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFkZERhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGNlbnRlck1hcDogdHJ1ZSxcbiAga2VlcEV4aXN0aW5nQ29uZmlnOiBmYWxzZSxcbiAgYXV0b0NyZWF0ZUxheWVyczogdHJ1ZSxcbiAgYXV0b0NyZWF0ZVRvb2x0aXBzOiB0cnVlXG59O1xuXG4vKipcbiAqIENvbWJpbmUgZGF0YSBhbmQgZnVsbCBjb25maWd1cmF0aW9uIHVwZGF0ZSBpbiBhIHNpbmdsZSBhY3Rpb25cbiAqXG4gKiBAbWVtYmVyb2YgY29tYmluZWRVcGRhdGVyc1xuICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIGtlcGxlci5nbCBpbnN0YW5jZSBzdGF0ZSwgY29udGFpbmluZyBhbGwgc3VicmVkdWNlciBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvblxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbi5wYXlsb2FkIGB7ZGF0YXNldHMsIG9wdGlvbnMsIGNvbmZpZ31gXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQuZGF0YXNldHMgLSAqKipyZXF1aXJlZCoqIGRhdGFzZXRzIGNhbiBiZSBhIGRhdGFzZXQgb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqIEVhY2ggZGF0YXNldCBvYmplY3QgbmVlZHMgdG8gaGF2ZSBgaW5mb2AgYW5kIGBkYXRhYCBwcm9wZXJ0eS5cbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQub3B0aW9uc10gb3B0aW9uIG9iamVjdCBge2NlbnRlck1hcDogdHJ1ZSwgcGFkZGluZzoge2xlZnQ6IDMwMH19YFxuICogQHBhcmFtIFthY3Rpb24ucGF5bG9hZC5jb25maWddIG1hcCBjb25maWdcbiAqIEBwYXJhbSBbYWN0aW9uLnBheWxvYWQuaW5mb10gbWFwIGluZm8gY29udGFpbnMgdGl0bGUgYW5kIGRlc2NyaXB0aW9uXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0fSBEYXRhc2V0XG4gKiBAcHJvcGVydHkgaW5mbyAtaW5mbyBvZiBhIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBpbmZvLmlkIC0gaWQgb2YgdGhpcyBkYXRhc2V0LiBJZiBjb25maWcgaXMgZGVmaW5lZCwgYGlkYCBzaG91bGQgbWF0Y2hlcyB0aGUgYGRhdGFJZGAgaW4gY29uZmlnLlxuICogQHByb3BlcnR5IGluZm8ubGFiZWwgLSBBIGRpc3BsYXkgbmFtZSBvZiB0aGlzIGRhdGFzZXRcbiAqIEBwcm9wZXJ0eSBkYXRhIC0gKioqcmVxdWlyZWQqKiBUaGUgZGF0YSBvYmplY3QsIGluIGEgdGFidWxhciBmb3JtYXQgd2l0aCAyIHByb3BlcnRpZXMgYGZpZWxkc2AgYW5kIGByb3dzYFxuICogQHByb3BlcnR5IGRhdGEuZmllbGRzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiBmaWVsZHMsXG4gKiBAcHJvcGVydHkgZGF0YS5maWVsZHMubmFtZSAtICoqKnJlcXVpcmVkKiogTmFtZSBvZiB0aGUgZmllbGQsXG4gKiBAcHJvcGVydHkgZGF0YS5yb3dzIC0gKioqcmVxdWlyZWQqKiBBcnJheSBvZiByb3dzLCBpbiBhIHRhYnVsYXIgZm9ybWF0IHdpdGggYGZpZWxkc2AgYW5kIGByb3dzYFxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICB7cGF5bG9hZH06IHtwYXlsb2FkOiBBZGREYXRhVG9NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0cywgY29uZmlnLCBpbmZvfSA9IHBheWxvYWQ7XG5cbiAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAuLi5kZWZhdWx0QWRkRGF0YVRvTWFwT3B0aW9ucyxcbiAgICAuLi5wYXlsb2FkLm9wdGlvbnNcbiAgfTtcblxuICAvLyBjaGVjayBpZiBwcm9ncmVzc2l2ZSBsb2FkaW5nIGRhdGFzZXQgYnkgYmF0Y2hlcywgYW5kIHVwZGF0ZSB2aXNTdGF0ZSBkaXJlY3RseVxuICBjb25zdCBpc1Byb2dyZXNzaXZlTG9hZGluZyA9XG4gICAgQXJyYXkuaXNBcnJheShkYXRhc2V0cykgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5mb3JtYXQgPT09ICdhcnJvdycgJiZcbiAgICBkYXRhc2V0c1swXT8uaW5mby5pZCAmJlxuICAgIGRhdGFzZXRzWzBdPy5pbmZvLmlkIGluIHN0YXRlLnZpc1N0YXRlLmRhdGFzZXRzO1xuICBpZiAoaXNQcm9ncmVzc2l2ZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gY29tcG9zZV88S2VwbGVyR2xTdGF0ZT4oW1xuICAgICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgICAgZGF0YXNldHMsXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBjb25maWdcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICBdKShzdGF0ZSk7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGxldCBwYXJzZWRDb25maWc6IFBhcnNlZENvbmZpZyA9IGNvbmZpZztcblxuICBpZiAoaXNWYWxpZENvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gaWYgcGFzc2VkIGluIHNhdmVkIGNvbmZpZ1xuICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICBwYXJzZWRDb25maWcgPSBzdGF0ZS52aXNTdGF0ZS5zY2hlbWEucGFyc2VTYXZlZENvbmZpZyhjb25maWcpO1xuICB9XG4gIGNvbnN0IG9sZExheWVycyA9IHN0YXRlLnZpc1N0YXRlLmxheWVycztcbiAgY29uc3QgZmlsdGVyTmV3bHlBZGRlZExheWVycyA9IChsYXllcnM6IExheWVyW10pID0+XG4gICAgbGF5ZXJzLmZpbHRlcihubCA9PiAhb2xkTGF5ZXJzLmZpbmQob2wgPT4gb2wgPT09IG5sKSk7XG5cbiAgLy8gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IGZvdW5kLCB0byBtYWtlIHR5cGVzY3JpcHQgaGFwcHlcbiAgY29uc3QgZmluZE1hcEJvdW5kc0lmQ2VudGVyZWQgPSAobGF5ZXJzOiBMYXllcltdKSA9PiB7XG4gICAgY29uc3QgYm91bmRzID0gb3B0aW9ucy5jZW50ZXJNYXAgJiYgZmluZE1hcEJvdW5kcyhsYXllcnMpO1xuICAgIHJldHVybiBib3VuZHMgPyBib3VuZHMgOiB1bmRlZmluZWQ7XG4gIH07XG5cbiAgcmV0dXJuIGNvbXBvc2VfPEtlcGxlckdsU3RhdGU+KFtcbiAgICBwaWNrXygndmlzU3RhdGUnKShcbiAgICAgIC8vIHRoaXMgcGFydCBjYW4gYmUgYXN5bmNcbiAgICAgIGFwcGx5XzxWaXNTdGF0ZSwgYW55Pih2aXNTdGF0ZVVwZGF0ZVZpc0RhdGFVcGRhdGVyLCB7XG4gICAgICAgIGRhdGFzZXRzLFxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZ1xuICAgICAgfSlcbiAgICApLFxuXG4gICAgaWZfKEJvb2xlYW4oaW5mbyksIHBpY2tfKCd2aXNTdGF0ZScpKGFwcGx5XzxWaXNTdGF0ZSwgYW55PihzZXRNYXBJbmZvVXBkYXRlciwge2luZm99KSkpLFxuICAgIC8vIE5vdGUgdGhhdCBmaXQgYm91bmRzIGhlcmUgd29uJ3QgYmUgY2FsbGVkIGluIGNhc2UgZGF0YXNldHMgYXJlIGNyZWF0ZWQgaW4gVGFza3MuXG4gICAgLy8gQSBzZXBhcmF0ZSBUYXNrIHRvIHVwZGF0ZSBib3VuZHMgaXMgY3JlYXRlZCBvbmNlIHRoZSBkYXRhc2V0cyBhcmUgcmVhZHkuXG4gICAgd2l0aF8oKHt2aXNTdGF0ZX0pID0+XG4gICAgICBwaWNrXygnbWFwU3RhdGUnKShcbiAgICAgICAgYXBwbHlfKFxuICAgICAgICAgIHN0YXRlTWFwQ29uZmlnVXBkYXRlcixcbiAgICAgICAgICBwYXlsb2FkXyh7XG4gICAgICAgICAgICBjb25maWc6IHBhcnNlZENvbmZpZyxcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBib3VuZHM6IGZpbmRNYXBCb3VuZHNJZkNlbnRlcmVkKGZpbHRlck5ld2x5QWRkZWRMYXllcnModmlzU3RhdGUubGF5ZXJzKSlcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICApXG4gICAgKSxcbiAgICBwaWNrXygnbWFwU3R5bGUnKShhcHBseV8oc3R5bGVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSkpLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoXG4gICAgICBhcHBseV8odWlTdGF0ZVJlY2VpdmVNYXBDb25maWdVcGRhdGVyLCBwYXlsb2FkXyh7Y29uZmlnOiBwYXJzZWRDb25maWcsIG9wdGlvbnN9KSlcbiAgICApLFxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHVpU3RhdGVMb2FkRmlsZXNTdWNjZXNzVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcblxuICAgIHBpY2tfKCd1aVN0YXRlJykoYXBwbHlfKHRvZ2dsZU1vZGFsVXBkYXRlciwgcGF5bG9hZF8obnVsbCkpKSxcbiAgICBwaWNrXygndWlTdGF0ZScpKFxuICAgICAgbWVyZ2VfKFxuICAgICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3JlYWRPbmx5JylcbiAgICAgICAgICA/IHtyZWFkT25seTogb3B0aW9ucy5yZWFkT25seX1cbiAgICAgICAgICA6IHt9XG4gICAgICApXG4gICAgKVxuICBdKShzdGF0ZSk7XG59O1xuXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzU3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBLZXBsZXJHbFN0YXRlLFxuICBhY3Rpb246IGxvYWRGaWxlc1N1Y2Nlc3NVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgLy8gc3RpbGwgbW9yZSB0byBsb2FkXG4gIGNvbnN0IHBheWxvYWRzID0gZmlsZXNUb0RhdGFQYXlsb2FkKGFjdGlvbi5yZXN1bHQpO1xuICBjb25zdCBuZXh0U3RhdGUgPSBjb21wb3NlXyhbXG4gICAgcGlja18oJ3Zpc1N0YXRlJykoXG4gICAgICBtZXJnZV8oe1xuICAgICAgICBmaWxlTG9hZGluZzogZmFsc2UsXG4gICAgICAgIGZpbGVMb2FkaW5nUHJvZ3Jlc3M6IHt9XG4gICAgICB9KVxuICAgIClcbiAgXSkoc3RhdGUpO1xuICAvLyBtYWtlIG11bHRpcGxlIGFkZCBkYXRhIHRvIG1hcCBjYWxsc1xuICBjb25zdCBzdGF0ZVdpdGhEYXRhID0gY29tcG9zZV8ocGF5bG9hZHMubWFwKHAgPT4gYXBwbHlfKGFkZERhdGFUb01hcFVwZGF0ZXIsIHBheWxvYWRfKHApKSkpKFxuICAgIG5leHRTdGF0ZVxuICApO1xuICByZXR1cm4gc3RhdGVXaXRoRGF0YSBhcyBLZXBsZXJHbFN0YXRlO1xufTtcblxuZXhwb3J0IGNvbnN0IGFkZERhdGFUb01hcENvbXBvc2VkID0gYWRkRGF0YVRvTWFwVXBkYXRlcjtcblxuLyoqXG4gKiBIZWxwZXIgd2hpY2ggdXBkYXRlcyBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIHZpc1N0YXRlLFxuICogYnV0IG9ubHkgaWYgaXQncyBub3QgY3VycmVudGx5IGluIHRoZSBgbm9ybWFsYCBtb2RlLlxuICovXG5jb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmcgPSBvdmVybGF5QmxlbmRpbmcgPT4gdmlzU3RhdGUgPT4ge1xuICBpZiAodmlzU3RhdGUub3ZlcmxheUJsZW5kaW5nICE9PSBPVkVSTEFZX0JMRU5ESU5HUy5ub3JtYWwudmFsdWUpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLi4udmlzU3RhdGUsXG4gICAgICBvdmVybGF5QmxlbmRpbmdcbiAgICB9O1xuICB9XG4gIHJldHVybiB2aXNTdGF0ZTtcbn07XG5cbi8qKlxuICogSGVscGVyIHdoaWNoIHVwZGF0ZXMgYGRhcmtCYXNlTWFwRW5hYmxlZGAgaW4gYWxsIHRoZSBsYXllcnMgaW4gdmlzU3RhdGUgd2hpY2hcbiAqIGhhdmUgdGhpcyBjb25maWcgc2V0dGluZyAob3IgaW4gb25lIHNwZWNpZmljIGxheWVyIGlmIHRoZSBgbGF5ZXJJZGAgcGFyYW0gaXMgcHJvdmlkZWQpLlxuICovXG5jb25zdCB1cGRhdGVEYXJrQmFzZU1hcExheWVycyA9XG4gIChkYXJrQmFzZU1hcEVuYWJsZWQ6IGJvb2xlYW4sIGxheWVySWQ6IHN0cmluZyB8IG51bGwgPSBudWxsKSA9PlxuICB2aXNTdGF0ZSA9PiAoe1xuICAgIC4uLnZpc1N0YXRlLFxuICAgIGxheWVyczogdmlzU3RhdGUubGF5ZXJzLm1hcChsYXllciA9PiB7XG4gICAgICBpZiAoIWxheWVySWQgfHwgbGF5ZXIuaWQgPT09IGxheWVySWQpIHtcbiAgICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChsYXllci52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgICAgICAgY29uc3Qge3Zpc0NvbmZpZ30gPSBsYXllci5jb25maWc7XG4gICAgICAgICAgcmV0dXJuIGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgIHZpc0NvbmZpZzogey4uLnZpc0NvbmZpZywgZGFya0Jhc2VNYXBFbmFibGVkfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbGF5ZXI7XG4gICAgfSlcbiAgfSk7XG5cbi8qKlxuICogVXBkYXRlciB0aGF0IGNoYW5nZXMgdGhlIG1hcCBzdHlsZSBieSBjYWxsaW5nIG1hcFN0eWxlQ2hhbmdlVXBkYXRlciBvbiB2aXNTdGF0ZS5cbiAqIEluIGFkZGl0aW9uIHRvIHRoYXQsIGl0IGRvZXMgdGhlIGZvbGxvd2luZzpcbiAqXG4gKiAgIDEuIFVwZGF0ZSBtYXAgb3ZlcmxheSBibGVuZGluZyBtb2RlIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZVxuICogICAgICBiYXNlIG1hcCwgYnV0IG9ubHkgaWYgaXQncyBub3QgaW4gdGhlIGBub3JtYWxgIG1vZGUuXG4gKlxuICogICAyLiBVcGRhdGUgYWxsIHRoZSBsYXllcnMgd2hpY2ggaGF2ZSB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnIHNldHRpbmdcbiAqICAgICAgYWRqdXN0aW5nIGl0IGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgY29sb3JNb2RlIG9mIHRoZSBiYXNlIG1hcC5cbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBjb21iaW5lZE1hcFN0eWxlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3Qge3BheWxvYWR9ID0gYWN0aW9uO1xuICBjb25zdCB7bWFwU3R5bGV9ID0gc3RhdGU7XG4gIGNvbnN0IGdldENvbG9yTW9kZSA9IGtleSA9PiBtYXBTdHlsZS5tYXBTdHlsZXNba2V5XT8uY29sb3JNb2RlO1xuICBjb25zdCBwcmV2Q29sb3JNb2RlID0gZ2V0Q29sb3JNb2RlKG1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIGNvbnN0IG5leHRDb2xvck1vZGUgPSBnZXRDb2xvck1vZGUocGF5bG9hZC5zdHlsZVR5cGUpO1xuICBsZXQge3Zpc1N0YXRlLCBtYXBTdGF0ZX0gPSBzdGF0ZTtcbiAgaWYgKG5leHRDb2xvck1vZGUgIT09IHByZXZDb2xvck1vZGUpIHtcbiAgICBzd2l0Y2ggKG5leHRDb2xvck1vZGUpIHtcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuREFSSzpcbiAgICAgICAgdmlzU3RhdGUgPSBjb21wb3NlXyhbXG4gICAgICAgICAgdXBkYXRlT3ZlcmxheUJsZW5kaW5nKE9WRVJMQVlfQkxFTkRJTkdTLnNjcmVlbi52YWx1ZSksXG4gICAgICAgICAgdXBkYXRlRGFya0Jhc2VNYXBMYXllcnModHJ1ZSlcbiAgICAgICAgXSkodmlzU3RhdGUpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgQkFTRV9NQVBfQ09MT1JfTU9ERVMuTElHSFQ6XG4gICAgICAgIHZpc1N0YXRlID0gY29tcG9zZV8oW1xuICAgICAgICAgIHVwZGF0ZU92ZXJsYXlCbGVuZGluZyhPVkVSTEFZX0JMRU5ESU5HUy5kYXJrZW4udmFsdWUpLFxuICAgICAgICAgIHVwZGF0ZURhcmtCYXNlTWFwTGF5ZXJzKGZhbHNlKVxuICAgICAgICBdKSh2aXNTdGF0ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgIC8vIGRvIG5vdGhpbmdcbiAgICB9XG4gIH1cblxuICAvLyBVcGRhdGUgZ2xvYmUgY29uZmlnIGNvbG9ycyB3aGVuIHN0eWxlIGNoYW5nZXMgYW5kIGdsb2JlIGlzIGVuYWJsZWRcbiAgaWYgKG1hcFN0YXRlLmdsb2JlPy5lbmFibGVkKSB7XG4gICAgLy8gU3dpdGNoaW5nIGZyb20gXCJObyBCYXNlbWFwXCIgdG8gYSBiYXNlbWFwIC0gcmVzdG9yZSBiYXNlbWFwIHN1Yi10b2dnbGVzXG4gICAgaWYgKHBheWxvYWQuc3R5bGVUeXBlICE9PSBOT19NQVBfSUQgJiYgbWFwU3R5bGUuc3R5bGVUeXBlID09PSBOT19NQVBfSUQpIHtcbiAgICAgIG1hcFN0YXRlID0ge1xuICAgICAgICAuLi5tYXBTdGF0ZSxcbiAgICAgICAgZ2xvYmU6IHtcbiAgICAgICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgICAgICBjb25maWc6IHtcbiAgICAgICAgICAgIC4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZyxcbiAgICAgICAgICAgIGJhc2VtYXA6IHRydWUsXG4gICAgICAgICAgICBsYWJlbHM6IHRydWUsXG4gICAgICAgICAgICBhZG1pbkxpbmVzOiB0cnVlLFxuICAgICAgICAgICAgd2F0ZXI6IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfVxuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgbWFwU3R5bGUsIHBheWxvYWQuc3R5bGVUeXBlKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGUsXG4gICAgbWFwU3RhdGUsXG4gICAgbWFwU3R5bGU6IG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihtYXBTdHlsZSwge3BheWxvYWQ6IHsuLi5wYXlsb2FkfX0pXG4gIH07XG59O1xuXG4vKipcbiAqIERlcml2ZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyAoc3VyZmFjZSAvIHdhdGVyIC8gYWRtaW4gbGluZXMpIGZyb20gYSBtYXAgc3R5bGUgYW5kXG4gKiByZXR1cm4gYW4gdXBkYXRlZCBtYXBTdGF0ZSB3aXRoIHRob3NlIGNvbG9ycyB3cml0dGVuIGludG8gYGdsb2JlLmNvbmZpZ2AuIFVzZWQgYm90aFxuICogd2hlbiB0aGUgYmFzZSBtYXAgc3R5bGUgY2hhbmdlcyBhbmQgd2hlbiBlbnRlcmluZyBnbG9iZSBtb2RlLCBzbyB0aGUgZ2xvYmUgYWx3YXlzXG4gKiByZWZsZWN0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJhc2VtYXAgaW5zdGVhZCBvZiB0aGUgc3RhdGljIERFRkFVTFRfR0xPQkVfQ09ORklHLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShcbiAgbWFwU3RhdGU6IE1hcFN0YXRlLFxuICBtYXBTdHlsZTogTWFwU3R5bGUsXG4gIHN0eWxlVHlwZTogc3RyaW5nXG4pOiBNYXBTdGF0ZSB7XG4gIGlmICghbWFwU3RhdGUuZ2xvYmU/LmVuYWJsZWQpIHtcbiAgICByZXR1cm4gbWFwU3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXh0U3R5bGVPYmogPSBtYXBTdHlsZS5tYXBTdHlsZXNbc3R5bGVUeXBlXTtcbiAgY29uc3QgbmV4dEdsb2JlQ29uZmlnID0gey4uLm1hcFN0YXRlLmdsb2JlLmNvbmZpZ307XG5cbiAgaWYgKHN0eWxlVHlwZSA9PT0gTk9fTUFQX0lEKSB7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmJhc2VtYXAgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcubGFiZWxzID0gZmFsc2U7XG4gICAgbmV4dEdsb2JlQ29uZmlnLmFkbWluTGluZXMgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcud2F0ZXIgPSBmYWxzZTtcbiAgICBuZXh0R2xvYmVDb25maWcuc3VyZmFjZUNvbG9yID0gREVGQVVMVF9CQVNFTUFQX0NPTE9SLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcFdhdGVyRmlsbENvbG9yO1xuICAgIG5leHRHbG9iZUNvbmZpZy5hZG1pbkxpbmVzQ29sb3IgPSBERUZBVUxUX0JBU0VNQVBfQ09MT1IuYmFzZW1hcEFkbWluTGluZUNvbG9yO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGJhc2VtYXBDb2xvcnMgPSBuZXh0U3R5bGVPYmpcbiAgICAgID8gZ2V0QmFzZW1hcENvbG9yc0ZvclN0eWxlKHN0eWxlVHlwZSwge1xuICAgICAgICAgIHN0eWxlOiBuZXh0U3R5bGVPYmouc3R5bGUsXG4gICAgICAgICAgbGF5ZXJHcm91cHM6IG5leHRTdHlsZU9iai5sYXllckdyb3Vwc1xuICAgICAgICB9KVxuICAgICAgOiAvLyBTdHlsZSBvYmplY3Qgbm90IHlldCBsb2FkZWQgLSB1c2Uga25vd24gcHJlc2V0cyBieSBzdHlsZSB0eXBlXG4gICAgICAgIGdldEJhc2VtYXBDb2xvcnNGb3JTdHlsZShzdHlsZVR5cGUpO1xuICAgIG5leHRHbG9iZUNvbmZpZy5zdXJmYWNlQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhY2tncm91bmRGaWxsQ29sb3I7XG4gICAgbmV4dEdsb2JlQ29uZmlnLndhdGVyQ29sb3IgPSBiYXNlbWFwQ29sb3JzLmJhc2VtYXBXYXRlckZpbGxDb2xvcjtcbiAgICBuZXh0R2xvYmVDb25maWcuYWRtaW5MaW5lc0NvbG9yID0gYmFzZW1hcENvbG9ycy5iYXNlbWFwQWRtaW5MaW5lQ29sb3I7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLm1hcFN0YXRlLFxuICAgIGdsb2JlOiB7XG4gICAgICAuLi5tYXBTdGF0ZS5nbG9iZSxcbiAgICAgIGNvbmZpZzogbmV4dEdsb2JlQ29uZmlnXG4gICAgfVxuICB9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBzd2l0Y2hlcyB0aGUgbWFwIHZpZXcgbW9kZSAoMkQgLyAzRCAvIEdsb2JlKS4gUnVucyB0aGUgYmFzZSBtYXAtc3RhdGVcbiAqIHVwZGF0ZXIgYW5kLCB3aGVuIGVudGVyaW5nIGdsb2JlIG1vZGUsIHN5bmNzIHRoZSBnbG9iZSBiYXNlbWFwIGNvbG9ycyB0byB0aGVcbiAqIGN1cnJlbnRseSBzZWxlY3RlZCBtYXAgc3R5bGUgc28gdGhlIGdsb2JlIGRvZXNuJ3Qgc2hvdyBzdGFsZSBkZWZhdWx0IGNvbG9ycy5cbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkU2V0TWFwVmlld01vZGVVcGRhdGVyID0gKFxuICBzdGF0ZTogS2VwbGVyR2xTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuU2V0TWFwVmlld01vZGVVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgbGV0IG1hcFN0YXRlID0gc2V0TWFwVmlld01vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGlmIChtYXBTdGF0ZS5nbG9iZT8uZW5hYmxlZCkge1xuICAgIG1hcFN0YXRlID0gc3luY0dsb2JlQ29uZmlnQ29sb3JzVG9TdHlsZShtYXBTdGF0ZSwgc3RhdGUubWFwU3R5bGUsIHN0YXRlLm1hcFN0eWxlLnN0eWxlVHlwZSk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcFN0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZXIgdGhhdCBjaGFuZ2VzIHRoZSBsYXllciB0eXBlIGJ5IGNhbGxpbmcgYGxheWVyVHlwZUNoYW5nZVVwZGF0ZXJgIG9uIHZpc1N0YXRlLlxuICogSW4gYWRkaXRpb24gdG8gdGhhdCwgaWYgdGhlIG5ldyBsYXllciB0eXBlIGhhcyB0aGUgYGRhcmtCYXNlTWFwRW5hYmxlZGAgY29uZmlnXG4gKiBzZXR0aW5nLCB3ZSBhZGp1c3QgaXQgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBjb2xvck1vZGUgb2YgdGhlIGJhc2UgbWFwLnNcbiAqL1xuZXhwb3J0IGNvbnN0IGNvbWJpbmVkTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTGF5ZXJUeXBlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGxldCB7dmlzU3RhdGV9ID0gc3RhdGU7XG4gIGNvbnN0IG9sZExheWVySW5kZXggPSB2aXNTdGF0ZS5sYXllcnMuZmluZEluZGV4KGxheWVyID0+IGxheWVyID09PSBhY3Rpb24ub2xkTGF5ZXIpO1xuICB2aXNTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIodmlzU3RhdGUsIGFjdGlvbik7XG4gIGNvbnN0IG5ld0xheWVyID0gdmlzU3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdO1xuICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG5ld0xheWVyPy52aXNDb25maWdTZXR0aW5ncywgJ2RhcmtCYXNlTWFwRW5hYmxlZCcpKSB7XG4gICAgY29uc3Qge21hcFN0eWxlfSA9IHN0YXRlO1xuICAgIGNvbnN0IHtjb2xvck1vZGV9ID0gbWFwU3R5bGUubWFwU3R5bGVzW21hcFN0eWxlLnN0eWxlVHlwZV07XG4gICAgY29uc3Qge2RhcmtCYXNlTWFwRW5hYmxlZH0gPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnO1xuICAgIHN3aXRjaCAoY29sb3JNb2RlKSB7XG4gICAgICBjYXNlIEJBU0VfTUFQX0NPTE9SX01PREVTLkRBUks6XG4gICAgICAgIGlmICghZGFya0Jhc2VNYXBFbmFibGVkKSB7XG4gICAgICAgICAgdmlzU3RhdGUgPSB1cGRhdGVEYXJrQmFzZU1hcExheWVycyh0cnVlLCBuZXdMYXllci5pZCkodmlzU3RhdGUpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBCQVNFX01BUF9DT0xPUl9NT0RFUy5MSUdIVDpcbiAgICAgICAgaWYgKGRhcmtCYXNlTWFwRW5hYmxlZCkge1xuICAgICAgICAgIHZpc1N0YXRlID0gdXBkYXRlRGFya0Jhc2VNYXBMYXllcnMoZmFsc2UsIG5ld0xheWVyLmlkKSh2aXNTdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlXG4gIH07XG59O1xuXG4vKipcbiAqIE1ha2UgbWFwTGVnZW5kIGFjdGl2ZSB3aGVuIHRvZ2dsZVNwbGl0TWFwIGFjdGlvbiBpcyBjYWxsZWRcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogVG9nZ2xlU3BsaXRNYXBVcGRhdGVyQWN0aW9uXG4pOiBLZXBsZXJHbFN0YXRlID0+IHtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgdmlzU3RhdGU6IHZpc1N0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnZpc1N0YXRlLCBhY3Rpb24pLFxuICAgIHVpU3RhdGU6IHVpU3RhdGVUb2dnbGVTcGxpdE1hcFVwZGF0ZXIoc3RhdGUudWlTdGF0ZSksXG4gICAgbWFwU3RhdGU6IG1hcFN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLm1hcFN0YXRlKVxuICB9O1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdTdGF0ZS52aXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1N0YXRlLnVpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdTdGF0ZS51aVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3U3RhdGUudWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogYWN0aW9uLnBheWxvYWR9XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFNldCBtYXAgc3BsaXQgbW9kZSB1cGRhdGVyIC0gY29vcmRpbmF0ZXMgc3RhdGUgY2hhbmdlcyBhY3Jvc3MgdmlzU3RhdGUsIG1hcFN0YXRlLCBhbmQgdWlTdGF0ZVxuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwU3BsaXRNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlNldE1hcFNwbGl0TW9kZVVwZGF0ZXJBY3Rpb25cbik6IEtlcGxlckdsU3RhdGUgPT4ge1xuICBjb25zdCB7bWFwU3BsaXRNb2RlfSA9IGFjdGlvbi5wYXlsb2FkO1xuICBjb25zdCBwcmV2TW9kZSA9IHN0YXRlLm1hcFN0YXRlLm1hcFNwbGl0TW9kZTtcblxuICBpZiAobWFwU3BsaXRNb2RlID09PSBwcmV2TW9kZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld01hcFN0YXRlID0gbWFwU3RhdGVTZXRNYXBTcGxpdE1vZGVVcGRhdGVyKHN0YXRlLm1hcFN0YXRlLCBhY3Rpb24pO1xuXG4gIGxldCBuZXdWaXNTdGF0ZSA9IHsuLi5zdGF0ZS52aXNTdGF0ZX07XG5cbiAgc3dpdGNoIChtYXBTcGxpdE1vZGUpIHtcbiAgICBjYXNlIE1hcFNwbGl0TW9kZS5TSU5HTEVfTUFQOlxuICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld1Zpc1N0YXRlLFxuICAgICAgICBzcGxpdE1hcHM6IFtdXG4gICAgICB9O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuRFVBTF9NQVA6XG4gICAgY2FzZSBNYXBTcGxpdE1vZGUuU1dJUEVfQ09NUEFSRTpcbiAgICAgIGlmIChwcmV2TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNJTkdMRV9NQVApIHtcbiAgICAgICAgbmV3VmlzU3RhdGUgPSB7XG4gICAgICAgICAgLi4ubmV3VmlzU3RhdGUsXG4gICAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMobmV3VmlzU3RhdGUubGF5ZXJzLCB7XG4gICAgICAgICAgICBkdXBsaWNhdGU6IG1hcFNwbGl0TW9kZSA9PT0gTWFwU3BsaXRNb2RlLlNXSVBFX0NPTVBBUkVcbiAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgbGV0IG5ld1VpU3RhdGUgPSB1aVN0YXRlVG9nZ2xlU3BsaXRNYXBVcGRhdGVyKHN0YXRlLnVpU3RhdGUpO1xuXG4gIGNvbnN0IGlzU3BsaXQgPSBuZXdWaXNTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoICE9PSAwO1xuICBjb25zdCBpc0xlZ2VuZEFjdGl2ZSA9IG5ld1VpU3RhdGUubWFwQ29udHJvbHM/Lm1hcExlZ2VuZD8uYWN0aXZlO1xuICBpZiAoaXNTcGxpdCAmJiAhaXNMZWdlbmRBY3RpdmUpIHtcbiAgICBuZXdVaVN0YXRlID0gdG9nZ2xlTWFwQ29udHJvbFVwZGF0ZXIobmV3VWlTdGF0ZSwge1xuICAgICAgcGF5bG9hZDoge3BhbmVsSWQ6ICdtYXBMZWdlbmQnLCBpbmRleDogMH1cbiAgICB9KTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwU3RhdGU6IG5ld01hcFN0YXRlLFxuICAgIHZpc1N0YXRlOiBuZXdWaXNTdGF0ZSxcbiAgICB1aVN0YXRlOiBuZXdVaVN0YXRlXG4gIH07XG59O1xuXG5jb25zdCBkZWZhdWx0UmVwbGFjZURhdGFUb01hcE9wdGlvbnMgPSB7XG4gIGtlZXBFeGlzdGluZ0NvbmZpZzogdHJ1ZSxcbiAgY2VudGVyTWFwOiB0cnVlLFxuICBhdXRvQ3JlYXRlTGF5ZXJzOiBmYWxzZVxufTtcblxuLyoqXG4gKiBVcGRhdGVyIHJlcGxhY2UgYSBkYXRhc2V0IGluIHN0YXRlXG4gKi9cbmV4cG9ydCBjb25zdCByZXBsYWNlRGF0YUluTWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IEtlcGxlckdsU3RhdGUsXG4gIHtwYXlsb2FkfToge3BheWxvYWQ6IFJlcGxhY2VEYXRhSW5NYXBQYXlsb2FkfVxuKTogS2VwbGVyR2xTdGF0ZSA9PiB7XG4gIGNvbnN0IHtkYXRhc2V0VG9SZXBsYWNlSWQsIGRhdGFzZXRUb1VzZSwgb3B0aW9ucyA9IHt9fSA9IHBheWxvYWQ7XG4gIGNvbnN0IGFkZERhdGFUb01hcE9wdGlvbnMgPSB7Li4uZGVmYXVsdFJlcGxhY2VEYXRhVG9NYXBPcHRpb25zLCAuLi5vcHRpb25zfTtcblxuICAvLyBjaGVjayBpZiBkYXRhc2V0IGlzIHRoZXJlXG4gIGlmICghc3RhdGUudmlzU3RhdGUuZGF0YXNldHNbZGF0YXNldFRvUmVwbGFjZUlkXSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBkYXRhc2V0VG9Vc2UgaXMgUHJvdG9EYXRhc2V0XG4gIGNvbnN0IGRhdGFJZFRvVXNlID0gZGF0YXNldFRvVXNlLmluZm8uaWQ7XG4gIGlmICghZGF0YUlkVG9Vc2UpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgLy8gcmVtb3ZlIGRhdGFzZXQgYW5kIHB1dCBkZXBlbmRlbmNpZXMgaW4gdG9CZU1lcmdlZFxuICBjb25zdCBwcmVwYXJlZFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIHZpc1N0YXRlOiBwcmVwYXJlU3RhdGVGb3JEYXRhc2V0UmVwbGFjZShzdGF0ZS52aXNTdGF0ZSwgZGF0YXNldFRvUmVwbGFjZUlkLCBkYXRhSWRUb1VzZSlcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBhZGREYXRhVG9NYXBVcGRhdGVyKFxuICAgIHByZXBhcmVkU3RhdGUsXG4gICAgcGF5bG9hZF8oe1xuICAgICAgZGF0YXNldHM6IGRhdGFzZXRUb1VzZSxcbiAgICAgIC8vIHNob3VsZCB6b29tIHRvIG5ldyBkYXRhc2V0XG4gICAgICBvcHRpb25zOiBhZGREYXRhVG9NYXBPcHRpb25zXG4gICAgfSlcbiAgKTtcblxuICByZXR1cm4gbmV4dFN0YXRlO1xufTtcbiJdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7QUFDQTs7QUFFQSxTQUNFQSxrQkFBa0IsRUFDbEJDLHVCQUF1QixJQUFJQyw4QkFBOEIsRUFDekRDLHVCQUF1QixFQUN2QkMscUJBQXFCLElBQUlDLDRCQUE0QixFQUNyREMsdUJBQXVCLElBQUlDLDhCQUE4QixRQUNwRCxxQkFBcUI7QUFDNUIsU0FDRUMsb0JBQW9CLElBQUlDLDRCQUE0QixFQUNwREMsaUJBQWlCLEVBQ2pCQyxzQkFBc0IsRUFDdEJQLHFCQUFxQixJQUFJUSw2QkFBNkIsRUFDdERDLDZCQUE2QixRQUN4QixzQkFBc0I7QUFDN0IsU0FDRVAsdUJBQXVCLElBQUlRLHFCQUFxQixFQUNoRFYscUJBQXFCLElBQUlXLDZCQUE2QixFQUN0REMsc0JBQXNCLElBQUlDLDhCQUE4QixFQUN4REMscUJBQXFCLFFBQ2hCLHNCQUFzQjtB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
|