@kepler.gl/deckgl-layers 3.1.0-alpha.1 → 3.1.0-alpha.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/dist/3d-building-layer/3d-building-layer.d.ts +16 -0
  2. package/dist/3d-building-layer/3d-building-layer.js +69 -0
  3. package/dist/3d-building-layer/3d-building-utils.d.ts +9 -0
  4. package/dist/3d-building-layer/3d-building-utils.js +166 -0
  5. package/dist/3d-building-layer/types.d.ts +51 -0
  6. package/dist/3d-building-layer/types.js +6 -0
  7. package/dist/cluster-layer/cluster-layer.d.ts +44 -0
  8. package/dist/cluster-layer/cluster-layer.js +297 -0
  9. package/dist/column-layer/enhanced-column-layer.d.ts +12 -0
  10. package/dist/column-layer/enhanced-column-layer.js +131 -0
  11. package/dist/deckgl-extensions/filter-arrow-layer.d.ts +42 -0
  12. package/dist/deckgl-extensions/filter-arrow-layer.js +76 -0
  13. package/dist/deckgl-extensions/filter-shader-module.d.ts +16 -0
  14. package/dist/deckgl-extensions/filter-shader-module.js +27 -0
  15. package/dist/grid-layer/enhanced-cpu-grid-layer.d.ts +7 -0
  16. package/dist/grid-layer/enhanced-cpu-grid-layer.js +67 -0
  17. package/dist/hexagon-layer/enhanced-hexagon-layer.d.ts +7 -0
  18. package/dist/hexagon-layer/enhanced-hexagon-layer.js +67 -0
  19. package/dist/index.d.ts +11 -0
  20. package/dist/index.js +109 -0
  21. package/dist/layer-utils/cluster-utils.d.ts +22 -0
  22. package/dist/layer-utils/cluster-utils.js +93 -0
  23. package/dist/layer-utils/cpu-aggregator.d.ts +93 -0
  24. package/dist/layer-utils/cpu-aggregator.js +582 -0
  25. package/dist/layer-utils/shader-utils.d.ts +1 -0
  26. package/dist/layer-utils/shader-utils.js +29 -0
  27. package/dist/line-layer/line-layer.d.ts +12 -0
  28. package/dist/line-layer/line-layer.js +87 -0
  29. package/dist/svg-icon-layer/scatterplot-icon-layer.d.ts +9 -0
  30. package/dist/svg-icon-layer/scatterplot-icon-layer.js +57 -0
  31. package/dist/svg-icon-layer/svg-icon-layer.d.ts +22 -0
  32. package/dist/svg-icon-layer/svg-icon-layer.js +102 -0
  33. package/package.json +6 -5
