@kepler.gl/reducers 3.0.0 → 3.1.0-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/package.json +26 -20
  2. package/dist/combined-updaters.d.ts +0 -79
  3. package/dist/combined-updaters.js +0 -423
  4. package/dist/composer-helpers.d.ts +0 -24
  5. package/dist/composer-helpers.js +0 -122
  6. package/dist/composers.d.ts +0 -18
  7. package/dist/composers.js +0 -27
  8. package/dist/core.d.ts +0 -64
  9. package/dist/core.js +0 -139
  10. package/dist/data-utils.d.ts +0 -8
  11. package/dist/data-utils.js +0 -42
  12. package/dist/export-utils.d.ts +0 -21
  13. package/dist/export-utils.js +0 -104
  14. package/dist/index.d.ts +0 -35
  15. package/dist/index.js +0 -373
  16. package/dist/interaction-utils.d.ts +0 -31
  17. package/dist/interaction-utils.js +0 -129
  18. package/dist/layer-utils.d.ts +0 -95
  19. package/dist/layer-utils.js +0 -344
  20. package/dist/map-state-updaters.d.ts +0 -93
  21. package/dist/map-state-updaters.js +0 -489
  22. package/dist/map-state.d.ts +0 -75
  23. package/dist/map-state.js +0 -47
  24. package/dist/map-style-updaters.d.ts +0 -186
  25. package/dist/map-style-updaters.js +0 -737
  26. package/dist/map-style.d.ts +0 -4
  27. package/dist/map-style.js +0 -46
  28. package/dist/merger-handler.d.ts +0 -10
  29. package/dist/merger-handler.js +0 -123
  30. package/dist/middleware.d.ts +0 -8
  31. package/dist/middleware.js +0 -30
  32. package/dist/provider-state-updaters.d.ts +0 -35
  33. package/dist/provider-state-updaters.js +0 -422
  34. package/dist/provider-state.d.ts +0 -4
  35. package/dist/provider-state.js +0 -46
  36. package/dist/root.d.ts +0 -24
  37. package/dist/root.js +0 -229
  38. package/dist/ui-state-updaters.d.ts +0 -362
  39. package/dist/ui-state-updaters.js +0 -871
  40. package/dist/ui-state.d.ts +0 -3
  41. package/dist/ui-state.js +0 -48
  42. package/dist/vis-state-merger.d.ts +0 -140
  43. package/dist/vis-state-merger.js +0 -915
  44. package/dist/vis-state-selectors.d.ts +0 -2
  45. package/dist/vis-state-selectors.js +0 -37
  46. package/dist/vis-state-updaters.d.ts +0 -545
  47. package/dist/vis-state-updaters.js +0 -3154
  48. package/dist/vis-state.d.ts +0 -211
  49. package/dist/vis-state.js +0 -46
