@kepler.gl/reducers 3.3.0-alpha.4 → 3.3.0-alpha.6

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 (71) hide show
  1. package/dist/cjs/combined-updaters.js +491 -0
  2. package/dist/cjs/composer-helpers.js +101 -0
  3. package/dist/cjs/composers.js +22 -0
  4. package/dist/cjs/core.js +105 -0
  5. package/dist/cjs/data-utils.js +53 -0
  6. package/dist/cjs/export-utils.js +91 -0
  7. package/dist/{index.js → cjs/index.js} +1 -1
  8. package/dist/cjs/interaction-utils.js +105 -0
  9. package/dist/cjs/layer-utils.js +635 -0
  10. package/dist/cjs/map-state-updaters.js +654 -0
  11. package/dist/cjs/map-state.js +35 -0
  12. package/dist/cjs/map-style-updaters.js +660 -0
  13. package/dist/cjs/map-style.js +33 -0
  14. package/dist/cjs/merger-handler.js +105 -0
  15. package/dist/cjs/middleware.js +27 -0
  16. package/dist/cjs/provider-state-updaters.js +465 -0
  17. package/dist/cjs/provider-state.js +34 -0
  18. package/dist/cjs/root.js +207 -0
  19. package/dist/cjs/ui-state-updaters.js +905 -0
  20. package/dist/cjs/ui-state.js +36 -0
  21. package/dist/cjs/vis-state-merger.js +1193 -0
  22. package/dist/cjs/vis-state-selectors.js +30 -0
  23. package/dist/cjs/vis-state-updaters.js +4114 -0
  24. package/dist/cjs/vis-state.js +35 -0
  25. package/dist/{combined-updaters.js → esm/combined-updaters.js} +74 -81
  26. package/dist/esm/composer-helpers.js +85 -0
  27. package/dist/esm/composers.js +14 -0
  28. package/dist/esm/core.js +101 -0
  29. package/dist/esm/data-utils.js +47 -0
  30. package/dist/esm/export-utils.js +86 -0
  31. package/dist/esm/index.js +62 -0
  32. package/dist/esm/interaction-utils.js +96 -0
  33. package/dist/esm/layer-utils.js +602 -0
  34. package/dist/esm/map-state-updaters.js +646 -0
  35. package/dist/esm/map-state.js +29 -0
  36. package/dist/esm/map-style-updaters.js +652 -0
  37. package/dist/esm/map-style.js +27 -0
  38. package/dist/esm/merger-handler.js +96 -0
  39. package/dist/esm/middleware.js +19 -0
  40. package/dist/esm/provider-state-updaters.js +458 -0
  41. package/dist/esm/provider-state.js +28 -0
  42. package/dist/esm/root.js +201 -0
  43. package/dist/esm/ui-state-updaters.js +900 -0
  44. package/dist/esm/ui-state.js +30 -0
  45. package/dist/esm/vis-state-merger.js +1161 -0
  46. package/dist/esm/vis-state-selectors.js +24 -0
  47. package/dist/esm/vis-state-updaters.js +4035 -0
  48. package/dist/esm/vis-state.js +29 -0
  49. package/package.json +31 -24
  50. package/dist/composer-helpers.js +0 -101
  51. package/dist/composers.js +0 -22
  52. package/dist/core.js +0 -105
  53. package/dist/data-utils.js +0 -53
  54. package/dist/export-utils.js +0 -91
  55. package/dist/interaction-utils.js +0 -105
  56. package/dist/layer-utils.js +0 -635
  57. package/dist/map-state-updaters.js +0 -649
  58. package/dist/map-state.js +0 -35
  59. package/dist/map-style-updaters.js +0 -660
  60. package/dist/map-style.js +0 -33
  61. package/dist/merger-handler.js +0 -105
  62. package/dist/middleware.js +0 -27
  63. package/dist/provider-state-updaters.js +0 -465
  64. package/dist/provider-state.js +0 -34
  65. package/dist/root.js +0 -207
  66. package/dist/ui-state-updaters.js +0 -905
  67. package/dist/ui-state.js +0 -36
  68. package/dist/vis-state-merger.js +0 -1193
  69. package/dist/vis-state-selectors.js +0 -30
  70. package/dist/vis-state-updaters.js +0 -4114
  71. package/dist/vis-state.js +0 -35
