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