@kepler.gl/reducers 3.0.0 → 3.1.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.
Files changed (49) hide show
  1. package/package.json +26 -20
  2. package/dist/combined-updaters.d.ts +0 -79
  3. package/dist/combined-updaters.js +0 -423
  4. package/dist/composer-helpers.d.ts +0 -24
  5. package/dist/composer-helpers.js +0 -122
  6. package/dist/composers.d.ts +0 -18
  7. package/dist/composers.js +0 -27
  8. package/dist/core.d.ts +0 -64
  9. package/dist/core.js +0 -139
  10. package/dist/data-utils.d.ts +0 -8
  11. package/dist/data-utils.js +0 -42
  12. package/dist/export-utils.d.ts +0 -21
  13. package/dist/export-utils.js +0 -104
  14. package/dist/index.d.ts +0 -35
  15. package/dist/index.js +0 -373
  16. package/dist/interaction-utils.d.ts +0 -31
  17. package/dist/interaction-utils.js +0 -129
  18. package/dist/layer-utils.d.ts +0 -95
  19. package/dist/layer-utils.js +0 -344
  20. package/dist/map-state-updaters.d.ts +0 -93
  21. package/dist/map-state-updaters.js +0 -489
  22. package/dist/map-state.d.ts +0 -75
  23. package/dist/map-state.js +0 -47
  24. package/dist/map-style-updaters.d.ts +0 -186
  25. package/dist/map-style-updaters.js +0 -737
  26. package/dist/map-style.d.ts +0 -4
  27. package/dist/map-style.js +0 -46
  28. package/dist/merger-handler.d.ts +0 -10
  29. package/dist/merger-handler.js +0 -123
  30. package/dist/middleware.d.ts +0 -8
  31. package/dist/middleware.js +0 -30
  32. package/dist/provider-state-updaters.d.ts +0 -35
  33. package/dist/provider-state-updaters.js +0 -422
  34. package/dist/provider-state.d.ts +0 -4
  35. package/dist/provider-state.js +0 -46
  36. package/dist/root.d.ts +0 -24
  37. package/dist/root.js +0 -229
  38. package/dist/ui-state-updaters.d.ts +0 -362
  39. package/dist/ui-state-updaters.js +0 -871
  40. package/dist/ui-state.d.ts +0 -3
  41. package/dist/ui-state.js +0 -48
  42. package/dist/vis-state-merger.d.ts +0 -140
  43. package/dist/vis-state-merger.js +0 -915
  44. package/dist/vis-state-selectors.d.ts +0 -2
  45. package/dist/vis-state-selectors.js +0 -37
  46. package/dist/vis-state-updaters.d.ts +0 -545
  47. package/dist/vis-state-updaters.js +0 -3154
  48. package/dist/vis-state.d.ts +0 -211
  49. package/dist/vis-state.js +0 -46
