@kepler.gl/reducers 3.3.0-alpha.1 → 3.3.0-alpha.10
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} +2 -3
- package/dist/cjs/interaction-utils.js +115 -0
- package/dist/cjs/layer-utils.js +635 -0
- package/dist/cjs/map-state-updaters.js +658 -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 +922 -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 +5100 -0
- package/dist/cjs/vis-state.js +35 -0
- package/dist/combined-updaters.d.ts +19 -2
- package/dist/composers.d.ts +2 -0
- package/dist/esm/combined-updaters.js +484 -0
- 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 +106 -0
- package/dist/esm/layer-utils.js +602 -0
- package/dist/esm/map-state-updaters.js +650 -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 +917 -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 +5006 -0
- package/dist/esm/vis-state.js +29 -0
- package/dist/interaction-utils.d.ts +1 -1
- package/dist/layer-utils.d.ts +23 -5
- package/dist/map-state-updaters.d.ts +26 -21
- package/dist/map-state.d.ts +2 -78
- package/dist/map-style-updaters.d.ts +1 -3
- package/dist/ui-state-updaters.d.ts +17 -2
- package/dist/vis-state-merger.d.ts +7 -0
- package/dist/vis-state-selectors.d.ts +42 -6
- package/dist/vis-state-updaters.d.ts +123 -1
- package/dist/vis-state.d.ts +8 -4
- package/package.json +37 -31
- package/dist/combined-updaters.js +0 -363
- package/dist/composer-helpers.js +0 -101
- package/dist/composers.js +0 -23
- 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 -376
- package/dist/map-state-updaters.js +0 -438
- package/dist/map-state.js +0 -35
- package/dist/map-style-updaters.js +0 -661
- package/dist/map-style.js +0 -34
- package/dist/merger-handler.js +0 -105
- package/dist/middleware.js +0 -27
- package/dist/provider-state-updaters.js +0 -466
- package/dist/provider-state.js +0 -35
- package/dist/root.js +0 -207
- package/dist/ui-state-updaters.js +0 -887
- package/dist/ui-state.js +0 -37
- package/dist/vis-state-merger.js +0 -1032
- package/dist/vis-state-selectors.js +0 -30
- package/dist/vis-state-updaters.js +0 -3859
- package/dist/vis-state.js +0 -36
|
@@ -1,3859 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
var _typeof3 = require("@babel/runtime/helpers/typeof");
|
|
5
|
-
Object.defineProperty(exports, "__esModule", {
|
|
6
|
-
value: true
|
|
7
|
-
});
|
|
8
|
-
exports.addAnnotationUpdater = exports.INITIAL_VIS_STATE = exports.DEFAULT_EDITOR = exports.DEFAULT_ANIMATION_CONFIG = exports.ACTION_TASK_FIT_BOUNDS = exports.ACTION_TASK_ADD_NOTIFICATION = void 0;
|
|
9
|
-
exports.addDefaultLayers = addDefaultLayers;
|
|
10
|
-
exports.addDefaultTooltips = addDefaultTooltips;
|
|
11
|
-
exports.applyCPUFilterUpdater = exports.addLayerUpdater = exports.addFilterUpdater = exports.addEffectUpdater = void 0;
|
|
12
|
-
exports.applyFilterConfigUpdater = applyFilterConfigUpdater;
|
|
13
|
-
exports.applyLayerConfigUpdater = applyLayerConfigUpdater;
|
|
14
|
-
exports.applyMergersUpdater = applyMergersUpdater;
|
|
15
|
-
exports.closeSpecificMapAtIndex = closeSpecificMapAtIndex;
|
|
16
|
-
exports.copyTableColumnUpdater = copyTableColumnUpdater;
|
|
17
|
-
exports.defaultInteractionConfig = exports.createOrUpdateFilterUpdater = exports.createNewDatasetSuccessUpdater = void 0;
|
|
18
|
-
exports.deleteFeatureUpdater = deleteFeatureUpdater;
|
|
19
|
-
exports.duplicateLayerUpdater = exports.duplicateAnnotationUpdater = void 0;
|
|
20
|
-
exports.initialFileLoadingProgress = initialFileLoadingProgress;
|
|
21
|
-
exports.interactionConfigChangeUpdater = interactionConfigChangeUpdater;
|
|
22
|
-
exports.isFilterAnimationConfig = isFilterAnimationConfig;
|
|
23
|
-
exports.layerAnimationChangeUpdater = layerAnimationChangeUpdater;
|
|
24
|
-
exports.layerColorUIChangeUpdater = exports.layerClickUpdater = void 0;
|
|
25
|
-
exports.layerConfigChangeUpdater = layerConfigChangeUpdater;
|
|
26
|
-
exports.layerDataIdChangeUpdater = layerDataIdChangeUpdater;
|
|
27
|
-
exports.layerFilteredItemsChangeUpdater = layerFilteredItemsChangeUpdater;
|
|
28
|
-
exports.layerHoverUpdater = void 0;
|
|
29
|
-
exports.layerSetIsValidUpdater = layerSetIsValidUpdater;
|
|
30
|
-
exports.layerTextLabelChangeUpdater = layerTextLabelChangeUpdater;
|
|
31
|
-
exports.layerToggleVisibilityUpdater = layerToggleVisibilityUpdater;
|
|
32
|
-
exports.layerTypeChangeUpdater = layerTypeChangeUpdater;
|
|
33
|
-
exports.layerVisConfigChangeUpdater = layerVisConfigChangeUpdater;
|
|
34
|
-
exports.layerVisualChannelChangeUpdater = layerVisualChannelChangeUpdater;
|
|
35
|
-
exports.loadFileStepSuccessUpdater = loadFileStepSuccessUpdater;
|
|
36
|
-
exports.loadFilesUpdater = exports.loadFilesErrUpdater = void 0;
|
|
37
|
-
exports.loadNextFileUpdater = loadNextFileUpdater;
|
|
38
|
-
exports.makeLoadFileTask = makeLoadFileTask;
|
|
39
|
-
exports.nextFileBatchUpdater = exports.mouseMoveUpdater = exports.mapClickUpdater = void 0;
|
|
40
|
-
exports.parseProgress = parseProgress;
|
|
41
|
-
exports.pinTableColumnUpdater = pinTableColumnUpdater;
|
|
42
|
-
exports.prepareStateForDatasetReplace = prepareStateForDatasetReplace;
|
|
43
|
-
exports.processFileContentUpdater = processFileContentUpdater;
|
|
44
|
-
exports.removeAnnotationUpdater = exports.receiveMapConfigUpdater = void 0;
|
|
45
|
-
exports.removeDatasetUpdater = removeDatasetUpdater;
|
|
46
|
-
exports.removeFilterUpdater = exports.removeEffectUpdater = void 0;
|
|
47
|
-
exports.removeLayerUpdater = removeLayerUpdater;
|
|
48
|
-
exports.renameDatasetUpdater = renameDatasetUpdater;
|
|
49
|
-
exports.reorderLayerUpdater = exports.reorderEffectUpdater = void 0;
|
|
50
|
-
exports.replaceDatasetDepsInState = replaceDatasetDepsInState;
|
|
51
|
-
exports.resetMapConfigUpdater = void 0;
|
|
52
|
-
exports.setAnimationConfigUpdater = setAnimationConfigUpdater;
|
|
53
|
-
exports.setColumnDisplayFormatUpdater = setColumnDisplayFormatUpdater;
|
|
54
|
-
exports.setEditorModeUpdater = void 0;
|
|
55
|
-
exports.setFeaturesUpdater = setFeaturesUpdater;
|
|
56
|
-
exports.setFilterAnimationTimeConfigUpdater = setFilterAnimationTimeConfigUpdater;
|
|
57
|
-
exports.setFilterAnimationTimeUpdater = setFilterAnimationTimeUpdater;
|
|
58
|
-
exports.setFilterAnimationWindowUpdater = setFilterAnimationWindowUpdater;
|
|
59
|
-
exports.setFilterPlotUpdater = void 0;
|
|
60
|
-
exports.setFilterUpdater = setFilterUpdater;
|
|
61
|
-
exports.setFilterViewUpdater = void 0;
|
|
62
|
-
exports.setInitialLayerConfig = setInitialLayerConfig;
|
|
63
|
-
exports.setLayerAnimationTimeConfigUpdater = setLayerAnimationTimeConfigUpdater;
|
|
64
|
-
exports.setMapInfoUpdater = exports.setLoadingIndicatorUpdater = exports.setLayerAnimationTimeUpdater = void 0;
|
|
65
|
-
exports.setPolygonFilterAllLayersUpdater = setPolygonFilterAllLayersUpdater;
|
|
66
|
-
exports.setPolygonFilterLayerUpdater = setPolygonFilterLayerUpdater;
|
|
67
|
-
exports.setSelectedFeatureUpdater = exports.setSelectedAnnotationUpdater = void 0;
|
|
68
|
-
exports.setTimeFilterTimelineModeUpdater = setTimeFilterTimelineModeUpdater;
|
|
69
|
-
exports.showDatasetTableUpdater = void 0;
|
|
70
|
-
exports.sortTableColumnUpdater = sortTableColumnUpdater;
|
|
71
|
-
exports.syncTimeFilterWithLayerTimelineUpdater = syncTimeFilterWithLayerTimelineUpdater;
|
|
72
|
-
exports.toggleEditorVisibilityUpdater = toggleEditorVisibilityUpdater;
|
|
73
|
-
exports.toggleSplitMapUpdater = exports.toggleLayerForMapUpdater = exports.toggleLayerAnimationUpdater = exports.toggleLayerAnimationControlUpdater = exports.toggleFilterFeatureUpdater = exports.toggleFilterAnimationUpdater = void 0;
|
|
74
|
-
exports.updateAllLayerDomainData = updateAllLayerDomainData;
|
|
75
|
-
exports.updateAnimationDomain = updateAnimationDomain;
|
|
76
|
-
exports.updateAnnotationUpdater = void 0;
|
|
77
|
-
exports.updateDatasetPropsUpdater = updateDatasetPropsUpdater;
|
|
78
|
-
exports.updateEffectUpdater = void 0;
|
|
79
|
-
exports.updateFileLoadingProgressUpdater = updateFileLoadingProgressUpdater;
|
|
80
|
-
exports.updateLayerAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = void 0;
|
|
81
|
-
exports.updateOverlayBlendingUpdater = exports.updateLayerBlendingUpdater = void 0;
|
|
82
|
-
exports.updateStateOnLayerVisibilityChange = updateStateOnLayerVisibilityChange;
|
|
83
|
-
exports.updateStateWithLayerAndData = updateStateWithLayerAndData;
|
|
84
|
-
exports.updateVisDataUpdater = exports.updateTableColorUpdater = void 0;
|
|
85
|
-
exports.wmsFeatureInfoUpdater = wmsFeatureInfoUpdater;
|
|
86
|
-
var _toArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toArray"));
|
|
87
|
-
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
88
|
-
var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
|
|
89
|
-
var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
|
|
90
|
-
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
91
|
-
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
|
|
92
|
-
var _bbox = _interopRequireDefault(require("@turf/bbox"));
|
|
93
|
-
var _copyToClipboard = _interopRequireDefault(require("copy-to-clipboard"));
|
|
94
|
-
var _deepmerge = _interopRequireDefault(require("deepmerge"));
|
|
95
|
-
var _window = require("global/window");
|
|
96
|
-
var _cloneDeep = _interopRequireDefault(require("lodash/cloneDeep"));
|
|
97
|
-
var _get = _interopRequireDefault(require("lodash/get"));
|
|
98
|
-
var _isEqual = _interopRequireDefault(require("lodash/isEqual"));
|
|
99
|
-
var _pick = _interopRequireDefault(require("lodash/pick"));
|
|
100
|
-
var _uniq = _interopRequireDefault(require("lodash/uniq"));
|
|
101
|
-
var _xor = _interopRequireDefault(require("lodash/xor"));
|
|
102
|
-
var _tasks = _interopRequireWildcard(require("react-palm/tasks"));
|
|
103
|
-
var _tasks2 = require("@kepler.gl/tasks");
|
|
104
|
-
var _actions = require("@kepler.gl/actions");
|
|
105
|
-
var _utils = require("@kepler.gl/utils");
|
|
106
|
-
var _commonUtils = require("@kepler.gl/common-utils");
|
|
107
|
-
var _constants = require("@kepler.gl/constants");
|
|
108
|
-
var _layers = require("@kepler.gl/layers");
|
|
109
|
-
var _composerHelpers = require("./composer-helpers");
|
|
110
|
-
var _mergerHandler = require("./merger-handler");
|
|
111
|
-
var _visStateMerger = require("./vis-state-merger");
|
|
112
|
-
var _schemas = _interopRequireDefault(require("@kepler.gl/schemas"));
|
|
113
|
-
var _table = require("@kepler.gl/table");
|
|
114
|
-
var _interactionUtils = require("./interaction-utils");
|
|
115
|
-
var _layerUtils = require("./layer-utils");
|
|
116
|
-
var _effects = require("@kepler.gl/effects");
|
|
117
|
-
var _dataUtils = require("./data-utils");
|
|
118
|
-
var _excluded = ["dataId"],
|
|
119
|
-
_excluded2 = ["info"];
|
|
120
|
-
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
|
|
121
|
-
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof3(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
|
|
122
|
-
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof3(i) ? i : i + ""; }
|
|
123
|
-
function _toPrimitive(t, r) { if ("object" != _typeof3(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof3(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
124
|
-
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
125
|
-
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
126
|
-
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
127
|
-
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; }
|
|
128
|
-
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
|
|
129
|
-
// Copyright contributors to the kepler.gl project
|
|
130
|
-
// Tasks
|
|
131
|
-
// Actions
|
|
132
|
-
// Utils
|
|
133
|
-
// Mergers
|
|
134
|
-
// react-palm
|
|
135
|
-
// disable capture exception for react-palm call to withTask
|
|
136
|
-
(0, _tasks.disableStackCapturing)();
|
|
137
|
-
|
|
138
|
-
/**
|
|
139
|
-
* Updaters for `visState` reducer. Can be used in your root reducer to directly modify kepler.gl's state.
|
|
140
|
-
* Read more about [Using updaters](../advanced-usage/using-updaters.md)
|
|
141
|
-
*
|
|
142
|
-
* @public
|
|
143
|
-
* @example
|
|
144
|
-
*
|
|
145
|
-
* import keplerGlReducer, {visStateUpdaters} from '@kepler.gl/reducers';
|
|
146
|
-
* // Root Reducer
|
|
147
|
-
* const reducers = combineReducers({
|
|
148
|
-
* keplerGl: keplerGlReducer,
|
|
149
|
-
* app: appReducer
|
|
150
|
-
* });
|
|
151
|
-
*
|
|
152
|
-
* const composedReducer = (state, action) => {
|
|
153
|
-
* switch (action.type) {
|
|
154
|
-
* case 'CLICK_BUTTON':
|
|
155
|
-
* return {
|
|
156
|
-
* ...state,
|
|
157
|
-
* keplerGl: {
|
|
158
|
-
* ...state.keplerGl,
|
|
159
|
-
* foo: {
|
|
160
|
-
* ...state.keplerGl.foo,
|
|
161
|
-
* visState: visStateUpdaters.enlargeFilterUpdater(
|
|
162
|
-
* state.keplerGl.foo.visState,
|
|
163
|
-
* {idx: 0}
|
|
164
|
-
* )
|
|
165
|
-
* }
|
|
166
|
-
* }
|
|
167
|
-
* };
|
|
168
|
-
* }
|
|
169
|
-
* return reducers(state, action);
|
|
170
|
-
* };
|
|
171
|
-
*
|
|
172
|
-
* export default composedReducer;
|
|
173
|
-
*/
|
|
174
|
-
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
175
|
-
// @ts-ignore
|
|
176
|
-
var visStateUpdaters = null;
|
|
177
|
-
/* eslint-enable @typescript-eslint/no-unused-vars */
|
|
178
|
-
|
|
179
|
-
var defaultInteractionConfig = exports.defaultInteractionConfig = {
|
|
180
|
-
tooltip: {
|
|
181
|
-
id: 'tooltip',
|
|
182
|
-
label: 'interactions.tooltip',
|
|
183
|
-
enabled: true,
|
|
184
|
-
config: {
|
|
185
|
-
fieldsToShow: {},
|
|
186
|
-
compareMode: false,
|
|
187
|
-
compareType: _constants.COMPARE_TYPES.ABSOLUTE
|
|
188
|
-
}
|
|
189
|
-
},
|
|
190
|
-
geocoder: {
|
|
191
|
-
id: 'geocoder',
|
|
192
|
-
label: 'interactions.geocoder',
|
|
193
|
-
enabled: false,
|
|
194
|
-
position: null,
|
|
195
|
-
config: {
|
|
196
|
-
limitSearch: false
|
|
197
|
-
}
|
|
198
|
-
},
|
|
199
|
-
brush: {
|
|
200
|
-
id: 'brush',
|
|
201
|
-
label: 'interactions.brush',
|
|
202
|
-
enabled: false,
|
|
203
|
-
config: {
|
|
204
|
-
// size is in km
|
|
205
|
-
size: 0.5
|
|
206
|
-
}
|
|
207
|
-
},
|
|
208
|
-
coordinate: {
|
|
209
|
-
id: 'coordinate',
|
|
210
|
-
label: 'interactions.coordinate',
|
|
211
|
-
enabled: false,
|
|
212
|
-
position: null
|
|
213
|
-
}
|
|
214
|
-
};
|
|
215
|
-
var DEFAULT_ANIMATION_CONFIG = exports.DEFAULT_ANIMATION_CONFIG = {
|
|
216
|
-
domain: null,
|
|
217
|
-
currentTime: null,
|
|
218
|
-
speed: 1,
|
|
219
|
-
isAnimating: false,
|
|
220
|
-
timeSteps: null,
|
|
221
|
-
timeFormat: null,
|
|
222
|
-
timezone: null,
|
|
223
|
-
defaultTimeFormat: null,
|
|
224
|
-
hideControl: false,
|
|
225
|
-
duration: null
|
|
226
|
-
};
|
|
227
|
-
var DEFAULT_EDITOR = exports.DEFAULT_EDITOR = {
|
|
228
|
-
mode: _constants.EDITOR_MODES.DRAW_POLYGON,
|
|
229
|
-
features: [],
|
|
230
|
-
selectedFeature: null,
|
|
231
|
-
visible: true
|
|
232
|
-
};
|
|
233
|
-
|
|
234
|
-
/**
|
|
235
|
-
* Default initial `visState`
|
|
236
|
-
* @memberof visStateUpdaters
|
|
237
|
-
* @constant
|
|
238
|
-
* @public
|
|
239
|
-
*/
|
|
240
|
-
var INITIAL_VIS_STATE = exports.INITIAL_VIS_STATE = {
|
|
241
|
-
// map info
|
|
242
|
-
mapInfo: {
|
|
243
|
-
title: '',
|
|
244
|
-
description: ''
|
|
245
|
-
},
|
|
246
|
-
// layers
|
|
247
|
-
layers: [],
|
|
248
|
-
layerData: [],
|
|
249
|
-
layerToBeMerged: [],
|
|
250
|
-
layerOrder: [],
|
|
251
|
-
// filters
|
|
252
|
-
filters: [],
|
|
253
|
-
filterToBeMerged: [],
|
|
254
|
-
// a collection of multiple dataset
|
|
255
|
-
datasets: {},
|
|
256
|
-
editingDataset: undefined,
|
|
257
|
-
// effects
|
|
258
|
-
effects: [],
|
|
259
|
-
effectOrder: [],
|
|
260
|
-
// annotations
|
|
261
|
-
annotations: [],
|
|
262
|
-
annotationsToBeMerged: [],
|
|
263
|
-
selectedAnnotationId: null,
|
|
264
|
-
isEditingAnnotationText: false,
|
|
265
|
-
interactionConfig: defaultInteractionConfig,
|
|
266
|
-
interactionToBeMerged: {},
|
|
267
|
-
layerBlending: 'normal',
|
|
268
|
-
overlayBlending: 'normal',
|
|
269
|
-
hoverInfo: undefined,
|
|
270
|
-
clicked: undefined,
|
|
271
|
-
mousePos: {},
|
|
272
|
-
maxDefaultTooltips: _constants.MAX_DEFAULT_TOOLTIPS,
|
|
273
|
-
// this is used when user split maps
|
|
274
|
-
splitMaps: [
|
|
275
|
-
// this will contain a list of objects to
|
|
276
|
-
// describe the state of layer availability and visibility for each map
|
|
277
|
-
// [
|
|
278
|
-
// {
|
|
279
|
-
// layers: {layer_id: true | false}
|
|
280
|
-
// }
|
|
281
|
-
// ]
|
|
282
|
-
],
|
|
283
|
-
splitMapsToBeMerged: [],
|
|
284
|
-
isMergingDatasets: {},
|
|
285
|
-
// defaults layer classes
|
|
286
|
-
layerClasses: _layers.LayerClasses,
|
|
287
|
-
// default animation
|
|
288
|
-
// time in unix timestamp (milliseconds) (the number of seconds since the Unix Epoch)
|
|
289
|
-
animationConfig: DEFAULT_ANIMATION_CONFIG,
|
|
290
|
-
editor: DEFAULT_EDITOR,
|
|
291
|
-
fileLoading: false,
|
|
292
|
-
fileLoadingProgress: {},
|
|
293
|
-
// for loading datasets
|
|
294
|
-
loadingIndicatorValue: 0,
|
|
295
|
-
loaders: [],
|
|
296
|
-
loadOptions: {},
|
|
297
|
-
// visStateMergers
|
|
298
|
-
mergers: _visStateMerger.VIS_STATE_MERGERS,
|
|
299
|
-
// kepler schemas
|
|
300
|
-
schema: _schemas["default"]
|
|
301
|
-
};
|
|
302
|
-
var ACTION_TASK_FIT_BOUNDS = exports.ACTION_TASK_FIT_BOUNDS = _tasks["default"].fromCallback(function (_, cb) {
|
|
303
|
-
return cb();
|
|
304
|
-
}, 'ACTION_TASK_FIT_BOUNDS');
|
|
305
|
-
var ACTION_TASK_ADD_NOTIFICATION = exports.ACTION_TASK_ADD_NOTIFICATION = _tasks["default"].fromCallback(function (_, cb) {
|
|
306
|
-
return cb();
|
|
307
|
-
}, 'ACTION_TASK_ADD_NOTIFICATION');
|
|
308
|
-
/**
|
|
309
|
-
* Update state with updated layer and layerData
|
|
310
|
-
*
|
|
311
|
-
*/
|
|
312
|
-
function updateStateWithLayerAndData(state, _ref) {
|
|
313
|
-
var layerData = _ref.layerData,
|
|
314
|
-
layer = _ref.layer,
|
|
315
|
-
idx = _ref.idx;
|
|
316
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
317
|
-
layers: state.layers.map(function (lyr, i) {
|
|
318
|
-
return i === idx ? layer : lyr;
|
|
319
|
-
}),
|
|
320
|
-
layerData: layerData ? state.layerData.map(function (d, i) {
|
|
321
|
-
return i === idx ? layerData : d;
|
|
322
|
-
}) : state.layerData
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
function updateStateOnLayerVisibilityChange(state, layer) {
|
|
326
|
-
var newState = state;
|
|
327
|
-
if (state.splitMaps.length) {
|
|
328
|
-
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
329
|
-
splitMaps: layer.config.isVisible ? (0, _utils.addNewLayersToSplitMap)(state.splitMaps, layer) : (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layer)
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
if (layer.config.animation.enabled) {
|
|
333
|
-
newState = updateAnimationDomain(newState);
|
|
334
|
-
}
|
|
335
|
-
return newState;
|
|
336
|
-
}
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Compares two objects (or arrays) and returns a new object with only the
|
|
340
|
-
* properties that have changed between the two objects.
|
|
341
|
-
*/
|
|
342
|
-
function pickChangedProps(prev, next) {
|
|
343
|
-
var changedProps = {};
|
|
344
|
-
var pickPropsOf = function pickPropsOf(obj) {
|
|
345
|
-
Object.keys(obj).forEach(function (key) {
|
|
346
|
-
if (!Object.prototype.hasOwnProperty.call(changedProps, key) && !(0, _isEqual["default"])(prev[key], next[key])) {
|
|
347
|
-
changedProps[key] = next[key];
|
|
348
|
-
}
|
|
349
|
-
});
|
|
350
|
-
};
|
|
351
|
-
pickPropsOf(prev);
|
|
352
|
-
pickPropsOf(next);
|
|
353
|
-
return changedProps;
|
|
354
|
-
}
|
|
355
|
-
var VISUAL_CHANNEL_PROP_TYPES = ['field', 'scale', 'domain', 'aggregation'];
|
|
356
|
-
|
|
357
|
-
/**
|
|
358
|
-
* Apply layer config
|
|
359
|
-
* @memberof visStateUpdaters
|
|
360
|
-
* @returns nextState
|
|
361
|
-
*/
|
|
362
|
-
// eslint-disable-next-line complexity, max-statements
|
|
363
|
-
function applyLayerConfigUpdater(state, action) {
|
|
364
|
-
var _serializeLayer;
|
|
365
|
-
var oldLayerId = action.oldLayerId,
|
|
366
|
-
newLayerConfig = action.newLayerConfig,
|
|
367
|
-
layerIndex = action.layerIndex;
|
|
368
|
-
var newParsedLayer =
|
|
369
|
-
// will move visualChannels to the config prop
|
|
370
|
-
(0, _visStateMerger.parseLayerConfig)(state.schema, newLayerConfig);
|
|
371
|
-
var oldLayer = state.layers.find(function (l) {
|
|
372
|
-
return l.id === oldLayerId;
|
|
373
|
-
});
|
|
374
|
-
if (!oldLayer || !newParsedLayer) {
|
|
375
|
-
return state;
|
|
376
|
-
}
|
|
377
|
-
if (layerIndex !== null && layerIndex !== undefined && state.layers[layerIndex] !== oldLayer) {
|
|
378
|
-
// layerIndex is provided, but it doesn't match the oldLayer
|
|
379
|
-
return state;
|
|
380
|
-
}
|
|
381
|
-
var dataset = state.datasets[newParsedLayer.config.dataId];
|
|
382
|
-
if (!dataset) {
|
|
383
|
-
return state;
|
|
384
|
-
}
|
|
385
|
-
// Make sure the layer is valid and convert it to Layer
|
|
386
|
-
var newLayer = (0, _visStateMerger.validateLayerWithData)(dataset, newParsedLayer, state.layerClasses);
|
|
387
|
-
if (!newLayer) {
|
|
388
|
-
return state;
|
|
389
|
-
}
|
|
390
|
-
var nextState = state;
|
|
391
|
-
if (newLayer.type && newLayer.type !== oldLayer.type) {
|
|
392
|
-
var oldLayerIndex = state.layers.findIndex(function (l) {
|
|
393
|
-
return l.id === oldLayerId;
|
|
394
|
-
});
|
|
395
|
-
if (oldLayerIndex >= 0) {
|
|
396
|
-
nextState = layerTypeChangeUpdater(nextState, (0, _actions.layerTypeChange)(oldLayer, newLayer.type));
|
|
397
|
-
// layerTypeChangeUpdater changes the id of the layer, so we need to obtain the new id
|
|
398
|
-
// but first make sure that the layer was not removed
|
|
399
|
-
if (nextState.layers.length === state.layers.length) {
|
|
400
|
-
var newLayerId = nextState.layers[oldLayerIndex].id;
|
|
401
|
-
nextState = applyLayerConfigUpdater(nextState, (0, _actions.applyLayerConfig)(newLayerId, _objectSpread(_objectSpread({}, newLayerConfig), {}, {
|
|
402
|
-
id: newLayerId
|
|
403
|
-
})));
|
|
404
|
-
}
|
|
405
|
-
}
|
|
406
|
-
return nextState;
|
|
407
|
-
}
|
|
408
|
-
|
|
409
|
-
// serializeLayer() might return null if the old layer is not valid,
|
|
410
|
-
// we should still apply the changes in that case
|
|
411
|
-
var serializedOldLayer = (_serializeLayer = (0, _visStateMerger.serializeLayer)(oldLayer, state.schema)) !== null && _serializeLayer !== void 0 ? _serializeLayer : {
|
|
412
|
-
config: {}
|
|
413
|
-
};
|
|
414
|
-
var serializedNewLayer = (0, _visStateMerger.serializeLayer)(newLayer, state.schema);
|
|
415
|
-
if (!serializedNewLayer) {
|
|
416
|
-
return state;
|
|
417
|
-
}
|
|
418
|
-
if (!(0, _isEqual["default"])(serializedOldLayer, serializedNewLayer)) {
|
|
419
|
-
var changed = pickChangedProps(serializedOldLayer.config, serializedNewLayer.config);
|
|
420
|
-
if ('visConfig' in changed) {
|
|
421
|
-
if (changed.visConfig) {
|
|
422
|
-
nextState = layerVisConfigChangeUpdater(nextState, (0, _actions.layerVisConfigChange)(oldLayer, changed.visConfig));
|
|
423
|
-
}
|
|
424
|
-
delete changed.visConfig;
|
|
425
|
-
}
|
|
426
|
-
Object.keys(oldLayer.visualChannels).forEach(function (channelName) {
|
|
427
|
-
var channel = oldLayer.visualChannels[channelName];
|
|
428
|
-
var channelPropNames = VISUAL_CHANNEL_PROP_TYPES.map(function (prop) {
|
|
429
|
-
return channel[prop];
|
|
430
|
-
});
|
|
431
|
-
if (channelPropNames.some(function (prop) {
|
|
432
|
-
return prop in changed;
|
|
433
|
-
})) {
|
|
434
|
-
nextState = layerVisualChannelChangeUpdater(nextState, (0, _actions.layerVisualChannelConfigChange)(oldLayer, (0, _pick["default"])(newLayer.config, channelPropNames), channelName));
|
|
435
|
-
var _iterator = _createForOfIteratorHelper(channelPropNames),
|
|
436
|
-
_step;
|
|
437
|
-
try {
|
|
438
|
-
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
439
|
-
var prop = _step.value;
|
|
440
|
-
delete changed[prop];
|
|
441
|
-
}
|
|
442
|
-
} catch (err) {
|
|
443
|
-
_iterator.e(err);
|
|
444
|
-
} finally {
|
|
445
|
-
_iterator.f();
|
|
446
|
-
}
|
|
447
|
-
}
|
|
448
|
-
});
|
|
449
|
-
if (Object.keys(changed).length > 0) {
|
|
450
|
-
nextState = layerConfigChangeUpdater(nextState, (0, _actions.layerConfigChange)(oldLayer, (0, _pick["default"])(newLayer.config, Object.keys(changed))));
|
|
451
|
-
}
|
|
452
|
-
}
|
|
453
|
-
return nextState;
|
|
454
|
-
}
|
|
455
|
-
function updatelayerVisibilty(state, newLayer, isVisible) {
|
|
456
|
-
var newState = updateStateOnLayerVisibilityChange(state, newLayer);
|
|
457
|
-
var filterIndex = filterSyncedWithTimeline(state);
|
|
458
|
-
if ((0, _utils.isLayerAnimatable)(newLayer) && filterIndex !== -1) {
|
|
459
|
-
// if layer is going to be visible we sync with filter otherwise we need to check whether other animatable layers exists and are visible
|
|
460
|
-
newState = syncTimeFilterWithLayerTimelineUpdater(newState, {
|
|
461
|
-
idx: filterIndex,
|
|
462
|
-
enable: isVisible ? isVisible : (0, _utils.getAnimatableVisibleLayers)(state.layers).length > 0
|
|
463
|
-
});
|
|
464
|
-
}
|
|
465
|
-
return newState;
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
/**
|
|
469
|
-
* Update layer base config: dataId, label, column, isVisible
|
|
470
|
-
* @memberof visStateUpdaters
|
|
471
|
-
* @returns nextState
|
|
472
|
-
*/
|
|
473
|
-
// eslint-disable-next-line complexity
|
|
474
|
-
function layerConfigChangeUpdater(state, action) {
|
|
475
|
-
var oldLayer = action.oldLayer;
|
|
476
|
-
var idx = state.layers.findIndex(function (l) {
|
|
477
|
-
return l.id === oldLayer.id;
|
|
478
|
-
});
|
|
479
|
-
var props = Object.keys(action.newConfig);
|
|
480
|
-
if (typeof action.newConfig.dataId === 'string' && action.newConfig.dataId !== oldLayer.config.dataId) {
|
|
481
|
-
var _action$newConfig = action.newConfig,
|
|
482
|
-
dataId = _action$newConfig.dataId,
|
|
483
|
-
restConfig = (0, _objectWithoutProperties2["default"])(_action$newConfig, _excluded);
|
|
484
|
-
var stateWithDataId = layerDataIdChangeUpdater(state, {
|
|
485
|
-
oldLayer: oldLayer,
|
|
486
|
-
newConfig: {
|
|
487
|
-
dataId: dataId
|
|
488
|
-
}
|
|
489
|
-
});
|
|
490
|
-
var nextLayer = stateWithDataId.layers.find(function (l) {
|
|
491
|
-
return l.id === oldLayer.id;
|
|
492
|
-
});
|
|
493
|
-
return nextLayer && Object.keys(restConfig).length ? layerConfigChangeUpdater(stateWithDataId, {
|
|
494
|
-
oldLayer: nextLayer,
|
|
495
|
-
newConfig: restConfig
|
|
496
|
-
}) : stateWithDataId;
|
|
497
|
-
}
|
|
498
|
-
var newLayer = oldLayer.updateLayerConfig(action.newConfig);
|
|
499
|
-
var layerData;
|
|
500
|
-
if (newLayer.shouldCalculateLayerData(props)) {
|
|
501
|
-
var oldLayerData = state.layerData[idx];
|
|
502
|
-
var updateLayerDataResult = (0, _layerUtils.calculateLayerData)(newLayer, state, oldLayerData);
|
|
503
|
-
newLayer = updateLayerDataResult.layer;
|
|
504
|
-
layerData = updateLayerDataResult.layerData;
|
|
505
|
-
}
|
|
506
|
-
var newState = state;
|
|
507
|
-
if ('isVisible' in action.newConfig) {
|
|
508
|
-
newState = updatelayerVisibilty(newState, newLayer, action.newConfig.isVisible);
|
|
509
|
-
}
|
|
510
|
-
if ('columns' in action.newConfig && newLayer.config.animation.enabled) {
|
|
511
|
-
// TODO: Shan, make the animation config function more robust
|
|
512
|
-
newState = updateAnimationDomain(newState);
|
|
513
|
-
}
|
|
514
|
-
return updateStateWithLayerAndData(newState, {
|
|
515
|
-
layer: newLayer,
|
|
516
|
-
layerData: layerData,
|
|
517
|
-
idx: idx
|
|
518
|
-
});
|
|
519
|
-
}
|
|
520
|
-
function layerAnimationChangeUpdater(state, action) {
|
|
521
|
-
var oldLayer = action.oldLayer,
|
|
522
|
-
prop = action.prop,
|
|
523
|
-
value = action.value;
|
|
524
|
-
var idx = state.layers.findIndex(function (l) {
|
|
525
|
-
return l.id === oldLayer.id;
|
|
526
|
-
});
|
|
527
|
-
var newLayer = oldLayer.updateLayerConfig({
|
|
528
|
-
animation: _objectSpread(_objectSpread({}, oldLayer.config.animation), {}, (0, _defineProperty2["default"])({}, prop, value))
|
|
529
|
-
});
|
|
530
|
-
var _calculateLayerData = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[idx]),
|
|
531
|
-
layerData = _calculateLayerData.layerData,
|
|
532
|
-
layer = _calculateLayerData.layer;
|
|
533
|
-
return updateStateWithLayerAndData(state, {
|
|
534
|
-
layerData: layerData,
|
|
535
|
-
layer: layer,
|
|
536
|
-
idx: idx
|
|
537
|
-
});
|
|
538
|
-
}
|
|
539
|
-
|
|
540
|
-
/**
|
|
541
|
-
* Update layerId, isVisible, splitMapId
|
|
542
|
-
* handles two cases:
|
|
543
|
-
* 1) toggle the visibility of local SplitMap layer (visState.splitMap.layers)
|
|
544
|
-
* 2) toggle the visibility of global layer (visState.layers)
|
|
545
|
-
|
|
546
|
-
* @memberof visStateUpdaters
|
|
547
|
-
* @returns nextState
|
|
548
|
-
*/
|
|
549
|
-
function layerToggleVisibilityUpdater(state, action) {
|
|
550
|
-
var layerId = action.layerId,
|
|
551
|
-
isVisible = action.isVisible,
|
|
552
|
-
splitMapId = action.splitMapId;
|
|
553
|
-
var layer = state.layers.find(function (d) {
|
|
554
|
-
return d.id === layerId;
|
|
555
|
-
});
|
|
556
|
-
if (!layer) {
|
|
557
|
-
return state;
|
|
558
|
-
}
|
|
559
|
-
var newState = state;
|
|
560
|
-
if (splitMapId) {
|
|
561
|
-
// [case 1]: toggle local layer visibility for each SplitMap
|
|
562
|
-
var mapIndex = newState.splitMaps.findIndex(function (sm) {
|
|
563
|
-
return sm.id === splitMapId;
|
|
564
|
-
});
|
|
565
|
-
if (isVisible) {
|
|
566
|
-
// 1) if the layer is invisible globally
|
|
567
|
-
// -> set global visibility to true
|
|
568
|
-
newState = layerConfigChangeUpdater(newState, (0, _actions.layerConfigChange)(layer, {
|
|
569
|
-
isVisible: true
|
|
570
|
-
}));
|
|
571
|
-
|
|
572
|
-
// -> set local visibility to true and the local visibilities of all other SplitMaps to false
|
|
573
|
-
return _objectSpread(_objectSpread({}, newState), {}, {
|
|
574
|
-
splitMaps: newState.splitMaps.map(function (sm) {
|
|
575
|
-
return sm.id !== splitMapId ? _objectSpread(_objectSpread({}, sm), {}, {
|
|
576
|
-
layers: _objectSpread(_objectSpread({}, sm.layers), {}, (0, _defineProperty2["default"])({}, layerId, false))
|
|
577
|
-
}) : _objectSpread(_objectSpread({}, sm), {}, {
|
|
578
|
-
layers: _objectSpread(_objectSpread({}, sm.layers), {}, (0, _defineProperty2["default"])({}, layerId, true))
|
|
579
|
-
});
|
|
580
|
-
})
|
|
581
|
-
});
|
|
582
|
-
}
|
|
583
|
-
// 2) else when the layer is visible globally
|
|
584
|
-
return toggleLayerForMapUpdater(newState, (0, _actions.toggleLayerForMap)(mapIndex, layerId));
|
|
585
|
-
} else {
|
|
586
|
-
// [case 2]: toggle global layer visibility
|
|
587
|
-
var newLayer = layer.updateLayerConfig({
|
|
588
|
-
isVisible: isVisible
|
|
589
|
-
});
|
|
590
|
-
var idx = newState.layers.findIndex(function (l) {
|
|
591
|
-
return l.id === layerId;
|
|
592
|
-
});
|
|
593
|
-
newState = updatelayerVisibilty(newState, newLayer, isVisible);
|
|
594
|
-
return updateStateWithLayerAndData(newState, {
|
|
595
|
-
layer: newLayer,
|
|
596
|
-
idx: idx
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
|
|
601
|
-
/**
|
|
602
|
-
*
|
|
603
|
-
* @param state
|
|
604
|
-
* @returns index of the filter synced to timeline or -1
|
|
605
|
-
*/
|
|
606
|
-
function filterSyncedWithTimeline(state) {
|
|
607
|
-
return state.filters.findIndex(function (f) {
|
|
608
|
-
return f.syncedWithLayerTimeline;
|
|
609
|
-
});
|
|
610
|
-
}
|
|
611
|
-
|
|
612
|
-
/**
|
|
613
|
-
* Updates isValid flag of a layer.
|
|
614
|
-
* Updates isVisible based on the value of isValid.
|
|
615
|
-
* Triggers update of data for the layer in order to get errors again during next update iteration.
|
|
616
|
-
* @memberof visStateUpdaters
|
|
617
|
-
* @returns nextState
|
|
618
|
-
*/
|
|
619
|
-
function layerSetIsValidUpdater(state, action) {
|
|
620
|
-
var oldLayer = action.oldLayer,
|
|
621
|
-
isValid = action.isValid;
|
|
622
|
-
var idx = state.layers.findIndex(function (l) {
|
|
623
|
-
return l.id === oldLayer.id;
|
|
624
|
-
});
|
|
625
|
-
var layerToUpdate = state.layers[idx];
|
|
626
|
-
if (layerToUpdate) {
|
|
627
|
-
var newLayer;
|
|
628
|
-
var newData = null;
|
|
629
|
-
if (isValid) {
|
|
630
|
-
// Trigger data update in order to show errors again if present.
|
|
631
|
-
var _calculateLayerData2 = (0, _layerUtils.calculateLayerData)(layerToUpdate, state, undefined),
|
|
632
|
-
layer = _calculateLayerData2.layer,
|
|
633
|
-
layerData = _calculateLayerData2.layerData;
|
|
634
|
-
newLayer = layer;
|
|
635
|
-
newData = layerData;
|
|
636
|
-
} else {
|
|
637
|
-
newLayer = layerToUpdate.updateLayerConfig({
|
|
638
|
-
isVisible: false
|
|
639
|
-
});
|
|
640
|
-
newLayer.isValid = false;
|
|
641
|
-
}
|
|
642
|
-
return updateStateWithLayerAndData(state, {
|
|
643
|
-
idx: idx,
|
|
644
|
-
layer: newLayer,
|
|
645
|
-
layerData: newData
|
|
646
|
-
});
|
|
647
|
-
}
|
|
648
|
-
return state;
|
|
649
|
-
}
|
|
650
|
-
function addOrRemoveTextLabels(newFields, textLabel) {
|
|
651
|
-
var defaultTextLabel = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : _constants.DEFAULT_TEXT_LABEL;
|
|
652
|
-
var newTextLabel = textLabel.slice();
|
|
653
|
-
var currentFields = textLabel.map(function (tl) {
|
|
654
|
-
return tl.field && tl.field.name;
|
|
655
|
-
}).filter(function (d) {
|
|
656
|
-
return d;
|
|
657
|
-
});
|
|
658
|
-
var addFields = newFields.filter(function (f) {
|
|
659
|
-
return !currentFields.includes(f.name);
|
|
660
|
-
});
|
|
661
|
-
var deleteFields = currentFields.filter(function (f) {
|
|
662
|
-
return !newFields.find(function (fd) {
|
|
663
|
-
return fd.name === f;
|
|
664
|
-
});
|
|
665
|
-
});
|
|
666
|
-
|
|
667
|
-
// delete
|
|
668
|
-
newTextLabel = newTextLabel.filter(function (tl) {
|
|
669
|
-
return tl.field && !deleteFields.includes(tl.field.name);
|
|
670
|
-
});
|
|
671
|
-
newTextLabel = !newTextLabel.length ? [defaultTextLabel] : newTextLabel;
|
|
672
|
-
|
|
673
|
-
// add
|
|
674
|
-
newTextLabel = [].concat((0, _toConsumableArray2["default"])(newTextLabel.filter(function (tl) {
|
|
675
|
-
return tl.field;
|
|
676
|
-
})), (0, _toConsumableArray2["default"])(addFields.map(function (af) {
|
|
677
|
-
return _objectSpread(_objectSpread({}, defaultTextLabel), {}, {
|
|
678
|
-
field: af
|
|
679
|
-
});
|
|
680
|
-
})));
|
|
681
|
-
return newTextLabel;
|
|
682
|
-
}
|
|
683
|
-
function updateTextLabelPropAndValue(idx, prop, value, textLabel) {
|
|
684
|
-
if (!Object.prototype.hasOwnProperty.call(textLabel[idx], prop)) {
|
|
685
|
-
return textLabel;
|
|
686
|
-
}
|
|
687
|
-
var newTextLabel = textLabel.slice();
|
|
688
|
-
if (prop === 'field' && value === null && textLabel.length > 1) {
|
|
689
|
-
// remove label when field value is set to null
|
|
690
|
-
newTextLabel.splice(idx, 1);
|
|
691
|
-
} else if (prop) {
|
|
692
|
-
newTextLabel = textLabel.map(function (tl, i) {
|
|
693
|
-
return i === idx ? _objectSpread(_objectSpread({}, tl), {}, (0, _defineProperty2["default"])({}, prop, value)) : tl;
|
|
694
|
-
});
|
|
695
|
-
}
|
|
696
|
-
return newTextLabel;
|
|
697
|
-
}
|
|
698
|
-
|
|
699
|
-
/**
|
|
700
|
-
* Update layer base config: dataId, label, column, isVisible
|
|
701
|
-
* @memberof visStateUpdaters
|
|
702
|
-
* @returns nextState
|
|
703
|
-
*/
|
|
704
|
-
function layerTextLabelChangeUpdater(state, action) {
|
|
705
|
-
var _oldLayer$getDefaultL, _oldLayer$getDefaultL2;
|
|
706
|
-
var oldLayer = action.oldLayer,
|
|
707
|
-
idx = action.idx,
|
|
708
|
-
prop = action.prop,
|
|
709
|
-
value = action.value;
|
|
710
|
-
var textLabel = oldLayer.config.textLabel;
|
|
711
|
-
|
|
712
|
-
// when adding a new empty text label,
|
|
713
|
-
// rely on the layer's default config, or use the constant DEFAULT_TEXT_LABEL
|
|
714
|
-
var defaultTextLabel = (_oldLayer$getDefaultL = (_oldLayer$getDefaultL2 = oldLayer.getDefaultLayerConfig({
|
|
715
|
-
dataId: ''
|
|
716
|
-
})) === null || _oldLayer$getDefaultL2 === void 0 || (_oldLayer$getDefaultL2 = _oldLayer$getDefaultL2.textLabel) === null || _oldLayer$getDefaultL2 === void 0 ? void 0 : _oldLayer$getDefaultL2[0]) !== null && _oldLayer$getDefaultL !== void 0 ? _oldLayer$getDefaultL : _constants.DEFAULT_TEXT_LABEL;
|
|
717
|
-
var newTextLabel = textLabel.slice();
|
|
718
|
-
if (!textLabel[idx] && idx === textLabel.length) {
|
|
719
|
-
// if idx is set to length, add empty text label
|
|
720
|
-
newTextLabel = [].concat((0, _toConsumableArray2["default"])(textLabel), [defaultTextLabel]);
|
|
721
|
-
}
|
|
722
|
-
if (idx === 'all' && prop === 'fields') {
|
|
723
|
-
newTextLabel = addOrRemoveTextLabels(value, textLabel, defaultTextLabel);
|
|
724
|
-
} else {
|
|
725
|
-
newTextLabel = updateTextLabelPropAndValue(idx, prop, value, newTextLabel);
|
|
726
|
-
}
|
|
727
|
-
// update text label prop and value
|
|
728
|
-
return layerConfigChangeUpdater(state, {
|
|
729
|
-
oldLayer: oldLayer,
|
|
730
|
-
newConfig: {
|
|
731
|
-
textLabel: newTextLabel
|
|
732
|
-
}
|
|
733
|
-
});
|
|
734
|
-
}
|
|
735
|
-
function validateExistingLayerWithData(dataset, layerClasses, layer, schema) {
|
|
736
|
-
var loadedLayer = (0, _visStateMerger.serializeLayer)(layer, schema);
|
|
737
|
-
return loadedLayer ? (0, _visStateMerger.validateLayerWithData)(dataset, loadedLayer, layerClasses, {
|
|
738
|
-
allowEmptyColumn: true
|
|
739
|
-
}) : null;
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
/**
|
|
743
|
-
* Update layer config dataId
|
|
744
|
-
* @memberof visStateUpdaters
|
|
745
|
-
* @returns nextState
|
|
746
|
-
*/
|
|
747
|
-
function layerDataIdChangeUpdater(state, action) {
|
|
748
|
-
var oldLayer = action.oldLayer,
|
|
749
|
-
newConfig = action.newConfig;
|
|
750
|
-
var dataId = newConfig.dataId;
|
|
751
|
-
if (!oldLayer || !state.datasets[dataId]) {
|
|
752
|
-
return state;
|
|
753
|
-
}
|
|
754
|
-
var idx = state.layers.findIndex(function (l) {
|
|
755
|
-
return l.id === oldLayer.id;
|
|
756
|
-
});
|
|
757
|
-
var newLayer = oldLayer.updateLayerConfig({
|
|
758
|
-
dataId: dataId
|
|
759
|
-
});
|
|
760
|
-
|
|
761
|
-
// this may happen when a layer is new (type: null and no columns) but it's not ready to be saved
|
|
762
|
-
if (newLayer.isValidToSave()) {
|
|
763
|
-
var validated = validateExistingLayerWithData(state.datasets[dataId], state.layerClasses, newLayer, state.schema);
|
|
764
|
-
// if cant validate it with data create a new one
|
|
765
|
-
if (!validated) {
|
|
766
|
-
var oldLayerType = oldLayer.type;
|
|
767
|
-
if (oldLayerType) {
|
|
768
|
-
newLayer = new state.layerClasses[oldLayerType]({
|
|
769
|
-
dataId: dataId,
|
|
770
|
-
id: oldLayer.id
|
|
771
|
-
});
|
|
772
|
-
}
|
|
773
|
-
} else {
|
|
774
|
-
newLayer = validated;
|
|
775
|
-
}
|
|
776
|
-
} else {
|
|
777
|
-
// Layer is not valid to save (e.g. missing columns), but we still need to
|
|
778
|
-
// remap visual channel fields to the new dataset to avoid stale field references
|
|
779
|
-
// that point to rows beyond the new dataset's length
|
|
780
|
-
var newDatasetFields = state.datasets[dataId].fields;
|
|
781
|
-
var remappedFields = {};
|
|
782
|
-
Object.values(newLayer.visualChannels).forEach(function (_ref2) {
|
|
783
|
-
var fieldKey = _ref2.field;
|
|
784
|
-
var currentField = newLayer.config[fieldKey];
|
|
785
|
-
if (currentField) {
|
|
786
|
-
var matched = newDatasetFields.find(function (f) {
|
|
787
|
-
return f.name === currentField.name;
|
|
788
|
-
});
|
|
789
|
-
remappedFields[fieldKey] = matched || null;
|
|
790
|
-
}
|
|
791
|
-
});
|
|
792
|
-
if (Object.keys(remappedFields).length) {
|
|
793
|
-
newLayer = newLayer.updateLayerConfig(remappedFields);
|
|
794
|
-
}
|
|
795
|
-
// Validate field type compatibility — clears fields whose type is incompatible
|
|
796
|
-
// with the channel's supported field types (e.g. string field for a numeric scale)
|
|
797
|
-
Object.values(newLayer.visualChannels).forEach(function (_ref3) {
|
|
798
|
-
var key = _ref3.key;
|
|
799
|
-
newLayer.validateVisualChannel(key);
|
|
800
|
-
});
|
|
801
|
-
}
|
|
802
|
-
newLayer = newLayer.updateLayerConfig({
|
|
803
|
-
isVisible: oldLayer.config.isVisible,
|
|
804
|
-
isConfigActive: true
|
|
805
|
-
});
|
|
806
|
-
newLayer.updateLayerDomain(state.datasets);
|
|
807
|
-
var _calculateLayerData3 = (0, _layerUtils.calculateLayerData)(newLayer, state, undefined),
|
|
808
|
-
layerData = _calculateLayerData3.layerData,
|
|
809
|
-
layer = _calculateLayerData3.layer;
|
|
810
|
-
return updateStateWithLayerAndData(state, {
|
|
811
|
-
layerData: layerData,
|
|
812
|
-
layer: layer,
|
|
813
|
-
idx: idx
|
|
814
|
-
});
|
|
815
|
-
}
|
|
816
|
-
function setInitialLayerConfig(layer, datasets, layerClasses) {
|
|
817
|
-
var newLayer = layer;
|
|
818
|
-
if (!Object.keys(datasets).length) {
|
|
819
|
-
// no data is loaded
|
|
820
|
-
return layer;
|
|
821
|
-
}
|
|
822
|
-
if (!layer.config.dataId) {
|
|
823
|
-
// set layer dataId
|
|
824
|
-
newLayer = layer.updateLayerConfig({
|
|
825
|
-
dataId: Object.keys(datasets)[0]
|
|
826
|
-
});
|
|
827
|
-
}
|
|
828
|
-
var dataset = datasets[newLayer.config.dataId];
|
|
829
|
-
if (!dataset) {
|
|
830
|
-
return layer;
|
|
831
|
-
}
|
|
832
|
-
|
|
833
|
-
// find defaut layer props
|
|
834
|
-
var result = typeof layerClasses[newLayer.type].findDefaultLayerProps === 'function' ? layerClasses[newLayer.type].findDefaultLayerProps(dataset, []) : {
|
|
835
|
-
props: []
|
|
836
|
-
};
|
|
837
|
-
|
|
838
|
-
// an array of possible props, use 1st one
|
|
839
|
-
var props = Array.isArray(result) ? result : result.props || [];
|
|
840
|
-
if (props.length) {
|
|
841
|
-
newLayer = new layerClasses[layer.type](_objectSpread(_objectSpread({}, props[0]), {}, {
|
|
842
|
-
label: newLayer.config.label,
|
|
843
|
-
dataId: newLayer.config.dataId,
|
|
844
|
-
isConfigActive: newLayer.config.isConfigActive,
|
|
845
|
-
isVisible: newLayer.config.isVisible
|
|
846
|
-
}));
|
|
847
|
-
}
|
|
848
|
-
return typeof newLayer.setInitialLayerConfig === 'function' ? newLayer.setInitialLayerConfig(dataset) : newLayer;
|
|
849
|
-
}
|
|
850
|
-
/**
|
|
851
|
-
* Update layer type. Previews layer config will be copied if applicable.
|
|
852
|
-
* @memberof visStateUpdaters
|
|
853
|
-
* @public
|
|
854
|
-
*/
|
|
855
|
-
function layerTypeChangeUpdater(state, action) {
|
|
856
|
-
var oldLayer = action.oldLayer,
|
|
857
|
-
newType = action.newType;
|
|
858
|
-
if (!oldLayer) {
|
|
859
|
-
return state;
|
|
860
|
-
}
|
|
861
|
-
var oldId = oldLayer.id;
|
|
862
|
-
var idx = state.layers.findIndex(function (l) {
|
|
863
|
-
return l.id === oldId;
|
|
864
|
-
});
|
|
865
|
-
if (!state.layerClasses[newType]) {
|
|
866
|
-
_window.console.error("".concat(newType, " is not a valid layer type"));
|
|
867
|
-
return state;
|
|
868
|
-
}
|
|
869
|
-
var newLayer = new state.layerClasses[newType]({
|
|
870
|
-
// keep old layer lable and isConfigActive
|
|
871
|
-
label: oldLayer.config.label,
|
|
872
|
-
isConfigActive: oldLayer.config.isConfigActive,
|
|
873
|
-
dataId: oldLayer.config.dataId
|
|
874
|
-
});
|
|
875
|
-
if (!oldLayer.type) {
|
|
876
|
-
// if setting layer type on an empty layer
|
|
877
|
-
newLayer = setInitialLayerConfig(newLayer, state.datasets, state.layerClasses);
|
|
878
|
-
} else {
|
|
879
|
-
// get a mint layer, with new id and type
|
|
880
|
-
// because deck.gl uses id to match between new and old layer.
|
|
881
|
-
// If type has changed but id is the same, it will break
|
|
882
|
-
|
|
883
|
-
var defaultLayerProps = typeof state.layerClasses[newType].findDefaultLayerProps === 'function' ? state.layerClasses[newType].findDefaultLayerProps(state.datasets[newLayer.config.dataId]) : null;
|
|
884
|
-
newLayer.assignConfigToLayer(oldLayer.config, oldLayer.visConfigSettings, state.datasets, defaultLayerProps);
|
|
885
|
-
newLayer.updateLayerDomain(state.datasets);
|
|
886
|
-
}
|
|
887
|
-
var clicked = state.clicked,
|
|
888
|
-
hoverInfo = state.hoverInfo;
|
|
889
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
890
|
-
clicked: oldLayer.isLayerHovered(clicked) ? undefined : clicked,
|
|
891
|
-
hoverInfo: oldLayer.isLayerHovered(hoverInfo) ? undefined : hoverInfo
|
|
892
|
-
});
|
|
893
|
-
var _calculateLayerData4 = (0, _layerUtils.calculateLayerData)(newLayer, newState),
|
|
894
|
-
layerData = _calculateLayerData4.layerData,
|
|
895
|
-
layer = _calculateLayerData4.layer;
|
|
896
|
-
newState = updateStateWithLayerAndData(newState, {
|
|
897
|
-
layerData: layerData,
|
|
898
|
-
layer: layer,
|
|
899
|
-
idx: idx
|
|
900
|
-
});
|
|
901
|
-
if (layer.config.animation.enabled || oldLayer.config.animation.enabled) {
|
|
902
|
-
newState = updateAnimationDomain(newState);
|
|
903
|
-
}
|
|
904
|
-
|
|
905
|
-
// update splitMap layer id
|
|
906
|
-
if (state.splitMaps.length) {
|
|
907
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
908
|
-
splitMaps: newState.splitMaps.map(function (settings) {
|
|
909
|
-
var _settings$layers = settings.layers,
|
|
910
|
-
oldLayerMap = _settings$layers[oldId],
|
|
911
|
-
otherLayers = (0, _objectWithoutProperties2["default"])(_settings$layers, [oldId].map(_toPropertyKey));
|
|
912
|
-
return oldId in settings.layers ? _objectSpread(_objectSpread({}, settings), {}, {
|
|
913
|
-
layers: _objectSpread(_objectSpread({}, otherLayers), {}, (0, _defineProperty2["default"])({}, layer.id, oldLayerMap))
|
|
914
|
-
}) : settings;
|
|
915
|
-
})
|
|
916
|
-
});
|
|
917
|
-
}
|
|
918
|
-
|
|
919
|
-
// update layerOrder with new id
|
|
920
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
921
|
-
layerOrder: newState.layerOrder.map(function (layerId) {
|
|
922
|
-
return layerId === oldLayer.id ? newLayer.id : layerId;
|
|
923
|
-
})
|
|
924
|
-
});
|
|
925
|
-
return newState;
|
|
926
|
-
}
|
|
927
|
-
|
|
928
|
-
/**
|
|
929
|
-
* Update layer visual channel
|
|
930
|
-
* @memberof visStateUpdaters
|
|
931
|
-
* @returns {Object} nextState
|
|
932
|
-
* @public
|
|
933
|
-
*/
|
|
934
|
-
function layerVisualChannelChangeUpdater(state, action) {
|
|
935
|
-
var oldLayer = action.oldLayer,
|
|
936
|
-
newConfig = action.newConfig,
|
|
937
|
-
newVisConfig = action.newVisConfig,
|
|
938
|
-
channel = action.channel;
|
|
939
|
-
if (!oldLayer.config.dataId) {
|
|
940
|
-
return state;
|
|
941
|
-
}
|
|
942
|
-
var dataset = state.datasets[oldLayer.config.dataId];
|
|
943
|
-
var idx = state.layers.findIndex(function (l) {
|
|
944
|
-
return l.id === oldLayer.id;
|
|
945
|
-
});
|
|
946
|
-
var newLayer = oldLayer.updateLayerConfig(newConfig);
|
|
947
|
-
if (newVisConfig) newLayer = newLayer.updateLayerVisConfig(newVisConfig);
|
|
948
|
-
newLayer.updateLayerVisualChannel(dataset, channel);
|
|
949
|
-
|
|
950
|
-
// calling update animation domain first to merge all layer animation domain
|
|
951
|
-
var updatedState = updateAnimationDomain(state);
|
|
952
|
-
var visualChannel = oldLayer.visualChannels[channel];
|
|
953
|
-
if ((visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.channelScaleType) === _constants.CHANNEL_SCALES.color && newConfig[visualChannel.field]) {
|
|
954
|
-
// if color field changed, set customBreaks to false
|
|
955
|
-
newLayer.updateLayerColorUI(visualChannel.range, {
|
|
956
|
-
colorRangeConfig: _objectSpread(_objectSpread({}, newLayer.config.colorUI[visualChannel.range].colorRangeConfig), {}, {
|
|
957
|
-
customBreaks: false
|
|
958
|
-
})
|
|
959
|
-
});
|
|
960
|
-
updatedState = _objectSpread(_objectSpread({}, updatedState), {}, {
|
|
961
|
-
layers: updatedState.layers.map(function (l) {
|
|
962
|
-
return l.id === oldLayer.id ? newLayer : l;
|
|
963
|
-
})
|
|
964
|
-
});
|
|
965
|
-
}
|
|
966
|
-
var oldLayerData = updatedState.layerData[idx];
|
|
967
|
-
var _calculateLayerData5 = (0, _layerUtils.calculateLayerData)(newLayer, updatedState, oldLayerData),
|
|
968
|
-
layerData = _calculateLayerData5.layerData,
|
|
969
|
-
layer = _calculateLayerData5.layer;
|
|
970
|
-
if ((visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.channelScaleType) === _constants.CHANNEL_SCALES.color && newConfig[visualChannel === null || visualChannel === void 0 ? void 0 : visualChannel.scale] === _constants.SCALE_TYPES.customOrdinal && !newVisConfig) {
|
|
971
|
-
// when switching to customOrdinal scale, create a customPalette in colorUI with updated colorDomain
|
|
972
|
-
var customPalette = (0, _utils.initCustomPaletteByCustomScale)({
|
|
973
|
-
scale: _constants.SCALE_TYPES.customOrdinal,
|
|
974
|
-
field: layer.config[visualChannel.field],
|
|
975
|
-
ordinalDomain: layer.config[layer.visualChannels[channel].domain],
|
|
976
|
-
range: layer.config.visConfig[visualChannel.range],
|
|
977
|
-
colorBreaks: null
|
|
978
|
-
});
|
|
979
|
-
// update colorRange with new customPalette
|
|
980
|
-
layer.updateLayerColorUI(visualChannel.range, {
|
|
981
|
-
showColorChart: true,
|
|
982
|
-
colorRangeConfig: _objectSpread(_objectSpread({}, layer.config.colorUI[visualChannel.range].colorRangeConfig), {}, {
|
|
983
|
-
customBreaks: true
|
|
984
|
-
}),
|
|
985
|
-
customPalette: customPalette
|
|
986
|
-
});
|
|
987
|
-
}
|
|
988
|
-
return updateStateWithLayerAndData(updatedState, {
|
|
989
|
-
layerData: layerData,
|
|
990
|
-
layer: layer,
|
|
991
|
-
idx: idx
|
|
992
|
-
});
|
|
993
|
-
}
|
|
994
|
-
|
|
995
|
-
/**
|
|
996
|
-
* Update layer `visConfig`
|
|
997
|
-
* @memberof visStateUpdaters
|
|
998
|
-
* @public
|
|
999
|
-
*/
|
|
1000
|
-
function layerVisConfigChangeUpdater(state, action) {
|
|
1001
|
-
var oldLayer = action.oldLayer;
|
|
1002
|
-
var idx = state.layers.findIndex(function (l) {
|
|
1003
|
-
return l.id === oldLayer.id;
|
|
1004
|
-
});
|
|
1005
|
-
var props = Object.keys(action.newVisConfig);
|
|
1006
|
-
var newVisConfig = _objectSpread(_objectSpread({}, oldLayer.config.visConfig), action.newVisConfig);
|
|
1007
|
-
var newLayer = oldLayer.updateLayerConfig({
|
|
1008
|
-
visConfig: newVisConfig
|
|
1009
|
-
});
|
|
1010
|
-
var nextState = state;
|
|
1011
|
-
|
|
1012
|
-
// Exclusive bitmap editing: when editBounds is turned on for one bitmap layer,
|
|
1013
|
-
// turn it off for all other bitmap layers
|
|
1014
|
-
if (newLayer.type === 'bitmap' && action.newVisConfig.editBounds === true) {
|
|
1015
|
-
nextState = _objectSpread(_objectSpread({}, nextState), {}, {
|
|
1016
|
-
layers: nextState.layers.map(function (l, i) {
|
|
1017
|
-
if (i !== idx && l.type === 'bitmap' && l.config.visConfig.editBounds) {
|
|
1018
|
-
return l.updateLayerConfig({
|
|
1019
|
-
visConfig: _objectSpread(_objectSpread({}, l.config.visConfig), {}, {
|
|
1020
|
-
editBounds: false
|
|
1021
|
-
})
|
|
1022
|
-
});
|
|
1023
|
-
}
|
|
1024
|
-
return l;
|
|
1025
|
-
})
|
|
1026
|
-
});
|
|
1027
|
-
}
|
|
1028
|
-
if (newLayer.shouldCalculateLayerData(props)) {
|
|
1029
|
-
var oldLayerData = nextState.layerData[idx];
|
|
1030
|
-
var _calculateLayerData6 = (0, _layerUtils.calculateLayerData)(newLayer, nextState, oldLayerData),
|
|
1031
|
-
layerData = _calculateLayerData6.layerData,
|
|
1032
|
-
layer = _calculateLayerData6.layer;
|
|
1033
|
-
return updateStateWithLayerAndData(nextState, {
|
|
1034
|
-
layerData: layerData,
|
|
1035
|
-
layer: layer,
|
|
1036
|
-
idx: idx
|
|
1037
|
-
});
|
|
1038
|
-
}
|
|
1039
|
-
return updateStateWithLayerAndData(nextState, {
|
|
1040
|
-
layer: newLayer,
|
|
1041
|
-
idx: idx
|
|
1042
|
-
});
|
|
1043
|
-
}
|
|
1044
|
-
|
|
1045
|
-
/**
|
|
1046
|
-
* Reset animation config current time to a specified value
|
|
1047
|
-
* @memberof visStateUpdaters
|
|
1048
|
-
* @public
|
|
1049
|
-
*
|
|
1050
|
-
*/
|
|
1051
|
-
var setLayerAnimationTimeUpdater = exports.setLayerAnimationTimeUpdater = function setLayerAnimationTimeUpdater(state, _ref4) {
|
|
1052
|
-
var value = _ref4.value;
|
|
1053
|
-
var currentTime = Array.isArray(value) ? value[0] : value;
|
|
1054
|
-
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1055
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1056
|
-
currentTime: currentTime
|
|
1057
|
-
})
|
|
1058
|
-
});
|
|
1059
|
-
// update animation config for each layer
|
|
1060
|
-
return state.layers.reduce(function (accu, l) {
|
|
1061
|
-
if (l.config.animation.enabled && l.type !== 'trip') {
|
|
1062
|
-
return layerAnimationChangeUpdater(accu, {
|
|
1063
|
-
oldLayer: l,
|
|
1064
|
-
prop: 'currentTime',
|
|
1065
|
-
currentTime: currentTime
|
|
1066
|
-
});
|
|
1067
|
-
}
|
|
1068
|
-
return accu;
|
|
1069
|
-
}, nextState);
|
|
1070
|
-
};
|
|
1071
|
-
|
|
1072
|
-
/**
|
|
1073
|
-
* Update filter property
|
|
1074
|
-
* @memberof visStateUpdaters
|
|
1075
|
-
* @public
|
|
1076
|
-
*/
|
|
1077
|
-
function setFilterAnimationTimeUpdater(state, action) {
|
|
1078
|
-
return setFilterUpdater(state, action);
|
|
1079
|
-
}
|
|
1080
|
-
|
|
1081
|
-
/**
|
|
1082
|
-
* Update filter animation window
|
|
1083
|
-
* @memberof visStateUpdaters
|
|
1084
|
-
* @public
|
|
1085
|
-
*/
|
|
1086
|
-
function setFilterAnimationWindowUpdater(state, _ref5) {
|
|
1087
|
-
var id = _ref5.id,
|
|
1088
|
-
animationWindow = _ref5.animationWindow;
|
|
1089
|
-
var filter = state.filters.find(function (f) {
|
|
1090
|
-
return f.id === id;
|
|
1091
|
-
});
|
|
1092
|
-
if (!filter) {
|
|
1093
|
-
return state;
|
|
1094
|
-
}
|
|
1095
|
-
var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
1096
|
-
animationWindow: animationWindow
|
|
1097
|
-
});
|
|
1098
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1099
|
-
filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
|
|
1100
|
-
});
|
|
1101
|
-
var newSyncTimelineMode = getSyncAnimationMode(newFilter);
|
|
1102
|
-
return setTimeFilterTimelineModeUpdater(newState, {
|
|
1103
|
-
id: id,
|
|
1104
|
-
mode: newSyncTimelineMode
|
|
1105
|
-
});
|
|
1106
|
-
}
|
|
1107
|
-
function applyFilterConfigUpdater(state, action) {
|
|
1108
|
-
var _serializeFilter;
|
|
1109
|
-
var filterId = action.filterId,
|
|
1110
|
-
newFilter = action.newFilter;
|
|
1111
|
-
var oldFilter = state.filters.find(function (f) {
|
|
1112
|
-
return f.id === filterId;
|
|
1113
|
-
});
|
|
1114
|
-
if (!oldFilter) {
|
|
1115
|
-
return state;
|
|
1116
|
-
}
|
|
1117
|
-
|
|
1118
|
-
// Serialize the filters to only compare the saved properties
|
|
1119
|
-
var serializedOldFilter = (_serializeFilter = (0, _visStateMerger.serializeFilter)(oldFilter, state.schema)) !== null && _serializeFilter !== void 0 ? _serializeFilter : {
|
|
1120
|
-
config: {}
|
|
1121
|
-
};
|
|
1122
|
-
var serializedNewFilter = (0, _visStateMerger.serializeFilter)(newFilter, state.schema);
|
|
1123
|
-
if (!serializedNewFilter || (0, _isEqual["default"])(serializedOldFilter, serializedNewFilter)) {
|
|
1124
|
-
return state;
|
|
1125
|
-
}
|
|
1126
|
-
|
|
1127
|
-
// If there are any changes to the filter, apply them
|
|
1128
|
-
var changed = pickChangedProps(serializedOldFilter, serializedNewFilter);
|
|
1129
|
-
delete changed['id']; // id should not be changed
|
|
1130
|
-
|
|
1131
|
-
var filterIndex = state.filters.findIndex(function (f) {
|
|
1132
|
-
return f.id === filterId;
|
|
1133
|
-
});
|
|
1134
|
-
if (filterIndex < 0) {
|
|
1135
|
-
return state;
|
|
1136
|
-
}
|
|
1137
|
-
return setFilterUpdater(state, (0, _actions.setFilter)(filterIndex, Object.keys(changed), Object.values(changed)));
|
|
1138
|
-
}
|
|
1139
|
-
|
|
1140
|
-
/**
|
|
1141
|
-
* Update filter property
|
|
1142
|
-
* @memberof visStateUpdaters
|
|
1143
|
-
* @public
|
|
1144
|
-
*/
|
|
1145
|
-
function setFilterUpdater(state, action) {
|
|
1146
|
-
var idx = action.idx,
|
|
1147
|
-
_action$valueIndex = action.valueIndex,
|
|
1148
|
-
valueIndex = _action$valueIndex === void 0 ? 0 : _action$valueIndex;
|
|
1149
|
-
var oldFilter = state.filters[idx];
|
|
1150
|
-
if (!oldFilter) {
|
|
1151
|
-
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
1152
|
-
return state;
|
|
1153
|
-
}
|
|
1154
|
-
if (Array.isArray(action.prop) && (!Array.isArray(action.value) || action.prop.length !== action.value.length)) {
|
|
1155
|
-
_window.console.error('Expecting value to be an array of the same length, since prop is an array');
|
|
1156
|
-
return state;
|
|
1157
|
-
}
|
|
1158
|
-
// convert prop and value to array
|
|
1159
|
-
var props = (0, _commonUtils.toArray)(action.prop);
|
|
1160
|
-
var values = Array.isArray(action.prop) ? (0, _commonUtils.toArray)(action.value) : [action.value];
|
|
1161
|
-
var newFilter = oldFilter;
|
|
1162
|
-
var newState = state;
|
|
1163
|
-
var datasetIdsToFilter = [];
|
|
1164
|
-
var _loop = function _loop() {
|
|
1165
|
-
var prop = props[i];
|
|
1166
|
-
var value = values[i];
|
|
1167
|
-
// We currently do not support passing in name as an array into _updateFilterProp, so we call it multiple times with each name
|
|
1168
|
-
// See the comment in there as to what should be addressed
|
|
1169
|
-
var res;
|
|
1170
|
-
if (prop === 'name' && Array.isArray(value)) {
|
|
1171
|
-
// eslint-disable-next-line no-loop-func
|
|
1172
|
-
res = value.reduce(function (accu, v) {
|
|
1173
|
-
return _updateFilterProp(accu, newFilter, prop, v, valueIndex);
|
|
1174
|
-
}, newState);
|
|
1175
|
-
} else {
|
|
1176
|
-
res = _updateFilterProp(newState, newFilter, prop, value, valueIndex);
|
|
1177
|
-
}
|
|
1178
|
-
newFilter = res.filter;
|
|
1179
|
-
newState = res.state;
|
|
1180
|
-
datasetIdsToFilter = datasetIdsToFilter.concat(res.datasetIdsToFilter);
|
|
1181
|
-
};
|
|
1182
|
-
for (var i = 0; i < props.length; i++) {
|
|
1183
|
-
_loop();
|
|
1184
|
-
}
|
|
1185
|
-
var enlargedFilter = state.filters.find(function (f) {
|
|
1186
|
-
return f.view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
1187
|
-
});
|
|
1188
|
-
if (enlargedFilter && enlargedFilter.id !== newFilter.id) {
|
|
1189
|
-
// there should be only one enlarged filter
|
|
1190
|
-
newFilter.view = _constants.FILTER_VIEW_TYPES.side;
|
|
1191
|
-
}
|
|
1192
|
-
|
|
1193
|
-
// save new filters to newState
|
|
1194
|
-
newState = (0, _utils.set)(['filters', idx], newFilter, newState);
|
|
1195
|
-
|
|
1196
|
-
// filter data
|
|
1197
|
-
var filteredDatasets = (0, _utils.applyFiltersToDatasets)((0, _uniq["default"])(datasetIdsToFilter), newState.datasets, newState.filters, newState.layers);
|
|
1198
|
-
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
1199
|
-
|
|
1200
|
-
// need to update filterPlot after filter Dataset for plot to update on filtered result
|
|
1201
|
-
var filterWithPLot = (0, _utils.updateFilterPlot)(newState.datasets, newState.filters[idx]);
|
|
1202
|
-
newState = (0, _utils.set)(['filters', idx], filterWithPLot, newState);
|
|
1203
|
-
|
|
1204
|
-
// dataId is an array
|
|
1205
|
-
// pass only the dataset we need to update
|
|
1206
|
-
newState = updateAllLayerDomainData(newState, datasetIdsToFilter, newFilter);
|
|
1207
|
-
|
|
1208
|
-
// If time range filter value was updated, adjust animation config
|
|
1209
|
-
if (newFilter.type === _constants.FILTER_TYPES.timeRange && props.includes('value')) {
|
|
1210
|
-
newState = adjustAnimationConfigWithFilter(newState, action.idx);
|
|
1211
|
-
}
|
|
1212
|
-
return newState;
|
|
1213
|
-
}
|
|
1214
|
-
function _updateFilterDataIdAtValueIndex(filter, valueIndex, value, datasets) {
|
|
1215
|
-
var newFilter = filter;
|
|
1216
|
-
if (filter.dataId[valueIndex]) {
|
|
1217
|
-
// if dataId already exist
|
|
1218
|
-
newFilter = _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets);
|
|
1219
|
-
}
|
|
1220
|
-
if (value) {
|
|
1221
|
-
var nextValue = newFilter.dataId.slice();
|
|
1222
|
-
nextValue[valueIndex] = value;
|
|
1223
|
-
newFilter = (0, _utils.set)(['dataId'], nextValue, newFilter);
|
|
1224
|
-
}
|
|
1225
|
-
return newFilter;
|
|
1226
|
-
}
|
|
1227
|
-
function _removeFilterDataIdAtValueIndex(filter, valueIndex, datasets) {
|
|
1228
|
-
var dataId = filter.dataId[valueIndex];
|
|
1229
|
-
if (filter.dataId.length === 1 && valueIndex === 0) {
|
|
1230
|
-
// if remove the only dataId, create an empty filter instead;
|
|
1231
|
-
return (0, _utils.getDefaultFilter)({
|
|
1232
|
-
id: filter.id
|
|
1233
|
-
});
|
|
1234
|
-
}
|
|
1235
|
-
if (dataId) {
|
|
1236
|
-
filter = (0, _utils.removeFilterPlot)(filter, dataId);
|
|
1237
|
-
}
|
|
1238
|
-
for (var _i = 0, _arr = ['dataId', 'name', 'fieldIdx', 'gpuChannel']; _i < _arr.length; _i++) {
|
|
1239
|
-
var prop = _arr[_i];
|
|
1240
|
-
if (Array.isArray(filter[prop])) {
|
|
1241
|
-
var nextVal = filter[prop].slice();
|
|
1242
|
-
nextVal.splice(valueIndex, 1);
|
|
1243
|
-
filter = (0, _utils.set)([prop], nextVal, filter);
|
|
1244
|
-
}
|
|
1245
|
-
}
|
|
1246
|
-
|
|
1247
|
-
// mergeFieldDomain for the remaining fields
|
|
1248
|
-
var domainSteps = (0, _utils.mergeFilterDomain)(filter, datasets);
|
|
1249
|
-
var nextFilter = _objectSpread(_objectSpread({}, filter), domainSteps ? {
|
|
1250
|
-
domain: domainSteps === null || domainSteps === void 0 ? void 0 : domainSteps.domain,
|
|
1251
|
-
step: domainSteps === null || domainSteps === void 0 ? void 0 : domainSteps.step
|
|
1252
|
-
} : {});
|
|
1253
|
-
var nextValue = (0, _utils.adjustValueToFilterDomain)(nextFilter.value, nextFilter);
|
|
1254
|
-
return _objectSpread(_objectSpread({}, nextFilter), {}, {
|
|
1255
|
-
value: nextValue
|
|
1256
|
-
});
|
|
1257
|
-
}
|
|
1258
|
-
|
|
1259
|
-
/** *
|
|
1260
|
-
* Updates a single property of a filter
|
|
1261
|
-
*/
|
|
1262
|
-
function _updateFilterProp(state, filter, prop, value, valueIndex, datasetIds) {
|
|
1263
|
-
var datasetIdsToFilter = [];
|
|
1264
|
-
switch (prop) {
|
|
1265
|
-
// TODO: Next PR for UI if we update filterDataId, we need to consider two cases:
|
|
1266
|
-
// 1. dataId is empty: create a default filter
|
|
1267
|
-
// 2. Add a new dataset id
|
|
1268
|
-
case _utils.FILTER_UPDATER_PROPS.dataId:
|
|
1269
|
-
{
|
|
1270
|
-
var oldDataId = (0, _toConsumableArray2["default"])(filter.dataId);
|
|
1271
|
-
filter = _updateFilterDataIdAtValueIndex(filter, valueIndex, value, state.datasets);
|
|
1272
|
-
datasetIdsToFilter = (0, _uniq["default"])([].concat((0, _toConsumableArray2["default"])(oldDataId), (0, _toConsumableArray2["default"])(filter.dataId)));
|
|
1273
|
-
break;
|
|
1274
|
-
}
|
|
1275
|
-
case _utils.FILTER_UPDATER_PROPS.name:
|
|
1276
|
-
{
|
|
1277
|
-
// we are supporting the current functionality
|
|
1278
|
-
// TODO: Next PR for UI filter name will only update filter name but it won't have side effects
|
|
1279
|
-
// we are gonna use pair of datasets and fieldIdx to update the filter
|
|
1280
|
-
var datasetId = filter.dataId[valueIndex];
|
|
1281
|
-
var _applyFilterFieldName = (0, _utils.applyFilterFieldName)(filter, state.datasets, datasetId, value, valueIndex, {
|
|
1282
|
-
mergeDomain: valueIndex > 0
|
|
1283
|
-
}),
|
|
1284
|
-
updatedFilter = _applyFilterFieldName.filter,
|
|
1285
|
-
newDataset = _applyFilterFieldName.dataset;
|
|
1286
|
-
if (updatedFilter) {
|
|
1287
|
-
filter = updatedFilter;
|
|
1288
|
-
if (filter.gpu) {
|
|
1289
|
-
filter = (0, _table.setFilterGpuMode)(filter, state.filters);
|
|
1290
|
-
filter = (0, _table.assignGpuChannel)(filter, state.filters);
|
|
1291
|
-
}
|
|
1292
|
-
state = (0, _utils.set)(['datasets', datasetId], newDataset, state);
|
|
1293
|
-
// remove filter Plot at datasetId, so it will be recalculated
|
|
1294
|
-
filter = (0, _utils.removeFilterPlot)(filter, datasetId);
|
|
1295
|
-
datasetIdsToFilter = updatedFilter.dataId;
|
|
1296
|
-
}
|
|
1297
|
-
// only filter the current dataset
|
|
1298
|
-
break;
|
|
1299
|
-
}
|
|
1300
|
-
case _utils.FILTER_UPDATER_PROPS.layerId:
|
|
1301
|
-
{
|
|
1302
|
-
// We need to update only datasetId/s if we have added/removed layers
|
|
1303
|
-
// - check for layerId changes (XOR works because of string values)
|
|
1304
|
-
// if no differences between layerIds, don't do any filtering
|
|
1305
|
-
// @ts-ignore
|
|
1306
|
-
var layerIdDifference = (0, _xor["default"])(value, filter.layerId);
|
|
1307
|
-
var layerDataIds = (0, _uniq["default"])(layerIdDifference.map(function (lid) {
|
|
1308
|
-
return (0, _get["default"])(state.layers.find(function (l) {
|
|
1309
|
-
return l.id === lid;
|
|
1310
|
-
}), ['config', 'dataId']);
|
|
1311
|
-
}).filter(function (d) {
|
|
1312
|
-
return d;
|
|
1313
|
-
}));
|
|
1314
|
-
|
|
1315
|
-
// only filter datasetsIds
|
|
1316
|
-
datasetIdsToFilter = layerDataIds;
|
|
1317
|
-
|
|
1318
|
-
// Update newFilter dataIds
|
|
1319
|
-
var newDataIds = (0, _uniq["default"])(value === null || value === void 0 ? void 0 : value.map(function (lid) {
|
|
1320
|
-
return (0, _get["default"])(state.layers.find(function (l) {
|
|
1321
|
-
return l.id === lid;
|
|
1322
|
-
}), ['config', 'dataId']);
|
|
1323
|
-
}).filter(function (d) {
|
|
1324
|
-
return d;
|
|
1325
|
-
}));
|
|
1326
|
-
filter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
1327
|
-
layerId: value,
|
|
1328
|
-
dataId: newDataIds
|
|
1329
|
-
});
|
|
1330
|
-
break;
|
|
1331
|
-
}
|
|
1332
|
-
default:
|
|
1333
|
-
filter = (0, _utils.set)([prop], value, filter);
|
|
1334
|
-
datasetIdsToFilter = (0, _toConsumableArray2["default"])(filter.dataId);
|
|
1335
|
-
break;
|
|
1336
|
-
}
|
|
1337
|
-
return {
|
|
1338
|
-
filter: filter,
|
|
1339
|
-
datasetIds: datasetIds,
|
|
1340
|
-
datasetIdsToFilter: datasetIdsToFilter,
|
|
1341
|
-
state: state
|
|
1342
|
-
};
|
|
1343
|
-
}
|
|
1344
|
-
/* eslint-enable max-statements */
|
|
1345
|
-
|
|
1346
|
-
/**
|
|
1347
|
-
* Set the property of a filter plot
|
|
1348
|
-
* @memberof visStateUpdaters
|
|
1349
|
-
* @public
|
|
1350
|
-
*/
|
|
1351
|
-
var setFilterPlotUpdater = exports.setFilterPlotUpdater = function setFilterPlotUpdater(state, _ref6) {
|
|
1352
|
-
var idx = _ref6.idx,
|
|
1353
|
-
newProp = _ref6.newProp;
|
|
1354
|
-
if (!state.filters[idx]) {
|
|
1355
|
-
_window.console.error("filters[".concat(idx, "] is undefined"));
|
|
1356
|
-
return state;
|
|
1357
|
-
}
|
|
1358
|
-
var newFilter = state.filters[idx];
|
|
1359
|
-
for (var prop in newProp) {
|
|
1360
|
-
if (prop === 'plotType') {
|
|
1361
|
-
newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)(newProp.plotType))(newFilter);
|
|
1362
|
-
} else if (prop === 'yAxis') {
|
|
1363
|
-
var chartType = newProp.yAxis ? _constants.PLOT_TYPES.lineChart : _constants.PLOT_TYPES.histogram;
|
|
1364
|
-
newFilter = (0, _composerHelpers.pick_)('plotType')((0, _composerHelpers.merge_)({
|
|
1365
|
-
type: chartType
|
|
1366
|
-
}))((0, _composerHelpers.merge_)(newProp)(newFilter));
|
|
1367
|
-
}
|
|
1368
|
-
}
|
|
1369
|
-
newFilter = (0, _utils.updateFilterPlot)(state.datasets, newFilter);
|
|
1370
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1371
|
-
filters: state.filters.map(function (f, i) {
|
|
1372
|
-
return i === idx ? newFilter : f;
|
|
1373
|
-
})
|
|
1374
|
-
});
|
|
1375
|
-
};
|
|
1376
|
-
|
|
1377
|
-
/**
|
|
1378
|
-
* Add a new filter
|
|
1379
|
-
* @memberof visStateUpdaters
|
|
1380
|
-
* @public
|
|
1381
|
-
*/
|
|
1382
|
-
var addFilterUpdater = exports.addFilterUpdater = function addFilterUpdater(state, action) {
|
|
1383
|
-
return !action.dataId ? state : _objectSpread(_objectSpread({}, state), {}, {
|
|
1384
|
-
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [(0, _utils.getDefaultFilter)({
|
|
1385
|
-
dataId: action.dataId,
|
|
1386
|
-
id: action.id
|
|
1387
|
-
})])
|
|
1388
|
-
});
|
|
1389
|
-
};
|
|
1390
|
-
|
|
1391
|
-
/**
|
|
1392
|
-
* Create or update a filter
|
|
1393
|
-
* @memberof visStateUpdaters
|
|
1394
|
-
* @public
|
|
1395
|
-
*/
|
|
1396
|
-
var createOrUpdateFilterUpdater = exports.createOrUpdateFilterUpdater = function createOrUpdateFilterUpdater(state, action) {
|
|
1397
|
-
var id = action.id,
|
|
1398
|
-
dataId = action.dataId,
|
|
1399
|
-
field = action.field,
|
|
1400
|
-
value = action.value;
|
|
1401
|
-
var newState = state;
|
|
1402
|
-
var originalIndex = newState.filters.findIndex(function (f) {
|
|
1403
|
-
return f.id === id;
|
|
1404
|
-
});
|
|
1405
|
-
var filterIndex = originalIndex;
|
|
1406
|
-
if (!id && !dataId) {
|
|
1407
|
-
return newState;
|
|
1408
|
-
}
|
|
1409
|
-
if (originalIndex < 0 && dataId) {
|
|
1410
|
-
newState = addFilterUpdater(newState, {
|
|
1411
|
-
dataId: dataId
|
|
1412
|
-
});
|
|
1413
|
-
if (newState.filters.length !== state.filters.length + 1) {
|
|
1414
|
-
// No new filter was added
|
|
1415
|
-
return state;
|
|
1416
|
-
}
|
|
1417
|
-
// Here we are assuming that the filter was added at the end
|
|
1418
|
-
filterIndex = newState.filters.length - 1;
|
|
1419
|
-
newState.filters[filterIndex] = _objectSpread(_objectSpread({}, newState.filters[filterIndex]), id ? {
|
|
1420
|
-
id: id
|
|
1421
|
-
} : null);
|
|
1422
|
-
}
|
|
1423
|
-
|
|
1424
|
-
// No need to update this if it's a newly created filter
|
|
1425
|
-
// First we make sure all the dataIds that fields refer to are updated
|
|
1426
|
-
if (originalIndex >= 0 && dataId) {
|
|
1427
|
-
// If the dataId is an array, we need to update each one individually as they need a correct valueIndex passed
|
|
1428
|
-
newState = (Array.isArray(dataId) ? dataId : [dataId]).reduce(function (accu, d, index) {
|
|
1429
|
-
return setFilterUpdater(accu, {
|
|
1430
|
-
idx: filterIndex,
|
|
1431
|
-
prop: 'dataId',
|
|
1432
|
-
value: d,
|
|
1433
|
-
valueIndex: index
|
|
1434
|
-
});
|
|
1435
|
-
}, newState);
|
|
1436
|
-
}
|
|
1437
|
-
// Then we update the fields
|
|
1438
|
-
if (field) {
|
|
1439
|
-
// If the field is an array, we need to update each field individually as they need a correct valueIndex passed
|
|
1440
|
-
newState = (Array.isArray(field) ? field : [field]).reduce(function (accu, f, index) {
|
|
1441
|
-
return setFilterUpdater(accu, {
|
|
1442
|
-
idx: filterIndex,
|
|
1443
|
-
prop: 'name',
|
|
1444
|
-
value: f,
|
|
1445
|
-
valueIndex: index
|
|
1446
|
-
});
|
|
1447
|
-
}, newState);
|
|
1448
|
-
}
|
|
1449
|
-
// Then we update the value separately
|
|
1450
|
-
if (value !== null && typeof value !== 'undefined') {
|
|
1451
|
-
newState = setFilterUpdater(newState, {
|
|
1452
|
-
idx: filterIndex,
|
|
1453
|
-
prop: 'value',
|
|
1454
|
-
value: value
|
|
1455
|
-
});
|
|
1456
|
-
}
|
|
1457
|
-
return newState;
|
|
1458
|
-
};
|
|
1459
|
-
|
|
1460
|
-
/**
|
|
1461
|
-
* Set layer color palette ui state
|
|
1462
|
-
* @memberof visStateUpdaters
|
|
1463
|
-
*/
|
|
1464
|
-
var layerColorUIChangeUpdater = exports.layerColorUIChangeUpdater = function layerColorUIChangeUpdater(state, _ref7) {
|
|
1465
|
-
var oldLayer = _ref7.oldLayer,
|
|
1466
|
-
prop = _ref7.prop,
|
|
1467
|
-
newConfig = _ref7.newConfig;
|
|
1468
|
-
var oldVixConfig = oldLayer.config.visConfig[prop];
|
|
1469
|
-
var newLayer = oldLayer.updateLayerColorUI(prop, newConfig);
|
|
1470
|
-
var newVisConfig = newLayer.config.visConfig[prop];
|
|
1471
|
-
if (oldVixConfig !== newVisConfig) {
|
|
1472
|
-
return layerVisConfigChangeUpdater(state, {
|
|
1473
|
-
oldLayer: oldLayer,
|
|
1474
|
-
newVisConfig: (0, _defineProperty2["default"])({}, prop, newVisConfig)
|
|
1475
|
-
});
|
|
1476
|
-
}
|
|
1477
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1478
|
-
layers: state.layers.map(function (l) {
|
|
1479
|
-
return l.id === oldLayer.id ? newLayer : l;
|
|
1480
|
-
})
|
|
1481
|
-
});
|
|
1482
|
-
};
|
|
1483
|
-
|
|
1484
|
-
/**
|
|
1485
|
-
* Start and end filter animation
|
|
1486
|
-
* @memberof visStateUpdaters
|
|
1487
|
-
* @public
|
|
1488
|
-
*/
|
|
1489
|
-
var toggleFilterAnimationUpdater = exports.toggleFilterAnimationUpdater = function toggleFilterAnimationUpdater(state, action) {
|
|
1490
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1491
|
-
filters: state.filters.map(function (f, i) {
|
|
1492
|
-
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1493
|
-
isAnimating: !f.isAnimating
|
|
1494
|
-
}) : f;
|
|
1495
|
-
})
|
|
1496
|
-
});
|
|
1497
|
-
};
|
|
1498
|
-
function isFilterAnimationConfig(config) {
|
|
1499
|
-
return 'dataId' in config && 'animationWindow' in config;
|
|
1500
|
-
}
|
|
1501
|
-
function setAnimationConfigUpdater(state, action) {
|
|
1502
|
-
var config = action.config;
|
|
1503
|
-
if (isFilterAnimationConfig(config)) {
|
|
1504
|
-
// Find filter used for animation
|
|
1505
|
-
// Assuming there's only one filter used for animation, see setFilterViewUpdater
|
|
1506
|
-
var filter = state.filters.find(function (f) {
|
|
1507
|
-
return !(0, _utils.isSideFilter)(f);
|
|
1508
|
-
});
|
|
1509
|
-
if (!filter) {
|
|
1510
|
-
return state;
|
|
1511
|
-
}
|
|
1512
|
-
var newFilter = _objectSpread(_objectSpread({}, filter), config);
|
|
1513
|
-
return applyFilterConfigUpdater(state, (0, _actions.applyFilterConfig)(filter.id, newFilter));
|
|
1514
|
-
} else {
|
|
1515
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1516
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), config)
|
|
1517
|
-
});
|
|
1518
|
-
}
|
|
1519
|
-
}
|
|
1520
|
-
|
|
1521
|
-
/**
|
|
1522
|
-
* @memberof visStateUpdaters
|
|
1523
|
-
* @public
|
|
1524
|
-
*/
|
|
1525
|
-
var toggleLayerAnimationUpdater = exports.toggleLayerAnimationUpdater = function toggleLayerAnimationUpdater(state, action) {
|
|
1526
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1527
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1528
|
-
isAnimating: !state.animationConfig.isAnimating
|
|
1529
|
-
})
|
|
1530
|
-
});
|
|
1531
|
-
};
|
|
1532
|
-
|
|
1533
|
-
/**
|
|
1534
|
-
* Hide and show layer animation control
|
|
1535
|
-
* @memberof visStateUpdaters
|
|
1536
|
-
* @public
|
|
1537
|
-
*/
|
|
1538
|
-
var toggleLayerAnimationControlUpdater = exports.toggleLayerAnimationControlUpdater = function toggleLayerAnimationControlUpdater(state) {
|
|
1539
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1540
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1541
|
-
hideControl: !state.animationConfig.hideControl
|
|
1542
|
-
})
|
|
1543
|
-
});
|
|
1544
|
-
};
|
|
1545
|
-
|
|
1546
|
-
/**
|
|
1547
|
-
* Change filter animation speed
|
|
1548
|
-
* @memberof visStateUpdaters
|
|
1549
|
-
* @public
|
|
1550
|
-
*/
|
|
1551
|
-
var updateFilterAnimationSpeedUpdater = exports.updateFilterAnimationSpeedUpdater = function updateFilterAnimationSpeedUpdater(state, action) {
|
|
1552
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1553
|
-
filters: state.filters.map(function (f, i) {
|
|
1554
|
-
return i === action.idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1555
|
-
speed: action.speed
|
|
1556
|
-
}) : f;
|
|
1557
|
-
})
|
|
1558
|
-
});
|
|
1559
|
-
};
|
|
1560
|
-
|
|
1561
|
-
/**
|
|
1562
|
-
* Update animation speed with the vertical speed slider
|
|
1563
|
-
* @memberof visStateUpdaters
|
|
1564
|
-
* @public
|
|
1565
|
-
*
|
|
1566
|
-
*/
|
|
1567
|
-
var updateLayerAnimationSpeedUpdater = exports.updateLayerAnimationSpeedUpdater = function updateLayerAnimationSpeedUpdater(state, _ref8) {
|
|
1568
|
-
var speed = _ref8.speed;
|
|
1569
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1570
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
1571
|
-
speed: speed
|
|
1572
|
-
})
|
|
1573
|
-
});
|
|
1574
|
-
};
|
|
1575
|
-
|
|
1576
|
-
/**
|
|
1577
|
-
* Show larger time filter at bottom for time playback (apply to time filter only)
|
|
1578
|
-
* @memberof visStateUpdaters
|
|
1579
|
-
* @public
|
|
1580
|
-
*/
|
|
1581
|
-
var setFilterViewUpdater = exports.setFilterViewUpdater = function setFilterViewUpdater(state, action) {
|
|
1582
|
-
var view = action.view,
|
|
1583
|
-
idx = action.idx;
|
|
1584
|
-
var shouldResetOtherFiltersView = view === _constants.FILTER_VIEW_TYPES.enlarged;
|
|
1585
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1586
|
-
filters: state.filters.map(function (f, i) {
|
|
1587
|
-
return i === idx ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1588
|
-
view: view
|
|
1589
|
-
}) : shouldResetOtherFiltersView ? _objectSpread(_objectSpread({}, f), {}, {
|
|
1590
|
-
view: _constants.FILTER_VIEW_TYPES.side
|
|
1591
|
-
}) : f;
|
|
1592
|
-
})
|
|
1593
|
-
});
|
|
1594
|
-
};
|
|
1595
|
-
|
|
1596
|
-
/**
|
|
1597
|
-
* Toggles filter feature visibility
|
|
1598
|
-
* @memberof visStateUpdaters
|
|
1599
|
-
*/
|
|
1600
|
-
var toggleFilterFeatureUpdater = exports.toggleFilterFeatureUpdater = function toggleFilterFeatureUpdater(state, action) {
|
|
1601
|
-
var filter = state.filters[action.idx];
|
|
1602
|
-
var isVisible = (0, _get["default"])(filter, ['value', 'properties', 'isVisible']);
|
|
1603
|
-
var newState = setFilterUpdater(state, {
|
|
1604
|
-
idx: action.idx,
|
|
1605
|
-
prop: 'enabled',
|
|
1606
|
-
value: !isVisible
|
|
1607
|
-
});
|
|
1608
|
-
newState = setFilterUpdater(newState, {
|
|
1609
|
-
idx: action.idx,
|
|
1610
|
-
prop: 'value',
|
|
1611
|
-
value: (0, _utils.featureToFilterValue)(filter.value, filter.id, {
|
|
1612
|
-
isVisible: !isVisible
|
|
1613
|
-
})
|
|
1614
|
-
});
|
|
1615
|
-
return newState;
|
|
1616
|
-
};
|
|
1617
|
-
|
|
1618
|
-
/**
|
|
1619
|
-
* Remove a filter
|
|
1620
|
-
* @memberof visStateUpdaters
|
|
1621
|
-
* @public
|
|
1622
|
-
*/
|
|
1623
|
-
var removeFilterUpdater = exports.removeFilterUpdater = function removeFilterUpdater(state, action) {
|
|
1624
|
-
var idx = action.idx;
|
|
1625
|
-
var _state$filters$idx = state.filters[idx],
|
|
1626
|
-
dataId = _state$filters$idx.dataId,
|
|
1627
|
-
id = _state$filters$idx.id;
|
|
1628
|
-
var newFilters = [].concat((0, _toConsumableArray2["default"])(state.filters.slice(0, idx)), (0, _toConsumableArray2["default"])(state.filters.slice(idx + 1, state.filters.length)));
|
|
1629
|
-
var filteredDatasets = (0, _utils.applyFiltersToDatasets)(dataId, state.datasets, newFilters, state.layers);
|
|
1630
|
-
var newEditor = (0, _utils.getFilterIdInFeature)(state.editor.selectedFeature) === id ? _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
1631
|
-
selectedFeature: null
|
|
1632
|
-
}) : state.editor;
|
|
1633
|
-
var newState = (0, _utils.set)(['filters'], newFilters, state);
|
|
1634
|
-
newState = (0, _utils.set)(['datasets'], filteredDatasets, newState);
|
|
1635
|
-
newState = (0, _utils.set)(['editor'], newEditor, newState);
|
|
1636
|
-
return updateAllLayerDomainData(newState, dataId, undefined);
|
|
1637
|
-
};
|
|
1638
|
-
|
|
1639
|
-
/**
|
|
1640
|
-
* Add a new layer
|
|
1641
|
-
* @memberof visStateUpdaters
|
|
1642
|
-
* @public
|
|
1643
|
-
*/
|
|
1644
|
-
var addLayerUpdater = exports.addLayerUpdater = function addLayerUpdater(state, action) {
|
|
1645
|
-
var newLayer;
|
|
1646
|
-
var newLayerData;
|
|
1647
|
-
if (action.config) {
|
|
1648
|
-
newLayer = (0, _visStateMerger.createLayerFromConfig)(state, action.config);
|
|
1649
|
-
if (!newLayer) {
|
|
1650
|
-
_window.console.warn('Failed to create layer from config, it usually means the config is not be in correct format', action.config);
|
|
1651
|
-
return state;
|
|
1652
|
-
}
|
|
1653
|
-
var result = (0, _layerUtils.calculateLayerData)(newLayer, state);
|
|
1654
|
-
newLayer = result.layer;
|
|
1655
|
-
newLayerData = result.layerData;
|
|
1656
|
-
} else {
|
|
1657
|
-
var _action$datasetId;
|
|
1658
|
-
// create an empty layer with a specific dataset or a default one
|
|
1659
|
-
var defaultDataset = (_action$datasetId = action.datasetId) !== null && _action$datasetId !== void 0 ? _action$datasetId : Object.keys(state.datasets)[0];
|
|
1660
|
-
newLayer = new _layers.Layer({
|
|
1661
|
-
isVisible: true,
|
|
1662
|
-
isConfigActive: true,
|
|
1663
|
-
dataId: defaultDataset
|
|
1664
|
-
});
|
|
1665
|
-
newLayerData = {};
|
|
1666
|
-
}
|
|
1667
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1668
|
-
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), [newLayer]),
|
|
1669
|
-
layerData: [].concat((0, _toConsumableArray2["default"])(state.layerData), [newLayerData]),
|
|
1670
|
-
// add new layer at the top
|
|
1671
|
-
layerOrder: [newLayer.id].concat((0, _toConsumableArray2["default"])(state.layerOrder)),
|
|
1672
|
-
splitMaps: (0, _utils.addNewLayersToSplitMap)(state.splitMaps, newLayer)
|
|
1673
|
-
});
|
|
1674
|
-
if (newLayer.config.animation.enabled) {
|
|
1675
|
-
newState = updateAnimationDomain(newState);
|
|
1676
|
-
}
|
|
1677
|
-
return newState;
|
|
1678
|
-
};
|
|
1679
|
-
|
|
1680
|
-
/**
|
|
1681
|
-
* remove layer
|
|
1682
|
-
* @memberof visStateUpdaters
|
|
1683
|
-
* @public
|
|
1684
|
-
*/
|
|
1685
|
-
function removeLayerUpdater(state, _ref9) {
|
|
1686
|
-
var id = _ref9.id;
|
|
1687
|
-
var idx = Number.isFinite(id) ?
|
|
1688
|
-
// support older API, remove layer by idx
|
|
1689
|
-
Number(id) : state.layers.findIndex(function (l) {
|
|
1690
|
-
return l.id === id;
|
|
1691
|
-
});
|
|
1692
|
-
if (idx < 0 || idx >= state.layers.length) {
|
|
1693
|
-
// invalid index
|
|
1694
|
-
_window.console.warn("can not remove layer with invalid id|idx ".concat(id));
|
|
1695
|
-
return state;
|
|
1696
|
-
}
|
|
1697
|
-
var layers = state.layers,
|
|
1698
|
-
layerData = state.layerData,
|
|
1699
|
-
layerOrder = state.layerOrder,
|
|
1700
|
-
clicked = state.clicked,
|
|
1701
|
-
hoverInfo = state.hoverInfo;
|
|
1702
|
-
var layerToRemove = layers[idx];
|
|
1703
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
1704
|
-
layers: (0, _composerHelpers.filterOutById)(layerToRemove.id)(layers),
|
|
1705
|
-
layerData: (0, _composerHelpers.removeElementAtIndex)(idx)(layerData),
|
|
1706
|
-
layerOrder: layerOrder.filter(function (layerId) {
|
|
1707
|
-
return layerId !== layerToRemove.id;
|
|
1708
|
-
}),
|
|
1709
|
-
clicked: layerToRemove.isLayerHovered(clicked) ? undefined : clicked,
|
|
1710
|
-
hoverInfo: layerToRemove.isLayerHovered(hoverInfo) ? undefined : hoverInfo,
|
|
1711
|
-
splitMaps: (0, _utils.removeLayerFromSplitMaps)(state.splitMaps, layerToRemove)
|
|
1712
|
-
// TODO: update filters, create helper to remove layer form filter (remove layerid and dataid) if mapped
|
|
1713
|
-
});
|
|
1714
|
-
return updateAnimationDomain(newState);
|
|
1715
|
-
}
|
|
1716
|
-
|
|
1717
|
-
/**
|
|
1718
|
-
* Reorder layer
|
|
1719
|
-
* @memberof visStateUpdaters
|
|
1720
|
-
* @public
|
|
1721
|
-
*/
|
|
1722
|
-
var reorderLayerUpdater = exports.reorderLayerUpdater = function reorderLayerUpdater(state, _ref10) {
|
|
1723
|
-
var order = _ref10.order;
|
|
1724
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1725
|
-
layerOrder: order
|
|
1726
|
-
});
|
|
1727
|
-
};
|
|
1728
|
-
|
|
1729
|
-
/**
|
|
1730
|
-
* duplicate layer
|
|
1731
|
-
* @memberof visStateUpdaters
|
|
1732
|
-
* @public
|
|
1733
|
-
*/
|
|
1734
|
-
var duplicateLayerUpdater = exports.duplicateLayerUpdater = function duplicateLayerUpdater(state, _ref11) {
|
|
1735
|
-
var id = _ref11.id;
|
|
1736
|
-
var idx = Number.isFinite(id) ?
|
|
1737
|
-
// support older API, remove layer by idx
|
|
1738
|
-
Number(id) : state.layers.findIndex(function (l) {
|
|
1739
|
-
return l.id === id;
|
|
1740
|
-
});
|
|
1741
|
-
if (idx < 0 || !state.layers[idx]) {
|
|
1742
|
-
_window.console.warn("layer ".concat(idx, " not found in layerOrder"));
|
|
1743
|
-
return state;
|
|
1744
|
-
}
|
|
1745
|
-
var layers = state.layers;
|
|
1746
|
-
var original = layers[idx];
|
|
1747
|
-
var originalLayerOrderIdx = state.layerOrder.findIndex(function (lid) {
|
|
1748
|
-
return lid === original.id;
|
|
1749
|
-
});
|
|
1750
|
-
var newLabel = "Copy of ".concat(original.config.label);
|
|
1751
|
-
var postfix = 0;
|
|
1752
|
-
// eslint-disable-next-line no-loop-func
|
|
1753
|
-
while (layers.find(function (l) {
|
|
1754
|
-
return l.config.label === newLabel;
|
|
1755
|
-
})) {
|
|
1756
|
-
newLabel = "Copy of ".concat(original.config.label, " ").concat(++postfix);
|
|
1757
|
-
}
|
|
1758
|
-
|
|
1759
|
-
// collect layer config from original
|
|
1760
|
-
var loadedLayer = (0, _visStateMerger.serializeLayer)(original, state.schema);
|
|
1761
|
-
|
|
1762
|
-
// assign new id and label to copied layer
|
|
1763
|
-
if (!(loadedLayer !== null && loadedLayer !== void 0 && loadedLayer.config)) {
|
|
1764
|
-
return state;
|
|
1765
|
-
}
|
|
1766
|
-
loadedLayer.config.label = newLabel;
|
|
1767
|
-
loadedLayer.id = (0, _commonUtils.generateHashId)(_layers.LAYER_ID_LENGTH);
|
|
1768
|
-
|
|
1769
|
-
// add layer to state
|
|
1770
|
-
var nextState = addLayerUpdater(state, {
|
|
1771
|
-
config: loadedLayer
|
|
1772
|
-
});
|
|
1773
|
-
// retrieve newly created layer
|
|
1774
|
-
var newLayer = nextState.layers[nextState.layers.length - 1];
|
|
1775
|
-
// update layer order with newLyaer.id
|
|
1776
|
-
var newLayerOrder = (0, _utils.arrayInsert)(nextState.layerOrder.slice(1, nextState.layerOrder.length), originalLayerOrderIdx, newLayer.id);
|
|
1777
|
-
nextState = reorderLayerUpdater(nextState, {
|
|
1778
|
-
order: newLayerOrder
|
|
1779
|
-
});
|
|
1780
|
-
return updateAnimationDomain(nextState);
|
|
1781
|
-
};
|
|
1782
|
-
|
|
1783
|
-
/**
|
|
1784
|
-
* Add a new effect
|
|
1785
|
-
* @memberof visStateUpdaters
|
|
1786
|
-
* @public
|
|
1787
|
-
*/
|
|
1788
|
-
var addEffectUpdater = exports.addEffectUpdater = function addEffectUpdater(state, action) {
|
|
1789
|
-
var _action$config, _action$config2, _action$config3;
|
|
1790
|
-
if (((_action$config = action.config) === null || _action$config === void 0 ? void 0 : _action$config.type) === _constants.LIGHT_AND_SHADOW_EFFECT.type && state.effects.some(function (effect) {
|
|
1791
|
-
return effect.type === _constants.LIGHT_AND_SHADOW_EFFECT.type;
|
|
1792
|
-
})) {
|
|
1793
|
-
_window.console.warn("Can't add more than one ".concat(_constants.LIGHT_AND_SHADOW_EFFECT.name, " effect"));
|
|
1794
|
-
return state;
|
|
1795
|
-
}
|
|
1796
|
-
if (((_action$config2 = action.config) === null || _action$config2 === void 0 ? void 0 : _action$config2.type) === _constants.DISTANCE_FOG_TYPE && state.effects.some(function (effect) {
|
|
1797
|
-
return effect.type === _constants.DISTANCE_FOG_TYPE || effect.type === _constants.SURFACE_FOG_TYPE;
|
|
1798
|
-
})) {
|
|
1799
|
-
_window.console.warn("Can't add more than one fog effect");
|
|
1800
|
-
return state;
|
|
1801
|
-
}
|
|
1802
|
-
if (((_action$config3 = action.config) === null || _action$config3 === void 0 ? void 0 : _action$config3.type) === _constants.SURFACE_FOG_TYPE && state.effects.some(function (effect) {
|
|
1803
|
-
return effect.type === _constants.SURFACE_FOG_TYPE || effect.type === _constants.DISTANCE_FOG_TYPE;
|
|
1804
|
-
})) {
|
|
1805
|
-
_window.console.warn("Can't add more than one fog effect");
|
|
1806
|
-
return state;
|
|
1807
|
-
}
|
|
1808
|
-
var newEffect = (0, _effects.createEffect)(action.config);
|
|
1809
|
-
|
|
1810
|
-
// collapse configurators for other effects
|
|
1811
|
-
state.effects.forEach(function (effect) {
|
|
1812
|
-
return effect.setProps({
|
|
1813
|
-
isConfigActive: false
|
|
1814
|
-
});
|
|
1815
|
-
});
|
|
1816
|
-
var effects = [].concat((0, _toConsumableArray2["default"])(state.effects), [newEffect]);
|
|
1817
|
-
var effectOrder = (0, _utils.fixEffectOrder)(effects, [newEffect.id].concat((0, _toConsumableArray2["default"])(state.effectOrder)));
|
|
1818
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1819
|
-
effects: effects,
|
|
1820
|
-
effectOrder: effectOrder
|
|
1821
|
-
});
|
|
1822
|
-
};
|
|
1823
|
-
|
|
1824
|
-
/**
|
|
1825
|
-
* remove effect
|
|
1826
|
-
* @memberof visStateUpdaters
|
|
1827
|
-
* @public
|
|
1828
|
-
*/
|
|
1829
|
-
var removeEffectUpdater = exports.removeEffectUpdater = function removeEffectUpdater(state, _ref12) {
|
|
1830
|
-
var id = _ref12.id;
|
|
1831
|
-
var idx = state.effects.findIndex(function (l) {
|
|
1832
|
-
return l.id === id;
|
|
1833
|
-
});
|
|
1834
|
-
if (idx < 0 || idx >= state.effects.length) {
|
|
1835
|
-
_window.console.warn("can not remove effect with invalid id ".concat(id));
|
|
1836
|
-
return state;
|
|
1837
|
-
}
|
|
1838
|
-
var effects = state.effects,
|
|
1839
|
-
effectOrder = state.effectOrder;
|
|
1840
|
-
var effectToRemove = effects[idx];
|
|
1841
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1842
|
-
// @ts-expect-error fixed in ts
|
|
1843
|
-
effects: (0, _composerHelpers.filterOutById)(effectToRemove.id)(effects),
|
|
1844
|
-
effectOrder: effectOrder.filter(function (effectId) {
|
|
1845
|
-
return effectId !== effectToRemove.id;
|
|
1846
|
-
})
|
|
1847
|
-
});
|
|
1848
|
-
};
|
|
1849
|
-
|
|
1850
|
-
/**
|
|
1851
|
-
* Reorder effect
|
|
1852
|
-
* @memberof visStateUpdaters
|
|
1853
|
-
* @public
|
|
1854
|
-
*/
|
|
1855
|
-
var reorderEffectUpdater = exports.reorderEffectUpdater = function reorderEffectUpdater(state, _ref13) {
|
|
1856
|
-
var order = _ref13.order;
|
|
1857
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1858
|
-
effectOrder: (0, _utils.fixEffectOrder)(state.effects, (0, _toConsumableArray2["default"])(order))
|
|
1859
|
-
});
|
|
1860
|
-
};
|
|
1861
|
-
|
|
1862
|
-
/**
|
|
1863
|
-
* Update effect
|
|
1864
|
-
* @memberof visStateUpdaters
|
|
1865
|
-
* @public
|
|
1866
|
-
*/
|
|
1867
|
-
var updateEffectUpdater = exports.updateEffectUpdater = function updateEffectUpdater(state, _ref14) {
|
|
1868
|
-
var id = _ref14.id,
|
|
1869
|
-
props = _ref14.props;
|
|
1870
|
-
var idx = state.effects.findIndex(function (l) {
|
|
1871
|
-
return l.id === id;
|
|
1872
|
-
});
|
|
1873
|
-
if (idx < 0 || idx >= state.effects.length) {
|
|
1874
|
-
_window.console.warn("can not update effect with invalid id ".concat(id));
|
|
1875
|
-
return state;
|
|
1876
|
-
}
|
|
1877
|
-
var effectOrder = state.effectOrder;
|
|
1878
|
-
if (props.id !== undefined && props.id !== id) {
|
|
1879
|
-
var idx2 = state.effects.findIndex(function (l) {
|
|
1880
|
-
return l.id === props.id;
|
|
1881
|
-
});
|
|
1882
|
-
if (idx2 >= 0) {
|
|
1883
|
-
_window.console.warn("can not update effect with existing effect id ".concat(id));
|
|
1884
|
-
return state;
|
|
1885
|
-
}
|
|
1886
|
-
effectOrder = effectOrder.map(function (effectOrderId) {
|
|
1887
|
-
return effectOrderId === id ? props.id : effectOrderId;
|
|
1888
|
-
});
|
|
1889
|
-
}
|
|
1890
|
-
var newEffects = (0, _toConsumableArray2["default"])(state.effects);
|
|
1891
|
-
newEffects[idx].setProps(props);
|
|
1892
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1893
|
-
effects: newEffects,
|
|
1894
|
-
effectOrder: effectOrder
|
|
1895
|
-
});
|
|
1896
|
-
};
|
|
1897
|
-
|
|
1898
|
-
// ANNOTATION UPDATERS
|
|
1899
|
-
|
|
1900
|
-
function makeNewAnnotation(config) {
|
|
1901
|
-
var _config$kind, _config$id, _config$isVisible, _config$autoSize, _config$autoSizeY, _config$anchorPoint, _config$label, _config$lineColor, _config$lineWidth, _config$textWidth, _config$textHeight, _config$textVerticalA, _armLength, _angle, _armLength2, _angle2, _armLength3, _angle3, _radiusInMeters;
|
|
1902
|
-
var kind = (_config$kind = config === null || config === void 0 ? void 0 : config.kind) !== null && _config$kind !== void 0 ? _config$kind : _constants.INITIAL_ANNOTATION_KIND;
|
|
1903
|
-
var base = {
|
|
1904
|
-
id: (_config$id = config === null || config === void 0 ? void 0 : config.id) !== null && _config$id !== void 0 ? _config$id : (0, _commonUtils.generateHashId)(6),
|
|
1905
|
-
kind: kind,
|
|
1906
|
-
isVisible: (_config$isVisible = config === null || config === void 0 ? void 0 : config.isVisible) !== null && _config$isVisible !== void 0 ? _config$isVisible : true,
|
|
1907
|
-
autoSize: (_config$autoSize = config === null || config === void 0 ? void 0 : config.autoSize) !== null && _config$autoSize !== void 0 ? _config$autoSize : true,
|
|
1908
|
-
autoSizeY: (_config$autoSizeY = config === null || config === void 0 ? void 0 : config.autoSizeY) !== null && _config$autoSizeY !== void 0 ? _config$autoSizeY : true,
|
|
1909
|
-
anchorPoint: (_config$anchorPoint = config === null || config === void 0 ? void 0 : config.anchorPoint) !== null && _config$anchorPoint !== void 0 ? _config$anchorPoint : [0, 0],
|
|
1910
|
-
label: (_config$label = config === null || config === void 0 ? void 0 : config.label) !== null && _config$label !== void 0 ? _config$label : 'New Annotation',
|
|
1911
|
-
lineColor: (_config$lineColor = config === null || config === void 0 ? void 0 : config.lineColor) !== null && _config$lineColor !== void 0 ? _config$lineColor : _constants.INITIAL_ANNOTATION_LINE_COLOR,
|
|
1912
|
-
lineWidth: (_config$lineWidth = config === null || config === void 0 ? void 0 : config.lineWidth) !== null && _config$lineWidth !== void 0 ? _config$lineWidth : _constants.INITIAL_ANNOTATION_LINE_WIDTH,
|
|
1913
|
-
textWidth: (_config$textWidth = config === null || config === void 0 ? void 0 : config.textWidth) !== null && _config$textWidth !== void 0 ? _config$textWidth : _constants.INITIAL_ANNOTATION_TEXT_WIDTH,
|
|
1914
|
-
textHeight: (_config$textHeight = config === null || config === void 0 ? void 0 : config.textHeight) !== null && _config$textHeight !== void 0 ? _config$textHeight : _constants.INITIAL_ANNOTATION_TEXT_HEIGHT,
|
|
1915
|
-
textVerticalAlign: (_config$textVerticalA = config === null || config === void 0 ? void 0 : config.textVerticalAlign) !== null && _config$textVerticalA !== void 0 ? _config$textVerticalA : 'bottom',
|
|
1916
|
-
mapIndex: config === null || config === void 0 ? void 0 : config.mapIndex
|
|
1917
|
-
};
|
|
1918
|
-
switch (kind) {
|
|
1919
|
-
case _constants.AnnotationKind.POINT:
|
|
1920
|
-
return _objectSpread(_objectSpread({}, base), {}, {
|
|
1921
|
-
kind: _constants.AnnotationKind.POINT,
|
|
1922
|
-
armLength: (_armLength = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength !== void 0 ? _armLength : _constants.INITIAL_ANNOTATION_ARM_LENGTH,
|
|
1923
|
-
angle: (_angle = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle !== void 0 ? _angle : _constants.INITIAL_ANNOTATION_ANGLE
|
|
1924
|
-
});
|
|
1925
|
-
case _constants.AnnotationKind.ARROW:
|
|
1926
|
-
return _objectSpread(_objectSpread({}, base), {}, {
|
|
1927
|
-
kind: _constants.AnnotationKind.ARROW,
|
|
1928
|
-
armLength: (_armLength2 = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength2 !== void 0 ? _armLength2 : _constants.INITIAL_ANNOTATION_ARM_LENGTH,
|
|
1929
|
-
angle: (_angle2 = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle2 !== void 0 ? _angle2 : _constants.INITIAL_ANNOTATION_ANGLE
|
|
1930
|
-
});
|
|
1931
|
-
case _constants.AnnotationKind.CIRCLE:
|
|
1932
|
-
return _objectSpread(_objectSpread({}, base), {}, {
|
|
1933
|
-
kind: _constants.AnnotationKind.CIRCLE,
|
|
1934
|
-
armLength: (_armLength3 = config === null || config === void 0 ? void 0 : config.armLength) !== null && _armLength3 !== void 0 ? _armLength3 : _constants.INITIAL_ANNOTATION_ARM_LENGTH,
|
|
1935
|
-
angle: (_angle3 = config === null || config === void 0 ? void 0 : config.angle) !== null && _angle3 !== void 0 ? _angle3 : _constants.INITIAL_ANNOTATION_ANGLE,
|
|
1936
|
-
radiusInMeters: (_radiusInMeters = config === null || config === void 0 ? void 0 : config.radiusInMeters) !== null && _radiusInMeters !== void 0 ? _radiusInMeters : 1000
|
|
1937
|
-
});
|
|
1938
|
-
case _constants.AnnotationKind.TEXT:
|
|
1939
|
-
default:
|
|
1940
|
-
return _objectSpread(_objectSpread({}, base), {}, {
|
|
1941
|
-
kind: _constants.AnnotationKind.TEXT
|
|
1942
|
-
});
|
|
1943
|
-
}
|
|
1944
|
-
}
|
|
1945
|
-
|
|
1946
|
-
/**
|
|
1947
|
-
* Add a new annotation
|
|
1948
|
-
* @memberof visStateUpdaters
|
|
1949
|
-
* @public
|
|
1950
|
-
*/
|
|
1951
|
-
var addAnnotationUpdater = exports.addAnnotationUpdater = function addAnnotationUpdater(state, action) {
|
|
1952
|
-
var newAnnotation = makeNewAnnotation(action.config);
|
|
1953
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1954
|
-
annotations: [newAnnotation].concat((0, _toConsumableArray2["default"])(state.annotations)),
|
|
1955
|
-
selectedAnnotationId: newAnnotation.id,
|
|
1956
|
-
isEditingAnnotationText: true
|
|
1957
|
-
});
|
|
1958
|
-
};
|
|
1959
|
-
|
|
1960
|
-
/**
|
|
1961
|
-
* Remove an annotation
|
|
1962
|
-
* @memberof visStateUpdaters
|
|
1963
|
-
* @public
|
|
1964
|
-
*/
|
|
1965
|
-
var removeAnnotationUpdater = exports.removeAnnotationUpdater = function removeAnnotationUpdater(state, _ref15) {
|
|
1966
|
-
var id = _ref15.id;
|
|
1967
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
1968
|
-
annotations: state.annotations.filter(function (a) {
|
|
1969
|
-
return a.id !== id;
|
|
1970
|
-
}),
|
|
1971
|
-
selectedAnnotationId: state.selectedAnnotationId === id ? null : state.selectedAnnotationId,
|
|
1972
|
-
isEditingAnnotationText: state.selectedAnnotationId === id ? false : state.isEditingAnnotationText
|
|
1973
|
-
});
|
|
1974
|
-
};
|
|
1975
|
-
|
|
1976
|
-
/**
|
|
1977
|
-
* Update an annotation
|
|
1978
|
-
* @memberof visStateUpdaters
|
|
1979
|
-
* @public
|
|
1980
|
-
*/
|
|
1981
|
-
var updateAnnotationUpdater = exports.updateAnnotationUpdater = function updateAnnotationUpdater(state, _ref16) {
|
|
1982
|
-
var id = _ref16.id,
|
|
1983
|
-
config = _ref16.config;
|
|
1984
|
-
var idx = state.annotations.findIndex(function (a) {
|
|
1985
|
-
return a.id === id;
|
|
1986
|
-
});
|
|
1987
|
-
if (idx < 0) {
|
|
1988
|
-
_window.console.warn("can not update annotation with invalid id ".concat(id));
|
|
1989
|
-
return state;
|
|
1990
|
-
}
|
|
1991
|
-
var prev = state.annotations[idx];
|
|
1992
|
-
var nextAnnotation;
|
|
1993
|
-
if (config.kind && config.kind !== prev.kind) {
|
|
1994
|
-
nextAnnotation = makeNewAnnotation(_objectSpread(_objectSpread({}, prev), config));
|
|
1995
|
-
} else {
|
|
1996
|
-
nextAnnotation = _objectSpread(_objectSpread({}, prev), config);
|
|
1997
|
-
}
|
|
1998
|
-
var newAnnotations = (0, _toConsumableArray2["default"])(state.annotations);
|
|
1999
|
-
newAnnotations[idx] = nextAnnotation;
|
|
2000
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2001
|
-
annotations: newAnnotations
|
|
2002
|
-
});
|
|
2003
|
-
};
|
|
2004
|
-
|
|
2005
|
-
/**
|
|
2006
|
-
* Duplicate an annotation
|
|
2007
|
-
* @memberof visStateUpdaters
|
|
2008
|
-
* @public
|
|
2009
|
-
*/
|
|
2010
|
-
var duplicateAnnotationUpdater = exports.duplicateAnnotationUpdater = function duplicateAnnotationUpdater(state, _ref17) {
|
|
2011
|
-
var id = _ref17.id;
|
|
2012
|
-
var original = state.annotations.find(function (a) {
|
|
2013
|
-
return a.id === id;
|
|
2014
|
-
});
|
|
2015
|
-
if (!original) {
|
|
2016
|
-
_window.console.warn("can not duplicate annotation with invalid id ".concat(id));
|
|
2017
|
-
return state;
|
|
2018
|
-
}
|
|
2019
|
-
var newAnnotation = _objectSpread(_objectSpread({}, (0, _cloneDeep["default"])(original)), {}, {
|
|
2020
|
-
id: (0, _commonUtils.generateHashId)(6),
|
|
2021
|
-
label: "Copy of ".concat(original.label)
|
|
2022
|
-
});
|
|
2023
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2024
|
-
annotations: [newAnnotation].concat((0, _toConsumableArray2["default"])(state.annotations)),
|
|
2025
|
-
selectedAnnotationId: newAnnotation.id,
|
|
2026
|
-
isEditingAnnotationText: false
|
|
2027
|
-
});
|
|
2028
|
-
};
|
|
2029
|
-
|
|
2030
|
-
/**
|
|
2031
|
-
* Set selected annotation
|
|
2032
|
-
* @memberof visStateUpdaters
|
|
2033
|
-
* @public
|
|
2034
|
-
*/
|
|
2035
|
-
var setSelectedAnnotationUpdater = exports.setSelectedAnnotationUpdater = function setSelectedAnnotationUpdater(state, _ref18) {
|
|
2036
|
-
var id = _ref18.id,
|
|
2037
|
-
isEditingText = _ref18.isEditingText;
|
|
2038
|
-
if (id === state.selectedAnnotationId && (isEditingText !== null && isEditingText !== void 0 ? isEditingText : false) === state.isEditingAnnotationText) {
|
|
2039
|
-
return state;
|
|
2040
|
-
}
|
|
2041
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2042
|
-
selectedAnnotationId: id,
|
|
2043
|
-
isEditingAnnotationText: isEditingText !== null && isEditingText !== void 0 ? isEditingText : false
|
|
2044
|
-
});
|
|
2045
|
-
};
|
|
2046
|
-
|
|
2047
|
-
/**
|
|
2048
|
-
* Remove a dataset and all layers, filters, tooltip configs that based on it
|
|
2049
|
-
* @memberof visStateUpdaters
|
|
2050
|
-
* @public
|
|
2051
|
-
*/
|
|
2052
|
-
function removeDatasetUpdater(state, action) {
|
|
2053
|
-
// extract dataset key
|
|
2054
|
-
var datasetKey = action.dataId;
|
|
2055
|
-
var datasets = state.datasets;
|
|
2056
|
-
|
|
2057
|
-
// check if dataset is present
|
|
2058
|
-
if (!datasets[datasetKey]) {
|
|
2059
|
-
return state;
|
|
2060
|
-
}
|
|
2061
|
-
var layers = state.layers,
|
|
2062
|
-
_state$datasets = state.datasets,
|
|
2063
|
-
dataset = _state$datasets[datasetKey],
|
|
2064
|
-
newDatasets = (0, _objectWithoutProperties2["default"])(_state$datasets, [datasetKey].map(_toPropertyKey));
|
|
2065
|
-
var layersToRemove = layers.filter(function (l) {
|
|
2066
|
-
return l.config.dataId === datasetKey;
|
|
2067
|
-
}).map(function (l) {
|
|
2068
|
-
return l.id;
|
|
2069
|
-
});
|
|
2070
|
-
|
|
2071
|
-
// remove layers and datasets
|
|
2072
|
-
var newState = layersToRemove.reduce(function (accu, id) {
|
|
2073
|
-
return removeLayerUpdater(accu, {
|
|
2074
|
-
id: id
|
|
2075
|
-
});
|
|
2076
|
-
}, _objectSpread(_objectSpread({}, state), {}, {
|
|
2077
|
-
datasets: newDatasets
|
|
2078
|
-
}));
|
|
2079
|
-
|
|
2080
|
-
// update filters
|
|
2081
|
-
var filters = [];
|
|
2082
|
-
var _iterator2 = _createForOfIteratorHelper(newState.filters),
|
|
2083
|
-
_step2;
|
|
2084
|
-
try {
|
|
2085
|
-
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
2086
|
-
var filter = _step2.value;
|
|
2087
|
-
var valueIndex = filter.dataId.indexOf(datasetKey);
|
|
2088
|
-
if (valueIndex >= 0 && filter.dataId.length > 1) {
|
|
2089
|
-
// only remove one synced dataset from the filter
|
|
2090
|
-
filters.push(_removeFilterDataIdAtValueIndex(filter, valueIndex, datasets));
|
|
2091
|
-
} else if (valueIndex < 0) {
|
|
2092
|
-
// leave the filter as is
|
|
2093
|
-
filters.push(filter);
|
|
2094
|
-
}
|
|
2095
|
-
}
|
|
2096
|
-
} catch (err) {
|
|
2097
|
-
_iterator2.e(err);
|
|
2098
|
-
} finally {
|
|
2099
|
-
_iterator2.f();
|
|
2100
|
-
}
|
|
2101
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
2102
|
-
filters: filters
|
|
2103
|
-
});
|
|
2104
|
-
return removeDatasetFromInteractionConfig(newState, {
|
|
2105
|
-
dataId: datasetKey
|
|
2106
|
-
});
|
|
2107
|
-
}
|
|
2108
|
-
function removeDatasetFromInteractionConfig(state, _ref19) {
|
|
2109
|
-
var dataId = _ref19.dataId;
|
|
2110
|
-
var interactionConfig = state.interactionConfig;
|
|
2111
|
-
var _interactionConfig = interactionConfig,
|
|
2112
|
-
tooltip = _interactionConfig.tooltip;
|
|
2113
|
-
if (tooltip) {
|
|
2114
|
-
var config = tooltip.config;
|
|
2115
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2116
|
-
var _config$fieldsToShow = config.fieldsToShow,
|
|
2117
|
-
fields = _config$fieldsToShow[dataId],
|
|
2118
|
-
fieldsToShow = (0, _objectWithoutProperties2["default"])(_config$fieldsToShow, [dataId].map(_toPropertyKey));
|
|
2119
|
-
interactionConfig = _objectSpread(_objectSpread({}, interactionConfig), {}, {
|
|
2120
|
-
tooltip: _objectSpread(_objectSpread({}, tooltip), {}, {
|
|
2121
|
-
config: _objectSpread(_objectSpread({}, config), {}, {
|
|
2122
|
-
fieldsToShow: fieldsToShow
|
|
2123
|
-
})
|
|
2124
|
-
})
|
|
2125
|
-
});
|
|
2126
|
-
}
|
|
2127
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2128
|
-
interactionConfig: interactionConfig
|
|
2129
|
-
});
|
|
2130
|
-
}
|
|
2131
|
-
/**
|
|
2132
|
-
* update layer blending mode
|
|
2133
|
-
* @memberof visStateUpdaters
|
|
2134
|
-
* @public
|
|
2135
|
-
*/
|
|
2136
|
-
var updateLayerBlendingUpdater = exports.updateLayerBlendingUpdater = function updateLayerBlendingUpdater(state, action) {
|
|
2137
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2138
|
-
layerBlending: action.mode
|
|
2139
|
-
});
|
|
2140
|
-
};
|
|
2141
|
-
|
|
2142
|
-
/**
|
|
2143
|
-
* update overlay blending mode
|
|
2144
|
-
* @memberof visStateUpdaters
|
|
2145
|
-
* @public
|
|
2146
|
-
*/
|
|
2147
|
-
var updateOverlayBlendingUpdater = exports.updateOverlayBlendingUpdater = function updateOverlayBlendingUpdater(state, action) {
|
|
2148
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2149
|
-
overlayBlending: action.mode
|
|
2150
|
-
});
|
|
2151
|
-
};
|
|
2152
|
-
|
|
2153
|
-
/**
|
|
2154
|
-
* Display dataset table in a modal
|
|
2155
|
-
* @memberof visStateUpdaters
|
|
2156
|
-
* @public
|
|
2157
|
-
*/
|
|
2158
|
-
var showDatasetTableUpdater = exports.showDatasetTableUpdater = function showDatasetTableUpdater(state, action) {
|
|
2159
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2160
|
-
editingDataset: action.dataId
|
|
2161
|
-
});
|
|
2162
|
-
};
|
|
2163
|
-
|
|
2164
|
-
/**
|
|
2165
|
-
* Add custom color for datasets and layers
|
|
2166
|
-
* @memberof visStateUpdaters
|
|
2167
|
-
* @public
|
|
2168
|
-
*/
|
|
2169
|
-
var updateTableColorUpdater = exports.updateTableColorUpdater = function updateTableColorUpdater(state, action) {
|
|
2170
|
-
return updateDatasetPropsUpdater(state, {
|
|
2171
|
-
dataId: action.dataId,
|
|
2172
|
-
props: {
|
|
2173
|
-
color: action.newColor
|
|
2174
|
-
}
|
|
2175
|
-
});
|
|
2176
|
-
};
|
|
2177
|
-
|
|
2178
|
-
/**
|
|
2179
|
-
* reset visState to initial State
|
|
2180
|
-
* @memberof visStateUpdaters
|
|
2181
|
-
* @public
|
|
2182
|
-
*/
|
|
2183
|
-
var resetMapConfigUpdater = exports.resetMapConfigUpdater = function resetMapConfigUpdater(state) {
|
|
2184
|
-
return _objectSpread(_objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), {}, {
|
|
2185
|
-
initialState: state.initialState
|
|
2186
|
-
});
|
|
2187
|
-
};
|
|
2188
|
-
|
|
2189
|
-
/**
|
|
2190
|
-
* Propagate `visState` reducer with a new configuration. Current config will be override.
|
|
2191
|
-
* @memberof visStateUpdaters
|
|
2192
|
-
* @public
|
|
2193
|
-
*/
|
|
2194
|
-
var receiveMapConfigUpdater = exports.receiveMapConfigUpdater = function receiveMapConfigUpdater(state, _ref20) {
|
|
2195
|
-
var _ref20$payload = _ref20.payload,
|
|
2196
|
-
_ref20$payload$config = _ref20$payload.config,
|
|
2197
|
-
config = _ref20$payload$config === void 0 ? {} : _ref20$payload$config,
|
|
2198
|
-
_ref20$payload$option = _ref20$payload.options,
|
|
2199
|
-
options = _ref20$payload$option === void 0 ? {} : _ref20$payload$option;
|
|
2200
|
-
if (!config.visState) {
|
|
2201
|
-
return state;
|
|
2202
|
-
}
|
|
2203
|
-
var keepExistingConfig = options.keepExistingConfig;
|
|
2204
|
-
|
|
2205
|
-
// reset config if keepExistingConfig is falsy
|
|
2206
|
-
var mergedState = !keepExistingConfig ? resetMapConfigUpdater(state) : state;
|
|
2207
|
-
var _iterator3 = _createForOfIteratorHelper(state.mergers),
|
|
2208
|
-
_step3;
|
|
2209
|
-
try {
|
|
2210
|
-
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
2211
|
-
var merger = _step3.value;
|
|
2212
|
-
if ((0, _mergerHandler.isValidMerger)(merger) && (0, _mergerHandler.hasPropsToMerge)(config.visState, merger.prop)) {
|
|
2213
|
-
mergedState = merger.merge(mergedState, (0, _mergerHandler.getPropValueToMerger)(config.visState, merger.prop, merger.toMergeProp),
|
|
2214
|
-
// fromConfig
|
|
2215
|
-
true);
|
|
2216
|
-
}
|
|
2217
|
-
}
|
|
2218
|
-
} catch (err) {
|
|
2219
|
-
_iterator3.e(err);
|
|
2220
|
-
} finally {
|
|
2221
|
-
_iterator3.f();
|
|
2222
|
-
}
|
|
2223
|
-
return mergedState;
|
|
2224
|
-
};
|
|
2225
|
-
|
|
2226
|
-
/**
|
|
2227
|
-
* Trigger layer hover event with hovered object
|
|
2228
|
-
* @memberof visStateUpdaters
|
|
2229
|
-
* @public
|
|
2230
|
-
*/
|
|
2231
|
-
var layerHoverUpdater = exports.layerHoverUpdater = function layerHoverUpdater(state, action) {
|
|
2232
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2233
|
-
hoverInfo: _objectSpread(_objectSpread({}, action.info), Number.isFinite(action.mapIndex) ? {
|
|
2234
|
-
mapIndex: action.mapIndex
|
|
2235
|
-
} : {})
|
|
2236
|
-
});
|
|
2237
|
-
};
|
|
2238
|
-
|
|
2239
|
-
/* eslint-enable max-statements */
|
|
2240
|
-
|
|
2241
|
-
/**
|
|
2242
|
-
* Update `interactionConfig`
|
|
2243
|
-
* @memberof visStateUpdaters
|
|
2244
|
-
* @public
|
|
2245
|
-
*/
|
|
2246
|
-
function interactionConfigChangeUpdater(state, action) {
|
|
2247
|
-
var config = action.config;
|
|
2248
|
-
var interactionConfig = _objectSpread(_objectSpread({}, state.interactionConfig), (0, _defineProperty2["default"])({}, config.id, config));
|
|
2249
|
-
|
|
2250
|
-
// Don't enable tooltip and brush at the same time
|
|
2251
|
-
// but coordinates can be shown at all time
|
|
2252
|
-
var contradict = ['brush', 'tooltip'];
|
|
2253
|
-
if (contradict.includes(config.id) && config.enabled && !state.interactionConfig[config.id].enabled) {
|
|
2254
|
-
// only enable one interaction at a time
|
|
2255
|
-
contradict.forEach(function (k) {
|
|
2256
|
-
if (k !== config.id) {
|
|
2257
|
-
interactionConfig[k] = _objectSpread(_objectSpread({}, interactionConfig[k]), {}, {
|
|
2258
|
-
enabled: false
|
|
2259
|
-
});
|
|
2260
|
-
}
|
|
2261
|
-
});
|
|
2262
|
-
}
|
|
2263
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2264
|
-
interactionConfig: interactionConfig
|
|
2265
|
-
});
|
|
2266
|
-
if (config.id === 'geocoder' && !config.enabled) {
|
|
2267
|
-
return removeDatasetUpdater(newState, {
|
|
2268
|
-
dataId: 'geocoder_dataset'
|
|
2269
|
-
});
|
|
2270
|
-
}
|
|
2271
|
-
return newState;
|
|
2272
|
-
}
|
|
2273
|
-
|
|
2274
|
-
/**
|
|
2275
|
-
* Trigger layer click event with clicked object
|
|
2276
|
-
* @memberof visStateUpdaters
|
|
2277
|
-
* @public
|
|
2278
|
-
*/
|
|
2279
|
-
var layerClickUpdater = exports.layerClickUpdater = function layerClickUpdater(state, action) {
|
|
2280
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2281
|
-
mousePos: state.interactionConfig.coordinate.enabled ? _objectSpread(_objectSpread({}, state.mousePos), {}, {
|
|
2282
|
-
pinned: state.mousePos.pinned ? null : (0, _cloneDeep["default"])(state.mousePos)
|
|
2283
|
-
}) : state.mousePos,
|
|
2284
|
-
clicked: action.info && action.info.picked ? action.info : null
|
|
2285
|
-
});
|
|
2286
|
-
};
|
|
2287
|
-
|
|
2288
|
-
/**
|
|
2289
|
-
* Trigger map click event, unselect clicked object
|
|
2290
|
-
* @memberof visStateUpdaters
|
|
2291
|
-
* @public
|
|
2292
|
-
*/
|
|
2293
|
-
var mapClickUpdater = exports.mapClickUpdater = function mapClickUpdater(state, action) {
|
|
2294
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2295
|
-
clicked: null
|
|
2296
|
-
});
|
|
2297
|
-
};
|
|
2298
|
-
|
|
2299
|
-
/**
|
|
2300
|
-
* Trigger map move event
|
|
2301
|
-
* @memberof visStateUpdaters
|
|
2302
|
-
* @public
|
|
2303
|
-
*/
|
|
2304
|
-
var mouseMoveUpdater = exports.mouseMoveUpdater = function mouseMoveUpdater(state, _ref21) {
|
|
2305
|
-
var evt = _ref21.evt;
|
|
2306
|
-
if (Object.values(state.interactionConfig).some(function (config) {
|
|
2307
|
-
return config.enabled;
|
|
2308
|
-
})) {
|
|
2309
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2310
|
-
mousePos: _objectSpread(_objectSpread(_objectSpread({}, state.mousePos), Array.isArray(evt.point) ? {
|
|
2311
|
-
mousePosition: (0, _toConsumableArray2["default"])(evt.point)
|
|
2312
|
-
} : {}), Array.isArray(evt.lngLat) ? {
|
|
2313
|
-
coordinate: (0, _toConsumableArray2["default"])(evt.lngLat)
|
|
2314
|
-
} : {})
|
|
2315
|
-
});
|
|
2316
|
-
}
|
|
2317
|
-
return state;
|
|
2318
|
-
};
|
|
2319
|
-
/**
|
|
2320
|
-
* Toggle visibility of a layer for a split map
|
|
2321
|
-
* @memberof visStateUpdaters
|
|
2322
|
-
* @public
|
|
2323
|
-
*/
|
|
2324
|
-
var toggleSplitMapUpdater = exports.toggleSplitMapUpdater = function toggleSplitMapUpdater(state, action) {
|
|
2325
|
-
return state.splitMaps && state.splitMaps.length === 0 ? _objectSpread(_objectSpread({}, state), {}, {
|
|
2326
|
-
// maybe we should use an array to store state for a single map as well
|
|
2327
|
-
// if current maps length is equal to 0 it means that we are about to split the view
|
|
2328
|
-
splitMaps: (0, _utils.computeSplitMapLayers)(state.layers, {
|
|
2329
|
-
duplicate: false
|
|
2330
|
-
})
|
|
2331
|
-
}) : closeSpecificMapAtIndex(state, action);
|
|
2332
|
-
};
|
|
2333
|
-
|
|
2334
|
-
/**
|
|
2335
|
-
* Toggle visibility of a layer in a split map
|
|
2336
|
-
* @memberof visStateUpdaters
|
|
2337
|
-
* @public
|
|
2338
|
-
*/
|
|
2339
|
-
var toggleLayerForMapUpdater = exports.toggleLayerForMapUpdater = function toggleLayerForMapUpdater(state, _ref22) {
|
|
2340
|
-
var mapIndex = _ref22.mapIndex,
|
|
2341
|
-
layerId = _ref22.layerId;
|
|
2342
|
-
var splitMaps = state.splitMaps;
|
|
2343
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2344
|
-
splitMaps: splitMaps.map(function (sm, i) {
|
|
2345
|
-
return i === mapIndex ? _objectSpread(_objectSpread({}, splitMaps[i]), {}, {
|
|
2346
|
-
layers: _objectSpread(_objectSpread({}, splitMaps[i].layers), {}, (0, _defineProperty2["default"])({}, layerId, !splitMaps[i].layers[layerId]))
|
|
2347
|
-
}) : sm;
|
|
2348
|
-
})
|
|
2349
|
-
});
|
|
2350
|
-
};
|
|
2351
|
-
|
|
2352
|
-
/**
|
|
2353
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2354
|
-
* @memberof visStateUpdaters
|
|
2355
|
-
* @public
|
|
2356
|
-
*/
|
|
2357
|
-
// eslint-disable-next-line complexity
|
|
2358
|
-
var updateVisDataUpdater = exports.updateVisDataUpdater = function updateVisDataUpdater(state, action) {
|
|
2359
|
-
// datasets can be a single data entries or an array of multiple data entries
|
|
2360
|
-
var config = action.config,
|
|
2361
|
-
options = action.options;
|
|
2362
|
-
|
|
2363
|
-
// apply config if passed from action
|
|
2364
|
-
// TODO: we don't handle async mergers here yet
|
|
2365
|
-
var updatedState = config ? receiveMapConfigUpdater(state, {
|
|
2366
|
-
payload: {
|
|
2367
|
-
config: config,
|
|
2368
|
-
options: options
|
|
2369
|
-
}
|
|
2370
|
-
}) : state;
|
|
2371
|
-
var datasets = (0, _commonUtils.toArray)(action.datasets);
|
|
2372
|
-
if (!datasets.length) {
|
|
2373
|
-
return updatedState;
|
|
2374
|
-
}
|
|
2375
|
-
var createDatasetTasks = [];
|
|
2376
|
-
var notificationTasks = [];
|
|
2377
|
-
datasets.forEach(function (_ref23, datasetIndex) {
|
|
2378
|
-
var _ref23$info = _ref23.info,
|
|
2379
|
-
info = _ref23$info === void 0 ? {} : _ref23$info,
|
|
2380
|
-
rest = (0, _objectWithoutProperties2["default"])(_ref23, _excluded2);
|
|
2381
|
-
var task = (0, _table.createNewDataEntry)(_objectSpread({
|
|
2382
|
-
info: info
|
|
2383
|
-
}, rest), state.datasets);
|
|
2384
|
-
if (task) {
|
|
2385
|
-
createDatasetTasks.push(task);
|
|
2386
|
-
} else {
|
|
2387
|
-
notificationTasks.push(ACTION_TASK_ADD_NOTIFICATION().map(function () {
|
|
2388
|
-
return (0, _actions.addNotification)((0, _utils.errorNotification)({
|
|
2389
|
-
message: "Failed to create a new dataset due to data verification errors",
|
|
2390
|
-
id: "dataset-failed-".concat(datasetIndex)
|
|
2391
|
-
}));
|
|
2392
|
-
}));
|
|
2393
|
-
}
|
|
2394
|
-
});
|
|
2395
|
-
var datasetsAllSettledTask = createDatasetTasks.length ? _tasks["default"].allSettled(createDatasetTasks).map(function (results) {
|
|
2396
|
-
return (0, _actions.createNewDatasetSuccess)({
|
|
2397
|
-
results: results,
|
|
2398
|
-
addToMapOptions: options
|
|
2399
|
-
});
|
|
2400
|
-
}) : null;
|
|
2401
|
-
if (datasetsAllSettledTask) {
|
|
2402
|
-
updatedState = setLoadingIndicatorUpdater(updatedState, (0, _composerHelpers.payload_)({
|
|
2403
|
-
change: 1,
|
|
2404
|
-
type: ''
|
|
2405
|
-
}));
|
|
2406
|
-
}
|
|
2407
|
-
return (0, _tasks.withTask)(updatedState, [].concat((0, _toConsumableArray2["default"])(datasetsAllSettledTask ? [datasetsAllSettledTask] : []), notificationTasks));
|
|
2408
|
-
};
|
|
2409
|
-
var createNewDatasetSuccessUpdater = exports.createNewDatasetSuccessUpdater = function createNewDatasetSuccessUpdater(state, action) {
|
|
2410
|
-
var _action$payload = action.payload,
|
|
2411
|
-
results = _action$payload.results,
|
|
2412
|
-
addToMapOptions = _action$payload.addToMapOptions;
|
|
2413
|
-
var notificationTasks = [];
|
|
2414
|
-
var newDataEntries = results.reduce(function (accu, result, idx) {
|
|
2415
|
-
if (result.status === 'fulfilled') {
|
|
2416
|
-
var dataset = result.value;
|
|
2417
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, dataset.id, dataset));
|
|
2418
|
-
} else {
|
|
2419
|
-
// show error notification on UI
|
|
2420
|
-
notificationTasks.push((0, _tasks2.ACTION_TASK)().map(function () {
|
|
2421
|
-
return (0, _actions.addNotification)((0, _utils.errorNotification)({
|
|
2422
|
-
message: "Dataset error: Failed to create a new dataset:\n ".concat(result.reason || result.value),
|
|
2423
|
-
id: "dataset-create-failed-".concat(idx)
|
|
2424
|
-
}));
|
|
2425
|
-
}));
|
|
2426
|
-
return accu;
|
|
2427
|
-
}
|
|
2428
|
-
}, {});
|
|
2429
|
-
// save new dataset entry to state
|
|
2430
|
-
var mergedState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2431
|
-
datasets: (0, _visStateMerger.mergeDatasetsByOrder)(state, newDataEntries)
|
|
2432
|
-
});
|
|
2433
|
-
|
|
2434
|
-
// merge state with config to be merged
|
|
2435
|
-
var layerMergers = state.mergers.filter(function (m) {
|
|
2436
|
-
return m.waitForLayerData;
|
|
2437
|
-
});
|
|
2438
|
-
var datasetMergers = state.mergers.filter(function (m) {
|
|
2439
|
-
return !layerMergers.includes(m);
|
|
2440
|
-
});
|
|
2441
|
-
var newDataIds = Object.keys(newDataEntries);
|
|
2442
|
-
var postMergerPayload = {
|
|
2443
|
-
newDataIds: newDataIds,
|
|
2444
|
-
options: addToMapOptions,
|
|
2445
|
-
layerMergers: layerMergers
|
|
2446
|
-
};
|
|
2447
|
-
var updatedState = applyMergersUpdater(mergedState, {
|
|
2448
|
-
mergers: datasetMergers,
|
|
2449
|
-
postMergerPayload: postMergerPayload
|
|
2450
|
-
});
|
|
2451
|
-
return (0, _tasks.withTask)(setLoadingIndicatorUpdater(updatedState, (0, _composerHelpers.payload_)({
|
|
2452
|
-
change: -1
|
|
2453
|
-
})), notificationTasks);
|
|
2454
|
-
};
|
|
2455
|
-
|
|
2456
|
-
/**
|
|
2457
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2458
|
-
*/
|
|
2459
|
-
function applyMergersUpdater(state, action) {
|
|
2460
|
-
var mergers = action.mergers,
|
|
2461
|
-
postMergerPayload = action.postMergerPayload;
|
|
2462
|
-
|
|
2463
|
-
// merge state with config to be merged
|
|
2464
|
-
var mergeStateResult = (0, _mergerHandler.mergeStateFromMergers)(state, _objectSpread(_objectSpread({}, INITIAL_VIS_STATE), state.initialState), mergers,
|
|
2465
|
-
// newDataIds,
|
|
2466
|
-
postMergerPayload);
|
|
2467
|
-
|
|
2468
|
-
// if all merged, kickup post merge process
|
|
2469
|
-
// if not wait
|
|
2470
|
-
return mergeStateResult.allMerged ? postMergeUpdater(mergeStateResult.mergedState, postMergerPayload) : mergeStateResult.mergedState;
|
|
2471
|
-
}
|
|
2472
|
-
|
|
2473
|
-
/** Reads `options.layerVisConfig` from add-data-to-map (see `AddDataToMapOptions`). */
|
|
2474
|
-
function layerVisConfigFromAddDataOptions(options) {
|
|
2475
|
-
if (!options || !('layerVisConfig' in options)) {
|
|
2476
|
-
return undefined;
|
|
2477
|
-
}
|
|
2478
|
-
var patch = options.layerVisConfig;
|
|
2479
|
-
if (patch == null || (0, _typeof2["default"])(patch) !== 'object' || Array.isArray(patch)) {
|
|
2480
|
-
return undefined;
|
|
2481
|
-
}
|
|
2482
|
-
return patch;
|
|
2483
|
-
}
|
|
2484
|
-
|
|
2485
|
-
/**
|
|
2486
|
-
* Add new dataset to `visState`, with option to load a map config along with the datasets
|
|
2487
|
-
*/
|
|
2488
|
-
function postMergeUpdater(mergedState, postMergerPayload) {
|
|
2489
|
-
var newDataIds = postMergerPayload.newDataIds,
|
|
2490
|
-
options = postMergerPayload.options,
|
|
2491
|
-
layerMergers = postMergerPayload.layerMergers;
|
|
2492
|
-
var newFilters = mergedState.filters.filter(function (f) {
|
|
2493
|
-
return f.dataId.find(function (fDataId) {
|
|
2494
|
-
return newDataIds.includes(fDataId);
|
|
2495
|
-
});
|
|
2496
|
-
});
|
|
2497
|
-
var datasetFiltered = (0, _uniq["default"])(newFilters.reduce(function (accu, f) {
|
|
2498
|
-
return [].concat((0, _toConsumableArray2["default"])(accu), (0, _toConsumableArray2["default"])(f.dataId));
|
|
2499
|
-
}, []));
|
|
2500
|
-
var dataEmpty = newDataIds.length < 1;
|
|
2501
|
-
var newLayers = !dataEmpty ? mergedState.layers.filter(function (l) {
|
|
2502
|
-
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2503
|
-
}) : [];
|
|
2504
|
-
var newDataEntries = newDataIds.reduce(function (accu, id) {
|
|
2505
|
-
return _objectSpread(_objectSpread({}, accu), {}, (0, _defineProperty2["default"])({}, id, mergedState.datasets[id]));
|
|
2506
|
-
}, {});
|
|
2507
|
-
if (!newLayers.length && (options || {}).autoCreateLayers !== false) {
|
|
2508
|
-
// no layer merged, find defaults
|
|
2509
|
-
var result = addDefaultLayers(mergedState, newDataEntries);
|
|
2510
|
-
mergedState = result.state;
|
|
2511
|
-
newLayers = result.newLayers;
|
|
2512
|
-
}
|
|
2513
|
-
if (mergedState.splitMaps.length) {
|
|
2514
|
-
// if map is split, add new layers to splitMaps
|
|
2515
|
-
newLayers = mergedState.layers.filter(function (l) {
|
|
2516
|
-
return l.config.dataId && newDataIds.includes(l.config.dataId);
|
|
2517
|
-
});
|
|
2518
|
-
mergedState = _objectSpread(_objectSpread({}, mergedState), {}, {
|
|
2519
|
-
splitMaps: (0, _utils.addNewLayersToSplitMap)(mergedState.splitMaps, newLayers)
|
|
2520
|
-
});
|
|
2521
|
-
}
|
|
2522
|
-
mergedState = (0, _layerUtils.mergeLayerVisConfigForNewDatasets)(mergedState, layerVisConfigFromAddDataOptions(options), newDataIds);
|
|
2523
|
-
|
|
2524
|
-
// if no tooltips merged add default tooltips
|
|
2525
|
-
newDataIds.forEach(function (dataId) {
|
|
2526
|
-
var tooltipFields = mergedState.interactionConfig.tooltip.config.fieldsToShow[dataId];
|
|
2527
|
-
// loading dataset: autoCreateTooltips is false and we don't want to run addDefaultTooltips when tooltipFields is empty
|
|
2528
|
-
if ((options === null || options === void 0 ? void 0 : options.autoCreateTooltips) !== false && (!Array.isArray(tooltipFields) || !tooltipFields.length)) {
|
|
2529
|
-
// adding dataset: autoCreateTooltips is true
|
|
2530
|
-
mergedState = addDefaultTooltips(mergedState, newDataEntries[dataId]);
|
|
2531
|
-
}
|
|
2532
|
-
});
|
|
2533
|
-
var updatedDatasets = dataEmpty ? Object.keys(mergedState.datasets) : (0, _uniq["default"])(Object.keys(newDataEntries).concat(datasetFiltered));
|
|
2534
|
-
var updatedState = updateAllLayerDomainData(mergedState, updatedDatasets, undefined);
|
|
2535
|
-
|
|
2536
|
-
// register layer animation domain,
|
|
2537
|
-
// need to be called after layer data is calculated
|
|
2538
|
-
updatedState = updateAnimationDomain(updatedState);
|
|
2539
|
-
|
|
2540
|
-
// try to process layerMergers after dataset+datasetMergers
|
|
2541
|
-
updatedState = layerMergers && layerMergers.length > 0 ? applyMergersUpdater(updatedState, {
|
|
2542
|
-
mergers: layerMergers,
|
|
2543
|
-
postMergerPayload: _objectSpread(_objectSpread({}, postMergerPayload), {}, {
|
|
2544
|
-
layerMergers: []
|
|
2545
|
-
})
|
|
2546
|
-
}) : updatedState;
|
|
2547
|
-
|
|
2548
|
-
// center the map once the dataset is created
|
|
2549
|
-
if (newLayers.length && (options || {}).centerMap) {
|
|
2550
|
-
var bounds = (0, _dataUtils.findMapBounds)(newLayers);
|
|
2551
|
-
if (bounds) {
|
|
2552
|
-
var fitBoundsTask = ACTION_TASK_FIT_BOUNDS().map(function () {
|
|
2553
|
-
return (0, _actions.fitBounds)(bounds);
|
|
2554
|
-
});
|
|
2555
|
-
updatedState = (0, _tasks.withTask)(updatedState, fitBoundsTask);
|
|
2556
|
-
}
|
|
2557
|
-
}
|
|
2558
|
-
|
|
2559
|
-
// need to center map here if we have new layers
|
|
2560
|
-
return updatedState;
|
|
2561
|
-
}
|
|
2562
|
-
|
|
2563
|
-
/**
|
|
2564
|
-
* Rename an existing dataset in `visState`
|
|
2565
|
-
* @memberof visStateUpdaters
|
|
2566
|
-
* @public
|
|
2567
|
-
*/
|
|
2568
|
-
function renameDatasetUpdater(state, action) {
|
|
2569
|
-
return updateDatasetPropsUpdater(state, {
|
|
2570
|
-
dataId: action.dataId,
|
|
2571
|
-
props: {
|
|
2572
|
-
label: action.label
|
|
2573
|
-
}
|
|
2574
|
-
});
|
|
2575
|
-
}
|
|
2576
|
-
var ALLOWED_UPDATE_DATASET_PROPS = ['label', 'color', 'metadata'];
|
|
2577
|
-
|
|
2578
|
-
/**
|
|
2579
|
-
* Validates properties before updating the dataset.
|
|
2580
|
-
* Makes sure each property is in the allowed list
|
|
2581
|
-
* Makes sure color value is RGB
|
|
2582
|
-
* Performs deep merge when updating metadata
|
|
2583
|
-
*/
|
|
2584
|
-
var validateDatasetUpdateProps = function validateDatasetUpdateProps(props, dataset) {
|
|
2585
|
-
var validatedProps = Object.entries(props).reduce(function (acc, entry) {
|
|
2586
|
-
var _entry = (0, _slicedToArray2["default"])(entry, 2),
|
|
2587
|
-
key = _entry[0],
|
|
2588
|
-
value = _entry[1];
|
|
2589
|
-
// is it allowed ?
|
|
2590
|
-
if (!ALLOWED_UPDATE_DATASET_PROPS.includes(key)) {
|
|
2591
|
-
return acc;
|
|
2592
|
-
}
|
|
2593
|
-
|
|
2594
|
-
// if we are adding a color but it is not RGB we don't accept the value
|
|
2595
|
-
// in the future as we add more props we should change this if into a switch
|
|
2596
|
-
if (key === 'color' && !(0, _utils.isRgbColor)(value)) {
|
|
2597
|
-
return acc;
|
|
2598
|
-
}
|
|
2599
|
-
|
|
2600
|
-
// do we need deep merge ?
|
|
2601
|
-
return _objectSpread(_objectSpread({}, acc), {}, (0, _defineProperty2["default"])({}, key, (0, _utils.isPlainObject)(value) ? (0, _deepmerge["default"])(dataset[key] || {}, value) : value));
|
|
2602
|
-
}, {});
|
|
2603
|
-
return validatedProps;
|
|
2604
|
-
};
|
|
2605
|
-
|
|
2606
|
-
/**
|
|
2607
|
-
* Update Dataset props (label, color, meta). Do not use to update data or any related properties
|
|
2608
|
-
* @memberof visStateUpdaters
|
|
2609
|
-
* @public
|
|
2610
|
-
*/
|
|
2611
|
-
function updateDatasetPropsUpdater(state, action) {
|
|
2612
|
-
var dataId = action.dataId,
|
|
2613
|
-
props = action.props;
|
|
2614
|
-
var datasets = state.datasets;
|
|
2615
|
-
var existing = datasets[dataId];
|
|
2616
|
-
if (existing) {
|
|
2617
|
-
var validatedProps = validateDatasetUpdateProps(props, existing);
|
|
2618
|
-
// validate props: just color for now
|
|
2619
|
-
// we only allow label, color and meta to be updated
|
|
2620
|
-
// const newTable = copyTableAndUpdate(existing, validatedProps);
|
|
2621
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2622
|
-
datasets: _objectSpread(_objectSpread({}, datasets), {}, (0, _defineProperty2["default"])({}, dataId, (0, _table.copyTableAndUpdate)(existing, validatedProps)))
|
|
2623
|
-
});
|
|
2624
|
-
}
|
|
2625
|
-
return state;
|
|
2626
|
-
}
|
|
2627
|
-
|
|
2628
|
-
/**
|
|
2629
|
-
* When a user clicks on the specific map closing icon
|
|
2630
|
-
* the application will close the selected map
|
|
2631
|
-
* and will merge the remaining one with the global state
|
|
2632
|
-
* TODO: i think in the future this action should be called merge map layers with global settings
|
|
2633
|
-
* @param {Object} state `visState`
|
|
2634
|
-
* @param {Object} action action
|
|
2635
|
-
* @returns {Object} nextState
|
|
2636
|
-
*/
|
|
2637
|
-
function closeSpecificMapAtIndex(state, action) {
|
|
2638
|
-
var _state$splitMaps$inde;
|
|
2639
|
-
// retrieve layers meta data from the remaining map that we need to keep
|
|
2640
|
-
var indexToRetrieve = 1 - action.payload;
|
|
2641
|
-
var mapLayers = (_state$splitMaps$inde = state.splitMaps[indexToRetrieve]) === null || _state$splitMaps$inde === void 0 ? void 0 : _state$splitMaps$inde.layers;
|
|
2642
|
-
var layers = state.layers;
|
|
2643
|
-
|
|
2644
|
-
// update layer visibility
|
|
2645
|
-
var newLayers = layers.map(function (layer) {
|
|
2646
|
-
return mapLayers && !mapLayers[layer.id] && layer.config.isVisible ? layer.updateLayerConfig({
|
|
2647
|
-
// if layer.id is not in mapLayers, it should be inVisible
|
|
2648
|
-
isVisible: false
|
|
2649
|
-
}) : layer;
|
|
2650
|
-
});
|
|
2651
|
-
|
|
2652
|
-
// delete map
|
|
2653
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2654
|
-
layers: newLayers,
|
|
2655
|
-
splitMaps: []
|
|
2656
|
-
});
|
|
2657
|
-
}
|
|
2658
|
-
|
|
2659
|
-
/**
|
|
2660
|
-
* Trigger file loading dispatch `addDataToMap` if succeed, or `loadFilesErr` if failed
|
|
2661
|
-
* @memberof visStateUpdaters
|
|
2662
|
-
* @public
|
|
2663
|
-
*/
|
|
2664
|
-
var loadFilesUpdater = exports.loadFilesUpdater = function loadFilesUpdater(state, action) {
|
|
2665
|
-
var files = action.files,
|
|
2666
|
-
_action$onFinish = action.onFinish,
|
|
2667
|
-
onFinish = _action$onFinish === void 0 ? _actions.loadFilesSuccess : _action$onFinish;
|
|
2668
|
-
if (!files.length) {
|
|
2669
|
-
return state;
|
|
2670
|
-
}
|
|
2671
|
-
var fileLoadingProgress = Array.from(files).reduce(function (accu, f, i) {
|
|
2672
|
-
return (0, _composerHelpers.merge_)(initialFileLoadingProgress(f, i))(accu);
|
|
2673
|
-
}, {});
|
|
2674
|
-
var fileLoading = {
|
|
2675
|
-
fileCache: [],
|
|
2676
|
-
filesToLoad: files,
|
|
2677
|
-
onFinish: onFinish
|
|
2678
|
-
};
|
|
2679
|
-
var nextState = (0, _composerHelpers.merge_)({
|
|
2680
|
-
fileLoadingProgress: fileLoadingProgress,
|
|
2681
|
-
fileLoading: fileLoading
|
|
2682
|
-
})(state);
|
|
2683
|
-
return loadNextFileUpdater(nextState);
|
|
2684
|
-
};
|
|
2685
|
-
|
|
2686
|
-
/**
|
|
2687
|
-
* Sucessfully loaded one file, move on to the next one
|
|
2688
|
-
* @memberof visStateUpdaters
|
|
2689
|
-
* @public
|
|
2690
|
-
*/
|
|
2691
|
-
function loadFileStepSuccessUpdater(state, action) {
|
|
2692
|
-
if (!state.fileLoading) {
|
|
2693
|
-
return state;
|
|
2694
|
-
}
|
|
2695
|
-
var fileName = action.fileName,
|
|
2696
|
-
fileCache = action.fileCache;
|
|
2697
|
-
var _state$fileLoading = state.fileLoading,
|
|
2698
|
-
filesToLoad = _state$fileLoading.filesToLoad,
|
|
2699
|
-
onFinish = _state$fileLoading.onFinish;
|
|
2700
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2701
|
-
fileName: fileName,
|
|
2702
|
-
progress: {
|
|
2703
|
-
percent: 1,
|
|
2704
|
-
message: 'Done'
|
|
2705
|
-
}
|
|
2706
|
-
});
|
|
2707
|
-
|
|
2708
|
-
// save processed file to fileCache
|
|
2709
|
-
var stateWithCache = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2710
|
-
fileCache: fileCache
|
|
2711
|
-
}))(stateWithProgress);
|
|
2712
|
-
return (0, _tasks.withTask)(stateWithCache, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2713
|
-
return onFinish(fileCache);
|
|
2714
|
-
}));
|
|
2715
|
-
}
|
|
2716
|
-
|
|
2717
|
-
// withTask<T>(state: T, task: any): T
|
|
2718
|
-
|
|
2719
|
-
/**
|
|
2720
|
-
*
|
|
2721
|
-
* @memberof visStateUpdaters
|
|
2722
|
-
* @public
|
|
2723
|
-
*/
|
|
2724
|
-
function loadNextFileUpdater(state) {
|
|
2725
|
-
if (!state.fileLoading) {
|
|
2726
|
-
return state;
|
|
2727
|
-
}
|
|
2728
|
-
var filesToLoad = state.fileLoading.filesToLoad;
|
|
2729
|
-
var _filesToLoad = (0, _toArray2["default"])(filesToLoad),
|
|
2730
|
-
file = _filesToLoad[0],
|
|
2731
|
-
remainingFilesToLoad = _filesToLoad.slice(1);
|
|
2732
|
-
|
|
2733
|
-
// save filesToLoad to state
|
|
2734
|
-
var nextState = (0, _composerHelpers.pick_)('fileLoading')((0, _composerHelpers.merge_)({
|
|
2735
|
-
filesToLoad: remainingFilesToLoad
|
|
2736
|
-
}))(state);
|
|
2737
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(nextState, {
|
|
2738
|
-
fileName: file.name,
|
|
2739
|
-
progress: {
|
|
2740
|
-
percent: 0,
|
|
2741
|
-
message: 'loading...'
|
|
2742
|
-
}
|
|
2743
|
-
});
|
|
2744
|
-
var loaders = state.loaders,
|
|
2745
|
-
loadOptions = state.loadOptions;
|
|
2746
|
-
return (0, _tasks.withTask)(stateWithProgress, makeLoadFileTask(file, nextState.fileLoading && nextState.fileLoading.fileCache, loaders, loadOptions));
|
|
2747
|
-
}
|
|
2748
|
-
function makeLoadFileTask(file, fileCache) {
|
|
2749
|
-
var loaders = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
|
|
2750
|
-
var loadOptions = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
|
|
2751
|
-
return (0, _tasks2.LOAD_FILE_TASK)({
|
|
2752
|
-
file: file,
|
|
2753
|
-
fileCache: fileCache,
|
|
2754
|
-
loaders: loaders,
|
|
2755
|
-
loadOptions: loadOptions
|
|
2756
|
-
}).bimap(
|
|
2757
|
-
// prettier ignore
|
|
2758
|
-
// success
|
|
2759
|
-
function (gen) {
|
|
2760
|
-
return (0, _actions.nextFileBatch)({
|
|
2761
|
-
gen: gen,
|
|
2762
|
-
fileName: file.name,
|
|
2763
|
-
onFinish: function onFinish(result) {
|
|
2764
|
-
return (0, _actions.processFileContent)({
|
|
2765
|
-
content: result,
|
|
2766
|
-
fileCache: fileCache
|
|
2767
|
-
});
|
|
2768
|
-
}
|
|
2769
|
-
});
|
|
2770
|
-
},
|
|
2771
|
-
// error
|
|
2772
|
-
function (err) {
|
|
2773
|
-
return (0, _actions.loadFilesErr)(file.name, err);
|
|
2774
|
-
});
|
|
2775
|
-
}
|
|
2776
|
-
|
|
2777
|
-
/**
|
|
2778
|
-
*
|
|
2779
|
-
* @memberof visStateUpdaters
|
|
2780
|
-
* @public
|
|
2781
|
-
*/
|
|
2782
|
-
function processFileContentUpdater(state, action) {
|
|
2783
|
-
var _action$payload2 = action.payload,
|
|
2784
|
-
content = _action$payload2.content,
|
|
2785
|
-
fileCache = _action$payload2.fileCache;
|
|
2786
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2787
|
-
fileName: content.fileName,
|
|
2788
|
-
progress: {
|
|
2789
|
-
percent: 1,
|
|
2790
|
-
message: 'processing...'
|
|
2791
|
-
}
|
|
2792
|
-
});
|
|
2793
|
-
return (0, _tasks.withTask)(stateWithProgress, (0, _tasks2.PROCESS_FILE_DATA)({
|
|
2794
|
-
content: content,
|
|
2795
|
-
fileCache: fileCache
|
|
2796
|
-
}).bimap(function (result) {
|
|
2797
|
-
return (0, _actions.loadFileStepSuccess)({
|
|
2798
|
-
fileName: content.fileName,
|
|
2799
|
-
fileCache: result
|
|
2800
|
-
});
|
|
2801
|
-
}, function (err) {
|
|
2802
|
-
return (0, _actions.loadFilesErr)(content.fileName, err);
|
|
2803
|
-
}));
|
|
2804
|
-
}
|
|
2805
|
-
|
|
2806
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
2807
|
-
function parseProgress() {
|
|
2808
|
-
var prevProgress = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
|
2809
|
-
var progress = arguments.length > 1 ? arguments[1] : undefined;
|
|
2810
|
-
// This happens when receiving query metadata or other cases we don't
|
|
2811
|
-
// have an update for the user.
|
|
2812
|
-
if (!progress || !progress.percent) {
|
|
2813
|
-
return {};
|
|
2814
|
-
}
|
|
2815
|
-
return {
|
|
2816
|
-
percent: progress.percent
|
|
2817
|
-
};
|
|
2818
|
-
}
|
|
2819
|
-
|
|
2820
|
-
/**
|
|
2821
|
-
* gets called with payload = AsyncGenerator<???>
|
|
2822
|
-
* @memberof visStateUpdaters
|
|
2823
|
-
* @public
|
|
2824
|
-
*/
|
|
2825
|
-
var nextFileBatchUpdater = exports.nextFileBatchUpdater = function nextFileBatchUpdater(state, _ref24) {
|
|
2826
|
-
var _accumulated$data;
|
|
2827
|
-
var _ref24$payload = _ref24.payload,
|
|
2828
|
-
gen = _ref24$payload.gen,
|
|
2829
|
-
fileName = _ref24$payload.fileName,
|
|
2830
|
-
progress = _ref24$payload.progress,
|
|
2831
|
-
accumulated = _ref24$payload.accumulated,
|
|
2832
|
-
onFinish = _ref24$payload.onFinish;
|
|
2833
|
-
var stateWithProgress = updateFileLoadingProgressUpdater(state, {
|
|
2834
|
-
fileName: fileName,
|
|
2835
|
-
progress: parseProgress(state.fileLoadingProgress[fileName], progress)
|
|
2836
|
-
});
|
|
2837
|
-
return (0, _tasks.withTask)(stateWithProgress, [].concat((0, _toConsumableArray2["default"])((0, _utils.getApplicationConfig)().useArrowProgressiveLoading && fileName.endsWith('arrow') && (accumulated === null || accumulated === void 0 || (_accumulated$data = accumulated.data) === null || _accumulated$data === void 0 ? void 0 : _accumulated$data.length) > 0 ? [(0, _tasks2.PROCESS_FILE_DATA)({
|
|
2838
|
-
content: accumulated,
|
|
2839
|
-
fileCache: []
|
|
2840
|
-
}).bimap(function (result) {
|
|
2841
|
-
return (0, _actions.loadFilesSuccess)(result);
|
|
2842
|
-
}, function (err) {
|
|
2843
|
-
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2844
|
-
})] : []), [(0, _tasks2.UNWRAP_TASK)(gen.next()).bimap(function (_ref25) {
|
|
2845
|
-
var value = _ref25.value,
|
|
2846
|
-
done = _ref25.done;
|
|
2847
|
-
return done ? onFinish(accumulated) : (0, _actions.nextFileBatch)({
|
|
2848
|
-
gen: gen,
|
|
2849
|
-
fileName: fileName,
|
|
2850
|
-
progress: value.progress,
|
|
2851
|
-
accumulated: value,
|
|
2852
|
-
onFinish: onFinish
|
|
2853
|
-
});
|
|
2854
|
-
}, function (err) {
|
|
2855
|
-
return (0, _actions.loadFilesErr)(fileName, err);
|
|
2856
|
-
})]));
|
|
2857
|
-
};
|
|
2858
|
-
|
|
2859
|
-
/**
|
|
2860
|
-
* Trigger loading file error
|
|
2861
|
-
* @memberof visStateUpdaters
|
|
2862
|
-
* @public
|
|
2863
|
-
*/
|
|
2864
|
-
var loadFilesErrUpdater = exports.loadFilesErrUpdater = function loadFilesErrUpdater(state, _ref26) {
|
|
2865
|
-
var error = _ref26.error,
|
|
2866
|
-
fileName = _ref26.fileName;
|
|
2867
|
-
// update ui with error message
|
|
2868
|
-
_window.console.warn(error);
|
|
2869
|
-
if (!state.fileLoading) {
|
|
2870
|
-
return state;
|
|
2871
|
-
}
|
|
2872
|
-
var _state$fileLoading2 = state.fileLoading,
|
|
2873
|
-
filesToLoad = _state$fileLoading2.filesToLoad,
|
|
2874
|
-
onFinish = _state$fileLoading2.onFinish,
|
|
2875
|
-
fileCache = _state$fileLoading2.fileCache;
|
|
2876
|
-
var nextState = updateFileLoadingProgressUpdater(state, {
|
|
2877
|
-
fileName: fileName,
|
|
2878
|
-
progress: {
|
|
2879
|
-
error: error
|
|
2880
|
-
}
|
|
2881
|
-
});
|
|
2882
|
-
|
|
2883
|
-
// kick off next file or finish
|
|
2884
|
-
return (0, _tasks.withTask)(nextState, (0, _tasks2.DELAY_TASK)(200).map(filesToLoad.length ? _actions.loadNextFile : function () {
|
|
2885
|
-
return onFinish(fileCache);
|
|
2886
|
-
}));
|
|
2887
|
-
};
|
|
2888
|
-
|
|
2889
|
-
/**
|
|
2890
|
-
* When select dataset for export, apply cpu filter to selected dataset
|
|
2891
|
-
* @memberof visStateUpdaters
|
|
2892
|
-
* @public
|
|
2893
|
-
*/
|
|
2894
|
-
var applyCPUFilterUpdater = exports.applyCPUFilterUpdater = function applyCPUFilterUpdater(state, _ref27) {
|
|
2895
|
-
var dataId = _ref27.dataId;
|
|
2896
|
-
// apply cpuFilter
|
|
2897
|
-
var dataIds = (0, _commonUtils.toArray)(dataId);
|
|
2898
|
-
return dataIds.reduce(function (accu, id) {
|
|
2899
|
-
return (0, _utils.filterDatasetCPU)(accu, id);
|
|
2900
|
-
}, state);
|
|
2901
|
-
};
|
|
2902
|
-
|
|
2903
|
-
/**
|
|
2904
|
-
* User input to update the info of the map
|
|
2905
|
-
* @memberof visStateUpdaters
|
|
2906
|
-
* @public
|
|
2907
|
-
*/
|
|
2908
|
-
var setMapInfoUpdater = exports.setMapInfoUpdater = function setMapInfoUpdater(state, action) {
|
|
2909
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2910
|
-
mapInfo: _objectSpread(_objectSpread({}, state.mapInfo), action.info)
|
|
2911
|
-
});
|
|
2912
|
-
};
|
|
2913
|
-
/**
|
|
2914
|
-
* Helper function to update All layer domain and layer data of state
|
|
2915
|
-
*/
|
|
2916
|
-
function addDefaultLayers(state, datasets) {
|
|
2917
|
-
var empty = [];
|
|
2918
|
-
var defaultLayers = Object.values(datasets).reduce(function (accu, dataset) {
|
|
2919
|
-
var foundLayers = (0, _layerUtils.findDefaultLayer)(dataset, state.layerClasses);
|
|
2920
|
-
return foundLayers && foundLayers.length ? accu.concat(foundLayers) : accu;
|
|
2921
|
-
}, empty);
|
|
2922
|
-
return {
|
|
2923
|
-
state: _objectSpread(_objectSpread({}, state), {}, {
|
|
2924
|
-
layers: [].concat((0, _toConsumableArray2["default"])(state.layers), (0, _toConsumableArray2["default"])(defaultLayers)),
|
|
2925
|
-
layerOrder: [].concat((0, _toConsumableArray2["default"])((0, _layerUtils.getLayerOrderFromLayers)(defaultLayers)), (0, _toConsumableArray2["default"])(state.layerOrder))
|
|
2926
|
-
}),
|
|
2927
|
-
newLayers: defaultLayers
|
|
2928
|
-
};
|
|
2929
|
-
}
|
|
2930
|
-
|
|
2931
|
-
/**
|
|
2932
|
-
* helper function to find default tooltips
|
|
2933
|
-
* @param {Object} state
|
|
2934
|
-
* @param {Object} dataset
|
|
2935
|
-
* @returns {Object} nextState
|
|
2936
|
-
*/
|
|
2937
|
-
function addDefaultTooltips(state, dataset) {
|
|
2938
|
-
var tooltipFields = (0, _interactionUtils.findFieldsToShow)(_objectSpread(_objectSpread({}, dataset), {}, {
|
|
2939
|
-
maxDefaultTooltips: state.maxDefaultTooltips
|
|
2940
|
-
}));
|
|
2941
|
-
var merged = _objectSpread(_objectSpread({}, state.interactionConfig.tooltip.config.fieldsToShow), tooltipFields);
|
|
2942
|
-
return (0, _utils.set)(['interactionConfig', 'tooltip', 'config', 'fieldsToShow'], merged, state);
|
|
2943
|
-
}
|
|
2944
|
-
function initialFileLoadingProgress(file, index) {
|
|
2945
|
-
var fileName = file.name || "Untitled File ".concat(index);
|
|
2946
|
-
return (0, _defineProperty2["default"])({}, fileName, {
|
|
2947
|
-
// percent of current file
|
|
2948
|
-
percent: 0,
|
|
2949
|
-
message: '',
|
|
2950
|
-
fileName: fileName,
|
|
2951
|
-
error: null
|
|
2952
|
-
});
|
|
2953
|
-
}
|
|
2954
|
-
function updateFileLoadingProgressUpdater(state, _ref29) {
|
|
2955
|
-
var fileName = _ref29.fileName,
|
|
2956
|
-
progress = _ref29.progress;
|
|
2957
|
-
// @ts-expect-error
|
|
2958
|
-
return (0, _composerHelpers.pick_)('fileLoadingProgress')((0, _composerHelpers.pick_)(fileName)((0, _composerHelpers.merge_)(progress)))(state);
|
|
2959
|
-
}
|
|
2960
|
-
/**
|
|
2961
|
-
* Helper function to update layer domains for an array of datasets
|
|
2962
|
-
*/
|
|
2963
|
-
function updateAllLayerDomainData(state, dataId, updatedFilter) {
|
|
2964
|
-
var dataIds = typeof dataId === 'string' ? [dataId] : dataId;
|
|
2965
|
-
var newLayers = [];
|
|
2966
|
-
var newLayerData = [];
|
|
2967
|
-
state.layers.forEach(function (oldLayer, i) {
|
|
2968
|
-
if (oldLayer.config.dataId && dataIds.includes(oldLayer.config.dataId)) {
|
|
2969
|
-
// No need to recalculate layer domain if filter has fixed domain
|
|
2970
|
-
var newLayer = updatedFilter && updatedFilter.fixedDomain ? oldLayer : oldLayer.updateLayerDomain(state.datasets, updatedFilter);
|
|
2971
|
-
var _calculateLayerData7 = (0, _layerUtils.calculateLayerData)(newLayer, state, state.layerData[i]),
|
|
2972
|
-
layerData = _calculateLayerData7.layerData,
|
|
2973
|
-
layer = _calculateLayerData7.layer;
|
|
2974
|
-
newLayers.push(layer);
|
|
2975
|
-
newLayerData.push(layerData);
|
|
2976
|
-
} else {
|
|
2977
|
-
newLayers.push(oldLayer);
|
|
2978
|
-
newLayerData.push(state.layerData[i]);
|
|
2979
|
-
}
|
|
2980
|
-
});
|
|
2981
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
2982
|
-
layers: newLayers,
|
|
2983
|
-
layerData: newLayerData
|
|
2984
|
-
});
|
|
2985
|
-
return newState;
|
|
2986
|
-
}
|
|
2987
|
-
function updateAnimationDomain(state) {
|
|
2988
|
-
var _state$filters;
|
|
2989
|
-
// merge all animatable layer domain and update global config
|
|
2990
|
-
var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(state.layers);
|
|
2991
|
-
if (!animatableLayers.length) {
|
|
2992
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
2993
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
2994
|
-
domain: null,
|
|
2995
|
-
isAnimating: false,
|
|
2996
|
-
timeSteps: null,
|
|
2997
|
-
defaultTimeFormat: null
|
|
2998
|
-
})
|
|
2999
|
-
});
|
|
3000
|
-
}
|
|
3001
|
-
var layerDomains = animatableLayers.map(function (l) {
|
|
3002
|
-
return l.config.animation.domain || [];
|
|
3003
|
-
});
|
|
3004
|
-
// @ts-ignore
|
|
3005
|
-
var mergedDomain = (0, _utils.mergeTimeDomains)(layerDomains);
|
|
3006
|
-
var defaultTimeFormat = (0, _utils.getTimeWidgetTitleFormatter)(mergedDomain);
|
|
3007
|
-
|
|
3008
|
-
// merge timeSteps
|
|
3009
|
-
var mergedTimeSteps = (0, _uniq["default"])(animatableLayers.reduce(function (accu, layer) {
|
|
3010
|
-
accu.push.apply(accu, (0, _toConsumableArray2["default"])(layer.config.animation.timeSteps || []));
|
|
3011
|
-
return accu;
|
|
3012
|
-
}, [])).sort();
|
|
3013
|
-
mergedTimeSteps = mergedTimeSteps.length ? mergedTimeSteps : null;
|
|
3014
|
-
|
|
3015
|
-
// TODO: better handling of duration calculation
|
|
3016
|
-
var duration = mergedTimeSteps ? _constants.BASE_SPEED * (1000 / _constants.FPS) / mergedTimeSteps.length / (state.animationConfig.speed || 1) : null;
|
|
3017
|
-
var nextState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3018
|
-
animationConfig: _objectSpread(_objectSpread({}, state.animationConfig), {}, {
|
|
3019
|
-
domain: mergedDomain,
|
|
3020
|
-
defaultTimeFormat: defaultTimeFormat,
|
|
3021
|
-
duration: duration,
|
|
3022
|
-
timeSteps: mergedTimeSteps
|
|
3023
|
-
})
|
|
3024
|
-
});
|
|
3025
|
-
|
|
3026
|
-
// reset currentTime based on new domain
|
|
3027
|
-
var syncedFilter = (_state$filters = state.filters) === null || _state$filters === void 0 ? void 0 : _state$filters.find(function (f) {
|
|
3028
|
-
return f.syncedWithLayerTimeline;
|
|
3029
|
-
});
|
|
3030
|
-
|
|
3031
|
-
// if synced filter exist wee need to merge animationConfig and filter domains
|
|
3032
|
-
// and validate the current time against the new merged domain
|
|
3033
|
-
var newAnimationDomain = syncedFilter ? (0, _utils.mergeTimeDomains)([mergedDomain, syncedFilter.domain]) : mergedDomain;
|
|
3034
|
-
var currentTime = (0, _utils.isInRange)(state.animationConfig.currentTime, newAnimationDomain) ? state.animationConfig.currentTime : newAnimationDomain[0];
|
|
3035
|
-
if (currentTime !== state.animationConfig.currentTime) {
|
|
3036
|
-
// if currentTime changed, need to call animationTimeUpdater to re call formatLayerData
|
|
3037
|
-
return setLayerAnimationTimeUpdater(nextState, {
|
|
3038
|
-
value: currentTime
|
|
3039
|
-
});
|
|
3040
|
-
}
|
|
3041
|
-
return nextState;
|
|
3042
|
-
}
|
|
3043
|
-
|
|
3044
|
-
/**
|
|
3045
|
-
* Update the status of the editor
|
|
3046
|
-
* @memberof visStateUpdaters
|
|
3047
|
-
*/
|
|
3048
|
-
var setEditorModeUpdater = exports.setEditorModeUpdater = function setEditorModeUpdater(state, _ref30) {
|
|
3049
|
-
var mode = _ref30.mode;
|
|
3050
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3051
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3052
|
-
mode: mode,
|
|
3053
|
-
selectedFeature: null
|
|
3054
|
-
})
|
|
3055
|
-
});
|
|
3056
|
-
};
|
|
3057
|
-
|
|
3058
|
-
// const featureToFilterValue = (feature) => ({...feature, id: feature.id});
|
|
3059
|
-
/**
|
|
3060
|
-
* Update editor features
|
|
3061
|
-
* @memberof visStateUpdaters
|
|
3062
|
-
*/
|
|
3063
|
-
function setFeaturesUpdater(state, _ref31) {
|
|
3064
|
-
var _lastFeature$properti, _lastFeature$properti2;
|
|
3065
|
-
var _ref31$features = _ref31.features,
|
|
3066
|
-
features = _ref31$features === void 0 ? [] : _ref31$features;
|
|
3067
|
-
var lastFeature = features.length && features[features.length - 1];
|
|
3068
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3069
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3070
|
-
// only save none filter features to editor
|
|
3071
|
-
features: features.filter(function (f) {
|
|
3072
|
-
return !(0, _utils.getFilterIdInFeature)(f);
|
|
3073
|
-
}),
|
|
3074
|
-
mode: lastFeature && (_lastFeature$properti = lastFeature.properties) !== null && _lastFeature$properti !== void 0 && _lastFeature$properti.isClosed ? ((_lastFeature$properti2 = lastFeature.properties) === null || _lastFeature$properti2 === void 0 ? void 0 : _lastFeature$properti2.shape) === 'Rectangle' ? state.editor.mode : _constants.EDITOR_MODES.EDIT : state.editor.mode
|
|
3075
|
-
})
|
|
3076
|
-
});
|
|
3077
|
-
|
|
3078
|
-
// Retrieve existing feature
|
|
3079
|
-
var selectedFeature = state.editor.selectedFeature;
|
|
3080
|
-
|
|
3081
|
-
// If no feature is selected we can simply return since no operations
|
|
3082
|
-
if (!selectedFeature) {
|
|
3083
|
-
return newState;
|
|
3084
|
-
}
|
|
3085
|
-
|
|
3086
|
-
// TODO: check if the feature has changed
|
|
3087
|
-
var feature = features.find(function (f) {
|
|
3088
|
-
return f.id === selectedFeature.id;
|
|
3089
|
-
});
|
|
3090
|
-
|
|
3091
|
-
// if feature is part of a filter
|
|
3092
|
-
var filterId = feature && (0, _utils.getFilterIdInFeature)(feature);
|
|
3093
|
-
if (filterId && feature) {
|
|
3094
|
-
// add bbox for polygon filter to speed up filtering
|
|
3095
|
-
if (feature.properties) feature.properties.bbox = (0, _bbox["default"])(feature);
|
|
3096
|
-
var featureValue = (0, _utils.featureToFilterValue)(feature, filterId);
|
|
3097
|
-
var filterIdx = state.filters.findIndex(function (fil) {
|
|
3098
|
-
return fil.id === filterId;
|
|
3099
|
-
});
|
|
3100
|
-
// @ts-ignore
|
|
3101
|
-
return setFilterUpdater(newState, {
|
|
3102
|
-
idx: filterIdx,
|
|
3103
|
-
prop: 'value',
|
|
3104
|
-
value: featureValue
|
|
3105
|
-
});
|
|
3106
|
-
}
|
|
3107
|
-
return newState;
|
|
3108
|
-
}
|
|
3109
|
-
|
|
3110
|
-
/**
|
|
3111
|
-
* Set the current selected feature
|
|
3112
|
-
* @memberof uiStateUpdaters
|
|
3113
|
-
*/
|
|
3114
|
-
var setSelectedFeatureUpdater = exports.setSelectedFeatureUpdater = function setSelectedFeatureUpdater(state, _ref32) {
|
|
3115
|
-
var feature = _ref32.feature,
|
|
3116
|
-
selectionContext = _ref32.selectionContext;
|
|
3117
|
-
// add bbox for polygon filter to speed up filtering
|
|
3118
|
-
var selectedFeature = feature;
|
|
3119
|
-
if (feature !== null && feature !== void 0 && feature.properties) {
|
|
3120
|
-
selectedFeature = _objectSpread(_objectSpread({}, feature), {}, {
|
|
3121
|
-
properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
|
|
3122
|
-
bbox: (0, _bbox["default"])(feature)
|
|
3123
|
-
})
|
|
3124
|
-
});
|
|
3125
|
-
}
|
|
3126
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3127
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3128
|
-
selectedFeature: selectedFeature,
|
|
3129
|
-
selectionContext: selectionContext
|
|
3130
|
-
})
|
|
3131
|
-
});
|
|
3132
|
-
};
|
|
3133
|
-
|
|
3134
|
-
/**
|
|
3135
|
-
* Delete existing feature from filters
|
|
3136
|
-
* @memberof visStateUpdaters
|
|
3137
|
-
*/
|
|
3138
|
-
function deleteFeatureUpdater(state, _ref33) {
|
|
3139
|
-
var feature = _ref33.feature;
|
|
3140
|
-
if (!feature) {
|
|
3141
|
-
return state;
|
|
3142
|
-
}
|
|
3143
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3144
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3145
|
-
selectedFeature: null
|
|
3146
|
-
})
|
|
3147
|
-
});
|
|
3148
|
-
if ((0, _utils.getFilterIdInFeature)(feature)) {
|
|
3149
|
-
var filterIdx = newState.filters.findIndex(function (f) {
|
|
3150
|
-
return f.id === (0, _utils.getFilterIdInFeature)(feature);
|
|
3151
|
-
});
|
|
3152
|
-
return filterIdx > -1 ? removeFilterUpdater(newState, {
|
|
3153
|
-
idx: filterIdx
|
|
3154
|
-
}) : newState;
|
|
3155
|
-
}
|
|
3156
|
-
|
|
3157
|
-
// modify editor object
|
|
3158
|
-
var newEditor = _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3159
|
-
features: state.editor.features.filter(function (f) {
|
|
3160
|
-
return f.id !== feature.id;
|
|
3161
|
-
}),
|
|
3162
|
-
selectedFeature: null
|
|
3163
|
-
});
|
|
3164
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3165
|
-
editor: newEditor
|
|
3166
|
-
});
|
|
3167
|
-
}
|
|
3168
|
-
|
|
3169
|
-
/**
|
|
3170
|
-
* Toggle feature as layer filter
|
|
3171
|
-
* @memberof visStateUpdaters
|
|
3172
|
-
*/
|
|
3173
|
-
function setPolygonFilterLayerUpdater(state, payload) {
|
|
3174
|
-
var layer = payload.layer,
|
|
3175
|
-
feature = payload.feature;
|
|
3176
|
-
var filterId = (0, _utils.getFilterIdInFeature)(feature);
|
|
3177
|
-
|
|
3178
|
-
// let newFilter = null;
|
|
3179
|
-
var filterIdx;
|
|
3180
|
-
var newLayerId = [layer.id];
|
|
3181
|
-
var newState = state;
|
|
3182
|
-
// If polygon filter already exists, we need to find out if the current layer is already included
|
|
3183
|
-
if (filterId) {
|
|
3184
|
-
filterIdx = state.filters.findIndex(function (f) {
|
|
3185
|
-
return f.id === filterId;
|
|
3186
|
-
});
|
|
3187
|
-
if (!state.filters[filterIdx]) {
|
|
3188
|
-
// what if filter doesn't exist?... not possible.
|
|
3189
|
-
// because features in the editor is passed in from filters and editors.
|
|
3190
|
-
// but we will move this feature back to editor just in case
|
|
3191
|
-
var noneFilterFeature = _objectSpread(_objectSpread({}, feature), {}, {
|
|
3192
|
-
properties: _objectSpread(_objectSpread({}, feature.properties), {}, {
|
|
3193
|
-
filterId: null
|
|
3194
|
-
})
|
|
3195
|
-
});
|
|
3196
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3197
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3198
|
-
features: [].concat((0, _toConsumableArray2["default"])(state.editor.features), [noneFilterFeature]),
|
|
3199
|
-
selectedFeature: noneFilterFeature
|
|
3200
|
-
})
|
|
3201
|
-
});
|
|
3202
|
-
}
|
|
3203
|
-
var filter = state.filters[filterIdx];
|
|
3204
|
-
var _filter$layerId = filter.layerId,
|
|
3205
|
-
layerId = _filter$layerId === void 0 ? [] : _filter$layerId;
|
|
3206
|
-
var isLayerIncluded = layerId.includes(layer.id);
|
|
3207
|
-
newLayerId = isLayerIncluded ?
|
|
3208
|
-
// if layer is included, remove it
|
|
3209
|
-
layerId.filter(function (l) {
|
|
3210
|
-
return l !== layer.id;
|
|
3211
|
-
}) : [].concat((0, _toConsumableArray2["default"])(layerId), [layer.id]);
|
|
3212
|
-
} else {
|
|
3213
|
-
// if we haven't create the polygon filter, create it
|
|
3214
|
-
var newFilter = (0, _utils.generatePolygonFilter)([], feature);
|
|
3215
|
-
filterIdx = state.filters.length;
|
|
3216
|
-
|
|
3217
|
-
// add feature, remove feature from eidtor
|
|
3218
|
-
newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3219
|
-
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
|
|
3220
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3221
|
-
features: state.editor.features.filter(function (f) {
|
|
3222
|
-
return f.id !== feature.id;
|
|
3223
|
-
}),
|
|
3224
|
-
selectedFeature: newFilter.value
|
|
3225
|
-
})
|
|
3226
|
-
});
|
|
3227
|
-
}
|
|
3228
|
-
return setFilterUpdater(newState, {
|
|
3229
|
-
idx: filterIdx,
|
|
3230
|
-
prop: 'layerId',
|
|
3231
|
-
value: newLayerId
|
|
3232
|
-
});
|
|
3233
|
-
}
|
|
3234
|
-
|
|
3235
|
-
/**
|
|
3236
|
-
* Apply polygon filter to all visible layers
|
|
3237
|
-
* @memberof visStateUpdaters
|
|
3238
|
-
*/
|
|
3239
|
-
function setPolygonFilterAllLayersUpdater(state, payload) {
|
|
3240
|
-
var feature = payload.feature;
|
|
3241
|
-
var newFilter = (0, _utils.generatePolygonFilter)([], feature);
|
|
3242
|
-
var filterIdx = state.filters.length;
|
|
3243
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3244
|
-
filters: [].concat((0, _toConsumableArray2["default"])(state.filters), [newFilter]),
|
|
3245
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3246
|
-
features: state.editor.features.filter(function (f) {
|
|
3247
|
-
return f.id !== feature.id;
|
|
3248
|
-
}),
|
|
3249
|
-
selectedFeature: newFilter.value,
|
|
3250
|
-
mode: _constants.EDITOR_MODES.EDIT
|
|
3251
|
-
})
|
|
3252
|
-
});
|
|
3253
|
-
var visibleLayerIds = (0, _get["default"])(payload, 'visibleLayerIds');
|
|
3254
|
-
var allLayerIds = Array.isArray(visibleLayerIds) ? visibleLayerIds : state.layers.filter(function (l) {
|
|
3255
|
-
return l.config.isVisible;
|
|
3256
|
-
}).map(function (l) {
|
|
3257
|
-
return l.id;
|
|
3258
|
-
});
|
|
3259
|
-
return setFilterUpdater(newState, {
|
|
3260
|
-
idx: filterIdx,
|
|
3261
|
-
prop: 'layerId',
|
|
3262
|
-
value: allLayerIds
|
|
3263
|
-
});
|
|
3264
|
-
}
|
|
3265
|
-
|
|
3266
|
-
/**
|
|
3267
|
-
* @memberof visStateUpdaters
|
|
3268
|
-
* @public
|
|
3269
|
-
*/
|
|
3270
|
-
function sortTableColumnUpdater(state, _ref34) {
|
|
3271
|
-
var dataId = _ref34.dataId,
|
|
3272
|
-
column = _ref34.column,
|
|
3273
|
-
mode = _ref34.mode;
|
|
3274
|
-
var dataset = state.datasets[dataId];
|
|
3275
|
-
if (!dataset) {
|
|
3276
|
-
return state;
|
|
3277
|
-
}
|
|
3278
|
-
var sortMode = mode;
|
|
3279
|
-
if (!sortMode) {
|
|
3280
|
-
var currentMode = (0, _get["default"])(dataset, ['sortColumn', column]);
|
|
3281
|
-
// @ts-ignore - should be fixable in a TS file
|
|
3282
|
-
sortMode = currentMode ? Object.keys(_constants.SORT_ORDER).find(function (m) {
|
|
3283
|
-
return m !== currentMode;
|
|
3284
|
-
}) : _constants.SORT_ORDER.ASCENDING;
|
|
3285
|
-
}
|
|
3286
|
-
var sorted = (0, _table.sortDatasetByColumn)(dataset, column, sortMode);
|
|
3287
|
-
return (0, _utils.set)(['datasets', dataId], sorted, state);
|
|
3288
|
-
}
|
|
3289
|
-
|
|
3290
|
-
/**
|
|
3291
|
-
* @memberof visStateUpdaters
|
|
3292
|
-
* @public
|
|
3293
|
-
*/
|
|
3294
|
-
function pinTableColumnUpdater(state, _ref35) {
|
|
3295
|
-
var dataId = _ref35.dataId,
|
|
3296
|
-
column = _ref35.column;
|
|
3297
|
-
var dataset = state.datasets[dataId];
|
|
3298
|
-
if (!dataset) {
|
|
3299
|
-
return state;
|
|
3300
|
-
}
|
|
3301
|
-
var newDataset = (0, _table.pinTableColumns)(dataset, column);
|
|
3302
|
-
return (0, _utils.set)(['datasets', dataId], newDataset, state);
|
|
3303
|
-
}
|
|
3304
|
-
|
|
3305
|
-
/**
|
|
3306
|
-
* Copy column content as strings
|
|
3307
|
-
* @memberof visStateUpdaters
|
|
3308
|
-
* @public
|
|
3309
|
-
*/
|
|
3310
|
-
function copyTableColumnUpdater(state, _ref36) {
|
|
3311
|
-
var dataId = _ref36.dataId,
|
|
3312
|
-
column = _ref36.column;
|
|
3313
|
-
var dataset = state.datasets[dataId];
|
|
3314
|
-
if (!dataset) {
|
|
3315
|
-
return state;
|
|
3316
|
-
}
|
|
3317
|
-
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
3318
|
-
return f.name === column;
|
|
3319
|
-
});
|
|
3320
|
-
if (fieldIdx < 0) {
|
|
3321
|
-
return state;
|
|
3322
|
-
}
|
|
3323
|
-
var type = dataset.fields[fieldIdx].type;
|
|
3324
|
-
var text = dataset.dataContainer.map(function (row) {
|
|
3325
|
-
return (0, _utils.parseFieldValue)(row.valueAt(fieldIdx), type);
|
|
3326
|
-
}, true).join('\n');
|
|
3327
|
-
(0, _copyToClipboard["default"])(text);
|
|
3328
|
-
return state;
|
|
3329
|
-
}
|
|
3330
|
-
|
|
3331
|
-
/**
|
|
3332
|
-
* Set display format from columns from user selection
|
|
3333
|
-
* @memberof visStateUpdaters
|
|
3334
|
-
* @public
|
|
3335
|
-
*/
|
|
3336
|
-
function setColumnDisplayFormatUpdater(state, _ref37) {
|
|
3337
|
-
var dataId = _ref37.dataId,
|
|
3338
|
-
formats = _ref37.formats;
|
|
3339
|
-
var dataset = state.datasets[dataId];
|
|
3340
|
-
if (!dataset) {
|
|
3341
|
-
return state;
|
|
3342
|
-
}
|
|
3343
|
-
var newFields = dataset.fields;
|
|
3344
|
-
Object.keys(formats).forEach(function (column) {
|
|
3345
|
-
var fieldIdx = dataset.fields.findIndex(function (f) {
|
|
3346
|
-
return f.name === column;
|
|
3347
|
-
});
|
|
3348
|
-
if (fieldIdx >= 0) {
|
|
3349
|
-
var displayFormat = formats[column];
|
|
3350
|
-
var field = newFields[fieldIdx];
|
|
3351
|
-
newFields = (0, _composerHelpers.swap_)((0, _composerHelpers.merge_)({
|
|
3352
|
-
displayFormat: displayFormat
|
|
3353
|
-
})(field))(newFields);
|
|
3354
|
-
}
|
|
3355
|
-
});
|
|
3356
|
-
var newDataset = (0, _table.copyTableAndUpdate)(dataset, {
|
|
3357
|
-
fields: newFields
|
|
3358
|
-
});
|
|
3359
|
-
var newState = (0, _composerHelpers.pick_)('datasets')((0, _composerHelpers.merge_)((0, _defineProperty2["default"])({}, dataId, newDataset)))(state);
|
|
3360
|
-
|
|
3361
|
-
// update colorField displayFormat
|
|
3362
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3363
|
-
layers: newState.layers.map(function (layer) {
|
|
3364
|
-
var _layer$config;
|
|
3365
|
-
return (_layer$config = layer.config) !== null && _layer$config !== void 0 && (_layer$config = _layer$config.colorField) !== null && _layer$config !== void 0 && _layer$config.name && layer.config.colorField.name in formats ? layer.updateLayerConfig({
|
|
3366
|
-
colorField: _objectSpread(_objectSpread({}, layer.config.colorField), {}, {
|
|
3367
|
-
displayFormat: formats[layer.config.colorField.name]
|
|
3368
|
-
})
|
|
3369
|
-
}) : layer;
|
|
3370
|
-
})
|
|
3371
|
-
});
|
|
3372
|
-
return newState;
|
|
3373
|
-
}
|
|
3374
|
-
|
|
3375
|
-
/**
|
|
3376
|
-
* Update editor
|
|
3377
|
-
*/
|
|
3378
|
-
function toggleEditorVisibilityUpdater(state,
|
|
3379
|
-
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
3380
|
-
action) {
|
|
3381
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3382
|
-
editor: _objectSpread(_objectSpread({}, state.editor), {}, {
|
|
3383
|
-
visible: !state.editor.visible
|
|
3384
|
-
})
|
|
3385
|
-
});
|
|
3386
|
-
}
|
|
3387
|
-
function setFilterAnimationTimeConfigUpdater(state, _ref38) {
|
|
3388
|
-
var idx = _ref38.idx,
|
|
3389
|
-
config = _ref38.config;
|
|
3390
|
-
var oldFilter = state.filters[idx];
|
|
3391
|
-
if (!oldFilter) {
|
|
3392
|
-
_window.console.error("filters.".concat(idx, " is undefined"));
|
|
3393
|
-
return state;
|
|
3394
|
-
}
|
|
3395
|
-
if (oldFilter.type !== _constants.FILTER_TYPES.timeRange) {
|
|
3396
|
-
_window.console.error("setFilterAnimationTimeConfig can only be called to update a time filter. check filter.type === 'timeRange'");
|
|
3397
|
-
return state;
|
|
3398
|
-
}
|
|
3399
|
-
var updates = checkTimeConfigArgs(config);
|
|
3400
|
-
return (0, _composerHelpers.pick_)('filters')((0, _composerHelpers.swap_)((0, _composerHelpers.merge_)(updates)(oldFilter)))(state);
|
|
3401
|
-
}
|
|
3402
|
-
function checkTimeConfigArgs(config) {
|
|
3403
|
-
var allowed = ['timeFormat', 'timezone'];
|
|
3404
|
-
return Object.keys(config).reduce(function (accu, prop) {
|
|
3405
|
-
if (!allowed.includes(prop)) {
|
|
3406
|
-
_window.console.error("setLayerAnimationTimeConfig takes timeFormat and/or timezone as options, found ".concat(prop));
|
|
3407
|
-
return accu;
|
|
3408
|
-
}
|
|
3409
|
-
|
|
3410
|
-
// here we are NOT checking if timezone or timeFormat input is valid
|
|
3411
|
-
accu[prop] = config[prop];
|
|
3412
|
-
return accu;
|
|
3413
|
-
}, {});
|
|
3414
|
-
}
|
|
3415
|
-
|
|
3416
|
-
/**
|
|
3417
|
-
* Update editor
|
|
3418
|
-
*/
|
|
3419
|
-
function setLayerAnimationTimeConfigUpdater(state, _ref39) {
|
|
3420
|
-
var config = _ref39.config;
|
|
3421
|
-
if (!config) {
|
|
3422
|
-
return state;
|
|
3423
|
-
}
|
|
3424
|
-
var updates = checkTimeConfigArgs(config);
|
|
3425
|
-
return (0, _composerHelpers.pick_)('animationConfig')((0, _composerHelpers.merge_)(updates))(state);
|
|
3426
|
-
}
|
|
3427
|
-
|
|
3428
|
-
/**
|
|
3429
|
-
* Update editor
|
|
3430
|
-
*/
|
|
3431
|
-
function layerFilteredItemsChangeUpdater(state, action) {
|
|
3432
|
-
var _layer$filteredItemCo;
|
|
3433
|
-
var event = action.event,
|
|
3434
|
-
layer = action.layer;
|
|
3435
|
-
var deckglLayerId = event.id,
|
|
3436
|
-
count = event.count;
|
|
3437
|
-
if (!layer) {
|
|
3438
|
-
_window.console.warn("layerFilteredItems layer doesnt exists");
|
|
3439
|
-
return state;
|
|
3440
|
-
}
|
|
3441
|
-
if (((_layer$filteredItemCo = layer.filteredItemCount) === null || _layer$filteredItemCo === void 0 ? void 0 : _layer$filteredItemCo[deckglLayerId]) === count) {
|
|
3442
|
-
return state;
|
|
3443
|
-
}
|
|
3444
|
-
layer.filteredItemCount = _objectSpread(_objectSpread({}, layer.filteredItemCount), {}, (0, _defineProperty2["default"])({}, deckglLayerId, count));
|
|
3445
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3446
|
-
layers: (0, _composerHelpers.swap_)(layer)(state.layers)
|
|
3447
|
-
});
|
|
3448
|
-
}
|
|
3449
|
-
|
|
3450
|
-
/**
|
|
3451
|
-
* Update WMS feature info and pin tooltip
|
|
3452
|
-
*/
|
|
3453
|
-
function wmsFeatureInfoUpdater(state, action) {
|
|
3454
|
-
var layer = action.layer,
|
|
3455
|
-
featureInfo = action.featureInfo,
|
|
3456
|
-
coordinate = action.coordinate;
|
|
3457
|
-
if (!layer) {
|
|
3458
|
-
console.warn("WMS feature info layer doesn't exist");
|
|
3459
|
-
return state;
|
|
3460
|
-
}
|
|
3461
|
-
|
|
3462
|
-
// Create a clicked object similar to layerClickUpdater to pin the tooltip
|
|
3463
|
-
var clicked = featureInfo ? {
|
|
3464
|
-
picked: true,
|
|
3465
|
-
object: {
|
|
3466
|
-
wmsFeatureInfo: featureInfo
|
|
3467
|
-
},
|
|
3468
|
-
coordinate: coordinate || [0, 0],
|
|
3469
|
-
layer: {
|
|
3470
|
-
props: {
|
|
3471
|
-
idx: state.layers.findIndex(function (l) {
|
|
3472
|
-
return l.id === layer.id;
|
|
3473
|
-
}),
|
|
3474
|
-
id: layer.id
|
|
3475
|
-
}
|
|
3476
|
-
}
|
|
3477
|
-
} : null;
|
|
3478
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3479
|
-
clicked: clicked
|
|
3480
|
-
});
|
|
3481
|
-
}
|
|
3482
|
-
|
|
3483
|
-
// eslint-disable-next-line max-statements
|
|
3484
|
-
function syncTimeFilterWithLayerTimelineUpdater(state, action) {
|
|
3485
|
-
var _newState$animationCo, _newState$animationCo2;
|
|
3486
|
-
var filterIdx = action.idx,
|
|
3487
|
-
_action$enable = action.enable,
|
|
3488
|
-
enable = _action$enable === void 0 ? false : _action$enable;
|
|
3489
|
-
var filter = state.filters[filterIdx];
|
|
3490
|
-
var newState = state;
|
|
3491
|
-
var newFilter = filter;
|
|
3492
|
-
|
|
3493
|
-
// if we enable sync we are going to merge filter and animationConfig domains and store into filter.domain
|
|
3494
|
-
if (enable) {
|
|
3495
|
-
var animatableLayers = (0, _utils.getAnimatableVisibleLayers)(newState.layers);
|
|
3496
|
-
// if no animatableLayers are present we simply return
|
|
3497
|
-
if (!animatableLayers.length) {
|
|
3498
|
-
return newState;
|
|
3499
|
-
}
|
|
3500
|
-
var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(animatableLayers);
|
|
3501
|
-
var hasIntervalBasedAnimationLayer = Boolean(intervalBasedAnimationLayers.length);
|
|
3502
|
-
var newFilterDomain = (0, _utils.mergeTimeDomains)([filter.domain, newState.animationConfig.domain]);
|
|
3503
|
-
|
|
3504
|
-
// we only update animationWindow if we have interval based animation layers with defined intervals and the current filter animation window is not interval
|
|
3505
|
-
if (hasIntervalBasedAnimationLayer) {
|
|
3506
|
-
if (filter.animationWindow !== _constants.ANIMATION_WINDOW.interval) {
|
|
3507
|
-
newState = setFilterAnimationWindowUpdater(newState, {
|
|
3508
|
-
id: filter.id,
|
|
3509
|
-
animationWindow: _constants.ANIMATION_WINDOW.interval
|
|
3510
|
-
});
|
|
3511
|
-
}
|
|
3512
|
-
newFilter = newState.filters[filterIdx];
|
|
3513
|
-
|
|
3514
|
-
// adjust time filter interval
|
|
3515
|
-
newFilter = adjustTimeFilterInterval(newState, newFilter);
|
|
3516
|
-
|
|
3517
|
-
// replace filter in state with newFilter
|
|
3518
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3519
|
-
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3520
|
-
});
|
|
3521
|
-
}
|
|
3522
|
-
newFilter = newState.filters[filterIdx];
|
|
3523
|
-
|
|
3524
|
-
// adjust value based on new domain
|
|
3525
|
-
var _newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.animationWindow === _constants.ANIMATION_WINDOW.interval ? [newFilterDomain[0], newFilterDomain[0]] : newFilterDomain, _objectSpread(_objectSpread({}, newFilter), {}, {
|
|
3526
|
-
domain: newFilterDomain
|
|
3527
|
-
}));
|
|
3528
|
-
newState = setFilterUpdater(newState, {
|
|
3529
|
-
idx: filterIdx,
|
|
3530
|
-
prop: 'value',
|
|
3531
|
-
value: _newFilterValue
|
|
3532
|
-
});
|
|
3533
|
-
newFilter = _objectSpread(_objectSpread({}, newState.filters[filterIdx]), {}, {
|
|
3534
|
-
syncedWithLayerTimeline: true
|
|
3535
|
-
});
|
|
3536
|
-
|
|
3537
|
-
// replace filter in state with newFilter
|
|
3538
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3539
|
-
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3540
|
-
});
|
|
3541
|
-
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3542
|
-
id: newFilter.id,
|
|
3543
|
-
mode: getSyncAnimationMode(newFilter)
|
|
3544
|
-
});
|
|
3545
|
-
newFilter = newState.filters[filterIdx];
|
|
3546
|
-
|
|
3547
|
-
// set the animation config value to match filter value
|
|
3548
|
-
return setLayerAnimationTimeUpdater(newState, {
|
|
3549
|
-
value: newFilter.value[newFilter.syncTimelineMode]
|
|
3550
|
-
});
|
|
3551
|
-
}
|
|
3552
|
-
|
|
3553
|
-
// set domain and step
|
|
3554
|
-
newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
3555
|
-
syncedWithLayerTimeline: false
|
|
3556
|
-
});
|
|
3557
|
-
|
|
3558
|
-
// replace filter in state with newFilter
|
|
3559
|
-
newState = _objectSpread(_objectSpread({}, newState), {}, {
|
|
3560
|
-
filters: (0, _composerHelpers.swap_)(newFilter)(newState.filters)
|
|
3561
|
-
});
|
|
3562
|
-
|
|
3563
|
-
// reset sync timeline mode
|
|
3564
|
-
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3565
|
-
id: newFilter.id,
|
|
3566
|
-
mode: _constants.SYNC_TIMELINE_MODES.end
|
|
3567
|
-
});
|
|
3568
|
-
newFilter = newState.filters[filterIdx];
|
|
3569
|
-
|
|
3570
|
-
// reset filter value
|
|
3571
|
-
var newFilterValue = (0, _utils.adjustValueToFilterDomain)(newFilter.domain, newFilter);
|
|
3572
|
-
newState = setFilterUpdater(newState, {
|
|
3573
|
-
idx: filterIdx,
|
|
3574
|
-
prop: 'value',
|
|
3575
|
-
value: newFilterValue
|
|
3576
|
-
});
|
|
3577
|
-
newState = setTimeFilterTimelineModeUpdater(newState, {
|
|
3578
|
-
id: newFilter.id,
|
|
3579
|
-
mode: getSyncAnimationMode(newFilter)
|
|
3580
|
-
});
|
|
3581
|
-
|
|
3582
|
-
// reset animation config current time to
|
|
3583
|
-
return setLayerAnimationTimeUpdater(newState, {
|
|
3584
|
-
value: (_newState$animationCo = (_newState$animationCo2 = newState.animationConfig.domain) === null || _newState$animationCo2 === void 0 ? void 0 : _newState$animationCo2[0]) !== null && _newState$animationCo !== void 0 ? _newState$animationCo : null
|
|
3585
|
-
});
|
|
3586
|
-
}
|
|
3587
|
-
function setTimeFilterTimelineModeUpdater(state, action) {
|
|
3588
|
-
var filterId = action.id,
|
|
3589
|
-
syncTimelineMode = action.mode;
|
|
3590
|
-
var filterIdx = state.filters.findIndex(function (f) {
|
|
3591
|
-
return f.id === filterId;
|
|
3592
|
-
});
|
|
3593
|
-
if (filterIdx === -1) {
|
|
3594
|
-
return state;
|
|
3595
|
-
}
|
|
3596
|
-
var filter = state.filters[filterIdx];
|
|
3597
|
-
if (!validateSyncAnimationMode(filter, syncTimelineMode)) {
|
|
3598
|
-
return state;
|
|
3599
|
-
}
|
|
3600
|
-
var newFilter = _objectSpread(_objectSpread({}, filter), {}, {
|
|
3601
|
-
syncTimelineMode: syncTimelineMode
|
|
3602
|
-
});
|
|
3603
|
-
var newState = _objectSpread(_objectSpread({}, state), {}, {
|
|
3604
|
-
filters: (0, _composerHelpers.swap_)(newFilter)(state.filters)
|
|
3605
|
-
});
|
|
3606
|
-
return adjustAnimationConfigWithFilter(newState, filterIdx);
|
|
3607
|
-
}
|
|
3608
|
-
|
|
3609
|
-
/**
|
|
3610
|
-
* Update state of the loading indicator.
|
|
3611
|
-
* @memberof visStateUpdaters
|
|
3612
|
-
* @param state visState
|
|
3613
|
-
* @param action
|
|
3614
|
-
* @param action.payload Payload with change of number of active loading actions.
|
|
3615
|
-
* @returns nextState
|
|
3616
|
-
* @public
|
|
3617
|
-
*/
|
|
3618
|
-
var setLoadingIndicatorUpdater = exports.setLoadingIndicatorUpdater = function setLoadingIndicatorUpdater(state, _ref40) {
|
|
3619
|
-
var change = _ref40.payload.change;
|
|
3620
|
-
var loadingIndicatorValue = state.loadingIndicatorValue;
|
|
3621
|
-
if (!loadingIndicatorValue) {
|
|
3622
|
-
loadingIndicatorValue = 0;
|
|
3623
|
-
}
|
|
3624
|
-
return _objectSpread(_objectSpread({}, state), {}, {
|
|
3625
|
-
loadingIndicatorValue: Math.max(loadingIndicatorValue + change, 0)
|
|
3626
|
-
});
|
|
3627
|
-
};
|
|
3628
|
-
function adjustAnimationConfigWithFilter(state, filterIdx) {
|
|
3629
|
-
var filter = state.filters[filterIdx];
|
|
3630
|
-
if (filter.syncedWithLayerTimeline) {
|
|
3631
|
-
var timelineValue = getTimelineValueFromFilter(filter);
|
|
3632
|
-
var value = state.animationConfig.timeSteps ? (0, _utils.snapToMarks)(timelineValue, state.animationConfig.timeSteps) : timelineValue;
|
|
3633
|
-
return setLayerAnimationTimeUpdater(state, {
|
|
3634
|
-
value: value
|
|
3635
|
-
});
|
|
3636
|
-
}
|
|
3637
|
-
return state;
|
|
3638
|
-
}
|
|
3639
|
-
function getTimelineValueFromFilter(filter) {
|
|
3640
|
-
return filter.value[filter.syncTimelineMode];
|
|
3641
|
-
}
|
|
3642
|
-
function getSyncAnimationMode(filter) {
|
|
3643
|
-
if (filter.animationWindow === _constants.ANIMATION_WINDOW.free) {
|
|
3644
|
-
var _filter$syncTimelineM;
|
|
3645
|
-
return (_filter$syncTimelineM = filter.syncTimelineMode) !== null && _filter$syncTimelineM !== void 0 ? _filter$syncTimelineM : _constants.SYNC_TIMELINE_MODES.end;
|
|
3646
|
-
}
|
|
3647
|
-
return _constants.SYNC_TIMELINE_MODES.end;
|
|
3648
|
-
}
|
|
3649
|
-
function validateSyncAnimationMode(filter, newMode) {
|
|
3650
|
-
return !(filter.animationWindow !== _constants.ANIMATION_WINDOW.free && newMode === _constants.SYNC_TIMELINE_MODES.start);
|
|
3651
|
-
}
|
|
3652
|
-
function adjustTimeFilterInterval(state, filter) {
|
|
3653
|
-
var intervalBasedAnimationLayers = (0, _utils.getIntervalBasedAnimationLayers)(state.layers);
|
|
3654
|
-
var interval = null;
|
|
3655
|
-
if (intervalBasedAnimationLayers.length > 0) {
|
|
3656
|
-
// @ts-ignore
|
|
3657
|
-
var intervalIndex = intervalBasedAnimationLayers.reduce(function (currentIndex, l) {
|
|
3658
|
-
if (l.meta.targetTimeInterval) {
|
|
3659
|
-
var newIndex = _utils.TIME_INTERVALS_ORDERED.findIndex(function (i) {
|
|
3660
|
-
return i === l.meta.targetTimeInterval;
|
|
3661
|
-
});
|
|
3662
|
-
return newIndex > -1 && newIndex < currentIndex ? newIndex : currentIndex;
|
|
3663
|
-
}
|
|
3664
|
-
}, _utils.TIME_INTERVALS_ORDERED.length - 1);
|
|
3665
|
-
// @ts-ignore
|
|
3666
|
-
var hexTileInterval = _utils.TIME_INTERVALS_ORDERED[intervalIndex];
|
|
3667
|
-
interval = _utils.LayerToFilterTimeInterval[hexTileInterval];
|
|
3668
|
-
}
|
|
3669
|
-
if (!interval) {
|
|
3670
|
-
return filter;
|
|
3671
|
-
}
|
|
3672
|
-
|
|
3673
|
-
// adjust filter
|
|
3674
|
-
var timeFormat = (0, _utils.getDefaultTimeFormat)(interval);
|
|
3675
|
-
var updatedPlotType = _objectSpread(_objectSpread({}, filter.plotType), {}, {
|
|
3676
|
-
interval: interval,
|
|
3677
|
-
timeFormat: timeFormat
|
|
3678
|
-
});
|
|
3679
|
-
var newFilter = (0, _utils.updateTimeFilterPlotType)(filter, updatedPlotType, state.datasets);
|
|
3680
|
-
return (0, _utils.adjustValueToAnimationWindow)(state, newFilter);
|
|
3681
|
-
}
|
|
3682
|
-
|
|
3683
|
-
// Find dataId from a saved visState property:
|
|
3684
|
-
// layers, filters, interactions, layerBlending, overlayBlending, splitMaps, animationConfig, editor
|
|
3685
|
-
// replace it with another dataId
|
|
3686
|
-
function defaultReplaceParentDatasetIds(value, dataId, dataIdToReplace) {
|
|
3687
|
-
var _value$config, _value$config2;
|
|
3688
|
-
if (Array.isArray(value)) {
|
|
3689
|
-
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
3690
|
-
var replaced = value.map(function (v) {
|
|
3691
|
-
return defaultReplaceParentDatasetIds(v, dataId, dataIdToReplace);
|
|
3692
|
-
}).filter(function (d) {
|
|
3693
|
-
return d;
|
|
3694
|
-
});
|
|
3695
|
-
return replaced.length ? replaced : null;
|
|
3696
|
-
}
|
|
3697
|
-
if (typeof value.dataId === 'string' && value.dataId === dataId) {
|
|
3698
|
-
// others
|
|
3699
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3700
|
-
dataId: dataIdToReplace
|
|
3701
|
-
});
|
|
3702
|
-
} else if (Array.isArray(value.dataId) && value.dataId.includes(dataId)) {
|
|
3703
|
-
// filter
|
|
3704
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3705
|
-
dataId: value.dataId.map(function (d) {
|
|
3706
|
-
return d === dataId ? dataIdToReplace : d;
|
|
3707
|
-
})
|
|
3708
|
-
});
|
|
3709
|
-
} else if ((_value$config = value.config) !== null && _value$config !== void 0 && _value$config.dataId && ((_value$config2 = value.config) === null || _value$config2 === void 0 ? void 0 : _value$config2.dataId) === dataId) {
|
|
3710
|
-
// layer
|
|
3711
|
-
return _objectSpread(_objectSpread({}, value), {}, {
|
|
3712
|
-
config: _objectSpread(_objectSpread({}, value.config), {}, {
|
|
3713
|
-
dataId: dataIdToReplace
|
|
3714
|
-
})
|
|
3715
|
-
});
|
|
3716
|
-
} else if ((0, _utils.isObject)(value) && Object.prototype.hasOwnProperty.call(value, dataId)) {
|
|
3717
|
-
// for value saved as {[dataId]: {...}}
|
|
3718
|
-
return (0, _defineProperty2["default"])({}, dataIdToReplace, value[dataId]);
|
|
3719
|
-
}
|
|
3720
|
-
return null;
|
|
3721
|
-
}
|
|
3722
|
-
|
|
3723
|
-
// Find datasetIds derived a saved visState Property;
|
|
3724
|
-
function findChildDatasetIds(value) {
|
|
3725
|
-
var _value$newDataset;
|
|
3726
|
-
if (Array.isArray(value)) {
|
|
3727
|
-
// for layers, filters, call defaultReplaceParentDatasetIds on each item in array
|
|
3728
|
-
var childDataIds = value.map(findChildDatasetIds).filter(function (d) {
|
|
3729
|
-
return d;
|
|
3730
|
-
});
|
|
3731
|
-
return childDataIds.length ? childDataIds : null;
|
|
3732
|
-
}
|
|
3733
|
-
|
|
3734
|
-
// child data id usually stores in the derived dataset info
|
|
3735
|
-
return (value === null || value === void 0 || (_value$newDataset = value.newDataset) === null || _value$newDataset === void 0 ? void 0 : _value$newDataset.info.id) || null;
|
|
3736
|
-
}
|
|
3737
|
-
|
|
3738
|
-
// moved unmerged layers, filters, interactions
|
|
3739
|
-
function moveValueToBeMerged(state, propValues, _ref42) {
|
|
3740
|
-
var prop = _ref42.prop,
|
|
3741
|
-
toMergeProp = _ref42.toMergeProp,
|
|
3742
|
-
saveUnmerged = _ref42.saveUnmerged;
|
|
3743
|
-
// remove prop value from state
|
|
3744
|
-
// TODO: should we add remove updater to merger as well?
|
|
3745
|
-
if (!propValues) {
|
|
3746
|
-
return state;
|
|
3747
|
-
}
|
|
3748
|
-
var stateRemoved = prop === 'layers' ? propValues.reduce(function (accu, propValue) {
|
|
3749
|
-
return removeLayerUpdater(accu, {
|
|
3750
|
-
id: propValue.id
|
|
3751
|
-
});
|
|
3752
|
-
}, state) : Array.isArray(state[prop]) ? _objectSpread(_objectSpread({}, state), {}, (0, _defineProperty2["default"])({}, prop, state[prop].filter(function (p) {
|
|
3753
|
-
return !propValues.find(function (propValue) {
|
|
3754
|
-
return p.id === propValue.id;
|
|
3755
|
-
});
|
|
3756
|
-
}))) :
|
|
3757
|
-
// if not array, we won't remove it, remove dataset should handle it
|
|
3758
|
-
state;
|
|
3759
|
-
|
|
3760
|
-
// move to stateToBeMerged
|
|
3761
|
-
var toBeMerged = (0, _defineProperty2["default"])({}, toMergeProp, saveUnmerged ?
|
|
3762
|
-
// call merge saveUnmerged method
|
|
3763
|
-
saveUnmerged(stateRemoved, propValues) :
|
|
3764
|
-
// if toMergeProp is araay, append to it
|
|
3765
|
-
Array.isArray(stateRemoved[toMergeProp]) ? [].concat((0, _toConsumableArray2["default"])(stateRemoved[toMergeProp]), (0, _toConsumableArray2["default"])(propValues)) :
|
|
3766
|
-
// save propValues to toMerge
|
|
3767
|
-
(0, _utils.isObject)(stateRemoved[toMergeProp]) ? _objectSpread(_objectSpread({}, stateRemoved[toMergeProp]), propValues) : stateRemoved[toMergeProp]);
|
|
3768
|
-
return _objectSpread(_objectSpread({}, stateRemoved), toBeMerged);
|
|
3769
|
-
}
|
|
3770
|
-
function replaceDatasetAndDeps(state, dataId, dataIdToUse) {
|
|
3771
|
-
return (0, _composerHelpers.compose_)([(0, _composerHelpers.apply_)(replaceDatasetDepsInState, {
|
|
3772
|
-
dataId: dataId,
|
|
3773
|
-
dataIdToUse: dataIdToUse
|
|
3774
|
-
}), (0, _composerHelpers.apply_)(removeDatasetUpdater, {
|
|
3775
|
-
dataId: dataId
|
|
3776
|
-
})])(state);
|
|
3777
|
-
}
|
|
3778
|
-
function prepareStateForDatasetReplace(state, dataId, dataIdToUse) {
|
|
3779
|
-
var _nextState$layerToBeM;
|
|
3780
|
-
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3781
|
-
var nextState = replaceDatasetAndDeps(state, dataId, dataIdToUse);
|
|
3782
|
-
// make a copy of layerOrder, because layer id will be removed from it by calling removeLayerUpdater
|
|
3783
|
-
var preserveLayerOrder = (0, _toConsumableArray2["default"])(state.layerOrder);
|
|
3784
|
-
|
|
3785
|
-
// preserve dataset order
|
|
3786
|
-
nextState.preserveDatasetOrder = Object.keys(state.datasets).map(function (d) {
|
|
3787
|
-
return d === dataId ? dataIdToUse : d;
|
|
3788
|
-
});
|
|
3789
|
-
|
|
3790
|
-
// preserveLayerOrder
|
|
3791
|
-
if ((_nextState$layerToBeM = nextState.layerToBeMerged) !== null && _nextState$layerToBeM !== void 0 && _nextState$layerToBeM.length) {
|
|
3792
|
-
var _serializedState$spli;
|
|
3793
|
-
// copy split maps to be merged, because it will be reset in remove layer
|
|
3794
|
-
nextState.splitMapsToBeMerged = (_serializedState$spli = serializedState === null || serializedState === void 0 ? void 0 : serializedState.splitMaps) !== null && _serializedState$spli !== void 0 ? _serializedState$spli : [];
|
|
3795
|
-
nextState.layerOrder = (0, _toConsumableArray2["default"])(preserveLayerOrder);
|
|
3796
|
-
}
|
|
3797
|
-
return nextState;
|
|
3798
|
-
}
|
|
3799
|
-
function replaceDatasetDepsInState(state, _ref43) {
|
|
3800
|
-
var dataId = _ref43.dataId,
|
|
3801
|
-
dataIdToUse = _ref43.dataIdToUse;
|
|
3802
|
-
var serializedState = (0, _visStateMerger.serializeVisState)(state, state.schema);
|
|
3803
|
-
var nextState = state.mergers.reduce(function (accuState, _ref44) {
|
|
3804
|
-
var prop = _ref44.prop,
|
|
3805
|
-
toMergeProp = _ref44.toMergeProp,
|
|
3806
|
-
replaceParentDatasetIds = _ref44.replaceParentDatasetIds,
|
|
3807
|
-
getChildDatasetIds = _ref44.getChildDatasetIds,
|
|
3808
|
-
saveUnmerged = _ref44.saveUnmerged,
|
|
3809
|
-
preserveOrder = _ref44.preserveOrder;
|
|
3810
|
-
// get dataset ids that are depends on this dataset
|
|
3811
|
-
var props = (0, _commonUtils.toArray)(prop);
|
|
3812
|
-
var toMergeProps = (0, _commonUtils.toArray)(toMergeProp);
|
|
3813
|
-
var savedProps = serializedState ? props.map(function (p) {
|
|
3814
|
-
return serializedState[p];
|
|
3815
|
-
}) : [];
|
|
3816
|
-
var replacedState = accuState;
|
|
3817
|
-
savedProps.forEach(function (propValue, i) {
|
|
3818
|
-
var _replacedState$merger;
|
|
3819
|
-
var mergerOptions = {
|
|
3820
|
-
prop: props[i],
|
|
3821
|
-
toMergeProp: toMergeProps[i],
|
|
3822
|
-
getChildDatasetIds: getChildDatasetIds,
|
|
3823
|
-
saveUnmerged: saveUnmerged
|
|
3824
|
-
};
|
|
3825
|
-
var replacedItem = (replaceParentDatasetIds === null || replaceParentDatasetIds === void 0 ? void 0 : replaceParentDatasetIds(propValue, dataId, dataIdToUse)) || defaultReplaceParentDatasetIds(propValue, dataId, dataIdToUse);
|
|
3826
|
-
replacedState = replacedItem ? replacePropValueInState(replacedState, replacedItem, mergerOptions) : replacedState;
|
|
3827
|
-
if (mergerOptions.toMergeProp !== undefined && (_replacedState$merger = replacedState[mergerOptions.toMergeProp]) !== null && _replacedState$merger !== void 0 && _replacedState$merger.length && preserveOrder) {
|
|
3828
|
-
replacedState[preserveOrder] = propValue.map(function (item) {
|
|
3829
|
-
return item.id;
|
|
3830
|
-
});
|
|
3831
|
-
}
|
|
3832
|
-
});
|
|
3833
|
-
return replacedState;
|
|
3834
|
-
}, state);
|
|
3835
|
-
return nextState;
|
|
3836
|
-
}
|
|
3837
|
-
function replacePropValueInState(state, replacedItem, _ref45) {
|
|
3838
|
-
var prop = _ref45.prop,
|
|
3839
|
-
toMergeProp = _ref45.toMergeProp,
|
|
3840
|
-
getChildDatasetIds = _ref45.getChildDatasetIds,
|
|
3841
|
-
saveUnmerged = _ref45.saveUnmerged;
|
|
3842
|
-
// prop is depends on the dataset to be replaced
|
|
3843
|
-
// remove prop from state, and move it to toBeMerged
|
|
3844
|
-
var nextState = moveValueToBeMerged(state, replacedItem, {
|
|
3845
|
-
prop: prop,
|
|
3846
|
-
toMergeProp: toMergeProp,
|
|
3847
|
-
saveUnmerged: saveUnmerged
|
|
3848
|
-
});
|
|
3849
|
-
var childDataIds = (getChildDatasetIds === null || getChildDatasetIds === void 0 ? void 0 : getChildDatasetIds(replacedItem)) || findChildDatasetIds(replacedItem);
|
|
3850
|
-
if (childDataIds) {
|
|
3851
|
-
nextState = (0, _commonUtils.toArray)(childDataIds).reduce(function (accu, childDataId) {
|
|
3852
|
-
// shouldn't need to change child dataset id,
|
|
3853
|
-
// but still need to move out of state and merge back in
|
|
3854
|
-
return replaceDatasetAndDeps(accu, childDataId, childDataId);
|
|
3855
|
-
}, nextState);
|
|
3856
|
-
}
|
|
3857
|
-
return nextState;
|
|
3858
|
-
}
|
|
3859
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYmJveCIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJyZXF1aXJlIiwiX2NvcHlUb0NsaXBib2FyZCIsIl9kZWVwbWVyZ2UiLCJfd2luZG93IiwiX2Nsb25lRGVlcCIsIl9nZXQiLCJfaXNFcXVhbCIsIl9waWNrIiwiX3VuaXEiLCJfeG9yIiwiX3Rhc2tzIiwiX2ludGVyb3BSZXF1aXJlV2lsZGNhcmQiLCJfdGFza3MyIiwiX2FjdGlvbnMiLCJfdXRpbHMiLCJfY29tbW9uVXRpbHMiLCJfY29uc3RhbnRzIiwiX2xheWVycyIsIl9jb21wb3NlckhlbHBlcnMiLCJfbWVyZ2VySGFuZGxlciIsIl92aXNTdGF0ZU1lcmdlciIsIl9zY2hlbWFzIiwiX3RhYmxlIiwiX2ludGVyYWN0aW9uVXRpbHMiLCJfbGF5ZXJVdGlscyIsIl9lZmZlY3RzIiwiX2RhdGFVdGlscyIsIl9leGNsdWRlZCIsIl9leGNsdWRlZDIiLCJfZ2V0UmVxdWlyZVdpbGRjYXJkQ2FjaGUiLCJlIiwiV2Vha01hcCIsInIiLCJ0IiwiX19lc01vZHVsZSIsIl90eXBlb2YzIiwiaGFzIiwiZ2V0IiwibiIsIl9fcHJvdG9fXyIsImEiLCJPYmplY3QiLCJkZWZpbmVQcm9wZXJ0eSIsImdldE93blByb3BlcnR5RGVzY3JpcHRvciIsInUiLCJoYXNPd25Qcm9wZXJ0eSIsImNhbGwiLCJpIiwic2V0IiwiX3RvUHJvcGVydHlLZXkiLCJfdG9QcmltaXRpdmUiLCJTeW1ib2wiLCJ0b1ByaW1pdGl2ZSIsIlR5cGVFcnJvciIsIlN0cmluZyIsIk51bWJlciIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJsZW5ndGgiLCJfbiIsIkYiLCJzIiwiZG9uZSIsInZhbHVlIiwiZiIsIm8iLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJvd25LZXlzIiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsImZpbHRlciIsImVudW1lcmFibGUiLCJwdXNoIiwiYXBwbHkiLCJfb2JqZWN0U3ByZWFkIiwiYXJndW1lbnRzIiwiZm9yRWFjaCIsIl9kZWZpbmVQcm9wZXJ0eTIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIiwiZGVmaW5lUHJvcGVydGllcyIsImRpc2FibGVTdGFja0NhcHR1cmluZyIsInZpc1N0YXRlVXBkYXRlcnMiLCJkZWZhdWx0SW50ZXJhY3Rpb25Db25maWciLCJleHBvcnRzIiwidG9vbHRpcCIsImlkIiwibGFiZWwiLCJlbmFibGVkIiwiY29uZmlnIiwiZmllbGRzVG9TaG93IiwiY29tcGFyZU1vZGUiLCJjb21wYXJlVHlwZSIsIkNPTVBBUkVfVFlQRVMiLCJBQlNPTFVURSIsImdlb2NvZGVyIiwicG9zaXRpb24iLCJsaW1pdFNlYXJjaCIsImJydXNoIiwic2l6ZSIsImNvb3JkaW5hdGUiLCJERUZBVUxUX0FOSU1BVElPTl9DT05GSUciLCJkb21haW4iLCJjdXJyZW50VGltZSIsInNwZWVkIiwiaXNBbmltYXRpbmciLCJ0aW1lU3RlcHMiLCJ0aW1lRm9ybWF0IiwidGltZXpvbmUiLCJkZWZhdWx0VGltZUZvcm1hdCIsImhpZGVDb250cm9sIiwiZHVyYXRpb24iLCJERUZBVUxUX0VESVRPUiIsIm1vZGUiLCJFRElUT1JfTU9ERVMiLCJEUkFXX1BPTFlHT04iLCJmZWF0dXJlcyIsInNlbGVjdGVkRmVhdHVyZSIsInZpc2libGUiLCJJTklUSUFMX1ZJU19TVEFURSIsIm1hcEluZm8iLCJ0aXRsZSIsImRlc2NyaXB0aW9uIiwibGF5ZXJzIiwibGF5ZXJEYXRhIiwibGF5ZXJUb0JlTWVyZ2VkIiwibGF5ZXJPcmRlciIsImZpbHRlcnMiLCJmaWx0ZXJUb0JlTWVyZ2VkIiwiZGF0YXNldHMiLCJlZGl0aW5nRGF0YXNldCIsInVuZGVmaW5lZCIsImVmZmVjdHMiLCJlZmZlY3RPcmRlciIsImFubm90YXRpb25zIiwiYW5ub3RhdGlvbnNUb0JlTWVyZ2VkIiwic2VsZWN0ZWRBbm5vdGF0aW9uSWQiLCJpc0VkaXRpbmdBbm5vdGF0aW9uVGV4dCIsImludGVyYWN0aW9uQ29uZmlnIiwiaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkIiwibGF5ZXJCbGVuZGluZyIsIm92ZXJsYXlCbGVuZGluZyIsImhvdmVySW5mbyIsImNsaWNrZWQiLCJtb3VzZVBvcyIsIm1heERlZmF1bHRUb29sdGlwcyIsIk1BWF9ERUZBVUxUX1RPT0xUSVBTIiwic3BsaXRNYXBzIiwic3BsaXRNYXBzVG9CZU1lcmdlZCIsImlzTWVyZ2luZ0RhdGFzZXRzIiwibGF5ZXJDbGFzc2VzIiwiTGF5ZXJDbGFzc2VzIiwiYW5pbWF0aW9uQ29uZmlnIiwiZWRpdG9yIiwiZmlsZUxvYWRpbmciLCJmaWxlTG9hZGluZ1Byb2dyZXNzIiwibG9hZGluZ0luZGljYXRvclZhbHVlIiwibG9hZGVycyIsImxvYWRPcHRpb25zIiwibWVyZ2VycyIsIlZJU19TVEFURV9NRVJHRVJTIiwic2NoZW1hIiwiS2VwbGVyR0xTY2hlbWEiLCJBQ1RJT05fVEFTS19GSVRfQk9VTkRTIiwiVGFzayIsImZyb21DYWxsYmFjayIsIl8iLCJjYiIsIkFDVElPTl9UQVNLX0FERF9OT1RJRklDQVRJT04iLCJ1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEiLCJzdGF0ZSIsIl9yZWYiLCJsYXllciIsImlkeCIsIm1hcCIsImx5ciIsImQiLCJ1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlIiwibmV3U3RhdGUiLCJpc1Zpc2libGUiLCJhZGROZXdMYXllcnNUb1NwbGl0TWFwIiwicmVtb3ZlTGF5ZXJGcm9tU3BsaXRNYXBzIiwiYW5pbWF0aW9uIiwidXBkYXRlQW5pbWF0aW9uRG9tYWluIiwicGlja0NoYW5nZWRQcm9wcyIsInByZXYiLCJjaGFuZ2VkUHJvcHMiLCJwaWNrUHJvcHNPZiIsIm9iaiIsImtleSIsInByb3RvdHlwZSIsImlzRXF1YWwiLCJWSVNVQUxfQ0hBTk5FTF9QUk9QX1RZUEVTIiwiYXBwbHlMYXllckNvbmZpZ1VwZGF0ZXIiLCJhY3Rpb24iLCJfc2VyaWFsaXplTGF5ZXIiLCJvbGRMYXllcklkIiwibmV3TGF5ZXJDb25maWciLCJsYXllckluZGV4IiwibmV3UGFyc2VkTGF5ZXIiLCJwYXJzZUxheWVyQ29uZmlnIiwib2xkTGF5ZXIiLCJmaW5kIiwibCIsImRhdGFzZXQiLCJkYXRhSWQiLCJuZXdMYXllciIsInZhbGlkYXRlTGF5ZXJXaXRoRGF0YSIsIm5leHRTdGF0ZSIsInR5cGUiLCJvbGRMYXllckluZGV4IiwiZmluZEluZGV4IiwibGF5ZXJUeXBlQ2hhbmdlVXBkYXRlciIsImxheWVyVHlwZUNoYW5nZSIsIm5ld0xheWVySWQiLCJhcHBseUxheWVyQ29uZmlnIiwic2VyaWFsaXplZE9sZExheWVyIiwic2VyaWFsaXplTGF5ZXIiLCJzZXJpYWxpemVkTmV3TGF5ZXIiLCJjaGFuZ2VkIiwidmlzQ29uZmlnIiwibGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyIiwibGF5ZXJWaXNDb25maWdDaGFuZ2UiLCJ2aXN1YWxDaGFubmVscyIsImNoYW5uZWxOYW1lIiwiY2hhbm5lbCIsImNoYW5uZWxQcm9wTmFtZXMiLCJwcm9wIiwic29tZSIsImxheWVyVmlzdWFsQ2hhbm5lbENoYW5nZVVwZGF0ZXIiLCJsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UiLCJwaWNrIiwiX2l0ZXJhdG9yIiwiX3N0ZXAiLCJlcnIiLCJsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJsYXllckNvbmZpZ0NoYW5nZSIsInVwZGF0ZWxheWVyVmlzaWJpbHR5IiwiZmlsdGVySW5kZXgiLCJmaWx0ZXJTeW5jZWRXaXRoVGltZWxpbmUiLCJpc0xheWVyQW5pbWF0YWJsZSIsInN5bmNUaW1lRmlsdGVyV2l0aExheWVyVGltZWxpbmVVcGRhdGVyIiwiZW5hYmxlIiwiZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMiLCJwcm9wcyIsIm5ld0NvbmZpZyIsIl9hY3Rpb24kbmV3Q29uZmlnIiwicmVzdENvbmZpZyIsIl9vYmplY3RXaXRob3V0UHJvcGVydGllczIiLCJzdGF0ZVdpdGhEYXRhSWQiLCJsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIiLCJuZXh0TGF5ZXIiLCJ1cGRhdGVMYXllckNvbmZpZyIsInNob3VsZENhbGN1bGF0ZUxheWVyRGF0YSIsIm9sZExheWVyRGF0YSIsInVwZGF0ZUxheWVyRGF0YVJlc3VsdCIsImNhbGN1bGF0ZUxheWVyRGF0YSIsImxheWVyQW5pbWF0aW9uQ2hhbmdlVXBkYXRlciIsIl9jYWxjdWxhdGVMYXllckRhdGEiLCJsYXllclRvZ2dsZVZpc2liaWxpdHlVcGRhdGVyIiwibGF5ZXJJZCIsInNwbGl0TWFwSWQiLCJtYXBJbmRleCIsInNtIiwidG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyIiwidG9nZ2xlTGF5ZXJGb3JNYXAiLCJzeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSIsImxheWVyU2V0SXNWYWxpZFVwZGF0ZXIiLCJpc1ZhbGlkIiwibGF5ZXJUb1VwZGF0ZSIsIm5ld0RhdGEiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhMiIsImFkZE9yUmVtb3ZlVGV4dExhYmVscyIsIm5ld0ZpZWxkcyIsInRleHRMYWJlbCIsImRlZmF1bHRUZXh0TGFiZWwiLCJERUZBVUxUX1RFWFRfTEFCRUwiLCJuZXdUZXh0TGFiZWwiLCJjdXJyZW50RmllbGRzIiwidGwiLCJmaWVsZCIsImFkZEZpZWxkcyIsImluY2x1ZGVzIiwiZGVsZXRlRmllbGRzIiwiZmQiLCJjb25jYXQiLCJfdG9Db25zdW1hYmxlQXJyYXkyIiwiYWYiLCJ1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUiLCJzcGxpY2UiLCJsYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXIiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwiLCJfb2xkTGF5ZXIkZ2V0RGVmYXVsdEwyIiwiZ2V0RGVmYXVsdExheWVyQ29uZmlnIiwidmFsaWRhdGVFeGlzdGluZ0xheWVyV2l0aERhdGEiLCJsb2FkZWRMYXllciIsImFsbG93RW1wdHlDb2x1bW4iLCJpc1ZhbGlkVG9TYXZlIiwidmFsaWRhdGVkIiwib2xkTGF5ZXJUeXBlIiwibmV3RGF0YXNldEZpZWxkcyIsImZpZWxkcyIsInJlbWFwcGVkRmllbGRzIiwidmFsdWVzIiwiX3JlZjIiLCJmaWVsZEtleSIsImN1cnJlbnRGaWVsZCIsIm1hdGNoZWQiLCJfcmVmMyIsInZhbGlkYXRlVmlzdWFsQ2hhbm5lbCIsImlzQ29uZmlnQWN0aXZlIiwidXBkYXRlTGF5ZXJEb21haW4iLCJfY2FsY3VsYXRlTGF5ZXJEYXRhMyIsInNldEluaXRpYWxMYXllckNvbmZpZyIsInJlc3VsdCIsImZpbmREZWZhdWx0TGF5ZXJQcm9wcyIsIm5ld1R5cGUiLCJvbGRJZCIsIkNvbnNvbGUiLCJlcnJvciIsImRlZmF1bHRMYXllclByb3BzIiwiYXNzaWduQ29uZmlnVG9MYXllciIsInZpc0NvbmZpZ1NldHRpbmdzIiwiaXNMYXllckhvdmVyZWQiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNCIsInNldHRpbmdzIiwiX3NldHRpbmdzJGxheWVycyIsIm9sZExheWVyTWFwIiwib3RoZXJMYXllcnMiLCJuZXdWaXNDb25maWciLCJ1cGRhdGVMYXllclZpc0NvbmZpZyIsInVwZGF0ZUxheWVyVmlzdWFsQ2hhbm5lbCIsInVwZGF0ZWRTdGF0ZSIsInZpc3VhbENoYW5uZWwiLCJjaGFubmVsU2NhbGVUeXBlIiwiQ0hBTk5FTF9TQ0FMRVMiLCJjb2xvciIsInVwZGF0ZUxheWVyQ29sb3JVSSIsInJhbmdlIiwiY29sb3JSYW5nZUNvbmZpZyIsImNvbG9yVUkiLCJjdXN0b21CcmVha3MiLCJfY2FsY3VsYXRlTGF5ZXJEYXRhNSIsInNjYWxlIiwiU0NBTEVfVFlQRVMiLCJjdXN0b21PcmRpbmFsIiwiY3VzdG9tUGFsZXR0ZSIsImluaXRDdXN0b21QYWxldHRlQnlDdXN0b21TY2FsZSIsIm9yZGluYWxEb21haW4iLCJjb2xvckJyZWFrcyIsInNob3dDb2xvckNoYXJ0IiwiZWRpdEJvdW5kcyIsIl9jYWxjdWxhdGVMYXllckRhdGE2Iiwic2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlciIsIl9yZWY0IiwicmVkdWNlIiwiYWNjdSIsInNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyIiwic2V0RmlsdGVyVXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIiLCJfcmVmNSIsImFuaW1hdGlvbldpbmRvdyIsIm5ld0ZpbHRlciIsInN3YXBfIiwibmV3U3luY1RpbWVsaW5lTW9kZSIsImdldFN5bmNBbmltYXRpb25Nb2RlIiwic2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIiLCJhcHBseUZpbHRlckNvbmZpZ1VwZGF0ZXIiLCJfc2VyaWFsaXplRmlsdGVyIiwiZmlsdGVySWQiLCJvbGRGaWx0ZXIiLCJzZXJpYWxpemVkT2xkRmlsdGVyIiwic2VyaWFsaXplRmlsdGVyIiwic2VyaWFsaXplZE5ld0ZpbHRlciIsInNldEZpbHRlciIsIl9hY3Rpb24kdmFsdWVJbmRleCIsInZhbHVlSW5kZXgiLCJ0b0FycmF5IiwiZGF0YXNldElkc1RvRmlsdGVyIiwiX2xvb3AiLCJyZXMiLCJ2IiwiX3VwZGF0ZUZpbHRlclByb3AiLCJlbmxhcmdlZEZpbHRlciIsInZpZXciLCJGSUxURVJfVklFV19UWVBFUyIsImVubGFyZ2VkIiwic2lkZSIsImZpbHRlcmVkRGF0YXNldHMiLCJhcHBseUZpbHRlcnNUb0RhdGFzZXRzIiwidW5pcSIsImZpbHRlcldpdGhQTG90IiwidXBkYXRlRmlsdGVyUGxvdCIsInVwZGF0ZUFsbExheWVyRG9tYWluRGF0YSIsIkZJTFRFUl9UWVBFUyIsInRpbWVSYW5nZSIsImFkanVzdEFuaW1hdGlvbkNvbmZpZ1dpdGhGaWx0ZXIiLCJfdXBkYXRlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4IiwiX3JlbW92ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleCIsIm5leHRWYWx1ZSIsImdldERlZmF1bHRGaWx0ZXIiLCJyZW1vdmVGaWx0ZXJQbG90IiwiX2kiLCJfYXJyIiwibmV4dFZhbCIsImRvbWFpblN0ZXBzIiwibWVyZ2VGaWx0ZXJEb21haW4iLCJuZXh0RmlsdGVyIiwic3RlcCIsImFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4iLCJkYXRhc2V0SWRzIiwiRklMVEVSX1VQREFURVJfUFJPUFMiLCJvbGREYXRhSWQiLCJkYXRhc2V0SWQiLCJfYXBwbHlGaWx0ZXJGaWVsZE5hbWUiLCJhcHBseUZpbHRlckZpZWxkTmFtZSIsIm1lcmdlRG9tYWluIiwidXBkYXRlZEZpbHRlciIsIm5ld0RhdGFzZXQiLCJncHUiLCJzZXRGaWx0ZXJHcHVNb2RlIiwiYXNzaWduR3B1Q2hhbm5lbCIsImxheWVySWREaWZmZXJlbmNlIiwieG9yIiwibGF5ZXJEYXRhSWRzIiwibGlkIiwibmV3RGF0YUlkcyIsInNldEZpbHRlclBsb3RVcGRhdGVyIiwiX3JlZjYiLCJuZXdQcm9wIiwicGlja18iLCJtZXJnZV8iLCJwbG90VHlwZSIsImNoYXJ0VHlwZSIsInlBeGlzIiwiUExPVF9UWVBFUyIsImxpbmVDaGFydCIsImhpc3RvZ3JhbSIsImFkZEZpbHRlclVwZGF0ZXIiLCJjcmVhdGVPclVwZGF0ZUZpbHRlclVwZGF0ZXIiLCJvcmlnaW5hbEluZGV4IiwiaW5kZXgiLCJsYXllckNvbG9yVUlDaGFuZ2VVcGRhdGVyIiwiX3JlZjciLCJvbGRWaXhDb25maWciLCJ0b2dnbGVGaWx0ZXJBbmltYXRpb25VcGRhdGVyIiwiaXNGaWx0ZXJBbmltYXRpb25Db25maWciLCJzZXRBbmltYXRpb25Db25maWdVcGRhdGVyIiwiaXNTaWRlRmlsdGVyIiwiYXBwbHlGaWx0ZXJDb25maWciLCJ0b2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXIiLCJ0b2dnbGVMYXllckFuaW1hdGlvbkNvbnRyb2xVcGRhdGVyIiwidXBkYXRlRmlsdGVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyIiwidXBkYXRlTGF5ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXIiLCJfcmVmOCIsInNldEZpbHRlclZpZXdVcGRhdGVyIiwic2hvdWxkUmVzZXRPdGhlckZpbHRlcnNWaWV3IiwidG9nZ2xlRmlsdGVyRmVhdHVyZVVwZGF0ZXIiLCJmZWF0dXJlVG9GaWx0ZXJWYWx1ZSIsInJlbW92ZUZpbHRlclVwZGF0ZXIiLCJfc3RhdGUkZmlsdGVycyRpZHgiLCJuZXdGaWx0ZXJzIiwibmV3RWRpdG9yIiwiZ2V0RmlsdGVySWRJbkZlYXR1cmUiLCJhZGRMYXllclVwZGF0ZXIiLCJuZXdMYXllckRhdGEiLCJjcmVhdGVMYXllckZyb21Db25maWciLCJ3YXJuIiwiX2FjdGlvbiRkYXRhc2V0SWQiLCJkZWZhdWx0RGF0YXNldCIsIkxheWVyIiwicmVtb3ZlTGF5ZXJVcGRhdGVyIiwiX3JlZjkiLCJpc0Zpbml0ZSIsImxheWVyVG9SZW1vdmUiLCJmaWx0ZXJPdXRCeUlkIiwicmVtb3ZlRWxlbWVudEF0SW5kZXgiLCJyZW9yZGVyTGF5ZXJVcGRhdGVyIiwiX3JlZjEwIiwib3JkZXIiLCJkdXBsaWNhdGVMYXllclVwZGF0ZXIiLCJfcmVmMTEiLCJvcmlnaW5hbCIsIm9yaWdpbmFsTGF5ZXJPcmRlcklkeCIsIm5ld0xhYmVsIiwicG9zdGZpeCIsImdlbmVyYXRlSGFzaElkIiwiTEFZRVJfSURfTEVOR1RIIiwibmV3TGF5ZXJPcmRlciIsImFycmF5SW5zZXJ0IiwiYWRkRWZmZWN0VXBkYXRlciIsIl9hY3Rpb24kY29uZmlnIiwiX2FjdGlvbiRjb25maWcyIiwiX2FjdGlvbiRjb25maWczIiwiTElHSFRfQU5EX1NIQURPV19FRkZFQ1QiLCJlZmZlY3QiLCJESVNUQU5DRV9GT0dfVFlQRSIsIlNVUkZBQ0VfRk9HX1RZUEUiLCJuZXdFZmZlY3QiLCJjcmVhdGVFZmZlY3QiLCJzZXRQcm9wcyIsImZpeEVmZmVjdE9yZGVyIiwicmVtb3ZlRWZmZWN0VXBkYXRlciIsIl9yZWYxMiIsImVmZmVjdFRvUmVtb3ZlIiwiZWZmZWN0SWQiLCJyZW9yZGVyRWZmZWN0VXBkYXRlciIsIl9yZWYxMyIsInVwZGF0ZUVmZmVjdFVwZGF0ZXIiLCJfcmVmMTQiLCJpZHgyIiwiZWZmZWN0T3JkZXJJZCIsIm5ld0VmZmVjdHMiLCJtYWtlTmV3QW5ub3RhdGlvbiIsIl9jb25maWcka2luZCIsIl9jb25maWckaWQiLCJfY29uZmlnJGlzVmlzaWJsZSIsIl9jb25maWckYXV0b1NpemUiLCJfY29uZmlnJGF1dG9TaXplWSIsIl9jb25maWckYW5jaG9yUG9pbnQiLCJfY29uZmlnJGxhYmVsIiwiX2NvbmZpZyRsaW5lQ29sb3IiLCJfY29uZmlnJGxpbmVXaWR0aCIsIl9jb25maWckdGV4dFdpZHRoIiwiX2NvbmZpZyR0ZXh0SGVpZ2h0IiwiX2NvbmZpZyR0ZXh0VmVydGljYWxBIiwiX2FybUxlbmd0aCIsIl9hbmdsZSIsIl9hcm1MZW5ndGgyIiwiX2FuZ2xlMiIsIl9hcm1MZW5ndGgzIiwiX2FuZ2xlMyIsIl9yYWRpdXNJbk1ldGVycyIsImtpbmQiLCJJTklUSUFMX0FOTk9UQVRJT05fS0lORCIsImJhc2UiLCJhdXRvU2l6ZSIsImF1dG9TaXplWSIsImFuY2hvclBvaW50IiwibGluZUNvbG9yIiwiSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IiLCJsaW5lV2lkdGgiLCJJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCIsInRleHRXaWR0aCIsIklOSVRJQUxfQU5OT1RBVElPTl9URVhUX1dJRFRIIiwidGV4dEhlaWdodCIsIklOSVRJQUxfQU5OT1RBVElPTl9URVhUX0hFSUdIVCIsInRleHRWZXJ0aWNhbEFsaWduIiwiQW5ub3RhdGlvbktpbmQiLCJQT0lOVCIsImFybUxlbmd0aCIsIklOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RIIiwiYW5nbGUiLCJJTklUSUFMX0FOTk9UQVRJT05fQU5HTEUiLCJBUlJPVyIsIkNJUkNMRSIsInJhZGl1c0luTWV0ZXJzIiwiVEVYVCIsImFkZEFubm90YXRpb25VcGRhdGVyIiwibmV3QW5ub3RhdGlvbiIsInJlbW92ZUFubm90YXRpb25VcGRhdGVyIiwiX3JlZjE1IiwidXBkYXRlQW5ub3RhdGlvblVwZGF0ZXIiLCJfcmVmMTYiLCJuZXh0QW5ub3RhdGlvbiIsIm5ld0Fubm90YXRpb25zIiwiZHVwbGljYXRlQW5ub3RhdGlvblVwZGF0ZXIiLCJfcmVmMTciLCJjbG9uZURlZXAiLCJzZXRTZWxlY3RlZEFubm90YXRpb25VcGRhdGVyIiwiX3JlZjE4IiwiaXNFZGl0aW5nVGV4dCIsInJlbW92ZURhdGFzZXRVcGRhdGVyIiwiZGF0YXNldEtleSIsIl9zdGF0ZSRkYXRhc2V0cyIsIm5ld0RhdGFzZXRzIiwibGF5ZXJzVG9SZW1vdmUiLCJfaXRlcmF0b3IyIiwiX3N0ZXAyIiwiaW5kZXhPZiIsInJlbW92ZURhdGFzZXRGcm9tSW50ZXJhY3Rpb25Db25maWciLCJfcmVmMTkiLCJfaW50ZXJhY3Rpb25Db25maWciLCJfY29uZmlnJGZpZWxkc1RvU2hvdyIsInVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyIiwidXBkYXRlT3ZlcmxheUJsZW5kaW5nVXBkYXRlciIsInNob3dEYXRhc2V0VGFibGVVcGRhdGVyIiwidXBkYXRlVGFibGVDb2xvclVwZGF0ZXIiLCJ1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyIiwibmV3Q29sb3IiLCJyZXNldE1hcENvbmZpZ1VwZGF0ZXIiLCJpbml0aWFsU3RhdGUiLCJyZWNlaXZlTWFwQ29uZmlnVXBkYXRlciIsIl9yZWYyMCIsIl9yZWYyMCRwYXlsb2FkIiwicGF5bG9hZCIsIl9yZWYyMCRwYXlsb2FkJGNvbmZpZyIsIl9yZWYyMCRwYXlsb2FkJG9wdGlvbiIsIm9wdGlvbnMiLCJ2aXNTdGF0ZSIsImtlZXBFeGlzdGluZ0NvbmZpZyIsIm1lcmdlZFN0YXRlIiwiX2l0ZXJhdG9yMyIsIl9zdGVwMyIsIm1lcmdlciIsImlzVmFsaWRNZXJnZXIiLCJoYXNQcm9wc1RvTWVyZ2UiLCJtZXJnZSIsImdldFByb3BWYWx1ZVRvTWVyZ2VyIiwidG9NZXJnZVByb3AiLCJsYXllckhvdmVyVXBkYXRlciIsImluZm8iLCJpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIiLCJjb250cmFkaWN0IiwiayIsImxheWVyQ2xpY2tVcGRhdGVyIiwicGlubmVkIiwicGlja2VkIiwibWFwQ2xpY2tVcGRhdGVyIiwibW91c2VNb3ZlVXBkYXRlciIsIl9yZWYyMSIsImV2dCIsInBvaW50IiwibW91c2VQb3NpdGlvbiIsImxuZ0xhdCIsInRvZ2dsZVNwbGl0TWFwVXBkYXRlciIsImNvbXB1dGVTcGxpdE1hcExheWVycyIsImR1cGxpY2F0ZSIsImNsb3NlU3BlY2lmaWNNYXBBdEluZGV4IiwiX3JlZjIyIiwidXBkYXRlVmlzRGF0YVVwZGF0ZXIiLCJjcmVhdGVEYXRhc2V0VGFza3MiLCJub3RpZmljYXRpb25UYXNrcyIsIl9yZWYyMyIsImRhdGFzZXRJbmRleCIsIl9yZWYyMyRpbmZvIiwicmVzdCIsInRhc2siLCJjcmVhdGVOZXdEYXRhRW50cnkiLCJhZGROb3RpZmljYXRpb24iLCJlcnJvck5vdGlmaWNhdGlvbiIsIm1lc3NhZ2UiLCJkYXRhc2V0c0FsbFNldHRsZWRUYXNrIiwiYWxsU2V0dGxlZCIsInJlc3VsdHMiLCJjcmVhdGVOZXdEYXRhc2V0U3VjY2VzcyIsImFkZFRvTWFwT3B0aW9ucyIsInNldExvYWRpbmdJbmRpY2F0b3JVcGRhdGVyIiwicGF5bG9hZF8iLCJjaGFuZ2UiLCJ3aXRoVGFzayIsImNyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzVXBkYXRlciIsIl9hY3Rpb24kcGF5bG9hZCIsIm5ld0RhdGFFbnRyaWVzIiwic3RhdHVzIiwiQUNUSU9OX1RBU0siLCJyZWFzb24iLCJtZXJnZURhdGFzZXRzQnlPcmRlciIsImxheWVyTWVyZ2VycyIsIm0iLCJ3YWl0Rm9yTGF5ZXJEYXRhIiwiZGF0YXNldE1lcmdlcnMiLCJwb3N0TWVyZ2VyUGF5bG9hZCIsImFwcGx5TWVyZ2Vyc1VwZGF0ZXIiLCJtZXJnZVN0YXRlUmVzdWx0IiwibWVyZ2VTdGF0ZUZyb21NZXJnZXJzIiwiYWxsTWVyZ2VkIiwicG9zdE1lcmdlVXBkYXRlciIsImxheWVyVmlzQ29uZmlnRnJvbUFkZERhdGFPcHRpb25zIiwicGF0Y2giLCJsYXllclZpc0NvbmZpZyIsIl90eXBlb2YyIiwiZkRhdGFJZCIsImRhdGFzZXRGaWx0ZXJlZCIsImRhdGFFbXB0eSIsIm5ld0xheWVycyIsImF1dG9DcmVhdGVMYXllcnMiLCJhZGREZWZhdWx0TGF5ZXJzIiwibWVyZ2VMYXllclZpc0NvbmZpZ0Zvck5ld0RhdGFzZXRzIiwidG9vbHRpcEZpZWxkcyIsImF1dG9DcmVhdGVUb29sdGlwcyIsImFkZERlZmF1bHRUb29sdGlwcyIsInVwZGF0ZWREYXRhc2V0cyIsImNlbnRlck1hcCIsImJvdW5kcyIsImZpbmRNYXBCb3VuZHMiLCJmaXRCb3VuZHNUYXNrIiwiZml0TWFwQm91bmRzIiwicmVuYW1lRGF0YXNldFVwZGF0ZXIiLCJBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTIiwidmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMiLCJ2YWxpZGF0ZWRQcm9wcyIsImVudHJpZXMiLCJhY2MiLCJlbnRyeSIsIl9lbnRyeSIsIl9zbGljZWRUb0FycmF5MiIsImlzUmdiQ29sb3IiLCJpc1BsYWluT2JqZWN0IiwiZGVlcG1lcmdlIiwiZXhpc3RpbmciLCJjb3B5VGFibGVBbmRVcGRhdGUiLCJfc3RhdGUkc3BsaXRNYXBzJGluZGUiLCJpbmRleFRvUmV0cmlldmUiLCJtYXBMYXllcnMiLCJsb2FkRmlsZXNVcGRhdGVyIiwiZmlsZXMiLCJfYWN0aW9uJG9uRmluaXNoIiwib25GaW5pc2giLCJsb2FkRmlsZXNTdWNjZXNzIiwiaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MiLCJmaWxlQ2FjaGUiLCJmaWxlc1RvTG9hZCIsImxvYWROZXh0RmlsZVVwZGF0ZXIiLCJsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlciIsImZpbGVOYW1lIiwiX3N0YXRlJGZpbGVMb2FkaW5nIiwic3RhdGVXaXRoUHJvZ3Jlc3MiLCJ1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlciIsInByb2dyZXNzIiwicGVyY2VudCIsInN0YXRlV2l0aENhY2hlIiwiREVMQVlfVEFTSyIsImxvYWROZXh0RmlsZSIsIl9maWxlc1RvTG9hZCIsIl90b0FycmF5MiIsImZpbGUiLCJyZW1haW5pbmdGaWxlc1RvTG9hZCIsIm1ha2VMb2FkRmlsZVRhc2siLCJMT0FEX0ZJTEVfVEFTSyIsImJpbWFwIiwiZ2VuIiwibmV4dEZpbGVCYXRjaCIsInByb2Nlc3NGaWxlQ29udGVudCIsImNvbnRlbnQiLCJsb2FkRmlsZXNFcnIiLCJwcm9jZXNzRmlsZUNvbnRlbnRVcGRhdGVyIiwiX2FjdGlvbiRwYXlsb2FkMiIsIlBST0NFU1NfRklMRV9EQVRBIiwibG9hZEZpbGVTdGVwU3VjY2VzcyIsInBhcnNlUHJvZ3Jlc3MiLCJwcmV2UHJvZ3Jlc3MiLCJuZXh0RmlsZUJhdGNoVXBkYXRlciIsIl9yZWYyNCIsIl9hY2N1bXVsYXRlZCRkYXRhIiwiX3JlZjI0JHBheWxvYWQiLCJhY2N1bXVsYXRlZCIsImdldEFwcGxpY2F0aW9uQ29uZmlnIiwidXNlQXJyb3dQcm9ncmVzc2l2ZUxvYWRpbmciLCJlbmRzV2l0aCIsImRhdGEiLCJVTldSQVBfVEFTSyIsIl9yZWYyNSIsImxvYWRGaWxlc0VyclVwZGF0ZXIiLCJfcmVmMjYiLCJfc3RhdGUkZmlsZUxvYWRpbmcyIiwiYXBwbHlDUFVGaWx0ZXJVcGRhdGVyIiwiX3JlZjI3IiwiZGF0YUlkcyIsImZpbHRlckRhdGFzZXRDUFUiLCJzZXRNYXBJbmZvVXBkYXRlciIsImVtcHR5IiwiZGVmYXVsdExheWVycyIsImZvdW5kTGF5ZXJzIiwiZmluZERlZmF1bHRMYXllciIsImdldExheWVyT3JkZXJGcm9tTGF5ZXJzIiwiZmluZEZpZWxkc1RvU2hvdyIsIm1lcmdlZCIsIl9yZWYyOSIsImZpeGVkRG9tYWluIiwiX2NhbGN1bGF0ZUxheWVyRGF0YTciLCJfc3RhdGUkZmlsdGVycyIsImFuaW1hdGFibGVMYXllcnMiLCJsYXllckRvbWFpbnMiLCJtZXJnZWREb21haW4iLCJtZXJnZVRpbWVEb21haW5zIiwiZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyIiwibWVyZ2VkVGltZVN0ZXBzIiwic29ydCIsIkJBU0VfU1BFRUQiLCJGUFMiLCJzeW5jZWRGaWx0ZXIiLCJuZXdBbmltYXRpb25Eb21haW4iLCJpc0luUmFuZ2UiLCJzZXRFZGl0b3JNb2RlVXBkYXRlciIsIl9yZWYzMCIsInNldEZlYXR1cmVzVXBkYXRlciIsIl9yZWYzMSIsIl9sYXN0RmVhdHVyZSRwcm9wZXJ0aSIsIl9sYXN0RmVhdHVyZSRwcm9wZXJ0aTIiLCJfcmVmMzEkZmVhdHVyZXMiLCJsYXN0RmVhdHVyZSIsInByb3BlcnRpZXMiLCJpc0Nsb3NlZCIsInNoYXBlIiwiRURJVCIsImZlYXR1cmUiLCJiYm94IiwiZmVhdHVyZVZhbHVlIiwiZmlsdGVySWR4IiwiZmlsIiwic2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlciIsIl9yZWYzMiIsInNlbGVjdGlvbkNvbnRleHQiLCJkZWxldGVGZWF0dXJlVXBkYXRlciIsIl9yZWYzMyIsInNldFBvbHlnb25GaWx0ZXJMYXllclVwZGF0ZXIiLCJub25lRmlsdGVyRmVhdHVyZSIsIl9maWx0ZXIkbGF5ZXJJZCIsImlzTGF5ZXJJbmNsdWRlZCIsImdlbmVyYXRlUG9seWdvbkZpbHRlciIsInNldFBvbHlnb25GaWx0ZXJBbGxMYXllcnNVcGRhdGVyIiwidmlzaWJsZUxheWVySWRzIiwiYWxsTGF5ZXJJZHMiLCJzb3J0VGFibGVDb2x1bW5VcGRhdGVyIiwiX3JlZjM0IiwiY29sdW1uIiwic29ydE1vZGUiLCJjdXJyZW50TW9kZSIsIlNPUlRfT1JERVIiLCJBU0NFTkRJTkciLCJzb3J0ZWQiLCJzb3J0RGF0YXNldEJ5Q29sdW1uIiwicGluVGFibGVDb2x1bW5VcGRhdGVyIiwiX3JlZjM1IiwicGluVGFibGVDb2x1bW5zIiwiY29weVRhYmxlQ29sdW1uVXBkYXRlciIsIl9yZWYzNiIsImZpZWxkSWR4IiwidGV4dCIsImRhdGFDb250YWluZXIiLCJyb3ciLCJwYXJzZUZpZWxkVmFsdWUiLCJ2YWx1ZUF0Iiwiam9pbiIsImNvcHkiLCJzZXRDb2x1bW5EaXNwbGF5Rm9ybWF0VXBkYXRlciIsIl9yZWYzNyIsImZvcm1hdHMiLCJkaXNwbGF5Rm9ybWF0IiwiX2xheWVyJGNvbmZpZyIsImNvbG9yRmllbGQiLCJ0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlciIsInNldEZpbHRlckFuaW1hdGlvblRpbWVDb25maWdVcGRhdGVyIiwiX3JlZjM4IiwidXBkYXRlcyIsImNoZWNrVGltZUNvbmZpZ0FyZ3MiLCJhbGxvd2VkIiwic2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlciIsIl9yZWYzOSIsImxheWVyRmlsdGVyZWRJdGVtc0NoYW5nZVVwZGF0ZXIiLCJfbGF5ZXIkZmlsdGVyZWRJdGVtQ28iLCJldmVudCIsImRlY2tnbExheWVySWQiLCJjb3VudCIsImZpbHRlcmVkSXRlbUNvdW50Iiwid21zRmVhdHVyZUluZm9VcGRhdGVyIiwiZmVhdHVyZUluZm8iLCJjb25zb2xlIiwib2JqZWN0Iiwid21zRmVhdHVyZUluZm8iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28iLCJfbmV3U3RhdGUkYW5pbWF0aW9uQ28yIiwiX2FjdGlvbiRlbmFibGUiLCJpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzIiwiZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyIsImhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllciIsIkJvb2xlYW4iLCJuZXdGaWx0ZXJEb21haW4iLCJBTklNQVRJT05fV0lORE9XIiwiaW50ZXJ2YWwiLCJhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwiLCJuZXdGaWx0ZXJWYWx1ZSIsInN5bmNUaW1lbGluZU1vZGUiLCJTWU5DX1RJTUVMSU5FX01PREVTIiwiZW5kIiwidmFsaWRhdGVTeW5jQW5pbWF0aW9uTW9kZSIsIl9yZWY0MCIsIk1hdGgiLCJtYXgiLCJ0aW1lbGluZVZhbHVlIiwiZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIiLCJzbmFwVG9NYXJrcyIsImZyZWUiLCJfZmlsdGVyJHN5bmNUaW1lbGluZU0iLCJuZXdNb2RlIiwic3RhcnQiLCJpbnRlcnZhbEluZGV4IiwiY3VycmVudEluZGV4IiwibWV0YSIsInRhcmdldFRpbWVJbnRlcnZhbCIsIm5ld0luZGV4IiwiVElNRV9JTlRFUlZBTFNfT1JERVJFRCIsImhleFRpbGVJbnRlcnZhbCIsIkxheWVyVG9GaWx0ZXJUaW1lSW50ZXJ2YWwiLCJnZXREZWZhdWx0VGltZUZvcm1hdCIsInVwZGF0ZWRQbG90VHlwZSIsInVwZGF0ZVRpbWVGaWx0ZXJQbG90VHlwZSIsImFkanVzdFZhbHVlVG9BbmltYXRpb25XaW5kb3ciLCJkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJkYXRhSWRUb1JlcGxhY2UiLCJfdmFsdWUkY29uZmlnIiwiX3ZhbHVlJGNvbmZpZzIiLCJyZXBsYWNlZCIsImlzT2JqZWN0IiwiZmluZENoaWxkRGF0YXNldElkcyIsIl92YWx1ZSRuZXdEYXRhc2V0IiwiY2hpbGREYXRhSWRzIiwibW92ZVZhbHVlVG9CZU1lcmdlZCIsInByb3BWYWx1ZXMiLCJfcmVmNDIiLCJzYXZlVW5tZXJnZWQiLCJzdGF0ZVJlbW92ZWQiLCJwcm9wVmFsdWUiLCJwIiwidG9CZU1lcmdlZCIsInJlcGxhY2VEYXRhc2V0QW5kRGVwcyIsImRhdGFJZFRvVXNlIiwiY29tcG9zZV8iLCJhcHBseV8iLCJyZXBsYWNlRGF0YXNldERlcHNJblN0YXRlIiwicHJlcGFyZVN0YXRlRm9yRGF0YXNldFJlcGxhY2UiLCJfbmV4dFN0YXRlJGxheWVyVG9CZU0iLCJzZXJpYWxpemVkU3RhdGUiLCJzZXJpYWxpemVWaXNTdGF0ZSIsInByZXNlcnZlTGF5ZXJPcmRlciIsInByZXNlcnZlRGF0YXNldE9yZGVyIiwiX3NlcmlhbGl6ZWRTdGF0ZSRzcGxpIiwiX3JlZjQzIiwiYWNjdVN0YXRlIiwiX3JlZjQ0IiwicmVwbGFjZVBhcmVudERhdGFzZXRJZHMiLCJnZXRDaGlsZERhdGFzZXRJZHMiLCJwcmVzZXJ2ZU9yZGVyIiwidG9NZXJnZVByb3BzIiwic2F2ZWRQcm9wcyIsInJlcGxhY2VkU3RhdGUiLCJfcmVwbGFjZWRTdGF0ZSRtZXJnZXIiLCJtZXJnZXJPcHRpb25zIiwicmVwbGFjZWRJdGVtIiwicmVwbGFjZVByb3BWYWx1ZUluU3RhdGUiLCJpdGVtIiwiX3JlZjQ1IiwiY2hpbGREYXRhSWQiXSwic291cmNlcyI6WyIuLi9zcmMvdmlzLXN0YXRlLXVwZGF0ZXJzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBNSVRcbi8vIENvcHlyaWdodCBjb250cmlidXRvcnMgdG8gdGhlIGtlcGxlci5nbCBwcm9qZWN0XG5cbmltcG9ydCBiYm94IGZyb20gJ0B0dXJmL2Jib3gnO1xuaW1wb3J0IGNvcHkgZnJvbSAnY29weS10by1jbGlwYm9hcmQnO1xuaW1wb3J0IGRlZXBtZXJnZSBmcm9tICdkZWVwbWVyZ2UnO1xuaW1wb3J0IHtjb25zb2xlIGFzIENvbnNvbGV9IGZyb20gJ2dsb2JhbC93aW5kb3cnO1xuaW1wb3J0IGNsb25lRGVlcCBmcm9tICdsb2Rhc2gvY2xvbmVEZWVwJztcbmltcG9ydCBnZXQgZnJvbSAnbG9kYXNoL2dldCc7XG5pbXBvcnQgaXNFcXVhbCBmcm9tICdsb2Rhc2gvaXNFcXVhbCc7XG5pbXBvcnQgcGljayBmcm9tICdsb2Rhc2gvcGljayc7XG5pbXBvcnQgdW5pcSBmcm9tICdsb2Rhc2gvdW5pcSc7XG5pbXBvcnQgeG9yIGZyb20gJ2xvZGFzaC94b3InO1xuaW1wb3J0IFRhc2ssIHtkaXNhYmxlU3RhY2tDYXB0dXJpbmcsIHdpdGhUYXNrfSBmcm9tICdyZWFjdC1wYWxtL3Rhc2tzJztcbi8vIFRhc2tzXG5pbXBvcnQge1xuICBERUxBWV9UQVNLLFxuICBBQ1RJT05fVEFTSyxcbiAgTE9BRF9GSUxFX1RBU0ssXG4gIFBST0NFU1NfRklMRV9EQVRBLFxuICBVTldSQVBfVEFTS1xufSBmcm9tICdAa2VwbGVyLmdsL3Rhc2tzJztcbi8vIEFjdGlvbnNcbmltcG9ydCB7XG4gIGFkZE5vdGlmaWNhdGlvbixcbiAgQWN0aW9uVHlwZXMsXG4gIENyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzUGF5bG9hZCxcbiAgTWFwU3RhdGVBY3Rpb25zLFxuICBSZWNlaXZlTWFwQ29uZmlnUGF5bG9hZCxcbiAgVmlzU3RhdGVBY3Rpb25zLFxuICBhcHBseUxheWVyQ29uZmlnLFxuICBjcmVhdGVOZXdEYXRhc2V0U3VjY2VzcyxcbiAgbGF5ZXJDb25maWdDaGFuZ2UsXG4gIGxheWVyVHlwZUNoYW5nZSxcbiAgbGF5ZXJWaXNDb25maWdDaGFuZ2UsXG4gIGxheWVyVmlzdWFsQ2hhbm5lbENvbmZpZ0NoYW5nZSxcbiAgbG9hZEZpbGVTdGVwU3VjY2VzcyxcbiAgbG9hZEZpbGVzRXJyLFxuICBsb2FkRmlsZXNTdWNjZXNzLFxuICBsb2FkTmV4dEZpbGUsXG4gIG5leHRGaWxlQmF0Y2gsXG4gIHNldEZpbHRlcixcbiAgcHJvY2Vzc0ZpbGVDb250ZW50LFxuICBmaXRCb3VuZHMgYXMgZml0TWFwQm91bmRzLFxuICB0b2dnbGVMYXllckZvck1hcCxcbiAgYXBwbHlGaWx0ZXJDb25maWcsXG4gIFNldExvYWRpbmdJbmRpY2F0b3JQYXlsb2FkXG59IGZyb20gJ0BrZXBsZXIuZ2wvYWN0aW9ucyc7XG5cbi8vIFV0aWxzXG5pbXBvcnQge1xuICBGSUxURVJfVVBEQVRFUl9QUk9QUyxcbiAgYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcCxcbiAgc25hcFRvTWFya3MsXG4gIGFwcGx5RmlsdGVyRmllbGROYW1lLFxuICBhcHBseUZpbHRlcnNUb0RhdGFzZXRzLFxuICBhcnJheUluc2VydCxcbiAgY29tcHV0ZVNwbGl0TWFwTGF5ZXJzLFxuICBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluLFxuICBlcnJvck5vdGlmaWNhdGlvbixcbiAgZmVhdHVyZVRvRmlsdGVyVmFsdWUsXG4gIGZpbHRlckRhdGFzZXRDUFUsXG4gIGdlbmVyYXRlUG9seWdvbkZpbHRlcixcbiAgZ2V0RGVmYXVsdEZpbHRlcixcbiAgZ2V0RmlsdGVySWRJbkZlYXR1cmUsXG4gIGdldFRpbWVXaWRnZXRUaXRsZUZvcm1hdHRlcixcbiAgaXNJblJhbmdlLFxuICBpc09iamVjdCxcbiAgaXNQbGFpbk9iamVjdCxcbiAgaXNSZ2JDb2xvcixcbiAgcGFyc2VGaWVsZFZhbHVlLFxuICByZW1vdmVMYXllckZyb21TcGxpdE1hcHMsXG4gIHNldCxcbiAgdXBkYXRlRmlsdGVyUGxvdCxcbiAgcmVtb3ZlRmlsdGVyUGxvdCxcbiAgaXNMYXllckFuaW1hdGFibGUsXG4gIGlzU2lkZUZpbHRlcixcbiAgZ2V0QXBwbGljYXRpb25Db25maWdcbn0gZnJvbSAnQGtlcGxlci5nbC91dGlscyc7XG5pbXBvcnQge2dlbmVyYXRlSGFzaElkLCB0b0FycmF5fSBmcm9tICdAa2VwbGVyLmdsL2NvbW1vbi11dGlscyc7XG4vLyBNZXJnZXJzXG5pbXBvcnQge1xuICBBTklNQVRJT05fV0lORE9XLFxuICBCQVNFX1NQRUVELFxuICBDT01QQVJFX1RZUEVTLFxuICBERUZBVUxUX1RFWFRfTEFCRUwsXG4gIEVESVRPUl9NT0RFUyxcbiAgRklMVEVSX1RZUEVTLFxuICBGSUxURVJfVklFV19UWVBFUyxcbiAgRlBTLFxuICBMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVCxcbiAgRElTVEFOQ0VfRk9HX1RZUEUsXG4gIFNVUkZBQ0VfRk9HX1RZUEUsXG4gIE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuICBQTE9UX1RZUEVTLFxuICBTT1JUX09SREVSLFxuICBTWU5DX1RJTUVMSU5FX01PREVTLFxuICBDSEFOTkVMX1NDQUxFUyxcbiAgU0NBTEVfVFlQRVMsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9LSU5ELFxuICBJTklUSUFMX0FOTk9UQVRJT05fQU5HTEUsXG4gIElOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RILFxuICBJTklUSUFMX0FOTk9UQVRJT05fVEVYVF9XSURUSCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX1RFWFRfSEVJR0hULFxuICBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gIEFubm90YXRpb25LaW5kXG59IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7TEFZRVJfSURfTEVOR1RILCBMYXllciwgTGF5ZXJDbGFzc2VzfSBmcm9tICdAa2VwbGVyLmdsL2xheWVycyc7XG5pbXBvcnQge1xuICBhcHBseV8sXG4gIGNvbXBvc2VfLFxuICBmaWx0ZXJPdXRCeUlkLFxuICBtZXJnZV8sXG4gIHBheWxvYWRfLFxuICBwaWNrXyxcbiAgcmVtb3ZlRWxlbWVudEF0SW5kZXgsXG4gIHN3YXBfXG59IGZyb20gJy4vY29tcG9zZXItaGVscGVycyc7XG5pbXBvcnQge2lzVmFsaWRNZXJnZXIsIG1lcmdlU3RhdGVGcm9tTWVyZ2Vyc30gZnJvbSAnLi9tZXJnZXItaGFuZGxlcic7XG5pbXBvcnQge1xuICBWSVNfU1RBVEVfTUVSR0VSUyxcbiAgY3JlYXRlTGF5ZXJGcm9tQ29uZmlnLFxuICBwYXJzZUxheWVyQ29uZmlnLFxuICBzZXJpYWxpemVGaWx0ZXIsXG4gIHNlcmlhbGl6ZUxheWVyLFxuICBzZXJpYWxpemVWaXNTdGF0ZSxcbiAgdmFsaWRhdGVMYXllcldpdGhEYXRhXG59IGZyb20gJy4vdmlzLXN0YXRlLW1lcmdlcic7XG5cbmltcG9ydCBLZXBsZXJHTFNjaGVtYSwge01lcmdlciwgUG9zdE1lcmdlclBheWxvYWQsIFZpc1N0YXRlfSBmcm9tICdAa2VwbGVyLmdsL3NjaGVtYXMnO1xuXG5pbXBvcnQge1xuICBGaWx0ZXIsXG4gIEludGVyYWN0aW9uQ29uZmlnLFxuICBBbmltYXRpb25Db25maWcsXG4gIEZpbHRlckFuaW1hdGlvbkNvbmZpZyxcbiAgRWRpdG9yLFxuICBGaWVsZCxcbiAgTGF5ZXJWaXNDb25maWcsXG4gIFRpbWVSYW5nZUZpbHRlcixcbiAgQW5ub3RhdGlvbixcbiAgQW5ub3RhdGlvblByb3BzUGFydGlhbFxufSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB7TG9hZGVyfSBmcm9tICdAbG9hZGVycy5nbC9sb2FkZXItdXRpbHMnO1xuXG5pbXBvcnQge1xuICBEYXRhc2V0cyxcbiAgYXNzaWduR3B1Q2hhbm5lbCxcbiAgY29weVRhYmxlQW5kVXBkYXRlLFxuICBjcmVhdGVOZXdEYXRhRW50cnksXG4gIHBpblRhYmxlQ29sdW1ucyxcbiAgc2V0RmlsdGVyR3B1TW9kZSxcbiAgc29ydERhdGFzZXRCeUNvbHVtblxufSBmcm9tICdAa2VwbGVyLmdsL3RhYmxlJztcbmltcG9ydCB7ZmluZEZpZWxkc1RvU2hvd30gZnJvbSAnLi9pbnRlcmFjdGlvbi11dGlscyc7XG5pbXBvcnQge1xuICBjYWxjdWxhdGVMYXllckRhdGEsXG4gIGZpbmREZWZhdWx0TGF5ZXIsXG4gIGdldExheWVyT3JkZXJGcm9tTGF5ZXJzLFxuICBtZXJnZUxheWVyVmlzQ29uZmlnRm9yTmV3RGF0YXNldHNcbn0gZnJvbSAnLi9sYXllci11dGlscyc7XG5pbXBvcnQge2dldFByb3BWYWx1ZVRvTWVyZ2VyLCBoYXNQcm9wc1RvTWVyZ2V9IGZyb20gJy4vbWVyZ2VyLWhhbmRsZXInO1xuaW1wb3J0IHttZXJnZURhdGFzZXRzQnlPcmRlcn0gZnJvbSAnLi92aXMtc3RhdGUtbWVyZ2VyJztcbmltcG9ydCB7XG4gIGZpeEVmZmVjdE9yZGVyLFxuICBnZXRBbmltYXRhYmxlVmlzaWJsZUxheWVycyxcbiAgZ2V0SW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyxcbiAgbWVyZ2VUaW1lRG9tYWlucyxcbiAgYWRqdXN0VmFsdWVUb0FuaW1hdGlvbldpbmRvdyxcbiAgdXBkYXRlVGltZUZpbHRlclBsb3RUeXBlLFxuICBnZXREZWZhdWx0VGltZUZvcm1hdCxcbiAgTGF5ZXJUb0ZpbHRlclRpbWVJbnRlcnZhbCxcbiAgVElNRV9JTlRFUlZBTFNfT1JERVJFRCxcbiAgbWVyZ2VGaWx0ZXJEb21haW4sXG4gIGluaXRDdXN0b21QYWxldHRlQnlDdXN0b21TY2FsZVxufSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7Y3JlYXRlRWZmZWN0fSBmcm9tICdAa2VwbGVyLmdsL2VmZmVjdHMnO1xuaW1wb3J0IHtQYXlsb2FkQWN0aW9ufSBmcm9tICdAcmVkdXhqcy90b29sa2l0JztcblxuaW1wb3J0IHtmaW5kTWFwQm91bmRzfSBmcm9tICcuL2RhdGEtdXRpbHMnO1xuXG4vLyByZWFjdC1wYWxtXG4vLyBkaXNhYmxlIGNhcHR1cmUgZXhjZXB0aW9uIGZvciByZWFjdC1wYWxtIGNhbGwgdG8gd2l0aFRhc2tcbmRpc2FibGVTdGFja0NhcHR1cmluZygpO1xuXG4vKipcbiAqIFVwZGF0ZXJzIGZvciBgdmlzU3RhdGVgIHJlZHVjZXIuIENhbiBiZSB1c2VkIGluIHlvdXIgcm9vdCByZWR1Y2VyIHRvIGRpcmVjdGx5IG1vZGlmeSBrZXBsZXIuZ2wncyBzdGF0ZS5cbiAqIFJlYWQgbW9yZSBhYm91dCBbVXNpbmcgdXBkYXRlcnNdKC4uL2FkdmFuY2VkLXVzYWdlL3VzaW5nLXVwZGF0ZXJzLm1kKVxuICpcbiAqIEBwdWJsaWNcbiAqIEBleGFtcGxlXG4gKlxuICogaW1wb3J0IGtlcGxlckdsUmVkdWNlciwge3Zpc1N0YXRlVXBkYXRlcnN9IGZyb20gJ0BrZXBsZXIuZ2wvcmVkdWNlcnMnO1xuICogLy8gUm9vdCBSZWR1Y2VyXG4gKiBjb25zdCByZWR1Y2VycyA9IGNvbWJpbmVSZWR1Y2Vycyh7XG4gKiAga2VwbGVyR2w6IGtlcGxlckdsUmVkdWNlcixcbiAqICBhcHA6IGFwcFJlZHVjZXJcbiAqIH0pO1xuICpcbiAqIGNvbnN0IGNvbXBvc2VkUmVkdWNlciA9IChzdGF0ZSwgYWN0aW9uKSA9PiB7XG4gKiAgc3dpdGNoIChhY3Rpb24udHlwZSkge1xuICogICAgY2FzZSAnQ0xJQ0tfQlVUVE9OJzpcbiAqICAgICAgcmV0dXJuIHtcbiAqICAgICAgICAuLi5zdGF0ZSxcbiAqICAgICAgICBrZXBsZXJHbDoge1xuICogICAgICAgICAgLi4uc3RhdGUua2VwbGVyR2wsXG4gKiAgICAgICAgICBmb286IHtcbiAqICAgICAgICAgICAgIC4uLnN0YXRlLmtlcGxlckdsLmZvbyxcbiAqICAgICAgICAgICAgIHZpc1N0YXRlOiB2aXNTdGF0ZVVwZGF0ZXJzLmVubGFyZ2VGaWx0ZXJVcGRhdGVyKFxuICogICAgICAgICAgICAgICBzdGF0ZS5rZXBsZXJHbC5mb28udmlzU3RhdGUsXG4gKiAgICAgICAgICAgICAgIHtpZHg6IDB9XG4gKiAgICAgICAgICAgICApXG4gKiAgICAgICAgICB9XG4gKiAgICAgICAgfVxuICogICAgICB9O1xuICogIH1cbiAqICByZXR1cm4gcmVkdWNlcnMoc3RhdGUsIGFjdGlvbik7XG4gKiB9O1xuICpcbiAqIGV4cG9ydCBkZWZhdWx0IGNvbXBvc2VkUmVkdWNlcjtcbiAqL1xuLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4vLyBAdHMtaWdub3JlXG5jb25zdCB2aXNTdGF0ZVVwZGF0ZXJzID0gbnVsbDtcbi8qIGVzbGludC1lbmFibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0SW50ZXJhY3Rpb25Db25maWc6IEludGVyYWN0aW9uQ29uZmlnID0ge1xuICB0b29sdGlwOiB7XG4gICAgaWQ6ICd0b29sdGlwJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy50b29sdGlwJyxcbiAgICBlbmFibGVkOiB0cnVlLFxuICAgIGNvbmZpZzoge1xuICAgICAgZmllbGRzVG9TaG93OiB7fSxcbiAgICAgIGNvbXBhcmVNb2RlOiBmYWxzZSxcbiAgICAgIGNvbXBhcmVUeXBlOiBDT01QQVJFX1RZUEVTLkFCU09MVVRFXG4gICAgfVxuICB9LFxuICBnZW9jb2Rlcjoge1xuICAgIGlkOiAnZ2VvY29kZXInLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmdlb2NvZGVyJyxcbiAgICBlbmFibGVkOiBmYWxzZSxcbiAgICBwb3NpdGlvbjogbnVsbCxcbiAgICBjb25maWc6IHtcbiAgICAgIGxpbWl0U2VhcmNoOiBmYWxzZVxuICAgIH1cbiAgfSxcbiAgYnJ1c2g6IHtcbiAgICBpZDogJ2JydXNoJyxcbiAgICBsYWJlbDogJ2ludGVyYWN0aW9ucy5icnVzaCcsXG4gICAgZW5hYmxlZDogZmFsc2UsXG4gICAgY29uZmlnOiB7XG4gICAgICAvLyBzaXplIGlzIGluIGttXG4gICAgICBzaXplOiAwLjVcbiAgICB9XG4gIH0sXG4gIGNvb3JkaW5hdGU6IHtcbiAgICBpZDogJ2Nvb3JkaW5hdGUnLFxuICAgIGxhYmVsOiAnaW50ZXJhY3Rpb25zLmNvb3JkaW5hdGUnLFxuICAgIGVuYWJsZWQ6IGZhbHNlLFxuICAgIHBvc2l0aW9uOiBudWxsXG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0FOSU1BVElPTl9DT05GSUc6IEFuaW1hdGlvbkNvbmZpZyA9IHtcbiAgZG9tYWluOiBudWxsLFxuICBjdXJyZW50VGltZTogbnVsbCxcbiAgc3BlZWQ6IDEsXG4gIGlzQW5pbWF0aW5nOiBmYWxzZSxcbiAgdGltZVN0ZXBzOiBudWxsLFxuICB0aW1lRm9ybWF0OiBudWxsLFxuICB0aW1lem9uZTogbnVsbCxcbiAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGwsXG4gIGhpZGVDb250cm9sOiBmYWxzZSxcbiAgZHVyYXRpb246IG51bGxcbn07XG5cbmV4cG9ydCBjb25zdCBERUZBVUxUX0VESVRPUjogRWRpdG9yID0ge1xuICBtb2RlOiBFRElUT1JfTU9ERVMuRFJBV19QT0xZR09OLFxuICBmZWF0dXJlczogW10sXG4gIHNlbGVjdGVkRmVhdHVyZTogbnVsbCxcbiAgdmlzaWJsZTogdHJ1ZVxufTtcblxuLyoqXG4gKiBEZWZhdWx0IGluaXRpYWwgYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBjb25zdGFudFxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgSU5JVElBTF9WSVNfU1RBVEU6IFZpc1N0YXRlID0ge1xuICAvLyBtYXAgaW5mb1xuICBtYXBJbmZvOiB7XG4gICAgdGl0bGU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJ1xuICB9LFxuICAvLyBsYXllcnNcbiAgbGF5ZXJzOiBbXSxcbiAgbGF5ZXJEYXRhOiBbXSxcbiAgbGF5ZXJUb0JlTWVyZ2VkOiBbXSxcbiAgbGF5ZXJPcmRlcjogW10sXG5cbiAgLy8gZmlsdGVyc1xuICBmaWx0ZXJzOiBbXSxcbiAgZmlsdGVyVG9CZU1lcmdlZDogW10sXG5cbiAgLy8gYSBjb2xsZWN0aW9uIG9mIG11bHRpcGxlIGRhdGFzZXRcbiAgZGF0YXNldHM6IHt9LFxuICBlZGl0aW5nRGF0YXNldDogdW5kZWZpbmVkLFxuXG4gIC8vIGVmZmVjdHNcbiAgZWZmZWN0czogW10sXG4gIGVmZmVjdE9yZGVyOiBbXSxcblxuICAvLyBhbm5vdGF0aW9uc1xuICBhbm5vdGF0aW9uczogW10sXG4gIGFubm90YXRpb25zVG9CZU1lcmdlZDogW10sXG4gIHNlbGVjdGVkQW5ub3RhdGlvbklkOiBudWxsLFxuICBpc0VkaXRpbmdBbm5vdGF0aW9uVGV4dDogZmFsc2UsXG5cbiAgaW50ZXJhY3Rpb25Db25maWc6IGRlZmF1bHRJbnRlcmFjdGlvbkNvbmZpZyxcbiAgaW50ZXJhY3Rpb25Ub0JlTWVyZ2VkOiB7fSxcblxuICBsYXllckJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgb3ZlcmxheUJsZW5kaW5nOiAnbm9ybWFsJyxcbiAgaG92ZXJJbmZvOiB1bmRlZmluZWQsXG4gIGNsaWNrZWQ6IHVuZGVmaW5lZCxcbiAgbW91c2VQb3M6IHt9LFxuICBtYXhEZWZhdWx0VG9vbHRpcHM6IE1BWF9ERUZBVUxUX1RPT0xUSVBTLFxuXG4gIC8vIHRoaXMgaXMgdXNlZCB3aGVuIHVzZXIgc3BsaXQgbWFwc1xuICBzcGxpdE1hcHM6IFtcbiAgICAvLyB0aGlzIHdpbGwgY29udGFpbiBhIGxpc3Qgb2Ygb2JqZWN0cyB0b1xuICAgIC8vIGRlc2NyaWJlIHRoZSBzdGF0ZSBvZiBsYXllciBhdmFpbGFiaWxpdHkgYW5kIHZpc2liaWxpdHkgZm9yIGVhY2ggbWFwXG4gICAgLy8gW1xuICAgIC8vICAge1xuICAgIC8vICAgICAgbGF5ZXJzOiB7bGF5ZXJfaWQ6IHRydWUgfCBmYWxzZX1cbiAgICAvLyAgIH1cbiAgICAvLyBdXG4gIF0sXG4gIHNwbGl0TWFwc1RvQmVNZXJnZWQ6IFtdLFxuICBpc01lcmdpbmdEYXRhc2V0czoge30sXG4gIC8vIGRlZmF1bHRzIGxheWVyIGNsYXNzZXNcbiAgbGF5ZXJDbGFzc2VzOiBMYXllckNsYXNzZXMsXG5cbiAgLy8gZGVmYXVsdCBhbmltYXRpb25cbiAgLy8gdGltZSBpbiB1bml4IHRpbWVzdGFtcCAobWlsbGlzZWNvbmRzKSAodGhlIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIHRoZSBVbml4IEVwb2NoKVxuICBhbmltYXRpb25Db25maWc6IERFRkFVTFRfQU5JTUFUSU9OX0NPTkZJRyxcblxuICBlZGl0b3I6IERFRkFVTFRfRURJVE9SLFxuXG4gIGZpbGVMb2FkaW5nOiBmYWxzZSxcbiAgZmlsZUxvYWRpbmdQcm9ncmVzczoge30sXG4gIC8vIGZvciBsb2FkaW5nIGRhdGFzZXRzXG4gIGxvYWRpbmdJbmRpY2F0b3JWYWx1ZTogMCxcblxuICBsb2FkZXJzOiBbXSxcbiAgbG9hZE9wdGlvbnM6IHt9LFxuXG4gIC8vIHZpc1N0YXRlTWVyZ2Vyc1xuICBtZXJnZXJzOiBWSVNfU1RBVEVfTUVSR0VSUyxcblxuICAvLyBrZXBsZXIgc2NoZW1hc1xuICBzY2hlbWE6IEtlcGxlckdMU2NoZW1hXG59O1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1RBU0tfRklUX0JPVU5EUyA9IFRhc2suZnJvbUNhbGxiYWNrKFxuICAoXywgY2IpID0+IGNiKCksXG5cbiAgJ0FDVElPTl9UQVNLX0ZJVF9CT1VORFMnXG4pO1xuXG5leHBvcnQgY29uc3QgQUNUSU9OX1RBU0tfQUREX05PVElGSUNBVElPTiA9IFRhc2suZnJvbUNhbGxiYWNrKFxuICAoXywgY2IpID0+IGNiKCksXG5cbiAgJ0FDVElPTl9UQVNLX0FERF9OT1RJRklDQVRJT04nXG4pO1xuXG50eXBlIFVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YVR5cGUgPSB7XG4gIGxheWVyczogTGF5ZXJbXTtcbiAgbGF5ZXJEYXRhOiBhbnlbXTtcbn07XG5cbi8qKlxuICogVXBkYXRlIHN0YXRlIHdpdGggdXBkYXRlZCBsYXllciBhbmQgbGF5ZXJEYXRhXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhPFMgZXh0ZW5kcyBVcGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGFUeXBlPihcbiAgc3RhdGU6IFMsXG4gIHtsYXllckRhdGEsIGxheWVyLCBpZHh9OiB7bGF5ZXJEYXRhPzogYW55OyBsYXllcjogTGF5ZXI7IGlkeDogbnVtYmVyfVxuKTogUyB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKChseXIsIGkpID0+IChpID09PSBpZHggPyBsYXllciA6IGx5cikpLFxuICAgIGxheWVyRGF0YTogbGF5ZXJEYXRhXG4gICAgICA/IHN0YXRlLmxheWVyRGF0YS5tYXAoKGQsIGkpID0+IChpID09PSBpZHggPyBsYXllckRhdGEgOiBkKSlcbiAgICAgIDogc3RhdGUubGF5ZXJEYXRhXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdGF0ZU9uTGF5ZXJWaXNpYmlsaXR5Q2hhbmdlPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGxheWVyOiBMYXllcik6IFMge1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgaWYgKHN0YXRlLnNwbGl0TWFwcy5sZW5ndGgpIHtcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICAgID8gYWRkTmV3TGF5ZXJzVG9TcGxpdE1hcChzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgICAgICA6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyKVxuICAgIH07XG4gIH1cblxuICBpZiAobGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIENvbXBhcmVzIHR3byBvYmplY3RzIChvciBhcnJheXMpIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB3aXRoIG9ubHkgdGhlXG4gKiBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBjaGFuZ2VkIGJldHdlZW4gdGhlIHR3byBvYmplY3RzLlxuICovXG5mdW5jdGlvbiBwaWNrQ2hhbmdlZFByb3BzPFQ+KHByZXY6IFQsIG5leHQ6IFQpOiBQYXJ0aWFsPFQ+IHtcbiAgY29uc3QgY2hhbmdlZFByb3BzOiBQYXJ0aWFsPFQ+ID0ge307XG4gIGNvbnN0IHBpY2tQcm9wc09mID0gb2JqID0+IHtcbiAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjaGFuZ2VkUHJvcHMsIGtleSkgJiZcbiAgICAgICAgIWlzRXF1YWwocHJldltrZXldLCBuZXh0W2tleV0pXG4gICAgICApIHtcbiAgICAgICAgY2hhbmdlZFByb3BzW2tleV0gPSBuZXh0W2tleV07XG4gICAgICB9XG4gICAgfSk7XG4gIH07XG4gIHBpY2tQcm9wc09mKHByZXYpO1xuICBwaWNrUHJvcHNPZihuZXh0KTtcbiAgcmV0dXJuIGNoYW5nZWRQcm9wcztcbn1cblxuY29uc3QgVklTVUFMX0NIQU5ORUxfUFJPUF9UWVBFUyA9IFsnZmllbGQnLCAnc2NhbGUnLCAnZG9tYWluJywgJ2FnZ3JlZ2F0aW9uJ107XG5cbi8qKlxuICogQXBwbHkgbGF5ZXIgY29uZmlnXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5LCBtYXgtc3RhdGVtZW50c1xuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5TGF5ZXJDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFwcGx5TGF5ZXJDb25maWdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllcklkLCBuZXdMYXllckNvbmZpZywgbGF5ZXJJbmRleH0gPSBhY3Rpb247XG4gIGNvbnN0IG5ld1BhcnNlZExheWVyID1cbiAgICAvLyB3aWxsIG1vdmUgdmlzdWFsQ2hhbm5lbHMgdG8gdGhlIGNvbmZpZyBwcm9wXG4gICAgcGFyc2VMYXllckNvbmZpZyhzdGF0ZS5zY2hlbWEsIG5ld0xheWVyQ29uZmlnKTtcbiAgY29uc3Qgb2xkTGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICBpZiAoIW9sZExheWVyIHx8ICFuZXdQYXJzZWRMYXllcikge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAobGF5ZXJJbmRleCAhPT0gbnVsbCAmJiBsYXllckluZGV4ICE9PSB1bmRlZmluZWQgJiYgc3RhdGUubGF5ZXJzW2xheWVySW5kZXhdICE9PSBvbGRMYXllcikge1xuICAgIC8vIGxheWVySW5kZXggaXMgcHJvdmlkZWQsIGJ1dCBpdCBkb2Vzbid0IG1hdGNoIHRoZSBvbGRMYXllclxuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbbmV3UGFyc2VkTGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICAvLyBNYWtlIHN1cmUgdGhlIGxheWVyIGlzIHZhbGlkIGFuZCBjb252ZXJ0IGl0IHRvIExheWVyXG4gIGNvbnN0IG5ld0xheWVyID0gdmFsaWRhdGVMYXllcldpdGhEYXRhKGRhdGFzZXQsIG5ld1BhcnNlZExheWVyLCBzdGF0ZS5sYXllckNsYXNzZXMpO1xuICBpZiAoIW5ld0xheWVyKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgbGV0IG5leHRTdGF0ZSA9IHN0YXRlO1xuXG4gIGlmIChuZXdMYXllci50eXBlICYmIG5ld0xheWVyLnR5cGUgIT09IG9sZExheWVyLnR5cGUpIHtcbiAgICBjb25zdCBvbGRMYXllckluZGV4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVySWQpO1xuICAgIGlmIChvbGRMYXllckluZGV4ID49IDApIHtcbiAgICAgIG5leHRTdGF0ZSA9IGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIobmV4dFN0YXRlLCBsYXllclR5cGVDaGFuZ2Uob2xkTGF5ZXIsIG5ld0xheWVyLnR5cGUpKTtcbiAgICAgIC8vIGxheWVyVHlwZUNoYW5nZVVwZGF0ZXIgY2hhbmdlcyB0aGUgaWQgb2YgdGhlIGxheWVyLCBzbyB3ZSBuZWVkIHRvIG9idGFpbiB0aGUgbmV3IGlkXG4gICAgICAvLyBidXQgZmlyc3QgbWFrZSBzdXJlIHRoYXQgdGhlIGxheWVyIHdhcyBub3QgcmVtb3ZlZFxuICAgICAgaWYgKG5leHRTdGF0ZS5sYXllcnMubGVuZ3RoID09PSBzdGF0ZS5sYXllcnMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IG5ld0xheWVySWQgPSBuZXh0U3RhdGUubGF5ZXJzW29sZExheWVySW5kZXhdLmlkO1xuICAgICAgICBuZXh0U3RhdGUgPSBhcHBseUxheWVyQ29uZmlnVXBkYXRlcihcbiAgICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgICAgYXBwbHlMYXllckNvbmZpZyhuZXdMYXllcklkLCB7Li4ubmV3TGF5ZXJDb25maWcsIGlkOiBuZXdMYXllcklkfSlcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5leHRTdGF0ZTtcbiAgfVxuXG4gIC8vIHNlcmlhbGl6ZUxheWVyKCkgbWlnaHQgcmV0dXJuIG51bGwgaWYgdGhlIG9sZCBsYXllciBpcyBub3QgdmFsaWQsXG4gIC8vIHdlIHNob3VsZCBzdGlsbCBhcHBseSB0aGUgY2hhbmdlcyBpbiB0aGF0IGNhc2VcbiAgY29uc3Qgc2VyaWFsaXplZE9sZExheWVyID0gc2VyaWFsaXplTGF5ZXIob2xkTGF5ZXIsIHN0YXRlLnNjaGVtYSkgPz8ge2NvbmZpZzoge319O1xuICBjb25zdCBzZXJpYWxpemVkTmV3TGF5ZXIgPSBzZXJpYWxpemVMYXllcihuZXdMYXllciwgc3RhdGUuc2NoZW1hKTtcbiAgaWYgKCFzZXJpYWxpemVkTmV3TGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKCFpc0VxdWFsKHNlcmlhbGl6ZWRPbGRMYXllciwgc2VyaWFsaXplZE5ld0xheWVyKSkge1xuICAgIGNvbnN0IGNoYW5nZWQgPSBwaWNrQ2hhbmdlZFByb3BzKHNlcmlhbGl6ZWRPbGRMYXllci5jb25maWcsIHNlcmlhbGl6ZWROZXdMYXllci5jb25maWcpO1xuXG4gICAgaWYgKCd2aXNDb25maWcnIGluIGNoYW5nZWQpIHtcbiAgICAgIGlmIChjaGFuZ2VkLnZpc0NvbmZpZykge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc0NvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gICAgICAgICAgbmV4dFN0YXRlLFxuICAgICAgICAgIGxheWVyVmlzQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBjaGFuZ2VkLnZpc0NvbmZpZylcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGRlbGV0ZSBjaGFuZ2VkLnZpc0NvbmZpZztcbiAgICB9XG5cbiAgICBPYmplY3Qua2V5cyhvbGRMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaChjaGFubmVsTmFtZSA9PiB7XG4gICAgICBjb25zdCBjaGFubmVsID0gb2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbE5hbWVdO1xuICAgICAgY29uc3QgY2hhbm5lbFByb3BOYW1lcyA9IFZJU1VBTF9DSEFOTkVMX1BST1BfVFlQRVMubWFwKHByb3AgPT4gY2hhbm5lbFtwcm9wXSk7XG4gICAgICBpZiAoY2hhbm5lbFByb3BOYW1lcy5zb21lKHByb3AgPT4gcHJvcCBpbiBjaGFuZ2VkKSkge1xuICAgICAgICBuZXh0U3RhdGUgPSBsYXllclZpc3VhbENoYW5uZWxDaGFuZ2VVcGRhdGVyKFxuICAgICAgICAgIG5leHRTdGF0ZSxcbiAgICAgICAgICBsYXllclZpc3VhbENoYW5uZWxDb25maWdDaGFuZ2UoXG4gICAgICAgICAgICBvbGRMYXllcixcbiAgICAgICAgICAgIHBpY2sobmV3TGF5ZXIuY29uZmlnLCBjaGFubmVsUHJvcE5hbWVzKSxcbiAgICAgICAgICAgIGNoYW5uZWxOYW1lXG4gICAgICAgICAgKVxuICAgICAgICApO1xuICAgICAgICBmb3IgKGNvbnN0IHByb3Agb2YgY2hhbm5lbFByb3BOYW1lcykge1xuICAgICAgICAgIGRlbGV0ZSBjaGFuZ2VkW3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoT2JqZWN0LmtleXMoY2hhbmdlZCkubGVuZ3RoID4gMCkge1xuICAgICAgbmV4dFN0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICAgICAgICBuZXh0U3RhdGUsXG4gICAgICAgIGxheWVyQ29uZmlnQ2hhbmdlKG9sZExheWVyLCBwaWNrKG5ld0xheWVyLmNvbmZpZywgT2JqZWN0LmtleXMoY2hhbmdlZCkpKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG5mdW5jdGlvbiB1cGRhdGVsYXllclZpc2liaWx0eShzdGF0ZTogVmlzU3RhdGUsIG5ld0xheWVyOiBMYXllciwgaXNWaXNpYmxlPzogYm9vbGVhbik6IFZpc1N0YXRlIHtcbiAgbGV0IG5ld1N0YXRlID0gdXBkYXRlU3RhdGVPbkxheWVyVmlzaWJpbGl0eUNoYW5nZShzdGF0ZSwgbmV3TGF5ZXIpO1xuICBjb25zdCBmaWx0ZXJJbmRleCA9IGZpbHRlclN5bmNlZFdpdGhUaW1lbGluZShzdGF0ZSk7XG4gIGlmIChpc0xheWVyQW5pbWF0YWJsZShuZXdMYXllcikgJiYgZmlsdGVySW5kZXggIT09IC0xKSB7XG4gICAgLy8gaWYgbGF5ZXIgaXMgZ29pbmcgdG8gYmUgdmlzaWJsZSB3ZSBzeW5jIHdpdGggZmlsdGVyIG90aGVyd2lzZSB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgb3RoZXIgYW5pbWF0YWJsZSBsYXllcnMgZXhpc3RzIGFuZCBhcmUgdmlzaWJsZVxuICAgIG5ld1N0YXRlID0gc3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySW5kZXgsXG4gICAgICBlbmFibGU6IGlzVmlzaWJsZSA/IGlzVmlzaWJsZSA6IGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzKHN0YXRlLmxheWVycykubGVuZ3RoID4gMFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgYmFzZSBjb25maWc6IGRhdGFJZCwgbGFiZWwsIGNvbHVtbiwgaXNWaXNpYmxlXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjb21wbGV4aXR5XG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGFjdGlvbi5uZXdDb25maWcpO1xuICBpZiAoXG4gICAgdHlwZW9mIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkID09PSAnc3RyaW5nJyAmJlxuICAgIGFjdGlvbi5uZXdDb25maWcuZGF0YUlkICE9PSBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gICkge1xuICAgIGNvbnN0IHtkYXRhSWQsIC4uLnJlc3RDb25maWd9ID0gYWN0aW9uLm5ld0NvbmZpZztcbiAgICBjb25zdCBzdGF0ZVdpdGhEYXRhSWQgPSBsYXllckRhdGFJZENoYW5nZVVwZGF0ZXIoc3RhdGUsIHtcbiAgICAgIG9sZExheWVyLFxuICAgICAgbmV3Q29uZmlnOiB7ZGF0YUlkfVxuICAgIH0pO1xuICAgIGNvbnN0IG5leHRMYXllciA9IHN0YXRlV2l0aERhdGFJZC5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcbiAgICByZXR1cm4gbmV4dExheWVyICYmIE9iamVjdC5rZXlzKHJlc3RDb25maWcpLmxlbmd0aFxuICAgICAgPyBsYXllckNvbmZpZ0NoYW5nZVVwZGF0ZXIoc3RhdGVXaXRoRGF0YUlkLCB7b2xkTGF5ZXI6IG5leHRMYXllciwgbmV3Q29uZmlnOiByZXN0Q29uZmlnfSlcbiAgICAgIDogc3RhdGVXaXRoRGF0YUlkO1xuICB9XG5cbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoYWN0aW9uLm5ld0NvbmZpZyk7XG5cbiAgbGV0IGxheWVyRGF0YTtcblxuICBpZiAobmV3TGF5ZXIuc2hvdWxkQ2FsY3VsYXRlTGF5ZXJEYXRhKHByb3BzKSkge1xuICAgIGNvbnN0IG9sZExheWVyRGF0YSA9IHN0YXRlLmxheWVyRGF0YVtpZHhdO1xuXG4gICAgY29uc3QgdXBkYXRlTGF5ZXJEYXRhUmVzdWx0ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgb2xkTGF5ZXJEYXRhKTtcbiAgICBuZXdMYXllciA9IHVwZGF0ZUxheWVyRGF0YVJlc3VsdC5sYXllcjtcbiAgICBsYXllckRhdGEgPSB1cGRhdGVMYXllckRhdGFSZXN1bHQubGF5ZXJEYXRhO1xuICB9XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGlmICgnaXNWaXNpYmxlJyBpbiBhY3Rpb24ubmV3Q29uZmlnKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVsYXllclZpc2liaWx0eShuZXdTdGF0ZSwgbmV3TGF5ZXIsIGFjdGlvbi5uZXdDb25maWcuaXNWaXNpYmxlKTtcbiAgfVxuXG4gIGlmICgnY29sdW1ucycgaW4gYWN0aW9uLm5ld0NvbmZpZyAmJiBuZXdMYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQpIHtcbiAgICAvLyBUT0RPOiBTaGFuLCBtYWtlIHRoZSBhbmltYXRpb24gY29uZmlnIGZ1bmN0aW9uIG1vcmUgcm9idXN0XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgIGxheWVyOiBuZXdMYXllcixcbiAgICBsYXllckRhdGEsXG4gICAgaWR4XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJBbmltYXRpb25DaGFuZ2VVcGRhdGVyPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMsIGFjdGlvbik6IFMge1xuICBjb25zdCB7b2xkTGF5ZXIsIHByb3AsIHZhbHVlfSA9IGFjdGlvbjtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZExheWVyLmlkKTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICBhbmltYXRpb246IHtcbiAgICAgIC4uLm9sZExheWVyLmNvbmZpZy5hbmltYXRpb24sXG4gICAgICBbcHJvcF06IHZhbHVlXG4gICAgfVxuICB9KTtcblxuICBjb25zdCB7bGF5ZXJEYXRhLCBsYXllcn0gPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlLCBzdGF0ZS5sYXllckRhdGFbaWR4XSk7XG5cbiAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllcklkLCBpc1Zpc2libGUsIHNwbGl0TWFwSWRcbiAqIGhhbmRsZXMgdHdvIGNhc2VzOlxuICogMSkgdG9nZ2xlIHRoZSB2aXNpYmlsaXR5IG9mIGxvY2FsIFNwbGl0TWFwIGxheWVyICh2aXNTdGF0ZS5zcGxpdE1hcC5sYXllcnMpXG4gKiAyKSB0b2dnbGUgdGhlIHZpc2liaWxpdHkgb2YgZ2xvYmFsIGxheWVyICh2aXNTdGF0ZS5sYXllcnMpXG5cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVG9nZ2xlVmlzaWJpbGl0eVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJUb2dnbGVWaXNpYmlsaXR5VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7bGF5ZXJJZCwgaXNWaXNpYmxlLCBzcGxpdE1hcElkfSA9IGFjdGlvbjtcbiAgY29uc3QgbGF5ZXIgPSBzdGF0ZS5sYXllcnMuZmluZChkID0+IGQuaWQgPT09IGxheWVySWQpO1xuXG4gIGlmICghbGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcblxuICBpZiAoc3BsaXRNYXBJZCkge1xuICAgIC8vIFtjYXNlIDFdOiB0b2dnbGUgbG9jYWwgbGF5ZXIgdmlzaWJpbGl0eSBmb3IgZWFjaCBTcGxpdE1hcFxuICAgIGNvbnN0IG1hcEluZGV4ID0gbmV3U3RhdGUuc3BsaXRNYXBzLmZpbmRJbmRleChzbSA9PiBzbS5pZCA9PT0gc3BsaXRNYXBJZCk7XG4gICAgaWYgKGlzVmlzaWJsZSkge1xuICAgICAgLy8gMSkgaWYgdGhlIGxheWVyIGlzIGludmlzaWJsZSBnbG9iYWxseVxuICAgICAgLy8gLT4gc2V0IGdsb2JhbCB2aXNpYmlsaXR5IHRvIHRydWVcbiAgICAgIG5ld1N0YXRlID0gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKG5ld1N0YXRlLCBsYXllckNvbmZpZ0NoYW5nZShsYXllciwge2lzVmlzaWJsZTogdHJ1ZX0pKTtcblxuICAgICAgLy8gLT4gc2V0IGxvY2FsIHZpc2liaWxpdHkgdG8gdHJ1ZSBhbmQgdGhlIGxvY2FsIHZpc2liaWxpdGllcyBvZiBhbGwgb3RoZXIgU3BsaXRNYXBzIHRvIGZhbHNlXG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgICAgc3BsaXRNYXBzOiBuZXdTdGF0ZS5zcGxpdE1hcHMubWFwKHNtID0+XG4gICAgICAgICAgc20uaWQgIT09IHNwbGl0TWFwSWRcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLnNtLFxuICAgICAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAgICAgLi4uc20ubGF5ZXJzLFxuICAgICAgICAgICAgICAgICAgW2xheWVySWRdOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgLi4uc20sXG4gICAgICAgICAgICAgICAgbGF5ZXJzOiB7XG4gICAgICAgICAgICAgICAgICAuLi5zbS5sYXllcnMsXG4gICAgICAgICAgICAgICAgICBbbGF5ZXJJZF06IHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgfTtcbiAgICB9XG4gICAgLy8gMikgZWxzZSB3aGVuIHRoZSBsYXllciBpcyB2aXNpYmxlIGdsb2JhbGx5XG4gICAgcmV0dXJuIHRvZ2dsZUxheWVyRm9yTWFwVXBkYXRlcihuZXdTdGF0ZSwgdG9nZ2xlTGF5ZXJGb3JNYXAobWFwSW5kZXgsIGxheWVySWQpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBbY2FzZSAyXTogdG9nZ2xlIGdsb2JhbCBsYXllciB2aXNpYmlsaXR5XG4gICAgY29uc3QgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7aXNWaXNpYmxlfSk7XG4gICAgY29uc3QgaWR4ID0gbmV3U3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGxheWVySWQpO1xuXG4gICAgbmV3U3RhdGUgPSB1cGRhdGVsYXllclZpc2liaWx0eShuZXdTdGF0ZSwgbmV3TGF5ZXIsIGlzVmlzaWJsZSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge1xuICAgICAgbGF5ZXI6IG5ld0xheWVyLFxuICAgICAgaWR4XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKlxuICogQHBhcmFtIHN0YXRlXG4gKiBAcmV0dXJucyBpbmRleCBvZiB0aGUgZmlsdGVyIHN5bmNlZCB0byB0aW1lbGluZSBvciAtMVxuICovXG5mdW5jdGlvbiBmaWx0ZXJTeW5jZWRXaXRoVGltZWxpbmUoc3RhdGU6IFZpc1N0YXRlKTogbnVtYmVyIHtcbiAgcmV0dXJuIHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gKGYgYXMgVGltZVJhbmdlRmlsdGVyKS5zeW5jZWRXaXRoTGF5ZXJUaW1lbGluZSk7XG59XG5cbi8qKlxuICogVXBkYXRlcyBpc1ZhbGlkIGZsYWcgb2YgYSBsYXllci5cbiAqIFVwZGF0ZXMgaXNWaXNpYmxlIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBpc1ZhbGlkLlxuICogVHJpZ2dlcnMgdXBkYXRlIG9mIGRhdGEgZm9yIHRoZSBsYXllciBpbiBvcmRlciB0byBnZXQgZXJyb3JzIGFnYWluIGR1cmluZyBuZXh0IHVwZGF0ZSBpdGVyYXRpb24uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHJldHVybnMgbmV4dFN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsYXllclNldElzVmFsaWRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyU2V0SXNWYWxpZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBpc1ZhbGlkfSA9IGFjdGlvbjtcblxuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBsYXllclRvVXBkYXRlID0gc3RhdGUubGF5ZXJzW2lkeF07XG4gIGlmIChsYXllclRvVXBkYXRlKSB7XG4gICAgbGV0IG5ld0xheWVyO1xuICAgIGxldCBuZXdEYXRhID0gbnVsbDtcblxuICAgIGlmIChpc1ZhbGlkKSB7XG4gICAgICAvLyBUcmlnZ2VyIGRhdGEgdXBkYXRlIGluIG9yZGVyIHRvIHNob3cgZXJyb3JzIGFnYWluIGlmIHByZXNlbnQuXG4gICAgICBjb25zdCB7bGF5ZXIsIGxheWVyRGF0YX0gPSBjYWxjdWxhdGVMYXllckRhdGEobGF5ZXJUb1VwZGF0ZSwgc3RhdGUsIHVuZGVmaW5lZCk7XG4gICAgICBuZXdMYXllciA9IGxheWVyO1xuICAgICAgbmV3RGF0YSA9IGxheWVyRGF0YTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXIgPSBsYXllclRvVXBkYXRlLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgfSk7XG4gICAgICBuZXdMYXllci5pc1ZhbGlkID0gZmFsc2U7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShzdGF0ZSwge2lkeCwgbGF5ZXI6IG5ld0xheWVyLCBsYXllckRhdGE6IG5ld0RhdGF9KTtcbiAgfVxuXG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gYWRkT3JSZW1vdmVUZXh0TGFiZWxzKG5ld0ZpZWxkcywgdGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsID0gREVGQVVMVF9URVhUX0xBQkVMKSB7XG4gIGxldCBuZXdUZXh0TGFiZWwgPSB0ZXh0TGFiZWwuc2xpY2UoKTtcblxuICBjb25zdCBjdXJyZW50RmllbGRzID0gdGV4dExhYmVsLm1hcCh0bCA9PiB0bC5maWVsZCAmJiB0bC5maWVsZC5uYW1lKS5maWx0ZXIoZCA9PiBkKTtcblxuICBjb25zdCBhZGRGaWVsZHMgPSBuZXdGaWVsZHMuZmlsdGVyKGYgPT4gIWN1cnJlbnRGaWVsZHMuaW5jbHVkZXMoZi5uYW1lKSk7XG4gIGNvbnN0IGRlbGV0ZUZpZWxkcyA9IGN1cnJlbnRGaWVsZHMuZmlsdGVyKGYgPT4gIW5ld0ZpZWxkcy5maW5kKGZkID0+IGZkLm5hbWUgPT09IGYpKTtcblxuICAvLyBkZWxldGVcbiAgbmV3VGV4dExhYmVsID0gbmV3VGV4dExhYmVsLmZpbHRlcih0bCA9PiB0bC5maWVsZCAmJiAhZGVsZXRlRmllbGRzLmluY2x1ZGVzKHRsLmZpZWxkLm5hbWUpKTtcbiAgbmV3VGV4dExhYmVsID0gIW5ld1RleHRMYWJlbC5sZW5ndGggPyBbZGVmYXVsdFRleHRMYWJlbF0gOiBuZXdUZXh0TGFiZWw7XG5cbiAgLy8gYWRkXG4gIG5ld1RleHRMYWJlbCA9IFtcbiAgICAuLi5uZXdUZXh0TGFiZWwuZmlsdGVyKHRsID0+IHRsLmZpZWxkKSxcbiAgICAuLi5hZGRGaWVsZHMubWFwKGFmID0+ICh7XG4gICAgICAuLi5kZWZhdWx0VGV4dExhYmVsLFxuICAgICAgZmllbGQ6IGFmXG4gICAgfSkpXG4gIF07XG5cbiAgcmV0dXJuIG5ld1RleHRMYWJlbDtcbn1cblxuZnVuY3Rpb24gdXBkYXRlVGV4dExhYmVsUHJvcEFuZFZhbHVlKGlkeCwgcHJvcCwgdmFsdWUsIHRleHRMYWJlbCkge1xuICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0ZXh0TGFiZWxbaWR4XSwgcHJvcCkpIHtcbiAgICByZXR1cm4gdGV4dExhYmVsO1xuICB9XG5cbiAgbGV0IG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5zbGljZSgpO1xuXG4gIGlmIChwcm9wID09PSAnZmllbGQnICYmIHZhbHVlID09PSBudWxsICYmIHRleHRMYWJlbC5sZW5ndGggPiAxKSB7XG4gICAgLy8gcmVtb3ZlIGxhYmVsIHdoZW4gZmllbGQgdmFsdWUgaXMgc2V0IHRvIG51bGxcbiAgICBuZXdUZXh0TGFiZWwuc3BsaWNlKGlkeCwgMSk7XG4gIH0gZWxzZSBpZiAocHJvcCkge1xuICAgIG5ld1RleHRMYWJlbCA9IHRleHRMYWJlbC5tYXAoKHRsLCBpKSA9PiAoaSA9PT0gaWR4ID8gey4uLnRsLCBbcHJvcF06IHZhbHVlfSA6IHRsKSk7XG4gIH1cblxuICByZXR1cm4gbmV3VGV4dExhYmVsO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBsYXllciBiYXNlIGNvbmZpZzogZGF0YUlkLCBsYWJlbCwgY29sdW1uLCBpc1Zpc2libGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyBuZXh0U3RhdGVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVGV4dExhYmVsQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclRleHRMYWJlbENoYW5nZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBpZHgsIHByb3AsIHZhbHVlfSA9IGFjdGlvbjtcbiAgY29uc3Qge3RleHRMYWJlbH0gPSBvbGRMYXllci5jb25maWc7XG5cbiAgLy8gd2hlbiBhZGRpbmcgYSBuZXcgZW1wdHkgdGV4dCBsYWJlbCxcbiAgLy8gcmVseSBvbiB0aGUgbGF5ZXIncyBkZWZhdWx0IGNvbmZpZywgb3IgdXNlIHRoZSBjb25zdGFudCBERUZBVUxUX1RFWFRfTEFCRUxcbiAgY29uc3QgZGVmYXVsdFRleHRMYWJlbCA9XG4gICAgb2xkTGF5ZXIuZ2V0RGVmYXVsdExheWVyQ29uZmlnKHtkYXRhSWQ6ICcnfSk/LnRleHRMYWJlbD8uWzBdID8/IERFRkFVTFRfVEVYVF9MQUJFTDtcblxuICBsZXQgbmV3VGV4dExhYmVsID0gdGV4dExhYmVsLnNsaWNlKCk7XG4gIGlmICghdGV4dExhYmVsW2lkeF0gJiYgaWR4ID09PSB0ZXh0TGFiZWwubGVuZ3RoKSB7XG4gICAgLy8gaWYgaWR4IGlzIHNldCB0byBsZW5ndGgsIGFkZCBlbXB0eSB0ZXh0IGxhYmVsXG4gICAgbmV3VGV4dExhYmVsID0gWy4uLnRleHRMYWJlbCwgZGVmYXVsdFRleHRMYWJlbF07XG4gIH1cblxuICBpZiAoaWR4ID09PSAnYWxsJyAmJiBwcm9wID09PSAnZmllbGRzJykge1xuICAgIG5ld1RleHRMYWJlbCA9IGFkZE9yUmVtb3ZlVGV4dExhYmVscyh2YWx1ZSwgdGV4dExhYmVsLCBkZWZhdWx0VGV4dExhYmVsKTtcbiAgfSBlbHNlIHtcbiAgICBuZXdUZXh0TGFiZWwgPSB1cGRhdGVUZXh0TGFiZWxQcm9wQW5kVmFsdWUoaWR4LCBwcm9wLCB2YWx1ZSwgbmV3VGV4dExhYmVsKTtcbiAgfVxuICAvLyB1cGRhdGUgdGV4dCBsYWJlbCBwcm9wIGFuZCB2YWx1ZVxuICByZXR1cm4gbGF5ZXJDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgb2xkTGF5ZXIsXG4gICAgbmV3Q29uZmlnOiB7dGV4dExhYmVsOiBuZXdUZXh0TGFiZWx9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUV4aXN0aW5nTGF5ZXJXaXRoRGF0YShkYXRhc2V0LCBsYXllckNsYXNzZXMsIGxheWVyLCBzY2hlbWEpIHtcbiAgY29uc3QgbG9hZGVkTGF5ZXIgPSBzZXJpYWxpemVMYXllcihsYXllciwgc2NoZW1hKTtcbiAgcmV0dXJuIGxvYWRlZExheWVyXG4gICAgPyB2YWxpZGF0ZUxheWVyV2l0aERhdGEoZGF0YXNldCwgbG9hZGVkTGF5ZXIsIGxheWVyQ2xhc3Nlcywge1xuICAgICAgICBhbGxvd0VtcHR5Q29sdW1uOiB0cnVlXG4gICAgICB9KVxuICAgIDogbnVsbDtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgY29uZmlnIGRhdGFJZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJEYXRhSWRDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG9sZExheWVyOiBMYXllcjtcbiAgICBuZXdDb25maWc6IHtcbiAgICAgIGRhdGFJZDogc3RyaW5nO1xuICAgIH07XG4gIH1cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge29sZExheWVyLCBuZXdDb25maWd9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YUlkfSA9IG5ld0NvbmZpZztcblxuICBpZiAoIW9sZExheWVyIHx8ICFzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG5cbiAgbGV0IG5ld0xheWVyID0gb2xkTGF5ZXIudXBkYXRlTGF5ZXJDb25maWcoe2RhdGFJZH0pO1xuXG4gIC8vIHRoaXMgbWF5IGhhcHBlbiB3aGVuIGEgbGF5ZXIgaXMgbmV3ICh0eXBlOiBudWxsIGFuZCBubyBjb2x1bW5zKSBidXQgaXQncyBub3QgcmVhZHkgdG8gYmUgc2F2ZWRcbiAgaWYgKG5ld0xheWVyLmlzVmFsaWRUb1NhdmUoKSkge1xuICAgIGNvbnN0IHZhbGlkYXRlZCA9IHZhbGlkYXRlRXhpc3RpbmdMYXllcldpdGhEYXRhKFxuICAgICAgc3RhdGUuZGF0YXNldHNbZGF0YUlkXSxcbiAgICAgIHN0YXRlLmxheWVyQ2xhc3NlcyxcbiAgICAgIG5ld0xheWVyLFxuICAgICAgc3RhdGUuc2NoZW1hXG4gICAgKTtcbiAgICAvLyBpZiBjYW50IHZhbGlkYXRlIGl0IHdpdGggZGF0YSBjcmVhdGUgYSBuZXcgb25lXG4gICAgaWYgKCF2YWxpZGF0ZWQpIHtcbiAgICAgIGNvbnN0IG9sZExheWVyVHlwZSA9IG9sZExheWVyLnR5cGU7XG4gICAgICBpZiAob2xkTGF5ZXJUeXBlKSB7XG4gICAgICAgIG5ld0xheWVyID0gbmV3IHN0YXRlLmxheWVyQ2xhc3Nlc1tvbGRMYXllclR5cGVdKHtkYXRhSWQsIGlkOiBvbGRMYXllci5pZH0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdMYXllciA9IHZhbGlkYXRlZDtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTGF5ZXIgaXMgbm90IHZhbGlkIHRvIHNhdmUgKGUuZy4gbWlzc2luZyBjb2x1bW5zKSwgYnV0IHdlIHN0aWxsIG5lZWQgdG9cbiAgICAvLyByZW1hcCB2aXN1YWwgY2hhbm5lbCBmaWVsZHMgdG8gdGhlIG5ldyBkYXRhc2V0IHRvIGF2b2lkIHN0YWxlIGZpZWxkIHJlZmVyZW5jZXNcbiAgICAvLyB0aGF0IHBvaW50IHRvIHJvd3MgYmV5b25kIHRoZSBuZXcgZGF0YXNldCdzIGxlbmd0aFxuICAgIGNvbnN0IG5ld0RhdGFzZXRGaWVsZHMgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdLmZpZWxkcztcbiAgICBjb25zdCByZW1hcHBlZEZpZWxkczogUmVjb3JkPHN0cmluZywgYW55PiA9IHt9O1xuICAgIE9iamVjdC52YWx1ZXMobmV3TGF5ZXIudmlzdWFsQ2hhbm5lbHMpLmZvckVhY2goKHtmaWVsZDogZmllbGRLZXl9KSA9PiB7XG4gICAgICBjb25zdCBjdXJyZW50RmllbGQgPSBuZXdMYXllci5jb25maWdbZmllbGRLZXldO1xuICAgICAgaWYgKGN1cnJlbnRGaWVsZCkge1xuICAgICAgICBjb25zdCBtYXRjaGVkID0gbmV3RGF0YXNldEZpZWxkcy5maW5kKGYgPT4gZi5uYW1lID09PSBjdXJyZW50RmllbGQubmFtZSk7XG4gICAgICAgIHJlbWFwcGVkRmllbGRzW2ZpZWxkS2V5XSA9IG1hdGNoZWQgfHwgbnVsbDtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoT2JqZWN0LmtleXMocmVtYXBwZWRGaWVsZHMpLmxlbmd0aCkge1xuICAgICAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyhyZW1hcHBlZEZpZWxkcyk7XG4gICAgfVxuICAgIC8vIFZhbGlkYXRlIGZpZWxkIHR5cGUgY29tcGF0aWJpbGl0eSDigJQgY2xlYXJzIGZpZWxkcyB3aG9zZSB0eXBlIGlzIGluY29tcGF0aWJsZVxuICAgIC8vIHdpdGggdGhlIGNoYW5uZWwncyBzdXBwb3J0ZWQgZmllbGQgdHlwZXMgKGUuZy4gc3RyaW5nIGZpZWxkIGZvciBhIG51bWVyaWMgc2NhbGUpXG4gICAgT2JqZWN0LnZhbHVlcyhuZXdMYXllci52aXN1YWxDaGFubmVscykuZm9yRWFjaCgoe2tleX0pID0+IHtcbiAgICAgIG5ld0xheWVyLnZhbGlkYXRlVmlzdWFsQ2hhbm5lbChrZXkpO1xuICAgIH0pO1xuICB9XG5cbiAgbmV3TGF5ZXIgPSBuZXdMYXllci51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgaXNWaXNpYmxlOiBvbGRMYXllci5jb25maWcuaXNWaXNpYmxlLFxuICAgIGlzQ29uZmlnQWN0aXZlOiB0cnVlXG4gIH0pO1xuXG4gIG5ld0xheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzKTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgdW5kZWZpbmVkKTtcblxuICByZXR1cm4gdXBkYXRlU3RhdGVXaXRoTGF5ZXJBbmREYXRhKHN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRJbml0aWFsTGF5ZXJDb25maWcobGF5ZXIsIGRhdGFzZXRzLCBsYXllckNsYXNzZXMpOiBMYXllciB7XG4gIGxldCBuZXdMYXllciA9IGxheWVyO1xuICBpZiAoIU9iamVjdC5rZXlzKGRhdGFzZXRzKS5sZW5ndGgpIHtcbiAgICAvLyBubyBkYXRhIGlzIGxvYWRlZFxuICAgIHJldHVybiBsYXllcjtcbiAgfVxuICBpZiAoIWxheWVyLmNvbmZpZy5kYXRhSWQpIHtcbiAgICAvLyBzZXQgbGF5ZXIgZGF0YUlkXG4gICAgbmV3TGF5ZXIgPSBsYXllci51cGRhdGVMYXllckNvbmZpZyh7ZGF0YUlkOiBPYmplY3Qua2V5cyhkYXRhc2V0cylbMF19KTtcbiAgfVxuICBjb25zdCBkYXRhc2V0ID0gZGF0YXNldHNbbmV3TGF5ZXIuY29uZmlnLmRhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBsYXllcjtcbiAgfVxuXG4gIC8vIGZpbmQgZGVmYXV0IGxheWVyIHByb3BzXG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgdHlwZW9mIGxheWVyQ2xhc3Nlc1tuZXdMYXllci50eXBlXS5maW5kRGVmYXVsdExheWVyUHJvcHMgPT09ICdmdW5jdGlvbidcbiAgICAgID8gbGF5ZXJDbGFzc2VzW25ld0xheWVyLnR5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhkYXRhc2V0LCBbXSlcbiAgICAgIDoge3Byb3BzOiBbXX07XG5cbiAgLy8gYW4gYXJyYXkgb2YgcG9zc2libGUgcHJvcHMsIHVzZSAxc3Qgb25lXG4gIGNvbnN0IHByb3BzID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogcmVzdWx0LnByb3BzIHx8IFtdO1xuXG4gIGlmIChwcm9wcy5sZW5ndGgpIHtcbiAgICBuZXdMYXllciA9IG5ldyBsYXllckNsYXNzZXNbbGF5ZXIudHlwZV0oe1xuICAgICAgLi4ucHJvcHNbMF0sXG4gICAgICBsYWJlbDogbmV3TGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgICAgZGF0YUlkOiBuZXdMYXllci5jb25maWcuZGF0YUlkLFxuICAgICAgaXNDb25maWdBY3RpdmU6IG5ld0xheWVyLmNvbmZpZy5pc0NvbmZpZ0FjdGl2ZSxcbiAgICAgIGlzVmlzaWJsZTogbmV3TGF5ZXIuY29uZmlnLmlzVmlzaWJsZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB0eXBlb2YgbmV3TGF5ZXIuc2V0SW5pdGlhbExheWVyQ29uZmlnID09PSAnZnVuY3Rpb24nXG4gICAgPyBuZXdMYXllci5zZXRJbml0aWFsTGF5ZXJDb25maWcoZGF0YXNldClcbiAgICA6IG5ld0xheWVyO1xufVxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdHlwZS4gUHJldmlld3MgbGF5ZXIgY29uZmlnIHdpbGwgYmUgY29waWVkIGlmIGFwcGxpY2FibGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJUeXBlQ2hhbmdlVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5MYXllclR5cGVDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtvbGRMYXllciwgbmV3VHlwZX0gPSBhY3Rpb247XG4gIGlmICghb2xkTGF5ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qgb2xkSWQgPSBvbGRMYXllci5pZDtcbiAgY29uc3QgaWR4ID0gc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IG9sZElkKTtcblxuICBpZiAoIXN0YXRlLmxheWVyQ2xhc3Nlc1tuZXdUeXBlXSkge1xuICAgIENvbnNvbGUuZXJyb3IoYCR7bmV3VHlwZX0gaXMgbm90IGEgdmFsaWQgbGF5ZXIgdHlwZWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3TGF5ZXIgPSBuZXcgc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdKHtcbiAgICAvLyBrZWVwIG9sZCBsYXllciBsYWJsZSBhbmQgaXNDb25maWdBY3RpdmVcbiAgICBsYWJlbDogb2xkTGF5ZXIuY29uZmlnLmxhYmVsLFxuICAgIGlzQ29uZmlnQWN0aXZlOiBvbGRMYXllci5jb25maWcuaXNDb25maWdBY3RpdmUsXG4gICAgZGF0YUlkOiBvbGRMYXllci5jb25maWcuZGF0YUlkXG4gIH0pO1xuXG4gIGlmICghb2xkTGF5ZXIudHlwZSkge1xuICAgIC8vIGlmIHNldHRpbmcgbGF5ZXIgdHlwZSBvbiBhbiBlbXB0eSBsYXllclxuICAgIG5ld0xheWVyID0gc2V0SW5pdGlhbExheWVyQ29uZmlnKG5ld0xheWVyLCBzdGF0ZS5kYXRhc2V0cywgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBnZXQgYSBtaW50IGxheWVyLCB3aXRoIG5ldyBpZCBhbmQgdHlwZVxuICAgIC8vIGJlY2F1c2UgZGVjay5nbCB1c2VzIGlkIHRvIG1hdGNoIGJldHdlZW4gbmV3IGFuZCBvbGQgbGF5ZXIuXG4gICAgLy8gSWYgdHlwZSBoYXMgY2hhbmdlZCBidXQgaWQgaXMgdGhlIHNhbWUsIGl0IHdpbGwgYnJlYWtcblxuICAgIGNvbnN0IGRlZmF1bHRMYXllclByb3BzID1cbiAgICAgIHR5cGVvZiBzdGF0ZS5sYXllckNsYXNzZXNbbmV3VHlwZV0uZmluZERlZmF1bHRMYXllclByb3BzID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gc3RhdGUubGF5ZXJDbGFzc2VzW25ld1R5cGVdLmZpbmREZWZhdWx0TGF5ZXJQcm9wcyhzdGF0ZS5kYXRhc2V0c1tuZXdMYXllci5jb25maWcuZGF0YUlkXSlcbiAgICAgICAgOiBudWxsO1xuXG4gICAgbmV3TGF5ZXIuYXNzaWduQ29uZmlnVG9MYXllcihcbiAgICAgIG9sZExheWVyLmNvbmZpZyxcbiAgICAgIG9sZExheWVyLnZpc0NvbmZpZ1NldHRpbmdzLFxuICAgICAgc3RhdGUuZGF0YXNldHMsXG4gICAgICBkZWZhdWx0TGF5ZXJQcm9wc1xuICAgICk7XG4gICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJEb21haW4oc3RhdGUuZGF0YXNldHMpO1xuICB9XG5cbiAgY29uc3Qge2NsaWNrZWQsIGhvdmVySW5mb30gPSBzdGF0ZTtcblxuICBsZXQgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgY2xpY2tlZDogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoY2xpY2tlZCkgPyB1bmRlZmluZWQgOiBjbGlja2VkLFxuICAgIGhvdmVySW5mbzogb2xkTGF5ZXIuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mb1xuICB9O1xuXG4gIGNvbnN0IHtsYXllckRhdGEsIGxheWVyfSA9IGNhbGN1bGF0ZUxheWVyRGF0YShuZXdMYXllciwgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXdTdGF0ZSwge2xheWVyRGF0YSwgbGF5ZXIsIGlkeH0pO1xuXG4gIGlmIChsYXllci5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgfHwgb2xkTGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHNwbGl0TWFwIGxheWVyIGlkXG4gIGlmIChzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5uZXdTdGF0ZSxcbiAgICAgIHNwbGl0TWFwczogbmV3U3RhdGUuc3BsaXRNYXBzLm1hcChzZXR0aW5ncyA9PiB7XG4gICAgICAgIGNvbnN0IHtbb2xkSWRdOiBvbGRMYXllck1hcCwgLi4ub3RoZXJMYXllcnN9ID0gc2V0dGluZ3MubGF5ZXJzO1xuICAgICAgICByZXR1cm4gb2xkSWQgaW4gc2V0dGluZ3MubGF5ZXJzXG4gICAgICAgICAgPyB7XG4gICAgICAgICAgICAgIC4uLnNldHRpbmdzLFxuICAgICAgICAgICAgICBsYXllcnM6IHtcbiAgICAgICAgICAgICAgICAuLi5vdGhlckxheWVycyxcbiAgICAgICAgICAgICAgICBbbGF5ZXIuaWRdOiBvbGRMYXllck1hcFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgOiBzZXR0aW5ncztcbiAgICAgIH0pXG4gICAgfTtcbiAgfVxuXG4gIC8vIHVwZGF0ZSBsYXllck9yZGVyIHdpdGggbmV3IGlkXG4gIG5ld1N0YXRlID0ge1xuICAgIC4uLm5ld1N0YXRlLFxuICAgIGxheWVyT3JkZXI6IG5ld1N0YXRlLmxheWVyT3JkZXIubWFwKGxheWVySWQgPT5cbiAgICAgIGxheWVySWQgPT09IG9sZExheWVyLmlkID8gbmV3TGF5ZXIuaWQgOiBsYXllcklkXG4gICAgKVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgbGF5ZXIgdmlzdWFsIGNoYW5uZWxcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBuZXh0U3RhdGVcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyVmlzdWFsQ2hhbm5lbENoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJWaXN1YWxDaGFubmVsQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXIsIG5ld0NvbmZpZywgbmV3VmlzQ29uZmlnLCBjaGFubmVsfSA9IGFjdGlvbjtcbiAgaWYgKCFvbGRMYXllci5jb25maWcuZGF0YUlkKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW29sZExheWVyLmNvbmZpZy5kYXRhSWRdO1xuXG4gIGNvbnN0IGlkeCA9IHN0YXRlLmxheWVycy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBvbGRMYXllci5pZCk7XG4gIGxldCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKG5ld0NvbmZpZyk7XG4gIGlmIChuZXdWaXNDb25maWcpIG5ld0xheWVyID0gbmV3TGF5ZXIudXBkYXRlTGF5ZXJWaXNDb25maWcobmV3VmlzQ29uZmlnKTtcblxuICBuZXdMYXllci51cGRhdGVMYXllclZpc3VhbENoYW5uZWwoZGF0YXNldCwgY2hhbm5lbCk7XG5cbiAgLy8gY2FsbGluZyB1cGRhdGUgYW5pbWF0aW9uIGRvbWFpbiBmaXJzdCB0byBtZXJnZSBhbGwgbGF5ZXIgYW5pbWF0aW9uIGRvbWFpblxuICBsZXQgdXBkYXRlZFN0YXRlID0gdXBkYXRlQW5pbWF0aW9uRG9tYWluKHN0YXRlKTtcblxuICBjb25zdCB2aXN1YWxDaGFubmVsID0gb2xkTGF5ZXIudmlzdWFsQ2hhbm5lbHNbY2hhbm5lbF07XG4gIGlmICh2aXN1YWxDaGFubmVsPy5jaGFubmVsU2NhbGVUeXBlID09PSBDSEFOTkVMX1NDQUxFUy5jb2xvciAmJiBuZXdDb25maWdbdmlzdWFsQ2hhbm5lbC5maWVsZF0pIHtcbiAgICAvLyBpZiBjb2xvciBmaWVsZCBjaGFuZ2VkLCBzZXQgY3VzdG9tQnJlYWtzIHRvIGZhbHNlXG4gICAgbmV3TGF5ZXIudXBkYXRlTGF5ZXJDb2xvclVJKHZpc3VhbENoYW5uZWwucmFuZ2UsIHtcbiAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgLi4ubmV3TGF5ZXIuY29uZmlnLmNvbG9yVUlbdmlzdWFsQ2hhbm5lbC5yYW5nZV0uY29sb3JSYW5nZUNvbmZpZyxcbiAgICAgICAgY3VzdG9tQnJlYWtzOiBmYWxzZVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgdXBkYXRlZFN0YXRlID0ge1xuICAgICAgLi4udXBkYXRlZFN0YXRlLFxuICAgICAgbGF5ZXJzOiB1cGRhdGVkU3RhdGUubGF5ZXJzLm1hcChsID0+IChsLmlkID09PSBvbGRMYXllci5pZCA/IG5ld0xheWVyIDogbCkpXG4gICAgfTtcbiAgfVxuXG4gIGNvbnN0IG9sZExheWVyRGF0YSA9IHVwZGF0ZWRTdGF0ZS5sYXllckRhdGFbaWR4XTtcbiAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCB1cGRhdGVkU3RhdGUsIG9sZExheWVyRGF0YSk7XG5cbiAgaWYgKFxuICAgIHZpc3VhbENoYW5uZWw/LmNoYW5uZWxTY2FsZVR5cGUgPT09IENIQU5ORUxfU0NBTEVTLmNvbG9yICYmXG4gICAgbmV3Q29uZmlnW3Zpc3VhbENoYW5uZWw/LnNjYWxlXSA9PT0gU0NBTEVfVFlQRVMuY3VzdG9tT3JkaW5hbCAmJlxuICAgICFuZXdWaXNDb25maWdcbiAgKSB7XG4gICAgLy8gd2hlbiBzd2l0Y2hpbmcgdG8gY3VzdG9tT3JkaW5hbCBzY2FsZSwgY3JlYXRlIGEgY3VzdG9tUGFsZXR0ZSBpbiBjb2xvclVJIHdpdGggdXBkYXRlZCBjb2xvckRvbWFpblxuICAgIGNvbnN0IGN1c3RvbVBhbGV0dGUgPSBpbml0Q3VzdG9tUGFsZXR0ZUJ5Q3VzdG9tU2NhbGUoe1xuICAgICAgc2NhbGU6IFNDQUxFX1RZUEVTLmN1c3RvbU9yZGluYWwsXG4gICAgICBmaWVsZDogbGF5ZXIuY29uZmlnW3Zpc3VhbENoYW5uZWwuZmllbGRdLFxuICAgICAgb3JkaW5hbERvbWFpbjogbGF5ZXIuY29uZmlnW2xheWVyLnZpc3VhbENoYW5uZWxzW2NoYW5uZWxdLmRvbWFpbl0sXG4gICAgICByYW5nZTogbGF5ZXIuY29uZmlnLnZpc0NvbmZpZ1t2aXN1YWxDaGFubmVsLnJhbmdlXSxcbiAgICAgIGNvbG9yQnJlYWtzOiBudWxsXG4gICAgfSk7XG4gICAgLy8gdXBkYXRlIGNvbG9yUmFuZ2Ugd2l0aCBuZXcgY3VzdG9tUGFsZXR0ZVxuICAgIGxheWVyLnVwZGF0ZUxheWVyQ29sb3JVSSh2aXN1YWxDaGFubmVsLnJhbmdlLCB7XG4gICAgICBzaG93Q29sb3JDaGFydDogdHJ1ZSxcbiAgICAgIGNvbG9yUmFuZ2VDb25maWc6IHtcbiAgICAgICAgLi4ubGF5ZXIuY29uZmlnLmNvbG9yVUlbdmlzdWFsQ2hhbm5lbC5yYW5nZV0uY29sb3JSYW5nZUNvbmZpZyxcbiAgICAgICAgY3VzdG9tQnJlYWtzOiB0cnVlXG4gICAgICB9LFxuICAgICAgY3VzdG9tUGFsZXR0ZVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEodXBkYXRlZFN0YXRlLCB7bGF5ZXJEYXRhLCBsYXllciwgaWR4fSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGxheWVyIGB2aXNDb25maWdgXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyVmlzQ29uZmlnQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7b2xkTGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCBpZHggPSBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gb2xkTGF5ZXIuaWQpO1xuICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKGFjdGlvbi5uZXdWaXNDb25maWcpO1xuXG4gIGNvbnN0IG5ld1Zpc0NvbmZpZyA9IHtcbiAgICAuLi5vbGRMYXllci5jb25maWcudmlzQ29uZmlnLFxuICAgIC4uLmFjdGlvbi5uZXdWaXNDb25maWdcbiAgfTtcblxuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHt2aXNDb25maWc6IG5ld1Zpc0NvbmZpZ30pO1xuXG4gIGxldCBuZXh0U3RhdGUgPSBzdGF0ZTtcblxuICAvLyBFeGNsdXNpdmUgYml0bWFwIGVkaXRpbmc6IHdoZW4gZWRpdEJvdW5kcyBpcyB0dXJuZWQgb24gZm9yIG9uZSBiaXRtYXAgbGF5ZXIsXG4gIC8vIHR1cm4gaXQgb2ZmIGZvciBhbGwgb3RoZXIgYml0bWFwIGxheWVyc1xuICBpZiAoXG4gICAgbmV3TGF5ZXIudHlwZSA9PT0gJ2JpdG1hcCcgJiZcbiAgICBhY3Rpb24ubmV3VmlzQ29uZmlnLmVkaXRCb3VuZHMgPT09IHRydWVcbiAgKSB7XG4gICAgbmV4dFN0YXRlID0ge1xuICAgICAgLi4ubmV4dFN0YXRlLFxuICAgICAgbGF5ZXJzOiBuZXh0U3RhdGUubGF5ZXJzLm1hcCgobCwgaSkgPT4ge1xuICAgICAgICBpZiAoaSAhPT0gaWR4ICYmIGwudHlwZSA9PT0gJ2JpdG1hcCcgJiYgbC5jb25maWcudmlzQ29uZmlnLmVkaXRCb3VuZHMpIHtcbiAgICAgICAgICByZXR1cm4gbC51cGRhdGVMYXllckNvbmZpZyh7XG4gICAgICAgICAgICB2aXNDb25maWc6IHsuLi5sLmNvbmZpZy52aXNDb25maWcsIGVkaXRCb3VuZHM6IGZhbHNlfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsO1xuICAgICAgfSlcbiAgICB9O1xuICB9XG5cbiAgaWYgKG5ld0xheWVyLnNob3VsZENhbGN1bGF0ZUxheWVyRGF0YShwcm9wcykpIHtcbiAgICBjb25zdCBvbGRMYXllckRhdGEgPSBuZXh0U3RhdGUubGF5ZXJEYXRhW2lkeF07XG4gICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBuZXh0U3RhdGUsIG9sZExheWVyRGF0YSk7XG4gICAgcmV0dXJuIHVwZGF0ZVN0YXRlV2l0aExheWVyQW5kRGF0YShuZXh0U3RhdGUsIHtsYXllckRhdGEsIGxheWVyLCBpZHh9KTtcbiAgfVxuXG4gIHJldHVybiB1cGRhdGVTdGF0ZVdpdGhMYXllckFuZERhdGEobmV4dFN0YXRlLCB7bGF5ZXI6IG5ld0xheWVyLCBpZHh9KTtcbn1cblxuLyoqXG4gKiBSZXNldCBhbmltYXRpb24gY29uZmlnIGN1cnJlbnQgdGltZSB0byBhIHNwZWNpZmllZCB2YWx1ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyID0gPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBTLFxuICB7dmFsdWV9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0TGF5ZXJBbmltYXRpb25UaW1lVXBkYXRlckFjdGlvblxuKTogUyA9PiB7XG4gIGNvbnN0IGN1cnJlbnRUaW1lID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZVswXSA6IHZhbHVlO1xuICBjb25zdCBuZXh0U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgICBjdXJyZW50VGltZVxuICAgIH1cbiAgfTtcbiAgLy8gdXBkYXRlIGFuaW1hdGlvbiBjb25maWcgZm9yIGVhY2ggbGF5ZXJcbiAgcmV0dXJuIHN0YXRlLmxheWVycy5yZWR1Y2UoKGFjY3UsIGwpID0+IHtcbiAgICBpZiAobC5jb25maWcuYW5pbWF0aW9uLmVuYWJsZWQgJiYgbC50eXBlICE9PSAndHJpcCcpIHtcbiAgICAgIHJldHVybiBsYXllckFuaW1hdGlvbkNoYW5nZVVwZGF0ZXIoYWNjdSwge29sZExheWVyOiBsLCBwcm9wOiAnY3VycmVudFRpbWUnLCBjdXJyZW50VGltZX0pO1xuICAgIH1cbiAgICByZXR1cm4gYWNjdTtcbiAgfSwgbmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBwcm9wZXJ0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlckFuaW1hdGlvblRpbWVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKHN0YXRlLCBhY3Rpb24pO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBmaWx0ZXIgYW5pbWF0aW9uIHdpbmRvd1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIHtpZCwgYW5pbWF0aW9uV2luZG93fTogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXJBY3Rpb25cbik6IFMge1xuICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZiA9PiBmLmlkID09PSBpZCk7XG5cbiAgaWYgKCFmaWx0ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdGaWx0ZXIgPSB7XG4gICAgLi4uZmlsdGVyLFxuICAgIGFuaW1hdGlvbldpbmRvd1xuICB9O1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShzdGF0ZS5maWx0ZXJzKVxuICB9O1xuXG4gIGNvbnN0IG5ld1N5bmNUaW1lbGluZU1vZGUgPSBnZXRTeW5jQW5pbWF0aW9uTW9kZShuZXdGaWx0ZXIgYXMgVGltZVJhbmdlRmlsdGVyKTtcblxuICByZXR1cm4gc2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIobmV3U3RhdGUsIHtpZCwgbW9kZTogbmV3U3luY1RpbWVsaW5lTW9kZX0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlGaWx0ZXJDb25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFwcGx5RmlsdGVyQ29uZmlnVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7ZmlsdGVySWQsIG5ld0ZpbHRlcn0gPSBhY3Rpb247XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnMuZmluZChmID0+IGYuaWQgPT09IGZpbHRlcklkKTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICAvLyBTZXJpYWxpemUgdGhlIGZpbHRlcnMgdG8gb25seSBjb21wYXJlIHRoZSBzYXZlZCBwcm9wZXJ0aWVzXG4gIGNvbnN0IHNlcmlhbGl6ZWRPbGRGaWx0ZXIgPSBzZXJpYWxpemVGaWx0ZXIob2xkRmlsdGVyLCBzdGF0ZS5zY2hlbWEpID8/IHtjb25maWc6IHt9fTtcbiAgY29uc3Qgc2VyaWFsaXplZE5ld0ZpbHRlciA9IHNlcmlhbGl6ZUZpbHRlcihuZXdGaWx0ZXIsIHN0YXRlLnNjaGVtYSk7XG4gIGlmICghc2VyaWFsaXplZE5ld0ZpbHRlciB8fCBpc0VxdWFsKHNlcmlhbGl6ZWRPbGRGaWx0ZXIsIHNlcmlhbGl6ZWROZXdGaWx0ZXIpKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgLy8gSWYgdGhlcmUgYXJlIGFueSBjaGFuZ2VzIHRvIHRoZSBmaWx0ZXIsIGFwcGx5IHRoZW1cbiAgY29uc3QgY2hhbmdlZCA9IHBpY2tDaGFuZ2VkUHJvcHMoc2VyaWFsaXplZE9sZEZpbHRlciwgc2VyaWFsaXplZE5ld0ZpbHRlcik7XG4gIGRlbGV0ZSBjaGFuZ2VkWydpZCddOyAvLyBpZCBzaG91bGQgbm90IGJlIGNoYW5nZWRcblxuICBjb25zdCBmaWx0ZXJJbmRleCA9IHN0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZmlsdGVySWQpO1xuICBpZiAoZmlsdGVySW5kZXggPCAwKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKFxuICAgIHN0YXRlLFxuICAgIHNldEZpbHRlcihmaWx0ZXJJbmRleCwgT2JqZWN0LmtleXMoY2hhbmdlZCksIE9iamVjdC52YWx1ZXMoY2hhbmdlZCkpXG4gICk7XG59XG5cbi8qKlxuICogVXBkYXRlIGZpbHRlciBwcm9wZXJ0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEZpbHRlclVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFMge1xuICBjb25zdCB7aWR4LCB2YWx1ZUluZGV4ID0gMH0gPSBhY3Rpb247XG4gIGNvbnN0IG9sZEZpbHRlciA9IHN0YXRlLmZpbHRlcnNbaWR4XTtcbiAgaWYgKCFvbGRGaWx0ZXIpIHtcbiAgICBDb25zb2xlLmVycm9yKGBmaWx0ZXJzLiR7aWR4fSBpcyB1bmRlZmluZWRgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgaWYgKFxuICAgIEFycmF5LmlzQXJyYXkoYWN0aW9uLnByb3ApICYmXG4gICAgKCFBcnJheS5pc0FycmF5KGFjdGlvbi52YWx1ZSkgfHwgYWN0aW9uLnByb3AubGVuZ3RoICE9PSBhY3Rpb24udmFsdWUubGVuZ3RoKVxuICApIHtcbiAgICBDb25zb2xlLmVycm9yKCdFeHBlY3RpbmcgdmFsdWUgdG8gYmUgYW4gYXJyYXkgb2YgdGhlIHNhbWUgbGVuZ3RoLCBzaW5jZSBwcm9wIGlzIGFuIGFycmF5Jyk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIC8vIGNvbnZlcnQgcHJvcCBhbmQgdmFsdWUgdG8gYXJyYXlcbiAgY29uc3QgcHJvcHMgPSB0b0FycmF5KGFjdGlvbi5wcm9wKTtcbiAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShhY3Rpb24ucHJvcCkgPyB0b0FycmF5KGFjdGlvbi52YWx1ZSkgOiBbYWN0aW9uLnZhbHVlXTtcblxuICBsZXQgbmV3RmlsdGVyID0gb2xkRmlsdGVyO1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcblxuICBsZXQgZGF0YXNldElkc1RvRmlsdGVyOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgcHJvcCA9IHByb3BzW2ldO1xuICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgIC8vIFdlIGN1cnJlbnRseSBkbyBub3Qgc3VwcG9ydCBwYXNzaW5nIGluIG5hbWUgYXMgYW4gYXJyYXkgaW50byBfdXBkYXRlRmlsdGVyUHJvcCwgc28gd2UgY2FsbCBpdCBtdWx0aXBsZSB0aW1lcyB3aXRoIGVhY2ggbmFtZVxuICAgIC8vIFNlZSB0aGUgY29tbWVudCBpbiB0aGVyZSBhcyB0byB3aGF0IHNob3VsZCBiZSBhZGRyZXNzZWRcbiAgICBsZXQgcmVzO1xuICAgIGlmIChwcm9wID09PSAnbmFtZScgJiYgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1sb29wLWZ1bmNcbiAgICAgIHJlcyA9IHZhbHVlLnJlZHVjZSgoYWNjdSwgdikgPT4ge1xuICAgICAgICByZXR1cm4gX3VwZGF0ZUZpbHRlclByb3AoYWNjdSwgbmV3RmlsdGVyLCBwcm9wLCB2LCB2YWx1ZUluZGV4KTtcbiAgICAgIH0sIG5ld1N0YXRlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gX3VwZGF0ZUZpbHRlclByb3AobmV3U3RhdGUsIG5ld0ZpbHRlciwgcHJvcCwgdmFsdWUsIHZhbHVlSW5kZXgpO1xuICAgIH1cbiAgICBuZXdGaWx0ZXIgPSByZXMuZmlsdGVyO1xuICAgIG5ld1N0YXRlID0gcmVzLnN0YXRlO1xuICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IGRhdGFzZXRJZHNUb0ZpbHRlci5jb25jYXQocmVzLmRhdGFzZXRJZHNUb0ZpbHRlcik7XG4gIH1cblxuICBjb25zdCBlbmxhcmdlZEZpbHRlciA9IHN0YXRlLmZpbHRlcnMuZmluZChmID0+IGYudmlldyA9PT0gRklMVEVSX1ZJRVdfVFlQRVMuZW5sYXJnZWQpO1xuXG4gIGlmIChlbmxhcmdlZEZpbHRlciAmJiBlbmxhcmdlZEZpbHRlci5pZCAhPT0gbmV3RmlsdGVyLmlkKSB7XG4gICAgLy8gdGhlcmUgc2hvdWxkIGJlIG9ubHkgb25lIGVubGFyZ2VkIGZpbHRlclxuICAgIG5ld0ZpbHRlci52aWV3ID0gRklMVEVSX1ZJRVdfVFlQRVMuc2lkZTtcbiAgfVxuXG4gIC8vIHNhdmUgbmV3IGZpbHRlcnMgdG8gbmV3U3RhdGVcbiAgbmV3U3RhdGUgPSBzZXQoWydmaWx0ZXJzJywgaWR4XSwgbmV3RmlsdGVyLCBuZXdTdGF0ZSk7XG5cbiAgLy8gZmlsdGVyIGRhdGFcbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoXG4gICAgdW5pcShkYXRhc2V0SWRzVG9GaWx0ZXIpLFxuICAgIG5ld1N0YXRlLmRhdGFzZXRzLFxuICAgIG5ld1N0YXRlLmZpbHRlcnMsXG4gICAgbmV3U3RhdGUubGF5ZXJzXG4gICk7XG5cbiAgbmV3U3RhdGUgPSBzZXQoWydkYXRhc2V0cyddLCBmaWx0ZXJlZERhdGFzZXRzLCBuZXdTdGF0ZSk7XG5cbiAgLy8gbmVlZCB0byB1cGRhdGUgZmlsdGVyUGxvdCBhZnRlciBmaWx0ZXIgRGF0YXNldCBmb3IgcGxvdCB0byB1cGRhdGUgb24gZmlsdGVyZWQgcmVzdWx0XG4gIGNvbnN0IGZpbHRlcldpdGhQTG90ID0gdXBkYXRlRmlsdGVyUGxvdChuZXdTdGF0ZS5kYXRhc2V0cywgbmV3U3RhdGUuZmlsdGVyc1tpZHhdKTtcblxuICBuZXdTdGF0ZSA9IHNldChbJ2ZpbHRlcnMnLCBpZHhdLCBmaWx0ZXJXaXRoUExvdCwgbmV3U3RhdGUpO1xuXG4gIC8vIGRhdGFJZCBpcyBhbiBhcnJheVxuICAvLyBwYXNzIG9ubHkgdGhlIGRhdGFzZXQgd2UgbmVlZCB0byB1cGRhdGVcbiAgbmV3U3RhdGUgPSB1cGRhdGVBbGxMYXllckRvbWFpbkRhdGEobmV3U3RhdGUsIGRhdGFzZXRJZHNUb0ZpbHRlciwgbmV3RmlsdGVyKTtcblxuICAvLyBJZiB0aW1lIHJhbmdlIGZpbHRlciB2YWx1ZSB3YXMgdXBkYXRlZCwgYWRqdXN0IGFuaW1hdGlvbiBjb25maWdcbiAgaWYgKG5ld0ZpbHRlci50eXBlID09PSBGSUxURVJfVFlQRVMudGltZVJhbmdlICYmIHByb3BzLmluY2x1ZGVzKCd2YWx1ZScpKSB7XG4gICAgbmV3U3RhdGUgPSBhZGp1c3RBbmltYXRpb25Db25maWdXaXRoRmlsdGVyKG5ld1N0YXRlLCBhY3Rpb24uaWR4KTtcbiAgfVxuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuZnVuY3Rpb24gX3VwZGF0ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleChmaWx0ZXIsIHZhbHVlSW5kZXgsIHZhbHVlLCBkYXRhc2V0cykge1xuICBsZXQgbmV3RmlsdGVyID0gZmlsdGVyO1xuICBpZiAoZmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XSkge1xuICAgIC8vIGlmIGRhdGFJZCBhbHJlYWR5IGV4aXN0XG4gICAgbmV3RmlsdGVyID0gX3JlbW92ZUZpbHRlckRhdGFJZEF0VmFsdWVJbmRleChmaWx0ZXIsIHZhbHVlSW5kZXgsIGRhdGFzZXRzKTtcbiAgfVxuICBpZiAodmFsdWUpIHtcbiAgICBjb25zdCBuZXh0VmFsdWUgPSBuZXdGaWx0ZXIuZGF0YUlkLnNsaWNlKCk7XG4gICAgbmV4dFZhbHVlW3ZhbHVlSW5kZXhdID0gdmFsdWU7XG4gICAgbmV3RmlsdGVyID0gc2V0KFsnZGF0YUlkJ10sIG5leHRWYWx1ZSwgbmV3RmlsdGVyKTtcbiAgfVxuICByZXR1cm4gbmV3RmlsdGVyO1xufVxuXG5mdW5jdGlvbiBfcmVtb3ZlRmlsdGVyRGF0YUlkQXRWYWx1ZUluZGV4KGZpbHRlciwgdmFsdWVJbmRleCwgZGF0YXNldHMpIHtcbiAgY29uc3QgZGF0YUlkID0gZmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcblxuICBpZiAoZmlsdGVyLmRhdGFJZC5sZW5ndGggPT09IDEgJiYgdmFsdWVJbmRleCA9PT0gMCkge1xuICAgIC8vIGlmIHJlbW92ZSB0aGUgb25seSBkYXRhSWQsIGNyZWF0ZSBhbiBlbXB0eSBmaWx0ZXIgaW5zdGVhZDtcbiAgICByZXR1cm4gZ2V0RGVmYXVsdEZpbHRlcih7aWQ6IGZpbHRlci5pZH0pO1xuICB9XG5cbiAgaWYgKGRhdGFJZCkge1xuICAgIGZpbHRlciA9IHJlbW92ZUZpbHRlclBsb3QoZmlsdGVyLCBkYXRhSWQpO1xuICB9XG5cbiAgZm9yIChjb25zdCBwcm9wIG9mIFsnZGF0YUlkJywgJ25hbWUnLCAnZmllbGRJZHgnLCAnZ3B1Q2hhbm5lbCddKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyW3Byb3BdKSkge1xuICAgICAgY29uc3QgbmV4dFZhbCA9IGZpbHRlcltwcm9wXS5zbGljZSgpO1xuICAgICAgbmV4dFZhbC5zcGxpY2UodmFsdWVJbmRleCwgMSk7XG4gICAgICBmaWx0ZXIgPSBzZXQoW3Byb3BdLCBuZXh0VmFsLCBmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIC8vIG1lcmdlRmllbGREb21haW4gZm9yIHRoZSByZW1haW5pbmcgZmllbGRzXG4gIGNvbnN0IGRvbWFpblN0ZXBzID0gbWVyZ2VGaWx0ZXJEb21haW4oZmlsdGVyLCBkYXRhc2V0cyk7XG5cbiAgY29uc3QgbmV4dEZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgLy8gdmFsdWU6IG5leHRWYWx1ZSxcbiAgICAuLi4oZG9tYWluU3RlcHMgPyB7ZG9tYWluOiBkb21haW5TdGVwcz8uZG9tYWluLCBzdGVwOiBkb21haW5TdGVwcz8uc3RlcH0gOiB7fSlcbiAgfTtcblxuICBjb25zdCBuZXh0VmFsdWUgPSBhZGp1c3RWYWx1ZVRvRmlsdGVyRG9tYWluKG5leHRGaWx0ZXIudmFsdWUsIG5leHRGaWx0ZXIpO1xuICByZXR1cm4ge1xuICAgIC4uLm5leHRGaWx0ZXIsXG4gICAgdmFsdWU6IG5leHRWYWx1ZVxuICB9O1xufVxuXG4vKiogKlxuICogVXBkYXRlcyBhIHNpbmdsZSBwcm9wZXJ0eSBvZiBhIGZpbHRlclxuICovXG5mdW5jdGlvbiBfdXBkYXRlRmlsdGVyUHJvcChzdGF0ZSwgZmlsdGVyLCBwcm9wLCB2YWx1ZSwgdmFsdWVJbmRleCwgZGF0YXNldElkcz8pIHtcbiAgbGV0IGRhdGFzZXRJZHNUb0ZpbHRlcjogc3RyaW5nW10gPSBbXTtcbiAgc3dpdGNoIChwcm9wKSB7XG4gICAgLy8gVE9ETzogTmV4dCBQUiBmb3IgVUkgaWYgd2UgdXBkYXRlIGZpbHRlckRhdGFJZCwgd2UgbmVlZCB0byBjb25zaWRlciB0d28gY2FzZXM6XG4gICAgLy8gMS4gZGF0YUlkIGlzIGVtcHR5OiBjcmVhdGUgYSBkZWZhdWx0IGZpbHRlclxuICAgIC8vIDIuIEFkZCBhIG5ldyBkYXRhc2V0IGlkXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5kYXRhSWQ6IHtcbiAgICAgIGNvbnN0IG9sZERhdGFJZCA9IFsuLi5maWx0ZXIuZGF0YUlkXTtcbiAgICAgIGZpbHRlciA9IF91cGRhdGVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCB2YWx1ZSwgc3RhdGUuZGF0YXNldHMpO1xuICAgICAgZGF0YXNldElkc1RvRmlsdGVyID0gdW5pcShbLi4ub2xkRGF0YUlkLCAuLi5maWx0ZXIuZGF0YUlkXSk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5uYW1lOiB7XG4gICAgICAvLyB3ZSBhcmUgc3VwcG9ydGluZyB0aGUgY3VycmVudCBmdW5jdGlvbmFsaXR5XG4gICAgICAvLyBUT0RPOiBOZXh0IFBSIGZvciBVSSBmaWx0ZXIgbmFtZSB3aWxsIG9ubHkgdXBkYXRlIGZpbHRlciBuYW1lIGJ1dCBpdCB3b24ndCBoYXZlIHNpZGUgZWZmZWN0c1xuICAgICAgLy8gd2UgYXJlIGdvbm5hIHVzZSBwYWlyIG9mIGRhdGFzZXRzIGFuZCBmaWVsZElkeCB0byB1cGRhdGUgdGhlIGZpbHRlclxuICAgICAgY29uc3QgZGF0YXNldElkID0gZmlsdGVyLmRhdGFJZFt2YWx1ZUluZGV4XTtcbiAgICAgIGNvbnN0IHtmaWx0ZXI6IHVwZGF0ZWRGaWx0ZXIsIGRhdGFzZXQ6IG5ld0RhdGFzZXR9ID0gYXBwbHlGaWx0ZXJGaWVsZE5hbWUoXG4gICAgICAgIGZpbHRlcixcbiAgICAgICAgc3RhdGUuZGF0YXNldHMsXG4gICAgICAgIGRhdGFzZXRJZCxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIHZhbHVlSW5kZXgsXG4gICAgICAgIHttZXJnZURvbWFpbjogdmFsdWVJbmRleCA+IDB9XG4gICAgICApO1xuICAgICAgaWYgKHVwZGF0ZWRGaWx0ZXIpIHtcbiAgICAgICAgZmlsdGVyID0gdXBkYXRlZEZpbHRlcjtcbiAgICAgICAgaWYgKGZpbHRlci5ncHUpIHtcbiAgICAgICAgICBmaWx0ZXIgPSBzZXRGaWx0ZXJHcHVNb2RlKGZpbHRlciwgc3RhdGUuZmlsdGVycyk7XG4gICAgICAgICAgZmlsdGVyID0gYXNzaWduR3B1Q2hhbm5lbChmaWx0ZXIsIHN0YXRlLmZpbHRlcnMpO1xuICAgICAgICB9XG4gICAgICAgIHN0YXRlID0gc2V0KFsnZGF0YXNldHMnLCBkYXRhc2V0SWRdLCBuZXdEYXRhc2V0LCBzdGF0ZSk7XG4gICAgICAgIC8vIHJlbW92ZSBmaWx0ZXIgUGxvdCBhdCBkYXRhc2V0SWQsIHNvIGl0IHdpbGwgYmUgcmVjYWxjdWxhdGVkXG4gICAgICAgIGZpbHRlciA9IHJlbW92ZUZpbHRlclBsb3QoZmlsdGVyLCBkYXRhc2V0SWQpO1xuXG4gICAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IHVwZGF0ZWRGaWx0ZXIuZGF0YUlkO1xuICAgICAgfVxuICAgICAgLy8gb25seSBmaWx0ZXIgdGhlIGN1cnJlbnQgZGF0YXNldFxuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2FzZSBGSUxURVJfVVBEQVRFUl9QUk9QUy5sYXllcklkOiB7XG4gICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSBvbmx5IGRhdGFzZXRJZC9zIGlmIHdlIGhhdmUgYWRkZWQvcmVtb3ZlZCBsYXllcnNcbiAgICAgIC8vIC0gY2hlY2sgZm9yIGxheWVySWQgY2hhbmdlcyAoWE9SIHdvcmtzIGJlY2F1c2Ugb2Ygc3RyaW5nIHZhbHVlcylcbiAgICAgIC8vIGlmIG5vIGRpZmZlcmVuY2VzIGJldHdlZW4gbGF5ZXJJZHMsIGRvbid0IGRvIGFueSBmaWx0ZXJpbmdcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGNvbnN0IGxheWVySWREaWZmZXJlbmNlID0geG9yKHZhbHVlLCBmaWx0ZXIubGF5ZXJJZCk7XG5cbiAgICAgIGNvbnN0IGxheWVyRGF0YUlkcyA9IHVuaXE8c3RyaW5nPihcbiAgICAgICAgbGF5ZXJJZERpZmZlcmVuY2VcbiAgICAgICAgICAubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgLy8gb25seSBmaWx0ZXIgZGF0YXNldHNJZHNcbiAgICAgIGRhdGFzZXRJZHNUb0ZpbHRlciA9IGxheWVyRGF0YUlkcztcblxuICAgICAgLy8gVXBkYXRlIG5ld0ZpbHRlciBkYXRhSWRzXG4gICAgICBjb25zdCBuZXdEYXRhSWRzID0gdW5pcTxzdHJpbmc+KFxuICAgICAgICB2YWx1ZVxuICAgICAgICAgID8ubWFwKGxpZCA9PlxuICAgICAgICAgICAgZ2V0KFxuICAgICAgICAgICAgICBzdGF0ZS5sYXllcnMuZmluZChsID0+IGwuaWQgPT09IGxpZCksXG4gICAgICAgICAgICAgIFsnY29uZmlnJywgJ2RhdGFJZCddXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICAgIC5maWx0ZXIoZCA9PiBkKSBhcyBzdHJpbmdbXVxuICAgICAgKTtcblxuICAgICAgZmlsdGVyID0ge1xuICAgICAgICAuLi5maWx0ZXIsXG4gICAgICAgIGxheWVySWQ6IHZhbHVlLFxuICAgICAgICBkYXRhSWQ6IG5ld0RhdGFJZHNcbiAgICAgIH07XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAgZmlsdGVyID0gc2V0KFtwcm9wXSwgdmFsdWUsIGZpbHRlcik7XG4gICAgICBkYXRhc2V0SWRzVG9GaWx0ZXIgPSBbLi4uZmlsdGVyLmRhdGFJZF07XG4gICAgICBicmVhaztcbiAgfVxuXG4gIHJldHVybiB7ZmlsdGVyLCBkYXRhc2V0SWRzLCBkYXRhc2V0SWRzVG9GaWx0ZXIsIHN0YXRlfTtcbn1cbi8qIGVzbGludC1lbmFibGUgbWF4LXN0YXRlbWVudHMgKi9cblxuLyoqXG4gKiBTZXQgdGhlIHByb3BlcnR5IG9mIGEgZmlsdGVyIHBsb3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJQbG90VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBuZXdQcm9wfTogVmlzU3RhdGVBY3Rpb25zLlNldEZpbHRlclBsb3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGlmICghc3RhdGUuZmlsdGVyc1tpZHhdKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVyc1ske2lkeH1dIGlzIHVuZGVmaW5lZGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBsZXQgbmV3RmlsdGVyID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGZvciAoY29uc3QgcHJvcCBpbiBuZXdQcm9wKSB7XG4gICAgaWYgKHByb3AgPT09ICdwbG90VHlwZScpIHtcbiAgICAgIG5ld0ZpbHRlciA9IHBpY2tfKCdwbG90VHlwZScpKG1lcmdlXyhuZXdQcm9wLnBsb3RUeXBlKSkobmV3RmlsdGVyKTtcbiAgICB9IGVsc2UgaWYgKHByb3AgPT09ICd5QXhpcycpIHtcbiAgICAgIGNvbnN0IGNoYXJ0VHlwZSA9IG5ld1Byb3AueUF4aXMgPyBQTE9UX1RZUEVTLmxpbmVDaGFydCA6IFBMT1RfVFlQRVMuaGlzdG9ncmFtO1xuXG4gICAgICBuZXdGaWx0ZXIgPSBwaWNrXygncGxvdFR5cGUnKShtZXJnZV8oe3R5cGU6IGNoYXJ0VHlwZX0pKShtZXJnZV8obmV3UHJvcCkobmV3RmlsdGVyKSk7XG4gICAgfVxuICB9XG5cbiAgbmV3RmlsdGVyID0gdXBkYXRlRmlsdGVyUGxvdChzdGF0ZS5kYXRhc2V0cywgbmV3RmlsdGVyKTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHN0YXRlLmZpbHRlcnMubWFwKChmLCBpKSA9PiAoaSA9PT0gaWR4ID8gbmV3RmlsdGVyIDogZikpXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBmaWx0ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRGaWx0ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkFkZEZpbHRlclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gICFhY3Rpb24uZGF0YUlkXG4gICAgPyBzdGF0ZVxuICAgIDoge1xuICAgICAgICAuLi5zdGF0ZSxcbiAgICAgICAgZmlsdGVyczogWy4uLnN0YXRlLmZpbHRlcnMsIGdldERlZmF1bHRGaWx0ZXIoe2RhdGFJZDogYWN0aW9uLmRhdGFJZCwgaWQ6IGFjdGlvbi5pZH0pXVxuICAgICAgfTtcblxuLyoqXG4gKiBDcmVhdGUgb3IgdXBkYXRlIGEgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgY3JlYXRlT3JVcGRhdGVGaWx0ZXJVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkNyZWF0ZU9yVXBkYXRlRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWQsIGRhdGFJZCwgZmllbGQsIHZhbHVlfSA9IGFjdGlvbjtcblxuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IG5ld1N0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gaWQpO1xuICBsZXQgZmlsdGVySW5kZXggPSBvcmlnaW5hbEluZGV4O1xuICBpZiAoIWlkICYmICFkYXRhSWQpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cbiAgaWYgKG9yaWdpbmFsSW5kZXggPCAwICYmIGRhdGFJZCkge1xuICAgIG5ld1N0YXRlID0gYWRkRmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge2RhdGFJZH0pO1xuICAgIGlmIChuZXdTdGF0ZS5maWx0ZXJzLmxlbmd0aCAhPT0gc3RhdGUuZmlsdGVycy5sZW5ndGggKyAxKSB7XG4gICAgICAvLyBObyBuZXcgZmlsdGVyIHdhcyBhZGRlZFxuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICAvLyBIZXJlIHdlIGFyZSBhc3N1bWluZyB0aGF0IHRoZSBmaWx0ZXIgd2FzIGFkZGVkIGF0IHRoZSBlbmRcbiAgICBmaWx0ZXJJbmRleCA9IG5ld1N0YXRlLmZpbHRlcnMubGVuZ3RoIC0gMTtcbiAgICBuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlckluZGV4XSA9IHtcbiAgICAgIC4uLm5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySW5kZXhdLFxuICAgICAgLi4uKGlkID8ge2lkfSA6IG51bGwpXG4gICAgfTtcbiAgfVxuXG4gIC8vIE5vIG5lZWQgdG8gdXBkYXRlIHRoaXMgaWYgaXQncyBhIG5ld2x5IGNyZWF0ZWQgZmlsdGVyXG4gIC8vIEZpcnN0IHdlIG1ha2Ugc3VyZSBhbGwgdGhlIGRhdGFJZHMgdGhhdCBmaWVsZHMgcmVmZXIgdG8gYXJlIHVwZGF0ZWRcbiAgaWYgKG9yaWdpbmFsSW5kZXggPj0gMCAmJiBkYXRhSWQpIHtcbiAgICAvLyBJZiB0aGUgZGF0YUlkIGlzIGFuIGFycmF5LCB3ZSBuZWVkIHRvIHVwZGF0ZSBlYWNoIG9uZSBpbmRpdmlkdWFsbHkgYXMgdGhleSBuZWVkIGEgY29ycmVjdCB2YWx1ZUluZGV4IHBhc3NlZFxuICAgIG5ld1N0YXRlID0gKEFycmF5LmlzQXJyYXkoZGF0YUlkKSA/IGRhdGFJZCA6IFtkYXRhSWRdKS5yZWR1Y2UoKGFjY3UsIGQsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihhY2N1LCB7XG4gICAgICAgIGlkeDogZmlsdGVySW5kZXgsXG4gICAgICAgIHByb3A6ICdkYXRhSWQnLFxuICAgICAgICB2YWx1ZTogZCxcbiAgICAgICAgdmFsdWVJbmRleDogaW5kZXhcbiAgICAgIH0pO1xuICAgIH0sIG5ld1N0YXRlKTtcbiAgfVxuICAvLyBUaGVuIHdlIHVwZGF0ZSB0aGUgZmllbGRzXG4gIGlmIChmaWVsZCkge1xuICAgIC8vIElmIHRoZSBmaWVsZCBpcyBhbiBhcnJheSwgd2UgbmVlZCB0byB1cGRhdGUgZWFjaCBmaWVsZCBpbmRpdmlkdWFsbHkgYXMgdGhleSBuZWVkIGEgY29ycmVjdCB2YWx1ZUluZGV4IHBhc3NlZFxuICAgIG5ld1N0YXRlID0gKEFycmF5LmlzQXJyYXkoZmllbGQpID8gZmllbGQgOiBbZmllbGRdKS5yZWR1Y2UoKGFjY3UsIGYsIGluZGV4KSA9PiB7XG4gICAgICByZXR1cm4gc2V0RmlsdGVyVXBkYXRlcihhY2N1LCB7XG4gICAgICAgIGlkeDogZmlsdGVySW5kZXgsXG4gICAgICAgIHByb3A6ICduYW1lJyxcbiAgICAgICAgdmFsdWU6IGYsXG4gICAgICAgIHZhbHVlSW5kZXg6IGluZGV4XG4gICAgICB9KTtcbiAgICB9LCBuZXdTdGF0ZSk7XG4gIH1cbiAgLy8gVGhlbiB3ZSB1cGRhdGUgdGhlIHZhbHVlIHNlcGFyYXRlbHlcbiAgaWYgKHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtpZHg6IGZpbHRlckluZGV4LCBwcm9wOiAndmFsdWUnLCB2YWx1ZX0pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiBTZXQgbGF5ZXIgY29sb3IgcGFsZXR0ZSB1aSBzdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ29sb3JVSUNoYW5nZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29sZExheWVyLCBwcm9wLCBuZXdDb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuTGF5ZXJDb2xvclVJQ2hhbmdlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBvbGRWaXhDb25maWcgPSBvbGRMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBjb25zdCBuZXdMYXllciA9IG9sZExheWVyLnVwZGF0ZUxheWVyQ29sb3JVSShwcm9wLCBuZXdDb25maWcpO1xuICBjb25zdCBuZXdWaXNDb25maWcgPSBuZXdMYXllci5jb25maWcudmlzQ29uZmlnW3Byb3BdO1xuICBpZiAob2xkVml4Q29uZmlnICE9PSBuZXdWaXNDb25maWcpIHtcbiAgICByZXR1cm4gbGF5ZXJWaXNDb25maWdDaGFuZ2VVcGRhdGVyKHN0YXRlLCB7XG4gICAgICBvbGRMYXllcixcbiAgICAgIG5ld1Zpc0NvbmZpZzoge1xuICAgICAgICBbcHJvcF06IG5ld1Zpc0NvbmZpZ1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBzdGF0ZS5sYXllcnMubWFwKGwgPT4gKGwuaWQgPT09IG9sZExheWVyLmlkID8gbmV3TGF5ZXIgOiBsKSlcbiAgfTtcbn07XG5cbi8qKlxuICogU3RhcnQgYW5kIGVuZCBmaWx0ZXIgYW5pbWF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlRmlsdGVyQW5pbWF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVGaWx0ZXJBbmltYXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZmlsdGVyczogc3RhdGUuZmlsdGVycy5tYXAoKGYsIGkpID0+IChpID09PSBhY3Rpb24uaWR4ID8gey4uLmYsIGlzQW5pbWF0aW5nOiAhZi5pc0FuaW1hdGluZ30gOiBmKSlcbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNGaWx0ZXJBbmltYXRpb25Db25maWcoY29uZmlnOiBBbmltYXRpb25Db25maWcgfCBGaWx0ZXJBbmltYXRpb25Db25maWcpOiBib29sZWFuIHtcbiAgcmV0dXJuICdkYXRhSWQnIGluIGNvbmZpZyAmJiAnYW5pbWF0aW9uV2luZG93JyBpbiBjb25maWc7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRBbmltYXRpb25Db25maWdVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNldEFuaW1hdGlvbkNvbmZpZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3Qge2NvbmZpZ30gPSBhY3Rpb247XG4gIGlmIChpc0ZpbHRlckFuaW1hdGlvbkNvbmZpZyhjb25maWcpKSB7XG4gICAgLy8gRmluZCBmaWx0ZXIgdXNlZCBmb3IgYW5pbWF0aW9uXG4gICAgLy8gQXNzdW1pbmcgdGhlcmUncyBvbmx5IG9uZSBmaWx0ZXIgdXNlZCBmb3IgYW5pbWF0aW9uLCBzZWUgc2V0RmlsdGVyVmlld1VwZGF0ZXJcbiAgICBjb25zdCBmaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzLmZpbmQoZiA9PiAhaXNTaWRlRmlsdGVyKGYpKTtcbiAgICBpZiAoIWZpbHRlcikge1xuICAgICAgcmV0dXJuIHN0YXRlO1xuICAgIH1cbiAgICBjb25zdCBuZXdGaWx0ZXIgPSB7Li4uZmlsdGVyLCAuLi5jb25maWd9O1xuICAgIHJldHVybiBhcHBseUZpbHRlckNvbmZpZ1VwZGF0ZXIoc3RhdGUsIGFwcGx5RmlsdGVyQ29uZmlnKGZpbHRlci5pZCwgbmV3RmlsdGVyKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgLi4uY29uZmlnXG4gICAgICB9XG4gICAgfTtcbiAgfVxufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB0b2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckFuaW1hdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBhbmltYXRpb25Db25maWc6IHtcbiAgICAuLi5zdGF0ZS5hbmltYXRpb25Db25maWcsXG4gICAgaXNBbmltYXRpbmc6ICFzdGF0ZS5hbmltYXRpb25Db25maWcuaXNBbmltYXRpbmdcbiAgfVxufSk7XG5cbi8qKlxuICogSGlkZSBhbmQgc2hvdyBsYXllciBhbmltYXRpb24gY29udHJvbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUxheWVyQW5pbWF0aW9uQ29udHJvbFVwZGF0ZXIgPSAoc3RhdGU6IFZpc1N0YXRlKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICBoaWRlQ29udHJvbDogIXN0YXRlLmFuaW1hdGlvbkNvbmZpZy5oaWRlQ29udHJvbFxuICB9XG59KTtcblxuLyoqXG4gKiBDaGFuZ2UgZmlsdGVyIGFuaW1hdGlvbiBzcGVlZFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUZpbHRlckFuaW1hdGlvblNwZWVkVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVGaWx0ZXJBbmltYXRpb25TcGVlZFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT4gKGkgPT09IGFjdGlvbi5pZHggPyB7Li4uZiwgc3BlZWQ6IGFjdGlvbi5zcGVlZH0gOiBmKSlcbn0pO1xuXG4vKipcbiAqIFVwZGF0ZSBhbmltYXRpb24gc3BlZWQgd2l0aCB0aGUgdmVydGljYWwgc3BlZWQgc2xpZGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICpcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQW5pbWF0aW9uU3BlZWRVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtzcGVlZH06IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVMYXllckFuaW1hdGlvblNwZWVkVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGFuaW1hdGlvbkNvbmZpZzoge1xuICAgICAgLi4uc3RhdGUuYW5pbWF0aW9uQ29uZmlnLFxuICAgICAgc3BlZWRcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIFNob3cgbGFyZ2VyIHRpbWUgZmlsdGVyIGF0IGJvdHRvbSBmb3IgdGltZSBwbGF5YmFjayAoYXBwbHkgdG8gdGltZSBmaWx0ZXIgb25seSlcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRGaWx0ZXJWaWV3VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5TZXRGaWx0ZXJWaWV3VXBkYXRlckFjdGlvblxuKSA9PiB7XG4gIGNvbnN0IHt2aWV3LCBpZHh9ID0gYWN0aW9uO1xuICBjb25zdCBzaG91bGRSZXNldE90aGVyRmlsdGVyc1ZpZXcgPSB2aWV3ID09PSBGSUxURVJfVklFV19UWVBFUy5lbmxhcmdlZDtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBmaWx0ZXJzOiBzdGF0ZS5maWx0ZXJzLm1hcCgoZiwgaSkgPT5cbiAgICAgIGkgPT09IGlkeFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICB2aWV3XG4gICAgICAgICAgfVxuICAgICAgICA6IHNob3VsZFJlc2V0T3RoZXJGaWx0ZXJzVmlld1xuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLmYsXG4gICAgICAgICAgICB2aWV3OiBGSUxURVJfVklFV19UWVBFUy5zaWRlXG4gICAgICAgICAgfVxuICAgICAgICA6IGZcbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIFRvZ2dsZXMgZmlsdGVyIGZlYXR1cmUgdmlzaWJpbGl0eVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUZpbHRlckZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbYWN0aW9uLmlkeF07XG4gIGNvbnN0IGlzVmlzaWJsZSA9IGdldChmaWx0ZXIsIFsndmFsdWUnLCAncHJvcGVydGllcycsICdpc1Zpc2libGUnXSk7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0RmlsdGVyVXBkYXRlcihzdGF0ZSwge1xuICAgIGlkeDogYWN0aW9uLmlkeCxcbiAgICBwcm9wOiAnZW5hYmxlZCcsXG4gICAgdmFsdWU6ICFpc1Zpc2libGVcbiAgfSk7XG5cbiAgbmV3U3RhdGUgPSBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWR4OiBhY3Rpb24uaWR4LFxuICAgIHByb3A6ICd2YWx1ZScsXG4gICAgdmFsdWU6IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZpbHRlci52YWx1ZSwgZmlsdGVyLmlkLCB7XG4gICAgICBpc1Zpc2libGU6ICFpc1Zpc2libGVcbiAgICB9KVxuICB9KTtcblxuICByZXR1cm4gbmV3U3RhdGU7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhIGZpbHRlclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlbW92ZUZpbHRlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCB7aWR4fSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFJZCwgaWR9ID0gc3RhdGUuZmlsdGVyc1tpZHhdO1xuXG4gIGNvbnN0IG5ld0ZpbHRlcnMgPSBbXG4gICAgLi4uc3RhdGUuZmlsdGVycy5zbGljZSgwLCBpZHgpLFxuICAgIC4uLnN0YXRlLmZpbHRlcnMuc2xpY2UoaWR4ICsgMSwgc3RhdGUuZmlsdGVycy5sZW5ndGgpXG4gIF07XG5cbiAgY29uc3QgZmlsdGVyZWREYXRhc2V0cyA9IGFwcGx5RmlsdGVyc1RvRGF0YXNldHMoZGF0YUlkLCBzdGF0ZS5kYXRhc2V0cywgbmV3RmlsdGVycywgc3RhdGUubGF5ZXJzKTtcbiAgY29uc3QgbmV3RWRpdG9yID1cbiAgICBnZXRGaWx0ZXJJZEluRmVhdHVyZShzdGF0ZS5lZGl0b3Iuc2VsZWN0ZWRGZWF0dXJlKSA9PT0gaWRcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgICAgICAgfVxuICAgICAgOiBzdGF0ZS5lZGl0b3I7XG5cbiAgbGV0IG5ld1N0YXRlID0gc2V0KFsnZmlsdGVycyddLCBuZXdGaWx0ZXJzLCBzdGF0ZSk7XG4gIG5ld1N0YXRlID0gc2V0KFsnZGF0YXNldHMnXSwgZmlsdGVyZWREYXRhc2V0cywgbmV3U3RhdGUpO1xuICBuZXdTdGF0ZSA9IHNldChbJ2VkaXRvciddLCBuZXdFZGl0b3IsIG5ld1N0YXRlKTtcblxuICByZXR1cm4gdXBkYXRlQWxsTGF5ZXJEb21haW5EYXRhKG5ld1N0YXRlLCBkYXRhSWQsIHVuZGVmaW5lZCk7XG59O1xuXG4vKipcbiAqIEFkZCBhIG5ldyBsYXllclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZExheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRMYXllclVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgbGV0IG5ld0xheWVyO1xuICBsZXQgbmV3TGF5ZXJEYXRhO1xuICBpZiAoYWN0aW9uLmNvbmZpZykge1xuICAgIG5ld0xheWVyID0gY3JlYXRlTGF5ZXJGcm9tQ29uZmlnKHN0YXRlLCBhY3Rpb24uY29uZmlnKTtcbiAgICBpZiAoIW5ld0xheWVyKSB7XG4gICAgICBDb25zb2xlLndhcm4oXG4gICAgICAgICdGYWlsZWQgdG8gY3JlYXRlIGxheWVyIGZyb20gY29uZmlnLCBpdCB1c3VhbGx5IG1lYW5zIHRoZSBjb25maWcgaXMgbm90IGJlIGluIGNvcnJlY3QgZm9ybWF0JyxcbiAgICAgICAgYWN0aW9uLmNvbmZpZ1xuICAgICAgKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBjb25zdCByZXN1bHQgPSBjYWxjdWxhdGVMYXllckRhdGEobmV3TGF5ZXIsIHN0YXRlKTtcbiAgICBuZXdMYXllciA9IHJlc3VsdC5sYXllcjtcbiAgICBuZXdMYXllckRhdGEgPSByZXN1bHQubGF5ZXJEYXRhO1xuICB9IGVsc2Uge1xuICAgIC8vIGNyZWF0ZSBhbiBlbXB0eSBsYXllciB3aXRoIGEgc3BlY2lmaWMgZGF0YXNldCBvciBhIGRlZmF1bHQgb25lXG4gICAgY29uc3QgZGVmYXVsdERhdGFzZXQgPSBhY3Rpb24uZGF0YXNldElkID8/IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKVswXTtcbiAgICBuZXdMYXllciA9IG5ldyBMYXllcih7XG4gICAgICBpc1Zpc2libGU6IHRydWUsXG4gICAgICBpc0NvbmZpZ0FjdGl2ZTogdHJ1ZSxcbiAgICAgIGRhdGFJZDogZGVmYXVsdERhdGFzZXRcbiAgICB9KTtcbiAgICBuZXdMYXllckRhdGEgPSB7fTtcbiAgfVxuXG4gIGxldCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IFsuLi5zdGF0ZS5sYXllcnMsIG5ld0xheWVyXSxcbiAgICBsYXllckRhdGE6IFsuLi5zdGF0ZS5sYXllckRhdGEsIG5ld0xheWVyRGF0YV0sXG4gICAgLy8gYWRkIG5ldyBsYXllciBhdCB0aGUgdG9wXG4gICAgbGF5ZXJPcmRlcjogW25ld0xheWVyLmlkLCAuLi5zdGF0ZS5sYXllck9yZGVyXSxcbiAgICBzcGxpdE1hcHM6IGFkZE5ld0xheWVyc1RvU3BsaXRNYXAoc3RhdGUuc3BsaXRNYXBzLCBuZXdMYXllcilcbiAgfTtcblxuICBpZiAobmV3TGF5ZXIuY29uZmlnLmFuaW1hdGlvbi5lbmFibGVkKSB7XG4gICAgbmV3U3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4obmV3U3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufTtcblxuLyoqXG4gKiByZW1vdmUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVMYXllclVwZGF0ZXI8VCBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFQsXG4gIHtpZH06IFZpc1N0YXRlQWN0aW9ucy5SZW1vdmVMYXllclVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICBjb25zdCBpZHggPSBOdW1iZXIuaXNGaW5pdGUoaWQpXG4gICAgPyAvLyBzdXBwb3J0IG9sZGVyIEFQSSwgcmVtb3ZlIGxheWVyIGJ5IGlkeFxuICAgICAgTnVtYmVyKGlkKVxuICAgIDogc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmxheWVycy5sZW5ndGgpIHtcbiAgICAvLyBpbnZhbGlkIGluZGV4XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHJlbW92ZSBsYXllciB3aXRoIGludmFsaWQgaWR8aWR4ICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2xheWVycywgbGF5ZXJEYXRhLCBsYXllck9yZGVyLCBjbGlja2VkLCBob3ZlckluZm99ID0gc3RhdGU7XG4gIGNvbnN0IGxheWVyVG9SZW1vdmUgPSBsYXllcnNbaWR4XTtcbiAgY29uc3QgbmV3U3RhdGUgPSB7XG4gICAgLi4uc3RhdGUsXG4gICAgbGF5ZXJzOiBmaWx0ZXJPdXRCeUlkKGxheWVyVG9SZW1vdmUuaWQpKGxheWVycyksXG4gICAgbGF5ZXJEYXRhOiByZW1vdmVFbGVtZW50QXRJbmRleChpZHgpKGxheWVyRGF0YSksXG4gICAgbGF5ZXJPcmRlcjogbGF5ZXJPcmRlci5maWx0ZXIobGF5ZXJJZCA9PiBsYXllcklkICE9PSBsYXllclRvUmVtb3ZlLmlkKSxcbiAgICBjbGlja2VkOiBsYXllclRvUmVtb3ZlLmlzTGF5ZXJIb3ZlcmVkKGNsaWNrZWQpID8gdW5kZWZpbmVkIDogY2xpY2tlZCxcbiAgICBob3ZlckluZm86IGxheWVyVG9SZW1vdmUuaXNMYXllckhvdmVyZWQoaG92ZXJJbmZvKSA/IHVuZGVmaW5lZCA6IGhvdmVySW5mbyxcbiAgICBzcGxpdE1hcHM6IHJlbW92ZUxheWVyRnJvbVNwbGl0TWFwcyhzdGF0ZS5zcGxpdE1hcHMsIGxheWVyVG9SZW1vdmUpXG4gICAgLy8gVE9ETzogdXBkYXRlIGZpbHRlcnMsIGNyZWF0ZSBoZWxwZXIgdG8gcmVtb3ZlIGxheWVyIGZvcm0gZmlsdGVyIChyZW1vdmUgbGF5ZXJpZCBhbmQgZGF0YWlkKSBpZiBtYXBwZWRcbiAgfTtcblxuICByZXR1cm4gdXBkYXRlQW5pbWF0aW9uRG9tYWluKG5ld1N0YXRlKTtcbn1cblxuLyoqXG4gKiBSZW9yZGVyIGxheWVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckxheWVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7b3JkZXJ9OiBWaXNTdGF0ZUFjdGlvbnMuUmVvcmRlckxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGxheWVyT3JkZXI6IG9yZGVyXG59KTtcblxuLyoqXG4gKiBkdXBsaWNhdGUgbGF5ZXJcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBkdXBsaWNhdGVMYXllclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLkR1cGxpY2F0ZUxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBOdW1iZXIuaXNGaW5pdGUoaWQpXG4gICAgPyAvLyBzdXBwb3J0IG9sZGVyIEFQSSwgcmVtb3ZlIGxheWVyIGJ5IGlkeFxuICAgICAgTnVtYmVyKGlkKVxuICAgIDogc3RhdGUubGF5ZXJzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgIXN0YXRlLmxheWVyc1tpZHhdKSB7XG4gICAgQ29uc29sZS53YXJuKGBsYXllciAke2lkeH0gbm90IGZvdW5kIGluIGxheWVyT3JkZXJgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7bGF5ZXJzfSA9IHN0YXRlO1xuICBjb25zdCBvcmlnaW5hbCA9IGxheWVyc1tpZHhdO1xuXG4gIGNvbnN0IG9yaWdpbmFsTGF5ZXJPcmRlcklkeCA9IHN0YXRlLmxheWVyT3JkZXIuZmluZEluZGV4KGxpZCA9PiBsaWQgPT09IG9yaWdpbmFsLmlkKTtcbiAgbGV0IG5ld0xhYmVsID0gYENvcHkgb2YgJHtvcmlnaW5hbC5jb25maWcubGFiZWx9YDtcbiAgbGV0IHBvc3RmaXggPSAwO1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbG9vcC1mdW5jXG4gIHdoaWxlIChsYXllcnMuZmluZChsID0+IGwuY29uZmlnLmxhYmVsID09PSBuZXdMYWJlbCkpIHtcbiAgICBuZXdMYWJlbCA9IGBDb3B5IG9mICR7b3JpZ2luYWwuY29uZmlnLmxhYmVsfSAkeysrcG9zdGZpeH1gO1xuICB9XG5cbiAgLy8gY29sbGVjdCBsYXllciBjb25maWcgZnJvbSBvcmlnaW5hbFxuICBjb25zdCBsb2FkZWRMYXllciA9IHNlcmlhbGl6ZUxheWVyKG9yaWdpbmFsLCBzdGF0ZS5zY2hlbWEpO1xuXG4gIC8vIGFzc2lnbiBuZXcgaWQgYW5kIGxhYmVsIHRvIGNvcGllZCBsYXllclxuICBpZiAoIWxvYWRlZExheWVyPy5jb25maWcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbG9hZGVkTGF5ZXIuY29uZmlnLmxhYmVsID0gbmV3TGFiZWw7XG4gIGxvYWRlZExheWVyLmlkID0gZ2VuZXJhdGVIYXNoSWQoTEFZRVJfSURfTEVOR1RIKTtcblxuICAvLyBhZGQgbGF5ZXIgdG8gc3RhdGVcbiAgbGV0IG5leHRTdGF0ZSA9IGFkZExheWVyVXBkYXRlcihzdGF0ZSwge2NvbmZpZzogbG9hZGVkTGF5ZXJ9KTtcbiAgLy8gcmV0cmlldmUgbmV3bHkgY3JlYXRlZCBsYXllclxuICBjb25zdCBuZXdMYXllciA9IG5leHRTdGF0ZS5sYXllcnNbbmV4dFN0YXRlLmxheWVycy5sZW5ndGggLSAxXTtcbiAgLy8gdXBkYXRlIGxheWVyIG9yZGVyIHdpdGggbmV3THlhZXIuaWRcbiAgY29uc3QgbmV3TGF5ZXJPcmRlciA9IGFycmF5SW5zZXJ0KFxuICAgIG5leHRTdGF0ZS5sYXllck9yZGVyLnNsaWNlKDEsIG5leHRTdGF0ZS5sYXllck9yZGVyLmxlbmd0aCksXG4gICAgb3JpZ2luYWxMYXllck9yZGVySWR4LFxuICAgIG5ld0xheWVyLmlkXG4gICk7XG5cbiAgbmV4dFN0YXRlID0gcmVvcmRlckxheWVyVXBkYXRlcihuZXh0U3RhdGUsIHtvcmRlcjogbmV3TGF5ZXJPcmRlcn0pO1xuXG4gIHJldHVybiB1cGRhdGVBbmltYXRpb25Eb21haW4obmV4dFN0YXRlKTtcbn07XG5cbi8qKlxuICogQWRkIGEgbmV3IGVmZmVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFkZEVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuQWRkRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoXG4gICAgYWN0aW9uLmNvbmZpZz8udHlwZSA9PT0gTElHSFRfQU5EX1NIQURPV19FRkZFQ1QudHlwZSAmJlxuICAgIHN0YXRlLmVmZmVjdHMuc29tZShlZmZlY3QgPT4gZWZmZWN0LnR5cGUgPT09IExJR0hUX0FORF9TSEFET1dfRUZGRUNULnR5cGUpXG4gICkge1xuICAgIENvbnNvbGUud2FybihgQ2FuJ3QgYWRkIG1vcmUgdGhhbiBvbmUgJHtMSUdIVF9BTkRfU0hBRE9XX0VGRkVDVC5uYW1lfSBlZmZlY3RgKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBpZiAoXG4gICAgYWN0aW9uLmNvbmZpZz8udHlwZSA9PT0gRElTVEFOQ0VfRk9HX1RZUEUgJiZcbiAgICBzdGF0ZS5lZmZlY3RzLnNvbWUoXG4gICAgICBlZmZlY3QgPT4gZWZmZWN0LnR5cGUgPT09IERJU1RBTkNFX0ZPR19UWVBFIHx8IGVmZmVjdC50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFXG4gICAgKVxuICApIHtcbiAgICBDb25zb2xlLndhcm4oXCJDYW4ndCBhZGQgbW9yZSB0aGFuIG9uZSBmb2cgZWZmZWN0XCIpO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGlmIChcbiAgICBhY3Rpb24uY29uZmlnPy50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFICYmXG4gICAgc3RhdGUuZWZmZWN0cy5zb21lKFxuICAgICAgZWZmZWN0ID0+IGVmZmVjdC50eXBlID09PSBTVVJGQUNFX0ZPR19UWVBFIHx8IGVmZmVjdC50eXBlID09PSBESVNUQU5DRV9GT0dfVFlQRVxuICAgIClcbiAgKSB7XG4gICAgQ29uc29sZS53YXJuKFwiQ2FuJ3QgYWRkIG1vcmUgdGhhbiBvbmUgZm9nIGVmZmVjdFwiKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBuZXdFZmZlY3QgPSBjcmVhdGVFZmZlY3QoYWN0aW9uLmNvbmZpZyk7XG5cbiAgLy8gY29sbGFwc2UgY29uZmlndXJhdG9ycyBmb3Igb3RoZXIgZWZmZWN0c1xuICBzdGF0ZS5lZmZlY3RzLmZvckVhY2goZWZmZWN0ID0+IGVmZmVjdC5zZXRQcm9wcyh7aXNDb25maWdBY3RpdmU6IGZhbHNlfSkpO1xuXG4gIGNvbnN0IGVmZmVjdHMgPSBbLi4uc3RhdGUuZWZmZWN0cywgbmV3RWZmZWN0XTtcbiAgY29uc3QgZWZmZWN0T3JkZXIgPSBmaXhFZmZlY3RPcmRlcihlZmZlY3RzLCBbbmV3RWZmZWN0LmlkLCAuLi5zdGF0ZS5lZmZlY3RPcmRlcl0pO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLyoqXG4gKiByZW1vdmUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVtb3ZlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRWZmZWN0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBpZHggPSBzdGF0ZS5lZmZlY3RzLmZpbmRJbmRleChsID0+IGwuaWQgPT09IGlkKTtcbiAgaWYgKGlkeCA8IDAgfHwgaWR4ID49IHN0YXRlLmVmZmVjdHMubGVuZ3RoKSB7XG4gICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHJlbW92ZSBlZmZlY3Qgd2l0aCBpbnZhbGlkIGlkICR7aWR9YCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3Qge2VmZmVjdHMsIGVmZmVjdE9yZGVyfSA9IHN0YXRlO1xuICBjb25zdCBlZmZlY3RUb1JlbW92ZSA9IGVmZmVjdHNbaWR4XTtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICAvLyBAdHMtZXhwZWN0LWVycm9yIGZpeGVkIGluIHRzXG4gICAgZWZmZWN0czogZmlsdGVyT3V0QnlJZChlZmZlY3RUb1JlbW92ZS5pZCkoZWZmZWN0cyksXG4gICAgZWZmZWN0T3JkZXI6IGVmZmVjdE9yZGVyLmZpbHRlcihlZmZlY3RJZCA9PiBlZmZlY3RJZCAhPT0gZWZmZWN0VG9SZW1vdmUuaWQpXG4gIH07XG59O1xuXG4vKipcbiAqIFJlb3JkZXIgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVvcmRlckVmZmVjdFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge29yZGVyfTogVmlzU3RhdGVBY3Rpb25zLlJlb3JkZXJFZmZlY3RVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgZWZmZWN0T3JkZXI6IGZpeEVmZmVjdE9yZGVyKHN0YXRlLmVmZmVjdHMsIFsuLi5vcmRlcl0pXG59KTtcblxuLyoqXG4gKiBVcGRhdGUgZWZmZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlRWZmZWN0VXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIHByb3BzfTogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUVmZmVjdFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBpZCk7XG4gIGlmIChpZHggPCAwIHx8IGlkeCA+PSBzdGF0ZS5lZmZlY3RzLmxlbmd0aCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgZWZmZWN0IHdpdGggaW52YWxpZCBpZCAke2lkfWApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGxldCBlZmZlY3RPcmRlciA9IHN0YXRlLmVmZmVjdE9yZGVyO1xuICBpZiAocHJvcHMuaWQgIT09IHVuZGVmaW5lZCAmJiBwcm9wcy5pZCAhPT0gaWQpIHtcbiAgICBjb25zdCBpZHgyID0gc3RhdGUuZWZmZWN0cy5maW5kSW5kZXgobCA9PiBsLmlkID09PSBwcm9wcy5pZCk7XG4gICAgaWYgKGlkeDIgPj0gMCkge1xuICAgICAgQ29uc29sZS53YXJuKGBjYW4gbm90IHVwZGF0ZSBlZmZlY3Qgd2l0aCBleGlzdGluZyBlZmZlY3QgaWQgJHtpZH1gKTtcbiAgICAgIHJldHVybiBzdGF0ZTtcbiAgICB9XG5cbiAgICBlZmZlY3RPcmRlciA9IGVmZmVjdE9yZGVyLm1hcChlZmZlY3RPcmRlcklkID0+XG4gICAgICBlZmZlY3RPcmRlcklkID09PSBpZCA/IChwcm9wcy5pZCBhcyBzdHJpbmcpIDogZWZmZWN0T3JkZXJJZFxuICAgICk7XG4gIH1cblxuICBjb25zdCBuZXdFZmZlY3RzID0gWy4uLnN0YXRlLmVmZmVjdHNdO1xuICBuZXdFZmZlY3RzW2lkeF0uc2V0UHJvcHMocHJvcHMpO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWZmZWN0czogbmV3RWZmZWN0cyxcbiAgICBlZmZlY3RPcmRlclxuICB9O1xufTtcblxuLy8gQU5OT1RBVElPTiBVUERBVEVSU1xuXG5mdW5jdGlvbiBtYWtlTmV3QW5ub3RhdGlvbihjb25maWc/OiBBbm5vdGF0aW9uUHJvcHNQYXJ0aWFsKTogQW5ub3RhdGlvbiB7XG4gIGNvbnN0IGtpbmQgPSBjb25maWc/LmtpbmQgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0tJTkQ7XG4gIGNvbnN0IGJhc2UgPSB7XG4gICAgaWQ6IGNvbmZpZz8uaWQgPz8gZ2VuZXJhdGVIYXNoSWQoNiksXG4gICAga2luZCxcbiAgICBpc1Zpc2libGU6IGNvbmZpZz8uaXNWaXNpYmxlID8/IHRydWUsXG4gICAgYXV0b1NpemU6IGNvbmZpZz8uYXV0b1NpemUgPz8gdHJ1ZSxcbiAgICBhdXRvU2l6ZVk6IGNvbmZpZz8uYXV0b1NpemVZID8/IHRydWUsXG4gICAgYW5jaG9yUG9pbnQ6IGNvbmZpZz8uYW5jaG9yUG9pbnQgPz8gKFswLCAwXSBhcyBbbnVtYmVyLCBudW1iZXJdKSxcbiAgICBsYWJlbDogY29uZmlnPy5sYWJlbCA/PyAnTmV3IEFubm90YXRpb24nLFxuICAgIGxpbmVDb2xvcjogY29uZmlnPy5saW5lQ29sb3IgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0xJTkVfQ09MT1IsXG4gICAgbGluZVdpZHRoOiBjb25maWc/LmxpbmVXaWR0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fTElORV9XSURUSCxcbiAgICB0ZXh0V2lkdGg6IGNvbmZpZz8udGV4dFdpZHRoID8/IElOSVRJQUxfQU5OT1RBVElPTl9URVhUX1dJRFRILFxuICAgIHRleHRIZWlnaHQ6IGNvbmZpZz8udGV4dEhlaWdodCA/PyBJTklUSUFMX0FOTk9UQVRJT05fVEVYVF9IRUlHSFQsXG4gICAgdGV4dFZlcnRpY2FsQWxpZ246IGNvbmZpZz8udGV4dFZlcnRpY2FsQWxpZ24gPz8gKCdib3R0b20nIGFzIGNvbnN0KSxcbiAgICBtYXBJbmRleDogY29uZmlnPy5tYXBJbmRleFxuICB9O1xuXG4gIHN3aXRjaCAoa2luZCkge1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuUE9JTlQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5QT0lOVCxcbiAgICAgICAgYXJtTGVuZ3RoOiAoY29uZmlnIGFzIGFueSk/LmFybUxlbmd0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fQVJNX0xFTkdUSCxcbiAgICAgICAgYW5nbGU6IChjb25maWcgYXMgYW55KT8uYW5nbGUgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0FOR0xFXG4gICAgICB9O1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuQVJST1c6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5BUlJPVyxcbiAgICAgICAgYXJtTGVuZ3RoOiAoY29uZmlnIGFzIGFueSk/LmFybUxlbmd0aCA/PyBJTklUSUFMX0FOTk9UQVRJT05fQVJNX0xFTkdUSCxcbiAgICAgICAgYW5nbGU6IChjb25maWcgYXMgYW55KT8uYW5nbGUgPz8gSU5JVElBTF9BTk5PVEFUSU9OX0FOR0xFXG4gICAgICB9O1xuICAgIGNhc2UgQW5ub3RhdGlvbktpbmQuQ0lSQ0xFOlxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uYmFzZSxcbiAgICAgICAga2luZDogQW5ub3RhdGlvbktpbmQuQ0lSQ0xFLFxuICAgICAgICBhcm1MZW5ndGg6IChjb25maWcgYXMgYW55KT8uYXJtTGVuZ3RoID8/IElOSVRJQUxfQU5OT1RBVElPTl9BUk1fTEVOR1RILFxuICAgICAgICBhbmdsZTogKGNvbmZpZyBhcyBhbnkpPy5hbmdsZSA/PyBJTklUSUFMX0FOTk9UQVRJT05fQU5HTEUsXG4gICAgICAgIHJhZGl1c0luTWV0ZXJzOiAoY29uZmlnIGFzIGFueSk/LnJhZGl1c0luTWV0ZXJzID8/IDEwMDBcbiAgICAgIH07XG4gICAgY2FzZSBBbm5vdGF0aW9uS2luZC5URVhUOlxuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4ge1xuICAgICAgICAuLi5iYXNlLFxuICAgICAgICBraW5kOiBBbm5vdGF0aW9uS2luZC5URVhUXG4gICAgICB9O1xuICB9XG59XG5cbi8qKlxuICogQWRkIGEgbmV3IGFubm90YXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5BZGRBbm5vdGF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBjb25zdCBuZXdBbm5vdGF0aW9uID0gbWFrZU5ld0Fubm90YXRpb24oYWN0aW9uLmNvbmZpZyk7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFtuZXdBbm5vdGF0aW9uLCAuLi5zdGF0ZS5hbm5vdGF0aW9uc10sXG4gICAgc2VsZWN0ZWRBbm5vdGF0aW9uSWQ6IG5ld0Fubm90YXRpb24uaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IHRydWVcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGFubm90YXRpb25cbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCByZW1vdmVBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR9OiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlQW5ub3RhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbm5vdGF0aW9uczogc3RhdGUuYW5ub3RhdGlvbnMuZmlsdGVyKGEgPT4gYS5pZCAhPT0gaWQpLFxuICAgIHNlbGVjdGVkQW5ub3RhdGlvbklkOiBzdGF0ZS5zZWxlY3RlZEFubm90YXRpb25JZCA9PT0gaWQgPyBudWxsIDogc3RhdGUuc2VsZWN0ZWRBbm5vdGF0aW9uSWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6XG4gICAgICBzdGF0ZS5zZWxlY3RlZEFubm90YXRpb25JZCA9PT0gaWQgPyBmYWxzZSA6IHN0YXRlLmlzRWRpdGluZ0Fubm90YXRpb25UZXh0XG4gIH07XG59O1xuXG4vKipcbiAqIFVwZGF0ZSBhbiBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdXBkYXRlQW5ub3RhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkLCBjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuVXBkYXRlQW5ub3RhdGlvblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3QgaWR4ID0gc3RhdGUuYW5ub3RhdGlvbnMuZmluZEluZGV4KGEgPT4gYS5pZCA9PT0gaWQpO1xuICBpZiAoaWR4IDwgMCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCB1cGRhdGUgYW5ub3RhdGlvbiB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgcHJldiA9IHN0YXRlLmFubm90YXRpb25zW2lkeF07XG4gIGxldCBuZXh0QW5ub3RhdGlvbjogQW5ub3RhdGlvbjtcblxuICBpZiAoY29uZmlnLmtpbmQgJiYgY29uZmlnLmtpbmQgIT09IHByZXYua2luZCkge1xuICAgIG5leHRBbm5vdGF0aW9uID0gbWFrZU5ld0Fubm90YXRpb24oey4uLnByZXYsIC4uLmNvbmZpZ30gYXMgQW5ub3RhdGlvblByb3BzUGFydGlhbCk7XG4gIH0gZWxzZSB7XG4gICAgbmV4dEFubm90YXRpb24gPSB7Li4ucHJldiwgLi4uY29uZmlnfSBhcyBBbm5vdGF0aW9uO1xuICB9XG5cbiAgY29uc3QgbmV3QW5ub3RhdGlvbnMgPSBbLi4uc3RhdGUuYW5ub3RhdGlvbnNdO1xuICBuZXdBbm5vdGF0aW9uc1tpZHhdID0gbmV4dEFubm90YXRpb247XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IG5ld0Fubm90YXRpb25zXG4gIH07XG59O1xuXG4vKipcbiAqIER1cGxpY2F0ZSBhbiBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgZHVwbGljYXRlQW5ub3RhdGlvblVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2lkfTogVmlzU3RhdGVBY3Rpb25zLkR1cGxpY2F0ZUFubm90YXRpb25VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IG9yaWdpbmFsID0gc3RhdGUuYW5ub3RhdGlvbnMuZmluZChhID0+IGEuaWQgPT09IGlkKTtcbiAgaWYgKCFvcmlnaW5hbCkge1xuICAgIENvbnNvbGUud2FybihgY2FuIG5vdCBkdXBsaWNhdGUgYW5ub3RhdGlvbiB3aXRoIGludmFsaWQgaWQgJHtpZH1gKTtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3QgbmV3QW5ub3RhdGlvbiA9IHtcbiAgICAuLi5jbG9uZURlZXAob3JpZ2luYWwpLFxuICAgIGlkOiBnZW5lcmF0ZUhhc2hJZCg2KSxcbiAgICBsYWJlbDogYENvcHkgb2YgJHtvcmlnaW5hbC5sYWJlbH1gXG4gIH07XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgYW5ub3RhdGlvbnM6IFtuZXdBbm5vdGF0aW9uLCAuLi5zdGF0ZS5hbm5vdGF0aW9uc10sXG4gICAgc2VsZWN0ZWRBbm5vdGF0aW9uSWQ6IG5ld0Fubm90YXRpb24uaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IGZhbHNlXG4gIH07XG59O1xuXG4vKipcbiAqIFNldCBzZWxlY3RlZCBhbm5vdGF0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0U2VsZWN0ZWRBbm5vdGF0aW9uVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWQsIGlzRWRpdGluZ1RleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRBbm5vdGF0aW9uVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICBpZiAoXG4gICAgaWQgPT09IHN0YXRlLnNlbGVjdGVkQW5ub3RhdGlvbklkICYmXG4gICAgKGlzRWRpdGluZ1RleHQgPz8gZmFsc2UpID09PSBzdGF0ZS5pc0VkaXRpbmdBbm5vdGF0aW9uVGV4dFxuICApIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBzZWxlY3RlZEFubm90YXRpb25JZDogaWQsXG4gICAgaXNFZGl0aW5nQW5ub3RhdGlvblRleHQ6IGlzRWRpdGluZ1RleHQgPz8gZmFsc2VcbiAgfTtcbn07XG5cbi8qKlxuICogUmVtb3ZlIGEgZGF0YXNldCBhbmQgYWxsIGxheWVycywgZmlsdGVycywgdG9vbHRpcCBjb25maWdzIHRoYXQgYmFzZWQgb24gaXRcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZW1vdmVEYXRhc2V0VXBkYXRlcjxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUmVtb3ZlRGF0YXNldFVwZGF0ZXJBY3Rpb25cbik6IFQge1xuICAvLyBleHRyYWN0IGRhdGFzZXQga2V5XG4gIGNvbnN0IHtkYXRhSWQ6IGRhdGFzZXRLZXl9ID0gYWN0aW9uO1xuICBjb25zdCB7ZGF0YXNldHN9ID0gc3RhdGU7XG5cbiAgLy8gY2hlY2sgaWYgZGF0YXNldCBpcyBwcmVzZW50XG4gIGlmICghZGF0YXNldHNbZGF0YXNldEtleV0pIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7XG4gICAgbGF5ZXJzLFxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICBkYXRhc2V0czoge1tkYXRhc2V0S2V5XTogZGF0YXNldCwgLi4ubmV3RGF0YXNldHN9XG4gIH0gPSBzdGF0ZTtcblxuICBjb25zdCBsYXllcnNUb1JlbW92ZSA9IGxheWVycy5maWx0ZXIobCA9PiBsLmNvbmZpZy5kYXRhSWQgPT09IGRhdGFzZXRLZXkpLm1hcChsID0+IGwuaWQpO1xuXG4gIC8vIHJlbW92ZSBsYXllcnMgYW5kIGRhdGFzZXRzXG4gIGxldCBuZXdTdGF0ZSA9IGxheWVyc1RvUmVtb3ZlLnJlZHVjZSgoYWNjdSwgaWQpID0+IHJlbW92ZUxheWVyVXBkYXRlcihhY2N1LCB7aWR9KSwge1xuICAgIC4uLnN0YXRlLFxuICAgIGRhdGFzZXRzOiBuZXdEYXRhc2V0c1xuICB9KTtcblxuICAvLyB1cGRhdGUgZmlsdGVyc1xuICBjb25zdCBmaWx0ZXJzOiBGaWx0ZXJbXSA9IFtdO1xuICBmb3IgKGNvbnN0IGZpbHRlciBvZiBuZXdTdGF0ZS5maWx0ZXJzKSB7XG4gICAgY29uc3QgdmFsdWVJbmRleCA9IGZpbHRlci5kYXRhSWQuaW5kZXhPZihkYXRhc2V0S2V5KTtcbiAgICBpZiAodmFsdWVJbmRleCA+PSAwICYmIGZpbHRlci5kYXRhSWQubGVuZ3RoID4gMSkge1xuICAgICAgLy8gb25seSByZW1vdmUgb25lIHN5bmNlZCBkYXRhc2V0IGZyb20gdGhlIGZpbHRlclxuICAgICAgZmlsdGVycy5wdXNoKF9yZW1vdmVGaWx0ZXJEYXRhSWRBdFZhbHVlSW5kZXgoZmlsdGVyLCB2YWx1ZUluZGV4LCBkYXRhc2V0cykpO1xuICAgIH0gZWxzZSBpZiAodmFsdWVJbmRleCA8IDApIHtcbiAgICAgIC8vIGxlYXZlIHRoZSBmaWx0ZXIgYXMgaXNcbiAgICAgIGZpbHRlcnMucHVzaChmaWx0ZXIpO1xuICAgIH1cbiAgfVxuXG4gIG5ld1N0YXRlID0gey4uLm5ld1N0YXRlLCBmaWx0ZXJzfTtcblxuICByZXR1cm4gcmVtb3ZlRGF0YXNldEZyb21JbnRlcmFjdGlvbkNvbmZpZyhuZXdTdGF0ZSwge2RhdGFJZDogZGF0YXNldEtleX0pO1xufVxuXG5mdW5jdGlvbiByZW1vdmVEYXRhc2V0RnJvbUludGVyYWN0aW9uQ29uZmlnKHN0YXRlLCB7ZGF0YUlkfSkge1xuICBsZXQge2ludGVyYWN0aW9uQ29uZmlnfSA9IHN0YXRlO1xuICBjb25zdCB7dG9vbHRpcH0gPSBpbnRlcmFjdGlvbkNvbmZpZztcbiAgaWYgKHRvb2x0aXApIHtcbiAgICBjb25zdCB7Y29uZmlnfSA9IHRvb2x0aXA7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICAgIGNvbnN0IHtbZGF0YUlkXTogZmllbGRzLCAuLi5maWVsZHNUb1Nob3d9ID0gY29uZmlnLmZpZWxkc1RvU2hvdztcbiAgICBpbnRlcmFjdGlvbkNvbmZpZyA9IHtcbiAgICAgIC4uLmludGVyYWN0aW9uQ29uZmlnLFxuICAgICAgdG9vbHRpcDogey4uLnRvb2x0aXAsIGNvbmZpZzogey4uLmNvbmZpZywgZmllbGRzVG9TaG93fX1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHsuLi5zdGF0ZSwgaW50ZXJhY3Rpb25Db25maWd9O1xufVxuLyoqXG4gKiB1cGRhdGUgbGF5ZXIgYmxlbmRpbmcgbW9kZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZUxheWVyQmxlbmRpbmdVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5zdGF0ZSxcbiAgbGF5ZXJCbGVuZGluZzogYWN0aW9uLm1vZGVcbn0pO1xuXG4vKipcbiAqIHVwZGF0ZSBvdmVybGF5IGJsZW5kaW5nIG1vZGVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVPdmVybGF5QmxlbmRpbmdVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZU92ZXJsYXlCbGVuZGluZ1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBvdmVybGF5QmxlbmRpbmc6IGFjdGlvbi5tb2RlXG59KTtcblxuLyoqXG4gKiBEaXNwbGF5IGRhdGFzZXQgdGFibGUgaW4gYSBtb2RhbFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHNob3dEYXRhc2V0VGFibGVVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlNob3dEYXRhc2V0VGFibGVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdGluZ0RhdGFzZXQ6IGFjdGlvbi5kYXRhSWRcbiAgfTtcbn07XG5cbi8qKlxuICogQWRkIGN1c3RvbSBjb2xvciBmb3IgZGF0YXNldHMgYW5kIGxheWVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHVwZGF0ZVRhYmxlQ29sb3JVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlVwZGF0ZURhdGFzZXRDb2xvclVwZGF0ZXJcbik6IFZpc1N0YXRlID0+IHtcbiAgcmV0dXJuIHVwZGF0ZURhdGFzZXRQcm9wc1VwZGF0ZXIoc3RhdGUsIHtkYXRhSWQ6IGFjdGlvbi5kYXRhSWQsIHByb3BzOiB7Y29sb3I6IGFjdGlvbi5uZXdDb2xvcn19KTtcbn07XG5cbi8qKlxuICogcmVzZXQgdmlzU3RhdGUgdG8gaW5pdGlhbCBTdGF0ZVxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHJlc2V0TWFwQ29uZmlnVXBkYXRlciA9IChzdGF0ZTogVmlzU3RhdGUpOiBWaXNTdGF0ZSA9PiAoe1xuICAuLi5JTklUSUFMX1ZJU19TVEFURSxcbiAgLi4uc3RhdGUuaW5pdGlhbFN0YXRlLFxuICBpbml0aWFsU3RhdGU6IHN0YXRlLmluaXRpYWxTdGF0ZVxufSk7XG5cbi8qKlxuICogUHJvcGFnYXRlIGB2aXNTdGF0ZWAgcmVkdWNlciB3aXRoIGEgbmV3IGNvbmZpZ3VyYXRpb24uIEN1cnJlbnQgY29uZmlnIHdpbGwgYmUgb3ZlcnJpZGUuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgcmVjZWl2ZU1hcENvbmZpZ1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtjb25maWcgPSB7fSwgb3B0aW9ucyA9IHt9fVxuICB9OiB7XG4gICAgdHlwZT86IHR5cGVvZiBBY3Rpb25UeXBlcy5SRUNFSVZFX01BUF9DT05GSUc7XG4gICAgcGF5bG9hZDogUmVjZWl2ZU1hcENvbmZpZ1BheWxvYWQ7XG4gIH1cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKCFjb25maWcudmlzU3RhdGUpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCB7a2VlcEV4aXN0aW5nQ29uZmlnfSA9IG9wdGlvbnM7XG5cbiAgLy8gcmVzZXQgY29uZmlnIGlmIGtlZXBFeGlzdGluZ0NvbmZpZyBpcyBmYWxzeVxuICBsZXQgbWVyZ2VkU3RhdGUgPSAha2VlcEV4aXN0aW5nQ29uZmlnID8gcmVzZXRNYXBDb25maWdVcGRhdGVyKHN0YXRlKSA6IHN0YXRlO1xuICBmb3IgKGNvbnN0IG1lcmdlciBvZiBzdGF0ZS5tZXJnZXJzKSB7XG4gICAgaWYgKGlzVmFsaWRNZXJnZXIobWVyZ2VyKSAmJiBoYXNQcm9wc1RvTWVyZ2UoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCkpIHtcbiAgICAgIG1lcmdlZFN0YXRlID0gbWVyZ2VyLm1lcmdlKFxuICAgICAgICBtZXJnZWRTdGF0ZSxcbiAgICAgICAgZ2V0UHJvcFZhbHVlVG9NZXJnZXIoY29uZmlnLnZpc1N0YXRlLCBtZXJnZXIucHJvcCwgbWVyZ2VyLnRvTWVyZ2VQcm9wKSxcbiAgICAgICAgLy8gZnJvbUNvbmZpZ1xuICAgICAgICB0cnVlXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBtZXJnZWRTdGF0ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBsYXllciBob3ZlciBldmVudCB3aXRoIGhvdmVyZWQgb2JqZWN0XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbGF5ZXJIb3ZlclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuT25MYXllckhvdmVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGhvdmVySW5mbzoge1xuICAgIC8vIGRlY2suZ2wgaW5mbyBpcyBtdXRhYmxlXG4gICAgLi4uYWN0aW9uLmluZm8sXG4gICAgLi4uKE51bWJlci5pc0Zpbml0ZShhY3Rpb24ubWFwSW5kZXgpID8ge21hcEluZGV4OiBhY3Rpb24ubWFwSW5kZXh9IDoge30pXG4gIH1cbn0pO1xuXG4vKiBlc2xpbnQtZW5hYmxlIG1heC1zdGF0ZW1lbnRzICovXG5cbi8qKlxuICogVXBkYXRlIGBpbnRlcmFjdGlvbkNvbmZpZ2BcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpbnRlcmFjdGlvbkNvbmZpZ0NoYW5nZVVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuSW50ZXJhY3Rpb25Db25maWdDaGFuZ2VVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtjb25maWd9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGludGVyYWN0aW9uQ29uZmlnID0ge1xuICAgIC4uLnN0YXRlLmludGVyYWN0aW9uQ29uZmlnLFxuICAgIC4uLntbY29uZmlnLmlkXTogY29uZmlnfVxuICB9O1xuXG4gIC8vIERvbid0IGVuYWJsZSB0b29sdGlwIGFuZCBicnVzaCBhdCB0aGUgc2FtZSB0aW1lXG4gIC8vIGJ1dCBjb29yZGluYXRlcyBjYW4gYmUgc2hvd24gYXQgYWxsIHRpbWVcbiAgY29uc3QgY29udHJhZGljdCA9IFsnYnJ1c2gnLCAndG9vbHRpcCddO1xuXG4gIGlmIChcbiAgICBjb250cmFkaWN0LmluY2x1ZGVzKGNvbmZpZy5pZCkgJiZcbiAgICBjb25maWcuZW5hYmxlZCAmJlxuICAgICFzdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZ1tjb25maWcuaWRdLmVuYWJsZWRcbiAgKSB7XG4gICAgLy8gb25seSBlbmFibGUgb25lIGludGVyYWN0aW9uIGF0IGEgdGltZVxuICAgIGNvbnRyYWRpY3QuZm9yRWFjaChrID0+IHtcbiAgICAgIGlmIChrICE9PSBjb25maWcuaWQpIHtcbiAgICAgICAgaW50ZXJhY3Rpb25Db25maWdba10gPSB7Li4uaW50ZXJhY3Rpb25Db25maWdba10sIGVuYWJsZWQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGludGVyYWN0aW9uQ29uZmlnXG4gIH07XG5cbiAgaWYgKGNvbmZpZy5pZCA9PT0gJ2dlb2NvZGVyJyAmJiAhY29uZmlnLmVuYWJsZWQpIHtcbiAgICByZXR1cm4gcmVtb3ZlRGF0YXNldFVwZGF0ZXIobmV3U3RhdGUsIHtkYXRhSWQ6ICdnZW9jb2Rlcl9kYXRhc2V0J30pO1xuICB9XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG4vKipcbiAqIFRyaWdnZXIgbGF5ZXIgY2xpY2sgZXZlbnQgd2l0aCBjbGlja2VkIG9iamVjdFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxheWVyQ2xpY2tVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLk9uTGF5ZXJDbGlja1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtb3VzZVBvczogc3RhdGUuaW50ZXJhY3Rpb25Db25maWcuY29vcmRpbmF0ZS5lbmFibGVkXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICBwaW5uZWQ6IHN0YXRlLm1vdXNlUG9zLnBpbm5lZCA/IG51bGwgOiBjbG9uZURlZXAoc3RhdGUubW91c2VQb3MpXG4gICAgICB9XG4gICAgOiBzdGF0ZS5tb3VzZVBvcyxcbiAgY2xpY2tlZDogYWN0aW9uLmluZm8gJiYgYWN0aW9uLmluZm8ucGlja2VkID8gYWN0aW9uLmluZm8gOiBudWxsXG59KTtcblxuLyoqXG4gKiBUcmlnZ2VyIG1hcCBjbGljayBldmVudCwgdW5zZWxlY3QgY2xpY2tlZCBvYmplY3RcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjb25zdCBtYXBDbGlja1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Pbk1hcENsaWNrVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGNsaWNrZWQ6IG51bGxcbiAgfTtcbn07XG5cbi8qKlxuICogVHJpZ2dlciBtYXAgbW92ZSBldmVudFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IG1vdXNlTW92ZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2V2dH06IFZpc1N0YXRlQWN0aW9ucy5Pbk1vdXNlTW92ZVVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgaWYgKE9iamVjdC52YWx1ZXMoc3RhdGUuaW50ZXJhY3Rpb25Db25maWcpLnNvbWUoY29uZmlnID0+IGNvbmZpZy5lbmFibGVkKSkge1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIG1vdXNlUG9zOiB7XG4gICAgICAgIC4uLnN0YXRlLm1vdXNlUG9zLFxuICAgICAgICAuLi4oQXJyYXkuaXNBcnJheShldnQucG9pbnQpID8ge21vdXNlUG9zaXRpb246IFsuLi5ldnQucG9pbnRdfSA6IHt9KSxcbiAgICAgICAgLi4uKEFycmF5LmlzQXJyYXkoZXZ0LmxuZ0xhdCkgPyB7Y29vcmRpbmF0ZTogWy4uLmV2dC5sbmdMYXRdfSA6IHt9KVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICByZXR1cm4gc3RhdGU7XG59O1xuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGZvciBhIHNwbGl0IG1hcFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IHRvZ2dsZVNwbGl0TWFwVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IE1hcFN0YXRlQWN0aW9ucy5Ub2dnbGVTcGxpdE1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+XG4gIHN0YXRlLnNwbGl0TWFwcyAmJiBzdGF0ZS5zcGxpdE1hcHMubGVuZ3RoID09PSAwXG4gICAgPyB7XG4gICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAvLyBtYXliZSB3ZSBzaG91bGQgdXNlIGFuIGFycmF5IHRvIHN0b3JlIHN0YXRlIGZvciBhIHNpbmdsZSBtYXAgYXMgd2VsbFxuICAgICAgICAvLyBpZiBjdXJyZW50IG1hcHMgbGVuZ3RoIGlzIGVxdWFsIHRvIDAgaXQgbWVhbnMgdGhhdCB3ZSBhcmUgYWJvdXQgdG8gc3BsaXQgdGhlIHZpZXdcbiAgICAgICAgc3BsaXRNYXBzOiBjb21wdXRlU3BsaXRNYXBMYXllcnMoc3RhdGUubGF5ZXJzLCB7ZHVwbGljYXRlOiBmYWxzZX0pXG4gICAgICB9XG4gICAgOiBjbG9zZVNwZWNpZmljTWFwQXRJbmRleChzdGF0ZSwgYWN0aW9uKTtcblxuLyoqXG4gKiBUb2dnbGUgdmlzaWJpbGl0eSBvZiBhIGxheWVyIGluIGEgc3BsaXQgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgdG9nZ2xlTGF5ZXJGb3JNYXBVcGRhdGVyID0gKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHttYXBJbmRleCwgbGF5ZXJJZH06IFZpc1N0YXRlQWN0aW9ucy5Ub2dnbGVMYXllckZvck1hcFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3NwbGl0TWFwc30gPSBzdGF0ZTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIHNwbGl0TWFwczogc3BsaXRNYXBzLm1hcCgoc20sIGkpID0+XG4gICAgICBpID09PSBtYXBJbmRleFxuICAgICAgICA/IHtcbiAgICAgICAgICAgIC4uLnNwbGl0TWFwc1tpXSxcbiAgICAgICAgICAgIGxheWVyczoge1xuICAgICAgICAgICAgICAuLi5zcGxpdE1hcHNbaV0ubGF5ZXJzLFxuICAgICAgICAgICAgICAvLyBpZiBsYXllcklkIG5vdCBpbiBsYXllcnMsIHNldCBpdCB0byB2aXNpYmxlXG4gICAgICAgICAgICAgIFtsYXllcklkXTogIXNwbGl0TWFwc1tpXS5sYXllcnNbbGF5ZXJJZF1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIDogc21cbiAgICApXG4gIH07XG59O1xuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNvbXBsZXhpdHlcbmV4cG9ydCBjb25zdCB1cGRhdGVWaXNEYXRhVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVWaXNEYXRhVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBkYXRhc2V0cyBjYW4gYmUgYSBzaW5nbGUgZGF0YSBlbnRyaWVzIG9yIGFuIGFycmF5IG9mIG11bHRpcGxlIGRhdGEgZW50cmllc1xuICBjb25zdCB7Y29uZmlnLCBvcHRpb25zfSA9IGFjdGlvbjtcblxuICAvLyBhcHBseSBjb25maWcgaWYgcGFzc2VkIGZyb20gYWN0aW9uXG4gIC8vIFRPRE86IHdlIGRvbid0IGhhbmRsZSBhc3luYyBtZXJnZXJzIGhlcmUgeWV0XG4gIGxldCB1cGRhdGVkU3RhdGUgPSBjb25maWdcbiAgICA/IHJlY2VpdmVNYXBDb25maWdVcGRhdGVyKHN0YXRlLCB7XG4gICAgICAgIHBheWxvYWQ6IHtjb25maWcsIG9wdGlvbnN9XG4gICAgICB9KVxuICAgIDogc3RhdGU7XG5cbiAgY29uc3QgZGF0YXNldHMgPSB0b0FycmF5KGFjdGlvbi5kYXRhc2V0cyk7XG4gIGlmICghZGF0YXNldHMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHVwZGF0ZWRTdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IGNyZWF0ZURhdGFzZXRUYXNrczogVGFza1tdID0gW107XG4gIGNvbnN0IG5vdGlmaWNhdGlvblRhc2tzOiBUYXNrW10gPSBbXTtcblxuICBkYXRhc2V0cy5mb3JFYWNoKCh7aW5mbyA9IHt9LCAuLi5yZXN0fSwgZGF0YXNldEluZGV4KSA9PiB7XG4gICAgY29uc3QgdGFzayA9IGNyZWF0ZU5ld0RhdGFFbnRyeSh7aW5mbywgLi4ucmVzdH0sIHN0YXRlLmRhdGFzZXRzKTtcbiAgICBpZiAodGFzaykge1xuICAgICAgY3JlYXRlRGF0YXNldFRhc2tzLnB1c2godGFzayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5vdGlmaWNhdGlvblRhc2tzLnB1c2goXG4gICAgICAgIEFDVElPTl9UQVNLX0FERF9OT1RJRklDQVRJT04oKS5tYXAoKCkgPT5cbiAgICAgICAgICBhZGROb3RpZmljYXRpb24oXG4gICAgICAgICAgICBlcnJvck5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGRhdGFzZXQgZHVlIHRvIGRhdGEgdmVyaWZpY2F0aW9uIGVycm9yc2AsXG4gICAgICAgICAgICAgIGlkOiBgZGF0YXNldC1mYWlsZWQtJHtkYXRhc2V0SW5kZXh9YFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9KTtcblxuICBjb25zdCBkYXRhc2V0c0FsbFNldHRsZWRUYXNrID0gY3JlYXRlRGF0YXNldFRhc2tzLmxlbmd0aFxuICAgID8gVGFzay5hbGxTZXR0bGVkKGNyZWF0ZURhdGFzZXRUYXNrcykubWFwKHJlc3VsdHMgPT5cbiAgICAgICAgY3JlYXRlTmV3RGF0YXNldFN1Y2Nlc3Moe3Jlc3VsdHMsIGFkZFRvTWFwT3B0aW9uczogb3B0aW9uc30pXG4gICAgICApXG4gICAgOiBudWxsO1xuXG4gIGlmIChkYXRhc2V0c0FsbFNldHRsZWRUYXNrKSB7XG4gICAgdXBkYXRlZFN0YXRlID0gc2V0TG9hZGluZ0luZGljYXRvclVwZGF0ZXIodXBkYXRlZFN0YXRlLCBwYXlsb2FkXyh7Y2hhbmdlOiAxLCB0eXBlOiAnJ30pKTtcbiAgfVxuXG4gIHJldHVybiB3aXRoVGFzayh1cGRhdGVkU3RhdGUsIFtcbiAgICAuLi4oZGF0YXNldHNBbGxTZXR0bGVkVGFzayA/IFtkYXRhc2V0c0FsbFNldHRsZWRUYXNrXSA6IFtdKSxcbiAgICAuLi5ub3RpZmljYXRpb25UYXNrc1xuICBdKTtcbn07XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVOZXdEYXRhc2V0U3VjY2Vzc1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBQYXlsb2FkQWN0aW9uPENyZWF0ZU5ld0RhdGFzZXRTdWNjZXNzUGF5bG9hZD5cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qge3Jlc3VsdHMsIGFkZFRvTWFwT3B0aW9uc30gPSBhY3Rpb24ucGF5bG9hZDtcbiAgY29uc3Qgbm90aWZpY2F0aW9uVGFza3M6IFRhc2tbXSA9IFtdO1xuXG4gIGNvbnN0IG5ld0RhdGFFbnRyaWVzID0gcmVzdWx0cy5yZWR1Y2UoKGFjY3UsIHJlc3VsdCwgaWR4KSA9PiB7XG4gICAgaWYgKHJlc3VsdC5zdGF0dXMgPT09ICdmdWxmaWxsZWQnKSB7XG4gICAgICBjb25zdCBkYXRhc2V0ID0gcmVzdWx0LnZhbHVlO1xuICAgICAgcmV0dXJuIHsuLi5hY2N1LCBbZGF0YXNldC5pZF06IGRhdGFzZXR9O1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBzaG93IGVycm9yIG5vdGlmaWNhdGlvbiBvbiBVSVxuICAgICAgbm90aWZpY2F0aW9uVGFza3MucHVzaChcbiAgICAgICAgQUNUSU9OX1RBU0soKS5tYXAoKCkgPT5cbiAgICAgICAgICBhZGROb3RpZmljYXRpb24oXG4gICAgICAgICAgICBlcnJvck5vdGlmaWNhdGlvbih7XG4gICAgICAgICAgICAgIG1lc3NhZ2U6IGBEYXRhc2V0IGVycm9yOiBGYWlsZWQgdG8gY3JlYXRlIGEgbmV3IGRhdGFzZXQ6XG4gICAgICAgICAgICAgICR7cmVzdWx0LnJlYXNvbiB8fCAocmVzdWx0IGFzIGFueSkudmFsdWV9YCxcbiAgICAgICAgICAgICAgaWQ6IGBkYXRhc2V0LWNyZWF0ZS1mYWlsZWQtJHtpZHh9YFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICByZXR1cm4gYWNjdTtcbiAgICB9XG4gIH0sIHt9IGFzIERhdGFzZXRzKTtcbiAgLy8gc2F2ZSBuZXcgZGF0YXNldCBlbnRyeSB0byBzdGF0ZVxuICBjb25zdCBtZXJnZWRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBkYXRhc2V0czogbWVyZ2VEYXRhc2V0c0J5T3JkZXIoc3RhdGUsIG5ld0RhdGFFbnRyaWVzKVxuICB9O1xuXG4gIC8vIG1lcmdlIHN0YXRlIHdpdGggY29uZmlnIHRvIGJlIG1lcmdlZFxuICBjb25zdCBsYXllck1lcmdlcnMgPSBzdGF0ZS5tZXJnZXJzLmZpbHRlcihtID0+IG0ud2FpdEZvckxheWVyRGF0YSk7XG4gIGNvbnN0IGRhdGFzZXRNZXJnZXJzID0gc3RhdGUubWVyZ2Vycy5maWx0ZXIobSA9PiAhbGF5ZXJNZXJnZXJzLmluY2x1ZGVzKG0pKTtcblxuICBjb25zdCBuZXdEYXRhSWRzID0gT2JqZWN0LmtleXMobmV3RGF0YUVudHJpZXMpO1xuICBjb25zdCBwb3N0TWVyZ2VyUGF5bG9hZCA9IHtcbiAgICBuZXdEYXRhSWRzLFxuICAgIG9wdGlvbnM6IGFkZFRvTWFwT3B0aW9ucyxcbiAgICBsYXllck1lcmdlcnNcbiAgfTtcblxuICBjb25zdCB1cGRhdGVkU3RhdGUgPSBhcHBseU1lcmdlcnNVcGRhdGVyKG1lcmdlZFN0YXRlLCB7XG4gICAgbWVyZ2VyczogZGF0YXNldE1lcmdlcnMsXG4gICAgcG9zdE1lcmdlclBheWxvYWRcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHNldExvYWRpbmdJbmRpY2F0b3JVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwgcGF5bG9hZF8oe2NoYW5nZTogLTF9KSksXG4gICAgbm90aWZpY2F0aW9uVGFza3NcbiAgKTtcbn07XG5cbi8qKlxuICogQWRkIG5ldyBkYXRhc2V0IHRvIGB2aXNTdGF0ZWAsIHdpdGggb3B0aW9uIHRvIGxvYWQgYSBtYXAgY29uZmlnIGFsb25nIHdpdGggdGhlIGRhdGFzZXRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcHBseU1lcmdlcnNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjoge1xuICAgIG1lcmdlcnM6IE1lcmdlcjxhbnk+W107XG4gICAgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkO1xuICB9XG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHttZXJnZXJzLCBwb3N0TWVyZ2VyUGF5bG9hZH0gPSBhY3Rpb247XG5cbiAgLy8gbWVyZ2Ugc3RhdGUgd2l0aCBjb25maWcgdG8gYmUgbWVyZ2VkXG4gIGNvbnN0IG1lcmdlU3RhdGVSZXN1bHQgPSBtZXJnZVN0YXRlRnJvbU1lcmdlcnMoXG4gICAgc3RhdGUsXG4gICAge1xuICAgICAgLi4uSU5JVElBTF9WSVNfU1RBVEUsXG4gICAgICAuLi5zdGF0ZS5pbml0aWFsU3RhdGVcbiAgICB9LFxuICAgIG1lcmdlcnMsXG4gICAgLy8gbmV3RGF0YUlkcyxcbiAgICBwb3N0TWVyZ2VyUGF5bG9hZFxuICApO1xuXG4gIC8vIGlmIGFsbCBtZXJnZWQsIGtpY2t1cCBwb3N0IG1lcmdlIHByb2Nlc3NcbiAgLy8gaWYgbm90IHdhaXRcbiAgcmV0dXJuIG1lcmdlU3RhdGVSZXN1bHQuYWxsTWVyZ2VkXG4gICAgPyBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlU3RhdGVSZXN1bHQubWVyZ2VkU3RhdGUsIHBvc3RNZXJnZXJQYXlsb2FkKVxuICAgIDogbWVyZ2VTdGF0ZVJlc3VsdC5tZXJnZWRTdGF0ZTtcbn1cblxuLyoqIFJlYWRzIGBvcHRpb25zLmxheWVyVmlzQ29uZmlnYCBmcm9tIGFkZC1kYXRhLXRvLW1hcCAoc2VlIGBBZGREYXRhVG9NYXBPcHRpb25zYCkuICovXG5mdW5jdGlvbiBsYXllclZpc0NvbmZpZ0Zyb21BZGREYXRhT3B0aW9ucyhcbiAgb3B0aW9uczogUG9zdE1lcmdlclBheWxvYWRbJ29wdGlvbnMnXSB8IHVuZGVmaW5lZFxuKTogUGFydGlhbDxMYXllclZpc0NvbmZpZz4gfCB1bmRlZmluZWQge1xuICBpZiAoIW9wdGlvbnMgfHwgISgnbGF5ZXJWaXNDb25maWcnIGluIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBwYXRjaCA9IChvcHRpb25zIGFzIHtsYXllclZpc0NvbmZpZz86IHVua25vd259KS5sYXllclZpc0NvbmZpZztcbiAgaWYgKHBhdGNoID09IG51bGwgfHwgdHlwZW9mIHBhdGNoICE9PSAnb2JqZWN0JyB8fCBBcnJheS5pc0FycmF5KHBhdGNoKSkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgcmV0dXJuIHBhdGNoIGFzIFBhcnRpYWw8TGF5ZXJWaXNDb25maWc+O1xufVxuXG4vKipcbiAqIEFkZCBuZXcgZGF0YXNldCB0byBgdmlzU3RhdGVgLCB3aXRoIG9wdGlvbiB0byBsb2FkIGEgbWFwIGNvbmZpZyBhbG9uZyB3aXRoIHRoZSBkYXRhc2V0c1xuICovXG5mdW5jdGlvbiBwb3N0TWVyZ2VVcGRhdGVyKG1lcmdlZFN0YXRlOiBWaXNTdGF0ZSwgcG9zdE1lcmdlclBheWxvYWQ6IFBvc3RNZXJnZXJQYXlsb2FkKTogVmlzU3RhdGUge1xuICBjb25zdCB7bmV3RGF0YUlkcywgb3B0aW9ucywgbGF5ZXJNZXJnZXJzfSA9IHBvc3RNZXJnZXJQYXlsb2FkO1xuICBjb25zdCBuZXdGaWx0ZXJzID0gbWVyZ2VkU3RhdGUuZmlsdGVycy5maWx0ZXIoZiA9PlxuICAgIGYuZGF0YUlkLmZpbmQoZkRhdGFJZCA9PiBuZXdEYXRhSWRzLmluY2x1ZGVzKGZEYXRhSWQpKVxuICApO1xuICBjb25zdCBkYXRhc2V0RmlsdGVyZWQ6IHN0cmluZ1tdID0gdW5pcShcbiAgICBuZXdGaWx0ZXJzLnJlZHVjZSgoYWNjdSwgZikgPT4gWy4uLmFjY3UsIC4uLmYuZGF0YUlkXSwgW10gYXMgc3RyaW5nW10pXG4gICk7XG4gIGNvbnN0IGRhdGFFbXB0eSA9IG5ld0RhdGFJZHMubGVuZ3RoIDwgMTtcblxuICBsZXQgbmV3TGF5ZXJzID0gIWRhdGFFbXB0eVxuICAgID8gbWVyZ2VkU3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmRhdGFJZCAmJiBuZXdEYXRhSWRzLmluY2x1ZGVzKGwuY29uZmlnLmRhdGFJZCkpXG4gICAgOiBbXTtcblxuICBjb25zdCBuZXdEYXRhRW50cmllcyA9IG5ld0RhdGFJZHMucmVkdWNlKFxuICAgIChhY2N1LCBpZCkgPT4gKHtcbiAgICAgIC4uLmFjY3UsXG4gICAgICBbaWRdOiBtZXJnZWRTdGF0ZS5kYXRhc2V0c1tpZF1cbiAgICB9KSxcbiAgICB7fVxuICApO1xuXG4gIGlmICghbmV3TGF5ZXJzLmxlbmd0aCAmJiAob3B0aW9ucyB8fCB7fSkuYXV0b0NyZWF0ZUxheWVycyAhPT0gZmFsc2UpIHtcbiAgICAvLyBubyBsYXllciBtZXJnZWQsIGZpbmQgZGVmYXVsdHNcbiAgICBjb25zdCByZXN1bHQgPSBhZGREZWZhdWx0TGF5ZXJzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllcyk7XG4gICAgbWVyZ2VkU3RhdGUgPSByZXN1bHQuc3RhdGU7XG4gICAgbmV3TGF5ZXJzID0gcmVzdWx0Lm5ld0xheWVycztcbiAgfVxuXG4gIGlmIChtZXJnZWRTdGF0ZS5zcGxpdE1hcHMubGVuZ3RoKSB7XG4gICAgLy8gaWYgbWFwIGlzIHNwbGl0LCBhZGQgbmV3IGxheWVycyB0byBzcGxpdE1hcHNcbiAgICBuZXdMYXllcnMgPSBtZXJnZWRTdGF0ZS5sYXllcnMuZmlsdGVyKFxuICAgICAgbCA9PiBsLmNvbmZpZy5kYXRhSWQgJiYgbmV3RGF0YUlkcy5pbmNsdWRlcyhsLmNvbmZpZy5kYXRhSWQpXG4gICAgKTtcbiAgICBtZXJnZWRTdGF0ZSA9IHtcbiAgICAgIC4uLm1lcmdlZFN0YXRlLFxuICAgICAgc3BsaXRNYXBzOiBhZGROZXdMYXllcnNUb1NwbGl0TWFwKG1lcmdlZFN0YXRlLnNwbGl0TWFwcywgbmV3TGF5ZXJzKVxuICAgIH07XG4gIH1cblxuICBtZXJnZWRTdGF0ZSA9IG1lcmdlTGF5ZXJWaXNDb25maWdGb3JOZXdEYXRhc2V0cyhcbiAgICBtZXJnZWRTdGF0ZSxcbiAgICBsYXllclZpc0NvbmZpZ0Zyb21BZGREYXRhT3B0aW9ucyhvcHRpb25zKSxcbiAgICBuZXdEYXRhSWRzXG4gICk7XG5cbiAgLy8gaWYgbm8gdG9vbHRpcHMgbWVyZ2VkIGFkZCBkZWZhdWx0IHRvb2x0aXBzXG4gIG5ld0RhdGFJZHMuZm9yRWFjaChkYXRhSWQgPT4ge1xuICAgIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBtZXJnZWRTdGF0ZS5pbnRlcmFjdGlvbkNvbmZpZy50b29sdGlwLmNvbmZpZy5maWVsZHNUb1Nob3dbZGF0YUlkXTtcbiAgICAvLyBsb2FkaW5nIGRhdGFzZXQ6IGF1dG9DcmVhdGVUb29sdGlwcyBpcyBmYWxzZSBhbmQgd2UgZG9uJ3Qgd2FudCB0byBydW4gYWRkRGVmYXVsdFRvb2x0aXBzIHdoZW4gdG9vbHRpcEZpZWxkcyBpcyBlbXB0eVxuICAgIGlmIChcbiAgICAgIG9wdGlvbnM/LmF1dG9DcmVhdGVUb29sdGlwcyAhPT0gZmFsc2UgJiZcbiAgICAgICghQXJyYXkuaXNBcnJheSh0b29sdGlwRmllbGRzKSB8fCAhdG9vbHRpcEZpZWxkcy5sZW5ndGgpXG4gICAgKSB7XG4gICAgICAvLyBhZGRpbmcgZGF0YXNldDogYXV0b0NyZWF0ZVRvb2x0aXBzIGlzIHRydWVcbiAgICAgIG1lcmdlZFN0YXRlID0gYWRkRGVmYXVsdFRvb2x0aXBzKG1lcmdlZFN0YXRlLCBuZXdEYXRhRW50cmllc1tkYXRhSWRdKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IHVwZGF0ZWREYXRhc2V0cyA9IGRhdGFFbXB0eVxuICAgID8gT2JqZWN0LmtleXMobWVyZ2VkU3RhdGUuZGF0YXNldHMpXG4gICAgOiB1bmlxKE9iamVjdC5rZXlzKG5ld0RhdGFFbnRyaWVzKS5jb25jYXQoZGF0YXNldEZpbHRlcmVkKSk7XG5cbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YShtZXJnZWRTdGF0ZSwgdXBkYXRlZERhdGFzZXRzLCB1bmRlZmluZWQpO1xuXG4gIC8vIHJlZ2lzdGVyIGxheWVyIGFuaW1hdGlvbiBkb21haW4sXG4gIC8vIG5lZWQgdG8gYmUgY2FsbGVkIGFmdGVyIGxheWVyIGRhdGEgaXMgY2FsY3VsYXRlZFxuICB1cGRhdGVkU3RhdGUgPSB1cGRhdGVBbmltYXRpb25Eb21haW4odXBkYXRlZFN0YXRlKTtcblxuICAvLyB0cnkgdG8gcHJvY2VzcyBsYXllck1lcmdlcnMgYWZ0ZXIgZGF0YXNldCtkYXRhc2V0TWVyZ2Vyc1xuICB1cGRhdGVkU3RhdGUgPVxuICAgIGxheWVyTWVyZ2VycyAmJiBsYXllck1lcmdlcnMubGVuZ3RoID4gMFxuICAgICAgPyBhcHBseU1lcmdlcnNVcGRhdGVyKHVwZGF0ZWRTdGF0ZSwge1xuICAgICAgICAgIG1lcmdlcnM6IGxheWVyTWVyZ2VycyxcbiAgICAgICAgICBwb3N0TWVyZ2VyUGF5bG9hZDogey4uLnBvc3RNZXJnZXJQYXlsb2FkLCBsYXllck1lcmdlcnM6IFtdfVxuICAgICAgICB9KVxuICAgICAgOiB1cGRhdGVkU3RhdGU7XG5cbiAgLy8gY2VudGVyIHRoZSBtYXAgb25jZSB0aGUgZGF0YXNldCBpcyBjcmVhdGVkXG4gIGlmIChuZXdMYXllcnMubGVuZ3RoICYmIChvcHRpb25zIHx8IHt9KS5jZW50ZXJNYXApIHtcbiAgICBjb25zdCBib3VuZHMgPSBmaW5kTWFwQm91bmRzKG5ld0xheWVycyk7XG4gICAgaWYgKGJvdW5kcykge1xuICAgICAgY29uc3QgZml0Qm91bmRzVGFzayA9IEFDVElPTl9UQVNLX0ZJVF9CT1VORFMoKS5tYXAoKCkgPT4ge1xuICAgICAgICByZXR1cm4gZml0TWFwQm91bmRzKGJvdW5kcyk7XG4gICAgICB9KTtcbiAgICAgIHVwZGF0ZWRTdGF0ZSA9IHdpdGhUYXNrKHVwZGF0ZWRTdGF0ZSwgZml0Qm91bmRzVGFzayk7XG4gICAgfVxuICB9XG5cbiAgLy8gbmVlZCB0byBjZW50ZXIgbWFwIGhlcmUgaWYgd2UgaGF2ZSBuZXcgbGF5ZXJzXG4gIHJldHVybiB1cGRhdGVkU3RhdGU7XG59XG5cbi8qKlxuICogUmVuYW1lIGFuIGV4aXN0aW5nIGRhdGFzZXQgaW4gYHZpc1N0YXRlYFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlbmFtZURhdGFzZXRVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlJlbmFtZURhdGFzZXRVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB1cGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyKHN0YXRlLCB7ZGF0YUlkOiBhY3Rpb24uZGF0YUlkLCBwcm9wczoge2xhYmVsOiBhY3Rpb24ubGFiZWx9fSk7XG59XG5cbmNvbnN0IEFMTE9XRURfVVBEQVRFX0RBVEFTRVRfUFJPUFMgPSBbJ2xhYmVsJywgJ2NvbG9yJywgJ21ldGFkYXRhJ107XG5cbi8qKlxuICogVmFsaWRhdGVzIHByb3BlcnRpZXMgYmVmb3JlIHVwZGF0aW5nIHRoZSBkYXRhc2V0LlxuICogTWFrZXMgc3VyZSBlYWNoIHByb3BlcnR5IGlzIGluIHRoZSBhbGxvd2VkIGxpc3RcbiAqIE1ha2VzIHN1cmUgY29sb3IgdmFsdWUgaXMgUkdCXG4gKiBQZXJmb3JtcyBkZWVwIG1lcmdlIHdoZW4gdXBkYXRpbmcgbWV0YWRhdGFcbiAqL1xuY29uc3QgdmFsaWRhdGVEYXRhc2V0VXBkYXRlUHJvcHMgPSAocHJvcHMsIGRhdGFzZXQpID0+IHtcbiAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSBPYmplY3QuZW50cmllcyhwcm9wcykucmVkdWNlKChhY2MsIGVudHJ5KSA9PiB7XG4gICAgY29uc3QgW2tleSwgdmFsdWVdID0gZW50cnk7XG4gICAgLy8gaXMgaXQgYWxsb3dlZCA/XG4gICAgaWYgKCFBTExPV0VEX1VQREFURV9EQVRBU0VUX1BST1BTLmluY2x1ZGVzKGtleSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gaWYgd2UgYXJlIGFkZGluZyBhIGNvbG9yIGJ1dCBpdCBpcyBub3QgUkdCIHdlIGRvbid0IGFjY2VwdCB0aGUgdmFsdWVcbiAgICAvLyBpbiB0aGUgZnV0dXJlIGFzIHdlIGFkZCBtb3JlIHByb3BzIHdlIHNob3VsZCBjaGFuZ2UgdGhpcyBpZiBpbnRvIGEgc3dpdGNoXG4gICAgaWYgKGtleSA9PT0gJ2NvbG9yJyAmJiAhaXNSZ2JDb2xvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfVxuXG4gICAgLy8gZG8gd2UgbmVlZCBkZWVwIG1lcmdlID9cbiAgICByZXR1cm4gey4uLmFjYywgW2tleV06IGlzUGxhaW5PYmplY3QodmFsdWUpID8gZGVlcG1lcmdlKGRhdGFzZXRba2V5XSB8fCB7fSwgdmFsdWUpIDogdmFsdWV9O1xuICB9LCB7fSk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlZFByb3BzO1xufTtcblxuLyoqXG4gKiBVcGRhdGUgRGF0YXNldCBwcm9wcyAobGFiZWwsIGNvbG9yLCBtZXRhKS4gRG8gbm90IHVzZSB0byB1cGRhdGUgZGF0YSBvciBhbnkgcmVsYXRlZCBwcm9wZXJ0aWVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRGF0YXNldFByb3BzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5VcGRhdGVEYXRhc2V0UHJvcHNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtkYXRhSWQsIHByb3BzfSA9IGFjdGlvbjtcbiAgY29uc3Qge2RhdGFzZXRzfSA9IHN0YXRlO1xuICBjb25zdCBleGlzdGluZyA9IGRhdGFzZXRzW2RhdGFJZF07XG5cbiAgaWYgKGV4aXN0aW5nKSB7XG4gICAgY29uc3QgdmFsaWRhdGVkUHJvcHMgPSB2YWxpZGF0ZURhdGFzZXRVcGRhdGVQcm9wcyhwcm9wcywgZXhpc3RpbmcpO1xuICAgIC8vICB2YWxpZGF0ZSBwcm9wczoganVzdCBjb2xvciBmb3Igbm93XG4gICAgLy8gIHdlIG9ubHkgYWxsb3cgbGFiZWwsIGNvbG9yIGFuZCBtZXRhIHRvIGJlIHVwZGF0ZWRcbiAgICAvLyBjb25zdCBuZXdUYWJsZSA9IGNvcHlUYWJsZUFuZFVwZGF0ZShleGlzdGluZywgdmFsaWRhdGVkUHJvcHMpO1xuICAgIHJldHVybiB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGRhdGFzZXRzOiB7XG4gICAgICAgIC4uLmRhdGFzZXRzLFxuICAgICAgICBbZGF0YUlkXTogY29weVRhYmxlQW5kVXBkYXRlKGV4aXN0aW5nLCB2YWxpZGF0ZWRQcm9wcylcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlO1xufVxuXG4vKipcbiAqIFdoZW4gYSB1c2VyIGNsaWNrcyBvbiB0aGUgc3BlY2lmaWMgbWFwIGNsb3NpbmcgaWNvblxuICogdGhlIGFwcGxpY2F0aW9uIHdpbGwgY2xvc2UgdGhlIHNlbGVjdGVkIG1hcFxuICogYW5kIHdpbGwgbWVyZ2UgdGhlIHJlbWFpbmluZyBvbmUgd2l0aCB0aGUgZ2xvYmFsIHN0YXRlXG4gKiBUT0RPOiBpIHRoaW5rIGluIHRoZSBmdXR1cmUgdGhpcyBhY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBtZXJnZSBtYXAgbGF5ZXJzIHdpdGggZ2xvYmFsIHNldHRpbmdzXG4gKiBAcGFyYW0ge09iamVjdH0gc3RhdGUgYHZpc1N0YXRlYFxuICogQHBhcmFtIHtPYmplY3R9IGFjdGlvbiBhY3Rpb25cbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gY2xvc2VTcGVjaWZpY01hcEF0SW5kZXg8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogTWFwU3RhdGVBY3Rpb25zLlRvZ2dsZVNwbGl0TWFwVXBkYXRlckFjdGlvblxuKTogUyB7XG4gIC8vIHJldHJpZXZlIGxheWVycyBtZXRhIGRhdGEgZnJvbSB0aGUgcmVtYWluaW5nIG1hcCB0aGF0IHdlIG5lZWQgdG8ga2VlcFxuICBjb25zdCBpbmRleFRvUmV0cmlldmUgPSAxIC0gYWN0aW9uLnBheWxvYWQ7XG4gIGNvbnN0IG1hcExheWVycyA9IHN0YXRlLnNwbGl0TWFwc1tpbmRleFRvUmV0cmlldmVdPy5sYXllcnM7XG4gIGNvbnN0IHtsYXllcnN9ID0gc3RhdGU7XG5cbiAgLy8gdXBkYXRlIGxheWVyIHZpc2liaWxpdHlcbiAgY29uc3QgbmV3TGF5ZXJzID0gbGF5ZXJzLm1hcChsYXllciA9PlxuICAgIG1hcExheWVycyAmJiAhbWFwTGF5ZXJzW2xheWVyLmlkXSAmJiBsYXllci5jb25maWcuaXNWaXNpYmxlXG4gICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAvLyBpZiBsYXllci5pZCBpcyBub3QgaW4gbWFwTGF5ZXJzLCBpdCBzaG91bGQgYmUgaW5WaXNpYmxlXG4gICAgICAgICAgaXNWaXNpYmxlOiBmYWxzZVxuICAgICAgICB9KVxuICAgICAgOiBsYXllclxuICApO1xuXG4gIC8vIGRlbGV0ZSBtYXBcbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IG5ld0xheWVycyxcbiAgICBzcGxpdE1hcHM6IFtdXG4gIH07XG59XG5cbi8qKlxuICogVHJpZ2dlciBmaWxlIGxvYWRpbmcgZGlzcGF0Y2ggYGFkZERhdGFUb01hcGAgaWYgc3VjY2VlZCwgb3IgYGxvYWRGaWxlc0VycmAgaWYgZmFpbGVkXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbG9hZEZpbGVzVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIGNvbnN0IHtmaWxlcywgb25GaW5pc2ggPSBsb2FkRmlsZXNTdWNjZXNzfSA9IGFjdGlvbjtcbiAgaWYgKCFmaWxlcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBjb25zdCBmaWxlTG9hZGluZ1Byb2dyZXNzID0gQXJyYXkuZnJvbShmaWxlcykucmVkdWNlKFxuICAgIChhY2N1LCBmLCBpKSA9PiBtZXJnZV8oaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZiwgaSkpKGFjY3UpLFxuICAgIHt9XG4gICk7XG5cbiAgY29uc3QgZmlsZUxvYWRpbmcgPSB7XG4gICAgZmlsZUNhY2hlOiBbXSxcbiAgICBmaWxlc1RvTG9hZDogZmlsZXMsXG4gICAgb25GaW5pc2hcbiAgfTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBtZXJnZV8oe2ZpbGVMb2FkaW5nUHJvZ3Jlc3MsIGZpbGVMb2FkaW5nfSkoc3RhdGUpO1xuXG4gIHJldHVybiBsb2FkTmV4dEZpbGVVcGRhdGVyKG5leHRTdGF0ZSk7XG59O1xuXG4vKipcbiAqIFN1Y2Vzc2Z1bGx5IGxvYWRlZCBvbmUgZmlsZSwgbW92ZSBvbiB0byB0aGUgbmV4dCBvbmVcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkRmlsZVN0ZXBTdWNjZXNzVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBhY3Rpb246IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZVN0ZXBTdWNjZXNzQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghc3RhdGUuZmlsZUxvYWRpbmcpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgY29uc3Qge2ZpbGVOYW1lLCBmaWxlQ2FjaGV9ID0gYWN0aW9uO1xuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNofSA9IHN0YXRlLmZpbGVMb2FkaW5nO1xuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKHN0YXRlLCB7XG4gICAgZmlsZU5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAxLCBtZXNzYWdlOiAnRG9uZSd9XG4gIH0pO1xuXG4gIC8vIHNhdmUgcHJvY2Vzc2VkIGZpbGUgdG8gZmlsZUNhY2hlXG4gIGNvbnN0IHN0YXRlV2l0aENhY2hlID0gcGlja18oJ2ZpbGVMb2FkaW5nJykobWVyZ2VfKHtmaWxlQ2FjaGV9KSkoc3RhdGVXaXRoUHJvZ3Jlc3MpO1xuXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBzdGF0ZVdpdGhDYWNoZSxcbiAgICBERUxBWV9UQVNLKDIwMCkubWFwKGZpbGVzVG9Mb2FkLmxlbmd0aCA/IGxvYWROZXh0RmlsZSA6ICgpID0+IG9uRmluaXNoKGZpbGVDYWNoZSkpXG4gICk7XG59XG5cbi8vIHdpdGhUYXNrPFQ+KHN0YXRlOiBULCB0YXNrOiBhbnkpOiBUXG5cbi8qKlxuICpcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2FkTmV4dEZpbGVVcGRhdGVyKHN0YXRlOiBWaXNTdGF0ZSk6IFZpc1N0YXRlIHtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWR9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG4gIGNvbnN0IFtmaWxlLCAuLi5yZW1haW5pbmdGaWxlc1RvTG9hZF0gPSBmaWxlc1RvTG9hZDtcblxuICAvLyBzYXZlIGZpbGVzVG9Mb2FkIHRvIHN0YXRlXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHBpY2tfKCdmaWxlTG9hZGluZycpKG1lcmdlXyh7ZmlsZXNUb0xvYWQ6IHJlbWFpbmluZ0ZpbGVzVG9Mb2FkfSkpKHN0YXRlKTtcblxuICBjb25zdCBzdGF0ZVdpdGhQcm9ncmVzcyA9IHVwZGF0ZUZpbGVMb2FkaW5nUHJvZ3Jlc3NVcGRhdGVyKG5leHRTdGF0ZSwge1xuICAgIGZpbGVOYW1lOiBmaWxlLm5hbWUsXG4gICAgcHJvZ3Jlc3M6IHtwZXJjZW50OiAwLCBtZXNzYWdlOiAnbG9hZGluZy4uLid9XG4gIH0pO1xuXG4gIGNvbnN0IHtsb2FkZXJzLCBsb2FkT3B0aW9uc30gPSBzdGF0ZTtcbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIG1ha2VMb2FkRmlsZVRhc2soXG4gICAgICBmaWxlLFxuICAgICAgbmV4dFN0YXRlLmZpbGVMb2FkaW5nICYmIG5leHRTdGF0ZS5maWxlTG9hZGluZy5maWxlQ2FjaGUsXG4gICAgICBsb2FkZXJzLFxuICAgICAgbG9hZE9wdGlvbnNcbiAgICApXG4gICk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlTG9hZEZpbGVUYXNrKGZpbGUsIGZpbGVDYWNoZSwgbG9hZGVyczogTG9hZGVyW10gPSBbXSwgbG9hZE9wdGlvbnMgPSB7fSkge1xuICByZXR1cm4gTE9BRF9GSUxFX1RBU0soe2ZpbGUsIGZpbGVDYWNoZSwgbG9hZGVycywgbG9hZE9wdGlvbnN9KS5iaW1hcChcbiAgICAvLyBwcmV0dGllciBpZ25vcmVcbiAgICAvLyBzdWNjZXNzXG4gICAgZ2VuID0+XG4gICAgICBuZXh0RmlsZUJhdGNoKHtcbiAgICAgICAgZ2VuLFxuICAgICAgICBmaWxlTmFtZTogZmlsZS5uYW1lLFxuICAgICAgICBvbkZpbmlzaDogcmVzdWx0ID0+XG4gICAgICAgICAgcHJvY2Vzc0ZpbGVDb250ZW50KHtcbiAgICAgICAgICAgIGNvbnRlbnQ6IHJlc3VsdCxcbiAgICAgICAgICAgIGZpbGVDYWNoZVxuICAgICAgICAgIH0pXG4gICAgICB9KSxcblxuICAgIC8vIGVycm9yXG4gICAgZXJyID0+IGxvYWRGaWxlc0VycihmaWxlLm5hbWUsIGVycilcbiAgKTtcbn1cblxuLyoqXG4gKlxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2Nlc3NGaWxlQ29udGVudFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuUHJvY2Vzc0ZpbGVDb250ZW50VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7Y29udGVudCwgZmlsZUNhY2hlfSA9IGFjdGlvbi5wYXlsb2FkO1xuXG4gIGNvbnN0IHN0YXRlV2l0aFByb2dyZXNzID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSxcbiAgICBwcm9ncmVzczoge3BlcmNlbnQ6IDEsIG1lc3NhZ2U6ICdwcm9jZXNzaW5nLi4uJ31cbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKFxuICAgIHN0YXRlV2l0aFByb2dyZXNzLFxuICAgIFBST0NFU1NfRklMRV9EQVRBKHtjb250ZW50LCBmaWxlQ2FjaGV9KS5iaW1hcChcbiAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZVN0ZXBTdWNjZXNzKHtmaWxlTmFtZTogY29udGVudC5maWxlTmFtZSwgZmlsZUNhY2hlOiByZXN1bHR9KSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoY29udGVudC5maWxlTmFtZSwgZXJyKVxuICAgIClcbiAgKTtcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlUHJvZ3Jlc3MocHJldlByb2dyZXNzID0ge30sIHByb2dyZXNzKSB7XG4gIC8vIFRoaXMgaGFwcGVucyB3aGVuIHJlY2VpdmluZyBxdWVyeSBtZXRhZGF0YSBvciBvdGhlciBjYXNlcyB3ZSBkb24ndFxuICAvLyBoYXZlIGFuIHVwZGF0ZSBmb3IgdGhlIHVzZXIuXG4gIGlmICghcHJvZ3Jlc3MgfHwgIXByb2dyZXNzLnBlcmNlbnQpIHtcbiAgICByZXR1cm4ge307XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHBlcmNlbnQ6IHByb2dyZXNzLnBlcmNlbnRcbiAgfTtcbn1cblxuLyoqXG4gKiBnZXRzIGNhbGxlZCB3aXRoIHBheWxvYWQgPSBBc3luY0dlbmVyYXRvcjw/Pz8+XG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3QgbmV4dEZpbGVCYXRjaFVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge1xuICAgIHBheWxvYWQ6IHtnZW4sIGZpbGVOYW1lLCBwcm9ncmVzcywgYWNjdW11bGF0ZWQsIG9uRmluaXNofVxuICB9OiBWaXNTdGF0ZUFjdGlvbnMuTmV4dEZpbGVCYXRjaFVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+IHtcbiAgY29uc3Qgc3RhdGVXaXRoUHJvZ3Jlc3MgPSB1cGRhdGVGaWxlTG9hZGluZ1Byb2dyZXNzVXBkYXRlcihzdGF0ZSwge1xuICAgIGZpbGVOYW1lLFxuICAgIHByb2dyZXNzOiBwYXJzZVByb2dyZXNzKHN0YXRlLmZpbGVMb2FkaW5nUHJvZ3Jlc3NbZmlsZU5hbWVdLCBwcm9ncmVzcylcbiAgfSk7XG5cbiAgcmV0dXJuIHdpdGhUYXNrKHN0YXRlV2l0aFByb2dyZXNzLCBbXG4gICAgLi4uKGdldEFwcGxpY2F0aW9uQ29uZmlnKCkudXNlQXJyb3dQcm9ncmVzc2l2ZUxvYWRpbmcgJiZcbiAgICBmaWxlTmFtZS5lbmRzV2l0aCgnYXJyb3cnKSAmJlxuICAgIGFjY3VtdWxhdGVkPy5kYXRhPy5sZW5ndGggPiAwXG4gICAgICA/IFtcbiAgICAgICAgICBQUk9DRVNTX0ZJTEVfREFUQSh7Y29udGVudDogYWNjdW11bGF0ZWQsIGZpbGVDYWNoZTogW119KS5iaW1hcChcbiAgICAgICAgICAgIHJlc3VsdCA9PiBsb2FkRmlsZXNTdWNjZXNzKHJlc3VsdCksXG4gICAgICAgICAgICBlcnIgPT4gbG9hZEZpbGVzRXJyKGZpbGVOYW1lLCBlcnIpXG4gICAgICAgICAgKVxuICAgICAgICBdXG4gICAgICA6IFtdKSxcbiAgICBVTldSQVBfVEFTSyhnZW4ubmV4dCgpKS5iaW1hcChcbiAgICAgICh7dmFsdWUsIGRvbmV9KSA9PiB7XG4gICAgICAgIHJldHVybiBkb25lXG4gICAgICAgICAgPyBvbkZpbmlzaChhY2N1bXVsYXRlZClcbiAgICAgICAgICA6IG5leHRGaWxlQmF0Y2goe1xuICAgICAgICAgICAgICBnZW4sXG4gICAgICAgICAgICAgIGZpbGVOYW1lLFxuICAgICAgICAgICAgICBwcm9ncmVzczogdmFsdWUucHJvZ3Jlc3MsXG4gICAgICAgICAgICAgIGFjY3VtdWxhdGVkOiB2YWx1ZSxcbiAgICAgICAgICAgICAgb25GaW5pc2hcbiAgICAgICAgICAgIH0pO1xuICAgICAgfSxcbiAgICAgIGVyciA9PiBsb2FkRmlsZXNFcnIoZmlsZU5hbWUsIGVycilcbiAgICApXG4gIF0pO1xufTtcblxuLyoqXG4gKiBUcmlnZ2VyIGxvYWRpbmcgZmlsZSBlcnJvclxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGxvYWRGaWxlc0VyclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2Vycm9yLCBmaWxlTmFtZX06IFZpc1N0YXRlQWN0aW9ucy5Mb2FkRmlsZXNFcnJVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSA9PiB7XG4gIC8vIHVwZGF0ZSB1aSB3aXRoIGVycm9yIG1lc3NhZ2VcbiAgQ29uc29sZS53YXJuKGVycm9yKTtcbiAgaWYgKCFzdGF0ZS5maWxlTG9hZGluZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7ZmlsZXNUb0xvYWQsIG9uRmluaXNoLCBmaWxlQ2FjaGV9ID0gc3RhdGUuZmlsZUxvYWRpbmc7XG5cbiAgY29uc3QgbmV4dFN0YXRlID0gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtcbiAgICBmaWxlTmFtZSxcbiAgICBwcm9ncmVzczoge2Vycm9yfVxuICB9KTtcblxuICAvLyBraWNrIG9mZiBuZXh0IGZpbGUgb3IgZmluaXNoXG4gIHJldHVybiB3aXRoVGFzayhcbiAgICBuZXh0U3RhdGUsXG4gICAgREVMQVlfVEFTSygyMDApLm1hcChmaWxlc1RvTG9hZC5sZW5ndGggPyBsb2FkTmV4dEZpbGUgOiAoKSA9PiBvbkZpbmlzaChmaWxlQ2FjaGUpKVxuICApO1xufTtcblxuLyoqXG4gKiBXaGVuIHNlbGVjdCBkYXRhc2V0IGZvciBleHBvcnQsIGFwcGx5IGNwdSBmaWx0ZXIgdG8gc2VsZWN0ZWQgZGF0YXNldFxuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGNvbnN0IGFwcGx5Q1BVRmlsdGVyVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7ZGF0YUlkfTogVmlzU3RhdGVBY3Rpb25zLkFwcGx5Q1BVRmlsdGVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhcHBseSBjcHVGaWx0ZXJcbiAgY29uc3QgZGF0YUlkcyA9IHRvQXJyYXkoZGF0YUlkKTtcblxuICByZXR1cm4gZGF0YUlkcy5yZWR1Y2UoKGFjY3UsIGlkKSA9PiBmaWx0ZXJEYXRhc2V0Q1BVKGFjY3UsIGlkKSwgc3RhdGUpO1xufTtcblxuLyoqXG4gKiBVc2VyIGlucHV0IHRvIHVwZGF0ZSB0aGUgaW5mbyBvZiB0aGUgbWFwXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TWFwSW5mb1VwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU2V0TWFwSW5mb1VwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlID0+ICh7XG4gIC4uLnN0YXRlLFxuICBtYXBJbmZvOiB7XG4gICAgLi4uc3RhdGUubWFwSW5mbyxcbiAgICAuLi5hY3Rpb24uaW5mb1xuICB9XG59KTtcbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIHVwZGF0ZSBBbGwgbGF5ZXIgZG9tYWluIGFuZCBsYXllciBkYXRhIG9mIHN0YXRlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhZGREZWZhdWx0TGF5ZXJzKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIGRhdGFzZXRzOiBEYXRhc2V0c1xuKToge3N0YXRlOiBWaXNTdGF0ZTsgbmV3TGF5ZXJzOiBMYXllcltdfSB7XG4gIGNvbnN0IGVtcHR5OiBMYXllcltdID0gW107XG4gIGNvbnN0IGRlZmF1bHRMYXllcnMgPSBPYmplY3QudmFsdWVzKGRhdGFzZXRzKS5yZWR1Y2UoKGFjY3U6IExheWVyW10sIGRhdGFzZXQpID0+IHtcbiAgICBjb25zdCBmb3VuZExheWVycyA9IGZpbmREZWZhdWx0TGF5ZXIoZGF0YXNldCwgc3RhdGUubGF5ZXJDbGFzc2VzKTtcbiAgICByZXR1cm4gZm91bmRMYXllcnMgJiYgZm91bmRMYXllcnMubGVuZ3RoID8gYWNjdS5jb25jYXQoZm91bmRMYXllcnMpIDogYWNjdTtcbiAgfSwgZW1wdHkpO1xuXG4gIHJldHVybiB7XG4gICAgc3RhdGU6IHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgbGF5ZXJzOiBbLi4uc3RhdGUubGF5ZXJzLCAuLi5kZWZhdWx0TGF5ZXJzXSxcbiAgICAgIGxheWVyT3JkZXI6IFtcbiAgICAgICAgLy8gcHV0IG5ldyBsYXllcnMgb24gdG9wIG9mIG9sZCBvbmVzIGluIHJldmVyc2VcbiAgICAgICAgLi4uZ2V0TGF5ZXJPcmRlckZyb21MYXllcnMoZGVmYXVsdExheWVycyksXG4gICAgICAgIC4uLnN0YXRlLmxheWVyT3JkZXJcbiAgICAgIF1cbiAgICB9LFxuICAgIG5ld0xheWVyczogZGVmYXVsdExheWVyc1xuICB9O1xufVxuXG4vKipcbiAqIGhlbHBlciBmdW5jdGlvbiB0byBmaW5kIGRlZmF1bHQgdG9vbHRpcHNcbiAqIEBwYXJhbSB7T2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtPYmplY3R9IGRhdGFzZXRcbiAqIEByZXR1cm5zIHtPYmplY3R9IG5leHRTdGF0ZVxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVmYXVsdFRvb2x0aXBzKHN0YXRlLCBkYXRhc2V0KSB7XG4gIGNvbnN0IHRvb2x0aXBGaWVsZHMgPSBmaW5kRmllbGRzVG9TaG93KHtcbiAgICAuLi5kYXRhc2V0LFxuICAgIG1heERlZmF1bHRUb29sdGlwczogc3RhdGUubWF4RGVmYXVsdFRvb2x0aXBzXG4gIH0pO1xuICBjb25zdCBtZXJnZWQgPSB7XG4gICAgLi4uc3RhdGUuaW50ZXJhY3Rpb25Db25maWcudG9vbHRpcC5jb25maWcuZmllbGRzVG9TaG93LFxuICAgIC4uLnRvb2x0aXBGaWVsZHNcbiAgfTtcblxuICByZXR1cm4gc2V0KFsnaW50ZXJhY3Rpb25Db25maWcnLCAndG9vbHRpcCcsICdjb25maWcnLCAnZmllbGRzVG9TaG93J10sIG1lcmdlZCwgc3RhdGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaW5pdGlhbEZpbGVMb2FkaW5nUHJvZ3Jlc3MoZmlsZSwgaW5kZXgpIHtcbiAgY29uc3QgZmlsZU5hbWUgPSBmaWxlLm5hbWUgfHwgYFVudGl0bGVkIEZpbGUgJHtpbmRleH1gO1xuICByZXR1cm4ge1xuICAgIFtmaWxlTmFtZV06IHtcbiAgICAgIC8vIHBlcmNlbnQgb2YgY3VycmVudCBmaWxlXG4gICAgICBwZXJjZW50OiAwLFxuICAgICAgbWVzc2FnZTogJycsXG4gICAgICBmaWxlTmFtZSxcbiAgICAgIGVycm9yOiBudWxsXG4gICAgfVxuICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlRmlsZUxvYWRpbmdQcm9ncmVzc1VwZGF0ZXIoc3RhdGUsIHtmaWxlTmFtZSwgcHJvZ3Jlc3N9KSB7XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgcmV0dXJuIHBpY2tfKCdmaWxlTG9hZGluZ1Byb2dyZXNzJykocGlja18oZmlsZU5hbWUpKG1lcmdlXyhwcm9ncmVzcykpKShzdGF0ZSk7XG59XG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byB1cGRhdGUgbGF5ZXIgZG9tYWlucyBmb3IgYW4gYXJyYXkgb2YgZGF0YXNldHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFsbExheWVyRG9tYWluRGF0YTxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgZGF0YUlkOiBzdHJpbmcgfCBzdHJpbmdbXSxcbiAgdXBkYXRlZEZpbHRlcj86IEZpbHRlclxuKTogUyB7XG4gIGNvbnN0IGRhdGFJZHMgPSB0eXBlb2YgZGF0YUlkID09PSAnc3RyaW5nJyA/IFtkYXRhSWRdIDogZGF0YUlkO1xuICBjb25zdCBuZXdMYXllcnM6IExheWVyW10gPSBbXTtcbiAgY29uc3QgbmV3TGF5ZXJEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHN0YXRlLmxheWVycy5mb3JFYWNoKChvbGRMYXllciwgaSkgPT4ge1xuICAgIGlmIChvbGRMYXllci5jb25maWcuZGF0YUlkICYmIGRhdGFJZHMuaW5jbHVkZXMob2xkTGF5ZXIuY29uZmlnLmRhdGFJZCkpIHtcbiAgICAgIC8vIE5vIG5lZWQgdG8gcmVjYWxjdWxhdGUgbGF5ZXIgZG9tYWluIGlmIGZpbHRlciBoYXMgZml4ZWQgZG9tYWluXG4gICAgICBjb25zdCBuZXdMYXllciA9XG4gICAgICAgIHVwZGF0ZWRGaWx0ZXIgJiYgdXBkYXRlZEZpbHRlci5maXhlZERvbWFpblxuICAgICAgICAgID8gb2xkTGF5ZXJcbiAgICAgICAgICA6IG9sZExheWVyLnVwZGF0ZUxheWVyRG9tYWluKHN0YXRlLmRhdGFzZXRzLCB1cGRhdGVkRmlsdGVyKTtcblxuICAgICAgY29uc3Qge2xheWVyRGF0YSwgbGF5ZXJ9ID0gY2FsY3VsYXRlTGF5ZXJEYXRhKG5ld0xheWVyLCBzdGF0ZSwgc3RhdGUubGF5ZXJEYXRhW2ldKTtcblxuICAgICAgbmV3TGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2gobGF5ZXJEYXRhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmV3TGF5ZXJzLnB1c2gob2xkTGF5ZXIpO1xuICAgICAgbmV3TGF5ZXJEYXRhLnB1c2goc3RhdGUubGF5ZXJEYXRhW2ldKTtcbiAgICB9XG4gIH0pO1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGxheWVyczogbmV3TGF5ZXJzLFxuICAgIGxheWVyRGF0YTogbmV3TGF5ZXJEYXRhXG4gIH07XG5cbiAgcmV0dXJuIG5ld1N0YXRlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlQW5pbWF0aW9uRG9tYWluPFMgZXh0ZW5kcyBWaXNTdGF0ZT4oc3RhdGU6IFMpOiBTIHtcbiAgLy8gbWVyZ2UgYWxsIGFuaW1hdGFibGUgbGF5ZXIgZG9tYWluIGFuZCB1cGRhdGUgZ2xvYmFsIGNvbmZpZ1xuICBjb25zdCBhbmltYXRhYmxlTGF5ZXJzID0gZ2V0QW5pbWF0YWJsZVZpc2libGVMYXllcnMoc3RhdGUubGF5ZXJzKTtcblxuICBpZiAoIWFuaW1hdGFibGVMYXllcnMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnN0YXRlLFxuICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7XG4gICAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgICAgZG9tYWluOiBudWxsLFxuICAgICAgICBpc0FuaW1hdGluZzogZmFsc2UsXG4gICAgICAgIHRpbWVTdGVwczogbnVsbCxcbiAgICAgICAgZGVmYXVsdFRpbWVGb3JtYXQ6IG51bGxcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgY29uc3QgbGF5ZXJEb21haW5zID0gYW5pbWF0YWJsZUxheWVycy5tYXAobCA9PiBsLmNvbmZpZy5hbmltYXRpb24uZG9tYWluIHx8IFtdKTtcbiAgLy8gQHRzLWlnbm9yZVxuICBjb25zdCBtZXJnZWREb21haW4gPSBtZXJnZVRpbWVEb21haW5zKGxheWVyRG9tYWlucyk7XG4gIGNvbnN0IGRlZmF1bHRUaW1lRm9ybWF0ID0gZ2V0VGltZVdpZGdldFRpdGxlRm9ybWF0dGVyKG1lcmdlZERvbWFpbik7XG5cbiAgLy8gbWVyZ2UgdGltZVN0ZXBzXG4gIGxldCBtZXJnZWRUaW1lU3RlcHM6IG51bWJlcltdIHwgbnVsbCA9IHVuaXE8bnVtYmVyPihcbiAgICBhbmltYXRhYmxlTGF5ZXJzLnJlZHVjZSgoYWNjdSwgbGF5ZXIpID0+IHtcbiAgICAgIGFjY3UucHVzaCguLi4obGF5ZXIuY29uZmlnLmFuaW1hdGlvbi50aW1lU3RlcHMgfHwgW10pKTtcbiAgICAgIHJldHVybiBhY2N1O1xuICAgIH0sIFtdKVxuICApLnNvcnQoKTtcblxuICBtZXJnZWRUaW1lU3RlcHMgPSBtZXJnZWRUaW1lU3RlcHMubGVuZ3RoID8gbWVyZ2VkVGltZVN0ZXBzIDogbnVsbDtcblxuICAvLyBUT0RPOiBiZXR0ZXIgaGFuZGxpbmcgb2YgZHVyYXRpb24gY2FsY3VsYXRpb25cbiAgY29uc3QgZHVyYXRpb24gPSBtZXJnZWRUaW1lU3RlcHNcbiAgICA/IChCQVNFX1NQRUVEICogKDEwMDAgLyBGUFMpKSAvIG1lcmdlZFRpbWVTdGVwcy5sZW5ndGggLyAoc3RhdGUuYW5pbWF0aW9uQ29uZmlnLnNwZWVkIHx8IDEpXG4gICAgOiBudWxsO1xuXG4gIGNvbnN0IG5leHRTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBhbmltYXRpb25Db25maWc6IHtcbiAgICAgIC4uLnN0YXRlLmFuaW1hdGlvbkNvbmZpZyxcbiAgICAgIGRvbWFpbjogbWVyZ2VkRG9tYWluLFxuICAgICAgZGVmYXVsdFRpbWVGb3JtYXQsXG4gICAgICBkdXJhdGlvbixcbiAgICAgIHRpbWVTdGVwczogbWVyZ2VkVGltZVN0ZXBzXG4gICAgfVxuICB9O1xuXG4gIC8vIHJlc2V0IGN1cnJlbnRUaW1lIGJhc2VkIG9uIG5ldyBkb21haW5cbiAgY29uc3Qgc3luY2VkRmlsdGVyID0gc3RhdGUuZmlsdGVycz8uZmluZChmID0+IChmIGFzIFRpbWVSYW5nZUZpbHRlcikuc3luY2VkV2l0aExheWVyVGltZWxpbmUpIGFzXG4gICAgfCBUaW1lUmFuZ2VGaWx0ZXJcbiAgICB8IHVuZGVmaW5lZDtcblxuICAvLyBpZiBzeW5jZWQgZmlsdGVyIGV4aXN0IHdlZSBuZWVkIHRvIG1lcmdlIGFuaW1hdGlvbkNvbmZpZyBhbmQgZmlsdGVyIGRvbWFpbnNcbiAgLy8gYW5kIHZhbGlkYXRlIHRoZSBjdXJyZW50IHRpbWUgYWdhaW5zdCB0aGUgbmV3IG1lcmdlZCBkb21haW5cbiAgY29uc3QgbmV3QW5pbWF0aW9uRG9tYWluID0gc3luY2VkRmlsdGVyXG4gICAgPyBtZXJnZVRpbWVEb21haW5zKFttZXJnZWREb21haW4sIHN5bmNlZEZpbHRlci5kb21haW5dKVxuICAgIDogbWVyZ2VkRG9tYWluO1xuICBjb25zdCBjdXJyZW50VGltZSA9IGlzSW5SYW5nZShzdGF0ZS5hbmltYXRpb25Db25maWcuY3VycmVudFRpbWUsIG5ld0FuaW1hdGlvbkRvbWFpbilcbiAgICA/IHN0YXRlLmFuaW1hdGlvbkNvbmZpZy5jdXJyZW50VGltZVxuICAgIDogbmV3QW5pbWF0aW9uRG9tYWluWzBdO1xuXG4gIGlmIChjdXJyZW50VGltZSAhPT0gc3RhdGUuYW5pbWF0aW9uQ29uZmlnLmN1cnJlbnRUaW1lKSB7XG4gICAgLy8gaWYgY3VycmVudFRpbWUgY2hhbmdlZCwgbmVlZCB0byBjYWxsIGFuaW1hdGlvblRpbWVVcGRhdGVyIHRvIHJlIGNhbGwgZm9ybWF0TGF5ZXJEYXRhXG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIobmV4dFN0YXRlLCB7dmFsdWU6IGN1cnJlbnRUaW1lfSk7XG4gIH1cblxuICByZXR1cm4gbmV4dFN0YXRlO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgc3RhdHVzIG9mIHRoZSBlZGl0b3JcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRFZGl0b3JNb2RlVXBkYXRlciA9IChcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7bW9kZX06IFZpc1N0YXRlQWN0aW9ucy5TZXRFZGl0b3JNb2RlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4gKHtcbiAgLi4uc3RhdGUsXG4gIGVkaXRvcjoge1xuICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICBtb2RlLFxuICAgIHNlbGVjdGVkRmVhdHVyZTogbnVsbFxuICB9XG59KTtcblxuLy8gY29uc3QgZmVhdHVyZVRvRmlsdGVyVmFsdWUgPSAoZmVhdHVyZSkgPT4gKHsuLi5mZWF0dXJlLCBpZDogZmVhdHVyZS5pZH0pO1xuLyoqXG4gKiBVcGRhdGUgZWRpdG9yIGZlYXR1cmVzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0RmVhdHVyZXNVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlcyA9IFtdfTogVmlzU3RhdGVBY3Rpb25zLlNldEZlYXR1cmVzVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBsYXN0RmVhdHVyZSA9IGZlYXR1cmVzLmxlbmd0aCAmJiBmZWF0dXJlc1tmZWF0dXJlcy5sZW5ndGggLSAxXTtcblxuICBjb25zdCBuZXdTdGF0ZSA9IHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIC8vIG9ubHkgc2F2ZSBub25lIGZpbHRlciBmZWF0dXJlcyB0byBlZGl0b3JcbiAgICAgIGZlYXR1cmVzOiBmZWF0dXJlcy5maWx0ZXIoZiA9PiAhZ2V0RmlsdGVySWRJbkZlYXR1cmUoZikpLFxuICAgICAgbW9kZTpcbiAgICAgICAgbGFzdEZlYXR1cmUgJiYgbGFzdEZlYXR1cmUucHJvcGVydGllcz8uaXNDbG9zZWRcbiAgICAgICAgICA/IGxhc3RGZWF0dXJlLnByb3BlcnRpZXM/LnNoYXBlID09PSAnUmVjdGFuZ2xlJ1xuICAgICAgICAgICAgPyBzdGF0ZS5lZGl0b3IubW9kZVxuICAgICAgICAgICAgOiBFRElUT1JfTU9ERVMuRURJVFxuICAgICAgICAgIDogc3RhdGUuZWRpdG9yLm1vZGVcbiAgICB9XG4gIH07XG5cbiAgLy8gUmV0cmlldmUgZXhpc3RpbmcgZmVhdHVyZVxuICBjb25zdCB7c2VsZWN0ZWRGZWF0dXJlfSA9IHN0YXRlLmVkaXRvcjtcblxuICAvLyBJZiBubyBmZWF0dXJlIGlzIHNlbGVjdGVkIHdlIGNhbiBzaW1wbHkgcmV0dXJuIHNpbmNlIG5vIG9wZXJhdGlvbnNcbiAgaWYgKCFzZWxlY3RlZEZlYXR1cmUpIHtcbiAgICByZXR1cm4gbmV3U3RhdGU7XG4gIH1cblxuICAvLyBUT0RPOiBjaGVjayBpZiB0aGUgZmVhdHVyZSBoYXMgY2hhbmdlZFxuICBjb25zdCBmZWF0dXJlID0gZmVhdHVyZXMuZmluZChmID0+IGYuaWQgPT09IHNlbGVjdGVkRmVhdHVyZS5pZCk7XG5cbiAgLy8gaWYgZmVhdHVyZSBpcyBwYXJ0IG9mIGEgZmlsdGVyXG4gIGNvbnN0IGZpbHRlcklkID0gZmVhdHVyZSAmJiBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcbiAgaWYgKGZpbHRlcklkICYmIGZlYXR1cmUpIHtcbiAgICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gICAgaWYgKGZlYXR1cmUucHJvcGVydGllcykgZmVhdHVyZS5wcm9wZXJ0aWVzLmJib3ggPSBiYm94KGZlYXR1cmUpO1xuICAgIGNvbnN0IGZlYXR1cmVWYWx1ZSA9IGZlYXR1cmVUb0ZpbHRlclZhbHVlKGZlYXR1cmUsIGZpbHRlcklkKTtcbiAgICBjb25zdCBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmaWwgPT4gZmlsLmlkID09PSBmaWx0ZXJJZCk7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiBzZXRGaWx0ZXJVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICBpZHg6IGZpbHRlcklkeCxcbiAgICAgIHByb3A6ICd2YWx1ZScsXG4gICAgICB2YWx1ZTogZmVhdHVyZVZhbHVlXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gbmV3U3RhdGU7XG59XG5cbi8qKlxuICogU2V0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGZlYXR1cmVcbiAqIEBtZW1iZXJvZiB1aVN0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGNvbnN0IHNldFNlbGVjdGVkRmVhdHVyZVVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2ZlYXR1cmUsIHNlbGVjdGlvbkNvbnRleHR9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0U2VsZWN0ZWRGZWF0dXJlVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUgPT4ge1xuICAvLyBhZGQgYmJveCBmb3IgcG9seWdvbiBmaWx0ZXIgdG8gc3BlZWQgdXAgZmlsdGVyaW5nXG4gIGxldCBzZWxlY3RlZEZlYXR1cmUgPSBmZWF0dXJlO1xuICBpZiAoZmVhdHVyZT8ucHJvcGVydGllcykge1xuICAgIHNlbGVjdGVkRmVhdHVyZSA9IHtcbiAgICAgIC4uLmZlYXR1cmUsXG4gICAgICBwcm9wZXJ0aWVzOiB7XG4gICAgICAgIC4uLmZlYXR1cmUucHJvcGVydGllcyxcbiAgICAgICAgYmJveDogYmJveChmZWF0dXJlKVxuICAgICAgfVxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBlZGl0b3I6IHtcbiAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgIHNlbGVjdGVkRmVhdHVyZSxcbiAgICAgIHNlbGVjdGlvbkNvbnRleHRcbiAgICB9XG4gIH07XG59O1xuXG4vKipcbiAqIERlbGV0ZSBleGlzdGluZyBmZWF0dXJlIGZyb20gZmlsdGVyc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlbGV0ZUZlYXR1cmVVcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtmZWF0dXJlfTogVmlzU3RhdGVBY3Rpb25zLkRlbGV0ZUZlYXR1cmVVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGlmICghZmVhdHVyZSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBudWxsXG4gICAgfVxuICB9O1xuXG4gIGlmIChnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKSkge1xuICAgIGNvbnN0IGZpbHRlcklkeCA9IG5ld1N0YXRlLmZpbHRlcnMuZmluZEluZGV4KGYgPT4gZi5pZCA9PT0gZ2V0RmlsdGVySWRJbkZlYXR1cmUoZmVhdHVyZSkpO1xuXG4gICAgcmV0dXJuIGZpbHRlcklkeCA+IC0xID8gcmVtb3ZlRmlsdGVyVXBkYXRlcihuZXdTdGF0ZSwge2lkeDogZmlsdGVySWR4fSkgOiBuZXdTdGF0ZTtcbiAgfVxuXG4gIC8vIG1vZGlmeSBlZGl0b3Igb2JqZWN0XG4gIGNvbnN0IG5ld0VkaXRvciA9IHtcbiAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgZmVhdHVyZXM6IHN0YXRlLmVkaXRvci5mZWF0dXJlcy5maWx0ZXIoZiA9PiBmLmlkICE9PSBmZWF0dXJlLmlkKSxcbiAgICBzZWxlY3RlZEZlYXR1cmU6IG51bGxcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlLFxuICAgIGVkaXRvcjogbmV3RWRpdG9yXG4gIH07XG59XG5cbi8qKlxuICogVG9nZ2xlIGZlYXR1cmUgYXMgbGF5ZXIgZmlsdGVyXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICBwYXlsb2FkOiBWaXNTdGF0ZUFjdGlvbnMuU2V0UG9seWdvbkZpbHRlckxheWVyVXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCB7bGF5ZXIsIGZlYXR1cmV9ID0gcGF5bG9hZDtcbiAgY29uc3QgZmlsdGVySWQgPSBnZXRGaWx0ZXJJZEluRmVhdHVyZShmZWF0dXJlKTtcblxuICAvLyBsZXQgbmV3RmlsdGVyID0gbnVsbDtcbiAgbGV0IGZpbHRlcklkeDtcbiAgbGV0IG5ld0xheWVySWQgPSBbbGF5ZXIuaWRdO1xuICBsZXQgbmV3U3RhdGUgPSBzdGF0ZTtcbiAgLy8gSWYgcG9seWdvbiBmaWx0ZXIgYWxyZWFkeSBleGlzdHMsIHdlIG5lZWQgdG8gZmluZCBvdXQgaWYgdGhlIGN1cnJlbnQgbGF5ZXIgaXMgYWxyZWFkeSBpbmNsdWRlZFxuICBpZiAoZmlsdGVySWQpIHtcbiAgICBmaWx0ZXJJZHggPSBzdGF0ZS5maWx0ZXJzLmZpbmRJbmRleChmID0+IGYuaWQgPT09IGZpbHRlcklkKTtcblxuICAgIGlmICghc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdKSB7XG4gICAgICAvLyB3aGF0IGlmIGZpbHRlciBkb2Vzbid0IGV4aXN0Py4uLiBub3QgcG9zc2libGUuXG4gICAgICAvLyBiZWNhdXNlIGZlYXR1cmVzIGluIHRoZSBlZGl0b3IgaXMgcGFzc2VkIGluIGZyb20gZmlsdGVycyBhbmQgZWRpdG9ycy5cbiAgICAgIC8vIGJ1dCB3ZSB3aWxsIG1vdmUgdGhpcyBmZWF0dXJlIGJhY2sgdG8gZWRpdG9yIGp1c3QgaW4gY2FzZVxuICAgICAgY29uc3Qgbm9uZUZpbHRlckZlYXR1cmUgPSB7XG4gICAgICAgIC4uLmZlYXR1cmUsXG4gICAgICAgIHByb3BlcnRpZXM6IHtcbiAgICAgICAgICAuLi5mZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgICAgZmlsdGVySWQ6IG51bGxcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgIGVkaXRvcjoge1xuICAgICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgICBmZWF0dXJlczogWy4uLnN0YXRlLmVkaXRvci5mZWF0dXJlcywgbm9uZUZpbHRlckZlYXR1cmVdLFxuICAgICAgICAgIHNlbGVjdGVkRmVhdHVyZTogbm9uZUZpbHRlckZlYXR1cmVcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdO1xuICAgIGNvbnN0IHtsYXllcklkID0gW119ID0gZmlsdGVyO1xuICAgIGNvbnN0IGlzTGF5ZXJJbmNsdWRlZCA9IGxheWVySWQuaW5jbHVkZXMobGF5ZXIuaWQpO1xuXG4gICAgbmV3TGF5ZXJJZCA9IGlzTGF5ZXJJbmNsdWRlZFxuICAgICAgPyAvLyBpZiBsYXllciBpcyBpbmNsdWRlZCwgcmVtb3ZlIGl0XG4gICAgICAgIGxheWVySWQuZmlsdGVyKGwgPT4gbCAhPT0gbGF5ZXIuaWQpXG4gICAgICA6IFsuLi5sYXllcklkLCBsYXllci5pZF07XG4gIH0gZWxzZSB7XG4gICAgLy8gaWYgd2UgaGF2ZW4ndCBjcmVhdGUgdGhlIHBvbHlnb24gZmlsdGVyLCBjcmVhdGUgaXRcbiAgICBjb25zdCBuZXdGaWx0ZXIgPSBnZW5lcmF0ZVBvbHlnb25GaWx0ZXIoW10sIGZlYXR1cmUpO1xuICAgIGZpbHRlcklkeCA9IHN0YXRlLmZpbHRlcnMubGVuZ3RoO1xuXG4gICAgLy8gYWRkIGZlYXR1cmUsIHJlbW92ZSBmZWF0dXJlIGZyb20gZWlkdG9yXG4gICAgbmV3U3RhdGUgPSB7XG4gICAgICAuLi5zdGF0ZSxcbiAgICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBuZXdGaWx0ZXJdLFxuICAgICAgZWRpdG9yOiB7XG4gICAgICAgIC4uLnN0YXRlLmVkaXRvcixcbiAgICAgICAgZmVhdHVyZXM6IHN0YXRlLmVkaXRvci5mZWF0dXJlcy5maWx0ZXIoZiA9PiBmLmlkICE9PSBmZWF0dXJlLmlkKSxcbiAgICAgICAgc2VsZWN0ZWRGZWF0dXJlOiBuZXdGaWx0ZXIudmFsdWVcbiAgICAgIH1cbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZHg6IGZpbHRlcklkeCxcbiAgICBwcm9wOiAnbGF5ZXJJZCcsXG4gICAgdmFsdWU6IG5ld0xheWVySWRcbiAgfSk7XG59XG5cbi8qKlxuICogQXBwbHkgcG9seWdvbiBmaWx0ZXIgdG8gYWxsIHZpc2libGUgbGF5ZXJzXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0UG9seWdvbkZpbHRlckFsbExheWVyc1VwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAgcGF5bG9hZDogVmlzU3RhdGVBY3Rpb25zLlNldFBvbHlnb25GaWx0ZXJBbGxMYXllcnNVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IHtmZWF0dXJlfSA9IHBheWxvYWQ7XG5cbiAgY29uc3QgbmV3RmlsdGVyID0gZ2VuZXJhdGVQb2x5Z29uRmlsdGVyKFtdLCBmZWF0dXJlKTtcbiAgY29uc3QgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5sZW5ndGg7XG5cbiAgY29uc3QgbmV3U3RhdGU6IFZpc1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IFsuLi5zdGF0ZS5maWx0ZXJzLCBuZXdGaWx0ZXJdLFxuICAgIGVkaXRvcjoge1xuICAgICAgLi4uc3RhdGUuZWRpdG9yLFxuICAgICAgZmVhdHVyZXM6IHN0YXRlLmVkaXRvci5mZWF0dXJlcy5maWx0ZXIoZiA9PiBmLmlkICE9PSBmZWF0dXJlLmlkKSxcbiAgICAgIHNlbGVjdGVkRmVhdHVyZTogbmV3RmlsdGVyLnZhbHVlLFxuICAgICAgbW9kZTogRURJVE9SX01PREVTLkVESVRcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgdmlzaWJsZUxheWVySWRzID0gZ2V0KHBheWxvYWQsICd2aXNpYmxlTGF5ZXJJZHMnKTtcbiAgY29uc3QgYWxsTGF5ZXJJZHMgPSBBcnJheS5pc0FycmF5KHZpc2libGVMYXllcklkcylcbiAgICA/IHZpc2libGVMYXllcklkc1xuICAgIDogc3RhdGUubGF5ZXJzLmZpbHRlcihsID0+IGwuY29uZmlnLmlzVmlzaWJsZSkubWFwKGwgPT4gbC5pZCk7XG5cbiAgcmV0dXJuIHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZHg6IGZpbHRlcklkeCxcbiAgICBwcm9wOiAnbGF5ZXJJZCcsXG4gICAgdmFsdWU6IGFsbExheWVySWRzXG4gIH0pO1xufVxuXG4vKipcbiAqIEBtZW1iZXJvZiB2aXNTdGF0ZVVwZGF0ZXJzXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzb3J0VGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbiwgbW9kZX06IFZpc1N0YXRlQWN0aW9ucy5Tb3J0VGFibGVDb2x1bW5VcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIGNvbnN0IGRhdGFzZXQgPSBzdGF0ZS5kYXRhc2V0c1tkYXRhSWRdO1xuICBpZiAoIWRhdGFzZXQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cbiAgbGV0IHNvcnRNb2RlID0gbW9kZTtcbiAgaWYgKCFzb3J0TW9kZSkge1xuICAgIGNvbnN0IGN1cnJlbnRNb2RlID0gZ2V0KGRhdGFzZXQsIFsnc29ydENvbHVtbicsIGNvbHVtbl0pO1xuICAgIC8vIEB0cy1pZ25vcmUgLSBzaG91bGQgYmUgZml4YWJsZSBpbiBhIFRTIGZpbGVcbiAgICBzb3J0TW9kZSA9IGN1cnJlbnRNb2RlXG4gICAgICA/IE9iamVjdC5rZXlzKFNPUlRfT1JERVIpLmZpbmQobSA9PiBtICE9PSBjdXJyZW50TW9kZSlcbiAgICAgIDogU09SVF9PUkRFUi5BU0NFTkRJTkc7XG4gIH1cblxuICBjb25zdCBzb3J0ZWQgPSBzb3J0RGF0YXNldEJ5Q29sdW1uKGRhdGFzZXQsIGNvbHVtbiwgc29ydE1vZGUpO1xuICByZXR1cm4gc2V0KFsnZGF0YXNldHMnLCBkYXRhSWRdLCBzb3J0ZWQsIHN0YXRlKTtcbn1cblxuLyoqXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gcGluVGFibGVDb2x1bW5VcGRhdGVyKFxuICBzdGF0ZTogVmlzU3RhdGUsXG4gIHtkYXRhSWQsIGNvbHVtbn06IFZpc1N0YXRlQWN0aW9ucy5QaW5UYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBuZXdEYXRhc2V0ID0gcGluVGFibGVDb2x1bW5zKGRhdGFzZXQsIGNvbHVtbik7XG5cbiAgcmV0dXJuIHNldChbJ2RhdGFzZXRzJywgZGF0YUlkXSwgbmV3RGF0YXNldCwgc3RhdGUpO1xufVxuXG4vKipcbiAqIENvcHkgY29sdW1uIGNvbnRlbnQgYXMgc3RyaW5nc1xuICogQG1lbWJlcm9mIHZpc1N0YXRlVXBkYXRlcnNcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvcHlUYWJsZUNvbHVtblVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgY29sdW1ufTogVmlzU3RhdGVBY3Rpb25zLkNvcHlUYWJsZUNvbHVtblVwZGF0ZXJBY3Rpb25cbik6IFZpc1N0YXRlIHtcbiAgY29uc3QgZGF0YXNldCA9IHN0YXRlLmRhdGFzZXRzW2RhdGFJZF07XG4gIGlmICghZGF0YXNldCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCBmaWVsZElkeCA9IGRhdGFzZXQuZmllbGRzLmZpbmRJbmRleChmID0+IGYubmFtZSA9PT0gY29sdW1uKTtcbiAgaWYgKGZpZWxkSWR4IDwgMCkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB7dHlwZX0gPSBkYXRhc2V0LmZpZWxkc1tmaWVsZElkeF07XG4gIGNvbnN0IHRleHQgPSBkYXRhc2V0LmRhdGFDb250YWluZXJcbiAgICAubWFwKHJvdyA9PiBwYXJzZUZpZWxkVmFsdWUocm93LnZhbHVlQXQoZmllbGRJZHgpLCB0eXBlKSwgdHJ1ZSlcbiAgICAuam9pbignXFxuJyk7XG5cbiAgY29weSh0ZXh0KTtcblxuICByZXR1cm4gc3RhdGU7XG59XG5cbi8qKlxuICogU2V0IGRpc3BsYXkgZm9ybWF0IGZyb20gY29sdW1ucyBmcm9tIHVzZXIgc2VsZWN0aW9uXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0Q29sdW1uRGlzcGxheUZvcm1hdFVwZGF0ZXIoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge2RhdGFJZCwgZm9ybWF0c306IFZpc1N0YXRlQWN0aW9ucy5TZXRDb2x1bW5EaXNwbGF5Rm9ybWF0VXBkYXRlckFjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBkYXRhc2V0ID0gc3RhdGUuZGF0YXNldHNbZGF0YUlkXTtcbiAgaWYgKCFkYXRhc2V0KSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGxldCBuZXdGaWVsZHMgPSBkYXRhc2V0LmZpZWxkcztcbiAgT2JqZWN0LmtleXMoZm9ybWF0cykuZm9yRWFjaChjb2x1bW4gPT4ge1xuICAgIGNvbnN0IGZpZWxkSWR4ID0gZGF0YXNldC5maWVsZHMuZmluZEluZGV4KGYgPT4gZi5uYW1lID09PSBjb2x1bW4pO1xuICAgIGlmIChmaWVsZElkeCA+PSAwKSB7XG4gICAgICBjb25zdCBkaXNwbGF5Rm9ybWF0ID0gZm9ybWF0c1tjb2x1bW5dO1xuICAgICAgY29uc3QgZmllbGQgPSBuZXdGaWVsZHNbZmllbGRJZHhdO1xuICAgICAgbmV3RmllbGRzID0gc3dhcF8obWVyZ2VfKHtkaXNwbGF5Rm9ybWF0fSkoZmllbGQpIGFzIHtpZDogc3RyaW5nfSkoXG4gICAgICAgIG5ld0ZpZWxkcyBhcyB7aWQ6IHN0cmluZ31bXVxuICAgICAgKSBhcyBGaWVsZFtdO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgbmV3RGF0YXNldCA9IGNvcHlUYWJsZUFuZFVwZGF0ZShkYXRhc2V0LCB7ZmllbGRzOiBuZXdGaWVsZHMgYXMgRmllbGRbXX0pO1xuICBsZXQgbmV3U3RhdGUgPSBwaWNrXygnZGF0YXNldHMnKShtZXJnZV8oe1tkYXRhSWRdOiBuZXdEYXRhc2V0fSkpKHN0YXRlKTtcblxuICAvLyB1cGRhdGUgY29sb3JGaWVsZCBkaXNwbGF5Rm9ybWF0XG4gIG5ld1N0YXRlID0ge1xuICAgIC4uLm5ld1N0YXRlLFxuICAgIGxheWVyczogbmV3U3RhdGUubGF5ZXJzLm1hcChsYXllciA9PlxuICAgICAgbGF5ZXIuY29uZmlnPy5jb2xvckZpZWxkPy5uYW1lICYmIGxheWVyLmNvbmZpZy5jb2xvckZpZWxkLm5hbWUgaW4gZm9ybWF0c1xuICAgICAgICA/IGxheWVyLnVwZGF0ZUxheWVyQ29uZmlnKHtcbiAgICAgICAgICAgIGNvbG9yRmllbGQ6IHtcbiAgICAgICAgICAgICAgLi4ubGF5ZXIuY29uZmlnLmNvbG9yRmllbGQsXG4gICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ6IGZvcm1hdHNbbGF5ZXIuY29uZmlnLmNvbG9yRmllbGQubmFtZV1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICA6IGxheWVyXG4gICAgKVxuICB9O1xuXG4gIHJldHVybiBuZXdTdGF0ZTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgZWRpdG9yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b2dnbGVFZGl0b3JWaXNpYmlsaXR5VXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLlRvZ2dsZUVkaXRvclZpc2liaWxpdHlVcGRhdGVyQWN0aW9uXG4pOiBWaXNTdGF0ZSB7XG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgZWRpdG9yOiB7XG4gICAgICAuLi5zdGF0ZS5lZGl0b3IsXG4gICAgICB2aXNpYmxlOiAhc3RhdGUuZWRpdG9yLnZpc2libGVcbiAgICB9XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWx0ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7aWR4LCBjb25maWd9OiBWaXNTdGF0ZUFjdGlvbnMuU2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZ0FjdGlvblxuKTogVmlzU3RhdGUge1xuICBjb25zdCBvbGRGaWx0ZXIgPSBzdGF0ZS5maWx0ZXJzW2lkeF07XG4gIGlmICghb2xkRmlsdGVyKSB7XG4gICAgQ29uc29sZS5lcnJvcihgZmlsdGVycy4ke2lkeH0gaXMgdW5kZWZpbmVkYCk7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGlmIChvbGRGaWx0ZXIudHlwZSAhPT0gRklMVEVSX1RZUEVTLnRpbWVSYW5nZSkge1xuICAgIENvbnNvbGUuZXJyb3IoXG4gICAgICBgc2V0RmlsdGVyQW5pbWF0aW9uVGltZUNvbmZpZyBjYW4gb25seSBiZSBjYWxsZWQgdG8gdXBkYXRlIGEgdGltZSBmaWx0ZXIuIGNoZWNrIGZpbHRlci50eXBlID09PSAndGltZVJhbmdlJ2BcbiAgICApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IHVwZGF0ZXMgPSBjaGVja1RpbWVDb25maWdBcmdzKGNvbmZpZyk7XG5cbiAgcmV0dXJuIHBpY2tfKCdmaWx0ZXJzJykoc3dhcF8obWVyZ2VfKHVwZGF0ZXMpKG9sZEZpbHRlcikpKShzdGF0ZSk7XG59XG5cbmZ1bmN0aW9uIGNoZWNrVGltZUNvbmZpZ0FyZ3MoY29uZmlnKSB7XG4gIGNvbnN0IGFsbG93ZWQgPSBbJ3RpbWVGb3JtYXQnLCAndGltZXpvbmUnXTtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGNvbmZpZykucmVkdWNlKChhY2N1LCBwcm9wKSA9PiB7XG4gICAgaWYgKCFhbGxvd2VkLmluY2x1ZGVzKHByb3ApKSB7XG4gICAgICBDb25zb2xlLmVycm9yKFxuICAgICAgICBgc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnIHRha2VzIHRpbWVGb3JtYXQgYW5kL29yIHRpbWV6b25lIGFzIG9wdGlvbnMsIGZvdW5kICR7cHJvcH1gXG4gICAgICApO1xuICAgICAgcmV0dXJuIGFjY3U7XG4gICAgfVxuXG4gICAgLy8gaGVyZSB3ZSBhcmUgTk9UIGNoZWNraW5nIGlmIHRpbWV6b25lIG9yIHRpbWVGb3JtYXQgaW5wdXQgaXMgdmFsaWRcbiAgICBhY2N1W3Byb3BdID0gY29uZmlnW3Byb3BdO1xuICAgIHJldHVybiBhY2N1O1xuICB9LCB7fSk7XG59XG5cbi8qKlxuICogVXBkYXRlIGVkaXRvclxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TGF5ZXJBbmltYXRpb25UaW1lQ29uZmlnVXBkYXRlcihcbiAgc3RhdGU6IFZpc1N0YXRlLFxuICB7Y29uZmlnfTogVmlzU3RhdGVBY3Rpb25zLlNldExheWVyQW5pbWF0aW9uVGltZUNvbmZpZ0FjdGlvblxuKTogVmlzU3RhdGUge1xuICBpZiAoIWNvbmZpZykge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBjb25zdCB1cGRhdGVzID0gY2hlY2tUaW1lQ29uZmlnQXJncyhjb25maWcpO1xuICByZXR1cm4gcGlja18oJ2FuaW1hdGlvbkNvbmZpZycpKG1lcmdlXyh1cGRhdGVzKSkoc3RhdGUpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBlZGl0b3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxheWVyRmlsdGVyZWRJdGVtc0NoYW5nZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLkxheWVyRmlsdGVyZWRJdGVtc0NoYW5nZUFjdGlvblxuKTogUyB7XG4gIGNvbnN0IHtldmVudCwgbGF5ZXJ9ID0gYWN0aW9uO1xuICBjb25zdCB7aWQ6IGRlY2tnbExheWVySWQsIGNvdW50fSA9IGV2ZW50O1xuICBpZiAoIWxheWVyKSB7XG4gICAgQ29uc29sZS53YXJuKGBsYXllckZpbHRlcmVkSXRlbXMgbGF5ZXIgZG9lc250IGV4aXN0c2ApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuICBpZiAobGF5ZXIuZmlsdGVyZWRJdGVtQ291bnQ/LltkZWNrZ2xMYXllcklkXSA9PT0gY291bnQpIHtcbiAgICByZXR1cm4gc3RhdGU7XG4gIH1cblxuICBsYXllci5maWx0ZXJlZEl0ZW1Db3VudCA9IHtcbiAgICAuLi5sYXllci5maWx0ZXJlZEl0ZW1Db3VudCxcbiAgICBbZGVja2dsTGF5ZXJJZF06IGNvdW50XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsYXllcnM6IHN3YXBfKGxheWVyKShzdGF0ZS5sYXllcnMpXG4gIH07XG59XG5cbi8qKlxuICogVXBkYXRlIFdNUyBmZWF0dXJlIGluZm8gYW5kIHBpbiB0b29sdGlwXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3bXNGZWF0dXJlSW5mb1VwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLldNU0ZlYXR1cmVJbmZvQWN0aW9uXG4pOiBTIHtcbiAgY29uc3Qge2xheWVyLCBmZWF0dXJlSW5mbywgY29vcmRpbmF0ZX0gPSBhY3Rpb247XG4gIGlmICghbGF5ZXIpIHtcbiAgICBjb25zb2xlLndhcm4oYFdNUyBmZWF0dXJlIGluZm8gbGF5ZXIgZG9lc24ndCBleGlzdGApO1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGNsaWNrZWQgb2JqZWN0IHNpbWlsYXIgdG8gbGF5ZXJDbGlja1VwZGF0ZXIgdG8gcGluIHRoZSB0b29sdGlwXG4gIGNvbnN0IGNsaWNrZWQgPSBmZWF0dXJlSW5mb1xuICAgID8ge1xuICAgICAgICBwaWNrZWQ6IHRydWUsXG4gICAgICAgIG9iamVjdDoge1xuICAgICAgICAgIHdtc0ZlYXR1cmVJbmZvOiBmZWF0dXJlSW5mb1xuICAgICAgICB9LFxuICAgICAgICBjb29yZGluYXRlOiBjb29yZGluYXRlIHx8IFswLCAwXSxcbiAgICAgICAgbGF5ZXI6IHtcbiAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaWR4OiBzdGF0ZS5sYXllcnMuZmluZEluZGV4KGwgPT4gbC5pZCA9PT0gbGF5ZXIuaWQpLFxuICAgICAgICAgICAgaWQ6IGxheWVyLmlkXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgOiBudWxsO1xuXG4gIHJldHVybiB7XG4gICAgLi4uc3RhdGUsXG4gICAgY2xpY2tlZFxuICB9O1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbWF4LXN0YXRlbWVudHNcbmV4cG9ydCBmdW5jdGlvbiBzeW5jVGltZUZpbHRlcldpdGhMYXllclRpbWVsaW5lVXBkYXRlcjxTIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogUyxcbiAgYWN0aW9uOiBWaXNTdGF0ZUFjdGlvbnMuU3luY1RpbWVGaWx0ZXJXaXRoTGF5ZXJUaW1lbGluZUFjdGlvblxuKTogUyB7XG4gIGNvbnN0IHtpZHg6IGZpbHRlcklkeCwgZW5hYmxlID0gZmFsc2V9ID0gYWN0aW9uO1xuXG4gIGNvbnN0IGZpbHRlciA9IHN0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXI7XG5cbiAgbGV0IG5ld1N0YXRlID0gc3RhdGU7XG4gIGxldCBuZXdGaWx0ZXIgPSBmaWx0ZXI7XG5cbiAgLy8gaWYgd2UgZW5hYmxlIHN5bmMgd2UgYXJlIGdvaW5nIHRvIG1lcmdlIGZpbHRlciBhbmQgYW5pbWF0aW9uQ29uZmlnIGRvbWFpbnMgYW5kIHN0b3JlIGludG8gZmlsdGVyLmRvbWFpblxuICBpZiAoZW5hYmxlKSB7XG4gICAgY29uc3QgYW5pbWF0YWJsZUxheWVycyA9IGdldEFuaW1hdGFibGVWaXNpYmxlTGF5ZXJzKG5ld1N0YXRlLmxheWVycyk7XG4gICAgLy8gaWYgbm8gYW5pbWF0YWJsZUxheWVycyBhcmUgcHJlc2VudCB3ZSBzaW1wbHkgcmV0dXJuXG4gICAgaWYgKCFhbmltYXRhYmxlTGF5ZXJzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIG5ld1N0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMgPSBnZXRJbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzKGFuaW1hdGFibGVMYXllcnMpO1xuICAgIGNvbnN0IGhhc0ludGVydmFsQmFzZWRBbmltYXRpb25MYXllciA9IEJvb2xlYW4oaW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycy5sZW5ndGgpO1xuXG4gICAgY29uc3QgbmV3RmlsdGVyRG9tYWluID0gbWVyZ2VUaW1lRG9tYWlucyhbZmlsdGVyLmRvbWFpbiwgbmV3U3RhdGUuYW5pbWF0aW9uQ29uZmlnLmRvbWFpbl0pO1xuXG4gICAgLy8gd2Ugb25seSB1cGRhdGUgYW5pbWF0aW9uV2luZG93IGlmIHdlIGhhdmUgaW50ZXJ2YWwgYmFzZWQgYW5pbWF0aW9uIGxheWVycyB3aXRoIGRlZmluZWQgaW50ZXJ2YWxzIGFuZCB0aGUgY3VycmVudCBmaWx0ZXIgYW5pbWF0aW9uIHdpbmRvdyBpcyBub3QgaW50ZXJ2YWxcbiAgICBpZiAoaGFzSW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVyKSB7XG4gICAgICBpZiAoZmlsdGVyLmFuaW1hdGlvbldpbmRvdyAhPT0gQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbCkge1xuICAgICAgICBuZXdTdGF0ZSA9IHNldEZpbHRlckFuaW1hdGlvbldpbmRvd1VwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgICAgICBpZDogZmlsdGVyLmlkLFxuICAgICAgICAgIGFuaW1hdGlvbldpbmRvdzogQU5JTUFUSU9OX1dJTkRPVy5pbnRlcnZhbFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgbmV3RmlsdGVyID0gbmV3U3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICAgICAgLy8gYWRqdXN0IHRpbWUgZmlsdGVyIGludGVydmFsXG4gICAgICBuZXdGaWx0ZXIgPSBhZGp1c3RUaW1lRmlsdGVySW50ZXJ2YWwobmV3U3RhdGUsIG5ld0ZpbHRlcik7XG5cbiAgICAgIC8vIHJlcGxhY2UgZmlsdGVyIGluIHN0YXRlIHdpdGggbmV3RmlsdGVyXG4gICAgICBuZXdTdGF0ZSA9IHtcbiAgICAgICAgLi4ubmV3U3RhdGUsXG4gICAgICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShuZXdTdGF0ZS5maWx0ZXJzKVxuICAgICAgfTtcbiAgICB9XG5cbiAgICBuZXdGaWx0ZXIgPSBuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gICAgLy8gYWRqdXN0IHZhbHVlIGJhc2VkIG9uIG5ldyBkb21haW5cbiAgICBjb25zdCBuZXdGaWx0ZXJWYWx1ZSA9IGFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4oXG4gICAgICBuZXdGaWx0ZXIuYW5pbWF0aW9uV2luZG93ID09PSBBTklNQVRJT05fV0lORE9XLmludGVydmFsXG4gICAgICAgID8gW25ld0ZpbHRlckRvbWFpblswXSwgbmV3RmlsdGVyRG9tYWluWzBdXVxuICAgICAgICA6IG5ld0ZpbHRlckRvbWFpbixcbiAgICAgIHsuLi5uZXdGaWx0ZXIsIGRvbWFpbjogbmV3RmlsdGVyRG9tYWlufVxuICAgICk7XG5cbiAgICBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkeDogZmlsdGVySWR4LFxuICAgICAgcHJvcDogJ3ZhbHVlJyxcbiAgICAgIHZhbHVlOiBuZXdGaWx0ZXJWYWx1ZVxuICAgIH0pO1xuXG4gICAgbmV3RmlsdGVyID0ge1xuICAgICAgLi4uKG5ld1N0YXRlLmZpbHRlcnNbZmlsdGVySWR4XSBhcyBUaW1lUmFuZ2VGaWx0ZXIpLFxuICAgICAgc3luY2VkV2l0aExheWVyVGltZWxpbmU6IHRydWVcbiAgICB9O1xuXG4gICAgLy8gcmVwbGFjZSBmaWx0ZXIgaW4gc3RhdGUgd2l0aCBuZXdGaWx0ZXJcbiAgICBuZXdTdGF0ZSA9IHtcbiAgICAgIC4uLm5ld1N0YXRlLFxuICAgICAgZmlsdGVyczogc3dhcF88RmlsdGVyPihuZXdGaWx0ZXIpKG5ld1N0YXRlLmZpbHRlcnMpXG4gICAgfTtcblxuICAgIG5ld1N0YXRlID0gc2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICAgIGlkOiBuZXdGaWx0ZXIuaWQsXG4gICAgICBtb2RlOiBnZXRTeW5jQW5pbWF0aW9uTW9kZShuZXdGaWx0ZXIpXG4gICAgfSk7XG5cbiAgICBuZXdGaWx0ZXIgPSBuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gICAgLy8gc2V0IHRoZSBhbmltYXRpb24gY29uZmlnIHZhbHVlIHRvIG1hdGNoIGZpbHRlciB2YWx1ZVxuICAgIHJldHVybiBzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgICB2YWx1ZTogbmV3RmlsdGVyLnZhbHVlW25ld0ZpbHRlci5zeW5jVGltZWxpbmVNb2RlXVxuICAgIH0pO1xuICB9XG5cbiAgLy8gc2V0IGRvbWFpbiBhbmQgc3RlcFxuICBuZXdGaWx0ZXIgPSB7XG4gICAgLi4uZmlsdGVyLFxuICAgIHN5bmNlZFdpdGhMYXllclRpbWVsaW5lOiBmYWxzZVxuICB9O1xuXG4gIC8vIHJlcGxhY2UgZmlsdGVyIGluIHN0YXRlIHdpdGggbmV3RmlsdGVyXG4gIG5ld1N0YXRlID0ge1xuICAgIC4uLm5ld1N0YXRlLFxuICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShuZXdTdGF0ZS5maWx0ZXJzKVxuICB9O1xuXG4gIC8vIHJlc2V0IHN5bmMgdGltZWxpbmUgbW9kZVxuICBuZXdTdGF0ZSA9IHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWQ6IG5ld0ZpbHRlci5pZCxcbiAgICBtb2RlOiBTWU5DX1RJTUVMSU5FX01PREVTLmVuZFxuICB9KTtcblxuICBuZXdGaWx0ZXIgPSBuZXdTdGF0ZS5maWx0ZXJzW2ZpbHRlcklkeF0gYXMgVGltZVJhbmdlRmlsdGVyO1xuXG4gIC8vIHJlc2V0IGZpbHRlciB2YWx1ZVxuICBjb25zdCBuZXdGaWx0ZXJWYWx1ZSA9IGFkanVzdFZhbHVlVG9GaWx0ZXJEb21haW4obmV3RmlsdGVyLmRvbWFpbiwgbmV3RmlsdGVyKTtcblxuICBuZXdTdGF0ZSA9IHNldEZpbHRlclVwZGF0ZXIobmV3U3RhdGUsIHtcbiAgICBpZHg6IGZpbHRlcklkeCxcbiAgICBwcm9wOiAndmFsdWUnLFxuICAgIHZhbHVlOiBuZXdGaWx0ZXJWYWx1ZVxuICB9KTtcblxuICBuZXdTdGF0ZSA9IHNldFRpbWVGaWx0ZXJUaW1lbGluZU1vZGVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgaWQ6IG5ld0ZpbHRlci5pZCxcbiAgICBtb2RlOiBnZXRTeW5jQW5pbWF0aW9uTW9kZShuZXdGaWx0ZXIpXG4gIH0pO1xuXG4gIC8vIHJlc2V0IGFuaW1hdGlvbiBjb25maWcgY3VycmVudCB0aW1lIHRvXG4gIHJldHVybiBzZXRMYXllckFuaW1hdGlvblRpbWVVcGRhdGVyKG5ld1N0YXRlLCB7XG4gICAgdmFsdWU6IG5ld1N0YXRlLmFuaW1hdGlvbkNvbmZpZy5kb21haW4/LlswXSA/PyBudWxsXG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0VGltZUZpbHRlclRpbWVsaW5lTW9kZVVwZGF0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihcbiAgc3RhdGU6IFMsXG4gIGFjdGlvbjogVmlzU3RhdGVBY3Rpb25zLnNldFRpbWVGaWx0ZXJTeW5jVGltZWxpbmVNb2RlQWN0aW9uXG4pIHtcbiAgY29uc3Qge2lkOiBmaWx0ZXJJZCwgbW9kZTogc3luY1RpbWVsaW5lTW9kZX0gPSBhY3Rpb247XG5cbiAgY29uc3QgZmlsdGVySWR4ID0gc3RhdGUuZmlsdGVycy5maW5kSW5kZXgoZiA9PiBmLmlkID09PSBmaWx0ZXJJZCk7XG4gIGlmIChmaWx0ZXJJZHggPT09IC0xKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG5cbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdIGFzIFRpbWVSYW5nZUZpbHRlcjtcblxuICBpZiAoIXZhbGlkYXRlU3luY0FuaW1hdGlvbk1vZGUoZmlsdGVyLCBzeW5jVGltZWxpbmVNb2RlKSkge1xuICAgIHJldHVybiBzdGF0ZTtcbiAgfVxuXG4gIGNvbnN0IG5ld0ZpbHRlciA9IHtcbiAgICAuLi5maWx0ZXIsXG4gICAgc3luY1RpbWVsaW5lTW9kZVxuICB9O1xuXG4gIGNvbnN0IG5ld1N0YXRlID0ge1xuICAgIC4uLnN0YXRlLFxuICAgIGZpbHRlcnM6IHN3YXBfPEZpbHRlcj4obmV3RmlsdGVyKShzdGF0ZS5maWx0ZXJzKVxuICB9O1xuXG4gIHJldHVybiBhZGp1c3RBbmltYXRpb25Db25maWdXaXRoRmlsdGVyKG5ld1N0YXRlLCBmaWx0ZXJJZHgpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSBzdGF0ZSBvZiB0aGUgbG9hZGluZyBpbmRpY2F0b3IuXG4gKiBAbWVtYmVyb2YgdmlzU3RhdGVVcGRhdGVyc1xuICogQHBhcmFtIHN0YXRlIHZpc1N0YXRlXG4gKiBAcGFyYW0gYWN0aW9uXG4gKiBAcGFyYW0gYWN0aW9uLnBheWxvYWQgUGF5bG9hZCB3aXRoIGNoYW5nZSBvZiBudW1iZXIgb2YgYWN0aXZlIGxvYWRpbmcgYWN0aW9ucy5cbiAqIEByZXR1cm5zIG5leHRTdGF0ZVxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgc2V0TG9hZGluZ0luZGljYXRvclVwZGF0ZXIgPSAoXG4gIHN0YXRlOiBWaXNTdGF0ZSxcbiAge3BheWxvYWQ6IHtjaGFuZ2V9fToge3BheWxvYWQ6IFNldExvYWRpbmdJbmRpY2F0b3JQYXlsb2FkfVxuKTogVmlzU3RhdGUgPT4ge1xuICBsZXQge2xvYWRpbmdJbmRpY2F0b3JWYWx1ZX0gPSBzdGF0ZTtcbiAgaWYgKCFsb2FkaW5nSW5kaWNhdG9yVmFsdWUpIHtcbiAgICBsb2FkaW5nSW5kaWNhdG9yVmFsdWUgPSAwO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5zdGF0ZSxcbiAgICBsb2FkaW5nSW5kaWNhdG9yVmFsdWU6IE1hdGgubWF4KGxvYWRpbmdJbmRpY2F0b3JWYWx1ZSArIGNoYW5nZSwgMClcbiAgfTtcbn07XG5cbmZ1bmN0aW9uIGFkanVzdEFuaW1hdGlvbkNvbmZpZ1dpdGhGaWx0ZXI8UyBleHRlbmRzIFZpc1N0YXRlPihzdGF0ZTogUywgZmlsdGVySWR4OiBudW1iZXIpOiBTIHtcbiAgY29uc3QgZmlsdGVyID0gc3RhdGUuZmlsdGVyc1tmaWx0ZXJJZHhdO1xuICBpZiAoKGZpbHRlciBhcyBUaW1lUmFuZ2VGaWx0ZXIpLnN5bmNlZFdpdGhMYXllclRpbWVsaW5lKSB7XG4gICAgY29uc3QgdGltZWxpbmVWYWx1ZSA9IGdldFRpbWVsaW5lVmFsdWVGcm9tRmlsdGVyKGZpbHRlcik7XG4gICAgY29uc3QgdmFsdWUgPSBzdGF0ZS5hbmltYXRpb25Db25maWcudGltZVN0ZXBzXG4gICAgICA/IHNuYXBUb01hcmtzKHRpbWVsaW5lVmFsdWUsIHN0YXRlLmFuaW1hdGlvbkNvbmZpZy50aW1lU3RlcHMpXG4gICAgICA6IHRpbWVsaW5lVmFsdWU7XG4gICAgcmV0dXJuIHNldExheWVyQW5pbWF0aW9uVGltZVVwZGF0ZXIoc3RhdGUsIHt2YWx1ZX0pO1xuICB9XG4gIHJldHVybiBzdGF0ZTtcbn1cblxuZnVuY3Rpb24gZ2V0VGltZWxpbmVWYWx1ZUZyb21GaWx0ZXIoZmlsdGVyKSB7XG4gIHJldHVybiBmaWx0ZXIudmFsdWVbZmlsdGVyLnN5bmNUaW1lbGluZU1vZGVdO1xufVxuXG5mdW5jdGlvbiBnZXRTeW5jQW5pbWF0aW9uTW9kZShmaWx0ZXI6IFRpbWVSYW5nZUZpbHRlcikge1xuICBpZiAoZmlsdGVyLmFuaW1hdGlvbldpbmRvdyA9PT0gQU5JTUFUSU9OX1dJTkRPVy5mcmVlKSB7XG4gICAgcmV0dXJuIGZpbHRlci5zeW5jVGltZWxpbmVNb2RlID8/IFNZTkNfVElNRUxJTkVfTU9ERVMuZW5kO1xuICB9XG5cbiAgcmV0dXJuIFNZTkNfVElNRUxJTkVfTU9ERVMuZW5kO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVN5bmNBbmltYXRpb25Nb2RlKGZpbHRlcjogVGltZVJhbmdlRmlsdGVyLCBuZXdNb2RlOiBudW1iZXIpIHtcbiAgcmV0dXJuICEoXG4gICAgZmlsdGVyLmFuaW1hdGlvbldpbmRvdyAhPT0gQU5JTUFUSU9OX1dJTkRPVy5mcmVlICYmIG5ld01vZGUgPT09IFNZTkNfVElNRUxJTkVfTU9ERVMuc3RhcnRcbiAgKTtcbn1cblxuZnVuY3Rpb24gYWRqdXN0VGltZUZpbHRlckludGVydmFsKHN0YXRlLCBmaWx0ZXIpIHtcbiAgY29uc3QgaW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycyA9IGdldEludGVydmFsQmFzZWRBbmltYXRpb25MYXllcnMoc3RhdGUubGF5ZXJzKTtcblxuICBsZXQgaW50ZXJ2YWw6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBpZiAoaW50ZXJ2YWxCYXNlZEFuaW1hdGlvbkxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIGNvbnN0IGludGVydmFsSW5kZXggPSBpbnRlcnZhbEJhc2VkQW5pbWF0aW9uTGF5ZXJzLnJlZHVjZSgoY3VycmVudEluZGV4LCBsKSA9PiB7XG4gICAgICBpZiAobC5tZXRhLnRhcmdldFRpbWVJbnRlcnZhbCkge1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IFRJTUVfSU5URVJWQUxTX09SREVSRUQuZmluZEluZGV4KGkgPT4gaSA9PT0gbC5tZXRhLnRhcmdldFRpbWVJbnRlcnZhbCk7XG4gICAgICAgIHJldHVybiBuZXdJbmRleCA+IC0xICYmIG5ld0luZGV4IDwgY3VycmVudEluZGV4ID8gbmV3SW5kZXggOiBjdXJyZW50SW5kZXg7XG4gICAgICB9XG4gICAgfSwgVElNRV9JTlRFUlZBTFNfT1JERVJFRC5sZW5ndGggLSAxKTtcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgY29uc3QgaGV4VGlsZUludGVydmFsID0gVElNRV9JTlRFUlZBTFNfT1JERVJFRFtpbnRlcnZhbEluZGV4XTtcbiAgICBpbnRlcnZhbCA9IExheWVyVG9GaWx0ZXJUaW1lSW50ZXJ2YWxbaGV4VGlsZUludGVydmFsXTtcbiAgfVxuXG4gIGlmICghaW50ZXJ2YWwpIHtcbiAgICByZXR1cm4gZmlsdGVyO1xuICB9XG5cbiAgLy8gYWRqdXN0IGZpbHRlclxuICBjb25zdCB0aW1lRm9ybWF0ID0gZ2V0RGVmYXVsdFRpbWVGb3JtYXQoaW50ZXJ2YWwpO1xuICBjb25zdCB1cGRhdGVkUGxvdFR5cGUgPSB7Li4uZmlsdGVyLnBsb3RUeXBlLCBpbnRlcnZhbCwgdGltZUZvcm1hdH07XG4gIGNvbnN0IG5ld0ZpbHRlciA9IHVwZGF0ZVRpbWVGaWx0ZXJQbG90VHlwZShmaWx0ZXIsIHVwZGF0ZWRQbG90VHlwZSwgc3RhdGUuZGF0YXNldHMpO1xuICByZXR1cm4gYWRqdXN0VmFsdWVUb0FuaW1hdGlvbldpbmRvdyhzdGF0ZSwgbmV3RmlsdGVyKTtcbn1cblxuLy8gRmluZCBkYXRhSWQgZnJvbSBhIHNhdmVkIHZpc1N0YXRlIHByb3BlcnR5OlxuLy8gbGF5ZXJzLCBmaWx0ZXJzLCBpbnRlcmFjdGlvbnMsIGxheWVyQmxlbmRpbmcsIG92ZXJsYXlCbGVuZGluZywgc3BsaXRNYXBzLCBhbmltYXRpb25Db25maWcsIGVkaXRvclxuLy8gcmVwbGFjZSBpdCB3aXRoIGFub3RoZXIgZGF0YUlkXG5mdW5jdGlvbiBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHModmFsdWU6IGFueSwgZGF0YUlkOiBzdHJpbmcsIGRhdGFJZFRvUmVwbGFjZTogc3RyaW5nKSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgIC8vIGZvciBsYXllcnMsIGZpbHRlcnMsIGNhbGwgZGVmYXVsdFJlcGxhY2VQYXJlbnREYXRhc2V0SWRzIG9uIGVhY2ggaXRlbSBpbiBhcnJheVxuICAgIGNvbnN0IHJlcGxhY2VkID0gdmFsdWVcbiAgICAgIC5tYXAodiA9PiBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHModiwgZGF0YUlkLCBkYXRhSWRUb1JlcGxhY2UpKVxuICAgICAgLmZpbHRlcihkID0+IGQpO1xuICAgIHJldHVybiByZXBsYWNlZC5sZW5ndGggPyByZXBsYWNlZCA6IG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiB2YWx1ZS5kYXRhSWQgPT09ICdzdHJpbmcnICYmIHZhbHVlLmRhdGFJZCA9PT0gZGF0YUlkKSB7XG4gICAgLy8gb3RoZXJzXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnZhbHVlLFxuICAgICAgZGF0YUlkOiBkYXRhSWRUb1JlcGxhY2VcbiAgICB9O1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUuZGF0YUlkKSAmJiB2YWx1ZS5kYXRhSWQuaW5jbHVkZXMoZGF0YUlkKSkge1xuICAgIC8vIGZpbHRlclxuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGRhdGFJZDogdmFsdWUuZGF0YUlkLm1hcChkID0+IChkID09PSBkYXRhSWQgPyBkYXRhSWRUb1JlcGxhY2UgOiBkKSlcbiAgICB9O1xuICB9IGVsc2UgaWYgKHZhbHVlLmNvbmZpZz8uZGF0YUlkICYmIHZhbHVlLmNvbmZpZz8uZGF0YUlkID09PSBkYXRhSWQpIHtcbiAgICAvLyBsYXllclxuICAgIHJldHVybiB7XG4gICAgICAuLi52YWx1ZSxcbiAgICAgIGNvbmZpZzoge1xuICAgICAgICAuLi52YWx1ZS5jb25maWcsXG4gICAgICAgIGRhdGFJZDogZGF0YUlkVG9SZXBsYWNlXG4gICAgICB9XG4gICAgfTtcbiAgfSBlbHNlIGlmIChpc09iamVjdCh2YWx1ZSkgJiYgT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBkYXRhSWQpKSB7XG4gICAgLy8gZm9yIHZhbHVlIHNhdmVkIGFzIHtbZGF0YUlkXTogey4uLn19XG4gICAgcmV0dXJuIHtbZGF0YUlkVG9SZXBsYWNlXTogdmFsdWVbZGF0YUlkXX07XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gRmluZCBkYXRhc2V0SWRzIGRlcml2ZWQgYSBzYXZlZCB2aXNTdGF0ZSBQcm9wZXJ0eTtcbmZ1bmN0aW9uIGZpbmRDaGlsZERhdGFzZXRJZHModmFsdWUpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgLy8gZm9yIGxheWVycywgZmlsdGVycywgY2FsbCBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMgb24gZWFjaCBpdGVtIGluIGFycmF5XG4gICAgY29uc3QgY2hpbGREYXRhSWRzID0gdmFsdWUubWFwKGZpbmRDaGlsZERhdGFzZXRJZHMpLmZpbHRlcihkID0+IGQpO1xuICAgIHJldHVybiBjaGlsZERhdGFJZHMubGVuZ3RoID8gY2hpbGREYXRhSWRzIDogbnVsbDtcbiAgfVxuXG4gIC8vIGNoaWxkIGRhdGEgaWQgdXN1YWxseSBzdG9yZXMgaW4gdGhlIGRlcml2ZWQgZGF0YXNldCBpbmZvXG4gIHJldHVybiB2YWx1ZT8ubmV3RGF0YXNldD8uaW5mby5pZCB8fCBudWxsO1xufVxuXG4vLyBtb3ZlZCB1bm1lcmdlZCBsYXllcnMsIGZpbHRlcnMsIGludGVyYWN0aW9uc1xuZnVuY3Rpb24gbW92ZVZhbHVlVG9CZU1lcmdlZChzdGF0ZSwgcHJvcFZhbHVlcywge3Byb3AsIHRvTWVyZ2VQcm9wLCBzYXZlVW5tZXJnZWR9KSB7XG4gIC8vIHJlbW92ZSBwcm9wIHZhbHVlIGZyb20gc3RhdGVcbiAgLy8gVE9ETzogc2hvdWxkIHdlIGFkZCByZW1vdmUgdXBkYXRlciB0byBtZXJnZXIgYXMgd2VsbD9cbiAgaWYgKCFwcm9wVmFsdWVzKSB7XG4gICAgcmV0dXJuIHN0YXRlO1xuICB9XG4gIGNvbnN0IHN0YXRlUmVtb3ZlZCA9XG4gICAgcHJvcCA9PT0gJ2xheWVycydcbiAgICAgID8gcHJvcFZhbHVlcy5yZWR1Y2UoKGFjY3UsIHByb3BWYWx1ZSkgPT4gcmVtb3ZlTGF5ZXJVcGRhdGVyKGFjY3UsIHtpZDogcHJvcFZhbHVlLmlkfSksIHN0YXRlKVxuICAgICAgOiBBcnJheS5pc0FycmF5KHN0YXRlW3Byb3BdKVxuICAgICAgPyB7XG4gICAgICAgICAgLi4uc3RhdGUsXG4gICAgICAgICAgW3Byb3BdOiBzdGF0ZVtwcm9wXS5maWx0ZXIocCA9PiAhcHJvcFZhbHVlcy5maW5kKHByb3BWYWx1ZSA9PiBwLmlkID09PSBwcm9wVmFsdWUuaWQpKVxuICAgICAgICB9XG4gICAgICA6IC8vIGlmIG5vdCBhcnJheSwgd2Ugd29uJ3QgcmVtb3ZlIGl0LCByZW1vdmUgZGF0YXNldCBzaG91bGQgaGFuZGxlIGl0XG4gICAgICAgIHN0YXRlO1xuXG4gIC8vIG1vdmUgdG8gc3RhdGVUb0JlTWVyZ2VkXG4gIGNvbnN0IHRvQmVNZXJnZWQgPSB7XG4gICAgW3RvTWVyZ2VQcm9wXTogc2F2ZVVubWVyZ2VkXG4gICAgICA/IC8vIGNhbGwgbWVyZ2Ugc2F2ZVVubWVyZ2VkIG1ldGhvZFxuICAgICAgICBzYXZlVW5tZXJnZWQoc3RhdGVSZW1vdmVkLCBwcm9wVmFsdWVzKVxuICAgICAgOiAvLyBpZiB0b01lcmdlUHJvcCBpcyBhcmFheSwgYXBwZW5kIHRvIGl0XG4gICAgICBBcnJheS5pc0FycmF5KHN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0pXG4gICAgICA/IFsuLi5zdGF0ZVJlbW92ZWRbdG9NZXJnZVByb3BdLCAuLi5wcm9wVmFsdWVzXVxuICAgICAgOiAvLyBzYXZlIHByb3BWYWx1ZXMgdG8gdG9NZXJnZVxuICAgICAgaXNPYmplY3Qoc3RhdGVSZW1vdmVkW3RvTWVyZ2VQcm9wXSlcbiAgICAgID8ge1xuICAgICAgICAgIC4uLnN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF0sXG4gICAgICAgICAgLi4ucHJvcFZhbHVlc1xuICAgICAgICB9XG4gICAgICA6IHN0YXRlUmVtb3ZlZFt0b01lcmdlUHJvcF1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIC4uLnN0YXRlUmVtb3ZlZCxcbiAgICAuLi50b0JlTWVyZ2VkXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VEYXRhc2V0QW5kRGVwczxUIGV4dGVuZHMgVmlzU3RhdGU+KFxuICBzdGF0ZTogVCxcbiAgZGF0YUlkOiBzdHJpbmcsXG4gIGRhdGFJZFRvVXNlOiBzdHJpbmdcbik6IFQge1xuICByZXR1cm4gY29tcG9zZV88VD4oW1xuICAgIGFwcGx5XyhyZXBsYWNlRGF0YXNldERlcHNJblN0YXRlLCB7ZGF0YUlkLCBkYXRhSWRUb1VzZX0pLFxuICAgIGFwcGx5XyhyZW1vdmVEYXRhc2V0VXBkYXRlciwge2RhdGFJZH0pXG4gIF0pKHN0YXRlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTdGF0ZUZvckRhdGFzZXRSZXBsYWNlPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICBkYXRhSWQ6IHN0cmluZyxcbiAgZGF0YUlkVG9Vc2U6IHN0cmluZ1xuKTogVCB7XG4gIGNvbnN0IHNlcmlhbGl6ZWRTdGF0ZSA9IHNlcmlhbGl6ZVZpc1N0YXRlKHN0YXRlLCBzdGF0ZS5zY2hlbWEpO1xuICBjb25zdCBuZXh0U3RhdGUgPSByZXBsYWNlRGF0YXNldEFuZERlcHMoc3RhdGUsIGRhdGFJZCwgZGF0YUlkVG9Vc2UpO1xuICAvLyBtYWtlIGEgY29weSBvZiBsYXllck9yZGVyLCBiZWNhdXNlIGxheWVyIGlkIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIGl0IGJ5IGNhbGxpbmcgcmVtb3ZlTGF5ZXJVcGRhdGVyXG4gIGNvbnN0IHByZXNlcnZlTGF5ZXJPcmRlciA9IFsuLi5zdGF0ZS5sYXllck9yZGVyXTtcblxuICAvLyBwcmVzZXJ2ZSBkYXRhc2V0IG9yZGVyXG4gIG5leHRTdGF0ZS5wcmVzZXJ2ZURhdGFzZXRPcmRlciA9IE9iamVjdC5rZXlzKHN0YXRlLmRhdGFzZXRzKS5tYXAoZCA9PlxuICAgIGQgPT09IGRhdGFJZCA/IGRhdGFJZFRvVXNlIDogZFxuICApO1xuXG4gIC8vIHByZXNlcnZlTGF5ZXJPcmRlclxuICBpZiAobmV4dFN0YXRlLmxheWVyVG9CZU1lcmdlZD8ubGVuZ3RoKSB7XG4gICAgLy8gY29weSBzcGxpdCBtYXBzIHRvIGJlIG1lcmdlZCwgYmVjYXVzZSBpdCB3aWxsIGJlIHJlc2V0IGluIHJlbW92ZSBsYXllclxuICAgIG5leHRTdGF0ZS5zcGxpdE1hcHNUb0JlTWVyZ2VkID0gc2VyaWFsaXplZFN0YXRlPy5zcGxpdE1hcHMgPz8gW107XG4gICAgbmV4dFN0YXRlLmxheWVyT3JkZXIgPSBbLi4ucHJlc2VydmVMYXllck9yZGVyXTtcbiAgfVxuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByZXBsYWNlRGF0YXNldERlcHNJblN0YXRlPFQgZXh0ZW5kcyBWaXNTdGF0ZT4oXG4gIHN0YXRlOiBULFxuICB7ZGF0YUlkLCBkYXRhSWRUb1VzZX06IHtkYXRhSWQ6IHN0cmluZzsgZGF0YUlkVG9Vc2U6IHN0cmluZ31cbik6IFQge1xuICBjb25zdCBzZXJpYWxpemVkU3RhdGUgPSBzZXJpYWxpemVWaXNTdGF0ZShzdGF0ZSwgc3RhdGUuc2NoZW1hKTtcblxuICBjb25zdCBuZXh0U3RhdGUgPSBzdGF0ZS5tZXJnZXJzLnJlZHVjZShcbiAgICAoXG4gICAgICBhY2N1U3RhdGUsXG4gICAgICB7cHJvcCwgdG9NZXJnZVByb3AsIHJlcGxhY2VQYXJlbnREYXRhc2V0SWRzLCBnZXRDaGlsZERhdGFzZXRJZHMsIHNhdmVVbm1lcmdlZCwgcHJlc2VydmVPcmRlcn1cbiAgICApID0+IHtcbiAgICAgIC8vIGdldCBkYXRhc2V0IGlkcyB0aGF0IGFyZSBkZXBlbmRzIG9uIHRoaXMgZGF0YXNldFxuICAgICAgY29uc3QgcHJvcHMgPSB0b0FycmF5KHByb3ApO1xuICAgICAgY29uc3QgdG9NZXJnZVByb3BzID0gdG9BcnJheSh0b01lcmdlUHJvcCk7XG4gICAgICBjb25zdCBzYXZlZFByb3BzID0gc2VyaWFsaXplZFN0YXRlID8gcHJvcHMubWFwKHAgPT4gc2VyaWFsaXplZFN0YXRlW3BdKSA6IFtdO1xuXG4gICAgICBsZXQgcmVwbGFjZWRTdGF0ZSA9IGFjY3VTdGF0ZTtcbiAgICAgIHNhdmVkUHJvcHMuZm9yRWFjaCgocHJvcFZhbHVlLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lcmdlck9wdGlvbnMgPSB7XG4gICAgICAgICAgcHJvcDogcHJvcHNbaV0sXG4gICAgICAgICAgdG9NZXJnZVByb3A6IHRvTWVyZ2VQcm9wc1tpXSxcbiAgICAgICAgICBnZXRDaGlsZERhdGFzZXRJZHMsXG4gICAgICAgICAgc2F2ZVVubWVyZ2VkXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcmVwbGFjZWRJdGVtID1cbiAgICAgICAgICByZXBsYWNlUGFyZW50RGF0YXNldElkcz8uKHByb3BWYWx1ZSwgZGF0YUlkLCBkYXRhSWRUb1VzZSkgfHxcbiAgICAgICAgICBkZWZhdWx0UmVwbGFjZVBhcmVudERhdGFzZXRJZHMocHJvcFZhbHVlLCBkYXRhSWQsIGRhdGFJZFRvVXNlKTtcbiAgICAgICAgcmVwbGFjZWRTdGF0ZSA9IHJlcGxhY2VkSXRlbVxuICAgICAgICAgID8gcmVwbGFjZVByb3BWYWx1ZUluU3RhdGUocmVwbGFjZWRTdGF0ZSwgcmVwbGFjZWRJdGVtLCBtZXJnZXJPcHRpb25zKVxuICAgICAgICAgIDogcmVwbGFjZWRTdGF0ZTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgbWVyZ2VyT3B0aW9ucy50b01lcmdlUHJvcCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgcmVwbGFjZWRTdGF0ZVttZXJnZXJPcHRpb25zLnRvTWVyZ2VQcm9wXT8ubGVuZ3RoICYmXG4gICAgICAgICAgcHJlc2VydmVPcmRlclxuICAgICAgICApIHtcbiAgICAgICAgICByZXBsYWNlZFN0YXRlW3ByZXNlcnZlT3JkZXJdID0gcHJvcFZhbHVlLm1hcChpdGVtID0+IGl0ZW0uaWQpO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgcmV0dXJuIHJlcGxhY2VkU3RhdGU7XG4gICAgfSxcbiAgICBzdGF0ZVxuICApO1xuXG4gIHJldHVybiBuZXh0U3RhdGU7XG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VQcm9wVmFsdWVJblN0YXRlKFxuICBzdGF0ZSxcbiAgcmVwbGFjZWRJdGVtLFxuICB7cHJvcCwgdG9NZXJnZVByb3AsIGdldENoaWxkRGF0YXNldElkcywgc2F2ZVVubWVyZ2VkfVxuKSB7XG4gIC8vIHByb3AgaXMgZGVwZW5kcyBvbiB0aGUgZGF0YXNldCB0byBiZSByZXBsYWNlZFxuICAvLyByZW1vdmUgcHJvcCBmcm9tIHN0YXRlLCBhbmQgbW92ZSBpdCB0byB0b0JlTWVyZ2VkXG4gIGxldCBuZXh0U3RhdGUgPSBtb3ZlVmFsdWVUb0JlTWVyZ2VkKHN0YXRlLCByZXBsYWNlZEl0ZW0sIHtwcm9wLCB0b01lcmdlUHJvcCwgc2F2ZVVubWVyZ2VkfSk7XG4gIGNvbnN0IGNoaWxkRGF0YUlkcyA9IGdldENoaWxkRGF0YXNldElkcz8uKHJlcGxhY2VkSXRlbSkgfHwgZmluZENoaWxkRGF0YXNldElkcyhyZXBsYWNlZEl0ZW0pO1xuXG4gIGlmIChjaGlsZERhdGFJZHMpIHtcbiAgICBuZXh0U3RhdGUgPSB0b0FycmF5KGNoaWxkRGF0YUlkcykucmVkdWNlKChhY2N1LCBjaGlsZERhdGFJZCkgPT4ge1xuICAgICAgLy8gc2hvdWxkbid0IG5lZWQgdG8gY2hhbmdlIGNoaWxkIGRhdGFzZXQgaWQsXG4gICAgICAvLyBidXQgc3RpbGwgbmVlZCB0byBtb3ZlIG91dCBvZiBzdGF0ZSBhbmQgbWVyZ2UgYmFjayBpblxuICAgICAgcmV0dXJuIHJlcGxhY2VEYXRhc2V0QW5kRGVwcyhhY2N1LCBjaGlsZERhdGFJZCwgY2hpbGREYXRhSWQpO1xuICAgIH0sIG5leHRTdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIG5leHRTdGF0ZTtcbn1cbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUdBLElBQUFBLEtBQUEsR0FBQUMsc0JBQUEsQ0FBQUMsT0FBQTtBQUNBLElBQUFDLGdCQUFBLEdBQUFGLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRSxVQUFBLEdBQUFILHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBRyxPQUFBLEdBQUFILE9BQUE7QUFDQSxJQUFBSSxVQUFBLEdBQUFMLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBSyxJQUFBLEdBQUFOLHNCQUFBLENBQUFDLE9BQUE7QUFDQSxJQUFBTSxRQUFBLEdBQUFQLHNCQUFB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
|