@@ -0,0 +1,582 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.defaultElevationDimension = exports.defaultDimensions = exports.defaultColorDimension = exports.defaultAggregation = exports["default"] = exports.DECK_AGGREGATION_MAP = void 0;
8
+ exports.getAggregatedData = getAggregatedData;
9
+ exports.getDimensionScale = getDimensionScale;
10
+ exports.getDimensionSortedBins = getDimensionSortedBins;
11
+ exports.getDimensionValueDomain = getDimensionValueDomain;
12
+ exports.getGetValue = getGetValue;
13
+ exports.getScaleFunctor = getScaleFunctor;
14
+ exports.getValueFunc = getValueFunc;
15
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
16
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
17
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
18
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
19
+ var _aggregationLayers = require("@deck.gl/aggregation-layers");
20
+ var _window = require("global/window");
21
+ var _utils = require("@kepler.gl/utils");
22
+ var _constants = require("@kepler.gl/constants");
23
+ 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; }
24
+ 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
25
+ // Copyright contributors to the kepler.gl project
26
+ /* eslint-disable guard-for-in */
27
+ var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, _aggregationLayers.AGGREGATION_OPERATION.SUM, _constants.AGGREGATION_TYPES.sum), _aggregationLayers.AGGREGATION_OPERATION.MEAN, _constants.AGGREGATION_TYPES.average), _aggregationLayers.AGGREGATION_OPERATION.MIN, _constants.AGGREGATION_TYPES.minimum), _aggregationLayers.AGGREGATION_OPERATION.MAX, _constants.AGGREGATION_TYPES.maximum);
28
+ function getValueFunc(aggregation, accessor) {
29
+ if (!aggregation || !_aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
30
+ _window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
31
+ }
32
+ var op = _aggregationLayers.AGGREGATION_OPERATION[aggregation.toUpperCase()] || _aggregationLayers.AGGREGATION_OPERATION.SUM;
33
+ var keplerOp = DECK_AGGREGATION_MAP[op];
34
+ return function (pts) {
35
+ return (0, _utils.aggregate)(pts.map(accessor), keplerOp);
36
+ };
37
+ }
38
+ function getScaleFunctor(scaleType) {
39
+ if (!scaleType || !_constants.SCALE_FUNC[scaleType]) {
40
+ _window.console.warn("Scale ".concat(scaleType, " is not supported"));
41
+ }
42
+ return _constants.SCALE_FUNC[scaleType] || _constants.SCALE_FUNC.quantize;
43
+ }
44
+ function nop() {
45
+ return;
46
+ }
47
+ function getGetValue(step, props, dimensionUpdater) {
48
+ var key = dimensionUpdater.key;
49
+ var _step$triggers = step.triggers,
50
+ value = _step$triggers.value,
51
+ weight = _step$triggers.weight,
52
+ aggregation = _step$triggers.aggregation;
53
+ var getValue = props[value.prop];
54
+ if (getValue === null) {
55
+ // If `getValue` is not provided from props, build it with aggregation and weight.
56
+ getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
57
+ }
58
+ if (getValue) {
59
+ this._setDimensionState(key, {
60
+ getValue: getValue
61
+ });
62
+ }
63
+ }
64
+ function getDimensionSortedBins(step, props, dimensionUpdater) {
65
+ var key = dimensionUpdater.key;
66
+ var getValue = this.state.dimensions[key].getValue;
67
+ // @ts-expect-error
68
+ var sortedBins = new _aggregationLayers._BinSorter(this.state.layerData.data || [], {
69
+ getValue: getValue,
70
+ filterData: props._filterData
71
+ });
72
+ this._setDimensionState(key, {
73
+ sortedBins: sortedBins
74
+ });
75
+ }
76
+ function getDimensionValueDomain(step, props, dimensionUpdater) {
77
+ var key = dimensionUpdater.key;
78
+ var _step$triggers2 = step.triggers,
79
+ lowerPercentile = _step$triggers2.lowerPercentile,
80
+ upperPercentile = _step$triggers2.upperPercentile,
81
+ scaleType = _step$triggers2.scaleType;
82
+ if (!this.state.dimensions[key].sortedBins) {
83
+ // the previous step should set sortedBins, if not, something went wrong
84
+ return;
85
+ }
86
+
87
+ // for log and sqrt scale, returns linear domain by default
88
+ // TODO: support other scale function domain in bin sorter
89
+ var valueDomain = this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
90
+ this._setDimensionState(key, {
91
+ valueDomain: valueDomain
92
+ });
93
+ }
94
+ function getDimensionScale(step, props, dimensionUpdater) {
95
+ var key = dimensionUpdater.key;
96
+ var _step$triggers3 = step.triggers,
97
+ domain = _step$triggers3.domain,
98
+ range = _step$triggers3.range,
99
+ scaleType = _step$triggers3.scaleType,
100
+ fixed = _step$triggers3.fixed;
101
+ var onSet = step.onSet;
102
+ if (!this.state.dimensions[key].valueDomain) {
103
+ // the previous step should set valueDomain, if not, something went wrong
104
+ return;
105
+ }
106
+ var dimensionRange = props[range.prop];
107
+ var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
108
+ var dimensionFixed = Boolean(fixed && props[fixed.prop]);
109
+ var scaleFunctor = getScaleFunctor(scaleType && props[scaleType.prop])();
110
+ var scaleFunc = scaleFunctor.domain(dimensionDomain).range(dimensionFixed ? dimensionDomain : dimensionRange);
111
+ if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
112
+ props[onSet.props](scaleFunc.domain());
113
+ }
114
+ this._setDimensionState(key, {
115
+ scaleFunc: scaleFunc
116
+ });
117
+ }
118
+ function normalizeResult() {
119
+ var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
120
+ // support previous hexagonAggregator API
121
+ if (result.hexagons) {
122
+ return Object.assign({
123
+ data: result.hexagons
124
+ }, result);
125
+ } else if (result.layerData) {
126
+ return Object.assign({
127
+ data: result.layerData
128
+ }, result);
129
+ }
130
+ return result;
131
+ }
132
+ function getAggregatedData(step, props, aggregation, aggregationParams) {
133
+ var aggr = step.triggers.aggregator;
134
+ var aggregator = props[aggr.prop];
135
+
136
+ // result should contain a data array and other props
137
+ // result = {data: [], ...other props}
138
+ var result = aggregator(props, aggregationParams);
139
+ this.setState({
140
+ layerData: normalizeResult(result)
141
+ });
142
+ }
143
+ var defaultAggregation = exports.defaultAggregation = {
144
+ key: 'position',
145
+ updateSteps: [{
146
+ key: 'aggregate',
147
+ triggers: {
148
+ cellSize: {
149
+ prop: 'cellSize'
150
+ },
151
+ position: {
152
+ prop: 'getPosition',
153
+ updateTrigger: 'getPosition'
154
+ },
155
+ aggregator: {
156
+ prop: 'gridAggregator'
157
+ }
158
+ },
159
+ updater: getAggregatedData
160
+ }]
161
+ };
162
+ function getSubLayerAccessor(dimensionState, dimension) {
163
+ return function (cell) {
164
+ var sortedBins = dimensionState.sortedBins,
165
+ scaleFunc = dimensionState.scaleFunc;
166
+ var bin = sortedBins.binMap[cell.index];
167
+ if (bin && bin.counts === 0) {
168
+ // no points left in bin after filtering
169
+ return dimension.nullValue;
170
+ }
171
+ var cv = bin && bin.value;
172
+ var domain = scaleFunc.domain();
173
+ var isValueInDomain = cv >= domain[0] && cv <= domain[domain.length - 1];
174
+
175
+ // if cell value is outside domain, set alpha to 0
176
+ return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
177
+ };
178
+ }
179
+ var defaultColorDimension = exports.defaultColorDimension = {
180
+ key: 'fillColor',
181
+ accessor: 'getFillColor',
182
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
183
+ if (!cell) {
184
+ return {};
185
+ }
186
+ var sortedBins = dimensionState.sortedBins;
187
+ var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
188
+ return {
189
+ colorValue: colorValue
190
+ };
191
+ },
192
+ nullValue: [0, 0, 0, 0],
193
+ updateSteps: [{
194
+ key: 'getValue',
195
+ triggers: {
196
+ value: {
197
+ prop: 'getColorValue',
198
+ updateTrigger: 'getColorValue'
199
+ },
200
+ weight: {
201
+ prop: 'getColorWeight',
202
+ updateTrigger: 'getColorWeight'
203
+ },
204
+ aggregation: {
205
+ prop: 'colorAggregation'
206
+ }
207
+ },
208
+ updater: getGetValue
209
+ }, {
210
+ key: 'getBins',
211
+ triggers: {
212
+ _filterData: {
213
+ prop: '_filterData',
214
+ updateTrigger: '_filterData'
215
+ }
216
+ },
217
+ updater: getDimensionSortedBins
218
+ }, {
219
+ key: 'getDomain',
220
+ triggers: {
221
+ lowerPercentile: {
222
+ prop: 'lowerPercentile'
223
+ },
224
+ upperPercentile: {
225
+ prop: 'upperPercentile'
226
+ },
227
+ scaleType: {
228
+ prop: 'colorScaleType'
229
+ }
230
+ },
231
+ updater: getDimensionValueDomain
232
+ }, {
233
+ key: 'getScaleFunc',
234
+ triggers: {
235
+ domain: {
236
+ prop: 'colorDomain'
237
+ },
238
+ range: {
239
+ prop: 'colorRange'
240
+ },
241
+ scaleType: {
242
+ prop: 'colorScaleType'
243
+ }
244
+ },
245
+ onSet: {
246
+ props: 'onSetColorDomain'
247
+ },
248
+ updater: getDimensionScale
249
+ }],
250
+ getSubLayerAccessor: getSubLayerAccessor
251
+ };
252
+ var defaultElevationDimension = exports.defaultElevationDimension = {
253
+ key: 'elevation',
254
+ accessor: 'getElevation',
255
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
256
+ if (!cell) {
257
+ return {};
258
+ }
259
+ var sortedBins = dimensionState.sortedBins;
260
+ var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
261
+ return {
262
+ elevationValue: elevationValue
263
+ };
264
+ },
265
+ nullValue: -1,
266
+ updateSteps: [{
267
+ key: 'getValue',
268
+ triggers: {
269
+ value: {
270
+ prop: 'getElevationValue',
271
+ updateTrigger: 'getElevationValue'
272
+ },
273
+ weight: {
274
+ prop: 'getElevationWeight',
275
+ updateTrigger: 'getElevationWeight'
276
+ },
277
+ aggregation: {
278
+ prop: 'elevationAggregation'
279
+ }
280
+ },
281
+ updater: getGetValue
282
+ }, {
283
+ key: 'getBins',
284
+ triggers: {
285
+ _filterData: {
286
+ prop: '_filterData',
287
+ updateTrigger: '_filterData'
288
+ }
289
+ },
290
+ updater: getDimensionSortedBins
291
+ }, {
292
+ key: 'getDomain',
293
+ triggers: {
294
+ lowerPercentile: {
295
+ prop: 'elevationLowerPercentile'
296
+ },
297
+ upperPercentile: {
298
+ prop: 'elevationUpperPercentile'
299
+ },
300
+ scaleType: {
301
+ prop: 'elevationScaleType'
302
+ }
303
+ },
304
+ updater: getDimensionValueDomain
305
+ }, {
306
+ key: 'getScaleFunc',
307
+ triggers: {
308
+ fixed: {
309
+ prop: 'elevationFixed'
310
+ },
311
+ domain: {
312
+ prop: 'elevationDomain'
313
+ },
314
+ range: {
315
+ prop: 'elevationRange'
316
+ },
317
+ scaleType: {
318
+ prop: 'elevationScaleType'
319
+ }
320
+ },
321
+ onSet: {
322
+ props: 'onSetElevationDomain'
323
+ },
324
+ updater: getDimensionScale
325
+ }],
326
+ getSubLayerAccessor: getSubLayerAccessor
327
+ };
328
+ var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
329
+ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
330
+ function CPUAggregator() {
331
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
332
+ (0, _classCallCheck2["default"])(this, CPUAggregator);
333
+ (0, _defineProperty2["default"])(this, "state", void 0);
334
+ (0, _defineProperty2["default"])(this, "dimensionUpdaters", void 0);
335
+ (0, _defineProperty2["default"])(this, "aggregationUpdater", void 0);
336
+ this.state = _objectSpread({
337
+ layerData: {},
338
+ dimensions: {
339
+ // color: {
340
+ // getValue: null,
341
+ // domain: null,
342
+ // sortedBins: null,
343
+ // scaleFunc: nop
344
+ // },
345
+ // elevation: {
346
+ // getValue: null,
347
+ // domain: null,
348
+ // sortedBins: null,
349
+ // scaleFunc: nop
350
+ // }
351
+ }
352
+ }, opts.initialState);
353
+ this.dimensionUpdaters = {};
354
+ this.aggregationUpdater = opts.aggregation || defaultAggregation;
355
+ this._addDimension(opts.dimensions || _defaultDimensions);
356
+ }
357
+ return (0, _createClass2["default"])(CPUAggregator, [{
358
+ key: "updateAllDimensions",
359
+ value: function updateAllDimensions(props) {
360
+ var dimensionChanges = [];
361
+ // update all dimensions
362
+ for (var dim in this.dimensionUpdaters) {
363
+ var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
364
+ dimensionChanges = dimensionChanges.concat(updaters);
365
+ }
366
+ dimensionChanges.forEach(function (f) {
367
+ return typeof f === 'function' && f();
368
+ });
369
+ }
370
+ }, {
371
+ key: "updateAggregation",
372
+ value: function updateAggregation(props, aggregationParams) {
373
+ var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
374
+ updaters.forEach(function (f) {
375
+ return typeof f === 'function' && f(aggregationParams);
376
+ });
377
+ }
378
+ }, {
379
+ key: "updateState",
380
+ value: function updateState(opts, aggregationParams) {
381
+ var oldProps = opts.oldProps,
382
+ props = opts.props,
383
+ changeFlags = opts.changeFlags;
384
+ var dimensionChanges = [];
385
+ if (changeFlags.dataChanged) {
386
+ // if data changed update everything
387
+ this.updateAggregation(props, aggregationParams);
388
+ this.updateAllDimensions(props);
389
+ return this.state;
390
+ }
391
+ var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
392
+ if (aggregationChanges && aggregationChanges.length) {
393
+ // get aggregatedData
394
+ aggregationChanges.forEach(function (f) {
395
+ return typeof f === 'function' && f(aggregationParams);
396
+ });
397
+ this.updateAllDimensions(props);
398
+ } else {
399
+ // only update dimensions
400
+ dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
401
+ dimensionChanges.forEach(function (f) {
402
+ return typeof f === 'function' && f();
403
+ });
404
+ }
405
+ return this.state;
406
+ }
407
+
408
+ // Update private state
409
+ }, {
410
+ key: "setState",
411
+ value: function setState(updateObject) {
412
+ this.state = Object.assign({}, this.state, updateObject);
413
+ }
414
+
415
+ // Update private state.dimensions
416
+ }, {
417
+ key: "_setDimensionState",
418
+ value: function _setDimensionState(key, updateObject) {
419
+ this.setState({
420
+ dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
421
+ });
422
+ }
423
+ }, {
424
+ key: "_addAggregation",
425
+ value: function _addAggregation(aggregation) {
426
+ this.aggregationUpdater = aggregation;
427
+ }
428
+ }, {
429
+ key: "_addDimension",
430
+ value: function _addDimension() {
431
+ var _this = this;
432
+ var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
433
+ dimensions.forEach(function (dimension) {
434
+ var key = dimension.key;
435
+ _this.dimensionUpdaters[key] = dimension;
436
+ });
437
+ }
438
+ }, {
439
+ key: "_needUpdateStep",
440
+ value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
441
+ // whether need to update current dimension step
442
+ // dimension step is the value, domain, scaleFunction of each dimension
443
+ // each step is an object with properties links to layer prop and whether the prop is
444
+ // controlled by updateTriggers
445
+ return Object.values(dimensionStep.triggers).some(function (item) {
446
+ if (item.updateTrigger) {
447
+ // check based on updateTriggers change first
448
+ return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
449
+ }
450
+ // fallback to direct comparison
451
+ return oldProps[item.prop] !== props[item.prop];
452
+ });
453
+ }
454
+ }, {
455
+ key: "_accumulateUpdaters",
456
+ value: function _accumulateUpdaters(step, props, dimension) {
457
+ var updaters = [];
458
+ for (var i = step; i < dimension.updateSteps.length; i++) {
459
+ var updater = dimension.updateSteps[i].updater;
460
+ if (typeof updater === 'function') {
461
+ updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
462
+ }
463
+ }
464
+ return updaters;
465
+ }
466
+ }, {
467
+ key: "_getAllUpdaters",
468
+ value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
469
+ var _this2 = this;
470
+ var updaters = [];
471
+ var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
472
+ return _this2._needUpdateStep(step, oldProps, props, changeFlags);
473
+ });
474
+ if (needUpdateStep > -1) {
475
+ updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
476
+ }
477
+ return updaters;
478
+ }
479
+ }, {
480
+ key: "_getAggregationChanges",
481
+ value: function _getAggregationChanges(oldProps, props, changeFlags) {
482
+ var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
483
+ return updaters.length ? updaters : null;
484
+ }
485
+ }, {
486
+ key: "_getDimensionChanges",
487
+ value: function _getDimensionChanges(oldProps, props, changeFlags) {
488
+ var updaters = [];
489
+
490
+ // get dimension to be updated
491
+ for (var key in this.dimensionUpdaters) {
492
+ // return the first triggered updater for each dimension
493
+ var dimension = this.dimensionUpdaters[key];
494
+ var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
495
+ updaters = updaters.concat(dimensionUpdaters);
496
+ }
497
+ return updaters.length ? updaters : null;
498
+ }
499
+ }, {
500
+ key: "getUpdateTriggers",
501
+ value: function getUpdateTriggers(props) {
502
+ var _this3 = this;
503
+ var _updateTriggers = props.updateTriggers || {};
504
+ var updateTriggers = {};
505
+ var _loop = function _loop() {
506
+ var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
507
+ accessor = _this3$dimensionUpdat.accessor,
508
+ updateSteps = _this3$dimensionUpdat.updateSteps;
509
+ // fold dimension triggers into each accessor
510
+ updateTriggers[accessor] = {};
511
+ updateSteps.forEach(function (step) {
512
+ Object.values(step.triggers || []).forEach(function (_ref) {
513
+ var prop = _ref.prop,
514
+ updateTrigger = _ref.updateTrigger;
515
+ if (updateTrigger) {
516
+ // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
517
+ // and updateTriggers is passed in from layer prop
518
+ // fold the updateTriggers into accessor
519
+ var fromProp = _updateTriggers[updateTrigger];
520
+ if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
521
+ // if updateTrigger is an object spread it
522
+ Object.assign(updateTriggers[accessor], fromProp);
523
+ } else if (fromProp !== undefined) {
524
+ updateTriggers[accessor][prop] = fromProp;
525
+ }
526
+ } else {
527
+ // if prop is not based on updateTrigger
528
+ updateTriggers[accessor][prop] = props[prop];
529
+ }
530
+ });
531
+ });
532
+ };
533
+ for (var key in this.dimensionUpdaters) {
534
+ _loop();
535
+ }
536
+ return updateTriggers;
537
+ }
538
+ }, {
539
+ key: "getPickingInfo",
540
+ value: function getPickingInfo(_ref2, layerProps) {
541
+ var info = _ref2.info;
542
+ var isPicked = info.picked && info.index > -1;
543
+ var object = null;
544
+ var cell = isPicked ? this.state.layerData.data[info.index] : null;
545
+ if (cell) {
546
+ var binInfo = {};
547
+ for (var key in this.dimensionUpdaters) {
548
+ var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
549
+ if (typeof _getPickingInfo === 'function') {
550
+ binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
551
+ }
552
+ }
553
+ object = Object.assign(binInfo, cell, {
554
+ points: cell.filteredPoints || cell.points
555
+ });
556
+ }
557
+
558
+ // add bin and to info
559
+ return Object.assign(info, {
560
+ picked: Boolean(object),
561
+ // override object with picked cell
562
+ object: object
563
+ });
564
+ }
565
+ }, {
566
+ key: "getAccessor",
567
+ value: function getAccessor(dimensionKey, layerProps) {
568
+ if (!Object.prototype.hasOwnProperty.call(this.dimensionUpdaters, dimensionKey)) {
569
+ return nop;
570
+ }
571
+ return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
572
+ }
573
+ }], [{
574
+ key: "defaultDimensions",
575
+ value: function defaultDimensions() {
576
+ return _defaultDimensions;
577
+ }
578
+ }]);
579
+ }();
580
+ (0, _defineProperty2["default"])(CPUAggregator, "getDimensionScale", void 0);
581
+ CPUAggregator.getDimensionScale = getDimensionScale;
582
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfYWdncmVnYXRpb25MYXllcnMiLCJyZXF1aXJlIiwiX3dpbmRvdyIsIl91dGlscyIsIl9jb25zdGFudHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIkRFQ0tfQUdHUkVHQVRJT05fTUFQIiwiZXhwb3J0cyIsIkFHR1JFR0FUSU9OX09QRVJBVElPTiIsIlNVTSIsIkFHR1JFR0FUSU9OX1RZUEVTIiwic3VtIiwiTUVBTiIsImF2ZXJhZ2UiLCJNSU4iLCJtaW5pbXVtIiwiTUFYIiwibWF4aW11bSIsImdldFZhbHVlRnVuYyIsImFnZ3JlZ2F0aW9uIiwiYWNjZXNzb3IiLCJ0b1VwcGVyQ2FzZSIsIkNvbnNvbGUiLCJ3YXJuIiwiY29uY2F0Iiwib3AiLCJrZXBsZXJPcCIsInB0cyIsImFnZ3JlZ2F0ZSIsIm1hcCIsImdldFNjYWxlRnVuY3RvciIsInNjYWxlVHlwZSIsIlNDQUxFX0ZVTkMiLCJxdWFudGl6ZSIsIm5vcCIsImdldEdldFZhbHVlIiwic3RlcCIsInByb3BzIiwiZGltZW5zaW9uVXBkYXRlciIsImtleSIsIl9zdGVwJHRyaWdnZXJzIiwidHJpZ2dlcnMiLCJ2YWx1ZSIsIndlaWdodCIsImdldFZhbHVlIiwicHJvcCIsIl9zZXREaW1lbnNpb25TdGF0ZSIsImdldERpbWVuc2lvblNvcnRlZEJpbnMiLCJzdGF0ZSIsImRpbWVuc2lvbnMiLCJzb3J0ZWRCaW5zIiwiQmluU29ydGVyIiwibGF5ZXJEYXRhIiwiZGF0YSIsImZpbHRlckRhdGEiLCJfZmlsdGVyRGF0YSIsImdldERpbWVuc2lvblZhbHVlRG9tYWluIiwiX3N0ZXAkdHJpZ2dlcnMyIiwibG93ZXJQZXJjZW50aWxlIiwidXBwZXJQZXJjZW50aWxlIiwidmFsdWVEb21haW4iLCJnZXRWYWx1ZURvbWFpbkJ5U2NhbGUiLCJnZXREaW1lbnNpb25TY2FsZSIsIl9zdGVwJHRyaWdnZXJzMyIsImRvbWFpbiIsInJhbmdlIiwiZml4ZWQiLCJvblNldCIsImRpbWVuc2lvblJhbmdlIiwiZGltZW5zaW9uRG9tYWluIiwiZGltZW5zaW9uRml4ZWQiLCJCb29sZWFuIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwiX3R5cGVvZjIiLCJub3JtYWxpemVSZXN1bHQiLCJyZXN1bHQiLCJ1bmRlZmluZWQiLCJoZXhhZ29ucyIsImFzc2lnbiIsImdldEFnZ3JlZ2F0ZWREYXRhIiwiYWdncmVnYXRpb25QYXJhbXMiLCJhZ2dyIiwiYWdncmVnYXRvciIsInNldFN0YXRlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RlcHMiLCJjZWxsU2l6ZSIsInBvc2l0aW9uIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJjZWxsIiwiYmluIiwiYmluTWFwIiwiaW5kZXgiLCJjb3VudHMiLCJudWxsVmFsdWUiLCJjdiIsImlzVmFsdWVJbkRvbWFpbiIsImRlZmF1bHRDb2xvckRpbWVuc2lvbiIsImdldFBpY2tpbmdJbmZvIiwiY29sb3JWYWx1ZSIsImRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb24iLCJlbGV2YXRpb25WYWx1ZSIsImRlZmF1bHREaW1lbnNpb25zIiwiQ1BVQWdncmVnYXRvciIsIm9wdHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiaW5pdGlhbFN0YXRlIiwiZGltZW5zaW9uVXBkYXRlcnMiLCJhZ2dyZWdhdGlvblVwZGF0ZXIiLCJfYWRkRGltZW5zaW9uIiwiX2NyZWF0ZUNsYXNzMiIsInVwZGF0ZUFsbERpbWVuc2lvbnMiLCJkaW1lbnNpb25DaGFuZ2VzIiwiZGltIiwidXBkYXRlcnMiLCJfYWNjdW11bGF0ZVVwZGF0ZXJzIiwiZiIsInVwZGF0ZUFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RhdGUiLCJvbGRQcm9wcyIsImNoYW5nZUZsYWdzIiwiZGF0YUNoYW5nZWQiLCJhZ2dyZWdhdGlvbkNoYW5nZXMiLCJfZ2V0QWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldERpbWVuc2lvbkNoYW5nZXMiLCJ1cGRhdGVPYmplY3QiLCJfYWRkQWdncmVnYXRpb24iLCJfdGhpcyIsIl9uZWVkVXBkYXRlU3RlcCIsImRpbWVuc2lvblN0ZXAiLCJ2YWx1ZXMiLCJzb21lIiwiaXRlbSIsInVwZGF0ZVRyaWdnZXJzQ2hhbmdlZCIsImFsbCIsImkiLCJiaW5kIiwiX2dldEFsbFVwZGF0ZXJzIiwiX3RoaXMyIiwibmVlZFVwZGF0ZVN0ZXAiLCJmaW5kSW5kZXgiLCJnZXRVcGRhdGVUcmlnZ2VycyIsIl90aGlzMyIsIl91cGRhdGVUcmlnZ2VycyIsInVwZGF0ZVRyaWdnZXJzIiwiX2xvb3AiLCJfdGhpczMkZGltZW5zaW9uVXBkYXQiLCJfcmVmIiwiZnJvbVByb3AiLCJBcnJheSIsImlzQXJyYXkiLCJfcmVmMiIsImxheWVyUHJvcHMiLCJpbmZvIiwiaXNQaWNrZWQiLCJwaWNrZWQiLCJvYmplY3QiLCJiaW5JbmZvIiwicG9pbnRzIiwiZmlsdGVyZWRQb2ludHMiLCJnZXRBY2Nlc3NvciIsImRpbWVuc2lvbktleSIsInByb3RvdHlwZSIsImhhc093blByb3BlcnR5IiwiY2FsbCJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9sYXllci11dGlscy9jcHUtYWdncmVnYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvLyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogTUlUXG4vLyBDb3B5cmlnaHQgY29udHJpYnV0b3JzIHRvIHRoZSBrZXBsZXIuZ2wgcHJvamVjdFxuXG4vKiBlc2xpbnQtZGlzYWJsZSBndWFyZC1mb3ItaW4gKi9cbmltcG9ydCB7QUdHUkVHQVRJT05fT1BFUkFUSU9OLCBfQmluU29ydGVyIGFzIEJpblNvcnRlcn0gZnJvbSAnQGRlY2suZ2wvYWdncmVnYXRpb24tbGF5ZXJzJztcbmltcG9ydCB7Y29uc29sZSBhcyBDb25zb2xlfSBmcm9tICdnbG9iYWwvd2luZG93JztcblxuaW1wb3J0IHthZ2dyZWdhdGV9IGZyb20gJ0BrZXBsZXIuZ2wvdXRpbHMnO1xuaW1wb3J0IHtBR0dSRUdBVElPTl9UWVBFUywgU0NBTEVfRlVOQ30gZnJvbSAnQGtlcGxlci5nbC9jb25zdGFudHMnO1xuaW1wb3J0IHtSR0JBQ29sb3J9IGZyb20gJ0BrZXBsZXIuZ2wvdHlwZXMnO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVyVHlwZSA9ICh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZFVwZGF0ZXJUeXBlID0gKCkgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChcbiAgdGhpczogQ1BVQWdncmVnYXRvcixcbiAgc3RlcCxcbiAgcHJvcHMsXG4gIGFnZ3JlZ2F0aW9uLFxuICBhZ2dyZWdhdGlvblBhcmFtc1xuKSA9PiB2b2lkO1xuZXhwb3J0IHR5cGUgQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlID0gKGFnZ3JlZ2F0aW9uUGFyYW1zKSA9PiB2b2lkO1xuXG5leHBvcnQgdHlwZSBVcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgb25TZXQ/OiB7XG4gICAgcHJvcHM6IHN0cmluZztcbiAgfTtcbiAgdXBkYXRlcjogVXBkYXRlclR5cGU7XG59O1xuXG5leHBvcnQgdHlwZSBEaW1lbnNpb25UeXBlPFZhbHVlVHlwZSA9IGFueT4gPSB7XG4gIGtleTogc3RyaW5nO1xuICBhY2Nlc3Nvcjogc3RyaW5nO1xuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsLCBsYXllclByb3BzPykgPT4gYW55O1xuICBudWxsVmFsdWU6IFZhbHVlVHlwZTtcbiAgdXBkYXRlU3RlcHM6IFVwZGF0ZVN0ZXBzVHlwZVtdO1xuICBnZXRTdWJMYXllckFjY2Vzc29yO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25VcGRhdGVTdGVwc1R5cGUgPSB7XG4gIGtleTogc3RyaW5nO1xuICB0cmlnZ2Vyczoge1xuICAgIFtrZXk6IHN0cmluZ106IHtcbiAgICAgIHByb3A6IHN0cmluZztcbiAgICAgIHVwZGF0ZVRyaWdnZXI/OiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbiAgdXBkYXRlcjogQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdXBkYXRlU3RlcHM6IEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlW107XG59O1xuXG5leHBvcnQgY29uc3QgREVDS19BR0dSRUdBVElPTl9NQVAgPSB7XG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNXTogQUdHUkVHQVRJT05fVFlQRVMuc3VtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1FQU5dOiBBR0dSRUdBVElPTl9UWVBFUy5hdmVyYWdlLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1JTl06IEFHR1JFR0FUSU9OX1RZUEVTLm1pbmltdW0sXG4gIFtBR0dSRUdBVElPTl9PUEVSQVRJT04uTUFYXTogQUdHUkVHQVRJT05fVFlQRVMubWF4aW11bVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFZhbHVlRnVuYyhhZ2dyZWdhdGlvbiwgYWNjZXNzb3IpIHtcbiAgaWYgKCFhZ2dyZWdhdGlvbiB8fCAhQUdHUkVHQVRJT05fT1BFUkFUSU9OW2FnZ3JlZ2F0aW9uLnRvVXBwZXJDYXNlKCldKSB7XG4gICAgQ29uc29sZS53YXJuKGBBZ2dyZWdhdGlvbiAke2FnZ3JlZ2F0aW9ufSBpcyBub3Qgc3VwcG9ydGVkYCk7XG4gIH1cblxuICBjb25zdCBvcCA9IEFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSB8fCBBR0dSRUdBVElPTl9PUEVSQVRJT04uU1VNO1xuICBjb25zdCBrZXBsZXJPcCA9IERFQ0tfQUdHUkVHQVRJT05fTUFQW29wXTtcblxuICByZXR1cm4gcHRzID0+IGFnZ3JlZ2F0ZShwdHMubWFwKGFjY2Vzc29yKSwga2VwbGVyT3ApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2NhbGVGdW5jdG9yKHNjYWxlVHlwZSkge1xuICBpZiAoIXNjYWxlVHlwZSB8fCAhU0NBTEVfRlVOQ1tzY2FsZVR5cGVdKSB7XG4gICAgQ29uc29sZS53YXJuKGBTY2FsZSAke3NjYWxlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlVHlwZV0gfHwgU0NBTEVfRlVOQy5xdWFudGl6ZTtcbn1cblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIC8vIEB0cy1leHBlY3QtZXJyb3JcbiAgY29uc3Qgc29ydGVkQmlucyA9IG5ldyBCaW5Tb3J0ZXIodGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YSB8fCBbXSwge1xuICAgIGdldFZhbHVlLFxuICAgIGZpbHRlckRhdGE6IHByb3BzLl9maWx0ZXJEYXRhXG4gIH0pO1xuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzb3J0ZWRCaW5zfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25WYWx1ZURvbWFpbih0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtcbiAgICB0cmlnZ2Vyczoge2xvd2VyUGVyY2VudGlsZSwgdXBwZXJQZXJjZW50aWxlLCBzY2FsZVR5cGV9XG4gIH0gPSBzdGVwO1xuXG4gIGlmICghdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0uc29ydGVkQmlucykge1xuICAgIC8vIHRoZSBwcmV2aW91cyBzdGVwIHNob3VsZCBzZXQgc29ydGVkQmlucywgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIGZvciBsb2cgYW5kIHNxcnQgc2NhbGUsIHJldHVybnMgbGluZWFyIGRvbWFpbiBieSBkZWZhdWx0XG4gIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgY29uc3QgdmFsdWVEb21haW4gPSB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShcbiAgICBwcm9wc1tzY2FsZVR5cGUucHJvcF0sXG4gICAgW3Byb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSwgcHJvcHNbdXBwZXJQZXJjZW50aWxlLnByb3BdXVxuICApO1xuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3ZhbHVlRG9tYWlufSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGUsIGZpeGVkfSA9IHN0ZXAudHJpZ2dlcnM7XG4gIGNvbnN0IHtvblNldH0gPSBzdGVwO1xuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCB2YWx1ZURvbWFpbiwgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvblJhbmdlID0gcHJvcHNbcmFuZ2UucHJvcF07XG4gIGNvbnN0IGRpbWVuc2lvbkRvbWFpbiA9IHByb3BzW2RvbWFpbi5wcm9wXSB8fCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbjtcbiAgY29uc3QgZGltZW5zaW9uRml4ZWQgPSBCb29sZWFuKGZpeGVkICYmIHByb3BzW2ZpeGVkLnByb3BdKTtcblxuICBjb25zdCBzY2FsZUZ1bmN0b3IgPSBnZXRTY2FsZUZ1bmN0b3Ioc2NhbGVUeXBlICYmIHByb3BzW3NjYWxlVHlwZS5wcm9wXSkoKTtcblxuICBjb25zdCBzY2FsZUZ1bmMgPSBzY2FsZUZ1bmN0b3JcbiAgICAuZG9tYWluKGRpbWVuc2lvbkRvbWFpbilcbiAgICAucmFuZ2UoZGltZW5zaW9uRml4ZWQgPyBkaW1lbnNpb25Eb21haW4gOiBkaW1lbnNpb25SYW5nZSk7XG5cbiAgaWYgKHR5cGVvZiBvblNldCA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHByb3BzW29uU2V0LnByb3BzXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHByb3BzW29uU2V0LnByb3BzXShzY2FsZUZ1bmMuZG9tYWluKCkpO1xuICB9XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NjYWxlRnVuY30pO1xufVxuXG5mdW5jdGlvbiBub3JtYWxpemVSZXN1bHQocmVzdWx0OiB7aGV4YWdvbnM/OyBsYXllckRhdGE/fSA9IHt9KSB7XG4gIC8vIHN1cHBvcnQgcHJldmlvdXMgaGV4YWdvbkFnZ3JlZ2F0b3IgQVBJXG4gIGlmIChyZXN1bHQuaGV4YWdvbnMpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmhleGFnb25zfSwgcmVzdWx0KTtcbiAgfSBlbHNlIGlmIChyZXN1bHQubGF5ZXJEYXRhKSB7XG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe2RhdGE6IHJlc3VsdC5sYXllckRhdGF9LCByZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFnZ3JlZ2F0ZWREYXRhKFxuICB0aGlzOiBDUFVBZ2dyZWdhdG9yLFxuICBzdGVwLFxuICBwcm9wcyxcbiAgYWdncmVnYXRpb24sXG4gIGFnZ3JlZ2F0aW9uUGFyYW1zXG4pIHtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7YWdncmVnYXRvcjogYWdncn1cbiAgfSA9IHN0ZXA7XG4gIGNvbnN0IGFnZ3JlZ2F0b3IgPSBwcm9wc1thZ2dyLnByb3BdO1xuXG4gIC8vIHJlc3VsdCBzaG91bGQgY29udGFpbiBhIGRhdGEgYXJyYXkgYW5kIG90aGVyIHByb3BzXG4gIC8vIHJlc3VsdCA9IHtkYXRhOiBbXSwgLi4ub3RoZXIgcHJvcHN9XG4gIGNvbnN0IHJlc3VsdCA9IGFnZ3JlZ2F0b3IocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgdGhpcy5zZXRTdGF0ZSh7XG4gICAgbGF5ZXJEYXRhOiBub3JtYWxpemVSZXN1bHQocmVzdWx0KVxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRBZ2dyZWdhdGlvbjogQWdncmVnYXRpb25UeXBlID0ge1xuICBrZXk6ICdwb3NpdGlvbicsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnYWdncmVnYXRlJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGNlbGxTaXplOiB7XG4gICAgICAgICAgcHJvcDogJ2NlbGxTaXplJ1xuICAgICAgICB9LFxuICAgICAgICBwb3NpdGlvbjoge1xuICAgICAgICAgIHByb3A6ICdnZXRQb3NpdGlvbicsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldFBvc2l0aW9uJ1xuICAgICAgICB9LFxuICAgICAgICBhZ2dyZWdhdG9yOiB7XG4gICAgICAgICAgcHJvcDogJ2dyaWRBZ2dyZWdhdG9yJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0QWdncmVnYXRlZERhdGFcbiAgICB9XG4gIF1cbn07XG5cbmZ1bmN0aW9uIGdldFN1YkxheWVyQWNjZXNzb3IoZGltZW5zaW9uU3RhdGUsIGRpbWVuc2lvbikge1xuICByZXR1cm4gY2VsbCA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGNvbG9yVmFsdWUgPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XSAmJiBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XS52YWx1ZTtcbiAgICByZXR1cm4ge2NvbG9yVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IFswLCAwLCAwLCAwXSxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZXRWYWx1ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvclZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JWYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yV2VpZ2h0JyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JXZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2NvbG9yQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdsb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICd1cHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uVmFsdWVEb21haW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldFNjYWxlRnVuYycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBkb21haW46IHtwcm9wOiAnY29sb3JEb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnY29sb3JSYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIG9uU2V0OiB7XG4gICAgICAgIHByb3BzOiAnb25TZXRDb2xvckRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb246IERpbWVuc2lvblR5cGU8bnVtYmVyPiA9IHtcbiAga2V5OiAnZWxldmF0aW9uJyxcbiAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZml4ZWQ6IHtwcm9wOiAnZWxldmF0aW9uRml4ZWQnfSxcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge1xuICBsYXllckRhdGE6IHtkYXRhP307XG4gIGRpbWVuc2lvbnM6IG9iamVjdDtcbiAgZ2VvSlNPTj87XG4gIGNsdXN0ZXJCdWlsZGVyPztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENQVUFnZ3JlZ2F0b3Ige1xuICBzdGF0aWMgZ2V0RGltZW5zaW9uU2NhbGU6IGFueTtcbiAgc3RhdGU6IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgZGltZW5zaW9uVXBkYXRlcnM6IHtba2V5OiBzdHJpbmddOiBEaW1lbnNpb25UeXBlfTtcbiAgYWdncmVnYXRpb25VcGRhdGVyOiBBZ2dyZWdhdGlvblR5cGU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgb3B0czoge1xuICAgICAgaW5pdGlhbFN0YXRlPzogQ1BVQWdncmVnYXRvclN0YXRlO1xuICAgICAgZGltZW5zaW9ucz86IERpbWVuc2lvblR5cGVbXTtcbiAgICAgIGFnZ3JlZ2F0aW9uPzogQWdncmVnYXRpb25UeXBlO1xuICAgIH0gPSB7fVxuICApIHtcbiAgICB0aGlzLnN0YXRlID0ge1xuICAgICAgbGF5ZXJEYXRhOiB7fSxcbiAgICAgIGRpbWVuc2lvbnM6IHtcbiAgICAgICAgLy8gY29sb3I6IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9LFxuICAgICAgICAvLyBlbGV2YXRpb246IHtcbiAgICAgICAgLy8gICBnZXRWYWx1ZTogbnVsbCxcbiAgICAgICAgLy8gICBkb21haW46IG51bGwsXG4gICAgICAgIC8vICAgc29ydGVkQmluczogbnVsbCxcbiAgICAgICAgLy8gICBzY2FsZUZ1bmM6IG5vcFxuICAgICAgICAvLyB9XG4gICAgICB9LFxuICAgICAgLi4ub3B0cy5pbml0aWFsU3RhdGVcbiAgICB9O1xuXG4gICAgdGhpcy5kaW1lbnNpb25VcGRhdGVycyA9IHt9O1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gb3B0cy5hZ2dyZWdhdGlvbiB8fCBkZWZhdWx0QWdncmVnYXRpb247XG5cbiAgICB0aGlzLl9hZGREaW1lbnNpb24ob3B0cy5kaW1lbnNpb25zIHx8IGRlZmF1bHREaW1lbnNpb25zKTtcbiAgfVxuXG4gIHN0YXRpYyBkZWZhdWx0RGltZW5zaW9ucygpIHtcbiAgICByZXR1cm4gZGVmYXVsdERpbWVuc2lvbnM7XG4gIH1cblxuICB1cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKSB7XG4gICAgbGV0IGRpbWVuc2lvbkNoYW5nZXM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICAvLyB1cGRhdGUgYWxsIGRpbWVuc2lvbnNcbiAgICBmb3IgKGNvbnN0IGRpbSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1dKTtcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMgPSBkaW1lbnNpb25DaGFuZ2VzLmNvbmNhdCh1cGRhdGVycyk7XG4gICAgfVxuXG4gICAgZGltZW5zaW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZigpKTtcbiAgfVxuXG4gIHVwZGF0ZUFnZ3JlZ2F0aW9uKHByb3BzLCBhZ2dyZWdhdGlvblBhcmFtcykge1xuICAgIGNvbnN0IHVwZGF0ZXJzID0gdGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKDAsIHByb3BzLCB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlcik7XG4gICAgdXBkYXRlcnMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoYWdncmVnYXRpb25QYXJhbXMpKTtcbiAgfVxuXG4gIHVwZGF0ZVN0YXRlKG9wdHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKSB7XG4gICAgY29uc3Qge29sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3N9ID0gb3B0cztcbiAgICBsZXQgZGltZW5zaW9uQ2hhbmdlczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuXG4gICAgaWYgKGNoYW5nZUZsYWdzLmRhdGFDaGFuZ2VkKSB7XG4gICAgICAvLyBpZiBkYXRhIGNoYW5nZWQgdXBkYXRlIGV2ZXJ5dGhpbmdcbiAgICAgIHRoaXMudXBkYXRlQWdncmVnYXRpb24ocHJvcHMsIGFnZ3JlZ2F0aW9uUGFyYW1zKTtcbiAgICAgIHRoaXMudXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcyk7XG5cbiAgICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICAgIH1cblxuICAgIGNvbnN0IGFnZ3JlZ2F0aW9uQ2hhbmdlcyA9IHRoaXMuX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKTtcblxuICAgIGlmIChhZ2dyZWdhdGlvbkNoYW5nZXMgJiYgYWdncmVnYXRpb25DaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgLy8gZ2V0IGFnZ3JlZ2F0ZWREYXRhXG4gICAgICBhZ2dyZWdhdGlvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoYWdncmVnYXRpb25QYXJhbXMpKTtcbiAgICAgIHRoaXMudXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG9ubHkgdXBkYXRlIGRpbWVuc2lvbnNcbiAgICAgIGRpbWVuc2lvbkNoYW5nZXMgPSB0aGlzLl9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHx8IFtdO1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZigpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlXG4gIHNldFN0YXRlKHVwZGF0ZU9iamVjdCkge1xuICAgIHRoaXMuc3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLnN0YXRlLCB1cGRhdGVPYmplY3QpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGUuZGltZW5zaW9uc1xuICBfc2V0RGltZW5zaW9uU3RhdGUoa2V5LCB1cGRhdGVPYmplY3QpIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpbWVuc2lvbnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9ucywge1xuICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIHVwZGF0ZU9iamVjdClcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBfYWRkQWdncmVnYXRpb24oYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gYWdncmVnYXRpb247XG4gIH1cblxuICBfYWRkRGltZW5zaW9uKGRpbWVuc2lvbnM6IERpbWVuc2lvblR5cGVbXSA9IFtdKSB7XG4gICAgZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG4gICAgICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvbjtcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XSA9IGRpbWVuc2lvbjtcbiAgICB9KTtcbiAgfVxuXG4gIF9uZWVkVXBkYXRlU3RlcChcbiAgICBkaW1lbnNpb25TdGVwOiBVcGRhdGVTdGVwc1R5cGUgfCBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICAvLyB3aGV0aGVyIG5lZWQgdG8gdXBkYXRlIGN1cnJlbnQgZGltZW5zaW9uIHN0ZXBcbiAgICAvLyBkaW1lbnNpb24gc3RlcCBpcyB0aGUgdmFsdWUsIGRvbWFpbiwgc2NhbGVGdW5jdGlvbiBvZiBlYWNoIGRpbWVuc2lvblxuICAgIC8vIGVhY2ggc3RlcCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGxpbmtzIHRvIGxheWVyIHByb3AgYW5kIHdoZXRoZXIgdGhlIHByb3AgaXNcbiAgICAvLyBjb250cm9sbGVkIGJ5IHVwZGF0ZVRyaWdnZXJzXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGltZW5zaW9uU3RlcC50cmlnZ2Vycykuc29tZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnVwZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgYmFzZWQgb24gdXBkYXRlVHJpZ2dlcnMgY2hhbmdlIGZpcnN0XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkICYmXG4gICAgICAgICAgKGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZC5hbGwgfHxcbiAgICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZFtpdGVtLnVwZGF0ZVRyaWdnZXJdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZmFsbGJhY2sgdG8gZGlyZWN0IGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBvbGRQcm9wc1tpdGVtLnByb3BdICE9PSBwcm9wc1tpdGVtLnByb3BdO1xuICAgIH0pO1xuICB9XG5cbiAgX2FjY3VtdWxhdGVVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIHN0ZXAsXG4gICAgcHJvcHMsXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZVxuICApIHtcbiAgICB0eXBlIExvY2FsVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RlcDsgaSA8IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyO1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgdXBkYXRlci5iaW5kKHRoaXMsIGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXSwgcHJvcHMsIGRpbWVuc2lvbikgYXMgTG9jYWxVcGRhdGVyVHlwZVxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBbGxVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIGRpbWVuc2lvbjogVXBkYXRlck9iamVjdFR5cGUsXG4gICAgb2xkUHJvcHMsXG4gICAgcHJvcHMsXG4gICAgY2hhbmdlRmxhZ3NcbiAgKSB7XG4gICAgdHlwZSBMb2NhbFVwZGF0ZXJUeXBlID0gVXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlXG4gICAgICA/IEJpbmRlZFVwZGF0ZXJUeXBlXG4gICAgICA6IEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbiAgICBsZXQgdXBkYXRlcnM6IExvY2FsVXBkYXRlclR5cGVbXSA9IFtdO1xuICAgIGNvbnN0IG5lZWRVcGRhdGVTdGVwID0gZGltZW5zaW9uLnVwZGF0ZVN0ZXBzLmZpbmRJbmRleChzdGVwID0+XG4gICAgICB0aGlzLl9uZWVkVXBkYXRlU3RlcChzdGVwLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKVxuICAgICk7XG5cbiAgICBpZiAobmVlZFVwZGF0ZVN0ZXAgPiAtMSkge1xuICAgICAgdXBkYXRlcnMgPSB1cGRhdGVycy5jb25jYXQodGhpcy5fYWNjdW11bGF0ZVVwZGF0ZXJzKG5lZWRVcGRhdGVTdGVwLCBwcm9wcywgZGltZW5zaW9uKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzO1xuICB9XG5cbiAgX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyhvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpIHtcbiAgICBsZXQgdXBkYXRlcnM6IEJpbmRlZFVwZGF0ZXJUeXBlW10gPSBbXTtcblxuICAgIC8vIGdldCBkaW1lbnNpb24gdG8gYmUgdXBkYXRlZFxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIC8vIHJldHVybiB0aGUgZmlyc3QgdHJpZ2dlcmVkIHVwZGF0ZXIgZm9yIGVhY2ggZGltZW5zaW9uXG4gICAgICBjb25zdCBkaW1lbnNpb24gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICBjb25zdCBkaW1lbnNpb25VcGRhdGVycyA9IHRoaXMuX2dldEFsbFVwZGF0ZXJzKGRpbWVuc2lvbiwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgICB1cGRhdGVycyA9IHVwZGF0ZXJzLmNvbmNhdChkaW1lbnNpb25VcGRhdGVycyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIGdldFVwZGF0ZVRyaWdnZXJzKHByb3BzKSB7XG4gICAgY29uc3QgX3VwZGF0ZVRyaWdnZXJzID0gcHJvcHMudXBkYXRlVHJpZ2dlcnMgfHwge307XG4gICAgY29uc3QgdXBkYXRlVHJpZ2dlcnMgPSB7fTtcblxuICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMpIHtcbiAgICAgIGNvbnN0IHthY2Nlc3NvciwgdXBkYXRlU3RlcHN9OiB7YWNjZXNzb3I7IHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXX0gPVxuICAgICAgICB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAvLyBmb2xkIGRpbWVuc2lvbiB0cmlnZ2VycyBpbnRvIGVhY2ggYWNjZXNzb3JcbiAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSA9IHt9O1xuXG4gICAgICB1cGRhdGVTdGVwcy5mb3JFYWNoKHN0ZXAgPT4ge1xuICAgICAgICBPYmplY3QudmFsdWVzKHN0ZXAudHJpZ2dlcnMgfHwgW10pLmZvckVhY2goKHtwcm9wLCB1cGRhdGVUcmlnZ2VyfSkgPT4ge1xuICAgICAgICAgIGlmICh1cGRhdGVUcmlnZ2VyKSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIGJhc2VkIG9uIHVwZGF0ZVRyaWdnZXIgZS5nLiBnZXRDb2xvclZhbHVlLCBnZXRDb2xvcldlaWdodFxuICAgICAgICAgICAgLy8gYW5kIHVwZGF0ZVRyaWdnZXJzIGlzIHBhc3NlZCBpbiBmcm9tIGxheWVyIHByb3BcbiAgICAgICAgICAgIC8vIGZvbGQgdGhlIHVwZGF0ZVRyaWdnZXJzIGludG8gYWNjZXNzb3JcbiAgICAgICAgICAgIGNvbnN0IGZyb21Qcm9wID0gX3VwZGF0ZVRyaWdnZXJzW3VwZGF0ZVRyaWdnZXJdO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBmcm9tUHJvcCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoZnJvbVByb3ApKSB7XG4gICAgICAgICAgICAgIC8vIGlmIHVwZGF0ZVRyaWdnZXIgaXMgYW4gb2JqZWN0IHNwcmVhZCBpdFxuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXSwgZnJvbVByb3ApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChmcm9tUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHVwZGF0ZVRyaWdnZXJzW2FjY2Vzc29yXVtwcm9wXSA9IGZyb21Qcm9wO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBpZiBwcm9wIGlzIG5vdCBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyXG4gICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBwcm9wc1twcm9wXTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHVwZGF0ZVRyaWdnZXJzO1xuICB9XG5cbiAgZ2V0UGlja2luZ0luZm8oe2luZm99LCBsYXllclByb3BzKSB7XG4gICAgY29uc3QgaXNQaWNrZWQgPSBpbmZvLnBpY2tlZCAmJiBpbmZvLmluZGV4ID4gLTE7XG4gICAgbGV0IG9iamVjdCA9IG51bGw7XG4gICAgY29uc3QgY2VsbCA9IGlzUGlja2VkID8gdGhpcy5zdGF0ZS5sYXllckRhdGEuZGF0YVtpbmZvLmluZGV4XSA6IG51bGw7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGxldCBiaW5JbmZvID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHtnZXRQaWNraW5nSW5mb30gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0UGlja2luZ0luZm8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBiaW5JbmZvID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgYmluSW5mbyxcbiAgICAgICAgICAgIGdldFBpY2tpbmdJbmZvKHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCBjZWxsLCBsYXllclByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gT2JqZWN0LmFzc2lnbihiaW5JbmZvLCBjZWxsLCB7XG4gICAgICAgIHBvaW50czogY2VsbC5maWx0ZXJlZFBvaW50cyB8fCBjZWxsLnBvaW50c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJpbiAgYW5kICB0byBpbmZvXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5mbywge1xuICAgICAgcGlja2VkOiBCb29sZWFuKG9iamVjdCksXG4gICAgICAvLyBvdmVycmlkZSBvYmplY3Qgd2l0aCBwaWNrZWQgY2VsbFxuICAgICAgb2JqZWN0XG4gICAgfSk7XG4gIH1cblxuICBnZXRBY2Nlc3NvcihkaW1lbnNpb25LZXksIGxheWVyUHJvcHMpIHtcbiAgICBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0aGlzLmRpbWVuc2lvblVwZGF0ZXJzLCBkaW1lbnNpb25LZXkpKSB7XG4gICAgICByZXR1cm4gbm9wO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLmdldFN1YkxheWVyQWNjZXNzb3IoXG4gICAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltZW5zaW9uS2V5XSxcbiAgICAgIGxheWVyUHJvcHNcbiAgICApO1xuICB9XG59XG5cbkNQVUFnZ3JlZ2F0b3IuZ2V0RGltZW5zaW9uU2NhbGUgPSBnZXREaW1lbnNpb25TY2FsZTtcbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBSUEsSUFBQUEsa0JBQUEsR0FBQUMsT0FBQTtBQUNBLElBQUFDLE9BQUEsR0FBQUQsT0FBQTtBQUVBLElBQUFFLE1BQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLFVBQUEsR0FBQUgsT0FBQTtBQUFtRSxTQUFBSSxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFB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