@@ -1,489 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
-
5
- Object.defineProperty(exports, "__esModule", {
6
- value: true
7
- });
8
- exports.getMapDimForSplitMap = getMapDimForSplitMap;
9
- exports.pickViewportPropsFromMapState = pickViewportPropsFromMapState;
10
- exports.toggleSplitMapViewportUpdater = exports.toggleSplitMapUpdater = exports.receiveMapConfigUpdater = exports.resetMapConfigUpdater = exports.togglePerspectiveUpdater = exports.fitBoundsUpdater = exports.updateMapUpdater = exports.INITIAL_MAP_STATE = void 0;
11
-
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
15
-
16
- var _geoViewport = _interopRequireDefault(require("@mapbox/geo-viewport"));
17
-
18
- var _booleanWithin = _interopRequireDefault(require("@turf/boolean-within"));
19
-
20
- var _bboxPolygon = _interopRequireDefault(require("@turf/bbox-polygon"));
21
-
22
- var _webMercator = require("@math.gl/web-mercator");
23
-
24
- var _deepmerge = _interopRequireDefault(require("deepmerge"));
25
-
26
- var _lodash = _interopRequireDefault(require("lodash.pick"));
27
-
28
- var _utils = require("@kepler.gl/utils");
29
-
30
- 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; }
31
-
32
- 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; }
33
-
34
- /**
35
- * Updaters for `mapState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
36
- * Read more about [Using updaters](../advanced-usage/using-updaters.md)
37
- * @public
38
- * @example
39
- *
40
- * import keplerGlReducer, {mapStateUpdaters} from 'kepler.gl/reducers';
41
- * // Root Reducer
42
- * const reducers = combineReducers({
43
- * keplerGl: keplerGlReducer,
44
- * app: appReducer
45
- * });
46
- *
47
- * const composedReducer = (state, action) => {
48
- * switch (action.type) {
49
- * // click button to close side panel
50
- * case 'CLICK_BUTTON':
51
- * return {
52
- * ...state,
53
- * keplerGl: {
54
- * ...state.keplerGl,
55
- * foo: {
56
- * ...state.keplerGl.foo,
57
- * mapState: mapStateUpdaters.fitBoundsUpdater(
58
- * mapState, {payload: [127.34, 31.09, 127.56, 31.59]]}
59
- * )
60
- * }
61
- * }
62
- * };
63
- * }
64
- * return reducers(state, action);
65
- * };
66
- *
67
- * export default composedReducer;
68
- */
69
-
70
- /* eslint-disable no-unused-vars */
71
- // @ts-ignore
72
- var mapStateUpdaters = null;
73
- /* eslint-enable no-unused-vars */
74
-
75
- /**
76
- * Default initial `mapState`
77
- * @memberof mapStateUpdaters
78
- * @constant
79
- * @property pitch Default: `0`
80
- * @property bearing Default: `0`
81
- * @property latitude Default: `37.75043`
82
- * @property longitude Default: `-122.34679`
83
- * @property zoom Default: `9`
84
- * @property dragRotate Default: `false`
85
- * @property width Default: `800`
86
- * @property height Default: `800`
87
- * @property minZoom: `undefined`,
88
- * @property maxZoom: `undefined`,
89
- * @property maxBounds: `undefined`,
90
- * @property isSplit: `false`,
91
- * @property isViewportSynced: `true`,
92
- * @property isZoomLocked: `false`,
93
- * @property splitMapViewports: `[]`
94
- * @public
95
- */
96
-
97
- var INITIAL_MAP_STATE = {
98
- pitch: 0,
99
- bearing: 0,
100
- latitude: 37.75043,
101
- longitude: -122.34679,
102
- zoom: 9,
103
- dragRotate: false,
104
- width: 800,
105
- height: 800,
106
- minZoom: undefined,
107
- maxZoom: undefined,
108
- maxBounds: undefined,
109
- isSplit: false,
110
- isViewportSynced: true,
111
- isZoomLocked: false,
112
- splitMapViewports: []
113
- };
114
- /* Updaters */
115
-
116
- /**
117
- * Update map viewport
118
- * @memberof mapStateUpdaters
119
- * @public
120
- */
121
-
122
- exports.INITIAL_MAP_STATE = INITIAL_MAP_STATE;
123
-
124
- var updateMapUpdater = function updateMapUpdater(state, action) {
125
- var _action$payload = action.payload,
126
- viewport = _action$payload.viewport,
127
- _action$payload$mapIn = _action$payload.mapIndex,
128
- mapIndex = _action$payload$mapIn === void 0 ? 0 : _action$payload$mapIn;
129
-
130
- if (state.isViewportSynced) {
131
- // The `updateViewport` function is typed as (Viewport, Viewport) -> Viewport but here the
132
- // expected typing is (MapState, Viewport) -> MapState.
133
- // this could be a potential bug as we treat Viewport and MapState as equal seemingly
134
- // @ts-expect-error Type 'Viewport' is missing the following properties from type 'MapState': isSplit, isViewportSynced, isZoomLocked, splitMapViewports
135
- return updateViewport(state, viewport);
136
- }
137
-
138
- var otherViewportMapIndex = -1;
139
- var splitMapViewports = state.splitMapViewports.map(function (currentViewport, i) {
140
- if (i === mapIndex) {
141
- // update the matching viewport with the newViewport info in the action payload
142
- return updateViewport(currentViewport, viewport);
143
- }
144
-
145
- otherViewportMapIndex = i; // make no changes to the other viewport (yet)
146
-
147
- return currentViewport;
148
- }); // make conditional updates to the other viewport not matching this payload's `mapIndex`
149
-
150
- if (Number.isFinite(otherViewportMapIndex) && otherViewportMapIndex > -1) {
151
- // width and height are a special case and are always updated
152
- splitMapViewports[otherViewportMapIndex] = _objectSpread(_objectSpread({}, splitMapViewports[otherViewportMapIndex]), {}, {
153
- width: splitMapViewports[mapIndex].width,
154
- height: splitMapViewports[mapIndex].height
155
- });
156
-
157
- if (state.isZoomLocked) {
158
- // update the other viewport with the new zoom from the split viewport that was updated with this payload's `mapIndex`
159
- splitMapViewports[otherViewportMapIndex] = _objectSpread(_objectSpread({}, splitMapViewports[otherViewportMapIndex]), {}, {
160
- zoom: splitMapViewports[mapIndex].zoom
161
- });
162
- }
163
- }
164
-
165
- return _objectSpread(_objectSpread(_objectSpread({}, state), splitMapViewports[mapIndex]), {}, {
166
- // update the mapState with the new array of split viewports
167
- splitMapViewports: splitMapViewports
168
- });
169
- };
170
- /**
171
- * Fit map viewport to bounds
172
- * @memberof mapStateUpdaters
173
- * @public
174
- */
175
-
176
-
177
- exports.updateMapUpdater = updateMapUpdater;
178
-
179
- var fitBoundsUpdater = function fitBoundsUpdater(state, action) {
180
- var centerAndZoom = (0, _utils.getCenterAndZoomFromBounds)(action.payload, {
181
- width: state.width,
182
- height: state.height
183
- });
184
-
185
- if (!centerAndZoom) {
186
- // bounds is invalid
187
- return state;
188
- }
189
-
190
- var newState = _objectSpread(_objectSpread({}, state), {}, {
191
- latitude: centerAndZoom.center[1],
192
- longitude: centerAndZoom.center[0]
193
- }, Number.isFinite(centerAndZoom.zoom) ? {
194
- zoom: centerAndZoom.zoom
195
- } : {}); // if fitting to bounds while split and unsynced
196
- // copy the new latitude, longitude, and zoom values to each split viewport
197
-
198
-
199
- if (newState.splitMapViewports.length) {
200
- newState.splitMapViewports = newState.splitMapViewports.map(function (currentViewport) {
201
- return _objectSpread(_objectSpread({}, currentViewport), {}, {
202
- latitude: newState.latitude,
203
- longitude: newState.longitude,
204
- zoom: newState.zoom
205
- });
206
- });
207
- }
208
-
209
- return newState;
210
- };
211
- /**
212
- * Toggle between 3d and 2d map.
213
- * @memberof mapStateUpdaters
214
- * @public
215
- */
216
-
217
-
218
- exports.fitBoundsUpdater = fitBoundsUpdater;
219
-
220
- var togglePerspectiveUpdater = function togglePerspectiveUpdater(state, action) {
221
- var newState = _objectSpread(_objectSpread(_objectSpread({}, state), {
222
- pitch: state.dragRotate ? 0 : 50,
223
- bearing: state.dragRotate ? 0 : 24
224
- }), {}, {
225
- dragRotate: !state.dragRotate
226
- }); // if toggling 3d and 2d while split and unsynced
227
- // copy the new pitch, bearing, and dragRotate values to each split viewport
228
-
229
-
230
- if (newState.splitMapViewports.length) {
231
- newState.splitMapViewports = newState.splitMapViewports.map(function (currentViewport) {
232
- return _objectSpread(_objectSpread({}, currentViewport), {}, {
233
- pitch: newState.pitch,
234
- bearing: newState.bearing,
235
- dragRotate: newState.dragRotate
236
- });
237
- });
238
- }
239
-
240
- return newState;
241
- };
242
- /**
243
- * reset mapState to initial State
244
- * @memberof mapStateUpdaters
245
- * @public
246
- */
247
-
248
-
249
- exports.togglePerspectiveUpdater = togglePerspectiveUpdater;
250
-
251
- var resetMapConfigUpdater = function resetMapConfigUpdater(state) {
252
- return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_MAP_STATE), state.initialState), {}, {
253
- initialState: state.initialState
254
- });
255
- }; // consider case where you have a split map and user wants to reset
256
-
257
- /**
258
- * Update `mapState` to propagate a new config
259
- * @memberof mapStateUpdaters
260
- * @public
261
- */
262
-
263
-
264
- exports.resetMapConfigUpdater = resetMapConfigUpdater;
265
-
266
- var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref) {
267
- var _ref$payload = _ref.payload,
268
- _ref$payload$config = _ref$payload.config,
269
- config = _ref$payload$config === void 0 ? {} : _ref$payload$config,
270
- _ref$payload$options = _ref$payload.options,
271
- options = _ref$payload$options === void 0 ? {} : _ref$payload$options,
272
- _ref$payload$bounds = _ref$payload.bounds,
273
- bounds = _ref$payload$bounds === void 0 ? null : _ref$payload$bounds;
274
-
275
- /**
276
- * @type {Partial<MapState>}
277
- */
278
- var mapState = (config || {}).mapState || {}; // merged received mapState with previous state
279
- // state also may include properties that are new to an existing, saved project's mapState
280
-
281
- var mergedState = (0, _deepmerge["default"])(state, mapState, {
282
- // note: deepmerge by default will merge arrays by concatenating them
283
- // but we need to overwrite destination arrays with source arrays, if present
284
- // https://github.com/TehShrike/deepmerge#arraymerge-example-overwrite-target-array
285
- arrayMerge: function arrayMerge(_destinationArray, sourceArray) {
286
- return sourceArray;
287
- }
288
- }); // if center map
289
- // center map will override mapState config
290
-
291
- if (options.centerMap && bounds) {
292
- mergedState = fitBoundsUpdater(mergedState, {
293
- payload: bounds
294
- });
295
- }
296
-
297
- return _objectSpread(_objectSpread({}, mergedState), getMapDimForSplitMap(mergedState.isSplit, state));
298
- };
299
- /**
300
- * Toggle between one or split maps
301
- * @memberof mapStateUpdaters
302
- * @public
303
- */
304
-
305
-
306
- exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
307
-
308
- var toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
309
- return _objectSpread(_objectSpread(_objectSpread({}, state), getMapDimForSplitMap(!state.isSplit, state)), {}, {
310
- isSplit: !state.isSplit
311
- }, !state.isSplit === false ? {
312
- // if toggling to no longer split (single mode) then reset a few properties
313
- isViewportSynced: true,
314
- isZoomLocked: false,
315
- splitMapViewports: []
316
- } : {});
317
- };
318
- /**
319
- * Toggle between locked and unlocked split viewports
320
- * @memberof mapStateUpdaters
321
- * @public
322
- */
323
-
324
-
325
- exports.toggleSplitMapUpdater = toggleSplitMapUpdater;
326
-
327
- var toggleSplitMapViewportUpdater = function toggleSplitMapViewportUpdater(state, action) {
328
- // new map state immediately gets the new, optional payload values for isViewportSynced and/or isZoomLocked
329
- var newMapState = _objectSpread(_objectSpread({}, state), action.payload || {});
330
-
331
- if (newMapState.isViewportSynced) {
332
- // switching from unsynced to synced viewports
333
- newMapState.splitMapViewports = [];
334
- } else {
335
- // switching from synced to unsynced viewports
336
- // or already in unsynced mode and toggling locked zoom
337
- if (state.isZoomLocked && !newMapState.isZoomLocked) {
338
- // switching off locked zoom while unsynced
339
- // don't copy the mapStates to left and right viewports because there will be zoom "jumping"
340
- return newMapState;
341
- }
342
-
343
- if (!state.isZoomLocked && newMapState.isZoomLocked) {
344
- // switching on locked zoom while unsynced
345
- // only copy zoom viewport property from the most recently interacted-with viewport to the other
346
- // TODO: do we want to check for a match a different way, such as a combo of `latitude` and `longitude`?
347
- var lastUpdatedViewportIndex = newMapState.splitMapViewports.findIndex(function (v) {
348
- return newMapState.zoom === v.zoom;
349
- });
350
- var splitMapViewports = newMapState.splitMapViewports.map(function (currentViewport, i) {
351
- if (i === lastUpdatedViewportIndex) {
352
- // no zoom to modify here
353
- return currentViewport;
354
- } // the other viewport gets the most recently interacted-with viewport's zoom
355
- // WHY? the viewport the user was last interacting with will set zoom across the board for smooth UX
356
-
357
-
358
- return _objectSpread(_objectSpread({}, currentViewport), {}, {
359
- zoom: newMapState.splitMapViewports[lastUpdatedViewportIndex].zoom
360
- });
361
- });
362
- newMapState.splitMapViewports = splitMapViewports;
363
- return newMapState;
364
- } // if current viewport is synced, and we are unsyncing it
365
- // or already in unsynced mode and NOT toggling locked zoom
366
- // make a fresh copy of the current viewport object, assign it to splitMapViewports[]
367
- // pickViewportPropsFromMapState is called twice to avoid memory allocation conflicts
368
-
369
-
370
- var leftViewport = pickViewportPropsFromMapState(newMapState);
371
- var rightViewport = pickViewportPropsFromMapState(newMapState);
372
- newMapState.splitMapViewports = [leftViewport, rightViewport];
373
- } // return new state
374
-
375
-
376
- return newMapState;
377
- }; // Helpers
378
-
379
-
380
- exports.toggleSplitMapViewportUpdater = toggleSplitMapViewportUpdater;
381
-
382
- function getMapDimForSplitMap(isSplit, state) {
383
- // cases:
384
- // 1. state split: true - isSplit: true
385
- // do nothing
386
- // 2. state split: false - isSplit: false
387
- // do nothing
388
- if (state.isSplit === isSplit) {
389
- return {};
390
- }
391
-
392
- var width = state.isSplit && !isSplit ? // 3. state split: true - isSplit: false
393
- // double width
394
- state.width * 2 : // 4. state split: false - isSplit: true
395
- // split width
396
- state.width / 2;
397
- return {
398
- width: width
399
- };
400
- }
401
-
402
- function updateViewportBasedOnBounds(state, newMapState) {
403
- // Get the new viewport bounds
404
- var viewportBounds = _geoViewport["default"].bounds([newMapState.longitude, newMapState.latitude], newMapState.zoom, [newMapState.width, newMapState.height], _utils.MAPBOX_TILE_SIZE); // Generate turf Polygon from bounds for comparison
405
-
406
-
407
- var viewportBoundsPolygon = (0, _bboxPolygon["default"])(viewportBounds); // @ts-ignore
408
-
409
- var newStateMaxBounds = newMapState.maxBounds; // @ts-ignore
410
-
411
- var maxBoundsPolygon = (0, _bboxPolygon["default"])(newStateMaxBounds); // If maxBounds has changed reset the viewport to snap to bounds
412
-
413
- var hasMaxBoundsChanged = !state.maxBounds || !state.maxBounds.every(function (val, idx) {
414
- return val === newStateMaxBounds[idx];
415
- });
416
-
417
- if (hasMaxBoundsChanged) {
418
- // Check if the newMapState viewport is within maxBounds
419
- if (!(0, _booleanWithin["default"])(viewportBoundsPolygon, maxBoundsPolygon)) {
420
- var _fitBounds = (0, _webMercator.fitBounds)({
421
- width: newMapState.width,
422
- height: newMapState.width,
423
- bounds: [[newStateMaxBounds[0], newStateMaxBounds[1]], [newStateMaxBounds[2], newStateMaxBounds[3]]]
424
- }),
425
- latitude = _fitBounds.latitude,
426
- longitude = _fitBounds.longitude,
427
- zoom = _fitBounds.zoom;
428
-
429
- newMapState = _objectSpread(_objectSpread({}, newMapState), {}, {
430
- latitude: latitude,
431
- longitude: longitude
432
- }, Number.isFinite(zoom) ? {
433
- zoom: zoom
434
- } : {});
435
- }
436
-
437
- return newMapState;
438
- } // Check if the newMapState viewport is within maxBounds
439
-
440
-
441
- if (!(0, _booleanWithin["default"])(viewportBoundsPolygon, maxBoundsPolygon)) {
442
- newMapState = _objectSpread(_objectSpread({}, newMapState), {}, {
443
- longitude: state.longitude,
444
- latitude: state.latitude,
445
- zoom: state.zoom
446
- });
447
- }
448
-
449
- return newMapState;
450
- }
451
-
452
- function pickViewportPropsFromMapState(state) {
453
- return (0, _lodash["default"])(state, ['width', 'height', 'zoom', 'pitch', 'bearing', 'latitude', 'longitude', 'dragRotate', 'minZoom', 'maxZoom', 'maxBounds']);
454
- }
455
- /** Select items from object whose value is not undefined */
456
-
457
-
458
- var definedProps = function definedProps(obj) {
459
- return Object.entries(obj).reduce(function (accu, _ref2) {
460
- var _ref3 = (0, _slicedToArray2["default"])(_ref2, 2),
461
- k = _ref3[0],
462
- v = _ref3[1];
463
-
464
- return _objectSpread(_objectSpread({}, accu), v !== undefined ? (0, _defineProperty2["default"])({}, k, v) : {});
465
- }, {});
466
- };
467
-
468
- function updateViewport(originalViewport, viewportUpdates) {
469
- var newViewport = _objectSpread(_objectSpread({}, originalViewport), definedProps(viewportUpdates) || {}); // Make sure zoom level doesn't go bellow minZoom if defined
470
-
471
-
472
- if (newViewport.minZoom && newViewport.zoom && newViewport.zoom < newViewport.minZoom) {
473
- newViewport.zoom = newViewport.minZoom;
474
- } // Make sure zoom level doesn't go above maxZoom if defined
475
-
476
-
477
- if (newViewport.maxZoom && newViewport.zoom && newViewport.zoom > newViewport.maxZoom) {
478
- newViewport.zoom = newViewport.maxZoom;
479
- } // Limit viewport update based on maxBounds
480
-
481
-
482
- if (newViewport.maxBounds && (0, _utils.validateBounds)(newViewport.maxBounds)) {
483
- // @ts-expect-error Type 'Viewport' is missing the following properties from type 'MapState': isSplit, isViewportSynced, isZoomLocked, splitMapViewports
484
- newViewport = updateViewportBasedOnBounds(originalViewport, newViewport);
485
- }
486
-
487
- return newViewport;
488
- }
489
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3RhdGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsibWFwU3RhdGVVcGRhdGVycyIsIklOSVRJQUxfTUFQX1NUQVRFIiwicGl0Y2giLCJiZWFyaW5nIiwibGF0aXR1ZGUiLCJsb25naXR1ZGUiLCJ6b29tIiwiZHJhZ1JvdGF0ZSIsIndpZHRoIiwiaGVpZ2h0IiwibWluWm9vbSIsInVuZGVmaW5lZCIsIm1heFpvb20iLCJtYXhCb3VuZHMiLCJpc1NwbGl0IiwiaXNWaWV3cG9ydFN5bmNlZCIsImlzWm9vbUxvY2tlZCIsInNwbGl0TWFwVmlld3BvcnRzIiwidXBkYXRlTWFwVXBkYXRlciIsInN0YXRlIiwiYWN0aW9uIiwicGF5bG9hZCIsInZpZXdwb3J0IiwibWFwSW5kZXgiLCJ1cGRhdGVWaWV3cG9ydCIsIm90aGVyVmlld3BvcnRNYXBJbmRleCIsIm1hcCIsImN1cnJlbnRWaWV3cG9ydCIsImkiLCJOdW1iZXIiLCJpc0Zpbml0ZSIsImZpdEJvdW5kc1VwZGF0ZXIiLCJjZW50ZXJBbmRab29tIiwibmV3U3RhdGUiLCJjZW50ZXIiLCJsZW5ndGgiLCJ0b2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXIiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsImNvbmZpZyIsIm9wdGlvbnMiLCJib3VuZHMiLCJtYXBTdGF0ZSIsIm1lcmdlZFN0YXRlIiwiYXJyYXlNZXJnZSIsIl9kZXN0aW5hdGlvbkFycmF5Iiwic291cmNlQXJyYXkiLCJjZW50ZXJNYXAiLCJnZXRNYXBEaW1Gb3JTcGxpdE1hcCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsInRvZ2dsZVNwbGl0TWFwVmlld3BvcnRVcGRhdGVyIiwibmV3TWFwU3RhdGUiLCJsYXN0VXBkYXRlZFZpZXdwb3J0SW5kZXgiLCJmaW5kSW5kZXgiLCJ2IiwibGVmdFZpZXdwb3J0IiwicGlja1ZpZXdwb3J0UHJvcHNGcm9tTWFwU3RhdGUiLCJyaWdodFZpZXdwb3J0IiwidXBkYXRlVmlld3BvcnRCYXNlZE9uQm91bmRzIiwidmlld3BvcnRCb3VuZHMiLCJnZW9WaWV3cG9ydCIsIk1BUEJPWF9USUxFX1NJWkUiLCJ2aWV3cG9ydEJvdW5kc1BvbHlnb24iLCJuZXdTdGF0ZU1heEJvdW5kcyIsIm1heEJvdW5kc1BvbHlnb24iLCJoYXNNYXhCb3VuZHNDaGFuZ2VkIiwiZXZlcnkiLCJ2YWwiLCJpZHgiLCJkZWZpbmVkUHJvcHMiLCJvYmoiLCJPYmplY3QiLCJlbnRyaWVzIiwicmVkdWNlIiwiYWNjdSIsImsiLCJvcmlnaW5hbFZpZXdwb3J0Iiwidmlld3BvcnRVcGRhdGVzIiwibmV3Vmlld3BvcnQiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7OztBQUdBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOzs7Ozs7QUFJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNBO0FBQ0E7QUFDQSxJQUFNQSxnQkFBZ0IsR0FBRyxJQUF6QjtBQUNBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDTyxJQUFNQyxpQkFBMkIsR0FBRztBQUN6Q0MsRUFBQUEsS0FBSyxFQUFFLENBRGtDO0FBRXpDQyxFQUFBQSxPQUFPLEVBQUUsQ0FGZ0M7QUFHekNDLEVBQUFBLFFBQVEsRUFBRSxRQUgrQjtBQUl6Q0MsRUFBQUEsU0FBUyxFQUFFLENBQUMsU0FKNkI7QUFLekNDLEVBQUFBLElBQUksRUFBRSxDQUxtQztBQU16Q0MsRUFBQUEsVUFB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VyxDQUFDckUsT0FBWixJQUF1QnFFLFdBQVcsQ0FBQ3pFLElBQW5DLElBQTJDeUUsV0FBVyxDQUFDekUsSUFBWixHQUFtQnlFLFdBQVcsQ0FBQ3JFLE9BQTlFLEVBQXVGO0FBQ3JGcUUsSUFBQUEsV0FBVyxDQUFDekUsSUFBWixHQUFtQnlFLFdBQVcsQ0FBQ3JFLE9BQS9CO0FBQ0QsR0FUc0YsQ0FVdkY7OztBQUNBLE1BQUlxRSxXQUFXLENBQUNuRSxPQUFaLElBQXVCbUUsV0FBVyxDQUFDekUsSUFBbkMsSUFBMkN5RSxXQUFXLENBQUN6RSxJQUFaLEdBQW1CeUUsV0FBVyxDQUFDbkUsT0FBOUUsRUFBdUY7QUFDckZtRSxJQUFBQSxXQUFXLENBQUN6RSxJQUFaLEdBQW1CeUUsV0FBVyxDQUFDbkUsT0FBL0I7QUFDRCxHQWJzRixDQWN2Rjs7O0FBQ0EsTUFBSW1FLFdBQVcsQ0FBQ2xFLFNBQVosSUFBeUIsMkJBQWVrRSxXQUFXLENBQUNsRSxTQUEzQixDQUE3QixFQUFvRTtBQUNsRTtBQUNBa0UsSUFBQUEsV0FBVyxHQUFHcEIsMkJBQTJCLENBQUNrQixnQkFBRCxFQUFtQkUsV0FBbkIsQ0FBekM7QUFDRDs7QUFFRCxTQUFPQSxXQUFQO0FBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQgZ2VvVmlld3BvcnQgZnJvbSAnQG1hcGJveC9nZW8tdmlld3BvcnQnO1xuaW1wb3J0IGJvb2xlYW5XaXRoaW4gZnJvbSAnQHR1cmYvYm9vbGVhbi13aXRoaW4nO1xuaW1wb3J0IGJib3hQb2x5Z29uIGZyb20gJ0B0dXJmL2Jib3gtcG9seWdvbic7XG5pbXBvcnQge2ZpdEJvdW5kc30gZnJvbSAnQG1hdGguZ2wvd2ViLW1lcmNhdG9yJztcbmltcG9ydCBkZWVwbWVyZ2UgZnJvbSAnZGVlcG1lcmdlJztcbmltcG9ydCBwaWNrIGZyb20gJ2xvZGFzaC5waWNrJztcblxuaW1wb3J0IHtnZXRDZW50ZXJBbmRab29tRnJvbUJvdW5kcywgdmFsaWRhdGVCb3VuZHMsIE1BUEJPWF9USUxFX1NJWkV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtNYXBTdGF0ZUFjdGlvbnMsIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLCBBY3Rpb25UeXBlc30gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7TWFwU3RhdGUsIEJvdW5kcywgVmlld3BvcnR9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgbWFwU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqXG4gKiBpbXBvcnQga2VwbGVyR2xSZWR1Y2VyLCB7bWFwU3RhdGVVcGRhdGVyc30gZnJvbSAna2VwbGVyLmdsL3JlZHVjZXJzJztcbiAqIC8vIFJvb3QgUmVkdWNlclxuICogY29uc3QgcmVkdWNlcnMgPSBjb21iaW5lUmVkdWNlcnMoe1xuICogIGtlcGxlckdsOiBrZXBsZXJHbFJlZHVjZXIsXG4gKiAgYXBwOiBhcHBSZWR1Y2VyXG4gKiB9KTtcbiAqXG4gKiBjb25zdCBjb21wb3NlZFJlZHVjZXIgPSAoc3RhdGUsIGFjdGlvbikgPT4ge1xuICogIHN3aXRjaCAoYWN0aW9uLnR5cGUpIHtcbiAqICAgIC8vIGNsaWNrIGJ1dHRvbiB0byBjbG9zZSBzaWRlIHBhbmVsXG4gKiAgICBjYXNlICdDTElDS19CVVRUT04nOlxuICogICAgICByZXR1cm4ge1xuICogICAgICAgIC4uLnN0YXRlLFxuICogICAgICAgIGtlcGxlckdsOiB7XG4gKiAgICAgICAgICAuLi5zdGF0ZS5rZXBsZXJHbCxcbiAqICAgICAgICAgIGZvbzoge1xuICogICAgICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wuZm9vLFxuICogICAgICAgICAgICAgbWFwU3RhdGU6IG1hcFN0YXRlVXBkYXRlcnMuZml0Qm91bmRzVXBkYXRlcihcbiAqICAgICAgICAgICAgICAgbWFwU3RhdGUsIHtwYXlsb2FkOiBbMTI3LjM0LCAzMS4wOSwgMTI3LjU2LCAzMS41OV1dfVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBtYXBTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYG1hcFN0YXRlYFxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHByb3BlcnR5IHBpdGNoIERlZmF1bHQ6IGAwYFxuICogQHByb3BlcnR5IGJlYXJpbmcgRGVmYXVsdDogYDBgXG4gKiBAcHJvcGVydHkgbGF0aXR1ZGUgRGVmYXVsdDogYDM3Ljc1MDQzYFxuICogQHByb3BlcnR5IGxvbmdpdHVkZSBEZWZhdWx0OiBgLTEyMi4zNDY3OWBcbiAqIEBwcm9wZXJ0eSB6b29tIERlZmF1bHQ6IGA5YFxuICogQHByb3BlcnR5IGRyYWdSb3RhdGUgRGVmYXVsdDogYGZhbHNlYFxuICogQHByb3BlcnR5IHdpZHRoIERlZmF1bHQ6IGA4MDBgXG4gKiBAcHJvcGVydHkgaGVpZ2h0IERlZmF1bHQ6IGA4MDBgXG4gKiBAcHJvcGVydHkgbWluWm9vbTogYHVuZGVmaW5lZGAsXG4gKiBAcHJvcGVydHkgbWF4Wm9vbTogYHVuZGVmaW5lZGAsXG4gKiBAcHJvcGVydHkgbWF4Qm91bmRzOiBgdW5kZWZpbmVkYCxcbiAqIEBwcm9wZXJ0eSBpc1NwbGl0OiBgZmFsc2VgLFxuICogQHByb3BlcnR5IGlzVmlld3BvcnRTeW5jZWQ6IGB0cnVlYCxcbiAqIEBwcm9wZXJ0eSBpc1pvb21Mb2NrZWQ6IGBmYWxzZWAsXG4gKiBAcHJvcGVydHkgc3BsaXRNYXBWaWV3cG9ydHM6IGBbXWBcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IElOSVRJQUxfTUFQX1NUQVRFOiBNYXBTdGF0ZSA9IHtcbiAgcGl0Y2g6IDAsXG4gIGJlYXJpbmc6IDAsXG4gIGxhdGl0dWRlOiAzNy43NTA0MyxcbiAgbG9uZ2l0dWRlOiAtMTIyLjM0Njc5LFxuICB6b29tOiA5LFxuICBkcmFnUm90YXRlOiBmYWxzZSxcbiAgd2lkdGg6IDgwMCxcbiAgaGVpZ2h0OiA4MDAsXG4gIG1pblpvb206IHVuZGVmaW5lZCxcbiAgbWF4Wm9vbTogdW5kZWZpbmVkLFxuICBtYXhCb3VuZHM6IHVuZGVmaW5lZCxcbiAgaXNTcGxpdDogZmFsc2UsXG4gIGlzVmlld3BvcnRTeW5jZWQ6IHRydWUsXG4gIGlzWm9vbUxvY2tlZDogZmFsc2UsXG4gIHNwbGl0TWFwVmlld3BvcnRzOiBbXVxufTtcblxuLyogVXBkYXRlcnMgKi9cbi8qKlxuICogVXBkYXRlIG1hcCB2aWV3cG9ydFxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZU1hcFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdGF0ZSxcbiAgYWN0aW9uOiBNYXBTdGF0ZUFjdGlvbnMuVXBkYXRlTWFwVXBkYXRlckFjdGlvblxuKTogTWFwU3RhdGUgPT4ge1xuICBjb25zdCB7dmlld3BvcnQsIG1hcEluZGV4ID0gMH0gPSBhY3Rpb24ucGF5bG9hZDtcblxuICBpZiAoc3RhdGUuaXNWaWV3cG9ydFN5bmNlZCkge1xuICAgIC8vIFRoZSBgdXBkYXRlVmlld3BvcnRgIGZ1bmN0aW9uIGlzIHR5cGVkIGFzIChWaWV3cG9ydCwgVmlld3BvcnQpIC0+IFZpZXdwb3J0IGJ1dCBoZXJlIHRoZVxuICAgIC8vIGV4cGVjdGVkIHR5cGluZyBpcyAoTWFwU3RhdGUsIFZpZXdwb3J0KSAtPiBNYXBTdGF0ZS5cbiAgICAvLyB0aGlzIGNvdWxkIGJlIGEgcG90ZW50aWFsIGJ1ZyBhcyB3ZSB0cmVhdCBWaWV3cG9ydCBhbmQgTWFwU3RhdGUgYXMgZXF1YWwgc2VlbWluZ2x5XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUeXBlICdWaWV3cG9ydCcgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlICdNYXBTdGF0ZSc6IGlzU3BsaXQsIGlzVmlld3BvcnRTeW5jZWQsIGlzWm9vbUxvY2tlZCwgc3BsaXRNYXBWaWV3cG9ydHNcbiAgICByZXR1cm4gdXBkYXRlVmlld3BvcnQoc3RhdGUsIHZpZXdwb3J0KTtcbiAgfVxuXG4gIGxldCBvdGhlclZpZXdwb3J0TWFwSW5kZXggPSAtMTtcbiAgY29uc3Qgc3BsaXRNYXBWaWV3cG9ydHMgPSBzdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoKGN1cnJlbnRWaWV3cG9ydCwgaSkgPT4ge1xuICAgIGlmIChpID09PSBtYXBJbmRleCkge1xuICAgICAgLy8gdXBkYXRlIHRoZSBtYXRjaGluZyB2aWV3cG9ydCB3aXRoIHRoZSBuZXdWaWV3cG9ydCBpbmZvIGluIHRoZSBhY3Rpb24gcGF5bG9hZFxuICAgICAgcmV0dXJuIHVwZGF0ZVZpZXdwb3J0KGN1cnJlbnRWaWV3cG9ydCwgdmlld3BvcnQpO1xuICAgIH1cblxuICAgIG90aGVyVmlld3BvcnRNYXBJbmRleCA9IGk7XG4gICAgLy8gbWFrZSBubyBjaGFuZ2VzIHRvIHRoZSBvdGhlciB2aWV3cG9ydCAoeWV0KVxuICAgIHJldHVybiBjdXJyZW50Vmlld3BvcnQ7XG4gIH0pO1xuXG4gIC8vIG1ha2UgY29uZGl0aW9uYWwgdXBkYXRlcyB0byB0aGUgb3RoZXIgdmlld3BvcnQgbm90IG1hdGNoaW5nIHRoaXMgcGF5bG9hZCdzIGBtYXBJbmRleGBcbiAgaWYgKE51bWJlci5pc0Zpbml0ZShvdGhlclZpZXdwb3J0TWFwSW5kZXgpICYmIG90aGVyVmlld3BvcnRNYXBJbmRleCA+IC0xKSB7XG4gICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYSBzcGVjaWFsIGNhc2UgYW5kIGFyZSBhbHdheXMgdXBkYXRlZFxuICAgIHNwbGl0TWFwVmlld3BvcnRzW290aGVyVmlld3BvcnRNYXBJbmRleF0gPSB7XG4gICAgICAuLi5zcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdLFxuICAgICAgd2lkdGg6IHNwbGl0TWFwVmlld3BvcnRzW21hcEluZGV4XS53aWR0aCxcbiAgICAgIGhlaWdodDogc3BsaXRNYXBWaWV3cG9ydHNbbWFwSW5kZXhdLmhlaWdodFxuICAgIH07XG5cbiAgICBpZiAoc3RhdGUuaXNab29tTG9ja2VkKSB7XG4gICAgICAvLyB1cGRhdGUgdGhlIG90aGVyIHZpZXdwb3J0IHdpdGggdGhlIG5ldyB6b29tIGZyb20gdGhlIHNwbGl0IHZpZXdwb3J0IHRoYXQgd2FzIHVwZGF0ZWQgd2l0aCB0aGlzIHBheWxvYWQncyBgbWFwSW5kZXhgXG4gICAgICBzcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdID0ge1xuICAgICAgICAuLi5zcGxpdE1hcFZpZXdwb3J0c1tvdGhlclZpZXdwb3J0TWFwSW5kZXhdLFxuICAgICAgICB6b29tOiBzcGxpdE1hcFZpZXdwb3J0c1ttYXBJbmRleF0uem9vbVxuICAgICAgfTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIC8vIHVwZGF0ZSB0aGUgdG9wLWxldmVsIG1hcFN0YXRlIHZpZXdwb3J0IHdpdGggdGhlIG1vc3QgcmVjZW50bHkgaW50ZXJhY3RlZC13aXRoIHNwbGl0IHZpZXdwb3J0XG4gICAgLy8gV0hZPyB0aGlzIGF2b2lkcyB6b29tIGFuZCBib3VuZHMgXCJqdW1waW5nXCIgZHVlIHRvIGEgXCJzdGFsZVwiIHRvcC1sZXZlbCBtYXBTdGF0ZSB2aWV3cG9ydCB3aGVuOlxuICAgIC8vICAxLiB0b2dnbGluZyBvZmYgdGhlIHVuc3luY2VkIHZpZXdwb3J0cyBtb2RlIHRvIHN3aXRjaCB0byB0aGUgc3luY2VkIHZpZXdwb3J0cyBtb2RlXG4gICAgLy8gIDIuIHRvZ2dsaW5nIG9uIHRoZSB6b29tIGxvY2sgZHVyaW5nIGFuIHVuc3luY2VkIHZpZXdwb3J0cyBtb2RlXG4gICAgLi4uc3RhdGUsXG4gICAgLi4uc3BsaXRNYXBWaWV3cG9ydHNbbWFwSW5kZXhdLFxuICAgIC8vIHVwZGF0ZSB0aGUgbWFwU3RhdGUgd2l0aCB0aGUgbmV3IGFycmF5IG9mIHNwbGl0IHZpZXdwb3J0c1xuICAgIHNwbGl0TWFwVmlld3BvcnRzXG4gIH07XG59O1xuXG4vKipcbiAqIEZpdCBtYXAgdmlld3BvcnQgdG8gYm91bmRzXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZml0Qm91bmRzVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5GaXRCb3VuZHNVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdGF0ZSA9PiB7XG4gIGNvbnN0IGNlbnRlckFuZFpvb20gPSBnZXRDZW50ZXJBbmRab29tRnJvbUJvdW5kcyhhY3Rpb24ucGF5bG9hZCwge1xuICAgIHdpZHRoOiBzdGF0ZS53aWR0aCxcbiAgICBoZWlnaHQ6IHN0YXRlLmhlaWdodFxuICB9KTtcbiAgaWYgKCFjZW50ZXJBbmRab29tKSB7XG4gICAgLy8gYm91bmRzIGlzIGludmFsaWRcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXRpdHVkZTogY2VudGVyQW5kWm9vbS5jZW50ZXJbMV0sXG4gICAgbG9uZ2l0dWRlOiBjZW50ZXJBbmRab29tLmNlbnRlclswXSxcbiAgICAvLyBGb3IgbWFyZ2luYWwgb3IgaW52YWxpZCBib3VuZHMsIHpvb20gbWF5IGJlIE5hTi4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSBpbiBvcmRlclxuICAgIC8vIHRvIGF2b2lkIGNvcnJ1cHQgc3RhdGUgYW5kIHBvdGVudGlhbCBjcmFzaGVzIGFzIHpvb20gaXMgZXhwZWN0ZWQgdG8gYmUgYSBudW1iZXJcbiAgICAuLi4oTnVtYmVyLmlzRmluaXRlKGNlbnRlckFuZFpvb20uem9vbSkgPyB7em9vbTogY2VudGVyQW5kWm9vbS56b29tfSA6IHt9KVxuICB9O1xuXG4gIC8vIGlmIGZpdHRpbmcgdG8gYm91bmRzIHdoaWxlIHNwbGl0IGFuZCB1bnN5bmNlZFxuICAvLyBjb3B5IHRoZSBuZXcgbGF0aXR1ZGUsIGxvbmdpdHVkZSwgYW5kIHpvb20gdmFsdWVzIHRvIGVhY2ggc3BsaXQgdmlld3BvcnRcbiAgaWYgKG5ld1N0YXRlLnNwbGl0TWFwVmlld3BvcnRzLmxlbmd0aCkge1xuICAgIG5ld1N0YXRlLnNwbGl0TWFwVmlld3BvcnRzID0gbmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMubWFwKGN1cnJlbnRWaWV3cG9ydCA9PiAoe1xuICAgICAgLi4uY3VycmVudFZpZXdwb3J0LFxuICAgICAgbGF0aXR1ZGU6IG5ld1N0YXRlLmxhdGl0dWRlLFxuICAgICAgbG9uZ2l0dWRlOiBuZXdTdGF0ZS5sb25naXR1ZGUsXG4gICAgICB6b29tOiBuZXdTdGF0ZS56b29tXG4gICAgfSkpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBUb2dnbGUgYmV0d2VlbiAzZCBhbmQgMmQgbWFwLlxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVBlcnNwZWN0aXZlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVQZXJzcGVjdGl2ZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0YXRlID0+IHtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgLi4ue1xuICAgICAgcGl0Y2g6IHN0YXRlLmRyYWdSb3RhdGUgPyAwIDogNTAsXG4gICAgICBiZWFyaW5nOiBzdGF0ZS5kcmFnUm90YXRlID8gMCA6IDI0XG4gICAgfSxcbiAgICBkcmFnUm90YXRlOiAhc3RhdGUuZHJhZ1JvdGF0ZVxuICB9O1xuXG4gIC8vIGlmIHRvZ2dsaW5nIDNkIGFuZCAyZCB3aGlsZSBzcGxpdCBhbmQgdW5zeW5jZWRcbiAgLy8gY29weSB0aGUgbmV3IHBpdGNoLCBiZWFyaW5nLCBhbmQgZHJhZ1JvdGF0ZSB2YWx1ZXMgdG8gZWFjaCBzcGxpdCB2aWV3cG9ydFxuICBpZiAobmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMgPSBuZXdTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoY3VycmVudFZpZXdwb3J0ID0+ICh7XG4gICAgICAuLi5jdXJyZW50Vmlld3BvcnQsXG4gICAgICBwaXRjaDogbmV3U3RhdGUucGl0Y2gsXG4gICAgICBiZWFyaW5nOiBuZXdTdGF0ZS5iZWFyaW5nLFxuICAgICAgZHJhZ1JvdGF0ZTogbmV3U3RhdGUuZHJhZ1JvdGF0ZVxuICAgIH0pKTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn07XG5cbi8qKlxuICogcmVzZXQgbWFwU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogTWFwU3RhdGUpOiBNYXBTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX01BUF9TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8vIGNvbnNpZGVyIGNhc2Ugd2hlcmUgeW91IGhhdmUgYSBzcGxpdCBtYXAgYW5kIHVzZXIgd2FudHMgdG8gcmVzZXRcbi8qKlxuICogVXBkYXRlIGBtYXBTdGF0ZWAgdG8gcHJvcGFnYXRlIGEgbmV3IGNvbmZpZ1xuICogQG1lbWJlcm9mIG1hcFN0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIHtcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgcGF5bG9hZDoge2NvbmZpZyA9IHt9LCBvcHRpb25zID0ge30sIGJvdW5kcyA9IG51bGx9XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogTWFwU3RhdGUgPT4ge1xuICAvKipcbiAgICogQHR5cGUge1BhcnRpYWw8TWFwU3RhdGU+fVxuICAgKi9cbiAgY29uc3QgbWFwU3RhdGUgPSAoY29uZmlnIHx8IHt9KS5tYXBTdGF0ZSB8fCB7fTtcbiAgLy8gbWVyZ2VkIHJlY2VpdmVkIG1hcFN0YXRlIHdpdGggcHJldmlvdXMgc3RhdGVcbiAgLy8gc3RhdGUgYWxzbyBtYXkgaW5jbHVkZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIG5ldyB0byBhbiBleGlzdGluZywgc2F2ZWQgcHJvamVjdCdzIG1hcFN0YXRlXG5cbiAgbGV0IG1lcmdlZFN0YXRlID0gZGVlcG1lcmdlPE1hcFN0YXRlPihzdGF0ZSwgbWFwU3RhdGUsIHtcbiAgICAvLyBub3RlOiBkZWVwbWVyZ2UgYnkgZGVmYXVsdCB3aWxsIG1lcmdlIGFycmF5cyBieSBjb25jYXRlbmF0aW5nIHRoZW1cbiAgICAvLyBidXQgd2UgbmVlZCB0byBvdmVyd3JpdGUgZGVzdGluYXRpb24gYXJyYXlzIHdpdGggc291cmNlIGFycmF5cywgaWYgcHJlc2VudFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9UZWhTaHJpa2UvZGVlcG1lcmdlI2FycmF5bWVyZ2UtZXhhbXBsZS1vdmVyd3JpdGUtdGFyZ2V0LWFycmF5XG4gICAgYXJyYXlNZXJnZTogKF9kZXN0aW5hdGlvbkFycmF5LCBzb3VyY2VBcnJheSkgPT4gc291cmNlQXJyYXlcbiAgfSk7XG5cbiAgLy8gaWYgY2VudGVyIG1hcFxuICAvLyBjZW50ZXIgbWFwIHdpbGwgb3ZlcnJpZGUgbWFwU3RhdGUgY29uZmlnXG4gIGlmIChvcHRpb25zLmNlbnRlck1hcCAmJiBib3VuZHMpIHtcbiAgICBtZXJnZWRTdGF0ZSA9IGZpdEJvdW5kc1VwZGF0ZXIobWVyZ2VkU3RhdGUsIHtcbiAgICAgIHBheWxvYWQ6IGJvdW5kc1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5tZXJnZWRTdGF0ZSxcbiAgICAvLyB1cGRhdGUgd2lkdGggaWYgYGlzU3BsaXRgIGhhcyBjaGFuZ2VkXG4gICAgLi4uZ2V0TWFwRGltRm9yU3BsaXRNYXAobWVyZ2VkU3RhdGUuaXNTcGxpdCwgc3RhdGUpXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZSBiZXR3ZWVuIG9uZSBvciBzcGxpdCBtYXBzXG4gKiBAbWVtYmVyb2YgbWFwU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlU3BsaXRNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3RhdGUsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogTWFwU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIC4uLmdldE1hcERpbUZvclNwbGl0TWFwKCFzdGF0ZS5pc1NwbGl0LCBzdGF0ZSksXG4gIGlzU3BsaXQ6ICFzdGF0ZS5pc1NwbGl0LFxuICAuLi4oIXN0YXRlLmlzU3BsaXQgPT09IGZhbHNlXG4gICAgPyB7XG4gICAgICAgIC8vIGlmIHRvZ2dsaW5nIHRvIG5vIGxvbmdlciBzcGxpdCAoc2luZ2xlIG1vZGUpIHRoZW4gcmVzZXQgYSBmZXcgcHJvcGVydGllc1xuICAgICAgICBpc1ZpZXdwb3J0U3luY2VkOiB0cnVlLFxuICAgICAgICBpc1pvb21Mb2NrZWQ6IGZhbHNlLFxuICAgICAgICBzcGxpdE1hcFZpZXdwb3J0czogW11cbiAgICAgIH1cbiAgICA6IHt9KVxufSk7XG5cbi8qKlxuICogVG9nZ2xlIGJldHdlZW4gbG9ja2VkIGFuZCB1bmxvY2tlZCBzcGxpdCB2aWV3cG9ydHNcbiAqIEBtZW1iZXJvZiBtYXBTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVTcGxpdE1hcFZpZXdwb3J0VXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFZpZXdwb3J0VXBkYXRlckFjdGlvblxuKSA9PiB7XG4gIC8vIG5ldyBtYXAgc3RhdGUgaW1tZWRpYXRlbHkgZ2V0cyB0aGUgbmV3LCBvcHRpb25hbCBwYXlsb2FkIHZhbHVlcyBmb3IgaXNWaWV3cG9ydFN5bmNlZCBhbmQvb3IgaXNab29tTG9ja2VkXG4gIGNvbnN0IG5ld01hcFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIC4uLihhY3Rpb24ucGF5bG9hZCB8fCB7fSlcbiAgfTtcblxuICBpZiAobmV3TWFwU3RhdGUuaXNWaWV3cG9ydFN5bmNlZCkge1xuICAgIC8vIHN3aXRjaGluZyBmcm9tIHVuc3luY2VkIHRvIHN5bmNlZCB2aWV3cG9ydHNcbiAgICBuZXdNYXBTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cyA9IFtdO1xuICB9IGVsc2Uge1xuICAgIC8vIHN3aXRjaGluZyBmcm9tIHN5bmNlZCB0byB1bnN5bmNlZCB2aWV3cG9ydHNcbiAgICAvLyBvciBhbHJlYWR5IGluIHVuc3luY2VkIG1vZGUgYW5kIHRvZ2dsaW5nIGxvY2tlZCB6b29tXG5cbiAgICBpZiAoc3RhdGUuaXNab29tTG9ja2VkICYmICFuZXdNYXBTdGF0ZS5pc1pvb21Mb2NrZWQpIHtcbiAgICAgIC8vIHN3aXRjaGluZyBvZmYgbG9ja2VkIHpvb20gd2hpbGUgdW5zeW5jZWRcbiAgICAgIC8vIGRvbid0IGNvcHkgdGhlIG1hcFN0YXRlcyB0byBsZWZ0IGFuZCByaWdodCB2aWV3cG9ydHMgYmVjYXVzZSB0aGVyZSB3aWxsIGJlIHpvb20gXCJqdW1waW5nXCJcbiAgICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgICB9XG5cbiAgICBpZiAoIXN0YXRlLmlzWm9vbUxvY2tlZCAmJiBuZXdNYXBTdGF0ZS5pc1pvb21Mb2NrZWQpIHtcbiAgICAgIC8vIHN3aXRjaGluZyBvbiBsb2NrZWQgem9vbSB3aGlsZSB1bnN5bmNlZFxuICAgICAgLy8gb25seSBjb3B5IHpvb20gdmlld3BvcnQgcHJvcGVydHkgZnJvbSB0aGUgbW9zdCByZWNlbnRseSBpbnRlcmFjdGVkLXdpdGggdmlld3BvcnQgdG8gdGhlIG90aGVyXG4gICAgICAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIGNoZWNrIGZvciBhIG1hdGNoIGEgZGlmZmVyZW50IHdheSwgc3VjaCBhcyBhIGNvbWJvIG9mIGBsYXRpdHVkZWAgYW5kIGBsb25naXR1ZGVgP1xuICAgICAgY29uc3QgbGFzdFVwZGF0ZWRWaWV3cG9ydEluZGV4ID0gbmV3TWFwU3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMuZmluZEluZGV4KFxuICAgICAgICB2ID0+IG5ld01hcFN0YXRlLnpvb20gPT09IHYuem9vbVxuICAgICAgKTtcblxuICAgICAgY29uc3Qgc3BsaXRNYXBWaWV3cG9ydHMgPSBuZXdNYXBTdGF0ZS5zcGxpdE1hcFZpZXdwb3J0cy5tYXAoKGN1cnJlbnRWaWV3cG9ydCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSA9PT0gbGFzdFVwZGF0ZWRWaWV3cG9ydEluZGV4KSB7XG4gICAgICAgICAgLy8gbm8gem9vbSB0byBtb2RpZnkgaGVyZVxuICAgICAgICAgIHJldHVybiBjdXJyZW50Vmlld3BvcnQ7XG4gICAgICAgIH1cbiAgICAgICAgLy8gdGhlIG90aGVyIHZpZXdwb3J0IGdldHMgdGhlIG1vc3QgcmVjZW50bHkgaW50ZXJhY3RlZC13aXRoIHZpZXdwb3J0J3Mgem9vbVxuICAgICAgICAvLyBXSFk/IHRoZSB2aWV3cG9ydCB0aGUgdXNlciB3YXMgbGFzdCBpbnRlcmFjdGluZyB3aXRoIHdpbGwgc2V0IHpvb20gYWNyb3NzIHRoZSBib2FyZCBmb3Igc21vb3RoIFVYXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgLi4uY3VycmVudFZpZXdwb3J0LFxuICAgICAgICAgIHpvb206IG5ld01hcFN0YXRlLnNwbGl0TWFwVmlld3BvcnRzW2xhc3RVcGRhdGVkVmlld3BvcnRJbmRleF0uem9vbVxuICAgICAgICB9O1xuICAgICAgfSk7XG5cbiAgICAgIG5ld01hcFN0YXRlLnNwbGl0TWFwVmlld3BvcnRzID0gc3BsaXRNYXBWaWV3cG9ydHM7XG5cbiAgICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBjdXJyZW50IHZpZXdwb3J0IGlzIHN5bmNlZCwgYW5kIHdlIGFyZSB1bnN5bmNpbmcgaXRcbiAgICAvLyBvciBhbHJlYWR5IGluIHVuc3luY2VkIG1vZGUgYW5kIE5PVCB0b2dnbGluZyBsb2NrZWQgem9vbVxuICAgIC8vIG1ha2UgYSBmcmVzaCBjb3B5IG9mIHRoZSBjdXJyZW50IHZpZXdwb3J0IG9iamVjdCwgYXNzaWduIGl0IHRvIHNwbGl0TWFwVmlld3BvcnRzW11cbiAgICAvLyBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZSBpcyBjYWxsZWQgdHdpY2UgdG8gYXZvaWQgbWVtb3J5IGFsbG9jYXRpb24gY29uZmxpY3RzXG4gICAgY29uc3QgbGVmdFZpZXdwb3J0ID0gcGlja1ZpZXdwb3J0UHJvcHNGcm9tTWFwU3RhdGUobmV3TWFwU3RhdGUpO1xuICAgIGNvbnN0IHJpZ2h0Vmlld3BvcnQgPSBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZShuZXdNYXBTdGF0ZSk7XG4gICAgbmV3TWFwU3RhdGUuc3BsaXRNYXBWaWV3cG9ydHMgPSBbbGVmdFZpZXdwb3J0LCByaWdodFZpZXdwb3J0XTtcbiAgfVxuXG4gIC8vIHJldHVybiBuZXcgc3RhdGVcbiAgcmV0dXJuIG5ld01hcFN0YXRlO1xufTtcblxuLy8gSGVscGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1hcERpbUZvclNwbGl0TWFwKGlzU3BsaXQsIHN0YXRlKSB7XG4gIC8vIGNhc2VzOlxuICAvLyAxLiBzdGF0ZSBzcGxpdDogdHJ1ZSAtIGlzU3BsaXQ6IHRydWVcbiAgLy8gZG8gbm90aGluZ1xuICAvLyAyLiBzdGF0ZSBzcGxpdDogZmFsc2UgLSBpc1NwbGl0OiBmYWxzZVxuICAvLyBkbyBub3RoaW5nXG4gIGlmIChzdGF0ZS5pc1NwbGl0ID09PSBpc1NwbGl0KSB7XG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgY29uc3Qgd2lkdGggPVxuICAgIHN0YXRlLmlzU3BsaXQgJiYgIWlzU3BsaXRcbiAgICAgID8gLy8gMy4gc3RhdGUgc3BsaXQ6IHRydWUgLSBpc1NwbGl0OiBmYWxzZVxuICAgICAgICAvLyBkb3VibGUgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggKiAyXG4gICAgICA6IC8vIDQuIHN0YXRlIHNwbGl0OiBmYWxzZSAtIGlzU3BsaXQ6IHRydWVcbiAgICAgICAgLy8gc3BsaXQgd2lkdGhcbiAgICAgICAgc3RhdGUud2lkdGggLyAyO1xuXG4gIHJldHVybiB7XG4gICAgd2lkdGhcbiAgfTtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVmlld3BvcnRCYXNlZE9uQm91bmRzKHN0YXRlOiBNYXBTdGF0ZSwgbmV3TWFwU3RhdGU6IE1hcFN0YXRlKSB7XG4gIC8vIEdldCB0aGUgbmV3IHZpZXdwb3J0IGJvdW5kc1xuICBjb25zdCB2aWV3cG9ydEJvdW5kcyA9IGdlb1ZpZXdwb3J0LmJvdW5kcyhcbiAgICBbbmV3TWFwU3RhdGUubG9uZ2l0dWRlLCBuZXdNYXBTdGF0ZS5sYXRpdHVkZV0sXG4gICAgbmV3TWFwU3RhdGUuem9vbSxcbiAgICBbbmV3TWFwU3RhdGUud2lkdGgsIG5ld01hcFN0YXRlLmhlaWdodF0sXG4gICAgTUFQQk9YX1RJTEVfU0laRVxuICApO1xuICAvLyBHZW5lcmF0ZSB0dXJmIFBvbHlnb24gZnJvbSBib3VuZHMgZm9yIGNvbXBhcmlzb25cbiAgY29uc3Qgdmlld3BvcnRCb3VuZHNQb2x5Z29uID0gYmJveFBvbHlnb24odmlld3BvcnRCb3VuZHMpO1xuICAvLyBAdHMtaWdub3JlXG4gIGNvbnN0IG5ld1N0YXRlTWF4Qm91bmRzOiBCb3VuZHMgPSBuZXdNYXBTdGF0ZS5tYXhCb3VuZHM7XG4gIC8vIEB0cy1pZ25vcmVcbiAgY29uc3QgbWF4Qm91bmRzUG9seWdvbiA9IGJib3hQb2x5Z29uKG5ld1N0YXRlTWF4Qm91bmRzKTtcblxuICAvLyBJZiBtYXhCb3VuZHMgaGFzIGNoYW5nZWQgcmVzZXQgdGhlIHZpZXdwb3J0IHRvIHNuYXAgdG8gYm91bmRzXG4gIGNvbnN0IGhhc01heEJvdW5kc0NoYW5nZWQgPVxuICAgICFzdGF0ZS5tYXhCb3VuZHMgfHwgIXN0YXRlLm1heEJvdW5kcy5ldmVyeSgodmFsLCBpZHgpID0+IHZhbCA9PT0gbmV3U3RhdGVNYXhCb3VuZHNbaWR4XSk7XG4gIGlmIChoYXNNYXhCb3VuZHNDaGFuZ2VkKSB7XG4gICAgLy8gQ2hlY2sgaWYgdGhlIG5ld01hcFN0YXRlIHZpZXdwb3J0IGlzIHdpdGhpbiBtYXhCb3VuZHNcbiAgICBpZiAoIWJvb2xlYW5XaXRoaW4odmlld3BvcnRCb3VuZHNQb2x5Z29uLCBtYXhCb3VuZHNQb2x5Z29uKSkge1xuICAgICAgY29uc3Qge2xhdGl0dWRlLCBsb25naXR1ZGUsIHpvb219ID0gZml0Qm91bmRzKHtcbiAgICAgICAgd2lkdGg6IG5ld01hcFN0YXRlLndpZHRoLFxuICAgICAgICBoZWlnaHQ6IG5ld01hcFN0YXRlLndpZHRoLFxuICAgICAgICBib3VuZHM6IFtcbiAgICAgICAgICBbbmV3U3RhdGVNYXhCb3VuZHNbMF0sIG5ld1N0YXRlTWF4Qm91bmRzWzFdXSxcbiAgICAgICAgICBbbmV3U3RhdGVNYXhCb3VuZHNbMl0sIG5ld1N0YXRlTWF4Qm91bmRzWzNdXVxuICAgICAgICBdXG4gICAgICB9KTtcblxuICAgICAgbmV3TWFwU3RhdGUgPSB7XG4gICAgICAgIC4uLm5ld01hcFN0YXRlLFxuICAgICAgICBsYXRpdHVkZSxcbiAgICAgICAgbG9uZ2l0dWRlLFxuICAgICAgICAvLyBGb3IgbWFyZ2luYWwgb3IgaW52YWxpZCBib3VuZHMsIHpvb20gbWF5IGJlIE5hTi4gTWFrZSBzdXJlIHRvIHByb3ZpZGUgYSB2YWxpZCB2YWx1ZSBpbiBvcmRlclxuICAgICAgICAvLyB0byBhdm9pZCBjb3JydXB0IHN0YXRlIGFuZCBwb3RlbnRpYWwgY3Jhc2hlcyBhcyB6b29tIGlzIGV4cGVjdGVkIHRvIGJlIGEgbnVtYmVyXG4gICAgICAgIC4uLihOdW1iZXIuaXNGaW5pdGUoem9vbSkgPyB7em9vbX0gOiB7fSlcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBuZXdNYXBTdGF0ZTtcbiAgfVxuXG4gIC8vIENoZWNrIGlmIHRoZSBuZXdNYXBTdGF0ZSB2aWV3cG9ydCBpcyB3aXRoaW4gbWF4Qm91bmRzXG4gIGlmICghYm9vbGVhbldpdGhpbih2aWV3cG9ydEJvdW5kc1BvbHlnb24sIG1heEJvdW5kc1BvbHlnb24pKSB7XG4gICAgbmV3TWFwU3RhdGUgPSB7XG4gICAgICAuLi5uZXdNYXBTdGF0ZSxcbiAgICAgIGxvbmdpdHVkZTogc3RhdGUubG9uZ2l0dWRlLFxuICAgICAgbGF0aXR1ZGU6IHN0YXRlLmxhdGl0dWRlLFxuICAgICAgem9vbTogc3RhdGUuem9vbVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gbmV3TWFwU3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwaWNrVmlld3BvcnRQcm9wc0Zyb21NYXBTdGF0ZShzdGF0ZTogTWFwU3RhdGUpOiBWaWV3cG9ydCB7XG4gIHJldHVybiBwaWNrKHN0YXRlLCBbXG4gICAgJ3dpZHRoJyxcbiAgICAnaGVpZ2h0JyxcbiAgICAnem9vbScsXG4gICAgJ3BpdGNoJyxcbiAgICAnYmVhcmluZycsXG4gICAgJ2xhdGl0dWRlJyxcbiAgICAnbG9uZ2l0dWRlJyxcbiAgICAnZHJhZ1JvdGF0ZScsXG4gICAgJ21pblpvb20nLFxuICAgICdtYXhab29tJyxcbiAgICAnbWF4Qm91bmRzJ1xuICBdKTtcbn1cblxuLyoqIFNlbGVjdCBpdGVtcyBmcm9tIG9iamVjdCB3aG9zZSB2YWx1ZSBpcyBub3QgdW5kZWZpbmVkICovXG5jb25zdCBkZWZpbmVkUHJvcHMgPSBvYmogPT5cbiAgT2JqZWN0LmVudHJpZXMob2JqKS5yZWR1Y2UoXG4gICAgKGFjY3UsIFtrLCB2XSkgPT4gKHsuLi5hY2N1LCAuLi4odiAhPT0gdW5kZWZpbmVkID8ge1trXTogdn0gOiB7fSl9KSxcbiAgICB7fVxuICApO1xuXG5mdW5jdGlvbiB1cGRhdGVWaWV3cG9ydChvcmlnaW5hbFZpZXdwb3J0OiBWaWV3cG9ydCwgdmlld3BvcnRVcGRhdGVzOiBWaWV3cG9ydCk6IFZpZXdwb3J0IHtcbiAgbGV0IG5ld1ZpZXdwb3J0ID0ge1xuICAgIC4uLm9yaWdpbmFsVmlld3BvcnQsXG4gICAgLi4uKGRlZmluZWRQcm9wcyh2aWV3cG9ydFVwZGF0ZXMpIHx8IHt9KVxuICB9O1xuXG4gIC8vIE1ha2Ugc3VyZSB6b29tIGxldmVsIGRvZXNuJ3QgZ28gYmVsbG93IG1pblpvb20gaWYgZGVmaW5lZFxuICBpZiAobmV3Vmlld3BvcnQubWluWm9vbSAmJiBuZXdWaWV3cG9ydC56b29tICYmIG5ld1ZpZXdwb3J0Lnpvb20gPCBuZXdWaWV3cG9ydC5taW5ab29tKSB7XG4gICAgbmV3Vmlld3BvcnQuem9vbSA9IG5ld1ZpZXdwb3J0Lm1pblpvb207XG4gIH1cbiAgLy8gTWFrZSBzdXJlIHpvb20gbGV2ZWwgZG9lc24ndCBnbyBhYm92ZSBtYXhab29tIGlmIGRlZmluZWRcbiAgaWYgKG5ld1ZpZXdwb3J0Lm1heFpvb20gJiYgbmV3Vmlld3BvcnQuem9vbSAmJiBuZXdWaWV3cG9ydC56b29tID4gbmV3Vmlld3BvcnQubWF4Wm9vbSkge1xuICAgIG5ld1ZpZXdwb3J0Lnpvb20gPSBuZXdWaWV3cG9ydC5tYXhab29tO1xuICB9XG4gIC8vIExpbWl0IHZpZXdwb3J0IHVwZGF0ZSBiYXNlZCBvbiBtYXhCb3VuZHNcbiAgaWYgKG5ld1ZpZXdwb3J0Lm1heEJvdW5kcyAmJiB2YWxpZGF0ZUJvdW5kcyhuZXdWaWV3cG9ydC5tYXhCb3VuZHMpKSB7XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvciBUeXBlICdWaWV3cG9ydCcgaXMgbWlzc2luZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXMgZnJvbSB0eXBlICdNYXBTdGF0ZSc6IGlzU3BsaXQsIGlzVmlld3BvcnRTeW5jZWQsIGlzWm9vbUxvY2tlZCwgc3BsaXRNYXBWaWV3cG9ydHNcbiAgICBuZXdWaWV3cG9ydCA9IHVwZGF0ZVZpZXdwb3J0QmFzZWRPbkJvdW5kcyhvcmlnaW5hbFZpZXdwb3J0LCBuZXdWaWV3cG9ydCk7XG4gIH1cblxuICByZXR1cm4gbmV3Vmlld3BvcnQ7XG59XG4iXX0=
@@ -1,75 +0,0 @@
1
- export declare const mapStateReducerFactory: (initialState?: {}) => import("redux-actions").ReduxCompatibleReducer<{
2
- isViewportSynced: boolean;
3
- isZoomLocked: boolean;
4
- pitch: number;
5
- bearing: number;
6
- latitude: number;
7
- longitude: number;
8
- zoom: number;
9
- dragRotate: boolean;
10
- width: number;
11
- height: number;
12
- minZoom?: number | undefined;
13
- maxZoom?: number | undefined;
14
- maxBounds?: import("@kepler.gl/types").Bounds | undefined;
15
- initialState?: any;
16
- scale?: number | undefined;
17
- isSplit: boolean;
18
- splitMapViewports: import("@kepler.gl/types").Viewport[];
19
- }, {
20
- isViewportSynced: boolean;
21
- isZoomLocked: boolean;
22
- pitch: number;
23
- bearing: number;
24
- latitude: number;
25
- longitude: number;
26
- zoom: number;
27
- dragRotate: boolean;
28
- width: number;
29
- height: number;
30
- minZoom?: number | undefined;
31
- maxZoom?: number | undefined;
32
- maxBounds?: import("@kepler.gl/types").Bounds | undefined;
33
- initialState?: any;
34
- scale?: number | undefined;
35
- isSplit: boolean;
36
- splitMapViewports: import("@kepler.gl/types").Viewport[];
37
- }>;
38
- declare const _default: import("redux-actions").ReduxCompatibleReducer<{
39
- isViewportSynced: boolean;
40
- isZoomLocked: boolean;
41
- pitch: number;
42
- bearing: number;
43
- latitude: number;
44
- longitude: number;
45
- zoom: number;
46
- dragRotate: boolean;
47
- width: number;
48
- height: number;
49
- minZoom?: number | undefined;
50
- maxZoom?: number | undefined;
51
- maxBounds?: import("@kepler.gl/types").Bounds | undefined;
52
- initialState?: any;
53
- scale?: number | undefined;
54
- isSplit: boolean;
55
- splitMapViewports: import("@kepler.gl/types").Viewport[];
56
- }, {
57
- isViewportSynced: boolean;
58
- isZoomLocked: boolean;
59
- pitch: number;
60
- bearing: number;
61
- latitude: number;
62
- longitude: number;
63
- zoom: number;
64
- dragRotate: boolean;
65
- width: number;
66
- height: number;
67
- minZoom?: number | undefined;
68
- maxZoom?: number | undefined;
69
- maxBounds?: import("@kepler.gl/types").Bounds | undefined;
70
- initialState?: any;
71
- scale?: number | undefined;
72
- isSplit: boolean;
73
- splitMapViewports: import("@kepler.gl/types").Viewport[];
74
- }>;
75
- export default _default;