@@ -0,0 +1,201 @@
1
+ import _typeof from "@babel/runtime/helpers/esm/typeof";
2
+ import _toConsumableArray from "@babel/runtime/helpers/esm/toConsumableArray";
3
+ import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
4
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
5
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
6
+ // SPDX-License-Identifier: MIT
7
+ // Copyright contributors to the kepler.gl project
8
+
9
+ import { ActionTypes, keplerGlInit, _actionFor, _updateProperty } from '@kepler.gl/actions';
10
+ import { handleActions } from 'redux-actions';
11
+ import { coreReducerFactory } from './core';
12
+ // Extend this type with additional actions to enforce strict typings
13
+
14
+ // INITIAL_STATE
15
+ var initialCoreState = {};
16
+ export function provideInitialState(initialState, extraReducers) {
17
+ var coreReducer = coreReducerFactory(initialState, extraReducers);
18
+ var handleRegisterEntry = function handleRegisterEntry(state, _ref) {
19
+ var _ref$payload = _ref.payload,
20
+ id = _ref$payload.id,
21
+ mint = _ref$payload.mint,
22
+ mapboxApiAccessToken = _ref$payload.mapboxApiAccessToken,
23
+ mapboxApiUrl = _ref$payload.mapboxApiUrl,
24
+ mapStylesReplaceDefault = _ref$payload.mapStylesReplaceDefault,
25
+ initialUiState = _ref$payload.initialUiState;
26
+ // by default, always create a mint state even if the same id already exist
27
+ // if state.id exist and mint=false, keep the existing state
28
+ var previousState = state[id] && mint === false ? state[id] : undefined;
29
+ return _objectSpread(_objectSpread({}, state), {}, _defineProperty({}, id, coreReducer(previousState, keplerGlInit({
30
+ mapboxApiAccessToken: mapboxApiAccessToken,
31
+ mapboxApiUrl: mapboxApiUrl,
32
+ mapStylesReplaceDefault: mapStylesReplaceDefault,
33
+ initialUiState: initialUiState
34
+ }))));
35
+ };
36
+ var handleDeleteEntry = function handleDeleteEntry(state, _ref2) {
37
+ var id = _ref2.payload.id;
38
+ return Object.keys(state).reduce(function (accu, curr) {
39
+ return _objectSpread(_objectSpread({}, accu), curr === id ? {} : _defineProperty({}, curr, state[curr]));
40
+ }, {});
41
+ };
42
+ var handleRenameEntry = function handleRenameEntry(state, _ref4) {
43
+ var _ref4$payload = _ref4.payload,
44
+ oldId = _ref4$payload.oldId,
45
+ newId = _ref4$payload.newId;
46
+ return Object.keys(state).reduce(function (accu, curr) {
47
+ return _objectSpread(_objectSpread({}, accu), _defineProperty({}, curr === oldId ? newId : curr, state[curr]));
48
+ }, {});
49
+ };
50
+ return function () {
51
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialCoreState;
52
+ var action = arguments.length > 1 ? arguments[1] : undefined;
53
+ // update child states
54
+ Object.keys(state).forEach(function (id) {
55
+ var updateItemState = coreReducer(state[id], _actionFor(id, action));
56
+ state = _updateProperty(state, id, updateItemState);
57
+ });
58
+
59
+ // perform additional state reducing (e.g. switch action.type etc...)
60
+ var handlers = _defineProperty(_defineProperty(_defineProperty({}, ActionTypes.REGISTER_ENTRY, handleRegisterEntry), ActionTypes.DELETE_ENTRY, handleDeleteEntry), ActionTypes.RENAME_ENTRY, handleRenameEntry);
61
+ return handleActions(handlers, initialCoreState)(state, action);
62
+ };
63
+ }
64
+ var _keplerGlReducer = provideInitialState(initialCoreState);
65
+ function mergeInitialState() {
66
+ var saved = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
67
+ var provided = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
68
+ var extraInitialStateKeys = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
69
+ var keys = ['mapState', 'mapStyle', 'visState', 'uiState'].concat(_toConsumableArray(extraInitialStateKeys));
70
+
71
+ // shallow merge each reducer
72
+ var newState = keys.reduce(function (accu, key) {
73
+ return _objectSpread(_objectSpread({}, accu), saved[key] && provided[key] ? _defineProperty({}, key, _objectSpread(_objectSpread({}, saved[key]), provided[key])) : _defineProperty({}, key, saved[key] || provided[key] || {}));
74
+ }, {});
75
+ return newState;
76
+ }
77
+ function decorate(target) {
78
+ var savedInitialState = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
79
+ var targetInitialState = savedInitialState;
80
+
81
+ /**
82
+ * Returns a kepler.gl reducer that will also pass each action through additional reducers spiecified.
83
+ * The parameter should be either a reducer map or a reducer function.
84
+ * The state passed into the additional action handler is the instance state.
85
+ * It will include all the subreducers `visState`, `uiState`, `mapState` and `mapStyle`.
86
+ * `.plugin` is only meant to be called once when mounting the keplerGlReducer to the store.
87
+ * **Note** This is an advanced option to give you more freedom to modify the internal state of the kepler.gl instance.
88
+ * You should only use this to adding additional actions instead of replacing default actions.
89
+ *
90
+ * @mixin keplerGlReducer.plugin
91
+ * @memberof keplerGlReducer
92
+ * @param {Object|Function} customReducer - A reducer map or a reducer
93
+ * @param {Object} options - options to be applied to custom reducer logic
94
+ * @param {Object} options.override - objects that describe which action to override, e.g. {[ActionTypes.LAYER_TYPE_CHANGE]: true}
95
+ * @public
96
+ * @example
97
+ * const myKeplerGlReducer = keplerGlReducer
98
+ * .plugin({
99
+ * // 1. as reducer map
100
+ * HIDE_AND_SHOW_SIDE_PANEL: (state, action) => ({
101
+ * ...state,
102
+ * uiState: {
103
+ * ...state.uiState,
104
+ * readOnly: !state.uiState.readOnly
105
+ * }
106
+ * })
107
+ * })
108
+ * .plugin(handleActions({
109
+ * // 2. as reducer
110
+ * 'HIDE_MAP_CONTROLS': (state, action) => ({
111
+ * ...state,
112
+ * uiState: {
113
+ * ...state.uiState,
114
+ * mapControls: hiddenMapControl
115
+ * }
116
+ * })
117
+ * }, {}));
118
+ */
119
+ target.plugin = function plugin(customReducer, options) {
120
+ var _this = this;
121
+ if (_typeof(customReducer) === 'object') {
122
+ // if only provided a reducerMap, wrap it in a reducer
123
+ customReducer = handleActions(customReducer, {});
124
+ }
125
+
126
+ // use 'function' keyword to enable 'this'
127
+ // TODO: temporarily making action type to any, will fix that by creating a shared action interface
128
+ return decorate(function () {
129
+ var _options$override;
130
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
131
+ var action = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
132
+ var nextState = state;
133
+ if (action.type && !(options !== null && options !== void 0 && (_options$override = options.override) !== null && _options$override !== void 0 && _options$override[action.type])) {
134
+ nextState = _this(state, action);
135
+ }
136
+
137
+ // for each entry in the staten
138
+ Object.keys(nextState).forEach(function (id) {
139
+ // update child states
140
+ nextState = _updateProperty(nextState, id, customReducer(nextState[id], _actionFor(id, action)));
141
+ });
142
+ return nextState;
143
+ });
144
+ };
145
+
146
+ /**
147
+ * Return a reducer that initiated with custom initial state.
148
+ * The parameter should be an object mapping from `subreducer` name to custom subreducer state,
149
+ * which will be shallow **merged** with default initial state.
150
+ *
151
+ * Default subreducer state:
152
+ * - [`visState`](./vis-state.md#INITIAL_VIS_STATE)
153
+ * - [`mapState`](./map-state.md#INITIAL_MAP_STATE)
154
+ * - [`mapStyle`](./map-style.md#INITIAL_MAP_STYLE)
155
+ * - [`uiState`](./ui-state.md#INITIAL_UI_STATE)
156
+ * @mixin keplerGlReducer.initialState
157
+ * @memberof keplerGlReducer
158
+ * @param {Object} iniSt - custom state to be merged with default initial state
159
+ * @param {Object} extraReducers - optional custom reducers in addition to the default `visState`, `mapState`, `mapStyle`, and `uiState`
160
+ * @public
161
+ * @example
162
+ * const myKeplerGlReducer = keplerGlReducer
163
+ * .initialState({
164
+ * uiState: {readOnly: true}
165
+ * });
166
+ */
167
+ target.initialState = function initialState(iniSt) {
168
+ var extraReducers = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
169
+ // passing through extraInitialStateKeys and extraReducers allows external customization by adding additional subreducers and state beyond the default `visState`, `mapState`, `mapStyle`, and `uiState`
170
+ var extraInitialStateKeys = Object.keys(extraReducers);
171
+ var merged = mergeInitialState(targetInitialState, iniSt, extraInitialStateKeys);
172
+ var targetReducer = provideInitialState(merged, extraReducers);
173
+ return decorate(targetReducer, merged);
174
+ };
175
+ return target;
176
+ }
177
+
178
+ /**
179
+ * Kepler.gl reducer to be mounted to your store. You can mount `keplerGlReducer` at property `keplerGl`, if you choose
180
+ * to mount it at another address e.g. `foo` you will need to specify it when you mount `KeplerGl` component in your app with `getState: state => state.foo`
181
+ * @public
182
+ * @example
183
+ * import keplerGlReducer from '@kepler.gl/reducers';
184
+ * import {createStore, combineReducers, applyMiddleware, compose} from 'redux';
185
+ * import {taskMiddleware} from 'react-palm/tasks';
186
+ *
187
+ * const initialState = {};
188
+ * const reducers = combineReducers({
189
+ * // <-- mount kepler.gl reducer in your app
190
+ * keplerGl: keplerGlReducer,
191
+ *
192
+ * // Your other reducers here
193
+ * app: appReducer
194
+ * });
195
+ *
196
+ * // using createStore
197
+ * export default createStore(reducer, initialState, applyMiddleware(taskMiddleware));
198
+ */
199
+ var keplerGlReducer = decorate(_keplerGlReducer);
200
+ export default keplerGlReducer;
201
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJBY3Rpb25UeXBlcyIsImtlcGxlckdsSW5pdCIsIl9hY3Rpb25Gb3IiLCJfdXBkYXRlUHJvcGVydHkiLCJoYW5kbGVBY3Rpb25zIiwiY29yZVJlZHVjZXJGYWN0b3J5IiwiaW5pdGlhbENvcmVTdGF0ZSIsInByb3ZpZGVJbml0aWFsU3RhdGUiLCJpbml0aWFsU3RhdGUiLCJleHRyYVJlZHVjZXJzIiwiY29yZVJlZHVjZXIiLCJoYW5kbGVSZWdpc3RlckVudHJ5Iiwic3RhdGUiLCJfcmVmIiwiX3JlZiRwYXlsb2FkIiwicGF5bG9hZCIsImlkIiwibWludCIsIm1hcGJveEFwaUFjY2Vzc1Rva2VuIiwibWFwYm94QXBpVXJsIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbml0aWFsVWlTdGF0ZSIsInByZXZpb3VzU3RhdGUiLCJ1bmRlZmluZWQiLCJfb2JqZWN0U3ByZWFkIiwiX2RlZmluZVByb3BlcnR5IiwiaGFuZGxlRGVsZXRlRW50cnkiLCJfcmVmMiIsIk9iamVjdCIsImtleXMiLCJyZWR1Y2UiLCJhY2N1IiwiY3VyciIsImhhbmRsZVJlbmFtZUVudHJ5IiwiX3JlZjQiLCJfcmVmNCRwYXlsb2FkIiwib2xkSWQiLCJuZXdJZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImFjdGlvbiIsImZvckVhY2giLCJ1cGRhdGVJdGVtU3RhdGUiLCJoYW5kbGVycyIsIlJFR0lTVEVSX0VOVFJZIiwiREVMRVRFX0VOVFJZIiwiUkVOQU1FX0VOVFJZIiwiX2tlcGxlckdsUmVkdWNlciIsIm1lcmdlSW5pdGlhbFN0YXRlIiwic2F2ZWQiLCJwcm92aWRlZCIsImV4dHJhSW5pdGlhbFN0YXRlS2V5cyIsImNvbmNhdCIsIl90b0NvbnN1bWFibGVBcnJheSIsIm5ld1N0YXRlIiwia2V5IiwiZGVjb3JhdGUiLCJ0YXJnZXQiLCJzYXZlZEluaXRpYWxTdGF0ZSIsInRhcmdldEluaXRpYWxTdGF0ZSIsInBsdWdpbiIsImN1c3RvbVJlZHVjZXIiLCJvcHRpb25zIiwiX3RoaXMiLCJfdHlwZW9mIiwiX29wdGlvbnMkb3ZlcnJpZGUiLCJuZXh0U3RhdGUiLCJ0eXBlIiwib3ZlcnJpZGUiLCJpbmlTdCIsIm1lcmdlZCIsInRhcmdldFJlZHVjZXIiLCJrZXBsZXJHbFJlZHVjZXIiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvcm9vdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG5pbXBvcnQge1xuICBBY3Rpb25UeXBlcyxcbiAga2VwbGVyR2xJbml0LFxuICBfYWN0aW9uRm9yLFxuICBfdXBkYXRlUHJvcGVydHksXG4gIFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uLFxuICBSZW5hbWVFbnRyeVVwZGF0ZXJBY3Rpb25cbn0gZnJvbSAnQGtlcGxlci5nbC9hY3Rpb25zJztcbmltcG9ydCB7aGFuZGxlQWN0aW9uc30gZnJvbSAncmVkdXgtYWN0aW9ucyc7XG5cbmltcG9ydCB7Y29yZVJlZHVjZXJGYWN0b3J5LCBLZXBsZXJHbFN0YXRlfSBmcm9tICcuL2NvcmUnO1xuXG50eXBlIEtlcGxlckdsU3RhdGVNYXAgPSB7XG4gIFtpZDogc3RyaW5nXTogUGFydGlhbDxLZXBsZXJHbFN0YXRlPjtcbn07XG5cbnR5cGUgQ29tYmluZVJlZ2lzdGVyVXBkYXRlQWN0aW9ucyA9IFJlZ2lzdGVyRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ10gJlxuICBSZW5hbWVFbnRyeVVwZGF0ZXJBY3Rpb25bJ3BheWxvYWQnXTsgLy8gRXh0ZW5kIHRoaXMgdHlwZSB3aXRoIGFkZGl0aW9uYWwgYWN0aW9ucyB0byBlbmZvcmNlIHN0cmljdCB0eXBpbmdzXG5cbi8vIElOSVRJQUxfU1RBVEVcbmNvbnN0IGluaXRpYWxDb3JlU3RhdGUgPSB7fTtcblxuZXhwb3J0IGZ1bmN0aW9uIHByb3ZpZGVJbml0aWFsU3RhdGUoaW5pdGlhbFN0YXRlLCBleHRyYVJlZHVjZXJzPykge1xuICBjb25zdCBjb3JlUmVkdWNlciA9IGNvcmVSZWR1Y2VyRmFjdG9yeShpbml0aWFsU3RhdGUsIGV4dHJhUmVkdWNlcnMpO1xuXG4gIGNvbnN0IGhhbmRsZVJlZ2lzdGVyRW50cnkgPSAoXG4gICAgc3RhdGU6IEtlcGxlckdsU3RhdGVNYXAsXG4gICAge1xuICAgICAgcGF5bG9hZDoge1xuICAgICAgICBpZCxcbiAgICAgICAgbWludCxcbiAgICAgICAgbWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgICAgIG1hcGJveEFwaVVybCxcbiAgICAgICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQsXG4gICAgICAgIGluaXRpYWxVaVN0YXRlXG4gICAgICB9XG4gICAgfToge1xuICAgICAgcGF5bG9hZDogUmVnaXN0ZXJFbnRyeVVwZGF0ZXJBY3Rpb25bJ3BheWxvYWQnXTtcbiAgICB9XG4gICk6IEtlcGxlckdsU3RhdGVNYXAgPT4ge1xuICAgIC8vIGJ5IGRlZmF1bHQsIGFsd2F5cyBjcmVhdGUgYSBtaW50IHN0YXRlIGV2ZW4gaWYgdGhlIHNhbWUgaWQgYWxyZWFkeSBleGlzdFxuICAgIC8vIGlmIHN0YXRlLmlkIGV4aXN0IGFuZCBtaW50PWZhbHNlLCBrZWVwIHRoZSBleGlzdGluZyBzdGF0ZVxuICAgIGNvbnN0IHByZXZpb3VzU3RhdGUgPSBzdGF0ZVtpZF0gJiYgbWludCA9PT0gZmFsc2UgPyBzdGF0ZVtpZF0gOiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgLy8gcmVnaXN0ZXIgZW50cnkgdG8ga2VwbGVyLmdsIHBhc3NpbmcgaW4gbWFwYm94IGNvbmZpZyB0byBtYXBTdHlsZVxuICAgICAgLi4uc3RhdGUsXG4gICAgICBbaWRdOiBjb3JlUmVkdWNlcihcbiAgICAgICAgcHJldmlvdXNTdGF0ZSxcbiAgICAgICAga2VwbGVyR2xJbml0KHttYXBib3hBcGlBY2Nlc3NUb2tlbiwgbWFwYm94QXBpVXJsLCBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCwgaW5pdGlhbFVpU3RhdGV9KVxuICAgICAgKVxuICAgIH07XG4gIH07XG5cbiAgY29uc3QgaGFuZGxlRGVsZXRlRW50cnkgPSAoXG4gICAgc3RhdGU6IEtlcGxlckdsU3RhdGVNYXAsXG4gICAge3BheWxvYWQ6IHtpZH19OiB7cGF5bG9hZDoge2lkOiBzdHJpbmd9fVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+XG4gICAgT2JqZWN0LmtleXMoc3RhdGUpLnJlZHVjZShcbiAgICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi4oY3VyciA9PT0gaWQgPyB7fSA6IHtbY3Vycl06IHN0YXRlW2N1cnJdfSlcbiAgICAgIH0pLFxuICAgICAge31cbiAgICApO1xuXG4gIGNvbnN0IGhhbmRsZVJlbmFtZUVudHJ5ID0gKFxuICAgIHN0YXRlOiBLZXBsZXJHbFN0YXRlTWFwLFxuICAgIHtcbiAgICAgIHBheWxvYWQ6IHtvbGRJZCwgbmV3SWR9XG4gICAgfToge1xuICAgICAgcGF5bG9hZDogUmVuYW1lRW50cnlVcGRhdGVyQWN0aW9uWydwYXlsb2FkJ107XG4gICAgfVxuICApOiBLZXBsZXJHbFN0YXRlTWFwID0+XG4gICAgT2JqZWN0LmtleXMoc3RhdGUpLnJlZHVjZShcbiAgICAgIChhY2N1LCBjdXJyKSA9PiAoe1xuICAgICAgICAuLi5hY2N1LFxuICAgICAgICAuLi57W2N1cnIgPT09IG9sZElkID8gbmV3SWQgOiBjdXJyXTogc3RhdGVbY3Vycl19XG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKTtcblxuICByZXR1cm4gKHN0YXRlID0gaW5pdGlhbENvcmVTdGF0ZSwgYWN0aW9uKSA9PiB7XG4gICAgLy8gdXBkYXRlIGNoaWxkIHN0YXRlc1xuICAgIE9iamVjdC5rZXlzKHN0YXRlKS5mb3JFYWNoKGlkID0+IHtcbiAgICAgIGNvbnN0IHVwZGF0ZUl0ZW1TdGF0ZSA9IGNvcmVSZWR1Y2VyKHN0YXRlW2lkXSwgX2FjdGlvbkZvcihpZCwgYWN0aW9uKSk7XG4gICAgICBzdGF0ZSA9IF91cGRhdGVQcm9wZXJ0eShzdGF0ZSwgaWQsIHVwZGF0ZUl0ZW1TdGF0ZSk7XG4gICAgfSk7XG5cbiAgICAvLyBwZXJmb3JtIGFkZGl0aW9uYWwgc3RhdGUgcmVkdWNpbmcgKGUuZy4gc3dpdGNoIGFjdGlvbi50eXBlIGV0Yy4uLilcbiAgICBjb25zdCBoYW5kbGVycyA9IHtcbiAgICAgIFtBY3Rpb25UeXBlcy5SRUdJU1RFUl9FTlRSWV06IGhhbmRsZVJlZ2lzdGVyRW50cnksXG4gICAgICBbQWN0aW9uVHlwZXMuREVMRVRFX0VOVFJZXTogaGFuZGxlRGVsZXRlRW50cnksXG4gICAgICBbQWN0aW9uVHlwZXMuUkVOQU1FX0VOVFJZXTogaGFuZGxlUmVuYW1lRW50cnlcbiAgICB9O1xuXG4gICAgcmV0dXJuIGhhbmRsZUFjdGlvbnM8S2VwbGVyR2xTdGF0ZU1hcCwgQ29tYmluZVJlZ2lzdGVyVXBkYXRlQWN0aW9ucz4oXG4gICAgICBoYW5kbGVycyxcbiAgICAgIGluaXRpYWxDb3JlU3RhdGVcbiAgICApKHN0YXRlLCBhY3Rpb24pO1xuICB9O1xufVxuXG5jb25zdCBfa2VwbGVyR2xSZWR1Y2VyID0gcHJvdmlkZUluaXRpYWxTdGF0ZShpbml0aWFsQ29yZVN0YXRlKTtcblxuZnVuY3Rpb24gbWVyZ2VJbml0aWFsU3RhdGUoc2F2ZWQgPSB7fSwgcHJvdmlkZWQgPSB7fSwgZXh0cmFJbml0aWFsU3RhdGVLZXlzOiBzdHJpbmdbXSA9IFtdKSB7XG4gIGNvbnN0IGtleXMgPSBbJ21hcFN0YXRlJywgJ21hcFN0eWxlJywgJ3Zpc1N0YXRlJywgJ3VpU3RhdGUnLCAuLi5leHRyYUluaXRpYWxTdGF0ZUtleXNdO1xuXG4gIC8vIHNoYWxsb3cgbWVyZ2UgZWFjaCByZWR1Y2VyXG4gIGNvbnN0IG5ld1N0YXRlID0ga2V5cy5yZWR1Y2UoXG4gICAgKGFjY3UsIGtleSkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICAuLi4oc2F2ZWRba2V5XSAmJiBwcm92aWRlZFtrZXldXG4gICAgICAgID8ge1trZXldOiB7Li4uc2F2ZWRba2V5XSwgLi4ucHJvdmlkZWRba2V5XX19XG4gICAgICAgIDoge1trZXldOiBzYXZlZFtrZXldIHx8IHByb3ZpZGVkW2tleV0gfHwge319KVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5mdW5jdGlvbiBkZWNvcmF0ZSh0YXJnZXQsIHNhdmVkSW5pdGlhbFN0YXRlID0ge30pIHtcbiAgY29uc3QgdGFyZ2V0SW5pdGlhbFN0YXRlID0gc2F2ZWRJbml0aWFsU3RhdGU7XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBrZXBsZXIuZ2wgcmVkdWNlciB0aGF0IHdpbGwgYWxzbyBwYXNzIGVhY2ggYWN0aW9uIHRocm91Z2ggYWRkaXRpb25hbCByZWR1Y2VycyBzcGllY2lmaWVkLlxuICAgKiBUaGUgcGFyYW1ldGVyIHNob3VsZCBiZSBlaXRoZXIgYSByZWR1Y2VyIG1hcCBvciBhIHJlZHVjZXIgZnVuY3Rpb24uXG4gICAqIFRoZSBzdGF0ZSBwYXNzZWQgaW50byB0aGUgYWRkaXRpb25hbCBhY3Rpb24gaGFuZGxlciBpcyB0aGUgaW5zdGFuY2Ugc3RhdGUuXG4gICAqIEl0IHdpbGwgaW5jbHVkZSBhbGwgdGhlIHN1YnJlZHVjZXJzIGB2aXNTdGF0ZWAsIGB1aVN0YXRlYCwgYG1hcFN0YXRlYCBhbmQgYG1hcFN0eWxlYC5cbiAgICogYC5wbHVnaW5gIGlzIG9ubHkgbWVhbnQgdG8gYmUgY2FsbGVkIG9uY2Ugd2hlbiBtb3VudGluZyB0aGUga2VwbGVyR2xSZWR1Y2VyIHRvIHRoZSBzdG9yZS5cbiAgICogKipOb3RlKiogVGhpcyBpcyBhbiBhZHZhbmNlZCBvcHRpb24gdG8gZ2l2ZSB5b3UgbW9yZSBmcmVlZG9tIHRvIG1vZGlmeSB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGtlcGxlci5nbCBpbnN0YW5jZS5cbiAgICogWW91IHNob3VsZCBvbmx5IHVzZSB0aGlzIHRvIGFkZGluZyBhZGRpdGlvbmFsIGFjdGlvbnMgaW5zdGVhZCBvZiByZXBsYWNpbmcgZGVmYXVsdCBhY3Rpb25zLlxuICAgKlxuICAgKiBAbWl4aW4ga2VwbGVyR2xSZWR1Y2VyLnBsdWdpblxuICAgKiBAbWVtYmVyb2Yga2VwbGVyR2xSZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fEZ1bmN0aW9ufSBjdXN0b21SZWR1Y2VyIC0gQSByZWR1Y2VyIG1hcCBvciBhIHJlZHVjZXJcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBvcHRpb25zIHRvIGJlIGFwcGxpZWQgdG8gY3VzdG9tIHJlZHVjZXIgbG9naWNcbiAgICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMub3ZlcnJpZGUgLSBvYmplY3RzIHRoYXQgZGVzY3JpYmUgd2hpY2ggYWN0aW9uIHRvIG92ZXJyaWRlLCBlLmcuIHtbQWN0aW9uVHlwZXMuTEFZRVJfVFlQRV9DSEFOR0VdOiB0cnVlfVxuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG15S2VwbGVyR2xSZWR1Y2VyID0ga2VwbGVyR2xSZWR1Y2VyXG4gICAqICAucGx1Z2luKHtcbiAgICogICAgLy8gMS4gYXMgcmVkdWNlciBtYXBcbiAgICogICAgSElERV9BTkRfU0hPV19TSURFX1BBTkVMOiAoc3RhdGUsIGFjdGlvbikgPT4gKHtcbiAgICogICAgICAuLi5zdGF0ZSxcbiAgICogICAgICB1aVN0YXRlOiB7XG4gICAqICAgICAgICAuLi5zdGF0ZS51aVN0YXRlLFxuICAgKiAgICAgICAgcmVhZE9ubHk6ICFzdGF0ZS51aVN0YXRlLnJlYWRPbmx5XG4gICAqICAgICAgfVxuICAgKiAgICB9KVxuICAgKiAgfSlcbiAgICogLnBsdWdpbihoYW5kbGVBY3Rpb25zKHtcbiAgICogICAvLyAyLiBhcyByZWR1Y2VyXG4gICAqICAgJ0hJREVfTUFQX0NPTlRST0xTJzogKHN0YXRlLCBhY3Rpb24pID0+ICh7XG4gICAqICAgICAuLi5zdGF0ZSxcbiAgICogICAgIHVpU3RhdGU6IHtcbiAgICogICAgICAgLi4uc3RhdGUudWlTdGF0ZSxcbiAgICogICAgICAgbWFwQ29udHJvbHM6IGhpZGRlbk1hcENvbnRyb2xcbiAgICogICAgIH1cbiAgICogICB9KVxuICAgKiB9LCB7fSkpO1xuICAgKi9cbiAgdGFyZ2V0LnBsdWdpbiA9IGZ1bmN0aW9uIHBsdWdpbihjdXN0b21SZWR1Y2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKHR5cGVvZiBjdXN0b21SZWR1Y2VyID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gaWYgb25seSBwcm92aWRlZCBhIHJlZHVjZXJNYXAsIHdyYXAgaXQgaW4gYSByZWR1Y2VyXG4gICAgICBjdXN0b21SZWR1Y2VyID0gaGFuZGxlQWN0aW9ucyhjdXN0b21SZWR1Y2VyLCB7fSk7XG4gICAgfVxuXG4gICAgLy8gdXNlICdmdW5jdGlvbicga2V5d29yZCB0byBlbmFibGUgJ3RoaXMnXG4gICAgLy8gVE9ETzogdGVtcG9yYXJpbHkgbWFraW5nIGFjdGlvbiB0eXBlIHRvIGFueSwgd2lsbCBmaXggdGhhdCBieSBjcmVhdGluZyBhIHNoYXJlZCBhY3Rpb24gaW50ZXJmYWNlXG4gICAgcmV0dXJuIGRlY29yYXRlKChzdGF0ZSA9IHt9LCBhY3Rpb246IGFueSA9IHt9KSA9PiB7XG4gICAgICBsZXQgbmV4dFN0YXRlID0gc3RhdGU7XG4gICAgICBpZiAoYWN0aW9uLnR5cGUgJiYgIW9wdGlvbnM/Lm92ZXJyaWRlPy5bYWN0aW9uLnR5cGVdKSB7XG4gICAgICAgIG5leHRTdGF0ZSA9IHRoaXMoc3RhdGUsIGFjdGlvbik7XG4gICAgICB9XG5cbiAgICAgIC8vIGZvciBlYWNoIGVudHJ5IGluIHRoZSBzdGF0ZW5cbiAgICAgIE9iamVjdC5rZXlzKG5leHRTdGF0ZSkuZm9yRWFjaChpZCA9PiB7XG4gICAgICAgIC8vIHVwZGF0ZSBjaGlsZCBzdGF0ZXNcbiAgICAgICAgbmV4dFN0YXRlID0gX3VwZGF0ZVByb3BlcnR5KFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBpZCxcbiAgICAgICAgICBjdXN0b21SZWR1Y2VyKG5leHRTdGF0ZVtpZF0sIF9hY3Rpb25Gb3IoaWQsIGFjdGlvbikpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICAgIHJldHVybiBuZXh0U3RhdGU7XG4gICAgfSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiBhIHJlZHVjZXIgdGhhdCBpbml0aWF0ZWQgd2l0aCBjdXN0b20gaW5pdGlhbCBzdGF0ZS5cbiAgICogVGhlIHBhcmFtZXRlciBzaG91bGQgYmUgYW4gb2JqZWN0IG1hcHBpbmcgZnJvbSBgc3VicmVkdWNlcmAgbmFtZSB0byBjdXN0b20gc3VicmVkdWNlciBzdGF0ZSxcbiAgICogd2hpY2ggd2lsbCBiZSBzaGFsbG93ICoqbWVyZ2VkKiogd2l0aCBkZWZhdWx0IGluaXRpYWwgc3RhdGUuXG4gICAqXG4gICAqIERlZmF1bHQgc3VicmVkdWNlciBzdGF0ZTpcbiAgICogIC0gW2B2aXNTdGF0ZWBdKC4vdmlzLXN0YXRlLm1kI0lOSVRJQUxfVklTX1NUQVRFKVxuICAgKiAgLSBbYG1hcFN0YXRlYF0oLi9tYXAtc3RhdGUubWQjSU5JVElBTF9NQVBfU1RBVEUpXG4gICAqICAtIFtgbWFwU3R5bGVgXSguL21hcC1zdHlsZS5tZCNJTklUSUFMX01BUF9TVFlMRSlcbiAgICogIC0gW2B1aVN0YXRlYF0oLi91aS1zdGF0ZS5tZCNJTklUSUFMX1VJX1NUQVRFKVxuICAgKiBAbWl4aW4ga2VwbGVyR2xSZWR1Y2VyLmluaXRpYWxTdGF0ZVxuICAgKiBAbWVtYmVyb2Yga2VwbGVyR2xSZWR1Y2VyXG4gICAqIEBwYXJhbSB7T2JqZWN0fSBpbmlTdCAtIGN1c3RvbSBzdGF0ZSB0byBiZSBtZXJnZWQgd2l0aCBkZWZhdWx0IGluaXRpYWwgc3RhdGVcbiAgICogQHBhcmFtIHtPYmplY3R9IGV4dHJhUmVkdWNlcnMgLSBvcHRpb25hbCBjdXN0b20gcmVkdWNlcnMgaW4gYWRkaXRpb24gdG8gdGhlIGRlZmF1bHQgYHZpc1N0YXRlYCwgYG1hcFN0YXRlYCwgYG1hcFN0eWxlYCwgYW5kIGB1aVN0YXRlYFxuICAgKiBAcHVibGljXG4gICAqIEBleGFtcGxlXG4gICAqIGNvbnN0IG15S2VwbGVyR2xSZWR1Y2VyID0ga2VwbGVyR2xSZWR1Y2VyXG4gICAqICAuaW5pdGlhbFN0YXRlKHtcbiAgICogICAgdWlTdGF0ZToge3JlYWRPbmx5OiB0cnVlfVxuICAgKiAgfSk7XG4gICAqL1xuICB0YXJnZXQuaW5pdGlhbFN0YXRlID0gZnVuY3Rpb24gaW5pdGlhbFN0YXRlKGluaVN0LCBleHRyYVJlZHVjZXJzID0ge30pIHtcbiAgICAvLyBwYXNzaW5nIHRocm91Z2ggZXh0cmFJbml0aWFsU3RhdGVLZXlzIGFuZCBleHRyYVJlZHVjZXJzIGFsbG93cyBleHRlcm5hbCBjdXN0b21pemF0aW9uIGJ5IGFkZGluZyBhZGRpdGlvbmFsIHN1YnJlZHVjZXJzIGFuZCBzdGF0ZSBiZXlvbmQgdGhlIGRlZmF1bHQgYHZpc1N0YXRlYCwgYG1hcFN0YXRlYCwgYG1hcFN0eWxlYCwgYW5kIGB1aVN0YXRlYFxuICAgIGNvbnN0IGV4dHJhSW5pdGlhbFN0YXRlS2V5cyA9IE9iamVjdC5rZXlzKGV4dHJhUmVkdWNlcnMpO1xuICAgIGNvbnN0IG1lcmdlZCA9IG1lcmdlSW5pdGlhbFN0YXRlKHRhcmdldEluaXRpYWxTdGF0ZSwgaW5pU3QsIGV4dHJhSW5pdGlhbFN0YXRlS2V5cyk7XG4gICAgY29uc3QgdGFyZ2V0UmVkdWNlciA9IHByb3ZpZGVJbml0aWFsU3RhdGUobWVyZ2VkLCBleHRyYVJlZHVjZXJzKTtcblxuICAgIHJldHVybiBkZWNvcmF0ZSh0YXJnZXRSZWR1Y2VyLCBtZXJnZWQpO1xuICB9O1xuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cbi8qKlxuICogS2VwbGVyLmdsIHJlZHVjZXIgdG8gYmUgbW91bnRlZCB0byB5b3VyIHN0b3JlLiBZb3UgY2FuIG1vdW50IGBrZXBsZXJHbFJlZHVjZXJgIGF0IHByb3BlcnR5IGBrZXBsZXJHbGAsIGlmIHlvdSBjaG9vc2VcbiAqIHRvIG1vdW50IGl0IGF0IGFub3RoZXIgYWRkcmVzcyBlLmcuIGBmb29gIHlvdSB3aWxsIG5lZWQgdG8gc3BlY2lmeSBpdCB3aGVuIHlvdSBtb3VudCBgS2VwbGVyR2xgIGNvbXBvbmVudCBpbiB5b3VyIGFwcCB3aXRoIGBnZXRTdGF0ZTogc3RhdGUgPT4gc3RhdGUuZm9vYFxuICogQHB1YmxpY1xuICogQGV4YW1wbGVcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIgZnJvbSAnQGtlcGxlci5nbC9yZWR1Y2Vycyc7XG4gKiBpbXBvcnQge2NyZWF0ZVN0b3JlLCBjb21iaW5lUmVkdWNlcnMsIGFwcGx5TWlkZGxld2FyZSwgY29tcG9zZX0gZnJvbSAncmVkdXgnO1xuICogaW1wb3J0IHt0YXNrTWlkZGxld2FyZX0gZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG4gKlxuICogY29uc3QgaW5pdGlhbFN0YXRlID0ge307XG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAgIC8vIDwtLSBtb3VudCBrZXBsZXIuZ2wgcmVkdWNlciBpbiB5b3VyIGFwcFxuICogICBrZXBsZXJHbDoga2VwbGVyR2xSZWR1Y2VyLFxuICpcbiAqICAgLy8gWW91ciBvdGhlciByZWR1Y2VycyBoZXJlXG4gKiAgIGFwcDogYXBwUmVkdWNlclxuICogfSk7XG4gKlxuICogLy8gdXNpbmcgY3JlYXRlU3RvcmVcbiAqIGV4cG9ydCBkZWZhdWx0IGNyZWF0ZVN0b3JlKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSwgYXBwbHlNaWRkbGV3YXJlKHRhc2tNaWRkbGV3YXJlKSk7XG4gKi9cbmNvbnN0IGtlcGxlckdsUmVkdWNlciA9IGRlY29yYXRlKF9rZXBsZXJHbFJlZHVjZXIpO1xuZXhwb3J0IGRlZmF1bHQga2VwbGVyR2xSZWR1Y2VyO1xuIl0sIm1hcHBpbmdzIjoiOzs7OztBQUFBO0FBQ0E7O0FBRUEsU0FDRUEsV0FBVyxFQUNYQyxZQUFZLEVBQ1pDLFVBQVUsRUFDVkMsZUFBZSxRQUdWLG9CQUFvQjtBQUMzQixTQUFRQyxhQUFhLFFBQU8sZUFBZTtBQUUzQyxTQUFRQyxrQkFBa0IsUUFBc0IsUUFBUTtBQU9q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