@kepler.gl/reducers 3.0.0-alpha.0
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/combined-updaters.d.ts +50 -0
- package/dist/combined-updaters.js +212 -0
- package/dist/composer-helpers.d.ts +21 -0
- package/dist/composer-helpers.js +133 -0
- package/dist/composers.d.ts +12 -0
- package/dist/composers.js +47 -0
- package/dist/core.d.ts +64 -0
- package/dist/core.js +149 -0
- package/dist/data-utils.d.ts +8 -0
- package/dist/data-utils.js +60 -0
- package/dist/export-utils.d.ts +21 -0
- package/dist/export-utils.js +124 -0
- package/dist/index.d.ts +36 -0
- package/dist/index.js +372 -0
- package/dist/interaction-utils.d.ts +35 -0
- package/dist/interaction-utils.js +149 -0
- package/dist/layer-utils.d.ts +66 -0
- package/dist/layer-utils.js +289 -0
- package/dist/map-state-updaters.d.ts +62 -0
- package/dist/map-state-updaters.js +250 -0
- package/dist/map-state.d.ts +3 -0
- package/dist/map-state.js +67 -0
- package/dist/map-style-updaters.d.ts +173 -0
- package/dist/map-style-updaters.js +538 -0
- package/dist/map-style.d.ts +4 -0
- package/dist/map-style.js +66 -0
- package/dist/middleware.d.ts +8 -0
- package/dist/middleware.js +46 -0
- package/dist/provider-state-updaters.d.ts +42 -0
- package/dist/provider-state-updaters.js +512 -0
- package/dist/provider-state.d.ts +4 -0
- package/dist/provider-state.js +66 -0
- package/dist/root.d.ts +31 -0
- package/dist/root.js +235 -0
- package/dist/ui-state-updaters.d.ts +355 -0
- package/dist/ui-state-updaters.js +866 -0
- package/dist/ui-state.d.ts +3 -0
- package/dist/ui-state.js +68 -0
- package/dist/vis-state-merger.d.ts +102 -0
- package/dist/vis-state-merger.js +635 -0
- package/dist/vis-state-selectors.d.ts +2 -0
- package/dist/vis-state-selectors.js +53 -0
- package/dist/vis-state-updaters.d.ts +419 -0
- package/dist/vis-state-updaters.js +2472 -0
- package/dist/vis-state.d.ts +3 -0
- package/dist/vis-state.js +66 -0
- package/package.json +83 -0
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
// Copyright (c) 2022 Uber Technologies, Inc.
|
|
2
|
+
//
|
|
3
|
+
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
4
|
+
// of this software and associated documentation files (the "Software"), to deal
|
|
5
|
+
// in the Software without restriction, including without limitation the rights
|
|
6
|
+
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
7
|
+
// copies of the Software, and to permit persons to whom the Software is
|
|
8
|
+
// furnished to do so, subject to the following conditions:
|
|
9
|
+
//
|
|
10
|
+
// The above copyright notice and this permission notice shall be included in
|
|
11
|
+
// all copies or substantial portions of the Software.
|
|
12
|
+
//
|
|
13
|
+
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
14
|
+
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
15
|
+
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
16
|
+
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
17
|
+
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
18
|
+
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
19
|
+
// THE SOFTWARE.
|
|
20
|
+
|
|
21
|
+
"use strict";
|
|
22
|
+
|
|
23
|
+
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
|
|
24
|
+
|
|
25
|
+
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
26
|
+
|
|
27
|
+
Object.defineProperty(exports, "__esModule", {
|
|
28
|
+
value: true
|
|
29
|
+
});
|
|
30
|
+
exports.getMapStyles = getMapStyles;
|
|
31
|
+
exports.getInitialInputStyle = getInitialInputStyle;
|
|
32
|
+
exports.set3dBuildingColorUpdater = exports.addCustomMapStyleUpdater = exports.inputMapStyleUpdater = exports.loadCustomMapStyleUpdater = exports.resetMapConfigMapStyleUpdater = exports.receiveMapConfigUpdater = exports.requestMapStylesUpdater = exports.loadMapStyleErrUpdater = exports.loadMapStylesUpdater = exports.mapStyleChangeUpdater = exports.mapConfigChangeUpdater = exports.initMapStyleUpdater = exports.INITIAL_MAP_STYLE = void 0;
|
|
33
|
+
|
|
34
|
+
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
35
|
+
|
|
36
|
+
var _tasks = _interopRequireWildcard(require("react-palm/tasks"));
|
|
37
|
+
|
|
38
|
+
var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
|
|
39
|
+
|
|
40
|
+
var _utils = require("@kepler.gl/utils");
|
|
41
|
+
|
|
42
|
+
var _constants = require("@kepler.gl/constants");
|
|
43
|
+
|
|
44
|
+
var _tasks2 = require("@kepler.gl/tasks");
|
|
45
|
+
|
|
46
|
+
var _d3Color = require("d3-color");
|
|
47
|
+
|
|
48
|
+
var _actions = require("@kepler.gl/actions");
|
|
49
|
+
|
|
50
|
+
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; }
|
|
51
|
+
|
|
52
|
+
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; }
|
|
53
|
+
|
|
54
|
+
var DEFAULT_BLDG_COLOR = '#D1CEC7';
|
|
55
|
+
|
|
56
|
+
var getDefaultState = function getDefaultState() {
|
|
57
|
+
var visibleLayerGroups = {};
|
|
58
|
+
var styleType = 'dark';
|
|
59
|
+
var topLayerGroups = {};
|
|
60
|
+
return {
|
|
61
|
+
styleType: styleType,
|
|
62
|
+
visibleLayerGroups: visibleLayerGroups,
|
|
63
|
+
topLayerGroups: topLayerGroups,
|
|
64
|
+
mapStyles: _constants.DEFAULT_MAP_STYLES.reduce(function (accu, curr) {
|
|
65
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, curr.id, curr));
|
|
66
|
+
}, {}),
|
|
67
|
+
// save mapbox access token
|
|
68
|
+
mapboxApiAccessToken: null,
|
|
69
|
+
mapboxApiUrl: _constants.DEFAULT_MAPBOX_API_URL,
|
|
70
|
+
mapStylesReplaceDefault: false,
|
|
71
|
+
inputStyle: getInitialInputStyle(),
|
|
72
|
+
threeDBuildingColor: (0, _utils.hexToRgb)(DEFAULT_BLDG_COLOR),
|
|
73
|
+
custom3DBuildingColor: false,
|
|
74
|
+
bottomMapStyle: undefined,
|
|
75
|
+
topMapStyle: undefined
|
|
76
|
+
};
|
|
77
|
+
};
|
|
78
|
+
/**
|
|
79
|
+
* Updaters for `mapStyle`. Can be used in your root reducer to directly modify kepler.gl's state.
|
|
80
|
+
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
81
|
+
* @public
|
|
82
|
+
* @example
|
|
83
|
+
*
|
|
84
|
+
* import keplerGlReducer, {mapStyleUpdaters} from 'kepler.gl/reducers';
|
|
85
|
+
* // Root Reducer
|
|
86
|
+
* const reducers = combineReducers({
|
|
87
|
+
* keplerGl: keplerGlReducer,
|
|
88
|
+
* app: appReducer
|
|
89
|
+
* });
|
|
90
|
+
*
|
|
91
|
+
* const composedReducer = (state, action) => {
|
|
92
|
+
* switch (action.type) {
|
|
93
|
+
* // click button to hide label from background map
|
|
94
|
+
* case 'CLICK_BUTTON':
|
|
95
|
+
* return {
|
|
96
|
+
* ...state,
|
|
97
|
+
* keplerGl: {
|
|
98
|
+
* ...state.keplerGl,
|
|
99
|
+
* foo: {
|
|
100
|
+
* ...state.keplerGl.foo,
|
|
101
|
+
* mapStyle: mapStyleUpdaters.mapConfigChangeUpdater(
|
|
102
|
+
* mapStyle,
|
|
103
|
+
* {payload: {visibleLayerGroups: {label: false, road: true, background: true}}}
|
|
104
|
+
* )
|
|
105
|
+
* }
|
|
106
|
+
* }
|
|
107
|
+
* };
|
|
108
|
+
* }
|
|
109
|
+
* return reducers(state, action);
|
|
110
|
+
* };
|
|
111
|
+
*
|
|
112
|
+
* export default composedReducer;
|
|
113
|
+
*/
|
|
114
|
+
|
|
115
|
+
/* eslint-disable no-unused-vars */
|
|
116
|
+
// @ts-ignore
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
var mapStyleUpdaters = null;
|
|
120
|
+
/* eslint-enable no-unused-vars */
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Default initial `mapStyle`
|
|
124
|
+
* @memberof mapStyleUpdaters
|
|
125
|
+
* @constant
|
|
126
|
+
* @property styleType - Default: `'dark'`
|
|
127
|
+
* @property visibleLayerGroups - Default: `{}`
|
|
128
|
+
* @property topLayerGroups - Default: `{}`
|
|
129
|
+
* @property mapStyles - mapping from style key to style object
|
|
130
|
+
* @property mapboxApiAccessToken - Default: `null`
|
|
131
|
+
* @Property mapboxApiUrl - Default null
|
|
132
|
+
* @Property mapStylesReplaceDefault - Default: `false`
|
|
133
|
+
* @property inputStyle - Default: `{}`
|
|
134
|
+
* @property threeDBuildingColor - Default: `[r, g, b]`
|
|
135
|
+
* @public
|
|
136
|
+
*/
|
|
137
|
+
|
|
138
|
+
var INITIAL_MAP_STYLE = getDefaultState();
|
|
139
|
+
exports.INITIAL_MAP_STYLE = INITIAL_MAP_STYLE;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Create two map styles from preset map style, one for top map one for bottom
|
|
143
|
+
*
|
|
144
|
+
* @param {string} styleType - current map style
|
|
145
|
+
* @param {Object} visibleLayerGroups - visible layers of bottom map
|
|
146
|
+
* @param {Object} topLayerGroups - visible layers of top map
|
|
147
|
+
* @param {Object} mapStyles - a dictionary of all map styles
|
|
148
|
+
* @returns {Object} bottomMapStyle | topMapStyle | isRaster
|
|
149
|
+
*/
|
|
150
|
+
function getMapStyles(_ref) {
|
|
151
|
+
var styleType = _ref.styleType,
|
|
152
|
+
visibleLayerGroups = _ref.visibleLayerGroups,
|
|
153
|
+
topLayerGroups = _ref.topLayerGroups,
|
|
154
|
+
mapStyles = _ref.mapStyles;
|
|
155
|
+
var mapStyle = mapStyles[styleType]; // style might not be loaded yet
|
|
156
|
+
|
|
157
|
+
if (!mapStyle || !mapStyle.style) {
|
|
158
|
+
return {};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
var editable = Object.keys(visibleLayerGroups).length;
|
|
162
|
+
var bottomMapStyle = !editable ? mapStyle.style : (0, _utils.editBottomMapStyle)({
|
|
163
|
+
id: styleType,
|
|
164
|
+
mapStyle: mapStyle,
|
|
165
|
+
visibleLayerGroups: visibleLayerGroups
|
|
166
|
+
});
|
|
167
|
+
var hasTopLayer = editable > 0 && Object.values(topLayerGroups).some(function (v) {
|
|
168
|
+
return v;
|
|
169
|
+
}); // mute top layer if not visible in bottom layer
|
|
170
|
+
|
|
171
|
+
var topLayers = hasTopLayer && Object.keys(topLayerGroups).reduce(function (accu, key) {
|
|
172
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, topLayerGroups[key] && visibleLayerGroups[key]));
|
|
173
|
+
}, {});
|
|
174
|
+
var topMapStyle = hasTopLayer ? (0, _utils.editTopMapStyle)({
|
|
175
|
+
mapStyle: mapStyle,
|
|
176
|
+
visibleLayerGroups: topLayers
|
|
177
|
+
}) : null;
|
|
178
|
+
return {
|
|
179
|
+
bottomMapStyle: bottomMapStyle,
|
|
180
|
+
topMapStyle: topMapStyle,
|
|
181
|
+
editable: editable
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function findLayerFillColor(layer) {
|
|
186
|
+
return layer && layer.paint && layer.paint['background-color'];
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
function get3DBuildingColor(style) {
|
|
190
|
+
// set building color to be the same as the background color.
|
|
191
|
+
if (!style.style) {
|
|
192
|
+
return (0, _utils.hexToRgb)(DEFAULT_BLDG_COLOR);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
var backgroundLayer = (style.style.layers || []).find(function (_ref2) {
|
|
196
|
+
var id = _ref2.id;
|
|
197
|
+
return id === 'background';
|
|
198
|
+
});
|
|
199
|
+
var buildingLayer = (style.style.layers || []).find(function (_ref3) {
|
|
200
|
+
var id = _ref3.id;
|
|
201
|
+
return id.match(/building/);
|
|
202
|
+
});
|
|
203
|
+
var buildingColor = findLayerFillColor(buildingLayer) || findLayerFillColor(backgroundLayer) || DEFAULT_BLDG_COLOR; // brighten or darken building based on style
|
|
204
|
+
|
|
205
|
+
var operation = style.id.match(/(?=(dark|night))/) ? 'brighter' : 'darker';
|
|
206
|
+
var alpha = 0.2;
|
|
207
|
+
var rgbObj = (0, _d3Color.rgb)(buildingColor)[operation]([alpha]);
|
|
208
|
+
return [rgbObj.r, rgbObj.g, rgbObj.b];
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
function getLayerGroupsFromStyle(style) {
|
|
212
|
+
return Array.isArray(style.layers) ? _constants.DEFAULT_LAYER_GROUPS.filter(function (lg) {
|
|
213
|
+
return style.layers.filter(lg.filter).length;
|
|
214
|
+
}) : [];
|
|
215
|
+
} // Updaters
|
|
216
|
+
|
|
217
|
+
/**
|
|
218
|
+
* Propagate `mapStyle` reducer with `mapboxApiAccessToken` and `mapStylesReplaceDefault`.
|
|
219
|
+
* if mapStylesReplaceDefault is true mapStyles is emptied; loadMapStylesUpdater() will
|
|
220
|
+
* populate mapStyles.
|
|
221
|
+
*
|
|
222
|
+
* @memberof mapStyleUpdaters
|
|
223
|
+
* @public
|
|
224
|
+
*/
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
var initMapStyleUpdater = function initMapStyleUpdater(state, _ref4) {
|
|
228
|
+
var _ref4$payload = _ref4.payload,
|
|
229
|
+
payload = _ref4$payload === void 0 ? {} : _ref4$payload;
|
|
230
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
231
|
+
// save mapbox access token to map style state
|
|
232
|
+
mapboxApiAccessToken: payload.mapboxApiAccessToken || state.mapboxApiAccessToken,
|
|
233
|
+
mapboxApiUrl: payload.mapboxApiUrl || state.mapboxApiUrl,
|
|
234
|
+
mapStyles: !payload.mapStylesReplaceDefault ? state.mapStyles : {},
|
|
235
|
+
mapStylesReplaceDefault: payload.mapStylesReplaceDefault || false
|
|
236
|
+
});
|
|
237
|
+
}; // });
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Update `visibleLayerGroups`to change layer group visibility
|
|
241
|
+
* @memberof mapStyleUpdaters
|
|
242
|
+
* @public
|
|
243
|
+
*/
|
|
244
|
+
|
|
245
|
+
|
|
246
|
+
exports.initMapStyleUpdater = initMapStyleUpdater;
|
|
247
|
+
|
|
248
|
+
var mapConfigChangeUpdater = function mapConfigChangeUpdater(state, action) {
|
|
249
|
+
return _objectSpread(_objectSpread(_objectSpread({}, state), action.payload), getMapStyles(_objectSpread(_objectSpread({}, state), action.payload)));
|
|
250
|
+
};
|
|
251
|
+
/**
|
|
252
|
+
* Change to another map style. The selected style should already been loaded into `mapStyle.mapStyles`
|
|
253
|
+
* @memberof mapStyleUpdaters
|
|
254
|
+
* @public
|
|
255
|
+
*/
|
|
256
|
+
|
|
257
|
+
|
|
258
|
+
exports.mapConfigChangeUpdater = mapConfigChangeUpdater;
|
|
259
|
+
|
|
260
|
+
var mapStyleChangeUpdater = function mapStyleChangeUpdater(state, _ref5) {
|
|
261
|
+
var styleType = _ref5.payload;
|
|
262
|
+
|
|
263
|
+
if (!state.mapStyles[styleType]) {
|
|
264
|
+
// we might not have received the style yet
|
|
265
|
+
return state;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
var defaultLGVisibility = (0, _utils.getDefaultLayerGroupVisibility)(state.mapStyles[styleType]);
|
|
269
|
+
var visibleLayerGroups = (0, _utils.mergeLayerGroupVisibility)(defaultLGVisibility, state.visibleLayerGroups);
|
|
270
|
+
var threeDBuildingColor = state.custom3DBuildingColor ? state.threeDBuildingColor : get3DBuildingColor(state.mapStyles[styleType]);
|
|
271
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
272
|
+
styleType: styleType,
|
|
273
|
+
visibleLayerGroups: visibleLayerGroups,
|
|
274
|
+
threeDBuildingColor: threeDBuildingColor
|
|
275
|
+
}, getMapStyles(_objectSpread(_objectSpread({}, state), {}, {
|
|
276
|
+
visibleLayerGroups: visibleLayerGroups,
|
|
277
|
+
styleType: styleType
|
|
278
|
+
})));
|
|
279
|
+
};
|
|
280
|
+
/**
|
|
281
|
+
* Callback when load map style success
|
|
282
|
+
* @memberof mapStyleUpdaters
|
|
283
|
+
* @public
|
|
284
|
+
*/
|
|
285
|
+
|
|
286
|
+
|
|
287
|
+
exports.mapStyleChangeUpdater = mapStyleChangeUpdater;
|
|
288
|
+
|
|
289
|
+
var loadMapStylesUpdater = function loadMapStylesUpdater(state, action) {
|
|
290
|
+
var newStyles = action.payload || {};
|
|
291
|
+
var addLayerGroups = Object.keys(newStyles).reduce(function (accu, id) {
|
|
292
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, _objectSpread(_objectSpread({}, newStyles[id]), {}, {
|
|
293
|
+
layerGroups: newStyles[id].layerGroups || getLayerGroupsFromStyle(newStyles[id].style)
|
|
294
|
+
})));
|
|
295
|
+
}, {}); // add new styles to state
|
|
296
|
+
|
|
297
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
298
|
+
mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), addLayerGroups)
|
|
299
|
+
});
|
|
300
|
+
|
|
301
|
+
return newStyles[state.styleType] ? mapStyleChangeUpdater(newState, {
|
|
302
|
+
payload: state.styleType
|
|
303
|
+
}) : newState;
|
|
304
|
+
};
|
|
305
|
+
/**
|
|
306
|
+
* Callback when load map style error
|
|
307
|
+
* @memberof mapStyleUpdaters
|
|
308
|
+
* @public
|
|
309
|
+
*/
|
|
310
|
+
// do nothing for now, if didn't load, skip it
|
|
311
|
+
|
|
312
|
+
|
|
313
|
+
exports.loadMapStylesUpdater = loadMapStylesUpdater;
|
|
314
|
+
|
|
315
|
+
var loadMapStyleErrUpdater = function loadMapStyleErrUpdater(state, action) {
|
|
316
|
+
return state;
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* @memberof mapStyleUpdaters
|
|
320
|
+
* @public
|
|
321
|
+
*/
|
|
322
|
+
|
|
323
|
+
|
|
324
|
+
exports.loadMapStyleErrUpdater = loadMapStyleErrUpdater;
|
|
325
|
+
|
|
326
|
+
var requestMapStylesUpdater = function requestMapStylesUpdater(state, _ref6) {
|
|
327
|
+
var mapStyles = _ref6.payload;
|
|
328
|
+
var loadMapStyleTasks = getLoadMapStyleTasks(mapStyles, state.mapboxApiAccessToken, state.mapboxApiUrl);
|
|
329
|
+
return (0, _tasks.withTask)(state, loadMapStyleTasks);
|
|
330
|
+
};
|
|
331
|
+
/**
|
|
332
|
+
* Load map style object when pass in saved map config
|
|
333
|
+
* @memberof mapStyleUpdaters
|
|
334
|
+
* @param state `mapStyle`
|
|
335
|
+
* @param action
|
|
336
|
+
* @param action.payload saved map config `{mapStyle, visState, mapState}`
|
|
337
|
+
* @returns nextState or `react-pam` tasks to load map style object
|
|
338
|
+
*/
|
|
339
|
+
|
|
340
|
+
|
|
341
|
+
exports.requestMapStylesUpdater = requestMapStylesUpdater;
|
|
342
|
+
|
|
343
|
+
var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref7) {
|
|
344
|
+
var config = _ref7.payload.config;
|
|
345
|
+
|
|
346
|
+
var _ref8 = config || {},
|
|
347
|
+
mapStyle = _ref8.mapStyle;
|
|
348
|
+
|
|
349
|
+
if (!mapStyle) {
|
|
350
|
+
return state;
|
|
351
|
+
} // if saved custom mapStyles load the style object
|
|
352
|
+
|
|
353
|
+
|
|
354
|
+
var loadMapStyleTasks = mapStyle.mapStyles ? getLoadMapStyleTasks(mapStyle.mapStyles, state.mapboxApiAccessToken, state.mapboxApiUrl) : null; // merge default mapStyles
|
|
355
|
+
|
|
356
|
+
var merged = mapStyle.mapStyles ? _objectSpread(_objectSpread({}, mapStyle), {}, {
|
|
357
|
+
mapStyles: _objectSpread(_objectSpread({}, mapStyle.mapStyles), state.mapStyles)
|
|
358
|
+
}) : mapStyle; // set custom3DBuildingColor: true if mapStyle contains threeDBuildingColor
|
|
359
|
+
// @ts-expect-error
|
|
360
|
+
|
|
361
|
+
merged.custom3DBuildingColor = // @ts-expect-error
|
|
362
|
+
Boolean(mapStyle.threeDBuildingColor) || merged.custom3DBuildingColor;
|
|
363
|
+
var newState = mapConfigChangeUpdater(state, {
|
|
364
|
+
payload: merged
|
|
365
|
+
});
|
|
366
|
+
return loadMapStyleTasks ? (0, _tasks.withTask)(newState, loadMapStyleTasks) : newState;
|
|
367
|
+
};
|
|
368
|
+
|
|
369
|
+
exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
|
|
370
|
+
|
|
371
|
+
function getLoadMapStyleTasks(mapStyles, mapboxApiAccessToken, mapboxApiUrl) {
|
|
372
|
+
return [_tasks["default"].all(Object.values(mapStyles) // @ts-expect-error
|
|
373
|
+
.map(function (_ref9) {
|
|
374
|
+
var id = _ref9.id,
|
|
375
|
+
url = _ref9.url,
|
|
376
|
+
accessToken = _ref9.accessToken;
|
|
377
|
+
return {
|
|
378
|
+
id: id,
|
|
379
|
+
url: (0, _utils.isValidStyleUrl)(url) ? (0, _utils.getStyleDownloadUrl)(url, accessToken || mapboxApiAccessToken, mapboxApiUrl) : url
|
|
380
|
+
};
|
|
381
|
+
}).map(_tasks2.LOAD_MAP_STYLE_TASK)).bimap( // success
|
|
382
|
+
function (results) {
|
|
383
|
+
return (0, _actions.loadMapStyles)(results.reduce(function (accu, _ref10) {
|
|
384
|
+
var id = _ref10.id,
|
|
385
|
+
style = _ref10.style;
|
|
386
|
+
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, _objectSpread(_objectSpread({}, mapStyles[id]), {}, {
|
|
387
|
+
style: style
|
|
388
|
+
})));
|
|
389
|
+
}, {}));
|
|
390
|
+
}, // error
|
|
391
|
+
_actions.loadMapStyleErr)];
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Reset map style config to initial state
|
|
395
|
+
* @memberof mapStyleUpdaters
|
|
396
|
+
* @param state `mapStyle`
|
|
397
|
+
* @returns nextState
|
|
398
|
+
* @public
|
|
399
|
+
*/
|
|
400
|
+
|
|
401
|
+
|
|
402
|
+
var resetMapConfigMapStyleUpdater = function resetMapConfigMapStyleUpdater(state) {
|
|
403
|
+
var emptyConfig = _objectSpread(_objectSpread(_objectSpread({}, INITIAL_MAP_STYLE), {}, {
|
|
404
|
+
mapboxApiAccessToken: state.mapboxApiAccessToken,
|
|
405
|
+
mapboxApiUrl: state.mapboxApiUrl,
|
|
406
|
+
mapStylesReplaceDefault: state.mapStylesReplaceDefault
|
|
407
|
+
}, state.initialState), {}, {
|
|
408
|
+
mapStyles: state.mapStyles,
|
|
409
|
+
initialState: state.initialState
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
return mapStyleChangeUpdater(emptyConfig, {
|
|
413
|
+
payload: emptyConfig.styleType
|
|
414
|
+
});
|
|
415
|
+
};
|
|
416
|
+
/**
|
|
417
|
+
* Callback when a custom map style object is received
|
|
418
|
+
* @memberof mapStyleUpdaters
|
|
419
|
+
* @public
|
|
420
|
+
*/
|
|
421
|
+
|
|
422
|
+
|
|
423
|
+
exports.resetMapConfigMapStyleUpdater = resetMapConfigMapStyleUpdater;
|
|
424
|
+
|
|
425
|
+
var loadCustomMapStyleUpdater = function loadCustomMapStyleUpdater(state, _ref11) {
|
|
426
|
+
var _ref11$payload = _ref11.payload,
|
|
427
|
+
icon = _ref11$payload.icon,
|
|
428
|
+
style = _ref11$payload.style,
|
|
429
|
+
error = _ref11$payload.error;
|
|
430
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
431
|
+
// @ts-expect-error
|
|
432
|
+
inputStyle: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, state.inputStyle), style ? {
|
|
433
|
+
// @ts-expect-error
|
|
434
|
+
id: style.id || (0, _utils.generateHashId)(),
|
|
435
|
+
// make a copy of the style object
|
|
436
|
+
style: (0, _lodash["default"])(style),
|
|
437
|
+
// @ts-expect-error
|
|
438
|
+
label: style.name,
|
|
439
|
+
// gathering layer group info from style json
|
|
440
|
+
layerGroups: getLayerGroupsFromStyle(style)
|
|
441
|
+
} : {}), icon ? {
|
|
442
|
+
icon: icon
|
|
443
|
+
} : {}), error !== undefined ? {
|
|
444
|
+
error: error
|
|
445
|
+
} : {})
|
|
446
|
+
});
|
|
447
|
+
};
|
|
448
|
+
/**
|
|
449
|
+
* Input a custom map style object
|
|
450
|
+
* @memberof mapStyleUpdaters
|
|
451
|
+
* @public
|
|
452
|
+
*/
|
|
453
|
+
|
|
454
|
+
|
|
455
|
+
exports.loadCustomMapStyleUpdater = loadCustomMapStyleUpdater;
|
|
456
|
+
|
|
457
|
+
var inputMapStyleUpdater = function inputMapStyleUpdater(state, _ref12) {
|
|
458
|
+
var _ref12$payload = _ref12.payload,
|
|
459
|
+
inputStyle = _ref12$payload.inputStyle,
|
|
460
|
+
mapState = _ref12$payload.mapState;
|
|
461
|
+
|
|
462
|
+
var updated = _objectSpread(_objectSpread({}, state.inputStyle), inputStyle);
|
|
463
|
+
|
|
464
|
+
var isValid = (0, _utils.isValidStyleUrl)(updated.url);
|
|
465
|
+
var icon = isValid ? (0, _utils.getStyleImageIcon)({
|
|
466
|
+
mapState: mapState,
|
|
467
|
+
styleUrl: updated.url || '',
|
|
468
|
+
mapboxApiAccessToken: updated.accessToken || state.mapboxApiAccessToken || '',
|
|
469
|
+
mapboxApiUrl: state.mapboxApiUrl || _constants.DEFAULT_MAPBOX_API_URL
|
|
470
|
+
}) : state.inputStyle.icon;
|
|
471
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
472
|
+
inputStyle: _objectSpread(_objectSpread({}, updated), {}, {
|
|
473
|
+
isValid: isValid,
|
|
474
|
+
icon: icon
|
|
475
|
+
})
|
|
476
|
+
});
|
|
477
|
+
};
|
|
478
|
+
/**
|
|
479
|
+
* Add map style from user input to reducer and set it to current style
|
|
480
|
+
* This action is called when user click confirm after putting in a valid style url in the custom map style dialog.
|
|
481
|
+
* It should not be called from outside kepler.gl without a valid `inputStyle` in the `mapStyle` reducer.
|
|
482
|
+
* @memberof mapStyleUpdaters
|
|
483
|
+
*/
|
|
484
|
+
|
|
485
|
+
|
|
486
|
+
exports.inputMapStyleUpdater = inputMapStyleUpdater;
|
|
487
|
+
|
|
488
|
+
var addCustomMapStyleUpdater = function addCustomMapStyleUpdater(state) {
|
|
489
|
+
// @ts-expect-error
|
|
490
|
+
var styleId = state.inputStyle.id;
|
|
491
|
+
|
|
492
|
+
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
493
|
+
mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), {}, (0, _defineProperty2["default"])({}, styleId, state.inputStyle)),
|
|
494
|
+
// set to default
|
|
495
|
+
inputStyle: getInitialInputStyle()
|
|
496
|
+
}); // set new style
|
|
497
|
+
|
|
498
|
+
|
|
499
|
+
return mapStyleChangeUpdater(newState, {
|
|
500
|
+
payload: styleId
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
/**
|
|
504
|
+
* Updates 3d building color
|
|
505
|
+
* @memberof mapStyleUpdaters
|
|
506
|
+
*/
|
|
507
|
+
|
|
508
|
+
|
|
509
|
+
exports.addCustomMapStyleUpdater = addCustomMapStyleUpdater;
|
|
510
|
+
|
|
511
|
+
var set3dBuildingColorUpdater = function set3dBuildingColorUpdater(state, _ref13) {
|
|
512
|
+
var color = _ref13.payload;
|
|
513
|
+
return _objectSpread(_objectSpread({}, state), {}, {
|
|
514
|
+
threeDBuildingColor: color,
|
|
515
|
+
custom3DBuildingColor: true
|
|
516
|
+
});
|
|
517
|
+
};
|
|
518
|
+
/**
|
|
519
|
+
* Return the initial input style
|
|
520
|
+
* @return Object
|
|
521
|
+
*/
|
|
522
|
+
|
|
523
|
+
|
|
524
|
+
exports.set3dBuildingColorUpdater = set3dBuildingColorUpdater;
|
|
525
|
+
|
|
526
|
+
function getInitialInputStyle() {
|
|
527
|
+
return {
|
|
528
|
+
accessToken: null,
|
|
529
|
+
error: false,
|
|
530
|
+
isValid: false,
|
|
531
|
+
label: null,
|
|
532
|
+
style: null,
|
|
533
|
+
url: null,
|
|
534
|
+
icon: null,
|
|
535
|
+
custom: true
|
|
536
|
+
};
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3R5bGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsiREVGQVVMVF9CTERHX0NPTE9SIiwiZ2V0RGVmYXVsdFN0YXRlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwic3R5bGVUeXBlIiwidG9wTGF5ZXJHcm91cHMiLCJtYXBTdHlsZXMiLCJERUZBVUxUX01BUF9TVFlMRVMiLCJyZWR1Y2UiLCJhY2N1IiwiY3VyciIsImlkIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJERUZBVUxUX01BUEJPWF9BUElfVVJMIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbnB1dFN0eWxlIiwiZ2V0SW5pdGlhbElucHV0U3R5bGUiLCJ0aHJlZURCdWlsZGluZ0NvbG9yIiwiY3VzdG9tM0RCdWlsZGluZ0NvbG9yIiwiYm90dG9tTWFwU3R5bGUiLCJ1bmRlZmluZWQiLCJ0b3BNYXBTdHlsZSIsIm1hcFN0eWxlVXBkYXRlcnMiLCJJTklUSUFMX01BUF9TVFlMRSIsImdldE1hcFN0eWxlcyIsIm1hcFN0eWxlIiwic3R5bGUiLCJlZGl0YWJsZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJoYXNUb3BMYXllciIsInZhbHVlcyIsInNvbWUiLCJ2IiwidG9wTGF5ZXJzIiwia2V5IiwiZmluZExheWVyRmlsbENvbG9yIiwibGF5ZXIiLCJwYWludCIsImdldDNEQnVpbGRpbmdDb2xvciIsImJhY2tncm91bmRMYXllciIsImxheWVycyIsImZpbmQiLCJidWlsZGluZ0xheWVyIiwibWF0Y2giLCJidWlsZGluZ0NvbG9yIiwib3BlcmF0aW9uIiwiYWxwaGEiLCJyZ2JPYmoiLCJyIiwiZyIsImIiLCJnZXRMYXllckdyb3Vwc0Zyb21TdHlsZSIsIkFycmF5IiwiaXNBcnJheSIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmlsdGVyIiwibGciLCJpbml0TWFwU3R5bGVVcGRhdGVyIiwic3RhdGUiLCJwYXlsb2FkIiwibWFwQ29uZmlnQ2hhbmdlVXBkYXRlciIsImFjdGlvbiIsIm1hcFN0eWxlQ2hhbmdlVXBkYXRlciIsImRlZmF1bHRMR1Zpc2liaWxpdHkiLCJsb2FkTWFwU3R5bGVzVXBkYXRlciIsIm5ld1N0eWxlcyIsImFkZExheWVyR3JvdXBzIiwibGF5ZXJHcm91cHMiLCJuZXdTdGF0ZSIsImxvYWRNYXBTdHlsZUVyclVwZGF0ZXIiLCJyZXF1ZXN0TWFwU3R5bGVzVXBkYXRlciIsImxvYWRNYXBTdHlsZVRhc2tzIiwiZ2V0TG9hZE1hcFN0eWxlVGFza3MiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsImNvbmZpZyIsIm1lcmdlZCIsIkJvb2xlYW4iLCJUYXNrIiwiYWxsIiwibWFwIiwidXJsIiwiYWNjZXNzVG9rZW4iLCJMT0FEX01BUF9TVFlMRV9UQVNLIiwiYmltYXAiLCJyZXN1bHRzIiwibG9hZE1hcFN0eWxlRXJyIiwicmVzZXRNYXBDb25maWdNYXBTdHlsZVVwZGF0ZXIiLCJlbXB0eUNvbmZpZyIsImluaXRpYWxTdGF0ZSIsImxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXIiLCJpY29uIiwiZXJyb3IiLCJsYWJlbCIsIm5hbWUiLCJpbnB1dE1hcFN0eWxlVXBkYXRlciIsIm1hcFN0YXRlIiwidXBkYXRlZCIsImlzVmFsaWQiLCJzdHlsZVVybCIsImFkZEN1c3RvbU1hcFN0eWxlVXBkYXRlciIsInN0eWxlSWQiLCJzZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyIiwiY29sb3IiLCJjdXN0b20iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQW9CQTs7QUFDQTs7QUFHQTs7QUFXQTs7QUFLQTs7QUFDQTs7QUFTQTs7Ozs7O0FBNEJBLElBQU1BLGtCQUFrQixHQUFHLFNBQTNCOztBQUVBLElBQU1DLGVBQWUsR0FBRyxTQUFsQkEsZUFBa0IsR0FBZ0I7QUFDdEMsTUFBTUMsa0JBQWtCLEdBQUcsRUFBM0I7QUFDQSxNQUFNQyxTQUFTLEdBQUcsTUFBbEI7QUFDQSxNQUFNQyxjQUFjLEdBQUcsRUFBdkI7QUFFQSxTQUFPO0FBQ0xELElB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S0FBSyxFQUFFLElBTEY7QUFNTHdELElBQUFBLEdBQUcsRUFBRSxJQU5BO0FBT0xVLElBQUFBLElBQUksRUFBRSxJQVBEO0FBUUxhLElBQUFBLE1BQU0sRUFBRTtBQVJILEdBQVA7QUFVRCIsInNvdXJjZXNDb250ZW50IjpbIi8vIENvcHlyaWdodCAoYykgMjAyMiBVYmVyIFRlY2hub2xvZ2llcywgSW5jLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbi8vIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbi8vIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbi8vIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCBUYXNrLCB7d2l0aFRhc2t9IGZyb20gJ3JlYWN0LXBhbG0vdGFza3MnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2guY2xvbmVkZWVwJztcblxuLy8gVXRpbHNcbmltcG9ydCB7XG4gIGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eSxcbiAgaXNWYWxpZFN0eWxlVXJsLFxuICBnZXRTdHlsZURvd25sb2FkVXJsLFxuICBtZXJnZUxheWVyR3JvdXBWaXNpYmlsaXR5LFxuICBlZGl0VG9wTWFwU3R5bGUsXG4gIGVkaXRCb3R0b21NYXBTdHlsZSxcbiAgZ2V0U3R5bGVJbWFnZUljb24sXG4gIGdlbmVyYXRlSGFzaElkLFxuICBoZXhUb1JnYlxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfTUFQX1NUWUxFUyxcbiAgREVGQVVMVF9MQVlFUl9HUk9VUFMsXG4gIERFRkFVTFRfTUFQQk9YX0FQSV9VUkxcbn0gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtMT0FEX01BUF9TVFlMRV9UQVNLfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcbmltcG9ydCB7cmdifSBmcm9tICdkMy1jb2xvcic7XG5cbmltcG9ydCB7XG4gIFJHQkNvbG9yLFxuICBMYXllckdyb3VwLFxuICBNYXBTdHlsZXMsXG4gIElucHV0U3R5bGUsXG4gIFZpc2libGVMYXllckdyb3Vwc1xufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7XG4gIEFjdGlvblR5cGVzLFxuICBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCxcbiAgS2VwbGVyR2xJbml0UGF5bG9hZCxcbiAgTWFwU3R5bGVBY3Rpb25zLFxuICBsb2FkTWFwU3R5bGVzLFxuICBsb2FkTWFwU3R5bGVFcnJcbn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcblxuZXhwb3J0IHR5cGUgTWFwYm94U3R5bGVVcmwgPSBzdHJpbmc7XG5cbmV4cG9ydCB0eXBlIE1hcFN0eWxlID0ge1xuICBzdHlsZVR5cGU6IHN0cmluZztcbiAgdmlzaWJsZUxheWVyR3JvdXBzOiBWaXNpYmxlTGF5ZXJHcm91cHM7XG4gIHRvcExheWVyR3JvdXBzOiBWaXNpYmxlTGF5ZXJHcm91cHM7XG4gIG1hcFN0eWxlczogTWFwU3R5bGVzO1xuICAvLyBzYXZlIG1hcGJveCBhY2Nlc3MgdG9rZW5cbiAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHN0cmluZyB8IG51bGw7XG4gIG1hcGJveEFwaVVybDogc3RyaW5nO1xuICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdDogYm9vbGVhbjtcbiAgaW5wdXRTdHlsZTogSW5wdXRTdHlsZTtcbiAgdGhyZWVEQnVpbGRpbmdDb2xvcjogUkdCQ29sb3I7XG4gIGN1c3RvbTNEQnVpbGRpbmdDb2xvcjogYm9vbGVhbjtcbiAgYm90dG9tTWFwU3R5bGU6IGFueTtcbiAgdG9wTWFwU3R5bGU6IGFueTtcbiAgaW5pdGlhbFN0YXRlPzogTWFwU3R5bGU7XG59O1xuXG5jb25zdCBERUZBVUxUX0JMREdfQ09MT1IgPSAnI0QxQ0VDNyc7XG5cbmNvbnN0IGdldERlZmF1bHRTdGF0ZSA9ICgpOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHZpc2libGVMYXllckdyb3VwcyA9IHt9O1xuICBjb25zdCBzdHlsZVR5cGUgPSAnZGFyayc7XG4gIGNvbnN0IHRvcExheWVyR3JvdXBzID0ge307XG5cbiAgcmV0dXJuIHtcbiAgICBzdHlsZVR5cGUsXG4gICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgIHRvcExheWVyR3JvdXBzLFxuICAgIG1hcFN0eWxlczogREVGQVVMVF9NQVBfU1RZTEVTLnJlZHVjZShcbiAgICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICBbY3Vyci5pZF06IGN1cnJcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApLFxuICAgIC8vIHNhdmUgbWFwYm94IGFjY2VzcyB0b2tlblxuICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBudWxsLFxuICAgIG1hcGJveEFwaVVybDogREVGQVVMVF9NQVBCT1hfQVBJX1VSTCxcbiAgICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdDogZmFsc2UsXG4gICAgaW5wdXRTdHlsZTogZ2V0SW5pdGlhbElucHV0U3R5bGUoKSxcbiAgICB0aHJlZURCdWlsZGluZ0NvbG9yOiBoZXhUb1JnYihERUZBVUxUX0JMREdfQ09MT1IpLFxuICAgIGN1c3RvbTNEQnVpbGRpbmdDb2xvcjogZmFsc2UsXG4gICAgYm90dG9tTWFwU3R5bGU6IHVuZGVmaW5lZCxcbiAgICB0b3BNYXBTdHlsZTogdW5kZWZpbmVkXG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgbWFwU3R5bGVgLiBDYW4gYmUgdXNlZCBpbiB5b3VyIHJvb3QgcmVkdWNlciB0byBkaXJlY3RseSBtb2RpZnkga2VwbGVyLmdsJ3Mgc3RhdGUuXG4gKiBSZWFkIG1vcmUgYWJvdXQgW1VzaW5nIHVwZGF0ZXJzXSguLi9hZHZhbmNlZC11c2FnZS91c2luZy11cGRhdGVycy5tZClcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge21hcFN0eWxlVXBkYXRlcnN9IGZyb20gJ2tlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiAvLyBSb290IFJlZHVjZXJcbiAqIGNvbnN0IHJlZHVjZXJzID0gY29tYmluZVJlZHVjZXJzKHtcbiAqICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICogIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogY29uc3QgY29tcG9zZWRSZWR1Y2VyID0gKHN0YXRlLCBhY3Rpb24pID0+IHtcbiAqICBzd2l0Y2ggKGFjdGlvbi50eXBlKSB7XG4gKiAgICAvLyBjbGljayBidXR0b24gdG8gaGlkZSBsYWJlbCBmcm9tIGJhY2tncm91bmQgbWFwXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgbWFwU3R5bGU6IG1hcFN0eWxlVXBkYXRlcnMubWFwQ29uZmlnQ2hhbmdlVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgbWFwU3R5bGUsXG4gKiAgICAgICAgICAgICAgIHtwYXlsb2FkOiB7dmlzaWJsZUxheWVyR3JvdXBzOiB7bGFiZWw6IGZhbHNlLCByb2FkOiB0cnVlLCBiYWNrZ3JvdW5kOiB0cnVlfX19XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8vIEB0cy1pZ25vcmVcbmNvbnN0IG1hcFN0eWxlVXBkYXRlcnMgPSBudWxsO1xuLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqL1xuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYG1hcFN0eWxlYFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHN0eWxlVHlwZSAtIERlZmF1bHQ6IGAnZGFyaydgXG4gKiBAcHJvcGVydHkgdmlzaWJsZUxheWVyR3JvdXBzIC0gRGVmYXVsdDogYHt9YFxuICogQHByb3BlcnR5IHRvcExheWVyR3JvdXBzIC0gRGVmYXVsdDogYHt9YFxuICogQHByb3BlcnR5IG1hcFN0eWxlcyAtIG1hcHBpbmcgZnJvbSBzdHlsZSBrZXkgdG8gc3R5bGUgb2JqZWN0XG4gKiBAcHJvcGVydHkgbWFwYm94QXBpQWNjZXNzVG9rZW4gLSBEZWZhdWx0OiBgbnVsbGBcbiAqIEBQcm9wZXJ0eSBtYXBib3hBcGlVcmwgLSBEZWZhdWx0IG51bGxcbiAqIEBQcm9wZXJ0eSBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCAtIERlZmF1bHQ6IGBmYWxzZWBcbiAqIEBwcm9wZXJ0eSBpbnB1dFN0eWxlIC0gRGVmYXVsdDogYHt9YFxuICogQHByb3BlcnR5IHRocmVlREJ1aWxkaW5nQ29sb3IgLSBEZWZhdWx0OiBgW3IsIGcsIGJdYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9NQVBfU1RZTEU6IE1hcFN0eWxlID0gZ2V0RGVmYXVsdFN0YXRlKCk7XG5cbmludGVyZmFjZSBHZXRNYXBTdHlsZXNQYXJhbSB7XG4gIHN0eWxlVHlwZTogc3RyaW5nO1xuICB2aXNpYmxlTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgdG9wTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgbWFwU3R5bGVzOiB7W2lkOiBzdHJpbmddOiBhbnl9O1xufVxuXG4vKipcbiAqIENyZWF0ZSB0d28gbWFwIHN0eWxlcyBmcm9tIHByZXNldCBtYXAgc3R5bGUsIG9uZSBmb3IgdG9wIG1hcCBvbmUgZm9yIGJvdHRvbVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVR5cGUgLSBjdXJyZW50IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIGJvdHRvbSBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b3BMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIHRvcCBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBTdHlsZXMgLSBhIGRpY3Rpb25hcnkgb2YgYWxsIG1hcCBzdHlsZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGJvdHRvbU1hcFN0eWxlIHwgdG9wTWFwU3R5bGUgfCBpc1Jhc3RlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwU3R5bGVzKHtcbiAgc3R5bGVUeXBlLFxuICB2aXNpYmxlTGF5ZXJHcm91cHMsXG4gIHRvcExheWVyR3JvdXBzLFxuICBtYXBTdHlsZXNcbn06IEdldE1hcFN0eWxlc1BhcmFtKSB7XG4gIGNvbnN0IG1hcFN0eWxlID0gbWFwU3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgLy8gc3R5bGUgbWlnaHQgbm90IGJlIGxvYWRlZCB5ZXRcbiAgaWYgKCFtYXBTdHlsZSB8fCAhbWFwU3R5bGUuc3R5bGUpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBlZGl0YWJsZSA9IE9iamVjdC5rZXlzKHZpc2libGVMYXllckdyb3VwcykubGVuZ3RoO1xuXG4gIGNvbnN0IGJvdHRvbU1hcFN0eWxlID0gIWVkaXRhYmxlXG4gICAgPyBtYXBTdHlsZS5zdHlsZVxuICAgIDogZWRpdEJvdHRvbU1hcFN0eWxlKHtcbiAgICAgICAgaWQ6IHN0eWxlVHlwZSxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3Vwc1xuICAgICAgfSk7XG5cbiAgY29uc3QgaGFzVG9wTGF5ZXIgPSBlZGl0YWJsZSA+IDAgJiYgT2JqZWN0LnZhbHVlcyh0b3BMYXllckdyb3Vwcykuc29tZSh2ID0+IHYpO1xuXG4gIC8vIG11dGUgdG9wIGxheWVyIGlmIG5vdCB2aXNpYmxlIGluIGJvdHRvbSBsYXllclxuICBjb25zdCB0b3BMYXllcnMgPVxuICAgIGhhc1RvcExheWVyICYmXG4gICAgT2JqZWN0LmtleXModG9wTGF5ZXJHcm91cHMpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB0b3BMYXllckdyb3Vwc1trZXldICYmIHZpc2libGVMYXllckdyb3Vwc1trZXldXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufVxuICAgICk7XG5cbiAgY29uc3QgdG9wTWFwU3R5bGUgPSBoYXNUb3BMYXllclxuICAgID8gZWRpdFRvcE1hcFN0eWxlKHtcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3VwczogdG9wTGF5ZXJzXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICByZXR1cm4ge2JvdHRvbU1hcFN0eWxlLCB0b3BNYXBTdHlsZSwgZWRpdGFibGV9O1xufVxuXG5mdW5jdGlvbiBmaW5kTGF5ZXJGaWxsQ29sb3IobGF5ZXIpIHtcbiAgcmV0dXJuIGxheWVyICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG59XG5cbmZ1bmN0aW9uIGdldDNEQnVpbGRpbmdDb2xvcihzdHlsZSk6IFJHQkNvbG9yIHtcbiAgLy8gc2V0IGJ1aWxkaW5nIGNvbG9yIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICBpZiAoIXN0eWxlLnN0eWxlKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKERFRkFVTFRfQkxER19DT0xPUik7XG4gIH1cblxuICBjb25zdCBiYWNrZ3JvdW5kTGF5ZXIgPSAoc3R5bGUuc3R5bGUubGF5ZXJzIHx8IFtdKS5maW5kKCh7aWR9KSA9PiBpZCA9PT0gJ2JhY2tncm91bmQnKTtcblxuICBjb25zdCBidWlsZGluZ0xheWVyID0gKHN0eWxlLnN0eWxlLmxheWVycyB8fCBbXSkuZmluZCgoe2lkfSkgPT4gaWQubWF0Y2goL2J1aWxkaW5nLykpO1xuXG4gIGNvbnN0IGJ1aWxkaW5nQ29sb3IgPVxuICAgIGZpbmRMYXllckZpbGxDb2xvcihidWlsZGluZ0xheWVyKSB8fCBmaW5kTGF5ZXJGaWxsQ29sb3IoYmFja2dyb3VuZExheWVyKSB8fCBERUZBVUxUX0JMREdfQ09MT1I7XG5cbiAgLy8gYnJpZ2h0ZW4gb3IgZGFya2VuIGJ1aWxkaW5nIGJhc2VkIG9uIHN0eWxlXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHN0eWxlLmlkLm1hdGNoKC8oPz0oZGFya3xuaWdodCkpLykgPyAnYnJpZ2h0ZXInIDogJ2Rhcmtlcic7XG5cbiAgY29uc3QgYWxwaGEgPSAwLjI7XG4gIGNvbnN0IHJnYk9iaiA9IHJnYihidWlsZGluZ0NvbG9yKVtvcGVyYXRpb25dKFthbHBoYV0pO1xuICByZXR1cm4gW3JnYk9iai5yLCByZ2JPYmouZywgcmdiT2JqLmJdO1xufVxuXG5mdW5jdGlvbiBnZXRMYXllckdyb3Vwc0Zyb21TdHlsZShzdHlsZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdHlsZS5sYXllcnMpXG4gICAgPyBERUZBVUxUX0xBWUVSX0dST1VQUy5maWx0ZXIobGcgPT4gc3R5bGUubGF5ZXJzLmZpbHRlcihsZy5maWx0ZXIpLmxlbmd0aClcbiAgICA6IFtdO1xufVxuXG4vLyBVcGRhdGVyc1xuLyoqXG4gKiBQcm9wYWdhdGUgYG1hcFN0eWxlYCByZWR1Y2VyIHdpdGggYG1hcGJveEFwaUFjY2Vzc1Rva2VuYCBhbmQgYG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0YC5cbiAqIGlmIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0IGlzIHRydWUgbWFwU3R5bGVzIGlzIGVtcHRpZWQ7IGxvYWRNYXBTdHlsZXNVcGRhdGVyKCkgd2lsbFxuICogcG9wdWxhdGUgbWFwU3R5bGVzLlxuICpcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0TWFwU3R5bGVVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIHtcbiAgICBwYXlsb2FkID0ge31cbiAgfToge1xuICAgIHR5cGU/OiB0eXBlb2YgQWN0aW9uVHlwZXMuSU5JVDtcbiAgICBwYXlsb2FkOiBLZXBsZXJHbEluaXRQYXlsb2FkO1xuICB9XG4pOiBNYXBTdHlsZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgLy8gc2F2ZSBtYXBib3ggYWNjZXNzIHRva2VuIHRvIG1hcCBzdHlsZSBzdGF0ZVxuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogcGF5bG9hZC5tYXBib3hBcGlBY2Nlc3NUb2tlbiB8fCBzdGF0ZS5tYXBib3hBcGlBY2Nlc3NUb2tlbixcbiAgbWFwYm94QXBpVXJsOiBwYXlsb2FkLm1hcGJveEFwaVVybCB8fCBzdGF0ZS5tYXBib3hBcGlVcmwsXG4gIG1hcFN0eWxlczogIXBheWxvYWQubWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgPyBzdGF0ZS5tYXBTdHlsZXMgOiB7fSxcbiAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQ6IHBheWxvYWQubWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgfHwgZmFsc2Vcbn0pO1xuLy8gfSk7XG5cbi8qKlxuICogVXBkYXRlIGB2aXNpYmxlTGF5ZXJHcm91cHNgdG8gY2hhbmdlIGxheWVyIGdyb3VwIHZpc2liaWxpdHlcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDb25maWdDaGFuZ2VVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIGFjdGlvbjogTWFwU3R5bGVBY3Rpb25zLk1hcENvbmZpZ0NoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAuLi5hY3Rpb24ucGF5bG9hZCxcbiAgLi4uZ2V0TWFwU3R5bGVzKHtcbiAgICAuLi5zdGF0ZSxcbiAgICAuLi5hY3Rpb24ucGF5bG9hZFxuICB9KVxufSk7XG5cbi8qKlxuICogQ2hhbmdlIHRvIGFub3RoZXIgbWFwIHN0eWxlLiBUaGUgc2VsZWN0ZWQgc3R5bGUgc2hvdWxkIGFscmVhZHkgYmVlbiBsb2FkZWQgaW50byBgbWFwU3R5bGUubWFwU3R5bGVzYFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcFN0eWxlQ2hhbmdlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDogc3R5bGVUeXBlfTogTWFwU3R5bGVBY3Rpb25zLk1hcFN0eWxlQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4ge1xuICBpZiAoIXN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdKSB7XG4gICAgLy8gd2UgbWlnaHQgbm90IGhhdmUgcmVjZWl2ZWQgdGhlIHN0eWxlIHlldFxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkZWZhdWx0TEdWaXNpYmlsaXR5ID0gZ2V0RGVmYXVsdExheWVyR3JvdXBWaXNpYmlsaXR5KHN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdKTtcblxuICBjb25zdCB2aXNpYmxlTGF5ZXJHcm91cHMgPSBtZXJnZUxheWVyR3JvdXBWaXNpYmlsaXR5KFxuICAgIGRlZmF1bHRMR1Zpc2liaWxpdHksXG4gICAgc3RhdGUudmlzaWJsZUxheWVyR3JvdXBzXG4gICk7XG5cbiAgY29uc3QgdGhyZWVEQnVpbGRpbmdDb2xvcjogUkdCQ29sb3IgPSBzdGF0ZS5jdXN0b20zREJ1aWxkaW5nQ29sb3JcbiAgICA/IHN0YXRlLnRocmVlREJ1aWxkaW5nQ29sb3JcbiAgICA6IGdldDNEQnVpbGRpbmdDb2xvcihzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzdHlsZVR5cGUsXG4gICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgIHRocmVlREJ1aWxkaW5nQ29sb3IsXG4gICAgLi4uZ2V0TWFwU3R5bGVzKHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgICAgc3R5bGVUeXBlXG4gICAgfSlcbiAgfTtcbn07XG5cbi8qKlxuICogQ2FsbGJhY2sgd2hlbiBsb2FkIG1hcCBzdHlsZSBzdWNjZXNzXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZE1hcFN0eWxlc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAgYWN0aW9uOiBNYXBTdHlsZUFjdGlvbnMuTG9hZE1hcFN0eWxlc1VwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgbmV3U3R5bGVzID0gYWN0aW9uLnBheWxvYWQgfHwge307XG4gIGNvbnN0IGFkZExheWVyR3JvdXBzID0gT2JqZWN0LmtleXMobmV3U3R5bGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGlkKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtpZF06IHtcbiAgICAgICAgLi4ubmV3U3R5bGVzW2lkXSxcbiAgICAgICAgbGF5ZXJHcm91cHM6IG5ld1N0eWxlc1tpZF0ubGF5ZXJHcm91cHMgfHwgZ2V0TGF5ZXJHcm91cHNGcm9tU3R5bGUobmV3U3R5bGVzW2lkXS5zdHlsZSlcbiAgICAgIH1cbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIC8vIGFkZCBuZXcgc3R5bGVzIHRvIHN0YXRlXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIG1hcFN0eWxlczoge1xuICAgICAgLi4uc3RhdGUubWFwU3R5bGVzLFxuICAgICAgLi4uYWRkTGF5ZXJHcm91cHNcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0eWxlc1tzdGF0ZS5zdHlsZVR5cGVdXG4gICAgPyBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobmV3U3RhdGUsIHtwYXlsb2FkOiBzdGF0ZS5zdHlsZVR5cGV9KVxuICAgIDogbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gbG9hZCBtYXAgc3R5bGUgZXJyb3JcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbi8vIGRvIG5vdGhpbmcgZm9yIG5vdywgaWYgZGlkbid0IGxvYWQsIHNraXAgaXRcbmV4cG9ydCBjb25zdCBsb2FkTWFwU3R5bGVFcnJVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIGFjdGlvbjogTWFwU3R5bGVBY3Rpb25zLkxvYWRNYXBTdHlsZUVyclVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHN0YXRlO1xuXG4vKipcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZXF1ZXN0TWFwU3R5bGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDogbWFwU3R5bGVzfTogTWFwU3R5bGVBY3Rpb25zLlJlcXVlc3RNYXBTdHlsZXNVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IGxvYWRNYXBTdHlsZVRhc2tzID0gZ2V0TG9hZE1hcFN0eWxlVGFza3MoXG4gICAgbWFwU3R5bGVzLFxuICAgIHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgIHN0YXRlLm1hcGJveEFwaVVybFxuICApO1xuICByZXR1cm4gd2l0aFRhc2soc3RhdGUsIGxvYWRNYXBTdHlsZVRhc2tzKTtcbn07XG5cbi8qKlxuICogTG9hZCBtYXAgc3R5bGUgb2JqZWN0IHdoZW4gcGFzcyBpbiBzYXZlZCBtYXAgY29uZmlnXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGBtYXBTdHlsZWBcbiAqIEBwYXJhbSBhY3Rpb25cbiAqIEBwYXJhbSBhY3Rpb24ucGF5bG9hZCBzYXZlZCBtYXAgY29uZmlnIGB7bWFwU3R5bGUsIHZpc1N0YXRlLCBtYXBTdGF0ZX1gXG4gKiBAcmV0dXJucyBuZXh0U3RhdGUgb3IgYHJlYWN0LXBhbWAgdGFza3MgdG8gbG9hZCBtYXAgc3R5bGUgb2JqZWN0XG4gKi9cbmV4cG9ydCBjb25zdCByZWNlaXZlTWFwQ29uZmlnVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7XG4gICAgcGF5bG9hZDoge2NvbmZpZ31cbiAgfToge1xuICAgIHR5cGU/OiB0eXBlb2YgQWN0aW9uVHlwZXMuUkVDRUlWRV9NQVBfQ09ORklHO1xuICAgIHBheWxvYWQ6IFJlY2VpdmVNYXBDb25maWdQYXlsb2FkO1xuICB9XG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHttYXBTdHlsZX0gPSBjb25maWcgfHwge307XG5cbiAgaWYgKCFtYXBTdHlsZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIGlmIHNhdmVkIGN1c3RvbSBtYXBTdHlsZXMgbG9hZCB0aGUgc3R5bGUgb2JqZWN0XG4gIGNvbnN0IGxvYWRNYXBTdHlsZVRhc2tzID0gbWFwU3R5bGUubWFwU3R5bGVzXG4gICAgPyBnZXRMb2FkTWFwU3R5bGVUYXNrcyhtYXBTdHlsZS5tYXBTdHlsZXMsIHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLCBzdGF0ZS5tYXBib3hBcGlVcmwpXG4gICAgOiBudWxsO1xuXG4gIC8vIG1lcmdlIGRlZmF1bHQgbWFwU3R5bGVzXG4gIGNvbnN0IG1lcmdlZCA9IG1hcFN0eWxlLm1hcFN0eWxlc1xuICAgID8ge1xuICAgICAgICAuLi5tYXBTdHlsZSxcbiAgICAgICAgbWFwU3R5bGVzOiB7XG4gICAgICAgICAgLi4ubWFwU3R5bGUubWFwU3R5bGVzLFxuICAgICAgICAgIC4uLnN0YXRlLm1hcFN0eWxlc1xuICAgICAgICB9XG4gICAgICB9XG4gICAgOiBtYXBTdHlsZTtcblxuICAvLyBzZXQgY3VzdG9tM0RCdWlsZGluZ0NvbG9yOiB0cnVlIGlmIG1hcFN0eWxlIGNvbnRhaW5zIHRocmVlREJ1aWxkaW5nQ29sb3JcbiAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICBtZXJnZWQuY3VzdG9tM0RCdWlsZGluZ0NvbG9yID1cbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgQm9vbGVhbihtYXBTdHlsZS50aHJlZURCdWlsZGluZ0NvbG9yKSB8fCBtZXJnZWQuY3VzdG9tM0RCdWlsZGluZ0NvbG9yO1xuICBjb25zdCBuZXdTdGF0ZSA9IG1hcENvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGUsIHtwYXlsb2FkOiBtZXJnZWR9KTtcblxuICByZXR1cm4gbG9hZE1hcFN0eWxlVGFza3MgPyB3aXRoVGFzayhuZXdTdGF0ZSwgbG9hZE1hcFN0eWxlVGFza3MpIDogbmV3U3RhdGU7XG59O1xuXG5mdW5jdGlvbiBnZXRMb2FkTWFwU3R5bGVUYXNrcyhtYXBTdHlsZXMsIG1hcGJveEFwaUFjY2Vzc1Rva2VuLCBtYXBib3hBcGlVcmwpIHtcbiAgcmV0dXJuIFtcbiAgICBUYXNrLmFsbChcbiAgICAgIE9iamVjdC52YWx1ZXMobWFwU3R5bGVzKVxuICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgIC5tYXAoKHtpZCwgdXJsLCBhY2Nlc3NUb2tlbn0pID0+ICh7XG4gICAgICAgICAgaWQsXG4gICAgICAgICAgdXJsOiBpc1ZhbGlkU3R5bGVVcmwodXJsKVxuICAgICAgICAgICAgPyBnZXRTdHlsZURvd25sb2FkVXJsKHVybCwgYWNjZXNzVG9rZW4gfHwgbWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybClcbiAgICAgICAgICAgIDogdXJsXG4gICAgICAgIH0pKVxuICAgICAgICAubWFwKExPQURfTUFQX1NUWUxFX1RBU0spXG4gICAgKS5iaW1hcChcbiAgICAgIC8vIHN1Y2Nlc3NcbiAgICAgIHJlc3VsdHMgPT5cbiAgICAgICAgbG9hZE1hcFN0eWxlcyhcbiAgICAgICAgICByZXN1bHRzLnJlZHVjZShcbiAgICAgICAgICAgIChhY2N1LCB7aWQsIHN0eWxlfSkgPT4gKHtcbiAgICAgICAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgICAgICAgW2lkXToge1xuICAgICAgICAgICAgICAgIC4uLm1hcFN0eWxlc1tpZF0sXG4gICAgICAgICAgICAgICAgc3R5bGVcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB7fVxuICAgICAgICAgIClcbiAgICAgICAgKSxcbiAgICAgIC8vIGVycm9yXG4gICAgICBsb2FkTWFwU3R5bGVFcnJcbiAgICApXG4gIF07XG59XG4vKipcbiAqIFJlc2V0IG1hcCBzdHlsZSBjb25maWcgdG8gaW5pdGlhbCBzdGF0ZVxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgbWFwU3R5bGVgXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnTWFwU3R5bGVVcGRhdGVyID0gKHN0YXRlOiBNYXBTdHlsZSk6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgZW1wdHlDb25maWcgPSB7XG4gICAgLi4uSU5JVElBTF9NQVBfU1RZTEUsXG4gICAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgIG1hcGJveEFwaVVybDogc3RhdGUubWFwYm94QXBpVXJsLFxuICAgIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0OiBzdGF0ZS5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCxcbiAgICAuLi5zdGF0ZS5pbml0aWFsU3RhdGUsXG4gICAgbWFwU3R5bGVzOiBzdGF0ZS5tYXBTdHlsZXMsXG4gICAgaW5pdGlhbFN0YXRlOiBzdGF0ZS5pbml0aWFsU3RhdGVcbiAgfTtcblxuICByZXR1cm4gbWFwU3R5bGVDaGFuZ2VVcGRhdGVyKGVtcHR5Q29uZmlnLCB7cGF5bG9hZDogZW1wdHlDb25maWcuc3R5bGVUeXBlfSk7XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gYSBjdXN0b20gbWFwIHN0eWxlIG9iamVjdCBpcyByZWNlaXZlZFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtpY29uLCBzdHlsZSwgZXJyb3J9fTogTWFwU3R5bGVBY3Rpb25zLkxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGlucHV0U3R5bGU6IHtcbiAgICAuLi5zdGF0ZS5pbnB1dFN0eWxlLFxuICAgIC8vIHN0eWxlIGpzb24gYW5kIGljb24gd2lsbCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgLi4uKHN0eWxlXG4gICAgICA/IHtcbiAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgaWQ6IHN0eWxlLmlkIHx8IGdlbmVyYXRlSGFzaElkKCksXG4gICAgICAgICAgLy8gbWFrZSBhIGNvcHkgb2YgdGhlIHN0eWxlIG9iamVjdFxuICAgICAgICAgIHN0eWxlOiBjbG9uZURlZXAoc3R5bGUpLFxuICAgICAgICAgIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgICAgICAgICBsYWJlbDogc3R5bGUubmFtZSxcbiAgICAgICAgICAvLyBnYXRoZXJpbmcgbGF5ZXIgZ3JvdXAgaW5mbyBmcm9tIHN0eWxlIGpzb25cbiAgICAgICAgICBsYXllckdyb3VwczogZ2V0TGF5ZXJHcm91cHNGcm9tU3R5bGUoc3R5bGUpXG4gICAgICAgIH1cbiAgICAgIDoge30pLFxuICAgIC4uLihpY29uID8ge2ljb259IDoge30pLFxuICAgIC4uLihlcnJvciAhPT0gdW5kZWZpbmVkID8ge2Vycm9yfSA6IHt9KVxuICB9XG59KTtcblxuLyoqXG4gKiBJbnB1dCBhIGN1c3RvbSBtYXAgc3R5bGUgb2JqZWN0XG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgaW5wdXRNYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtpbnB1dFN0eWxlLCBtYXBTdGF0ZX19OiBNYXBTdHlsZUFjdGlvbnMuSW5wdXRNYXBTdHlsZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgdXBkYXRlZCA9IHtcbiAgICAuLi5zdGF0ZS5pbnB1dFN0eWxlLFxuICAgIC4uLmlucHV0U3R5bGVcbiAgfTtcblxuICBjb25zdCBpc1ZhbGlkID0gaXNWYWxpZFN0eWxlVXJsKHVwZGF0ZWQudXJsKTtcbiAgY29uc3QgaWNvbiA9IGlzVmFsaWRcbiAgICA/IGdldFN0eWxlSW1hZ2VJY29uKHtcbiAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgIHN0eWxlVXJsOiB1cGRhdGVkLnVybCB8fCAnJyxcbiAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW46IHVwZGF0ZWQuYWNjZXNzVG9rZW4gfHwgc3RhdGUubWFwYm94QXBpQWNjZXNzVG9rZW4gfHwgJycsXG4gICAgICAgIG1hcGJveEFwaVVybDogc3RhdGUubWFwYm94QXBpVXJsIHx8IERFRkFVTFRfTUFQQk9YX0FQSV9VUkxcbiAgICAgIH0pXG4gICAgOiBzdGF0ZS5pbnB1dFN0eWxlLmljb247XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBpbnB1dFN0eWxlOiB7XG4gICAgICAuLi51cGRhdGVkLFxuICAgICAgaXNWYWxpZCxcbiAgICAgIGljb25cbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBtYXAgc3R5bGUgZnJvbSB1c2VyIGlucHV0IHRvIHJlZHVjZXIgYW5kIHNldCBpdCB0byBjdXJyZW50IHN0eWxlXG4gKiBUaGlzIGFjdGlvbiBpcyBjYWxsZWQgd2hlbiB1c2VyIGNsaWNrIGNvbmZpcm0gYWZ0ZXIgcHV0dGluZyBpbiBhIHZhbGlkIHN0eWxlIHVybCBpbiB0aGUgY3VzdG9tIG1hcCBzdHlsZSBkaWFsb2cuXG4gKiBJdCBzaG91bGQgbm90IGJlIGNhbGxlZCBmcm9tIG91dHNpZGUga2VwbGVyLmdsIHdpdGhvdXQgYSB2YWxpZCBgaW5wdXRTdHlsZWAgaW4gdGhlIGBtYXBTdHlsZWAgcmVkdWNlci5cbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoc3RhdGU6IE1hcFN0eWxlKTogTWFwU3R5bGUgPT4ge1xuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGNvbnN0IHN0eWxlSWQgPSBzdGF0ZS5pbnB1dFN0eWxlLmlkO1xuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBtYXBTdHlsZXM6IHtcbiAgICAgIC4uLnN0YXRlLm1hcFN0eWxlcyxcbiAgICAgIFtzdHlsZUlkXTogc3RhdGUuaW5wdXRTdHlsZVxuICAgIH0sXG4gICAgLy8gc2V0IHRvIGRlZmF1bHRcbiAgICBpbnB1dFN0eWxlOiBnZXRJbml0aWFsSW5wdXRTdHlsZSgpXG4gIH07XG4gIC8vIHNldCBuZXcgc3R5bGVcbiAgcmV0dXJuIG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihuZXdTdGF0ZSwge3BheWxvYWQ6IHN0eWxlSWR9KTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyAzZCBidWlsZGluZyBjb2xvclxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldDNkQnVpbGRpbmdDb2xvclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IGNvbG9yfTogTWFwU3R5bGVBY3Rpb25zLlNldDNkQnVpbGRpbmdDb2xvclVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICB0aHJlZURCdWlsZGluZ0NvbG9yOiBjb2xvcixcbiAgY3VzdG9tM0RCdWlsZGluZ0NvbG9yOiB0cnVlXG59KTtcblxuLyoqXG4gKiBSZXR1cm4gdGhlIGluaXRpYWwgaW5wdXQgc3R5bGVcbiAqIEByZXR1cm4gT2JqZWN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbml0aWFsSW5wdXRTdHlsZSgpIHtcbiAgcmV0dXJuIHtcbiAgICBhY2Nlc3NUb2tlbjogbnVsbCxcbiAgICBlcnJvcjogZmFsc2UsXG4gICAgaXNWYWxpZDogZmFsc2UsXG4gICAgbGFiZWw6IG51bGwsXG4gICAgc3R5bGU6IG51bGwsXG4gICAgdXJsOiBudWxsLFxuICAgIGljb246IG51bGwsXG4gICAgY3VzdG9tOiB0cnVlXG4gIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import * as mapStyleUpdaters from './map-style-updaters';
|
|
2
|
+
export declare const mapStyleReducerFactory: (initialState?: {}) => import("redux-actions").ReduxCompatibleReducer<mapStyleUpdaters.MapStyle, mapStyleUpdaters.MapStyle>;
|
|
3
|
+
declare const _default: import("redux-actions").ReduxCompatibleReducer<mapStyleUpdaters.MapStyle, mapStyleUpdaters.MapStyle>;
|
|
4
|
+
export default _default;
|