@@ -1,737 +0,0 @@
1
- "use strict";
2
-
3
- var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
4
-
5
- var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
6
-
7
- var _typeof = require("@babel/runtime/helpers/typeof");
8
-
9
- Object.defineProperty(exports, "__esModule", {
10
- value: true
11
- });
12
- exports.getMapStyles = getMapStyles;
13
- exports.getInitialInputStyle = getInitialInputStyle;
14
- exports.setBackgroundColorUpdater = exports.set3dBuildingColorUpdater = exports.removeCustomMapStyleUpdater = exports.editCustomMapStyleUpdater = exports.addCustomMapStyleUpdater = exports.inputMapStyleUpdater = exports.loadCustomMapStyleUpdater = exports.resetMapConfigMapStyleUpdater = exports.receiveMapConfigUpdater = exports.loadMapStyleErrUpdater = exports.loadMapStylesUpdater = exports.mapStyleChangeUpdater = exports.mapConfigChangeUpdater = exports.initMapStyleUpdater = exports.requestMapStylesUpdater = exports.INITIAL_MAP_STYLE = void 0;
15
-
16
- var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
17
-
18
- var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
-
20
- var _tasks = _interopRequireWildcard(require("react-palm/tasks"));
21
-
22
- var _lodash = _interopRequireDefault(require("lodash.clonedeep"));
23
-
24
- var _console = _interopRequireDefault(require("global/console"));
25
-
26
- var _utils = require("@kepler.gl/utils");
27
-
28
- var _constants = require("@kepler.gl/constants");
29
-
30
- var _tasks2 = require("@kepler.gl/tasks");
31
-
32
- var _d3Color = require("d3-color");
33
-
34
- var _actions = require("@kepler.gl/actions");
35
-
36
- function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
37
-
38
- function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
39
-
40
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
41
-
42
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { (0, _defineProperty2["default"])(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
43
-
44
- var getDefaultState = function getDefaultState() {
45
- var visibleLayerGroups = {};
46
- var styleType = 'dark-matter';
47
- var topLayerGroups = {};
48
- return {
49
- styleType: styleType,
50
- visibleLayerGroups: visibleLayerGroups,
51
- topLayerGroups: topLayerGroups,
52
- mapStyles: _constants.DEFAULT_MAP_STYLES.reduce(function (accu, curr) {
53
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, curr.id, curr));
54
- }, {}),
55
- // save mapbox access token
56
- mapboxApiAccessToken: null,
57
- mapboxApiUrl: _constants.DEFAULT_MAPBOX_API_URL,
58
- mapStylesReplaceDefault: false,
59
- inputStyle: getInitialInputStyle(),
60
- threeDBuildingColor: (0, _utils.hexToRgb)(_constants.DEFAULT_BLDG_COLOR),
61
- custom3DBuildingColor: false,
62
- backgroundColor: (0, _utils.hexToRgb)(_constants.DEFAULT_BACKGROUND_COLOR),
63
- isLoading: {},
64
- bottomMapStyle: undefined,
65
- topMapStyle: undefined
66
- };
67
- };
68
- /**
69
- * Updaters for `mapStyle`. Can be used in your root reducer to directly modify kepler.gl's state.
70
- * Read more about [Using updaters](../advanced-usage/using-updaters.md)
71
- * @public
72
- * @example
73
- *
74
- * import keplerGlReducer, {mapStyleUpdaters} from 'kepler.gl/reducers';
75
- * // Root Reducer
76
- * const reducers = combineReducers({
77
- * keplerGl: keplerGlReducer,
78
- * app: appReducer
79
- * });
80
- *
81
- * const composedReducer = (state, action) => {
82
- * switch (action.type) {
83
- * // click button to hide label from background map
84
- * case 'CLICK_BUTTON':
85
- * return {
86
- * ...state,
87
- * keplerGl: {
88
- * ...state.keplerGl,
89
- * foo: {
90
- * ...state.keplerGl.foo,
91
- * mapStyle: mapStyleUpdaters.mapConfigChangeUpdater(
92
- * mapStyle,
93
- * {payload: {visibleLayerGroups: {label: false, road: true, background: true}}}
94
- * )
95
- * }
96
- * }
97
- * };
98
- * }
99
- * return reducers(state, action);
100
- * };
101
- *
102
- * export default composedReducer;
103
- */
104
-
105
- /* eslint-disable no-unused-vars */
106
- // @ts-ignore
107
-
108
-
109
- var mapStyleUpdaters = null;
110
- /* eslint-enable no-unused-vars */
111
-
112
- /**
113
- * Default initial `mapStyle`
114
- * @memberof mapStyleUpdaters
115
- * @constant
116
- * @property styleType - Default: `'dark'`
117
- * @property visibleLayerGroups - Default: `{}`
118
- * @property topLayerGroups - Default: `{}`
119
- * @property mapStyles - mapping from style key to style object
120
- * @property mapboxApiAccessToken - Default: `null`
121
- * @Property mapboxApiUrl - Default null
122
- * @Property mapStylesReplaceDefault - Default: `false`
123
- * @property inputStyle - Default: `{}`
124
- * @property threeDBuildingColor - Default: `[r, g, b]`
125
- * @property backgroundColor - Default: `[r, g, b]`
126
- * @public
127
- */
128
-
129
- var INITIAL_MAP_STYLE = getDefaultState();
130
- exports.INITIAL_MAP_STYLE = INITIAL_MAP_STYLE;
131
-
132
- /**
133
- * Create two map styles from preset map style, one for top map one for bottom
134
- *
135
- * @param {string} styleType - current map style
136
- * @param {Object} visibleLayerGroups - visible layers of bottom map
137
- * @param {Object} topLayerGroups - visible layers of top map
138
- * @param {Object} mapStyles - a dictionary of all map styles
139
- * @returns {Object} bottomMapStyle | topMapStyle | isRaster
140
- */
141
- function getMapStyles(_ref) {
142
- var styleType = _ref.styleType,
143
- visibleLayerGroups = _ref.visibleLayerGroups,
144
- topLayerGroups = _ref.topLayerGroups,
145
- mapStyles = _ref.mapStyles;
146
- var mapStyle = mapStyles[styleType]; // style might not be loaded yet
147
-
148
- if (!mapStyle || !mapStyle.style) {
149
- return {};
150
- }
151
-
152
- var editable = Object.keys(visibleLayerGroups).length;
153
- var bottomMapStyle = !editable ? mapStyle.style : (0, _utils.editBottomMapStyle)({
154
- id: styleType,
155
- mapStyle: mapStyle,
156
- visibleLayerGroups: visibleLayerGroups
157
- });
158
- var hasTopLayer = editable > 0 && Object.values(topLayerGroups).some(function (v) {
159
- return v;
160
- }); // mute top layer if not visible in bottom layer
161
-
162
- var topLayers = hasTopLayer && Object.keys(topLayerGroups).reduce(function (accu, key) {
163
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, topLayerGroups[key] && visibleLayerGroups[key]));
164
- }, {});
165
- var topMapStyle = hasTopLayer ? (0, _utils.editTopMapStyle)({
166
- id: styleType,
167
- mapStyle: mapStyle,
168
- visibleLayerGroups: topLayers
169
- }) : null;
170
- return {
171
- bottomMapStyle: bottomMapStyle,
172
- topMapStyle: topMapStyle,
173
- editable: editable
174
- };
175
- }
176
-
177
- function findLayerFillColor(layer) {
178
- return layer && layer.paint && layer.paint['background-color'];
179
- } // need to be careful because some basemap layer.paint['background-color'] values may be an interpolate array expression instead of a color string
180
- // https://docs.mapbox.com/mapbox-gl-js/style-spec/layers/#paint-background-background-color
181
- // https://docs.mapbox.com/mapbox-gl-js/style-spec/expressions/#interpolate
182
-
183
-
184
- function getPaintColor(color) {
185
- if (Array.isArray(color) && color[0] === 'interpolate') {
186
- // get color of first zoom break
187
- // ["interpolate", ["linear"], ["zoom"], 11, "hsl(35, 32%, 91%)", 13, "hsl(35, 12%, 89%)"]
188
- return color[4];
189
- }
190
-
191
- return color;
192
- }
193
-
194
- function get3DBuildingColor(style) {
195
- // set building color to be the same as the background color.
196
- if (!style.style) {
197
- return (0, _utils.hexToRgb)(_constants.DEFAULT_BLDG_COLOR);
198
- }
199
-
200
- var backgroundLayer = (style.style.layers || []).find(function (_ref2) {
201
- var id = _ref2.id;
202
- return id === 'background';
203
- });
204
- var buildingLayer = (style.style.layers || []).find(function (_ref3) {
205
- var id = _ref3.id;
206
- return id.match(/building/);
207
- });
208
-
209
- var buildingColor = findLayerFillColor(buildingLayer) || findLayerFillColor(backgroundLayer) || _constants.DEFAULT_BLDG_COLOR; // brighten or darken building based on style
210
-
211
-
212
- var operation = style.id.match(/(?=(dark|night))/) ? 'brighter' : 'darker';
213
- var alpha = 0.2;
214
- var rgbObj = (0, _d3Color.rgb)(buildingColor)[operation]([alpha]);
215
- return [rgbObj.r, rgbObj.g, rgbObj.b];
216
- }
217
-
218
- function getBackgroundColorFromStyleBaseLayer(style, backupBackgroundColor) {
219
- var _colorMaybeToRGB;
220
-
221
- if (!style.style) {
222
- return (0, _utils.colorMaybeToRGB)(backupBackgroundColor) || backupBackgroundColor;
223
- } // @ts-expect-error style.style not typed
224
-
225
-
226
- var baseLayer = (style.style.layers || []).find(function (_ref4) {
227
- var id = _ref4.id;
228
- return _constants.BASE_MAP_BACKGROUND_LAYER_IDS.includes(id);
229
- });
230
- var backgroundColorOfBaseLayer = getPaintColor(findLayerFillColor(baseLayer));
231
- var newBackgroundColor = typeof backgroundColorOfBaseLayer === 'string' ? backgroundColorOfBaseLayer : backupBackgroundColor;
232
- var newBackgroundColorAsRGBArray = (_colorMaybeToRGB = (0, _utils.colorMaybeToRGB)(newBackgroundColor) // if newBackgroundColor was in string HSL format it can introduce RGB numbers with decimals,
233
- // which may render the background-color CSS of the <StyledMap> container incorrectly when using our own color utils `rgbToHex()`
234
- // so we attempt to round to nearest integer here
235
- ) === null || _colorMaybeToRGB === void 0 ? void 0 : _colorMaybeToRGB.map(function (channelNumber) {
236
- return Math.round(channelNumber);
237
- });
238
- return newBackgroundColorAsRGBArray || backupBackgroundColor;
239
- } // determine new backgroundColor from either previous state basemap style, previous state backgroundColor, or the DEFAULT_BACKGROUND_COLOR
240
-
241
-
242
- function getBackgroundColor(previousState, styleType) {
243
- var previousStateMapStyle = previousState.mapStyles[previousState.styleType];
244
- var backupBackgroundColor = previousState.backgroundColor || _constants.DEFAULT_BACKGROUND_COLOR;
245
- var backgroundColor = styleType === _constants.NO_MAP_ID ? // if the style has switched to the "no basemap" style,
246
- // attempt to detect backgroundColor of the previous basemap if it was a mapbox basemap
247
- // and set it as the "no basemap" backgroundColor
248
- getBackgroundColorFromStyleBaseLayer(previousStateMapStyle, backupBackgroundColor) : // otherwise leave it alone and rely on the previous state's preexisting backgroundColor
249
- // or DEFAULT_BACKGROUND_COLOR as a last resort
250
- backupBackgroundColor;
251
- return backgroundColor;
252
- }
253
-
254
- function getLayerGroupsFromStyle(style) {
255
- return Array.isArray(style === null || style === void 0 ? void 0 : style.layers) ? _constants.DEFAULT_LAYER_GROUPS.filter(function (lg) {
256
- return style.layers.filter(lg.filter).length;
257
- }) : [];
258
- } // Updaters
259
-
260
- /**
261
- * @memberof mapStyleUpdaters
262
- * @public
263
- */
264
-
265
-
266
- var requestMapStylesUpdater = function requestMapStylesUpdater(state, _ref5) {
267
- var _ref5$payload = _ref5.payload,
268
- mapStyles = _ref5$payload.mapStyles,
269
- onSuccess = _ref5$payload.onSuccess;
270
- var toLoad = Object.keys(mapStyles).reduce(function (accu, id) {
271
- return _objectSpread(_objectSpread({}, accu), !state.isLoading[id] ? (0, _defineProperty2["default"])({}, id, mapStyles[id]) : {});
272
- }, {});
273
- var loadMapStyleTasks = getLoadMapStyleTasks(toLoad, state.mapboxApiAccessToken, state.mapboxApiUrl, onSuccess);
274
- var isLoading = Object.keys(toLoad).reduce(function (accu, key) {
275
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, key, true));
276
- }, {});
277
-
278
- var nextState = _objectSpread(_objectSpread({}, state), {}, {
279
- isLoading: isLoading
280
- });
281
-
282
- return (0, _tasks.withTask)(nextState, loadMapStyleTasks);
283
- };
284
- /**
285
- * Propagate `mapStyle` reducer with `mapboxApiAccessToken` and `mapStylesReplaceDefault`.
286
- * if mapStylesReplaceDefault is true mapStyles is emptied; loadMapStylesUpdater() will
287
- * populate mapStyles.
288
- *
289
- * @memberof mapStyleUpdaters
290
- * @public
291
- */
292
-
293
-
294
- exports.requestMapStylesUpdater = requestMapStylesUpdater;
295
-
296
- var initMapStyleUpdater = function initMapStyleUpdater(state, _ref7) {
297
- var _ref7$payload = _ref7.payload,
298
- payload = _ref7$payload === void 0 ? {} : _ref7$payload;
299
- return _objectSpread(_objectSpread({}, state), {}, {
300
- // save mapbox access token to map style state
301
- mapboxApiAccessToken: payload.mapboxApiAccessToken || state.mapboxApiAccessToken,
302
- mapboxApiUrl: payload.mapboxApiUrl || state.mapboxApiUrl,
303
- mapStyles: !payload.mapStylesReplaceDefault ? state.mapStyles : {},
304
- mapStylesReplaceDefault: payload.mapStylesReplaceDefault || false
305
- });
306
- }; // });
307
-
308
- /**
309
- * Update `visibleLayerGroups`to change layer group visibility
310
- * @memberof mapStyleUpdaters
311
- * @public
312
- */
313
-
314
-
315
- exports.initMapStyleUpdater = initMapStyleUpdater;
316
-
317
- var mapConfigChangeUpdater = function mapConfigChangeUpdater(state, action) {
318
- return _objectSpread(_objectSpread(_objectSpread({}, state), action.payload), getMapStyles(_objectSpread(_objectSpread({}, state), action.payload)));
319
- };
320
-
321
- exports.mapConfigChangeUpdater = mapConfigChangeUpdater;
322
-
323
- var hasStyleObject = function hasStyleObject(style) {
324
- return (0, _utils.isPlainObject)(style === null || style === void 0 ? void 0 : style.style);
325
- };
326
- /**
327
- * Change to another map style. The selected style should already been loaded into `mapStyle.mapStyles`
328
- * @memberof mapStyleUpdaters
329
- * @public
330
- */
331
-
332
-
333
- var mapStyleChangeUpdater = function mapStyleChangeUpdater(state, _ref8) {
334
- var _state$mapStyles$styl, _state$mapStyles$styl2;
335
-
336
- var _ref8$payload = _ref8.payload,
337
- styleType = _ref8$payload.styleType,
338
- onSuccess = _ref8$payload.onSuccess;
339
-
340
- if ( // we might not have received the style yet
341
- !state.mapStyles[styleType] || // or if it is a managed custom style asset
342
- // and if it has not been hydrated with URL info yet (during app first initialization)
343
- // and it does not have a style object (during adding a custom style)
344
- ((_state$mapStyles$styl = state.mapStyles[styleType]) === null || _state$mapStyles$styl === void 0 ? void 0 : _state$mapStyles$styl.custom) === 'MANAGED' && !((_state$mapStyles$styl2 = state.mapStyles[styleType]) !== null && _state$mapStyles$styl2 !== void 0 && _state$mapStyles$styl2.url) && !hasStyleObject(state.mapStyles[styleType])) {
345
- return state;
346
- }
347
-
348
- if (!hasStyleObject(state.mapStyles[styleType])) {
349
- // style hasn't loaded yet
350
- return requestMapStylesUpdater(_objectSpread(_objectSpread({}, state), {}, {
351
- styleType: styleType
352
- }), {
353
- payload: {
354
- mapStyles: (0, _defineProperty2["default"])({}, styleType, state.mapStyles[styleType]),
355
- onSuccess: onSuccess
356
- }
357
- });
358
- }
359
-
360
- var defaultLGVisibility = (0, _utils.getDefaultLayerGroupVisibility)(state.mapStyles[styleType]);
361
- var visibleLayerGroups = (0, _utils.mergeLayerGroupVisibility)(defaultLGVisibility, state.visibleLayerGroups);
362
- var threeDBuildingColor = state.custom3DBuildingColor ? state.threeDBuildingColor : get3DBuildingColor(state.mapStyles[styleType]); // determine new backgroundColor from either previous state basemap style, previous state backgroundColor, or the DEFAULT_BACKGROUND_COLOR
363
-
364
- var backgroundColor = getBackgroundColor(state, styleType);
365
- return _objectSpread(_objectSpread({}, state), {}, {
366
- styleType: styleType,
367
- visibleLayerGroups: visibleLayerGroups,
368
- threeDBuildingColor: threeDBuildingColor,
369
- backgroundColor: backgroundColor
370
- }, getMapStyles(_objectSpread(_objectSpread({}, state), {}, {
371
- visibleLayerGroups: visibleLayerGroups,
372
- styleType: styleType
373
- })));
374
- };
375
- /**
376
- * Callback when load map style success
377
- * @memberof mapStyleUpdaters
378
- * @public
379
- */
380
-
381
-
382
- exports.mapStyleChangeUpdater = mapStyleChangeUpdater;
383
-
384
- var loadMapStylesUpdater = function loadMapStylesUpdater(state, action) {
385
- var _ref9 = action.payload || {},
386
- newStyles = _ref9.newStyles,
387
- onSuccess = _ref9.onSuccess;
388
-
389
- var addLayerGroups = Object.keys(newStyles).reduce(function (accu, id) {
390
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, _objectSpread(_objectSpread({}, newStyles[id]), {}, {
391
- layerGroups: newStyles[id].layerGroups || getLayerGroupsFromStyle(newStyles[id].style)
392
- })));
393
- }, {}); // reset isLoading
394
-
395
- var isLoading = Object.keys(state.isLoading).reduce(function (accu, key) {
396
- return _objectSpread(_objectSpread({}, accu), state.isLoading[key] && hasStyleObject(newStyles[key]) ? (0, _defineProperty2["default"])({}, key, false) : (0, _defineProperty2["default"])({}, key, state.isLoading[key]));
397
- }, {}); // add new styles to state
398
-
399
- var newState = _objectSpread(_objectSpread({}, state), {}, {
400
- isLoading: isLoading,
401
- mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), addLayerGroups)
402
- });
403
-
404
- var tasks = createActionTask(onSuccess, {
405
- styleType: state.styleType
406
- });
407
- var nextState = newStyles[state.styleType] ? mapStyleChangeUpdater(newState, {
408
- payload: {
409
- styleType: state.styleType
410
- }
411
- }) : newState;
412
- return tasks ? (0, _tasks.withTask)(nextState, tasks) : nextState;
413
- };
414
-
415
- exports.loadMapStylesUpdater = loadMapStylesUpdater;
416
-
417
- function createActionTask(action, payload) {
418
- if (typeof action === 'function') {
419
- return (0, _tasks2.ACTION_TASK)().map(function (_) {
420
- return action(payload);
421
- });
422
- }
423
-
424
- return null;
425
- }
426
- /**
427
- * Callback when load map style error
428
- * @memberof mapStyleUpdaters
429
- * @public
430
- */
431
- // do nothing for now, if didn't load, skip it
432
-
433
-
434
- var loadMapStyleErrUpdater = function loadMapStyleErrUpdater(state, _ref12) {
435
- var _ref12$payload = _ref12.payload,
436
- ids = _ref12$payload.ids,
437
- error = _ref12$payload.error;
438
-
439
- _console["default"].error(error); // reset isLoading
440
-
441
-
442
- var isLoading = Object.keys(state.isLoading).reduce(function (accu, key) {
443
- return _objectSpread(_objectSpread({}, accu), state.isLoading[key] && (ids || []).includes(key) ? (0, _defineProperty2["default"])({}, key, false) : (0, _defineProperty2["default"])({}, key, state.isLoading[key]));
444
- }, {});
445
- return _objectSpread(_objectSpread({}, state), {}, {
446
- isLoading: isLoading
447
- });
448
- };
449
- /**
450
- * Load map style object when pass in saved map config
451
- * @memberof mapStyleUpdaters
452
- * @param state `mapStyle`
453
- * @param action
454
- * @param action.payload saved map config `{mapStyle, visState, mapState}`
455
- * @returns nextState or `react-pam` tasks to load map style object
456
- */
457
-
458
-
459
- exports.loadMapStyleErrUpdater = loadMapStyleErrUpdater;
460
-
461
- var receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref15) {
462
- var config = _ref15.payload.config;
463
-
464
- var _ref16 = config || {},
465
- mapStyle = _ref16.mapStyle;
466
-
467
- if (!mapStyle) {
468
- return state;
469
- } // merge default mapStyles
470
-
471
-
472
- var merged = mapStyle.mapStyles ? _objectSpread(_objectSpread({}, mapStyle), {}, {
473
- mapStyles: _objectSpread(_objectSpread({}, mapStyle.mapStyles), state.mapStyles)
474
- }) : mapStyle; // set custom3DBuildingColor: true if mapStyle contains threeDBuildingColor
475
- // @ts-expect-error
476
-
477
- merged.custom3DBuildingColor = // @ts-expect-error
478
- Boolean(mapStyle.threeDBuildingColor) || merged.custom3DBuildingColor;
479
- var newState = mapConfigChangeUpdater(state, {
480
- payload: merged
481
- });
482
- return mapStyleChangeUpdater(newState, {
483
- payload: {
484
- styleType: newState.styleType
485
- }
486
- });
487
- };
488
-
489
- exports.receiveMapConfigUpdater = receiveMapConfigUpdater;
490
-
491
- function getLoadMapStyleTasks(mapStyles, mapboxApiAccessToken, mapboxApiUrl, onSuccess) {
492
- return [_tasks["default"].all(Object.values(mapStyles) // @ts-expect-error
493
- .map(function (_ref17) {
494
- var id = _ref17.id,
495
- url = _ref17.url,
496
- accessToken = _ref17.accessToken;
497
- return {
498
- id: id,
499
- url: (0, _utils.isValidStyleUrl)(url) ? (0, _utils.getStyleDownloadUrl)(url, accessToken || mapboxApiAccessToken, mapboxApiUrl) : url
500
- };
501
- }).map(_tasks2.LOAD_MAP_STYLE_TASK)).bimap( // success
502
- function (results) {
503
- return (0, _actions.loadMapStyles)(results.reduce(function (accu, _ref18) {
504
- var id = _ref18.id,
505
- style = _ref18.style;
506
- return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, _objectSpread(_objectSpread({}, mapStyles[id]), {}, {
507
- style: style
508
- })));
509
- }, {}), onSuccess);
510
- }, // error
511
- function (err) {
512
- return (0, _actions.loadMapStyleErr)(Object.keys(mapStyles), err);
513
- })];
514
- }
515
- /**
516
- * Reset map style config to initial state
517
- * @memberof mapStyleUpdaters
518
- * @param state `mapStyle`
519
- * @returns nextState
520
- * @public
521
- */
522
-
523
-
524
- var resetMapConfigMapStyleUpdater = function resetMapConfigMapStyleUpdater(state) {
525
- var emptyConfig = _objectSpread(_objectSpread(_objectSpread({}, INITIAL_MAP_STYLE), {}, {
526
- mapboxApiAccessToken: state.mapboxApiAccessToken,
527
- mapboxApiUrl: state.mapboxApiUrl,
528
- mapStylesReplaceDefault: state.mapStylesReplaceDefault
529
- }, state.initialState), {}, {
530
- mapStyles: state.mapStyles,
531
- initialState: state.initialState
532
- });
533
-
534
- return mapStyleChangeUpdater(emptyConfig, {
535
- payload: {
536
- styleType: emptyConfig.styleType
537
- }
538
- });
539
- };
540
- /**
541
- * Callback when a custom map style object is received
542
- * @memberof mapStyleUpdaters
543
- * @public
544
- */
545
-
546
-
547
- exports.resetMapConfigMapStyleUpdater = resetMapConfigMapStyleUpdater;
548
-
549
- var loadCustomMapStyleUpdater = function loadCustomMapStyleUpdater(state, _ref19) {
550
- var _ref19$payload = _ref19.payload,
551
- icon = _ref19$payload.icon,
552
- style = _ref19$payload.style,
553
- error = _ref19$payload.error;
554
- return _objectSpread(_objectSpread({}, state), {}, {
555
- // @ts-expect-error
556
- inputStyle: _objectSpread(_objectSpread(_objectSpread(_objectSpread({}, state.inputStyle), style ? {
557
- id: state.inputStyle.custom === 'MANAGED' ? state.inputStyle.id // custom MANAGED type
558
- : // @ts-expect-error
559
- style.id || (0, _utils.generateHashId)(),
560
- // custom LOCAL type
561
- // make a copy of the style object
562
- style: (0, _lodash["default"])(style),
563
- // @ts-expect-error
564
- label: state.inputStyle.label || style.name,
565
- // gathering layer group info from style json
566
- layerGroups: getLayerGroupsFromStyle(style)
567
- } : {}), icon ? {
568
- icon: icon
569
- } : {}), error ? {
570
- error: error
571
- } : {})
572
- });
573
- };
574
- /**
575
- * Input a custom map style object
576
- * @memberof mapStyleUpdaters
577
- * @public
578
- */
579
-
580
-
581
- exports.loadCustomMapStyleUpdater = loadCustomMapStyleUpdater;
582
-
583
- var inputMapStyleUpdater = function inputMapStyleUpdater(state, _ref20) {
584
- var _updated$icon;
585
-
586
- var _ref20$payload = _ref20.payload,
587
- inputStyle = _ref20$payload.inputStyle,
588
- mapState = _ref20$payload.mapState;
589
-
590
- var updated = _objectSpread(_objectSpread({}, state.inputStyle), inputStyle); // differentiate between either a url to hosted style json that needs an icon url,
591
- // or an icon already available client-side as a data uri
592
-
593
-
594
- var isValidUrl = (0, _utils.isValidStyleUrl)(updated.url);
595
- var isUpdatedIconDataUri = (_updated$icon = updated.icon) === null || _updated$icon === void 0 ? void 0 : _updated$icon.startsWith('data:image');
596
- var isValid = isValidUrl || Boolean(updated.uploadedFile);
597
- var icon = isValidUrl && !isUpdatedIconDataUri ? (0, _utils.getStyleImageIcon)({
598
- mapState: mapState,
599
- styleUrl: updated.url || '',
600
- mapboxApiAccessToken: updated.accessToken || state.mapboxApiAccessToken || '',
601
- mapboxApiUrl: state.mapboxApiUrl || _constants.DEFAULT_MAPBOX_API_URL
602
- }) : updated.icon;
603
- return _objectSpread(_objectSpread({}, state), {}, {
604
- inputStyle: _objectSpread(_objectSpread({}, updated), {}, {
605
- isValid: isValid,
606
- icon: icon
607
- })
608
- });
609
- };
610
- /**
611
- * Add map style from user input to reducer and set it to current style
612
- * This action is called when user click confirm after putting in a valid style url in the custom map style dialog.
613
- * It should not be called from outside kepler.gl without a valid `inputStyle` in the `mapStyle` reducer.
614
- * @memberof mapStyleUpdaters
615
- */
616
-
617
-
618
- exports.inputMapStyleUpdater = inputMapStyleUpdater;
619
-
620
- var addCustomMapStyleUpdater = function addCustomMapStyleUpdater(state) {
621
- var styleId = state.inputStyle.id;
622
- if (!styleId) return state;
623
- var newState = getNewStateWithCustomMapStyle(state); // set new style
624
-
625
- return mapStyleChangeUpdater(newState, {
626
- payload: {
627
- styleType: styleId
628
- }
629
- });
630
- };
631
- /**
632
- * Edit map style from user input to reducer.
633
- * This action is called when user clicks confirm after editing an existing custom style in the custom map style dialog.
634
- * It should not be called from outside kepler.gl without a valid `inputStyle` in the `mapStyle` reducer.
635
- * @memberof mapStyleUpdaters
636
- */
637
-
638
-
639
- exports.addCustomMapStyleUpdater = addCustomMapStyleUpdater;
640
-
641
- var editCustomMapStyleUpdater = function editCustomMapStyleUpdater(state) {
642
- return getNewStateWithCustomMapStyle(state);
643
- };
644
-
645
- exports.editCustomMapStyleUpdater = editCustomMapStyleUpdater;
646
-
647
- function getNewStateWithCustomMapStyle(state) {
648
- var styleId = state.inputStyle.id;
649
- if (!styleId) return state;
650
- return _objectSpread(_objectSpread({}, state), {}, {
651
- // @ts-expect-error Property 'layerGroups' is missing in type 'InputStyle' but required in type 'BaseMapStyle'. Legacy case?
652
- mapStyles: _objectSpread(_objectSpread({}, state.mapStyles), {}, (0, _defineProperty2["default"])({}, styleId, _objectSpread(_objectSpread({}, state.mapStyles[styleId]), state.inputStyle))),
653
- // set to default
654
- inputStyle: getInitialInputStyle()
655
- });
656
- }
657
- /**
658
- * Remove a custom map style from `state.mapStyle.mapStyles`.
659
- * @memberof mapStyleUpdaters
660
- */
661
-
662
-
663
- var removeCustomMapStyleUpdater = function removeCustomMapStyleUpdater(state, action) {
664
- var id = action.payload.id; // eslint-disable-next-line no-unused-vars
665
-
666
- var _state$mapStyles = state.mapStyles,
667
- _ = _state$mapStyles[id],
668
- restOfMapStyles = (0, _objectWithoutProperties2["default"])(_state$mapStyles, [id].map(_toPropertyKey));
669
-
670
- var newState = _objectSpread(_objectSpread({}, state), {}, {
671
- mapStyles: restOfMapStyles
672
- });
673
-
674
- if (state.styleType === id) {
675
- // if removing a custom style that is also the current active base map,
676
- // then reset to the default active base map (`mapStyle.styleType`)
677
- return mapStyleChangeUpdater(newState, {
678
- payload: {
679
- styleType: getDefaultState().styleType
680
- }
681
- });
682
- }
683
-
684
- return newState;
685
- };
686
- /**
687
- * Updates 3d building color
688
- * @memberof mapStyleUpdaters
689
- */
690
-
691
-
692
- exports.removeCustomMapStyleUpdater = removeCustomMapStyleUpdater;
693
-
694
- var set3dBuildingColorUpdater = function set3dBuildingColorUpdater(state, _ref21) {
695
- var color = _ref21.payload;
696
- return _objectSpread(_objectSpread({}, state), {}, {
697
- threeDBuildingColor: color,
698
- custom3DBuildingColor: true
699
- });
700
- };
701
- /**
702
- * Updates background color
703
- * @memberof mapStyleUpdaters
704
- */
705
-
706
-
707
- exports.set3dBuildingColorUpdater = set3dBuildingColorUpdater;
708
-
709
- var setBackgroundColorUpdater = function setBackgroundColorUpdater(state, _ref22) {
710
- var color = _ref22.payload;
711
- return _objectSpread(_objectSpread({}, state), {}, {
712
- backgroundColor: color
713
- });
714
- };
715
- /**
716
- * Return the initial input style
717
- * @return Object
718
- */
719
-
720
-
721
- exports.setBackgroundColorUpdater = setBackgroundColorUpdater;
722
-
723
- function getInitialInputStyle() {
724
- return {
725
- id: null,
726
- accessToken: null,
727
- error: false,
728
- isValid: false,
729
- label: null,
730
- style: null,
731
- url: null,
732
- icon: null,
733
- custom: 'LOCAL',
734
- uploadedFile: null
735
- };
736
- }
737
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9tYXAtc3R5bGUtdXBkYXRlcnMudHMiXSwibmFtZXMiOlsiZ2V0RGVmYXVsdFN0YXRlIiwidmlzaWJsZUxheWVyR3JvdXBzIiwic3R5bGVUeXBlIiwidG9wTGF5ZXJHcm91cHMiLCJtYXBTdHlsZXMiLCJERUZBVUxUX01BUF9TVFlMRVMiLCJyZWR1Y2UiLCJhY2N1IiwiY3VyciIsImlkIiwibWFwYm94QXBpQWNjZXNzVG9rZW4iLCJtYXBib3hBcGlVcmwiLCJERUZBVUxUX01BUEJPWF9BUElfVVJMIiwibWFwU3R5bGVzUmVwbGFjZURlZmF1bHQiLCJpbnB1dFN0eWxlIiwiZ2V0SW5pdGlhbElucHV0U3R5bGUiLCJ0aHJlZURCdWlsZGluZ0NvbG9yIiwiREVGQVVMVF9CTERHX0NPTE9SIiwiY3VzdG9tM0RCdWlsZGluZ0NvbG9yIiwiYmFja2dyb3VuZENvbG9yIiwiREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SIiwiaXNMb2FkaW5nIiwiYm90dG9tTWFwU3R5bGUiLCJ1bmRlZmluZWQiLCJ0b3BNYXBTdHlsZSIsIm1hcFN0eWxlVXBkYXRlcnMiLCJJTklUSUFMX01BUF9TVFlMRSIsImdldE1hcFN0eWxlcyIsIm1hcFN0eWxlIiwic3R5bGUiLCJlZGl0YWJsZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJoYXNUb3BMYXllciIsInZhbHVlcyIsInNvbWUiLCJ2IiwidG9wTGF5ZXJzIiwia2V5IiwiZmluZExheWVyRmlsbENvbG9yIiwibGF5ZXIiLCJwYWludCIsImdldFBhaW50Q29sb3IiLCJjb2xvciIsIkFycmF5IiwiaXNBcnJheSIsImdldDNEQnVpbGRpbmdDb2xvciIsImJhY2tncm91bmRMYXllciIsImxheWVycyIsImZpbmQiLCJidWlsZGluZ0xheWVyIiwibWF0Y2giLCJidWlsZGluZ0NvbG9yIiwib3BlcmF0aW9uIiwiYWxwaGEiLCJyZ2JPYmoiLCJyIiwiZyIsImIiLCJnZXRCYWNrZ3JvdW5kQ29sb3JGcm9tU3R5bGVCYXNlTGF5ZXIiLCJiYWNrdXBCYWNrZ3JvdW5kQ29sb3IiLCJiYXNlTGF5ZXIiLCJCQVNFX01BUF9CQUNLR1JPVU5EX0xBWUVSX0lEUyIsImluY2x1ZGVzIiwiYmFja2dyb3VuZENvbG9yT2ZCYXNlTGF5ZXIiLCJuZXdCYWNrZ3JvdW5kQ29sb3IiLCJuZXdCYWNrZ3JvdW5kQ29sb3JBc1JHQkFycmF5IiwibWFwIiwiY2hhbm5lbE51bWJlciIsIk1hdGgiLCJyb3VuZCIsImdldEJhY2tncm91bmRDb2xvciIsInByZXZpb3VzU3RhdGUiLCJwcmV2aW91c1N0YXRlTWFwU3R5bGUiLCJOT19NQVBfSUQiLCJnZXRMYXllckdyb3Vwc0Zyb21TdHlsZSIsIkRFRkFVTFRfTEFZRVJfR1JPVVBTIiwiZmlsdGVyIiwibGciLCJyZXF1ZXN0TWFwU3R5bGVzVXBkYXRlciIsInN0YXRlIiwicGF5bG9hZCIsIm9uU3VjY2VzcyIsInRvTG9hZCIsImxvYWRNYXBTdHlsZVRhc2tzIiwiZ2V0TG9hZE1hcFN0eWxlVGFza3MiLCJuZXh0U3RhdGUiLCJpbml0TWFwU3R5bGVVcGRhdGVyIiwibWFwQ29uZmlnQ2hhbmdlVXBkYXRlciIsImFjdGlvbiIsImhhc1N0eWxlT2JqZWN0IiwibWFwU3R5bGVDaGFuZ2VVcGRhdGVyIiwiY3VzdG9tIiwidXJsIiwiZGVmYXVsdExHVmlzaWJpbGl0eSIsImxvYWRNYXBTdHlsZXNVcGRhdGVyIiwibmV3U3R5bGVzIiwiYWRkTGF5ZXJHcm91cHMiLCJsYXllckdyb3VwcyIsIm5ld1N0YXRlIiwidGFza3MiLCJjcmVhdGVBY3Rpb25UYXNrIiwiXyIsImxvYWRNYXBTdHlsZUVyclVwZGF0ZXIiLCJpZHMiLCJlcnJvciIsIkNvbnNvbGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsImNvbmZpZyIsIm1lcmdlZCIsIkJvb2xlYW4iLCJUYXNrIiwiYWxsIiwiYWNjZXNzVG9rZW4iLCJMT0FEX01BUF9TVFlMRV9UQVNLIiwiYmltYXAiLCJyZXN1bHRzIiwiZXJyIiwicmVzZXRNYXBDb25maWdNYXBTdHlsZVVwZGF0ZXIiLCJlbXB0eUNvbmZpZyIsImluaXRpYWxTdGF0ZSIsImxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXIiLCJpY29uIiwibGFiZWwiLCJuYW1lIiwiaW5wdXRNYXBTdHlsZVVwZGF0ZXIiLCJtYXBTdGF0ZSIsInVwZGF0ZWQiLCJpc1ZhbGlkVXJsIiwiaXNVcGRhdGVkSWNvbkRhdGFVcmkiLCJzdGFydHNXaXRoIiwiaXNWYWxpZCIsInVwbG9hZGVkRmlsZSIsInN0eWxlVXJsIiwiYWRkQ3VzdG9tTWFwU3R5bGVVcGRhdGVyIiwic3R5bGVJZCIsImdldE5ld1N0YXRlV2l0aEN1c3RvbU1hcFN0eWxlIiwiZWRpdEN1c3RvbU1hcFN0eWxlVXBkYXRlciIsInJlbW92ZUN1c3RvbU1hcFN0eWxlVXBkYXRlciIsInJlc3RPZk1hcFN0eWxlcyIsInNldDNkQnVpbGRpbmdDb2xvclVwZGF0ZXIiLCJzZXRCYWNrZ3JvdW5kQ29sb3JVcGRhdGVyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBR0E7O0FBQ0E7O0FBQ0E7O0FBR0E7O0FBYUE7O0FBU0E7O0FBQ0E7O0FBVUE7Ozs7Ozs7Ozs7QUFnQ0EsSUFBTUEsZUFBZSxHQUFHLFNBQWxCQSxlQUFrQixHQUFnQjtBQUN0QyxNQUFNQyxrQkFBa0IsR0FBRyxFQUEzQjtBQUNBLE1BQU1DLFNBQVMsR0FBRyxhQUFsQjtBQUNBLE1BQU1DLGNBQWMsR0FBRyxFQUF2QjtBQUVBLFNBQU87QUFDTEQsSUFBQUEsU0FBUyxFQUFUQSxTQURLO0FBRUxELElBQUFBLGtCQUFrQixFQUFsQkEsa0JBRks7QUFHTEUsSUFBQUEsY0FBYyxFQUFkQSxjQUhLO0FBSUxDLElBQUFBLFNBQVMsRUFBRUMsOEJBQW1CQyxNQUFuQixDQUNULFVBQUNDLElBQUQsRUFBT0MsSUFBUDtBQUFBLDZDQUNLRCxJQURMLDRDQUVHQyxJQUFJLENBQUNDLEVBRlIsRUFFYUQsSUFGYjtBQUFBLEtBRFMsRUFLVCxFQUxTLENBSk47QUFXTDtBQUNBRSxJQUFBQSxvQkFBb0IsRUFBRSxJQVpqQjtBQWFMQyxJQUFBQSxZQUFZLEVBQUVDLGlDQWJUO0FBY0xDLElBQUFBLHVCQUF1QixFQUFFLEtBZHBCO0FBZUxDLElBQUFBLFVBQVUsRUFBRUMsb0JBQW9CLEVBZjNCO0FBZ0JMQyxJQUFBQSxtQkFBbUIsRUFBRSxxQkFBU0MsNkJBQVQsQ0FoQmhCO0FBaUJMQyxJQUFBQSxxQkFBcUIsRUFBRSxLQWpCbEI7QUFrQkxDLElBQUFBLGVBQWUsRUFBRSxxQkFBU0MsbUNBQVQsQ0FsQlo7QUFtQkxDLElBQUFBLFNBQVMsRUFBRSxFQW5CTjtBQW9CTEMsSUFBQUEsY0FBYyxFQUFFQyxTQXBCWDtBQXFCTEMsSUFBQUEsV0FBVyxFQUFFRDtBQXJCUixHQUFQO0FBdUJELENBNUJEO0FBOEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFDQTtBQUNBOzs7QUFDQSxJQUFNRSxnQkFBZ0IsR0FBRyxJQUF6QjtBQUNBOztBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUNPLElBQU1DLGlCQUEyQixHQUFHMUIsZUFBZSxFQUFuRDs7O0FBU1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ08sU0FBUzJCLFlBQVQsT0FLZTtBQUFBLE1BSnBCekIsU0FJb0IsUUFKcEJBLFNBSW9CO0FBQUEsTUFIcEJELGtCQUdvQixRQUhwQkEsa0JBR29CO0FBQUEsTUFGcEJFLGNBRW9CLFFBRnBCQSxjQUVvQjtBQUFBLE1BRHBCQyxTQUNvQixRQURwQkEsU0FDb0I7QUFDcEIsTUFBTXdCLFFBQVEsR0FBR3hCLFNBQVMsQ0FBQ0YsU0FBRCxDQUExQixDQURvQixDQUdwQjs7QUFDQSxNQUFJLENBQUMwQixRQUFELElBQWEsQ0FBQ0EsUUFBUSxDQUFDQyxLQUEzQixFQUFrQztBQUNoQyxXQUFPLEVBQVA7QUFDRDs7QUFFRCxNQUFNQyxRQUFRLEdBQUdDLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZL0Isa0JBQVosRUFBZ0NnQyxNQUFqRDtBQUVBLE1BQU1YLGNBQWMsR0FBRyxDQUFDUSxRQUFELEdBQ25CRixRQUFRLENBQUNDLEtBRFUsR0FFbkIsK0JBQW1CO0FBQ2pCcEIsSUFBQUEsRUFBRSxFQUFFUCxTQURhO0FBRWpCMEIsSUFBQUEsUUFBUSxFQUFSQSxRQUZpQjtBQUdqQjNCLElBQUFBLGtCQUFrQixFQUFsQkE7QUFIaUIsR0FBbkIsQ0FGSjtBQVFBLE1BQU1pQyxXQUFXLEdBQUdKLFFBQVEsR0FBRyxDQUFYLElBQWdCQyxNQUFNLENBQUNJLE1BQVAsQ0FBY2hDLGNBQWQsRUFBOEJpQyxJQUE5QixDQUFtQyxVQUFBQyxDQUFDO0FBQUEsV0FBSUEsQ0FBSjtBQUFBLEdBQXBDLENBQXBDLENBbEJvQixDQW9CcEI7O0FBQ0EsTUFBTUMsU0FBUyxHQUNiSixXQUFXLElBQ1hILE1BQU0sQ0FBQ0MsSUFBUCxDQUFZN0IsY0FBWixFQUE0QkcsTUFBNUIsQ0FDRSxVQUFDQyxJQUFELEVBQU9nQyxHQUFQO0FBQUEsMkNBQ0toQyxJQURMLDRDQUVHZ0MsR0FGSCxFQUVTcEMsY0FBYyxDQUFDb0MsR0FBRCxDQUFkLElBQXVCdEMsa0JBQWtCLENBQUNzQyxHQUFELENBRmxEO0FBQUEsR0FERixFQUtFLEVBTEYsQ0FGRjtBQVVBLE1BQU1mLFdBQVcsR0FBR1UsV0FBVyxHQUMzQiw0QkFBZ0I7QUFDZHpCLElBQUFBLEVBQUUsRUFBRVAsU0FEVTtBQUVkMEIsSUFBQUEsUUFBUSxFQUFSQSxRQUZjO0FBR2QzQixJQUFBQSxrQkFBa0IsRUFBRXFDO0FBSE4sR0FBaEIsQ0FEMkIsR0FNM0IsSUFOSjtBQVFBLFNBQU87QUFBQ2hCLElBQUFBLGNBQWMsRUFBZEEsY0FBRDtBQUFpQkUsSUFBQUEsV0FBVyxFQUFYQSxXQUFqQjtBQUE4Qk0sSUFBQUEsUUFBUSxFQUFSQTtBQUE5QixHQUFQO0FBQ0Q7O0FBRUQsU0FBU1Usa0JBQVQsQ0FBNEJDLEtBQTVCLEVBQW1DO0FBQ2pDLFNBQU9BLEtBQUssSUFBSUEsS0FBSyxDQUFDQyxLQUFmLElBQXdCRCxLQUFLLENBQUNDLEtBQU4sQ0FBWSxrQkFBWixDQUEvQjtBQUNELEMsQ0FFRDtBQUNBO0FBQ0E7OztBQUNBLFNBQVNDLGFBQVQsQ0FBdUJDLEtBQXZCLEVBQThCO0FBQzVCLE1BQUlDLEtBQUssQ0FBQ0MsT0FBTixDQUFjRixLQUFkLEtBQXdCQSxLQUFLLENBQUMsQ0FBRCxDQUFMLEtBQWEsYUFBekMsRUFBd0Q7QUFDdEQ7QUFDQTtBQUNBLFdBQU9BLEtBQUssQ0FBQyxDQUFELENBQVo7QUFDRDs7QUFDRCxTQUFPQSxLQUFQO0FBQ0Q7O0FBRUQsU0FBU0csa0JBQVQsQ0FBNEJsQixLQUE1QixFQUE2QztBQUMzQztBQUNBLE1BQUksQ0FBQ0EsS0FBSyxDQUFDQSxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8scUJBQVNaLDZCQUFULENBQVA7QUFDRDs7QUFFRCxNQUFNK0IsZUFBZSxHQUFHLENBQUNuQixLQUFLLENBQUNBLEtBQU4sQ0FBWW9CLE1BQVosSUFBc0IsRUFBdkIsRUFBMkJDLElBQTNCLENBQWdDO0FBQUEsUUFBRXpDLEVBQUYsU0FBRUEsRUFBRjtBQUFBLFdBQVVBLEVBQUUsS0FBSyxZQUFqQjtBQUFBLEdBQWhDLENBQXhCO0FBRUEsTUFBTTBDLGFBQWEsR0FBRyxDQUFDdEIsS0FBSyxDQUFDQSxLQUFOLENBQVlvQixNQUFaLElBQXNCLEVBQXZCLEVBQTJCQyxJQUEzQixDQUFnQztBQUFBLFFBQUV6QyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxXQUFVQSxFQUFFLENBQUMyQyxLQUFILENBQVMsVUFBVCxDQUFWO0FBQUEsR0FBaEMsQ0FBdEI7O0FBRUEsTUFBTUMsYUFBYSxHQUNqQmIsa0JBQWtCLENBQUNXLGFBQUQsQ0FBbEIsSUFBcUNYLGtCQUFrQixDQUFDUSxlQUFELENBQXZELElBQTRFL0IsNkJBRDlFLENBVjJDLENBYTNDOzs7QUFDQSxNQUFNcUMsU0FBUyxHQUFHekIsS0FBSyxDQUFDcEIsRUFBTixDQUFTMkMsS0FBVCxDQUFlLGtCQUFmLElBQXFDLFVBQXJDLEdBQWtELFFBQXBFO0FBRUEsTUFBTUcsS0FBSyxHQUFHLEdBQWQ7QUFDQSxNQUFNQyxNQUFNLEdBQUcsa0JBQUlILGFBQUosRUFBbUJDLFNBQW5CLEVBQThCLENBQUNDLEtBQUQsQ0FBOUIsQ0FBZjtBQUNBLFNBQU8sQ0FBQ0MsTUFBTSxDQUFDQyxDQUFSLEVBQVdELE1BQU0sQ0FBQ0UsQ0FBbEIsRUFBcUJGLE1BQU0sQ0FBQ0csQ0FBNUIsQ0FBUDtBQUNEOztBQUVELFNBQVNDLG9DQUFULENBQ0UvQixLQURGLEVBRUVnQyxxQkFGRixFQUdZO0FBQUE7O0FBQ1YsTUFBSSxDQUFDaEMsS0FBSyxDQUFDQSxLQUFYLEVBQWtCO0FBQ2hCLFdBQU8sNEJBQWdCZ0MscUJBQWhCLEtBQTBDQSxxQkFBakQ7QUFDRCxHQUhTLENBS1Y7OztBQUNBLE1BQU1DLFNBQVMsR0FBRyxDQUFDakMsS0FBSyxDQUFDQSxLQUFOLENBQVlvQixNQUFaLElBQXNCLEVBQXZCLEVBQTJCQyxJQUEzQixDQUFnQztBQUFBLFFBQUV6QyxFQUFGLFNBQUVBLEVBQUY7QUFBQSxXQUNoRHNELHlDQUE4QkMsUUFBOUIsQ0FBdUN2RCxFQUF2QyxDQURnRDtBQUFBLEdBQWhDLENBQWxCO0FBSUEsTUFBTXdELDBCQUEwQixHQUFHdEIsYUFBYSxDQUFDSCxrQkFBa0IsQ0FBQ3NCLFNBQUQsQ0FBbkIsQ0FBaEQ7QUFFQSxNQUFNSSxrQkFBa0IsR0FDdEIsT0FBT0QsMEJBQVAsS0FBc0MsUUFBdEMsR0FDSUEsMEJBREosR0FFSUoscUJBSE47QUFLQSxNQUFNTSw0QkFBNEIsdUJBQUcsNEJBQWdCRCxrQkFBaEIsQ0FBSCxDQUNoQztBQUNBO0FBQ0E7QUFIZ0MsdURBQUcsaUJBSWpDRSxHQUppQyxDQUk3QixVQUFBQyxhQUFhO0FBQUEsV0FBSUMsSUFBSSxDQUFDQyxLQUFMLENBQVdGLGFBQVgsQ0FBSjtBQUFBLEdBSmdCLENBQXJDO0FBTUEsU0FBT0YsNEJBQTRCLElBQUlOLHFCQUF2QztBQUNELEMsQ0FFRDs7O0FBQ0EsU0FBU1csa0JBQVQsQ0FBNEJDLGFBQTVCLEVBQXFEdkUsU0FBckQsRUFBd0U7QUFDdEUsTUFBTXdFLHFCQUFxQixHQUFHRCxhQUFhLENBQUNyRSxTQUFkLENBQXdCcUUsYUFBYSxDQUFDdkUsU0FBdEMsQ0FBOUI7QUFDQSxNQUFNMkQscUJBQXFCLEdBQUdZLGFBQWEsQ0FBQ3RELGVBQWQsSUFBaUNDLG1DQUEvRDtBQUNBLE1BQU1ELGVBQWUsR0FDbkJqQixTQUFTLEtBQUt5RSxvQkFBZCxHQUNJO0FBQ0E7QUFDQTtBQUNBZixFQUFBQSxvQ0FBb0MsQ0FBQ2MscUJBQUQsRUFBd0JiLHFCQUF4QixDQUp4QyxHQUtJO0FBQ0E7QUFDQUEsRUFBQUEscUJBUk47QUFVQSxTQUFPMUMsZUFBUDtBQUNEOztBQUVELFNBQVN5RCx1QkFBVCxDQUFpQy9DLEtBQWpDLEVBQXdDO0FBQ3RDLFNBQU9nQixLQUFLLENBQUNDLE9BQU4sQ0FBY2pCLEtBQWQsYUFBY0EsS0FBZCx1QkFBY0EsS0FBSyxDQUFFb0IsTUFBckIsSUFDSDRCLGdDQUFxQkMsTUFBckIsQ0FBNEIsVUFBQUMsRUFBRTtBQUFBLFdBQUlsRCxLQUFLLENBQUNvQixNQUFOLENBQWE2QixNQUFiLENBQW9CQyxFQUFFLENBQUNELE1BQXZCLEVBQStCN0MsTUFBbkM7QUFBQSxHQUE5QixDQURHLEdBRUgsRUFGSjtBQUdELEMsQ0FFRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTStDLHVCQUF1QixHQUFHLFNBQTFCQSx1QkFBMEIsQ0FDckNDLEtBRHFDLFNBR3hCO0FBQUEsNEJBRFpDLE9BQ1k7QUFBQSxNQURGOUUsU0FDRSxpQkFERkEsU0FDRTtBQUFBLE1BRFMrRSxTQUNULGlCQURTQSxTQUNUO0FBQ2IsTUFBTUMsTUFBTSxHQUFHckQsTUFBTSxDQUFDQyxJQUFQLENBQVk1QixTQUFaLEVBQXVCRSxNQUF2QixDQUNiLFVBQUNDLElBQUQsRUFBT0UsRUFBUDtBQUFBLDJDQUNLRixJQURMLEdBRU0sQ0FBQzBFLEtBQUssQ0FBQzVELFNBQU4sQ0FBZ0JaLEVBQWhCLENBQUQsd0NBQXlCQSxFQUF6QixFQUE4QkwsU0FBUyxDQUFDSyxFQUFELENBQXZDLElBQStDLEVBRnJEO0FBQUEsR0FEYSxFQUtiLEVBTGEsQ0FBZjtBQU9BLE1BQU00RSxpQkFBaUIsR0FBR0Msb0JBQW9CLENBQzVDRixNQUQ0QyxFQUU1Q0gsS0FBSyxDQUFDdkUsb0JBRnNDLEVBRzVDdUUsS0FBSyxDQUFDdEUsWUFIc0MsRUFJNUN3RSxTQUo0QyxDQUE5QztBQU9BLE1BQU05RCxTQUFTLEdBQUdVLE1BQU0sQ0FBQ0MsSUFBUCxDQUFZb0QsTUFBWixFQUFvQjlFLE1BQXBCLENBQ2hCLFVBQUNDLElBQUQsRUFBT2dDLEdBQVA7QUFBQSwyQ0FDS2hDLElBREwsNENBRUdnQyxHQUZILEVBRVMsSUFGVDtBQUFBLEdBRGdCLEVBS2hCLEVBTGdCLENBQWxCOztBQU9BLE1BQU1nRCxTQUFTLG1DQUNWTixLQURVO0FBRWI1RCxJQUFBQSxTQUFTLEVBQVRBO0FBRmEsSUFBZjs7QUFJQSxTQUFPLHFCQUFTa0UsU0FBVCxFQUFvQkYsaUJBQXBCLENBQVA7QUFDRCxDQTlCTTtBQWdDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1HLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBc0IsQ0FDakNQLEtBRGlDO0FBQUEsNEJBRy9CQyxPQUgrQjtBQUFBLE1BRy9CQSxPQUgrQiw4QkFHckIsRUFIcUI7QUFBQSx5Q0FTOUJELEtBVDhCO0FBVWpDO0FBQ0F2RSxJQUFBQSxvQkFBb0IsRUFBRXdFLE9BQU8sQ0FBQ3hFLG9CQUFSLElBQWdDdUUsS0FBSyxDQUFDdkUsb0JBWDNCO0FBWWpDQyxJQUFBQSxZQUFZLEVBQUV1RSxPQUFPLENBQUN2RSxZQUFSLElBQXdCc0UsS0FBSyxDQUFDdEUsWUFaWDtBQWFqQ1AsSUFBQUEsU0FBUyxFQUFFLENBQUM4RSxPQUFPLENBQUNyRSx1QkFBVCxHQUFtQ29FLEtBQUssQ0FBQzdFLFNBQXpDLEdBQXFELEVBYi9CO0FBY2pDUyxJQUFBQSx1QkFBdUIsRUFBRXFFLE9BQU8sQ0FBQ3JFLHVCQUFSLElBQW1DO0FBZDNCO0FBQUEsQ0FBNUIsQyxDQWdCUDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU00RSxzQkFBc0IsR0FBRyxTQUF6QkEsc0JBQXlCLENBQ3BDUixLQURvQyxFQUVwQ1MsTUFGb0MsRUFHdkI7QUFDYix1REFDS1QsS0FETCxHQUVLUyxNQUFNLENBQUNSLE9BRlosR0FHS3ZELFlBQVksaUNBQ1ZzRCxLQURVLEdBRVZTLE1BQU0sQ0FBQ1IsT0FGRyxFQUhqQjtBQVFELENBWk07Ozs7QUFjUCxJQUFNUyxjQUFjLEdBQUcsU0FBakJBLGNBQWlCLENBQUE5RCxLQUFLO0FBQUEsU0FBSSwwQkFBY0EsS0FBZCxhQUFjQSxLQUFkLHVCQUFjQSxLQUFLLENBQUVBLEtBQXJCLENBQUo7QUFBQSxDQUE1QjtBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU0rRCxxQkFBcUIsR0FBRyxTQUF4QkEscUJBQXdCLENBQ25DWCxLQURtQyxTQUd0QjtBQUFBOztBQUFBLDRCQURaQyxPQUNZO0FBQUEsTUFERmhGLFNBQ0UsaUJBREZBLFNBQ0U7QUFBQSxNQURTaUYsU0FDVCxpQkFEU0EsU0FDVDs7QUFDYixPQUNFO0FBQ0EsR0FBQ0YsS0FBSyxDQUFDN0UsU0FBTixDQUFnQkYsU0FBaEIsQ0FBRCxJQUNBO0FBQ0E7QUFDQTtBQUNDLDRCQUFBK0UsS0FBSyxDQUFDN0UsU0FBTixDQUFnQkYsU0FBaEIsaUZBQTRCMkYsTUFBNUIsTUFBdUMsU0FBdkMsSUFDQyw0QkFBQ1osS0FBSyxDQUFDN0UsU0FBTixDQUFnQkYsU0FBaEIsQ0FBRCxtREFBQyx1QkFBNEI0RixHQUE3QixDQURELElBRUMsQ0FBQ0gsY0FBYyxDQUFDVixLQUFLLENBQUM3RSxTQUFOLENBQWdCRixTQUFoQixDQUFELENBUm5CLEVBU0U7QUFDQSxXQUFPK0UsS0FBUDtBQUNEOztBQUVELE1BQUksQ0FBQ1UsY0FBYyxDQUFDVixLQUFLLENBQUM3RSxTQUFOLENBQWdCRixTQUFoQixDQUFELENBQW5CLEVBQWlEO0FBQy9DO0FBQ0EsV0FBTzhFLHVCQUF1QixpQ0FFdkJDLEtBRnVCO0FBRzFCL0UsTUFBQUEsU0FBUyxFQUFUQTtBQUgwQixRQUs1QjtBQUNFZ0YsTUFBQUEsT0FBTyxFQUFFO0FBQ1A5RSxRQUFBQSxTQUFTLHVDQUNORixTQURNLEVBQ00rRSxLQUFLLENBQUM3RSxTQUFOLENBQWdCRixTQUFoQixDQUROLENBREY7QUFJUGlGLFFBQUFBLFNBQVMsRUFBVEE7QUFKTztBQURYLEtBTDRCLENBQTlCO0FBY0Q7O0FBRUQsTUFBTVksbUJBQW1CLEdBQUcsMkNBQStCZCxLQUFLLENBQUM3RSxTQUFOLENBQWdCRixTQUFoQixDQUEvQixDQUE1QjtBQUVBLE1BQU1ELGtCQUFrQixHQUFHLHNDQUN6QjhGLG1CQUR5QixFQUV6QmQsS0FBSyxDQUFDaEYsa0JBRm1CLENBQTNCO0FBS0EsTUFBTWUsbUJBQTZCLEdBQUdpRSxLQUFLLENBQUMvRCxxQkFBTixHQUNsQytELEtBQUssQ0FBQ2pFLG1CQUQ0QixHQUVsQytCLGtCQUFrQixDQUFDa0MsS0FBSyxDQUFDN0UsU0FBTixDQUFnQkYsU0FBaEIsQ0FBRCxDQUZ0QixDQXZDYSxDQTJDYjs7QUFDQSxNQUFNaUIsZUFBZSxHQUFHcUQsa0JBQWtCLENBQUNTLEtBQUQsRUFBUS9FLFNBQVIsQ0FBMUM7QUFFQSx5Q0FDSytFLEtBREw7QUFFRS9FLElBQUFBLFNBQVMsRUFBVEEsU0FGRjtBQUdFRCxJQUFBQSxrQkFBa0IsRUFBbEJBLGtCQUhGO0FBSUVlLElBQUFBLG1CQUFtQixFQUFuQkEsbUJBSkY7QUFLRUcsSUFBQUEsZUFBZSxFQUFmQTtBQUxGLEtBTUtRLFlBQVksaUNBQ1ZzRCxLQURVO0FBRWJoRixJQUFBQSxrQkFBa0IsRUFBbEJBLGtCQUZhO0FBR2JDLElBQUFBLFNBQVMsRUFBVEE7QUFIYSxLQU5qQjtBQVlELENBN0RNO0FBK0RQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTThGLG9CQUFvQixHQUFHLFNBQXZCQSxvQkFBdUIsQ0FDbENmLEtBRGtDLEVBRWxDUyxNQUZrQyxFQUdyQjtBQUFBLGNBQ2tCQSxNQUFNLENBQUNSLE9BQVAsSUFBa0IsRUFEcEM7QUFBQSxNQUNOZSxTQURNLFNBQ05BLFNBRE07QUFBQSxNQUNLZCxTQURMLFNBQ0tBLFNBREw7O0FBR2IsTUFBTWUsY0FBYyxHQUFHbkUsTUFBTSxDQUFDQyxJQUFQLENBQVlpRSxTQUFaLEVBQXVCM0YsTUFBdkIsQ0FDckIsVUFBQ0MsSUFBRCxFQUFPRSxFQUFQO0FBQUEsMkNBQ0tGLElBREwsNENBRUdFLEVBRkgsa0NBR093RixTQUFTLENBQUN4RixFQUFELENBSGhCO0FBSUkwRixNQUFBQSxXQUFXLEVBQUVGLFNBQVMsQ0FBQ3hGLEVBQUQsQ0FBVCxDQUFjMEYsV0FBZCxJQUE2QnZCLHVCQUF1QixDQUFDcUIsU0FBUyxDQUFDeEYsRUFBRCxDQUFULENBQWNvQixLQUFmO0FBSnJFO0FBQUEsR0FEcUIsRUFRckIsRUFScUIsQ0FBdkIsQ0FIYSxDQWFiOztBQUNBLE1BQU1SLFNBQVMsR0FBR1UsTUFBTSxDQUFDQyxJQUFQLENBQVlpRCxLQUFLLENBQUM1RCxTQUFsQixFQUE2QmYsTUFBN0IsQ0FDaEIsVUFBQ0MsSUFBRCxFQUFPZ0MsR0FBUDtBQUFBLDJDQUNLaEMsSUFETCxHQUVNMEUsS0FBSyxDQUFDNUQsU0FBTixDQUFnQmtCLEdBQWhCLEtBQXdCb0QsY0FBYyxDQUFDTSxTQUFTLENBQUMxRCxHQUFELENBQVYsQ0FBdEMsd0NBQ0VBLEdBREYsRUFDUSxLQURSLHlDQUVFQSxHQUZGLEVBRVEwQyxLQUFLLENBQUM1RCxTQUFOLENBQWdCa0IsR0FBaEIsQ0FGUixDQUZOO0FBQUEsR0FEZ0IsRUFPaEIsRUFQZ0IsQ0FBbEIsQ0FkYSxDQXVCYjs7QUFDQSxNQUFNNkQsUUFBUSxtQ0FDVG5CLEtBRFM7QUFFWjVELElBQUFBLFNBQVMsRUFBVEEsU0FGWTtBQUdaakIsSUFBQUEsU0FBUyxrQ0FDSjZFLEtBQUssQ0FBQzdFLFNBREYsR0FFSjhGLGNBRkk7QUFIRyxJQUFkOztBQVNBLE1BQU1HLEtBQUssR0FBR0MsZ0JBQWdCLENBQUNuQixTQUFELEVBQVk7QUFBQ2pGLElBQUFBLFNBQVMsRUFBRStFLEtBQUssQ0FBQy9FO0FBQWxCLEdBQVosQ0FBOUI7QUFFQSxNQUFNcUYsU0FBUyxHQUFHVSxTQUFTLENBQUNoQixLQUFLLENBQUMvRSxTQUFQLENBQVQsR0FDZDBGLHFCQUFxQixDQUFDUSxRQUFELEVBQVc7QUFBQ2xCLElBQUFBLE9BQU8sRUFBRTtBQUFDaEYsTUFBQUEsU0FBUyxFQUFFK0UsS0FBSyxDQUFDL0U7QUFBbEI7QUFBVixHQUFYLENBRFAsR0FFZGtHLFFBRko7QUFJQSxTQUFPQyxLQUFLLEdBQUcscUJBQVNkLFNBQVQsRUFBb0JjLEtBQXBCLENBQUgsR0FBZ0NkLFNBQTVDO0FBQ0QsQ0EzQ007Ozs7QUE2Q1AsU0FBU2UsZ0JBQVQsQ0FBMEJaLE1BQTFCLEVBQWtDUixPQUFsQyxFQUEyQztBQUN6QyxNQUFJLE9BQU9RLE1BQVAsS0FBa0IsVUFBdEIsRUFBa0M7QUFDaEMsV0FBTywyQkFBY3RCLEdBQWQsQ0FBa0IsVUFBQW1DLENBQUM7QUFBQSxhQUFJYixNQUFNLENBQUNSLE9BQUQsQ0FBVjtBQUFBLEtBQW5CLENBQVA7QUFDRDs7QUFFRCxTQUFPLElBQVA7QUFDRDtBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FBQ08sSUFBTXNCLHNCQUFzQixHQUFHLFNBQXpCQSxzQkFBeUIsQ0FDcEN2QixLQURvQyxVQUd2QjtBQUFBLDhCQURaQyxPQUNZO0FBQUEsTUFERnVCLEdBQ0Usa0JBREZBLEdBQ0U7QUFBQSxNQURHQyxLQUNILGtCQURHQSxLQUNIOztBQUNiQyxzQkFBUUQsS0FBUixDQUFjQSxLQUFkLEVBRGEsQ0FFYjs7O0FBQ0EsTUFBTXJGLFNBQVMsR0FBR1UsTUFBTSxDQUFDQyxJQUFQLENBQVlpRCxLQUFLLENBQUM1RCxTQUFsQixFQUE2QmYsTUFBN0IsQ0FDaEIsVUFBQ0MsSUFBRCxFQUFPZ0MsR0FBUDtBQUFBLDJDQUNLaEMsSUFETCxHQUVNMEUsS0FBSyxDQUFDNUQsU0FBTixDQUFnQmtCLEdBQWhCLEtBQXdCLENBQUNrRSxHQUFHLElBQUksRUFBUixFQUFZekMsUUFBWixDQUFxQnpCLEdBQXJCLENBQXhCLHdDQUNFQSxHQURGLEVBQ1EsS0FEUix5Q0FFRUEsR0FGRixFQUVRMEMsS0FBSyxDQUFDNUQsU0FBTixDQUFnQmtCLEdBQWhCLENBRlIsQ0FGTjtBQUFBLEdBRGdCLEVBT2hCLEVBUGdCLENBQWxCO0FBVUEseUNBQ0swQyxLQURMO0FBRUU1RCxJQUFBQSxTQUFTLEVBQVRBO0FBRkY7QUFJRCxDQXBCTTtBQXNCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU11Rix1QkFBdUIsR0FBRyxTQUExQkEsdUJBQTBCLENBQ3JDM0IsS0FEcUMsVUFReEI7QUFBQSxNQUxENEIsTUFLQyxVQUxYM0IsT0FLVyxDQUxEMkIsTUFLQzs7QUFBQSxlQUNNQSxNQUFNLElBQUksRUFEaEI7QUFBQSxNQUNOakYsUUFETSxVQUNOQSxRQURNOztBQUdiLE1BQUksQ0FBQ0EsUUFBTCxFQUFlO0FBQ2IsV0FBT3FELEtBQVA7QUFDRCxHQUxZLENBT2I7OztBQUNBLE1BQU02QixNQUFNLEdBQUdsRixRQUFRLENBQUN4QixTQUFULG1DQUVOd0IsUUFGTTtBQUdUeEIsSUFBQUEsU0FBUyxrQ0FDSndCLFFBQVEsQ0FBQ3hCLFNBREwsR0FFSjZFLEtBQUssQ0FBQzdFLFNBRkY7QUFIQSxPQVFYd0IsUUFSSixDQVJhLENBa0JiO0FBQ0E7O0FBQ0FrRixFQUFBQSxNQUFNLENBQUM1RixxQkFBUCxHQUNFO0FBQ0E2RixFQUFBQSxPQUFPLENBQUNuRixRQUFRLENBQUNaLG1CQUFWLENBQVAsSUFBeUM4RixNQUFNLENBQUM1RixxQkFGbEQ7QUFHQSxNQUFNa0YsUUFBUSxHQUFHWCxzQkFBc0IsQ0FBQ1IsS0FBRCxFQUFRO0FBQUNDLElBQUFBLE9BQU8sRUFBRTRCO0FBQVYsR0FBUixDQUF2QztBQUVBLFNBQU9sQixxQkFBcUIsQ0FBQ1EsUUFBRCxFQUFXO0FBQUNsQixJQUFBQSxPQUFPLEVBQUU7QUFBQ2hGLE1BQUFBLFNBQVMsRUFBRWtHLFFBQVEsQ0FBQ2xHO0FBQXJCO0FBQVYsR0FBWCxDQUE1QjtBQUNELENBbENNOzs7O0FBb0NQLFNBQVNvRixvQkFBVCxDQUE4QmxGLFNBQTlCLEVBQXlDTSxvQkFBekMsRUFBK0RDLFlBQS9ELEVBQTZFd0UsU0FBN0UsRUFBd0Y7QUFDdEYsU0FBTyxDQUNMNkIsa0JBQUtDLEdBQUwsQ0FDRWxGLE1BQU0sQ0FBQ0ksTUFBUCxDQUFjL0IsU0FBZCxFQUNFO0FBREYsR0FFR2dFLEdBRkgsQ0FFTztBQUFBLFFBQUUzRCxFQUFGLFVBQUVBLEVBQUY7QUFBQSxRQUFNcUYsR0FBTixVQUFNQSxHQUFOO0FBQUEsUUFBV29CLFdBQVgsVUFBV0EsV0FBWDtBQUFBLFdBQTZCO0FBQ2hDekcsTUFBQUEsRUFBRSxFQUFGQSxFQURnQztBQUVoQ3FGLE1BQUFBLEdBQUcsRUFBRSw0QkFBZ0JBLEdBQWhCLElBQ0QsZ0NBQW9CQSxHQUFwQixFQUF5Qm9CLFdBQVcsSUFBSXhHLG9CQUF4QyxFQUE4REMsWUFBOUQsQ0FEQyxHQUVEbUY7QUFKNEIsS0FBN0I7QUFBQSxHQUZQLEVBUUcxQixHQVJILENBUU8rQywyQkFSUCxDQURGLEVBVUVDLEtBVkYsRUFXRTtBQUNBLFlBQUFDLE9BQU87QUFBQSxXQUNMLDRCQUNFQSxPQUFPLENBQUMvRyxNQUFSLENBQ0UsVUFBQ0MsSUFBRDtBQUFBLFVBQVFFLEVBQVIsVUFBUUEsRUFBUjtBQUFBLFVBQVlvQixLQUFaLFVBQVlBLEtBQVo7QUFBQSw2Q0FDS3RCLElBREwsNENBRUdFLEVBRkgsa0NBR09MLFNBQVMsQ0FBQ0ssRUFBRCxDQUhoQjtBQUlJb0IsUUFBQUEsS0FBSyxFQUFMQTtBQUpKO0FBQUEsS0FERixFQVFFLEVBUkYsQ0FERixFQVdFc0QsU0FYRixDQURLO0FBQUEsR0FaVCxFQTBCRTtBQUNBLFlBQUFtQyxHQUFHO0FBQUEsV0FBSSw4QkFBZ0J2RixNQUFNLENBQUNDLElBQVAsQ0FBWTVCLFNBQVosQ0FBaEIsRUFBd0NrSCxHQUF4QyxDQUFKO0FBQUEsR0EzQkwsQ0FESyxDQUFQO0FBK0JEO0FBQ0Q7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQUNPLElBQU1DLDZCQUE2QixHQUFHLFNBQWhDQSw2QkFBZ0MsQ0FBQ3RDLEtBQUQsRUFBK0I7QUFDMUUsTUFBTXVDLFdBQVcsaURBQ1o5RixpQkFEWTtBQUVmaEIsSUFBQUEsb0JBQW9CLEVBQUV1RSxLQUFLLENBQUN2RSxvQkFGYjtBQUdmQyxJQUFBQSxZQUFZLEVBQUVzRSxLQUFLLENBQUN0RSxZQUhMO0FBSWZFLElBQUFBLHVCQUF1QixFQUFFb0UsS0FBSyxDQUFDcEU7QUFKaEIsS0FLWm9FLEtBQUssQ0FBQ3dDLFlBTE07QUFNZnJILElBQUFBLFNBQVMsRUFBRTZFLEtBQUssQ0FBQzdFLFNBTkY7QUFPZnFILElBQUFBLFlBQVksRUFBRXhDLEtBQUssQ0FBQ3dDO0FBUEwsSUFBakI7O0FBVUEsU0FBTzdCLHFCQUFxQixDQUFDNEIsV0FBRCxFQUFjO0FBQUN0QyxJQUFBQSxPQUFPLEVBQUU7QUFBQ2hGLE1BQUFBLFNBQVMsRUFBRXNILFdBQVcsQ0FBQ3RIO0FBQXhCO0FBQVYsR0FBZCxDQUE1QjtBQUNELENBWk07QUFjUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU13SCx5QkFBeUIsR0FBRyxTQUE1QkEseUJBQTRCLENBQ3ZDekMsS0FEdUM7QUFBQSw4QkFFdENDLE9BRnNDO0FBQUEsTUFFNUJ5QyxJQUY0QixrQkFFNUJBLElBRjRCO0FBQUEsTUFFdEI5RixLQUZzQixrQkFFdEJBLEtBRnNCO0FBQUEsTUFFZjZFLEtBRmUsa0JBRWZBLEtBRmU7QUFBQSx5Q0FJcEN6QixLQUpvQztBQUt2QztBQUNBbkUsSUFBQUEsVUFBVSw4REFDTG1FLEtBQUssQ0FBQ25FLFVBREQsR0FHSmUsS0FBSyxHQUNMO0FBQ0VwQixNQUFBQSxFQUFFLEVBQ0F3RSxLQUFLLENBQUNuRSxVQUFOLENBQWlCK0UsTUFBakIsS0FBNEIsU0FBNUIsR0FDSVosS0FBSyxDQUFDbkUsVUFBTixDQUFpQkwsRUFEckIsQ0FDd0I7QUFEeEIsUUFFSTtBQUNBb0IsTUFBQUEsS0FBSyxDQUFDcEIsRUFBTixJQUFZLDRCQUxwQjtBQUtzQztBQUNwQztBQUNBb0IsTUFBQUEsS0FBSyxFQUFFLHdCQUFVQSxLQUFWLENBUFQ7QUFRRTtBQUNBK0YsTUFBQUEsS0FBSyxFQUFFM0MsS0FBSyxDQUFDbkUsVUFBTixDQUFpQjhHLEtBQWpCLElBQTBCL0YsS0FBSyxDQUFDZ0csSUFUekM7QUFVRTtBQUNBMUIsTUFBQUEsV0FBVyxFQUFFdkIsdUJBQXVCLENBQUMvQyxLQUFEO0FBWHRDLEtBREssR0FjTCxFQWpCSSxHQWtCSjhGLElBQUksR0FBRztBQUFDQSxNQUFBQSxJQUFJLEVBQUpBO0FBQUQsS0FBSCxHQUFZLEVBbEJaLEdBbUJKakIsS0FBSyxHQUFHO0FBQUNBLE1BQUFBLEtBQUssRUFBTEE7QUFBRCxLQUFILEdBQWEsRUFuQmQ7QUFONkI7QUFBQSxDQUFsQztBQTZCUDtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1vQixvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQXVCLENBQ2xDN0MsS0FEa0MsVUFHckI7QUFBQTs7QUFBQSw4QkFEWkMsT0FDWTtBQUFBLE1BREZwRSxVQUNFLGtCQURGQSxVQUNFO0FBQUEsTUFEVWlILFFBQ1Ysa0JBRFVBLFFBQ1Y7O0FBQ2IsTUFBTUMsT0FBTyxtQ0FDUi9DLEtBQUssQ0FBQ25FLFVBREUsR0FFUkEsVUFGUSxDQUFiLENBRGEsQ0FNYjtBQUNBOzs7QUFDQSxNQUFNbUgsVUFBVSxHQUFHLDRCQUFnQkQsT0FBTyxDQUFDbEMsR0FBeEIsQ0FBbkI7QUFDQSxNQUFNb0Msb0JBQW9CLG9CQUFHRixPQUFPLENBQUNMLElBQVgsa0RBQUcsY0FBY1EsVUFBZCxDQUF5QixZQUF6QixDQUE3QjtBQUNBLE1BQU1DLE9BQU8sR0FBR0gsVUFBVSxJQUFJbEIsT0FBTyxDQUFDaUIsT0FBTyxDQUFDSyxZQUFULENBQXJDO0FBRUEsTUFBTVYsSUFBSSxHQUNSTSxVQUFVLElBQUksQ0FBQ0Msb0JBQWYsR0FDSSw4QkFBa0I7QUFDaEJILElBQUFBLFFBQVEsRUFBUkEsUUFEZ0I7QUFFaEJPLElBQUFBLFFBQVEsRUFBRU4sT0FBTyxDQUFDbEMsR0FBUixJQUFlLEVBRlQ7QUFHaEJwRixJQUFBQSxvQkFBb0IsRUFBRXNILE9BQU8sQ0FBQ2QsV0FBUixJQUF1QmpDLEtBQUssQ0FBQ3ZFLG9CQUE3QixJQUFxRCxFQUgzRDtBQUloQkMsSUFBQUEsWUFBWSxFQUFFc0UsS0FBSyxDQUFDdEUsWUFBTixJQUFzQkM7QUFKcEIsR0FBbEIsQ0FESixHQU9Jb0gsT0FBTyxDQUFDTCxJQVJkO0FBVUEseUNBQ0sxQyxLQURMO0FBRUVuRSxJQUFBQSxVQUFVLGtDQUNMa0gsT0FESztBQUVSSSxNQUFBQSxPQUFPLEVBQVBBLE9BRlE7QUFHUlQsTUFBQUEsSUFBSSxFQUFKQTtBQUhRO0FBRlo7QUFRRCxDQWpDTTtBQW1DUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FBQ08sSUFBTVksd0JBQXdCLEdBQUcsU0FBM0JBLHdCQUEyQixDQUFDdEQsS0FBRCxFQUErQjtBQUNyRSxNQUFNdUQsT0FBTyxHQUFHdkQsS0FBSyxDQUFDbkUsVUFBTixDQUFpQkwsRUFBakM7QUFDQSxNQUFJLENBQUMrSCxPQUFMLEVBQWMsT0FBT3ZELEtBQVA7QUFFZCxNQUFNbUIsUUFBUSxHQUFHcUMsNkJBQTZCLENBQUN4RCxLQUFELENBQTlDLENBSnFFLENBS3JFOztBQUNBLFNBQU9XLHFCQUFxQixDQUFDUSxRQUFELEVBQVc7QUFBQ2xCLElBQUFBLE9BQU8sRUFBRTtBQUFDaEYsTUFBQUEsU0FBUyxFQUFFc0k7QUFBWjtBQUFWLEdBQVgsQ0FBNUI7QUFDRCxDQVBNO0FBU1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU1FLHlCQUF5QixHQUFHLFNBQTVCQSx5QkFBNEIsQ0FBQ3pELEtBQUQsRUFBK0I7QUFDdEUsU0FBT3dELDZCQUE2QixDQUFDeEQsS0FBRCxDQUFwQztBQUNELENBRk07Ozs7QUFJUCxTQUFTd0QsNkJBQVQsQ0FBdUN4RCxLQUF2QyxFQUFrRTtBQUNoRSxNQUFNdUQsT0FBTyxHQUFHdkQsS0FBSyxDQUFDbkUsVUFBTixDQUFpQkwsRUFBakM7QUFDQSxNQUFJLENBQUMrSCxPQUFMLEVBQWMsT0FBT3ZELEtBQVA7QUFFZCx5Q0FDS0EsS0FETDtBQUVFO0FBQ0E3RSxJQUFBQSxTQUFTLGtDQUNKNkUsS0FBSyxDQUFDN0UsU0FERiw0Q0FFTm9JLE9BRk0sa0NBR0Z2RCxLQUFLLENBQUM3RSxTQUFOLENBQWdCb0ksT0FBaEIsQ0FIRSxHQUlGdkQsS0FBSyxDQUFDbkUsVUFKSixHQUhYO0FBVUU7QUFDQUEsSUFBQUEsVUFBVSxFQUFFQyxvQkFBb0I7QUFYbEM7QUFhRDtBQUVEO0FBQ0E7QUFDQTtBQUNBOzs7QUFDTyxJQUFNNEgsMkJBQTJCLEdBQUcsU0FBOUJBLDJCQUE4QixDQUN6QzFELEtBRHlDLEVBRXpDUyxNQUZ5QyxFQUc1QjtBQUFBLE1BQ05qRixFQURNLEdBQ0FpRixNQUFNLENBQUNSLE9BRFAsQ0FDTnpFLEVBRE0sRUFHYjs7QUFIYSx5QkFJeUJ3RSxLQUFLLENBQUM3RSxTQUovQjtBQUFBLE1BSUFtRyxDQUpBLG9CQUlMOUYsRUFKSztBQUFBLE1BSU1tSSxlQUpOLGdFQUlMbkksRUFKSzs7QUFNYixNQUFNMkYsUUFBUSxtQ0FDVG5CLEtBRFM7QUFFWjdFLElBQUFBLFNBQVMsRUFBRXdJO0FBRkMsSUFBZDs7QUFLQSxNQUFJM0QsS0FBSyxDQUFDL0UsU0FBTixLQUFvQk8sRUFBeEIsRUFBNEI7QUFDMUI7QUFDQTtBQUNBLFdBQU9tRixxQkFBcUIsQ0FBQ1EsUUFBRCxFQUFXO0FBQUNsQixNQUFBQSxPQUFPLEVBQUU7QUFBQ2hGLFFBQUFBLFNBQVMsRUFBRUYsZUFBZSxHQUFHRTtBQUE5QjtBQUFWLEtBQVgsQ0FBNUI7QUFDRDs7QUFFRCxTQUFPa0csUUFBUDtBQUNELENBckJNO0FBdUJQO0FBQ0E7QUFDQTtBQUNBOzs7OztBQUNPLElBQU15Qyx5QkFBeUIsR0FBRyxTQUE1QkEseUJBQTRCLENBQ3ZDNUQsS0FEdUM7QUFBQSxNQUU3QnJDLEtBRjZCLFVBRXRDc0MsT0FGc0M7QUFBQSx5Q0FJcENELEtBSm9DO0FBS3ZDakUsSUFBQUEsbUJBQW1CLEVBQUU0QixLQUxrQjtBQU12QzFCLElBQUFBLHFCQUFxQixFQUFFO0FBTmdCO0FBQUEsQ0FBbEM7QUFTUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxJQUFNNEgseUJBQXlCLEdBQUcsU0FBNUJBLHlCQUE0QixDQUN2QzdELEtBRHVDO0FBQUEsTUFFN0JyQyxLQUY2QixVQUV0Q3NDLE9BRnNDO0FBQUEseUNBSXBDRCxLQUpvQztBQUt2QzlELElBQUFBLGVBQWUsRUFBRXlCO0FBTHNCO0FBQUEsQ0FBbEM7QUFRUDtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFDTyxTQUFTN0Isb0JBQVQsR0FBNEM7QUFDakQsU0FBTztBQUNMTixJQUFBQSxFQUFFLEVBQUUsSUFEQztBQUVMeUcsSUFBQUEsV0FBVyxFQUFFLElBRlI7QUFHTFIsSUFBQUEsS0FBSyxFQUFFLEtBSEY7QUFJTDBCLElBQUFBLE9BQU8sRUFBRSxLQUpKO0FBS0xSLElBQUFBLEtBQUssRUFBRSxJQUxGO0FBTUwvRixJQUFBQSxLQUFLLEVBQUUsSUFORjtBQU9MaUUsSUFBQUEsR0FBRyxFQUFFLElBUEE7QUFRTDZCLElBQUFBLElBQUksRUFBRSxJQVJEO0FBU0w5QixJQUFBQSxNQUFNLEVBQUUsT0FUSDtBQVVMd0MsSUFBQUEsWUFBWSxFQUFFO0FBVlQsR0FBUDtBQVlEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuaW1wb3J0IFRhc2ssIHt3aXRoVGFza30gZnJvbSAncmVhY3QtcGFsbS90YXNrcyc7XG5pbXBvcnQgY2xvbmVEZWVwIGZyb20gJ2xvZGFzaC5jbG9uZWRlZXAnO1xuaW1wb3J0IENvbnNvbGUgZnJvbSAnZ2xvYmFsL2NvbnNvbGUnO1xuXG4vLyBVdGlsc1xuaW1wb3J0IHtcbiAgZ2V0RGVmYXVsdExheWVyR3JvdXBWaXNpYmlsaXR5LFxuICBpc1ZhbGlkU3R5bGVVcmwsXG4gIGdldFN0eWxlRG93bmxvYWRVcmwsXG4gIG1lcmdlTGF5ZXJHcm91cFZpc2liaWxpdHksXG4gIGVkaXRUb3BNYXBTdHlsZSxcbiAgZWRpdEJvdHRvbU1hcFN0eWxlLFxuICBnZXRTdHlsZUltYWdlSWNvbixcbiAgZ2VuZXJhdGVIYXNoSWQsXG4gIGlzUGxhaW5PYmplY3QsXG4gIGhleFRvUmdiLFxuICBjb2xvck1heWJlVG9SR0Jcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge1xuICBERUZBVUxUX01BUF9TVFlMRVMsXG4gIERFRkFVTFRfTEFZRVJfR1JPVVBTLFxuICBERUZBVUxUX01BUEJPWF9BUElfVVJMLFxuICBOT19NQVBfSUQsXG4gIERFRkFVTFRfQkxER19DT0xPUixcbiAgREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SLFxuICBCQVNFX01BUF9CQUNLR1JPVU5EX0xBWUVSX0lEU1xufSBmcm9tICdAa2VwbGVyLmdsL2NvbnN0YW50cyc7XG5pbXBvcnQge0FDVElPTl9UQVNLLCBMT0FEX01BUF9TVFlMRV9UQVNLfSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcbmltcG9ydCB7cmdifSBmcm9tICdkMy1jb2xvcic7XG5cbmltcG9ydCB7XG4gIFJHQkNvbG9yLFxuICBMYXllckdyb3VwLFxuICBCYXNlTWFwU3R5bGUsXG4gIE1hcFN0eWxlcyxcbiAgSW5wdXRTdHlsZSxcbiAgVmlzaWJsZUxheWVyR3JvdXBzXG59IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuaW1wb3J0IHtcbiAgQWN0aW9uVHlwZXMsXG4gIFJlY2VpdmVNYXBDb25maWdQYXlsb2FkLFxuICBLZXBsZXJHbEluaXRQYXlsb2FkLFxuICBNYXBTdHlsZUFjdGlvbnMsXG4gIGxvYWRNYXBTdHlsZXMsXG4gIGxvYWRNYXBTdHlsZUVyclxufSBmcm9tICdAa2VwbGVyLmdsL2FjdGlvbnMnO1xuXG5leHBvcnQgdHlwZSBNYXBib3hTdHlsZVVybCA9IHN0cmluZztcblxuZXhwb3J0IHR5cGUgTWFwU3R5bGUgPSB7XG4gIHN0eWxlVHlwZTogc3RyaW5nO1xuICB2aXNpYmxlTGF5ZXJHcm91cHM6IFZpc2libGVMYXllckdyb3VwcztcbiAgdG9wTGF5ZXJHcm91cHM6IFZpc2libGVMYXllckdyb3VwcztcbiAgbWFwU3R5bGVzOiBNYXBTdHlsZXM7XG4gIC8vIHNhdmUgbWFwYm94IGFjY2VzcyB0b2tlblxuICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RyaW5nIHwgbnVsbDtcbiAgbWFwYm94QXBpVXJsOiBzdHJpbmc7XG4gIG1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0OiBib29sZWFuO1xuICBpbnB1dFN0eWxlOiBJbnB1dFN0eWxlO1xuICB0aHJlZURCdWlsZGluZ0NvbG9yOiBSR0JDb2xvcjtcbiAgYmFja2dyb3VuZENvbG9yOiBSR0JDb2xvcjtcbiAgY3VzdG9tM0RCdWlsZGluZ0NvbG9yOiBib29sZWFuO1xuICBib3R0b21NYXBTdHlsZTogYW55O1xuICB0b3BNYXBTdHlsZTogYW55O1xuICBpbml0aWFsU3RhdGU/OiBNYXBTdHlsZTtcbiAgaXNMb2FkaW5nOiB7XG4gICAgW2tleTogc3RyaW5nXTogYm9vbGVhbjtcbiAgfTtcbn07XG5cbmNvbnN0IGdldERlZmF1bHRTdGF0ZSA9ICgpOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHZpc2libGVMYXllckdyb3VwcyA9IHt9O1xuICBjb25zdCBzdHlsZVR5cGUgPSAnZGFyay1tYXR0ZXInO1xuICBjb25zdCB0b3BMYXllckdyb3VwcyA9IHt9O1xuXG4gIHJldHVybiB7XG4gICAgc3R5bGVUeXBlLFxuICAgIHZpc2libGVMYXllckdyb3VwcyxcbiAgICB0b3BMYXllckdyb3VwcyxcbiAgICBtYXBTdHlsZXM6IERFRkFVTFRfTUFQX1NUWUxFUy5yZWR1Y2UoXG4gICAgICAoYWNjdSwgY3VycikgPT4gKHtcbiAgICAgICAgLi4uYWNjdSxcbiAgICAgICAgW2N1cnIuaWRdOiBjdXJyXG4gICAgICB9KSxcbiAgICAgIHt9XG4gICAgKSxcbiAgICAvLyBzYXZlIG1hcGJveCBhY2Nlc3MgdG9rZW5cbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogbnVsbCxcbiAgICBtYXBib3hBcGlVcmw6IERFRkFVTFRfTUFQQk9YX0FQSV9VUkwsXG4gICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQ6IGZhbHNlLFxuICAgIGlucHV0U3R5bGU6IGdldEluaXRpYWxJbnB1dFN0eWxlKCksXG4gICAgdGhyZWVEQnVpbGRpbmdDb2xvcjogaGV4VG9SZ2IoREVGQVVMVF9CTERHX0NPTE9SKSxcbiAgICBjdXN0b20zREJ1aWxkaW5nQ29sb3I6IGZhbHNlLFxuICAgIGJhY2tncm91bmRDb2xvcjogaGV4VG9SZ2IoREVGQVVMVF9CQUNLR1JPVU5EX0NPTE9SKSxcbiAgICBpc0xvYWRpbmc6IHt9LFxuICAgIGJvdHRvbU1hcFN0eWxlOiB1bmRlZmluZWQsXG4gICAgdG9wTWFwU3R5bGU6IHVuZGVmaW5lZFxuICB9O1xufTtcblxuLyoqXG4gKiBVcGRhdGVycyBmb3IgYG1hcFN0eWxlYC4gQ2FuIGJlIHVzZWQgaW4geW91ciByb290IHJlZHVjZXIgdG8gZGlyZWN0bHkgbW9kaWZ5IGtlcGxlci5nbCdzIHN0YXRlLlxuICogUmVhZCBtb3JlIGFib3V0IFtVc2luZyB1cGRhdGVyc10oLi4vYWR2YW5jZWQtdXNhZ2UvdXNpbmctdXBkYXRlcnMubWQpXG4gKiBAcHVibGljXG4gKiBAZXhhbXBsZVxuICpcbiAqIGltcG9ydCBrZXBsZXJHbFJlZHVjZXIsIHttYXBTdHlsZVVwZGF0ZXJzfSBmcm9tICdrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgLy8gY2xpY2sgYnV0dG9uIHRvIGhpZGUgbGFiZWwgZnJvbSBiYWNrZ3JvdW5kIG1hcFxuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIG1hcFN0eWxlOiBtYXBTdHlsZVVwZGF0ZXJzLm1hcENvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gKiAgICAgICAgICAgICAgIG1hcFN0eWxlLFxuICogICAgICAgICAgICAgICB7cGF5bG9hZDoge3Zpc2libGVMYXllckdyb3Vwczoge2xhYmVsOiBmYWxzZSwgcm9hZDogdHJ1ZSwgYmFja2dyb3VuZDogdHJ1ZX19fVxuICogICAgICAgICAgICAgKVxuICogICAgICAgICAgfVxuICogICAgICAgIH1cbiAqICAgICAgfTtcbiAqICB9XG4gKiAgcmV0dXJuIHJlZHVjZXJzKHN0YXRlLCBhY3Rpb24pO1xuICogfTtcbiAqXG4gKiBleHBvcnQgZGVmYXVsdCBjb21wb3NlZFJlZHVjZXI7XG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCBtYXBTdHlsZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLXZhcnMgKi9cbi8qKlxuICogRGVmYXVsdCBpbml0aWFsIGBtYXBTdHlsZWBcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAY29uc3RhbnRcbiAqIEBwcm9wZXJ0eSBzdHlsZVR5cGUgLSBEZWZhdWx0OiBgJ2RhcmsnYFxuICogQHByb3BlcnR5IHZpc2libGVMYXllckdyb3VwcyAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSB0b3BMYXllckdyb3VwcyAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSBtYXBTdHlsZXMgLSBtYXBwaW5nIGZyb20gc3R5bGUga2V5IHRvIHN0eWxlIG9iamVjdFxuICogQHByb3BlcnR5IG1hcGJveEFwaUFjY2Vzc1Rva2VuIC0gRGVmYXVsdDogYG51bGxgXG4gKiBAUHJvcGVydHkgbWFwYm94QXBpVXJsIC0gRGVmYXVsdCBudWxsXG4gKiBAUHJvcGVydHkgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgLSBEZWZhdWx0OiBgZmFsc2VgXG4gKiBAcHJvcGVydHkgaW5wdXRTdHlsZSAtIERlZmF1bHQ6IGB7fWBcbiAqIEBwcm9wZXJ0eSB0aHJlZURCdWlsZGluZ0NvbG9yIC0gRGVmYXVsdDogYFtyLCBnLCBiXWBcbiAqIEBwcm9wZXJ0eSBiYWNrZ3JvdW5kQ29sb3IgLSBEZWZhdWx0OiBgW3IsIGcsIGJdYFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9NQVBfU1RZTEU6IE1hcFN0eWxlID0gZ2V0RGVmYXVsdFN0YXRlKCk7XG5cbmludGVyZmFjZSBHZXRNYXBTdHlsZXNQYXJhbSB7XG4gIHN0eWxlVHlwZTogc3RyaW5nO1xuICB2aXNpYmxlTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgdG9wTGF5ZXJHcm91cHM6IHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufTtcbiAgbWFwU3R5bGVzOiB7W2lkOiBzdHJpbmddOiBhbnl9O1xufVxuXG4vKipcbiAqIENyZWF0ZSB0d28gbWFwIHN0eWxlcyBmcm9tIHByZXNldCBtYXAgc3R5bGUsIG9uZSBmb3IgdG9wIG1hcCBvbmUgZm9yIGJvdHRvbVxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHlsZVR5cGUgLSBjdXJyZW50IG1hcCBzdHlsZVxuICogQHBhcmFtIHtPYmplY3R9IHZpc2libGVMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIGJvdHRvbSBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSB0b3BMYXllckdyb3VwcyAtIHZpc2libGUgbGF5ZXJzIG9mIHRvcCBtYXBcbiAqIEBwYXJhbSB7T2JqZWN0fSBtYXBTdHlsZXMgLSBhIGRpY3Rpb25hcnkgb2YgYWxsIG1hcCBzdHlsZXNcbiAqIEByZXR1cm5zIHtPYmplY3R9IGJvdHRvbU1hcFN0eWxlIHwgdG9wTWFwU3R5bGUgfCBpc1Jhc3RlclxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWFwU3R5bGVzKHtcbiAgc3R5bGVUeXBlLFxuICB2aXNpYmxlTGF5ZXJHcm91cHMsXG4gIHRvcExheWVyR3JvdXBzLFxuICBtYXBTdHlsZXNcbn06IEdldE1hcFN0eWxlc1BhcmFtKSB7XG4gIGNvbnN0IG1hcFN0eWxlID0gbWFwU3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgLy8gc3R5bGUgbWlnaHQgbm90IGJlIGxvYWRlZCB5ZXRcbiAgaWYgKCFtYXBTdHlsZSB8fCAhbWFwU3R5bGUuc3R5bGUpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICBjb25zdCBlZGl0YWJsZSA9IE9iamVjdC5rZXlzKHZpc2libGVMYXllckdyb3VwcykubGVuZ3RoO1xuXG4gIGNvbnN0IGJvdHRvbU1hcFN0eWxlID0gIWVkaXRhYmxlXG4gICAgPyBtYXBTdHlsZS5zdHlsZVxuICAgIDogZWRpdEJvdHRvbU1hcFN0eWxlKHtcbiAgICAgICAgaWQ6IHN0eWxlVHlwZSxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3Vwc1xuICAgICAgfSk7XG5cbiAgY29uc3QgaGFzVG9wTGF5ZXIgPSBlZGl0YWJsZSA+IDAgJiYgT2JqZWN0LnZhbHVlcyh0b3BMYXllckdyb3Vwcykuc29tZSh2ID0+IHYpO1xuXG4gIC8vIG11dGUgdG9wIGxheWVyIGlmIG5vdCB2aXNpYmxlIGluIGJvdHRvbSBsYXllclxuICBjb25zdCB0b3BMYXllcnMgPVxuICAgIGhhc1RvcExheWVyICYmXG4gICAgT2JqZWN0LmtleXModG9wTGF5ZXJHcm91cHMpLnJlZHVjZShcbiAgICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAgIC4uLmFjY3UsXG4gICAgICAgIFtrZXldOiB0b3BMYXllckdyb3Vwc1trZXldICYmIHZpc2libGVMYXllckdyb3Vwc1trZXldXG4gICAgICB9KSxcbiAgICAgIHt9IGFzIHtbaWQ6IHN0cmluZ106IExheWVyR3JvdXAgfCBib29sZWFufVxuICAgICk7XG5cbiAgY29uc3QgdG9wTWFwU3R5bGUgPSBoYXNUb3BMYXllclxuICAgID8gZWRpdFRvcE1hcFN0eWxlKHtcbiAgICAgICAgaWQ6IHN0eWxlVHlwZSxcbiAgICAgICAgbWFwU3R5bGUsXG4gICAgICAgIHZpc2libGVMYXllckdyb3VwczogdG9wTGF5ZXJzXG4gICAgICB9KVxuICAgIDogbnVsbDtcblxuICByZXR1cm4ge2JvdHRvbU1hcFN0eWxlLCB0b3BNYXBTdHlsZSwgZWRpdGFibGV9O1xufVxuXG5mdW5jdGlvbiBmaW5kTGF5ZXJGaWxsQ29sb3IobGF5ZXIpIHtcbiAgcmV0dXJuIGxheWVyICYmIGxheWVyLnBhaW50ICYmIGxheWVyLnBhaW50WydiYWNrZ3JvdW5kLWNvbG9yJ107XG59XG5cbi8vIG5lZWQgdG8gYmUgY2FyZWZ1bCBiZWNhdXNlIHNvbWUgYmFzZW1hcCBsYXllci5wYWludFsnYmFja2dyb3VuZC1jb2xvciddIHZhbHVlcyBtYXkgYmUgYW4gaW50ZXJwb2xhdGUgYXJyYXkgZXhwcmVzc2lvbiBpbnN0ZWFkIG9mIGEgY29sb3Igc3RyaW5nXG4vLyBodHRwczovL2RvY3MubWFwYm94LmNvbS9tYXBib3gtZ2wtanMvc3R5bGUtc3BlYy9sYXllcnMvI3BhaW50LWJhY2tncm91bmQtYmFja2dyb3VuZC1jb2xvclxuLy8gaHR0cHM6Ly9kb2NzLm1hcGJveC5jb20vbWFwYm94LWdsLWpzL3N0eWxlLXNwZWMvZXhwcmVzc2lvbnMvI2ludGVycG9sYXRlXG5mdW5jdGlvbiBnZXRQYWludENvbG9yKGNvbG9yKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbG9yKSAmJiBjb2xvclswXSA9PT0gJ2ludGVycG9sYXRlJykge1xuICAgIC8vIGdldCBjb2xvciBvZiBmaXJzdCB6b29tIGJyZWFrXG4gICAgLy8gW1wiaW50ZXJwb2xhdGVcIiwgW1wibGluZWFyXCJdLCBbXCJ6b29tXCJdLCAxMSwgXCJoc2woMzUsIDMyJSwgOTElKVwiLCAxMywgXCJoc2woMzUsIDEyJSwgODklKVwiXVxuICAgIHJldHVybiBjb2xvcls0XTtcbiAgfVxuICByZXR1cm4gY29sb3I7XG59XG5cbmZ1bmN0aW9uIGdldDNEQnVpbGRpbmdDb2xvcihzdHlsZSk6IFJHQkNvbG9yIHtcbiAgLy8gc2V0IGJ1aWxkaW5nIGNvbG9yIHRvIGJlIHRoZSBzYW1lIGFzIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLlxuICBpZiAoIXN0eWxlLnN0eWxlKSB7XG4gICAgcmV0dXJuIGhleFRvUmdiKERFRkFVTFRfQkxER19DT0xPUik7XG4gIH1cblxuICBjb25zdCBiYWNrZ3JvdW5kTGF5ZXIgPSAoc3R5bGUuc3R5bGUubGF5ZXJzIHx8IFtdKS5maW5kKCh7aWR9KSA9PiBpZCA9PT0gJ2JhY2tncm91bmQnKTtcblxuICBjb25zdCBidWlsZGluZ0xheWVyID0gKHN0eWxlLnN0eWxlLmxheWVycyB8fCBbXSkuZmluZCgoe2lkfSkgPT4gaWQubWF0Y2goL2J1aWxkaW5nLykpO1xuXG4gIGNvbnN0IGJ1aWxkaW5nQ29sb3IgPVxuICAgIGZpbmRMYXllckZpbGxDb2xvcihidWlsZGluZ0xheWVyKSB8fCBmaW5kTGF5ZXJGaWxsQ29sb3IoYmFja2dyb3VuZExheWVyKSB8fCBERUZBVUxUX0JMREdfQ09MT1I7XG5cbiAgLy8gYnJpZ2h0ZW4gb3IgZGFya2VuIGJ1aWxkaW5nIGJhc2VkIG9uIHN0eWxlXG4gIGNvbnN0IG9wZXJhdGlvbiA9IHN0eWxlLmlkLm1hdGNoKC8oPz0oZGFya3xuaWdodCkpLykgPyAnYnJpZ2h0ZXInIDogJ2Rhcmtlcic7XG5cbiAgY29uc3QgYWxwaGEgPSAwLjI7XG4gIGNvbnN0IHJnYk9iaiA9IHJnYihidWlsZGluZ0NvbG9yKVtvcGVyYXRpb25dKFthbHBoYV0pO1xuICByZXR1cm4gW3JnYk9iai5yLCByZ2JPYmouZywgcmdiT2JqLmJdO1xufVxuXG5mdW5jdGlvbiBnZXRCYWNrZ3JvdW5kQ29sb3JGcm9tU3R5bGVCYXNlTGF5ZXIoXG4gIHN0eWxlOiBCYXNlTWFwU3R5bGUsXG4gIGJhY2t1cEJhY2tncm91bmRDb2xvcjogUkdCQ29sb3Jcbik6IFJHQkNvbG9yIHtcbiAgaWYgKCFzdHlsZS5zdHlsZSkge1xuICAgIHJldHVybiBjb2xvck1heWJlVG9SR0IoYmFja3VwQmFja2dyb3VuZENvbG9yKSB8fCBiYWNrdXBCYWNrZ3JvdW5kQ29sb3I7XG4gIH1cblxuICAvLyBAdHMtZXhwZWN0LWVycm9yIHN0eWxlLnN0eWxlIG5vdCB0eXBlZFxuICBjb25zdCBiYXNlTGF5ZXIgPSAoc3R5bGUuc3R5bGUubGF5ZXJzIHx8IFtdKS5maW5kKCh7aWR9KSA9PlxuICAgIEJBU0VfTUFQX0JBQ0tHUk9VTkRfTEFZRVJfSURTLmluY2x1ZGVzKGlkKVxuICApO1xuXG4gIGNvbnN0IGJhY2tncm91bmRDb2xvck9mQmFzZUxheWVyID0gZ2V0UGFpbnRDb2xvcihmaW5kTGF5ZXJGaWxsQ29sb3IoYmFzZUxheWVyKSk7XG5cbiAgY29uc3QgbmV3QmFja2dyb3VuZENvbG9yID1cbiAgICB0eXBlb2YgYmFja2dyb3VuZENvbG9yT2ZCYXNlTGF5ZXIgPT09ICdzdHJpbmcnXG4gICAgICA/IGJhY2tncm91bmRDb2xvck9mQmFzZUxheWVyXG4gICAgICA6IGJhY2t1cEJhY2tncm91bmRDb2xvcjtcblxuICBjb25zdCBuZXdCYWNrZ3JvdW5kQ29sb3JBc1JHQkFycmF5ID0gY29sb3JNYXliZVRvUkdCKG5ld0JhY2tncm91bmRDb2xvcilcbiAgICAvLyBpZiBuZXdCYWNrZ3JvdW5kQ29sb3Igd2FzIGluIHN0cmluZyBIU0wgZm9ybWF0IGl0IGNhbiBpbnRyb2R1Y2UgUkdCIG51bWJlcnMgd2l0aCBkZWNpbWFscyxcbiAgICAvLyB3aGljaCBtYXkgcmVuZGVyIHRoZSBiYWNrZ3JvdW5kLWNvbG9yIENTUyBvZiB0aGUgPFN0eWxlZE1hcD4gY29udGFpbmVyIGluY29ycmVjdGx5IHdoZW4gdXNpbmcgb3VyIG93biBjb2xvciB1dGlscyBgcmdiVG9IZXgoKWBcbiAgICAvLyBzbyB3ZSBhdHRlbXB0IHRvIHJvdW5kIHRvIG5lYXJlc3QgaW50ZWdlciBoZXJlXG4gICAgPy5tYXAoY2hhbm5lbE51bWJlciA9PiBNYXRoLnJvdW5kKGNoYW5uZWxOdW1iZXIpKSBhcyBSR0JDb2xvciB8IG51bGw7XG5cbiAgcmV0dXJuIG5ld0JhY2tncm91bmRDb2xvckFzUkdCQXJyYXkgfHwgYmFja3VwQmFja2dyb3VuZENvbG9yO1xufVxuXG4vLyBkZXRlcm1pbmUgbmV3IGJhY2tncm91bmRDb2xvciBmcm9tIGVpdGhlciBwcmV2aW91cyBzdGF0ZSBiYXNlbWFwIHN0eWxlLCBwcmV2aW91cyBzdGF0ZSBiYWNrZ3JvdW5kQ29sb3IsIG9yIHRoZSBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1JcbmZ1bmN0aW9uIGdldEJhY2tncm91bmRDb2xvcihwcmV2aW91c1N0YXRlOiBNYXBTdHlsZSwgc3R5bGVUeXBlOiBzdHJpbmcpIHtcbiAgY29uc3QgcHJldmlvdXNTdGF0ZU1hcFN0eWxlID0gcHJldmlvdXNTdGF0ZS5tYXBTdHlsZXNbcHJldmlvdXNTdGF0ZS5zdHlsZVR5cGVdO1xuICBjb25zdCBiYWNrdXBCYWNrZ3JvdW5kQ29sb3IgPSBwcmV2aW91c1N0YXRlLmJhY2tncm91bmRDb2xvciB8fCBERUZBVUxUX0JBQ0tHUk9VTkRfQ09MT1I7XG4gIGNvbnN0IGJhY2tncm91bmRDb2xvciA9XG4gICAgc3R5bGVUeXBlID09PSBOT19NQVBfSURcbiAgICAgID8gLy8gaWYgdGhlIHN0eWxlIGhhcyBzd2l0Y2hlZCB0byB0aGUgXCJubyBiYXNlbWFwXCIgc3R5bGUsXG4gICAgICAgIC8vIGF0dGVtcHQgdG8gZGV0ZWN0IGJhY2tncm91bmRDb2xvciBvZiB0aGUgcHJldmlvdXMgYmFzZW1hcCBpZiBpdCB3YXMgYSBtYXBib3ggYmFzZW1hcFxuICAgICAgICAvLyBhbmQgc2V0IGl0IGFzIHRoZSBcIm5vIGJhc2VtYXBcIiBiYWNrZ3JvdW5kQ29sb3JcbiAgICAgICAgZ2V0QmFja2dyb3VuZENvbG9yRnJvbVN0eWxlQmFzZUxheWVyKHByZXZpb3VzU3RhdGVNYXBTdHlsZSwgYmFja3VwQmFja2dyb3VuZENvbG9yKVxuICAgICAgOiAvLyBvdGhlcndpc2UgbGVhdmUgaXQgYWxvbmUgYW5kIHJlbHkgb24gdGhlIHByZXZpb3VzIHN0YXRlJ3MgcHJlZXhpc3RpbmcgYmFja2dyb3VuZENvbG9yXG4gICAgICAgIC8vIG9yIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUiBhcyBhIGxhc3QgcmVzb3J0XG4gICAgICAgIGJhY2t1cEJhY2tncm91bmRDb2xvcjtcblxuICByZXR1cm4gYmFja2dyb3VuZENvbG9yO1xufVxuXG5mdW5jdGlvbiBnZXRMYXllckdyb3Vwc0Zyb21TdHlsZShzdHlsZSkge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShzdHlsZT8ubGF5ZXJzKVxuICAgID8gREVGQVVMVF9MQVlFUl9HUk9VUFMuZmlsdGVyKGxnID0+IHN0eWxlLmxheWVycy5maWx0ZXIobGcuZmlsdGVyKS5sZW5ndGgpXG4gICAgOiBbXTtcbn1cblxuLy8gVXBkYXRlcnNcblxuLyoqXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHttYXBTdHlsZXMsIG9uU3VjY2Vzc319OiBNYXBTdHlsZUFjdGlvbnMuUmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgY29uc3QgdG9Mb2FkID0gT2JqZWN0LmtleXMobWFwU3R5bGVzKS5yZWR1Y2UoXG4gICAgKGFjY3UsIGlkKSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIC4uLighc3RhdGUuaXNMb2FkaW5nW2lkXSA/IHtbaWRdOiBtYXBTdHlsZXNbaWRdfSA6IHt9KVxuICAgIH0pLFxuICAgIHt9XG4gICk7XG4gIGNvbnN0IGxvYWRNYXBTdHlsZVRhc2tzID0gZ2V0TG9hZE1hcFN0eWxlVGFza3MoXG4gICAgdG9Mb2FkLFxuICAgIHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICAgIHN0YXRlLm1hcGJveEFwaVVybCxcbiAgICBvblN1Y2Nlc3NcbiAgKTtcblxuICBjb25zdCBpc0xvYWRpbmcgPSBPYmplY3Qua2V5cyh0b0xvYWQpLnJlZHVjZShcbiAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIFtrZXldOiB0cnVlXG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgY29uc3QgbmV4dFN0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGlzTG9hZGluZ1xuICB9O1xuICByZXR1cm4gd2l0aFRhc2sobmV4dFN0YXRlLCBsb2FkTWFwU3R5bGVUYXNrcyk7XG59O1xuXG4vKipcbiAqIFByb3BhZ2F0ZSBgbWFwU3R5bGVgIHJlZHVjZXIgd2l0aCBgbWFwYm94QXBpQWNjZXNzVG9rZW5gIGFuZCBgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHRgLlxuICogaWYgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQgaXMgdHJ1ZSBtYXBTdHlsZXMgaXMgZW1wdGllZDsgbG9hZE1hcFN0eWxlc1VwZGF0ZXIoKSB3aWxsXG4gKiBwb3B1bGF0ZSBtYXBTdHlsZXMuXG4gKlxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGluaXRNYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge1xuICAgIHBheWxvYWQgPSB7fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5JTklUO1xuICAgIHBheWxvYWQ6IEtlcGxlckdsSW5pdFBheWxvYWQ7XG4gIH1cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAvLyBzYXZlIG1hcGJveCBhY2Nlc3MgdG9rZW4gdG8gbWFwIHN0eWxlIHN0YXRlXG4gIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiBwYXlsb2FkLm1hcGJveEFwaUFjY2Vzc1Rva2VuIHx8IHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuLFxuICBtYXBib3hBcGlVcmw6IHBheWxvYWQubWFwYm94QXBpVXJsIHx8IHN0YXRlLm1hcGJveEFwaVVybCxcbiAgbWFwU3R5bGVzOiAhcGF5bG9hZC5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCA/IHN0YXRlLm1hcFN0eWxlcyA6IHt9LFxuICBtYXBTdHlsZXNSZXBsYWNlRGVmYXVsdDogcGF5bG9hZC5tYXBTdHlsZXNSZXBsYWNlRGVmYXVsdCB8fCBmYWxzZVxufSk7XG4vLyB9KTtcblxuLyoqXG4gKiBVcGRhdGUgYHZpc2libGVMYXllckdyb3Vwc2B0byBjaGFuZ2UgbGF5ZXIgZ3JvdXAgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1hcENvbmZpZ0NoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAgYWN0aW9uOiBNYXBTdHlsZUFjdGlvbnMuTWFwQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC4uLmFjdGlvbi5wYXlsb2FkLFxuICAgIC4uLmdldE1hcFN0eWxlcyh7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIC4uLmFjdGlvbi5wYXlsb2FkXG4gICAgfSlcbiAgfTtcbn07XG5cbmNvbnN0IGhhc1N0eWxlT2JqZWN0ID0gc3R5bGUgPT4gaXNQbGFpbk9iamVjdChzdHlsZT8uc3R5bGUpO1xuXG4vKipcbiAqIENoYW5nZSB0byBhbm90aGVyIG1hcCBzdHlsZS4gVGhlIHNlbGVjdGVkIHN0eWxlIHNob3VsZCBhbHJlYWR5IGJlZW4gbG9hZGVkIGludG8gYG1hcFN0eWxlLm1hcFN0eWxlc2BcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtzdHlsZVR5cGUsIG9uU3VjY2Vzc319OiBNYXBTdHlsZUFjdGlvbnMuTWFwU3R5bGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGlmIChcbiAgICAvLyB3ZSBtaWdodCBub3QgaGF2ZSByZWNlaXZlZCB0aGUgc3R5bGUgeWV0XG4gICAgIXN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdIHx8XG4gICAgLy8gb3IgaWYgaXQgaXMgYSBtYW5hZ2VkIGN1c3RvbSBzdHlsZSBhc3NldFxuICAgIC8vIGFuZCBpZiBpdCBoYXMgbm90IGJlZW4gaHlkcmF0ZWQgd2l0aCBVUkwgaW5mbyB5ZXQgKGR1cmluZyBhcHAgZmlyc3QgaW5pdGlhbGl6YXRpb24pXG4gICAgLy8gYW5kIGl0IGRvZXMgbm90IGhhdmUgYSBzdHlsZSBvYmplY3QgKGR1cmluZyBhZGRpbmcgYSBjdXN0b20gc3R5bGUpXG4gICAgKHN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdPy5jdXN0b20gPT09ICdNQU5BR0VEJyAmJlxuICAgICAgIXN0YXRlLm1hcFN0eWxlc1tzdHlsZVR5cGVdPy51cmwgJiZcbiAgICAgICFoYXNTdHlsZU9iamVjdChzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXSkpXG4gICkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmICghaGFzU3R5bGVPYmplY3Qoc3RhdGUubWFwU3R5bGVzW3N0eWxlVHlwZV0pKSB7XG4gICAgLy8gc3R5bGUgaGFzbid0IGxvYWRlZCB5ZXRcbiAgICByZXR1cm4gcmVxdWVzdE1hcFN0eWxlc1VwZGF0ZXIoXG4gICAgICB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICBzdHlsZVR5cGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIHBheWxvYWQ6IHtcbiAgICAgICAgICBtYXBTdHlsZXM6IHtcbiAgICAgICAgICAgIFtzdHlsZVR5cGVdOiBzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb25TdWNjZXNzXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICApO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdExHVmlzaWJpbGl0eSA9IGdldERlZmF1bHRMYXllckdyb3VwVmlzaWJpbGl0eShzdGF0ZS5tYXBTdHlsZXNbc3R5bGVUeXBlXSk7XG5cbiAgY29uc3QgdmlzaWJsZUxheWVyR3JvdXBzID0gbWVyZ2VMYXllckdyb3VwVmlzaWJpbGl0eShcbiAgICBkZWZhdWx0TEdWaXNpYmlsaXR5LFxuICAgIHN0YXRlLnZpc2libGVMYXllckdyb3Vwc1xuICApO1xuXG4gIGNvbnN0IHRocmVlREJ1aWxkaW5nQ29sb3I6IFJHQkNvbG9yID0gc3RhdGUuY3VzdG9tM0RCdWlsZGluZ0NvbG9yXG4gICAgPyBzdGF0ZS50aHJlZURCdWlsZGluZ0NvbG9yXG4gICAgOiBnZXQzREJ1aWxkaW5nQ29sb3Ioc3RhdGUubWFwU3R5bGVzW3N0eWxlVHlwZV0pO1xuXG4gIC8vIGRldGVybWluZSBuZXcgYmFja2dyb3VuZENvbG9yIGZyb20gZWl0aGVyIHByZXZpb3VzIHN0YXRlIGJhc2VtYXAgc3R5bGUsIHByZXZpb3VzIHN0YXRlIGJhY2tncm91bmRDb2xvciwgb3IgdGhlIERFRkFVTFRfQkFDS0dST1VORF9DT0xPUlxuICBjb25zdCBiYWNrZ3JvdW5kQ29sb3IgPSBnZXRCYWNrZ3JvdW5kQ29sb3Ioc3RhdGUsIHN0eWxlVHlwZSk7XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzdHlsZVR5cGUsXG4gICAgdmlzaWJsZUxheWVyR3JvdXBzLFxuICAgIHRocmVlREJ1aWxkaW5nQ29sb3IsXG4gICAgYmFja2dyb3VuZENvbG9yLFxuICAgIC4uLmdldE1hcFN0eWxlcyh7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIHZpc2libGVMYXllckdyb3VwcyxcbiAgICAgIHN0eWxlVHlwZVxuICAgIH0pXG4gIH07XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gbG9hZCBtYXAgc3R5bGUgc3VjY2Vzc1xuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRNYXBTdHlsZXNVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIGFjdGlvbjogTWFwU3R5bGVBY3Rpb25zLkxvYWRNYXBTdHlsZXNVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHtuZXdTdHlsZXMsIG9uU3VjY2Vzc30gPSBhY3Rpb24ucGF5bG9hZCB8fCB7fTtcblxuICBjb25zdCBhZGRMYXllckdyb3VwcyA9IE9iamVjdC5rZXlzKG5ld1N0eWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBpZCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbaWRdOiB7XG4gICAgICAgIC4uLm5ld1N0eWxlc1tpZF0sXG4gICAgICAgIGxheWVyR3JvdXBzOiBuZXdTdHlsZXNbaWRdLmxheWVyR3JvdXBzIHx8IGdldExheWVyR3JvdXBzRnJvbVN0eWxlKG5ld1N0eWxlc1tpZF0uc3R5bGUpXG4gICAgICB9XG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgLy8gcmVzZXQgaXNMb2FkaW5nXG4gIGNvbnN0IGlzTG9hZGluZyA9IE9iamVjdC5rZXlzKHN0YXRlLmlzTG9hZGluZykucmVkdWNlKFxuICAgIChhY2N1LCBrZXkpID0+ICh7XG4gICAgICAuLi5hY2N1LFxuICAgICAgLi4uKHN0YXRlLmlzTG9hZGluZ1trZXldICYmIGhhc1N0eWxlT2JqZWN0KG5ld1N0eWxlc1trZXldKVxuICAgICAgICA/IHtba2V5XTogZmFsc2V9XG4gICAgICAgIDoge1trZXldOiBzdGF0ZS5pc0xvYWRpbmdba2V5XX0pXG4gICAgfSksXG4gICAge31cbiAgKTtcbiAgLy8gYWRkIG5ldyBzdHlsZXMgdG8gc3RhdGVcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNMb2FkaW5nLFxuICAgIG1hcFN0eWxlczoge1xuICAgICAgLi4uc3RhdGUubWFwU3R5bGVzLFxuICAgICAgLi4uYWRkTGF5ZXJHcm91cHNcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdGFza3MgPSBjcmVhdGVBY3Rpb25UYXNrKG9uU3VjY2Vzcywge3N0eWxlVHlwZTogc3RhdGUuc3R5bGVUeXBlfSk7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gbmV3U3R5bGVzW3N0YXRlLnN0eWxlVHlwZV1cbiAgICA/IG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihuZXdTdGF0ZSwge3BheWxvYWQ6IHtzdHlsZVR5cGU6IHN0YXRlLnN0eWxlVHlwZX19KVxuICAgIDogbmV3U3RhdGU7XG5cbiAgcmV0dXJuIHRhc2tzID8gd2l0aFRhc2sobmV4dFN0YXRlLCB0YXNrcykgOiBuZXh0U3RhdGU7XG59O1xuXG5mdW5jdGlvbiBjcmVhdGVBY3Rpb25UYXNrKGFjdGlvbiwgcGF5bG9hZCkge1xuICBpZiAodHlwZW9mIGFjdGlvbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBQ1RJT05fVEFTSygpLm1hcChfID0+IGFjdGlvbihwYXlsb2FkKSk7XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayB3aGVuIGxvYWQgbWFwIHN0eWxlIGVycm9yXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG4vLyBkbyBub3RoaW5nIGZvciBub3csIGlmIGRpZG4ndCBsb2FkLCBza2lwIGl0XG5leHBvcnQgY29uc3QgbG9hZE1hcFN0eWxlRXJyVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDoge2lkcywgZXJyb3J9fTogTWFwU3R5bGVBY3Rpb25zLkxvYWRNYXBTdHlsZUVyclVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+IHtcbiAgQ29uc29sZS5lcnJvcihlcnJvcik7XG4gIC8vIHJlc2V0IGlzTG9hZGluZ1xuICBjb25zdCBpc0xvYWRpbmcgPSBPYmplY3Qua2V5cyhzdGF0ZS5pc0xvYWRpbmcpLnJlZHVjZShcbiAgICAoYWNjdSwga2V5KSA9PiAoe1xuICAgICAgLi4uYWNjdSxcbiAgICAgIC4uLihzdGF0ZS5pc0xvYWRpbmdba2V5XSAmJiAoaWRzIHx8IFtdKS5pbmNsdWRlcyhrZXkpXG4gICAgICAgID8ge1trZXldOiBmYWxzZX1cbiAgICAgICAgOiB7W2tleV06IHN0YXRlLmlzTG9hZGluZ1trZXldfSlcbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgaXNMb2FkaW5nXG4gIH07XG59O1xuXG4vKipcbiAqIExvYWQgbWFwIHN0eWxlIG9iamVjdCB3aGVuIHBhc3MgaW4gc2F2ZWQgbWFwIGNvbmZpZ1xuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwYXJhbSBzdGF0ZSBgbWFwU3R5bGVgXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgc2F2ZWQgbWFwIGNvbmZpZyBge21hcFN0eWxlLCB2aXNTdGF0ZSwgbWFwU3RhdGV9YFxuICogQHJldHVybnMgbmV4dFN0YXRlIG9yIGByZWFjdC1wYW1gIHRhc2tzIHRvIGxvYWQgbWFwIHN0eWxlIG9iamVjdFxuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWd9XG4gIH06IHtcbiAgICB0eXBlPzogdHlwZW9mIEFjdGlvblR5cGVzLlJFQ0VJVkVfTUFQX0NPTkZJRztcbiAgICBwYXlsb2FkOiBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZDtcbiAgfVxuKTogTWFwU3R5bGUgPT4ge1xuICBjb25zdCB7bWFwU3R5bGV9ID0gY29uZmlnIHx8IHt9O1xuXG4gIGlmICghbWFwU3R5bGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBtZXJnZSBkZWZhdWx0IG1hcFN0eWxlc1xuICBjb25zdCBtZXJnZWQgPSBtYXBTdHlsZS5tYXBTdHlsZXNcbiAgICA/IHtcbiAgICAgICAgLi4ubWFwU3R5bGUsXG4gICAgICAgIG1hcFN0eWxlczoge1xuICAgICAgICAgIC4uLm1hcFN0eWxlLm1hcFN0eWxlcyxcbiAgICAgICAgICAuLi5zdGF0ZS5tYXBTdHlsZXNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIDogbWFwU3R5bGU7XG5cbiAgLy8gc2V0IGN1c3RvbTNEQnVpbGRpbmdDb2xvcjogdHJ1ZSBpZiBtYXBTdHlsZSBjb250YWlucyB0aHJlZURCdWlsZGluZ0NvbG9yXG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgbWVyZ2VkLmN1c3RvbTNEQnVpbGRpbmdDb2xvciA9XG4gICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgIEJvb2xlYW4obWFwU3R5bGUudGhyZWVEQnVpbGRpbmdDb2xvcikgfHwgbWVyZ2VkLmN1c3RvbTNEQnVpbGRpbmdDb2xvcjtcbiAgY29uc3QgbmV3U3RhdGUgPSBtYXBDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7cGF5bG9hZDogbWVyZ2VkfSk7XG5cbiAgcmV0dXJuIG1hcFN0eWxlQ2hhbmdlVXBkYXRlcihuZXdTdGF0ZSwge3BheWxvYWQ6IHtzdHlsZVR5cGU6IG5ld1N0YXRlLnN0eWxlVHlwZX19KTtcbn07XG5cbmZ1bmN0aW9uIGdldExvYWRNYXBTdHlsZVRhc2tzKG1hcFN0eWxlcywgbWFwYm94QXBpQWNjZXNzVG9rZW4sIG1hcGJveEFwaVVybCwgb25TdWNjZXNzKSB7XG4gIHJldHVybiBbXG4gICAgVGFzay5hbGwoXG4gICAgICBPYmplY3QudmFsdWVzKG1hcFN0eWxlcylcbiAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAubWFwKCh7aWQsIHVybCwgYWNjZXNzVG9rZW59KSA9PiAoe1xuICAgICAgICAgIGlkLFxuICAgICAgICAgIHVybDogaXNWYWxpZFN0eWxlVXJsKHVybClcbiAgICAgICAgICAgID8gZ2V0U3R5bGVEb3dubG9hZFVybCh1cmwsIGFjY2Vzc1Rva2VuIHx8IG1hcGJveEFwaUFjY2Vzc1Rva2VuLCBtYXBib3hBcGlVcmwpXG4gICAgICAgICAgICA6IHVybFxuICAgICAgICB9KSlcbiAgICAgICAgLm1hcChMT0FEX01BUF9TVFlMRV9UQVNLKVxuICAgICkuYmltYXAoXG4gICAgICAvLyBzdWNjZXNzXG4gICAgICByZXN1bHRzID0+XG4gICAgICAgIGxvYWRNYXBTdHlsZXMoXG4gICAgICAgICAgcmVzdWx0cy5yZWR1Y2UoXG4gICAgICAgICAgICAoYWNjdSwge2lkLCBzdHlsZX0pID0+ICh7XG4gICAgICAgICAgICAgIC4uLmFjY3UsXG4gICAgICAgICAgICAgIFtpZF06IHtcbiAgICAgICAgICAgICAgICAuLi5tYXBTdHlsZXNbaWRdLFxuICAgICAgICAgICAgICAgIHN0eWxlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAge31cbiAgICAgICAgICApLFxuICAgICAgICAgIG9uU3VjY2Vzc1xuICAgICAgICApLFxuICAgICAgLy8gZXJyb3JcbiAgICAgIGVyciA9PiBsb2FkTWFwU3R5bGVFcnIoT2JqZWN0LmtleXMobWFwU3R5bGVzKSwgZXJyKVxuICAgIClcbiAgXTtcbn1cbi8qKlxuICogUmVzZXQgbWFwIHN0eWxlIGNvbmZpZyB0byBpbml0aWFsIHN0YXRlXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIGBtYXBTdHlsZWBcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVzZXRNYXBDb25maWdNYXBTdHlsZVVwZGF0ZXIgPSAoc3RhdGU6IE1hcFN0eWxlKTogTWFwU3R5bGUgPT4ge1xuICBjb25zdCBlbXB0eUNvbmZpZyA9IHtcbiAgICAuLi5JTklUSUFMX01BUF9TVFlMRSxcbiAgICBtYXBib3hBcGlBY2Nlc3NUb2tlbjogc3RhdGUubWFwYm94QXBpQWNjZXNzVG9rZW4sXG4gICAgbWFwYm94QXBpVXJsOiBzdGF0ZS5tYXBib3hBcGlVcmwsXG4gICAgbWFwU3R5bGVzUmVwbGFjZURlZmF1bHQ6IHN0YXRlLm1hcFN0eWxlc1JlcGxhY2VEZWZhdWx0LFxuICAgIC4uLnN0YXRlLmluaXRpYWxTdGF0ZSxcbiAgICBtYXBTdHlsZXM6IHN0YXRlLm1hcFN0eWxlcyxcbiAgICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxuICB9O1xuXG4gIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIoZW1wdHlDb25maWcsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBlbXB0eUNvbmZpZy5zdHlsZVR5cGV9fSk7XG59O1xuXG4vKipcbiAqIENhbGxiYWNrIHdoZW4gYSBjdXN0b20gbWFwIHN0eWxlIG9iamVjdCBpcyByZWNlaXZlZFxuICogQG1lbWJlcm9mIG1hcFN0eWxlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAge3BheWxvYWQ6IHtpY29uLCBzdHlsZSwgZXJyb3J9fTogTWFwU3R5bGVBY3Rpb25zLkxvYWRDdXN0b21NYXBTdHlsZVVwZGF0ZXJBY3Rpb25cbik6IE1hcFN0eWxlID0+ICh7XG4gIC4uLnN0YXRlLFxuICAvLyBAdHMtZXhwZWN0LWVycm9yXG4gIGlucHV0U3R5bGU6IHtcbiAgICAuLi5zdGF0ZS5pbnB1dFN0eWxlLFxuICAgIC8vIHN0eWxlIGpzb24gYW5kIGljb24gd2lsbCBsb2FkIGFzeW5jaHJvbm91c2x5XG4gICAgLi4uKHN0eWxlXG4gICAgICA/IHtcbiAgICAgICAgICBpZDpcbiAgICAgICAgICAgIHN0YXRlLmlucHV0U3R5bGUuY3VzdG9tID09PSAnTUFOQUdFRCdcbiAgICAgICAgICAgICAgPyBzdGF0ZS5pbnB1dFN0eWxlLmlkIC8vIGN1c3RvbSBNQU5BR0VEIHR5cGVcbiAgICAgICAgICAgICAgOiAvLyBAdHMtZXhwZWN0LWVycm9yXG4gICAgICAgICAgICAgICAgc3R5bGUuaWQgfHwgZ2VuZXJhdGVIYXNoSWQoKSwgLy8gY3VzdG9tIExPQ0FMIHR5cGVcbiAgICAgICAgICAvLyBtYWtlIGEgY29weSBvZiB0aGUgc3R5bGUgb2JqZWN0XG4gICAgICAgICAgc3R5bGU6IGNsb25lRGVlcChzdHlsZSksXG4gICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvclxuICAgICAgICAgIGxhYmVsOiBzdGF0ZS5pbnB1dFN0eWxlLmxhYmVsIHx8IHN0eWxlLm5hbWUsXG4gICAgICAgICAgLy8gZ2F0aGVyaW5nIGxheWVyIGdyb3VwIGluZm8gZnJvbSBzdHlsZSBqc29uXG4gICAgICAgICAgbGF5ZXJHcm91cHM6IGdldExheWVyR3JvdXBzRnJvbVN0eWxlKHN0eWxlKVxuICAgICAgICB9XG4gICAgICA6IHt9KSxcbiAgICAuLi4oaWNvbiA/IHtpY29ufSA6IHt9KSxcbiAgICAuLi4oZXJyb3IgPyB7ZXJyb3J9IDoge30pXG4gIH1cbn0pO1xuXG4vKipcbiAqIElucHV0IGEgY3VzdG9tIG1hcCBzdHlsZSBvYmplY3RcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBpbnB1dE1hcFN0eWxlVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDoge2lucHV0U3R5bGUsIG1hcFN0YXRlfX06IE1hcFN0eWxlQWN0aW9ucy5JbnB1dE1hcFN0eWxlVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4ge1xuICBjb25zdCB1cGRhdGVkID0ge1xuICAgIC4uLnN0YXRlLmlucHV0U3R5bGUsXG4gICAgLi4uaW5wdXRTdHlsZVxuICB9O1xuXG4gIC8vIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBlaXRoZXIgYSB1cmwgdG8gaG9zdGVkIHN0eWxlIGpzb24gdGhhdCBuZWVkcyBhbiBpY29uIHVybCxcbiAgLy8gb3IgYW4gaWNvbiBhbHJlYWR5IGF2YWlsYWJsZSBjbGllbnQtc2lkZSBhcyBhIGRhdGEgdXJpXG4gIGNvbnN0IGlzVmFsaWRVcmwgPSBpc1ZhbGlkU3R5bGVVcmwodXBkYXRlZC51cmwpO1xuICBjb25zdCBpc1VwZGF0ZWRJY29uRGF0YVVyaSA9IHVwZGF0ZWQuaWNvbj8uc3RhcnRzV2l0aCgnZGF0YTppbWFnZScpO1xuICBjb25zdCBpc1ZhbGlkID0gaXNWYWxpZFVybCB8fCBCb29sZWFuKHVwZGF0ZWQudXBsb2FkZWRGaWxlKTtcblxuICBjb25zdCBpY29uID1cbiAgICBpc1ZhbGlkVXJsICYmICFpc1VwZGF0ZWRJY29uRGF0YVVyaVxuICAgICAgPyBnZXRTdHlsZUltYWdlSWNvbih7XG4gICAgICAgICAgbWFwU3RhdGUsXG4gICAgICAgICAgc3R5bGVVcmw6IHVwZGF0ZWQudXJsIHx8ICcnLFxuICAgICAgICAgIG1hcGJveEFwaUFjY2Vzc1Rva2VuOiB1cGRhdGVkLmFjY2Vzc1Rva2VuIHx8IHN0YXRlLm1hcGJveEFwaUFjY2Vzc1Rva2VuIHx8ICcnLFxuICAgICAgICAgIG1hcGJveEFwaVVybDogc3RhdGUubWFwYm94QXBpVXJsIHx8IERFRkFVTFRfTUFQQk9YX0FQSV9VUkxcbiAgICAgICAgfSlcbiAgICAgIDogdXBkYXRlZC5pY29uO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgaW5wdXRTdHlsZToge1xuICAgICAgLi4udXBkYXRlZCxcbiAgICAgIGlzVmFsaWQsXG4gICAgICBpY29uXG4gICAgfVxuICB9O1xufTtcblxuLyoqXG4gKiBBZGQgbWFwIHN0eWxlIGZyb20gdXNlciBpbnB1dCB0byByZWR1Y2VyIGFuZCBzZXQgaXQgdG8gY3VycmVudCBzdHlsZVxuICogVGhpcyBhY3Rpb24gaXMgY2FsbGVkIHdoZW4gdXNlciBjbGljayBjb25maXJtIGFmdGVyIHB1dHRpbmcgaW4gYSB2YWxpZCBzdHlsZSB1cmwgaW4gdGhlIGN1c3RvbSBtYXAgc3R5bGUgZGlhbG9nLlxuICogSXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIGtlcGxlci5nbCB3aXRob3V0IGEgdmFsaWQgYGlucHV0U3R5bGVgIGluIHRoZSBgbWFwU3R5bGVgIHJlZHVjZXIuXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3QgYWRkQ3VzdG9tTWFwU3R5bGVVcGRhdGVyID0gKHN0YXRlOiBNYXBTdHlsZSk6IE1hcFN0eWxlID0+IHtcbiAgY29uc3Qgc3R5bGVJZCA9IHN0YXRlLmlucHV0U3R5bGUuaWQ7XG4gIGlmICghc3R5bGVJZCkgcmV0dXJuIHN0YXRlO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0gZ2V0TmV3U3RhdGVXaXRoQ3VzdG9tTWFwU3R5bGUoc3RhdGUpO1xuICAvLyBzZXQgbmV3IHN0eWxlXG4gIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobmV3U3RhdGUsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBzdHlsZUlkfX0pO1xufTtcblxuLyoqXG4gKiBFZGl0IG1hcCBzdHlsZSBmcm9tIHVzZXIgaW5wdXQgdG8gcmVkdWNlci5cbiAqIFRoaXMgYWN0aW9uIGlzIGNhbGxlZCB3aGVuIHVzZXIgY2xpY2tzIGNvbmZpcm0gYWZ0ZXIgZWRpdGluZyBhbiBleGlzdGluZyBjdXN0b20gc3R5bGUgaW4gdGhlIGN1c3RvbSBtYXAgc3R5bGUgZGlhbG9nLlxuICogSXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlIGtlcGxlci5nbCB3aXRob3V0IGEgdmFsaWQgYGlucHV0U3R5bGVgIGluIHRoZSBgbWFwU3R5bGVgIHJlZHVjZXIuXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3QgZWRpdEN1c3RvbU1hcFN0eWxlVXBkYXRlciA9IChzdGF0ZTogTWFwU3R5bGUpOiBNYXBTdHlsZSA9PiB7XG4gIHJldHVybiBnZXROZXdTdGF0ZVdpdGhDdXN0b21NYXBTdHlsZShzdGF0ZSk7XG59O1xuXG5mdW5jdGlvbiBnZXROZXdTdGF0ZVdpdGhDdXN0b21NYXBTdHlsZShzdGF0ZTogTWFwU3R5bGUpOiBNYXBTdHlsZSB7XG4gIGNvbnN0IHN0eWxlSWQgPSBzdGF0ZS5pbnB1dFN0eWxlLmlkO1xuICBpZiAoIXN0eWxlSWQpIHJldHVybiBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIC8vIEB0cy1leHBlY3QtZXJyb3IgUHJvcGVydHkgJ2xheWVyR3JvdXBzJyBpcyBtaXNzaW5nIGluIHR5cGUgJ0lucHV0U3R5bGUnIGJ1dCByZXF1aXJlZCBpbiB0eXBlICdCYXNlTWFwU3R5bGUnLiBMZWdhY3kgY2FzZT9cbiAgICBtYXBTdHlsZXM6IHtcbiAgICAgIC4uLnN0YXRlLm1hcFN0eWxlcyxcbiAgICAgIFtzdHlsZUlkXToge1xuICAgICAgICAuLi5zdGF0ZS5tYXBTdHlsZXNbc3R5bGVJZF0sIC8vIGRvIG5vdCB1bmludGVudGlvbmFsbHkgZHJvcCBhbnkgYWRkaXRpb25hbCBwcm9wZXJ0aWVzXG4gICAgICAgIC4uLnN0YXRlLmlucHV0U3R5bGVcbiAgICAgIH1cbiAgICB9LFxuICAgIC8vIHNldCB0byBkZWZhdWx0XG4gICAgaW5wdXRTdHlsZTogZ2V0SW5pdGlhbElucHV0U3R5bGUoKVxuICB9O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIGN1c3RvbSBtYXAgc3R5bGUgZnJvbSBgc3RhdGUubWFwU3R5bGUubWFwU3R5bGVzYC5cbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVDdXN0b21NYXBTdHlsZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBNYXBTdHlsZSxcbiAgYWN0aW9uOiBNYXBTdHlsZUFjdGlvbnMuUmVtb3ZlQ3VzdG9tTWFwU3R5bGVVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiB7XG4gIGNvbnN0IHtpZH0gPSBhY3Rpb24ucGF5bG9hZDtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgY29uc3Qge1tpZF06IF8sIC4uLnJlc3RPZk1hcFN0eWxlc30gPSBzdGF0ZS5tYXBTdHlsZXM7XG5cbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbWFwU3R5bGVzOiByZXN0T2ZNYXBTdHlsZXNcbiAgfTtcblxuICBpZiAoc3RhdGUuc3R5bGVUeXBlID09PSBpZCkge1xuICAgIC8vIGlmIHJlbW92aW5nIGEgY3VzdG9tIHN0eWxlIHRoYXQgaXMgYWxzbyB0aGUgY3VycmVudCBhY3RpdmUgYmFzZSBtYXAsXG4gICAgLy8gdGhlbiByZXNldCB0byB0aGUgZGVmYXVsdCBhY3RpdmUgYmFzZSBtYXAgKGBtYXBTdHlsZS5zdHlsZVR5cGVgKVxuICAgIHJldHVybiBtYXBTdHlsZUNoYW5nZVVwZGF0ZXIobmV3U3RhdGUsIHtwYXlsb2FkOiB7c3R5bGVUeXBlOiBnZXREZWZhdWx0U3RhdGUoKS5zdHlsZVR5cGV9fSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgM2QgYnVpbGRpbmcgY29sb3JcbiAqIEBtZW1iZXJvZiBtYXBTdHlsZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogTWFwU3R5bGUsXG4gIHtwYXlsb2FkOiBjb2xvcn06IE1hcFN0eWxlQWN0aW9ucy5TZXQzZEJ1aWxkaW5nQ29sb3JVcGRhdGVyQWN0aW9uXG4pOiBNYXBTdHlsZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgdGhyZWVEQnVpbGRpbmdDb2xvcjogY29sb3IsXG4gIGN1c3RvbTNEQnVpbGRpbmdDb2xvcjogdHJ1ZVxufSk7XG5cbi8qKlxuICogVXBkYXRlcyBiYWNrZ3JvdW5kIGNvbG9yXG4gKiBAbWVtYmVyb2YgbWFwU3R5bGVVcGRhdGVyc1xuICovXG5leHBvcnQgY29uc3Qgc2V0QmFja2dyb3VuZENvbG9yVXBkYXRlciA9IChcbiAgc3RhdGU6IE1hcFN0eWxlLFxuICB7cGF5bG9hZDogY29sb3J9OiBNYXBTdHlsZUFjdGlvbnMuU2V0QmFja2dyb3VuZENvbG9yVXBkYXRlckFjdGlvblxuKTogTWFwU3R5bGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGJhY2tncm91bmRDb2xvcjogY29sb3Jcbn0pO1xuXG4vKipcbiAqIFJldHVybiB0aGUgaW5pdGlhbCBpbnB1dCBzdHlsZVxuICogQHJldHVybiBPYmplY3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEluaXRpYWxJbnB1dFN0eWxlKCk6IElucHV0U3R5bGUge1xuICByZXR1cm4ge1xuICAgIGlkOiBudWxsLFxuICAgIGFjY2Vzc1Rva2VuOiBudWxsLFxuICAgIGVycm9yOiBmYWxzZSxcbiAgICBpc1ZhbGlkOiBmYWxzZSxcbiAgICBsYWJlbDogbnVsbCxcbiAgICBzdHlsZTogbnVsbCxcbiAgICB1cmw6IG51bGwsXG4gICAgaWNvbjogbnVsbCxcbiAgICBjdXN0b206ICdMT0NBTCcsXG4gICAgdXBsb2FkZWRGaWxlOiBudWxsXG4gIH07XG59XG4iXX0=