@kepler.gl/deckgl-layers 3.3.0-alpha.4 → 3.3.0-alpha.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (190) hide show
  1. package/dist/cjs/3d-building-layer/3d-building-layer.js +66 -0
  2. package/dist/cjs/3d-building-layer/3d-building-utils.js +166 -0
  3. package/dist/cjs/3d-building-layer/types.js +6 -0
  4. package/dist/cjs/cluster-layer/cluster-layer.js +292 -0
  5. package/dist/cjs/column-layer/enhanced-column-layer.js +160 -0
  6. package/dist/{deckgl-extensions → cjs/deckgl-extensions}/filter-arrow-layer.js +1 -1
  7. package/dist/cjs/deckgl-extensions/filter-shader-module.js +26 -0
  8. package/dist/cjs/globe/atmosphere-layer.js +220 -0
  9. package/dist/cjs/globe/enhanced-multi-icon-layer.js +63 -0
  10. package/dist/cjs/globe/globe-depth-disk-layer.js +145 -0
  11. package/dist/cjs/globe/globe-layers.js +569 -0
  12. package/dist/cjs/globe/globe-stars-layer.js +69 -0
  13. package/dist/cjs/globe/globe-view.js +407 -0
  14. package/dist/{globe → cjs/globe}/index.js +1 -1
  15. package/dist/cjs/globe/mvt-label-layer.js +190 -0
  16. package/dist/cjs/grid-layer/enhanced-cpu-grid-layer.js +116 -0
  17. package/dist/cjs/hexagon-layer/enhanced-hexagon-layer.js +134 -0
  18. package/dist/{index.js → cjs/index.js} +1 -1
  19. package/dist/cjs/layer-utils/aggregation-utils.js +181 -0
  20. package/dist/cjs/layer-utils/cluster-utils.js +93 -0
  21. package/dist/cjs/layer-utils/cpu-aggregator.js +798 -0
  22. package/dist/cjs/layer-utils/globe-cell-utils.js +173 -0
  23. package/dist/cjs/layer-utils/shader-utils.js +38 -0
  24. package/dist/cjs/line-layer/line-layer.js +95 -0
  25. package/dist/cjs/raster/images.js +271 -0
  26. package/dist/cjs/raster/pipeline-validation-patch.js +101 -0
  27. package/dist/cjs/raster/raster-layer/raster-layer-shaders.js +163 -0
  28. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.fs.js +10 -0
  29. package/dist/cjs/raster/raster-layer/raster-layer-webgl1.vs.js +10 -0
  30. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.fs.js +10 -0
  31. package/dist/cjs/raster/raster-layer/raster-layer-webgl2.vs.js +10 -0
  32. package/dist/cjs/raster/raster-layer/raster-layer.js +287 -0
  33. package/dist/cjs/raster/raster-mesh-layer/matrix.js +18 -0
  34. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +38 -0
  35. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +10 -0
  36. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +10 -0
  37. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +10 -0
  38. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +10 -0
  39. package/dist/cjs/raster/raster-mesh-layer/raster-mesh-layer.js +321 -0
  40. package/dist/cjs/raster/raster-processing-uniforms.js +124 -0
  41. package/dist/cjs/raster/types.js +6 -0
  42. package/dist/cjs/raster/util.js +139 -0
  43. package/dist/cjs/raster/webgl/color/colormap.js +45 -0
  44. package/dist/cjs/raster/webgl/color/filter.js +58 -0
  45. package/dist/cjs/raster/webgl/color/gamma-contrast.js +68 -0
  46. package/dist/cjs/raster/webgl/color/linear-rescale.js +35 -0
  47. package/dist/cjs/raster/webgl/color/saturation.js +42 -0
  48. package/dist/cjs/raster/webgl/color/sigmoidal-contrast.js +68 -0
  49. package/dist/{raster → cjs/raster}/webgl/index.js +1 -1
  50. package/dist/cjs/raster/webgl/pansharpen/pansharpen-brovey.js +46 -0
  51. package/dist/cjs/raster/webgl/spectral-indices/evi.js +26 -0
  52. package/dist/cjs/raster/webgl/spectral-indices/msavi.js +25 -0
  53. package/dist/cjs/raster/webgl/spectral-indices/normalized-difference.js +19 -0
  54. package/dist/cjs/raster/webgl/spectral-indices/savi.js +21 -0
  55. package/dist/cjs/raster/webgl/texture/combine-bands.js +65 -0
  56. package/dist/cjs/raster/webgl/texture/mask.js +50 -0
  57. package/dist/cjs/raster/webgl/texture/reorder-bands.js +72 -0
  58. package/dist/cjs/raster/webgl/texture/rgba-image.js +34 -0
  59. package/dist/cjs/raster/webgl/types.js +6 -0
  60. package/dist/cjs/svg-icon-layer/scatterplot-icon-layer.js +88 -0
  61. package/dist/cjs/svg-icon-layer/svg-icon-layer.js +104 -0
  62. package/dist/cjs/wms/wms-layer.js +624 -0
  63. package/dist/esm/3d-building-layer/3d-building-layer.js +62 -0
  64. package/dist/esm/3d-building-layer/3d-building-utils.js +157 -0
  65. package/dist/esm/3d-building-layer/types.js +3 -0
  66. package/dist/esm/cluster-layer/cluster-layer.js +286 -0
  67. package/dist/esm/column-layer/enhanced-column-layer.js +156 -0
  68. package/dist/esm/deckgl-extensions/filter-arrow-layer.js +64 -0
  69. package/dist/esm/deckgl-extensions/filter-shader-module.js +20 -0
  70. package/dist/esm/globe/atmosphere-layer.js +214 -0
  71. package/dist/esm/globe/enhanced-multi-icon-layer.js +60 -0
  72. package/dist/esm/globe/globe-depth-disk-layer.js +140 -0
  73. package/dist/esm/globe/globe-layers.js +561 -0
  74. package/dist/esm/globe/globe-stars-layer.js +63 -0
  75. package/dist/esm/globe/globe-view.js +401 -0
  76. package/dist/esm/globe/index.js +26 -0
  77. package/dist/esm/globe/mvt-label-layer.js +187 -0
  78. package/dist/esm/grid-layer/enhanced-cpu-grid-layer.js +112 -0
  79. package/dist/esm/hexagon-layer/enhanced-hexagon-layer.js +130 -0
  80. package/dist/esm/index.js +22 -0
  81. package/dist/esm/layer-utils/aggregation-utils.js +172 -0
  82. package/dist/esm/layer-utils/cluster-utils.js +86 -0
  83. package/dist/esm/layer-utils/cpu-aggregator.js +788 -0
  84. package/dist/esm/layer-utils/globe-cell-utils.js +167 -0
  85. package/dist/esm/layer-utils/shader-utils.js +32 -0
  86. package/dist/esm/line-layer/line-layer.js +91 -0
  87. package/dist/esm/raster/images.js +267 -0
  88. package/dist/esm/raster/pipeline-validation-patch.js +94 -0
  89. package/dist/esm/raster/raster-layer/raster-layer-shaders.js +153 -0
  90. package/dist/esm/raster/raster-layer/raster-layer-webgl1.fs.js +5 -0
  91. package/dist/esm/raster/raster-layer/raster-layer-webgl1.vs.js +5 -0
  92. package/dist/esm/raster/raster-layer/raster-layer-webgl2.fs.js +5 -0
  93. package/dist/esm/raster/raster-layer/raster-layer-webgl2.vs.js +5 -0
  94. package/dist/esm/raster/raster-layer/raster-layer.js +283 -0
  95. package/dist/esm/raster/raster-mesh-layer/matrix.js +12 -0
  96. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +30 -0
  97. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +5 -0
  98. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +5 -0
  99. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +5 -0
  100. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +5 -0
  101. package/dist/esm/raster/raster-mesh-layer/raster-mesh-layer.js +318 -0
  102. package/dist/esm/raster/raster-processing-uniforms.js +118 -0
  103. package/dist/esm/raster/types.js +3 -0
  104. package/dist/esm/raster/util.js +134 -0
  105. package/dist/esm/raster/webgl/color/colormap.js +39 -0
  106. package/dist/esm/raster/webgl/color/filter.js +52 -0
  107. package/dist/esm/raster/webgl/color/gamma-contrast.js +62 -0
  108. package/dist/esm/raster/webgl/color/linear-rescale.js +29 -0
  109. package/dist/esm/raster/webgl/color/saturation.js +36 -0
  110. package/dist/esm/raster/webgl/color/sigmoidal-contrast.js +62 -0
  111. package/dist/esm/raster/webgl/index.js +26 -0
  112. package/dist/esm/raster/webgl/pansharpen/pansharpen-brovey.js +40 -0
  113. package/dist/esm/raster/webgl/spectral-indices/evi.js +20 -0
  114. package/dist/esm/raster/webgl/spectral-indices/msavi.js +19 -0
  115. package/dist/esm/raster/webgl/spectral-indices/normalized-difference.js +13 -0
  116. package/dist/esm/raster/webgl/spectral-indices/savi.js +15 -0
  117. package/dist/esm/raster/webgl/texture/combine-bands.js +58 -0
  118. package/dist/esm/raster/webgl/texture/mask.js +44 -0
  119. package/dist/esm/raster/webgl/texture/reorder-bands.js +65 -0
  120. package/dist/esm/raster/webgl/texture/rgba-image.js +28 -0
  121. package/dist/esm/raster/webgl/types.js +3 -0
  122. package/dist/esm/svg-icon-layer/scatterplot-icon-layer.js +84 -0
  123. package/dist/esm/svg-icon-layer/svg-icon-layer.js +101 -0
  124. package/dist/esm/wms/wms-layer.js +619 -0
  125. package/dist/globe/atmosphere-layer.d.ts +13 -2
  126. package/dist/globe/globe-depth-disk-layer.d.ts +1 -0
  127. package/dist/globe/globe-layers.d.ts +8 -2
  128. package/dist/raster/images.d.ts +10 -1
  129. package/dist/raster/raster-layer/raster-layer.d.ts +4 -0
  130. package/dist/raster/raster-mesh-layer/raster-mesh-layer.d.ts +4 -0
  131. package/dist/wms/wms-layer.d.ts +8 -0
  132. package/package.json +18 -11
  133. package/dist/3d-building-layer/3d-building-layer.js +0 -66
  134. package/dist/3d-building-layer/3d-building-utils.js +0 -166
  135. package/dist/3d-building-layer/types.js +0 -6
  136. package/dist/cluster-layer/cluster-layer.js +0 -292
  137. package/dist/column-layer/enhanced-column-layer.js +0 -160
  138. package/dist/deckgl-extensions/filter-shader-module.js +0 -26
  139. package/dist/globe/atmosphere-layer.js +0 -184
  140. package/dist/globe/enhanced-multi-icon-layer.js +0 -63
  141. package/dist/globe/globe-depth-disk-layer.js +0 -145
  142. package/dist/globe/globe-layers.js +0 -565
  143. package/dist/globe/globe-stars-layer.js +0 -69
  144. package/dist/globe/globe-view.js +0 -316
  145. package/dist/globe/mvt-label-layer.js +0 -190
  146. package/dist/grid-layer/enhanced-cpu-grid-layer.js +0 -116
  147. package/dist/hexagon-layer/enhanced-hexagon-layer.js +0 -134
  148. package/dist/layer-utils/aggregation-utils.js +0 -181
  149. package/dist/layer-utils/cluster-utils.js +0 -93
  150. package/dist/layer-utils/cpu-aggregator.js +0 -798
  151. package/dist/layer-utils/globe-cell-utils.js +0 -173
  152. package/dist/layer-utils/shader-utils.js +0 -38
  153. package/dist/line-layer/line-layer.js +0 -95
  154. package/dist/raster/images.js +0 -259
  155. package/dist/raster/pipeline-validation-patch.js +0 -101
  156. package/dist/raster/raster-layer/raster-layer-shaders.js +0 -163
  157. package/dist/raster/raster-layer/raster-layer-webgl1.fs.js +0 -10
  158. package/dist/raster/raster-layer/raster-layer-webgl1.vs.js +0 -10
  159. package/dist/raster/raster-layer/raster-layer-webgl2.fs.js +0 -10
  160. package/dist/raster/raster-layer/raster-layer-webgl2.vs.js +0 -10
  161. package/dist/raster/raster-layer/raster-layer.js +0 -237
  162. package/dist/raster/raster-mesh-layer/matrix.js +0 -18
  163. package/dist/raster/raster-mesh-layer/raster-mesh-layer-shaders.js +0 -38
  164. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.fs.js +0 -10
  165. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl1.vs.js +0 -10
  166. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.fs.js +0 -10
  167. package/dist/raster/raster-mesh-layer/raster-mesh-layer-webgl2.vs.js +0 -10
  168. package/dist/raster/raster-mesh-layer/raster-mesh-layer.js +0 -271
  169. package/dist/raster/raster-processing-uniforms.js +0 -124
  170. package/dist/raster/types.js +0 -6
  171. package/dist/raster/util.js +0 -139
  172. package/dist/raster/webgl/color/colormap.js +0 -45
  173. package/dist/raster/webgl/color/filter.js +0 -58
  174. package/dist/raster/webgl/color/gamma-contrast.js +0 -68
  175. package/dist/raster/webgl/color/linear-rescale.js +0 -35
  176. package/dist/raster/webgl/color/saturation.js +0 -42
  177. package/dist/raster/webgl/color/sigmoidal-contrast.js +0 -68
  178. package/dist/raster/webgl/pansharpen/pansharpen-brovey.js +0 -46
  179. package/dist/raster/webgl/spectral-indices/evi.js +0 -26
  180. package/dist/raster/webgl/spectral-indices/msavi.js +0 -25
  181. package/dist/raster/webgl/spectral-indices/normalized-difference.js +0 -19
  182. package/dist/raster/webgl/spectral-indices/savi.js +0 -21
  183. package/dist/raster/webgl/texture/combine-bands.js +0 -65
  184. package/dist/raster/webgl/texture/mask.js +0 -50
  185. package/dist/raster/webgl/texture/reorder-bands.js +0 -72
  186. package/dist/raster/webgl/texture/rgba-image.js +0 -34
  187. package/dist/raster/webgl/types.js +0 -6
  188. package/dist/svg-icon-layer/scatterplot-icon-layer.js +0 -88
  189. package/dist/svg-icon-layer/svg-icon-layer.js +0 -104
  190. package/dist/wms/wms-layer.js +0 -594
@@ -0,0 +1,798 @@
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 _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
16
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
17
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
18
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
20
+ var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
21
+ var _window = require("global/window");
22
+ var _utils = require("@kepler.gl/utils");
23
+ var _constants = require("@kepler.gl/constants");
24
+ 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; }
25
+ 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; }
26
+ 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; } } }; }
27
+ 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; } }
28
+ 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; } // SPDX-License-Identifier: MIT
29
+ // Copyright contributors to the kepler.gl project
30
+ /* eslint-disable guard-for-in */
31
+ var AGGREGATION_OPERATION = {
32
+ SUM: 'SUM',
33
+ MEAN: 'MEAN',
34
+ MIN: 'MIN',
35
+ MAX: 'MAX',
36
+ COUNT: 'COUNT'
37
+ };
38
+ var MAX_32_BIT_FLOAT = 3.402823466e38;
39
+ var defaultGetValue = function defaultGetValue(points) {
40
+ return points.length;
41
+ };
42
+ var defaultGetPoints = function defaultGetPoints(bin) {
43
+ return bin.points;
44
+ };
45
+ var defaultGetIndex = function defaultGetIndex(bin) {
46
+ return bin.index;
47
+ };
48
+ var ascending = function ascending(a, b) {
49
+ return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
50
+ };
51
+ function clamp(value, min, max) {
52
+ return Math.max(min, Math.min(max, value));
53
+ }
54
+ function getQuantileDomain(data, valueAccessor) {
55
+ return data.map(valueAccessor).sort(ascending);
56
+ }
57
+ function getOrdinalDomain(data, valueAccessor) {
58
+ return (0, _toConsumableArray2["default"])(new Set(data.map(valueAccessor)));
59
+ }
60
+ var BinSorter = /*#__PURE__*/function () {
61
+ function BinSorter() {
62
+ var bins = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
63
+ var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
64
+ (0, _classCallCheck2["default"])(this, BinSorter);
65
+ (0, _defineProperty2["default"])(this, "maxCount", void 0);
66
+ (0, _defineProperty2["default"])(this, "maxValue", void 0);
67
+ (0, _defineProperty2["default"])(this, "minValue", void 0);
68
+ (0, _defineProperty2["default"])(this, "totalCount", void 0);
69
+ (0, _defineProperty2["default"])(this, "aggregatedBins", void 0);
70
+ (0, _defineProperty2["default"])(this, "sortedBins", void 0);
71
+ (0, _defineProperty2["default"])(this, "binMap", void 0);
72
+ this.aggregatedBins = this._getAggregatedBins(bins, props);
73
+ this._updateMinMaxValues();
74
+ this.binMap = this._getBinMap();
75
+ }
76
+ return (0, _createClass2["default"])(BinSorter, [{
77
+ key: "_getAggregatedBins",
78
+ value: function _getAggregatedBins(bins, props) {
79
+ var _props$getValue = props.getValue,
80
+ getValue = _props$getValue === void 0 ? defaultGetValue : _props$getValue,
81
+ _props$getPoints = props.getPoints,
82
+ getPoints = _props$getPoints === void 0 ? defaultGetPoints : _props$getPoints,
83
+ _props$getIndex = props.getIndex,
84
+ getIndex = _props$getIndex === void 0 ? defaultGetIndex : _props$getIndex,
85
+ filterData = props.filterData;
86
+ var hasFilter = typeof filterData === 'function';
87
+ var aggregatedBins = [];
88
+ var index = 0;
89
+ for (var binIndex = 0; binIndex < bins.length; binIndex++) {
90
+ var bin = bins[binIndex];
91
+ var points = getPoints(bin);
92
+ var i = getIndex(bin);
93
+ var filteredPoints = hasFilter ? points.filter(filterData) : points;
94
+ bin.filteredPoints = hasFilter ? filteredPoints : null;
95
+ var value = filteredPoints.length ? getValue(filteredPoints) : null;
96
+ if (value !== null && value !== undefined) {
97
+ aggregatedBins[index] = {
98
+ i: Number.isFinite(i) ? i : binIndex,
99
+ value: value,
100
+ counts: filteredPoints.length
101
+ };
102
+ index++;
103
+ }
104
+ }
105
+ return aggregatedBins;
106
+ }
107
+ }, {
108
+ key: "_updateMinMaxValues",
109
+ value: function _updateMinMaxValues() {
110
+ var maxCount = 0;
111
+ var maxValue = -MAX_32_BIT_FLOAT;
112
+ var minValue = MAX_32_BIT_FLOAT;
113
+ var totalCount = 0;
114
+ var _iterator = _createForOfIteratorHelper(this.aggregatedBins),
115
+ _step;
116
+ try {
117
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
118
+ var x = _step.value;
119
+ maxCount = maxCount > x.counts ? maxCount : x.counts;
120
+ maxValue = maxValue > x.value ? maxValue : x.value;
121
+ minValue = minValue < x.value ? minValue : x.value;
122
+ totalCount += x.counts;
123
+ }
124
+ } catch (err) {
125
+ _iterator.e(err);
126
+ } finally {
127
+ _iterator.f();
128
+ }
129
+ if (this.aggregatedBins.length === 0) {
130
+ maxValue = 0;
131
+ minValue = 0;
132
+ }
133
+ this.maxCount = maxCount;
134
+ this.maxValue = maxValue;
135
+ this.minValue = minValue;
136
+ this.totalCount = totalCount;
137
+ }
138
+ }, {
139
+ key: "_getBinMap",
140
+ value: function _getBinMap() {
141
+ var binMap = {};
142
+ var _iterator2 = _createForOfIteratorHelper(this.aggregatedBins),
143
+ _step2;
144
+ try {
145
+ for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
146
+ var bin = _step2.value;
147
+ binMap[bin.i] = bin;
148
+ }
149
+ } catch (err) {
150
+ _iterator2.e(err);
151
+ } finally {
152
+ _iterator2.f();
153
+ }
154
+ return binMap;
155
+ }
156
+ }, {
157
+ key: "_percentileToIndex",
158
+ value: function _percentileToIndex(percentileRange) {
159
+ var len = this.sortedBins.length;
160
+ if (len < 2) return [0, 0];
161
+ var _percentileRange$map = percentileRange.map(function (n) {
162
+ return clamp(n, 0, 100);
163
+ }),
164
+ _percentileRange$map2 = (0, _slicedToArray2["default"])(_percentileRange$map, 2),
165
+ lower = _percentileRange$map2[0],
166
+ upper = _percentileRange$map2[1];
167
+ return [Math.ceil(lower / 100 * (len - 1)), Math.floor(upper / 100 * (len - 1))];
168
+ }
169
+ }, {
170
+ key: "getValueDomainByScale",
171
+ value: function getValueDomainByScale(scale) {
172
+ var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [],
173
+ _ref2 = (0, _slicedToArray2["default"])(_ref, 2),
174
+ _ref2$ = _ref2[0],
175
+ lower = _ref2$ === void 0 ? 0 : _ref2$,
176
+ _ref2$2 = _ref2[1],
177
+ upper = _ref2$2 === void 0 ? 100 : _ref2$2;
178
+ if (!this.sortedBins) {
179
+ this.sortedBins = this.aggregatedBins.sort(function (a, b) {
180
+ return ascending(a.value, b.value);
181
+ });
182
+ }
183
+ if (!this.sortedBins.length) return [];
184
+ var indexEdge = this._percentileToIndex([lower, upper]);
185
+ return this._getScaleDomain(scale, indexEdge);
186
+ }
187
+ }, {
188
+ key: "_getScaleDomain",
189
+ value: function _getScaleDomain(scaleType, _ref3) {
190
+ var _ref4 = (0, _slicedToArray2["default"])(_ref3, 2),
191
+ lowerIdx = _ref4[0],
192
+ upperIdx = _ref4[1];
193
+ var bins = this.sortedBins;
194
+ switch (scaleType) {
195
+ case 'quantize':
196
+ case 'linear':
197
+ return [bins[lowerIdx].value, bins[upperIdx].value];
198
+ case 'quantile':
199
+ return getQuantileDomain(bins.slice(lowerIdx, upperIdx + 1), function (d) {
200
+ return d.value;
201
+ });
202
+ case 'ordinal':
203
+ return getOrdinalDomain(bins, function (d) {
204
+ return d.value;
205
+ });
206
+ default:
207
+ return [bins[lowerIdx].value, bins[upperIdx].value];
208
+ }
209
+ }
210
+ }, {
211
+ key: "getValueRange",
212
+ value: function getValueRange(percentileRange) {
213
+ if (!this.sortedBins) {
214
+ this.sortedBins = this.aggregatedBins.sort(function (a, b) {
215
+ return ascending(a.value, b.value);
216
+ });
217
+ }
218
+ if (!this.sortedBins.length) return [];
219
+ var lowerIdx = 0;
220
+ var upperIdx = this.sortedBins.length - 1;
221
+ if (Array.isArray(percentileRange)) {
222
+ var idxRange = this._percentileToIndex(percentileRange);
223
+ lowerIdx = idxRange[0];
224
+ upperIdx = idxRange[1];
225
+ }
226
+ return [this.sortedBins[lowerIdx].value, this.sortedBins[upperIdx].value];
227
+ }
228
+ }]);
229
+ }();
230
+ var DECK_AGGREGATION_MAP = exports.DECK_AGGREGATION_MAP = (0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])((0, _defineProperty2["default"])({}, AGGREGATION_OPERATION.SUM, _constants.AGGREGATION_TYPES.sum), AGGREGATION_OPERATION.MEAN, _constants.AGGREGATION_TYPES.average), AGGREGATION_OPERATION.MIN, _constants.AGGREGATION_TYPES.minimum), AGGREGATION_OPERATION.MAX, _constants.AGGREGATION_TYPES.maximum);
231
+ function getValueFunc(aggregation, accessor) {
232
+ if (!aggregation || !AGGREGATION_OPERATION[aggregation.toUpperCase()]) {
233
+ _window.console.warn("Aggregation ".concat(aggregation, " is not supported"));
234
+ }
235
+ var op = AGGREGATION_OPERATION[aggregation.toUpperCase()] || AGGREGATION_OPERATION.SUM;
236
+ var keplerOp = DECK_AGGREGATION_MAP[op];
237
+ return function (pts) {
238
+ return (0, _utils.aggregate)(pts.map(accessor), keplerOp);
239
+ };
240
+ }
241
+ function getScaleFunctor(scaleType) {
242
+ if (!scaleType || !_constants.SCALE_FUNC[scaleType]) {
243
+ _window.console.warn("Scale ".concat(scaleType, " is not supported"));
244
+ }
245
+ return _constants.SCALE_FUNC[scaleType] || _constants.SCALE_FUNC.quantize;
246
+ }
247
+ function nop() {
248
+ return;
249
+ }
250
+ function getGetValue(step, props, dimensionUpdater) {
251
+ var key = dimensionUpdater.key;
252
+ var _step$triggers = step.triggers,
253
+ value = _step$triggers.value,
254
+ weight = _step$triggers.weight,
255
+ aggregation = _step$triggers.aggregation;
256
+ var getValue = props[value.prop];
257
+ if (getValue === null) {
258
+ // If `getValue` is not provided from props, build it with aggregation and weight.
259
+ getValue = getValueFunc(props[aggregation.prop], props[weight.prop]);
260
+ }
261
+ if (getValue) {
262
+ this._setDimensionState(key, {
263
+ getValue: getValue
264
+ });
265
+ }
266
+ }
267
+ function getDimensionSortedBins(step, props, dimensionUpdater) {
268
+ var key = dimensionUpdater.key;
269
+ var getValue = this.state.dimensions[key].getValue;
270
+ var sortedBins = new BinSorter(this.state.layerData.data || [], {
271
+ getValue: getValue,
272
+ filterData: props._filterData
273
+ });
274
+ this._setDimensionState(key, {
275
+ sortedBins: sortedBins
276
+ });
277
+ }
278
+ function getDimensionValueDomain(step, props, dimensionUpdater) {
279
+ var key = dimensionUpdater.key;
280
+ var _step$triggers2 = step.triggers,
281
+ lowerPercentile = _step$triggers2.lowerPercentile,
282
+ upperPercentile = _step$triggers2.upperPercentile,
283
+ scaleType = _step$triggers2.scaleType;
284
+ if (!this.state.dimensions[key].sortedBins) {
285
+ // the previous step should set sortedBins, if not, something went wrong
286
+ return;
287
+ }
288
+ var valueDomain =
289
+ // for log and sqrt scale, returns linear domain by default
290
+ // TODO: support other scale function domain in bin sorter
291
+ this.state.dimensions[key].sortedBins.getValueDomainByScale(props[scaleType.prop], [props[lowerPercentile.prop], props[upperPercentile.prop]]);
292
+ if (props.colorScaleType === 'custom' && props.colorMap) {
293
+ // for custom scale, return custom breaks as value domain directly
294
+ valueDomain = props.colorMap.reduce(function (prev, cur) {
295
+ return Number.isFinite(cur[0]) ? prev.concat(cur[0]) : prev;
296
+ }, []);
297
+ }
298
+ this._setDimensionState(key, {
299
+ valueDomain: valueDomain
300
+ });
301
+ }
302
+ function getDimensionScale(step, props, dimensionUpdater) {
303
+ var key = dimensionUpdater.key;
304
+ var _step$triggers3 = step.triggers,
305
+ domain = _step$triggers3.domain,
306
+ range = _step$triggers3.range,
307
+ scaleType = _step$triggers3.scaleType,
308
+ fixed = _step$triggers3.fixed;
309
+ var onSet = step.onSet;
310
+ if (!this.state.dimensions[key].valueDomain) {
311
+ // the previous step should set valueDomain, if not, something went wrong
312
+ return;
313
+ }
314
+ var dimensionRange = props[range.prop];
315
+ var dimensionDomain = props[domain.prop] || this.state.dimensions[key].valueDomain;
316
+ var dimensionFixed = Boolean(fixed && props[fixed.prop]);
317
+ var scaleFunctor = getScaleFunctor(scaleType && props[scaleType.prop])();
318
+ var scaleFunc = scaleFunctor.domain(dimensionDomain).range(dimensionFixed ? dimensionDomain : dimensionRange);
319
+ scaleFunc.scaleType = props.colorScaleType;
320
+ if ((0, _typeof2["default"])(onSet) === 'object' && typeof props[onSet.props] === 'function') {
321
+ var sortedBins = this.state.dimensions[key].sortedBins;
322
+ if (sortedBins) {
323
+ props[onSet.props]({
324
+ domain: scaleFunc.domain(),
325
+ aggregatedBins: sortedBins.binMap
326
+ });
327
+ }
328
+ }
329
+ this._setDimensionState(key, {
330
+ scaleFunc: scaleFunc
331
+ });
332
+ }
333
+ function normalizeResult() {
334
+ var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
335
+ // support previous hexagonAggregator API
336
+ if (result.hexagons) {
337
+ return Object.assign({
338
+ data: result.hexagons
339
+ }, result);
340
+ } else if (result.layerData) {
341
+ return Object.assign({
342
+ data: result.layerData
343
+ }, result);
344
+ }
345
+ return result;
346
+ }
347
+ function getAggregatedData(step, props, aggregation, aggregationParams) {
348
+ var aggr = step.triggers.aggregator;
349
+ var aggregator = props[aggr.prop];
350
+
351
+ // result should contain a data array and other props
352
+ // result = {data: [], ...other props}
353
+ var result = aggregator(props, aggregationParams);
354
+ this.setState({
355
+ layerData: normalizeResult(result)
356
+ });
357
+ }
358
+ var defaultAggregation = exports.defaultAggregation = {
359
+ key: 'position',
360
+ updateSteps: [{
361
+ key: 'aggregate',
362
+ triggers: {
363
+ cellSize: {
364
+ prop: 'cellSize'
365
+ },
366
+ position: {
367
+ prop: 'getPosition',
368
+ updateTrigger: 'getPosition'
369
+ },
370
+ aggregator: {
371
+ prop: 'gridAggregator'
372
+ }
373
+ },
374
+ updater: getAggregatedData
375
+ }]
376
+ };
377
+ function getSubLayerAccessor(dimensionState, dimension) {
378
+ return function (cell) {
379
+ var sortedBins = dimensionState.sortedBins,
380
+ scaleFunc = dimensionState.scaleFunc;
381
+ var bin = sortedBins.binMap[cell.index];
382
+ if (bin && bin.counts === 0) {
383
+ // no points left in bin after filtering
384
+ return dimension.nullValue;
385
+ }
386
+ var cv = bin && bin.value;
387
+ var domain = scaleFunc.domain();
388
+ var isValueInDomain = scaleFunc.scaleType === 'custom' ? cv >= sortedBins.minValue && cv <= sortedBins.maxValue : cv >= domain[0] && cv <= domain[domain.length - 1];
389
+
390
+ // if cell value is outside domain, set alpha to 0
391
+ return isValueInDomain ? scaleFunc(cv) : dimension.nullValue;
392
+ };
393
+ }
394
+ var defaultColorDimension = exports.defaultColorDimension = {
395
+ key: 'fillColor',
396
+ accessor: 'getFillColor',
397
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
398
+ if (!cell) {
399
+ return {};
400
+ }
401
+ var sortedBins = dimensionState.sortedBins;
402
+ var colorValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
403
+ return {
404
+ colorValue: colorValue
405
+ };
406
+ },
407
+ nullValue: [0, 0, 0, 0],
408
+ updateSteps: [{
409
+ key: 'getValue',
410
+ triggers: {
411
+ value: {
412
+ prop: 'getColorValue',
413
+ updateTrigger: 'getColorValue'
414
+ },
415
+ weight: {
416
+ prop: 'getColorWeight',
417
+ updateTrigger: 'getColorWeight'
418
+ },
419
+ aggregation: {
420
+ prop: 'colorAggregation'
421
+ }
422
+ },
423
+ updater: getGetValue
424
+ }, {
425
+ key: 'getBins',
426
+ triggers: {
427
+ _filterData: {
428
+ prop: '_filterData',
429
+ updateTrigger: '_filterData'
430
+ }
431
+ },
432
+ updater: getDimensionSortedBins
433
+ }, {
434
+ key: 'getDomain',
435
+ triggers: {
436
+ lowerPercentile: {
437
+ prop: 'lowerPercentile'
438
+ },
439
+ upperPercentile: {
440
+ prop: 'upperPercentile'
441
+ },
442
+ scaleType: {
443
+ prop: 'colorScaleType'
444
+ }
445
+ },
446
+ updater: getDimensionValueDomain
447
+ }, {
448
+ key: 'getScaleFunc',
449
+ triggers: {
450
+ domain: {
451
+ prop: 'colorDomain'
452
+ },
453
+ range: {
454
+ prop: 'colorRange'
455
+ },
456
+ scaleType: {
457
+ prop: 'colorScaleType'
458
+ }
459
+ },
460
+ onSet: {
461
+ props: 'onSetColorDomain'
462
+ },
463
+ updater: getDimensionScale
464
+ }],
465
+ getSubLayerAccessor: getSubLayerAccessor
466
+ };
467
+ var defaultElevationDimension = exports.defaultElevationDimension = {
468
+ key: 'elevation',
469
+ accessor: 'getElevation',
470
+ getPickingInfo: function getPickingInfo(dimensionState, cell) {
471
+ if (!cell) {
472
+ return {};
473
+ }
474
+ var sortedBins = dimensionState.sortedBins;
475
+ var elevationValue = sortedBins.binMap[cell.index] && sortedBins.binMap[cell.index].value;
476
+ return {
477
+ elevationValue: elevationValue
478
+ };
479
+ },
480
+ nullValue: -1,
481
+ updateSteps: [{
482
+ key: 'getValue',
483
+ triggers: {
484
+ value: {
485
+ prop: 'getElevationValue',
486
+ updateTrigger: 'getElevationValue'
487
+ },
488
+ weight: {
489
+ prop: 'getElevationWeight',
490
+ updateTrigger: 'getElevationWeight'
491
+ },
492
+ aggregation: {
493
+ prop: 'elevationAggregation'
494
+ }
495
+ },
496
+ updater: getGetValue
497
+ }, {
498
+ key: 'getBins',
499
+ triggers: {
500
+ _filterData: {
501
+ prop: '_filterData',
502
+ updateTrigger: '_filterData'
503
+ }
504
+ },
505
+ updater: getDimensionSortedBins
506
+ }, {
507
+ key: 'getDomain',
508
+ triggers: {
509
+ lowerPercentile: {
510
+ prop: 'elevationLowerPercentile'
511
+ },
512
+ upperPercentile: {
513
+ prop: 'elevationUpperPercentile'
514
+ },
515
+ scaleType: {
516
+ prop: 'elevationScaleType'
517
+ }
518
+ },
519
+ updater: getDimensionValueDomain
520
+ }, {
521
+ key: 'getScaleFunc',
522
+ triggers: {
523
+ fixed: {
524
+ prop: 'elevationFixed'
525
+ },
526
+ domain: {
527
+ prop: 'elevationDomain'
528
+ },
529
+ range: {
530
+ prop: 'elevationRange'
531
+ },
532
+ scaleType: {
533
+ prop: 'elevationScaleType'
534
+ }
535
+ },
536
+ onSet: {
537
+ props: 'onSetElevationDomain'
538
+ },
539
+ updater: getDimensionScale
540
+ }],
541
+ getSubLayerAccessor: getSubLayerAccessor
542
+ };
543
+ var _defaultDimensions = exports.defaultDimensions = [defaultColorDimension, defaultElevationDimension];
544
+ var CPUAggregator = exports["default"] = /*#__PURE__*/function () {
545
+ function CPUAggregator() {
546
+ var opts = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
547
+ (0, _classCallCheck2["default"])(this, CPUAggregator);
548
+ (0, _defineProperty2["default"])(this, "state", void 0);
549
+ (0, _defineProperty2["default"])(this, "dimensionUpdaters", void 0);
550
+ (0, _defineProperty2["default"])(this, "aggregationUpdater", void 0);
551
+ this.state = _objectSpread({
552
+ layerData: {},
553
+ dimensions: {
554
+ // color: {
555
+ // getValue: null,
556
+ // domain: null,
557
+ // sortedBins: null,
558
+ // scaleFunc: nop
559
+ // },
560
+ // elevation: {
561
+ // getValue: null,
562
+ // domain: null,
563
+ // sortedBins: null,
564
+ // scaleFunc: nop
565
+ // }
566
+ }
567
+ }, opts.initialState);
568
+ this.dimensionUpdaters = {};
569
+ this.aggregationUpdater = opts.aggregation || defaultAggregation;
570
+ this._addDimension(opts.dimensions || _defaultDimensions);
571
+ }
572
+ return (0, _createClass2["default"])(CPUAggregator, [{
573
+ key: "updateAllDimensions",
574
+ value: function updateAllDimensions(props) {
575
+ var dimensionChanges = [];
576
+ // update all dimensions
577
+ for (var dim in this.dimensionUpdaters) {
578
+ var updaters = this._accumulateUpdaters(0, props, this.dimensionUpdaters[dim]);
579
+ dimensionChanges = dimensionChanges.concat(updaters);
580
+ }
581
+ dimensionChanges.forEach(function (f) {
582
+ return typeof f === 'function' && f();
583
+ });
584
+ }
585
+ }, {
586
+ key: "updateAggregation",
587
+ value: function updateAggregation(props, aggregationParams) {
588
+ var updaters = this._accumulateUpdaters(0, props, this.aggregationUpdater);
589
+ updaters.forEach(function (f) {
590
+ return typeof f === 'function' && f(aggregationParams);
591
+ });
592
+ }
593
+ }, {
594
+ key: "updateState",
595
+ value: function updateState(opts, aggregationParams) {
596
+ var oldProps = opts.oldProps,
597
+ props = opts.props,
598
+ changeFlags = opts.changeFlags;
599
+ var dimensionChanges = [];
600
+ if (changeFlags.dataChanged) {
601
+ // if data changed update everything
602
+ this.updateAggregation(props, aggregationParams);
603
+ this.updateAllDimensions(props);
604
+ return this.state;
605
+ }
606
+ var aggregationChanges = this._getAggregationChanges(oldProps, props, changeFlags);
607
+ if (aggregationChanges && aggregationChanges.length) {
608
+ // get aggregatedData
609
+ aggregationChanges.forEach(function (f) {
610
+ return typeof f === 'function' && f(aggregationParams);
611
+ });
612
+ this.updateAllDimensions(props);
613
+ } else {
614
+ // only update dimensions
615
+ dimensionChanges = this._getDimensionChanges(oldProps, props, changeFlags) || [];
616
+ dimensionChanges.forEach(function (f) {
617
+ return typeof f === 'function' && f();
618
+ });
619
+ }
620
+ return this.state;
621
+ }
622
+
623
+ // Update private state
624
+ }, {
625
+ key: "setState",
626
+ value: function setState(updateObject) {
627
+ this.state = Object.assign({}, this.state, updateObject);
628
+ }
629
+
630
+ // Update private state.dimensions
631
+ }, {
632
+ key: "_setDimensionState",
633
+ value: function _setDimensionState(key, updateObject) {
634
+ this.setState({
635
+ dimensions: Object.assign({}, this.state.dimensions, (0, _defineProperty2["default"])({}, key, Object.assign({}, this.state.dimensions[key], updateObject)))
636
+ });
637
+ }
638
+ }, {
639
+ key: "_addAggregation",
640
+ value: function _addAggregation(aggregation) {
641
+ this.aggregationUpdater = aggregation;
642
+ }
643
+ }, {
644
+ key: "_addDimension",
645
+ value: function _addDimension() {
646
+ var _this = this;
647
+ var dimensions = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
648
+ dimensions.forEach(function (dimension) {
649
+ var key = dimension.key;
650
+ _this.dimensionUpdaters[key] = dimension;
651
+ });
652
+ }
653
+ }, {
654
+ key: "_needUpdateStep",
655
+ value: function _needUpdateStep(dimensionStep, oldProps, props, changeFlags) {
656
+ // whether need to update current dimension step
657
+ // dimension step is the value, domain, scaleFunction of each dimension
658
+ // each step is an object with properties links to layer prop and whether the prop is
659
+ // controlled by updateTriggers
660
+ return Object.values(dimensionStep.triggers).some(function (item) {
661
+ if (item.updateTrigger) {
662
+ // check based on updateTriggers change first
663
+ return changeFlags.updateTriggersChanged && (changeFlags.updateTriggersChanged.all || changeFlags.updateTriggersChanged[item.updateTrigger]);
664
+ }
665
+ // fallback to direct comparison
666
+ return oldProps[item.prop] !== props[item.prop];
667
+ });
668
+ }
669
+ }, {
670
+ key: "_accumulateUpdaters",
671
+ value: function _accumulateUpdaters(step, props, dimension) {
672
+ var updaters = [];
673
+ for (var i = step; i < dimension.updateSteps.length; i++) {
674
+ var updater = dimension.updateSteps[i].updater;
675
+ if (typeof updater === 'function') {
676
+ updaters.push(updater.bind(this, dimension.updateSteps[i], props, dimension));
677
+ }
678
+ }
679
+ return updaters;
680
+ }
681
+ }, {
682
+ key: "_getAllUpdaters",
683
+ value: function _getAllUpdaters(dimension, oldProps, props, changeFlags) {
684
+ var _this2 = this;
685
+ var updaters = [];
686
+ var needUpdateStep = dimension.updateSteps.findIndex(function (step) {
687
+ return _this2._needUpdateStep(step, oldProps, props, changeFlags);
688
+ });
689
+ if (needUpdateStep > -1) {
690
+ updaters = updaters.concat(this._accumulateUpdaters(needUpdateStep, props, dimension));
691
+ }
692
+ return updaters;
693
+ }
694
+ }, {
695
+ key: "_getAggregationChanges",
696
+ value: function _getAggregationChanges(oldProps, props, changeFlags) {
697
+ var updaters = this._getAllUpdaters(this.aggregationUpdater, oldProps, props, changeFlags);
698
+ return updaters.length ? updaters : null;
699
+ }
700
+ }, {
701
+ key: "_getDimensionChanges",
702
+ value: function _getDimensionChanges(oldProps, props, changeFlags) {
703
+ var updaters = [];
704
+
705
+ // get dimension to be updated
706
+ for (var key in this.dimensionUpdaters) {
707
+ // return the first triggered updater for each dimension
708
+ var dimension = this.dimensionUpdaters[key];
709
+ var dimensionUpdaters = this._getAllUpdaters(dimension, oldProps, props, changeFlags);
710
+ updaters = updaters.concat(dimensionUpdaters);
711
+ }
712
+ return updaters.length ? updaters : null;
713
+ }
714
+ }, {
715
+ key: "getUpdateTriggers",
716
+ value: function getUpdateTriggers(props) {
717
+ var _this3 = this;
718
+ var _updateTriggers = props.updateTriggers || {};
719
+ var updateTriggers = {};
720
+ var _loop = function _loop() {
721
+ var _this3$dimensionUpdat = _this3.dimensionUpdaters[key],
722
+ accessor = _this3$dimensionUpdat.accessor,
723
+ updateSteps = _this3$dimensionUpdat.updateSteps;
724
+ // fold dimension triggers into each accessor
725
+ updateTriggers[accessor] = {};
726
+ updateSteps.forEach(function (step) {
727
+ Object.values(step.triggers || []).forEach(function (_ref5) {
728
+ var prop = _ref5.prop,
729
+ updateTrigger = _ref5.updateTrigger;
730
+ if (updateTrigger) {
731
+ // if prop is based on updateTrigger e.g. getColorValue, getColorWeight
732
+ // and updateTriggers is passed in from layer prop
733
+ // fold the updateTriggers into accessor
734
+ var fromProp = _updateTriggers[updateTrigger];
735
+ if ((0, _typeof2["default"])(fromProp) === 'object' && !Array.isArray(fromProp)) {
736
+ // if updateTrigger is an object spread it
737
+ Object.assign(updateTriggers[accessor], fromProp);
738
+ } else if (fromProp !== undefined) {
739
+ updateTriggers[accessor][prop] = fromProp;
740
+ }
741
+ } else {
742
+ // if prop is not based on updateTrigger
743
+ updateTriggers[accessor][prop] = props[prop];
744
+ }
745
+ });
746
+ });
747
+ };
748
+ for (var key in this.dimensionUpdaters) {
749
+ _loop();
750
+ }
751
+ return updateTriggers;
752
+ }
753
+ }, {
754
+ key: "getPickingInfo",
755
+ value: function getPickingInfo(_ref6, layerProps) {
756
+ var _this$state$layerData;
757
+ var info = _ref6.info;
758
+ var isPicked = info.picked && info.index > -1;
759
+ var object = null;
760
+ var cell = isPicked ? (_this$state$layerData = this.state.layerData.data) === null || _this$state$layerData === void 0 ? void 0 : _this$state$layerData[info.index] : null;
761
+ if (cell) {
762
+ var binInfo = {};
763
+ for (var key in this.dimensionUpdaters) {
764
+ var _getPickingInfo = this.dimensionUpdaters[key].getPickingInfo;
765
+ if (typeof _getPickingInfo === 'function') {
766
+ binInfo = Object.assign({}, binInfo, _getPickingInfo(this.state.dimensions[key], cell, layerProps));
767
+ }
768
+ }
769
+ object = Object.assign(binInfo, cell, {
770
+ points: cell.filteredPoints || cell.points
771
+ });
772
+ }
773
+
774
+ // add bin and to info
775
+ return Object.assign(info, {
776
+ picked: Boolean(object),
777
+ // override object with picked cell
778
+ object: object
779
+ });
780
+ }
781
+ }, {
782
+ key: "getAccessor",
783
+ value: function getAccessor(dimensionKey, layerProps) {
784
+ if (!Object.prototype.hasOwnProperty.call(this.dimensionUpdaters, dimensionKey)) {
785
+ return nop;
786
+ }
787
+ return this.dimensionUpdaters[dimensionKey].getSubLayerAccessor(this.state.dimensions[dimensionKey], this.dimensionUpdaters[dimensionKey], layerProps);
788
+ }
789
+ }], [{
790
+ key: "defaultDimensions",
791
+ value: function defaultDimensions() {
792
+ return _defaultDimensions;
793
+ }
794
+ }]);
795
+ }();
796
+ (0, _defineProperty2["default"])(CPUAggregator, "getDimensionScale", void 0);
797
+ CPUAggregator.getDimensionScale = getDimensionScale;
798
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfd2luZG93IiwicmVxdWlyZSIsIl91dGlscyIsIl9jb25zdGFudHMiLCJvd25LZXlzIiwiZSIsInIiLCJ0IiwiT2JqZWN0Iiwia2V5cyIsImdldE93blByb3BlcnR5U3ltYm9scyIsIm8iLCJmaWx0ZXIiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJlbnVtZXJhYmxlIiwicHVzaCIsImFwcGx5IiwiX29iamVjdFNwcmVhZCIsImFyZ3VtZW50cyIsImxlbmd0aCIsImZvckVhY2giLCJfZGVmaW5lUHJvcGVydHkyIiwiZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyIsImRlZmluZVByb3BlcnRpZXMiLCJkZWZpbmVQcm9wZXJ0eSIsIl9jcmVhdGVGb3JPZkl0ZXJhdG9ySGVscGVyIiwiU3ltYm9sIiwiaXRlcmF0b3IiLCJBcnJheSIsImlzQXJyYXkiLCJfdW5zdXBwb3J0ZWRJdGVyYWJsZVRvQXJyYXkiLCJfbiIsIkYiLCJzIiwibiIsImRvbmUiLCJ2YWx1ZSIsImYiLCJUeXBlRXJyb3IiLCJhIiwidSIsImNhbGwiLCJuZXh0IiwiX2FycmF5TGlrZVRvQXJyYXkiLCJ0b1N0cmluZyIsInNsaWNlIiwiY29uc3RydWN0b3IiLCJuYW1lIiwiZnJvbSIsInRlc3QiLCJBR0dSRUdBVElPTl9PUEVSQVRJT04iLCJTVU0iLCJNRUFOIiwiTUlOIiwiTUFYIiwiQ09VTlQiLCJNQVhfMzJfQklUX0ZMT0FUIiwiZGVmYXVsdEdldFZhbHVlIiwicG9pbnRzIiwiZGVmYXVsdEdldFBvaW50cyIsImJpbiIsImRlZmF1bHRHZXRJbmRleCIsImluZGV4IiwiYXNjZW5kaW5nIiwiYiIsIk5hTiIsImNsYW1wIiwibWluIiwibWF4IiwiTWF0aCIsImdldFF1YW50aWxlRG9tYWluIiwiZGF0YSIsInZhbHVlQWNjZXNzb3IiLCJtYXAiLCJzb3J0IiwiZ2V0T3JkaW5hbERvbWFpbiIsIl90b0NvbnN1bWFibGVBcnJheTIiLCJTZXQiLCJCaW5Tb3J0ZXIiLCJiaW5zIiwidW5kZWZpbmVkIiwicHJvcHMiLCJfY2xhc3NDYWxsQ2hlY2syIiwiYWdncmVnYXRlZEJpbnMiLCJfZ2V0QWdncmVnYXRlZEJpbnMiLCJfdXBkYXRlTWluTWF4VmFsdWVzIiwiYmluTWFwIiwiX2dldEJpbk1hcCIsIl9jcmVhdGVDbGFzczIiLCJrZXkiLCJfcHJvcHMkZ2V0VmFsdWUiLCJnZXRWYWx1ZSIsIl9wcm9wcyRnZXRQb2ludHMiLCJnZXRQb2ludHMiLCJfcHJvcHMkZ2V0SW5kZXgiLCJnZXRJbmRleCIsImZpbHRlckRhdGEiLCJoYXNGaWx0ZXIiLCJiaW5JbmRleCIsImkiLCJmaWx0ZXJlZFBvaW50cyIsIk51bWJlciIsImlzRmluaXRlIiwiY291bnRzIiwibWF4Q291bnQiLCJtYXhWYWx1ZSIsIm1pblZhbHVlIiwidG90YWxDb3VudCIsIl9pdGVyYXRvciIsIl9zdGVwIiwieCIsImVyciIsIl9pdGVyYXRvcjIiLCJfc3RlcDIiLCJfcGVyY2VudGlsZVRvSW5kZXgiLCJwZXJjZW50aWxlUmFuZ2UiLCJsZW4iLCJzb3J0ZWRCaW5zIiwiX3BlcmNlbnRpbGVSYW5nZSRtYXAiLCJfcGVyY2VudGlsZVJhbmdlJG1hcDIiLCJfc2xpY2VkVG9BcnJheTIiLCJsb3dlciIsInVwcGVyIiwiY2VpbCIsImZsb29yIiwiZ2V0VmFsdWVEb21haW5CeVNjYWxlIiwic2NhbGUiLCJfcmVmIiwiX3JlZjIiLCJfcmVmMiQiLCJfcmVmMiQyIiwiaW5kZXhFZGdlIiwiX2dldFNjYWxlRG9tYWluIiwic2NhbGVUeXBlIiwiX3JlZjMiLCJfcmVmNCIsImxvd2VySWR4IiwidXBwZXJJZHgiLCJkIiwiZ2V0VmFsdWVSYW5nZSIsImlkeFJhbmdlIiwiREVDS19BR0dSRUdBVElPTl9NQVAiLCJleHBvcnRzIiwiQUdHUkVHQVRJT05fVFlQRVMiLCJzdW0iLCJhdmVyYWdlIiwibWluaW11bSIsIm1heGltdW0iLCJnZXRWYWx1ZUZ1bmMiLCJhZ2dyZWdhdGlvbiIsImFjY2Vzc29yIiwidG9VcHBlckNhc2UiLCJDb25zb2xlIiwid2FybiIsImNvbmNhdCIsIm9wIiwia2VwbGVyT3AiLCJwdHMiLCJhZ2dyZWdhdGUiLCJnZXRTY2FsZUZ1bmN0b3IiLCJTQ0FMRV9GVU5DIiwicXVhbnRpemUiLCJub3AiLCJnZXRHZXRWYWx1ZSIsInN0ZXAiLCJkaW1lbnNpb25VcGRhdGVyIiwiX3N0ZXAkdHJpZ2dlcnMiLCJ0cmlnZ2VycyIsIndlaWdodCIsInByb3AiLCJfc2V0RGltZW5zaW9uU3RhdGUiLCJnZXREaW1lbnNpb25Tb3J0ZWRCaW5zIiwic3RhdGUiLCJkaW1lbnNpb25zIiwibGF5ZXJEYXRhIiwiX2ZpbHRlckRhdGEiLCJnZXREaW1lbnNpb25WYWx1ZURvbWFpbiIsIl9zdGVwJHRyaWdnZXJzMiIsImxvd2VyUGVyY2VudGlsZSIsInVwcGVyUGVyY2VudGlsZSIsInZhbHVlRG9tYWluIiwiY29sb3JTY2FsZVR5cGUiLCJjb2xvck1hcCIsInJlZHVjZSIsInByZXYiLCJjdXIiLCJnZXREaW1lbnNpb25TY2FsZSIsIl9zdGVwJHRyaWdnZXJzMyIsImRvbWFpbiIsInJhbmdlIiwiZml4ZWQiLCJvblNldCIsImRpbWVuc2lvblJhbmdlIiwiZGltZW5zaW9uRG9tYWluIiwiZGltZW5zaW9uRml4ZWQiLCJCb29sZWFuIiwic2NhbGVGdW5jdG9yIiwic2NhbGVGdW5jIiwiX3R5cGVvZjIiLCJub3JtYWxpemVSZXN1bHQiLCJyZXN1bHQiLCJoZXhhZ29ucyIsImFzc2lnbiIsImdldEFnZ3JlZ2F0ZWREYXRhIiwiYWdncmVnYXRpb25QYXJhbXMiLCJhZ2dyIiwiYWdncmVnYXRvciIsInNldFN0YXRlIiwiZGVmYXVsdEFnZ3JlZ2F0aW9uIiwidXBkYXRlU3RlcHMiLCJjZWxsU2l6ZSIsInBvc2l0aW9uIiwidXBkYXRlVHJpZ2dlciIsInVwZGF0ZXIiLCJnZXRTdWJMYXllckFjY2Vzc29yIiwiZGltZW5zaW9uU3RhdGUiLCJkaW1lbnNpb24iLCJjZWxsIiwibnVsbFZhbHVlIiwiY3YiLCJpc1ZhbHVlSW5Eb21haW4iLCJkZWZhdWx0Q29sb3JEaW1lbnNpb24iLCJnZXRQaWNraW5nSW5mbyIsImNvbG9yVmFsdWUiLCJkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uIiwiZWxldmF0aW9uVmFsdWUiLCJkZWZhdWx0RGltZW5zaW9ucyIsIkNQVUFnZ3JlZ2F0b3IiLCJvcHRzIiwiaW5pdGlhbFN0YXRlIiwiZGltZW5zaW9uVXBkYXRlcnMiLCJhZ2dyZWdhdGlvblVwZGF0ZXIiLCJfYWRkRGltZW5zaW9uIiwidXBkYXRlQWxsRGltZW5zaW9ucyIsImRpbWVuc2lvbkNoYW5nZXMiLCJkaW0iLCJ1cGRhdGVycyIsIl9hY2N1bXVsYXRlVXBkYXRlcnMiLCJ1cGRhdGVBZ2dyZWdhdGlvbiIsInVwZGF0ZVN0YXRlIiwib2xkUHJvcHMiLCJjaGFuZ2VGbGFncyIsImRhdGFDaGFuZ2VkIiwiYWdncmVnYXRpb25DaGFuZ2VzIiwiX2dldEFnZ3JlZ2F0aW9uQ2hhbmdlcyIsIl9nZXREaW1lbnNpb25DaGFuZ2VzIiwidXBkYXRlT2JqZWN0IiwiX2FkZEFnZ3JlZ2F0aW9uIiwiX3RoaXMiLCJfbmVlZFVwZGF0ZVN0ZXAiLCJkaW1lbnNpb25TdGVwIiwidmFsdWVzIiwic29tZSIsIml0ZW0iLCJ1cGRhdGVUcmlnZ2Vyc0NoYW5nZWQiLCJhbGwiLCJiaW5kIiwiX2dldEFsbFVwZGF0ZXJzIiwiX3RoaXMyIiwibmVlZFVwZGF0ZVN0ZXAiLCJmaW5kSW5kZXgiLCJnZXRVcGRhdGVUcmlnZ2VycyIsIl90aGlzMyIsIl91cGRhdGVUcmlnZ2VycyIsInVwZGF0ZVRyaWdnZXJzIiwiX2xvb3AiLCJfdGhpczMkZGltZW5zaW9uVXBkYXQiLCJfcmVmNSIsImZyb21Qcm9wIiwiX3JlZjYiLCJsYXllclByb3BzIiwiX3RoaXMkc3RhdGUkbGF5ZXJEYXRhIiwiaW5mbyIsImlzUGlja2VkIiwicGlja2VkIiwib2JqZWN0IiwiYmluSW5mbyIsImdldEFjY2Vzc29yIiwiZGltZW5zaW9uS2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiXSwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGF5ZXItdXRpbHMvY3B1LWFnZ3JlZ2F0b3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiLy8gU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IE1JVFxuLy8gQ29weXJpZ2h0IGNvbnRyaWJ1dG9ycyB0byB0aGUga2VwbGVyLmdsIHByb2plY3RcblxuLyogZXNsaW50LWRpc2FibGUgZ3VhcmQtZm9yLWluICovXG5pbXBvcnQge2NvbnNvbGUgYXMgQ29uc29sZX0gZnJvbSAnZ2xvYmFsL3dpbmRvdyc7XG5cbmltcG9ydCB7YWdncmVnYXRlfSBmcm9tICdAa2VwbGVyLmdsL3V0aWxzJztcbmltcG9ydCB7QUdHUkVHQVRJT05fVFlQRVMsIFNDQUxFX0ZVTkN9IGZyb20gJ0BrZXBsZXIuZ2wvY29uc3RhbnRzJztcbmltcG9ydCB7UkdCQUNvbG9yfSBmcm9tICdAa2VwbGVyLmdsL3R5cGVzJztcbmltcG9ydCB0eXBlIENsdXN0ZXJCdWlsZGVyIGZyb20gJy4vY2x1c3Rlci11dGlscyc7XG5cbmNvbnN0IEFHR1JFR0FUSU9OX09QRVJBVElPTiA9IHtcbiAgU1VNOiAnU1VNJyBhcyBjb25zdCxcbiAgTUVBTjogJ01FQU4nIGFzIGNvbnN0LFxuICBNSU46ICdNSU4nIGFzIGNvbnN0LFxuICBNQVg6ICdNQVgnIGFzIGNvbnN0LFxuICBDT1VOVDogJ0NPVU5UJyBhcyBjb25zdFxufTtcblxuY29uc3QgTUFYXzMyX0JJVF9GTE9BVCA9IDMuNDAyODIzNDY2ZTM4O1xuXG5pbnRlcmZhY2UgQmluIHtcbiAgcG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdO1xuICBmaWx0ZXJlZFBvaW50cz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W10gfCBudWxsO1xuICBpbmRleD86IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIEFnZ3JlZ2F0ZWRCaW4ge1xuICBpOiBudW1iZXI7XG4gIHZhbHVlOiBudW1iZXI7XG4gIGNvdW50czogbnVtYmVyO1xufVxuXG5jb25zdCBkZWZhdWx0R2V0VmFsdWUgPSAocG9pbnRzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPltdKSA9PiBwb2ludHMubGVuZ3RoO1xuY29uc3QgZGVmYXVsdEdldFBvaW50cyA9IChiaW46IEJpbikgPT4gYmluLnBvaW50cztcbmNvbnN0IGRlZmF1bHRHZXRJbmRleCA9IChiaW46IEJpbikgPT4gYmluLmluZGV4O1xuY29uc3QgYXNjZW5kaW5nID0gKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiAoYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU4pO1xuXG5mdW5jdGlvbiBjbGFtcCh2YWx1ZTogbnVtYmVyLCBtaW46IG51bWJlciwgbWF4OiBudW1iZXIpIHtcbiAgcmV0dXJuIE1hdGgubWF4KG1pbiwgTWF0aC5taW4obWF4LCB2YWx1ZSkpO1xufVxuXG5mdW5jdGlvbiBnZXRRdWFudGlsZURvbWFpbihkYXRhOiBBZ2dyZWdhdGVkQmluW10sIHZhbHVlQWNjZXNzb3I6IChkOiBBZ2dyZWdhdGVkQmluKSA9PiBudW1iZXIpIHtcbiAgcmV0dXJuIGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpLnNvcnQoYXNjZW5kaW5nKTtcbn1cblxuZnVuY3Rpb24gZ2V0T3JkaW5hbERvbWFpbihkYXRhOiBBZ2dyZWdhdGVkQmluW10sIHZhbHVlQWNjZXNzb3I6IChkOiBBZ2dyZWdhdGVkQmluKSA9PiBudW1iZXIpIHtcbiAgcmV0dXJuIFsuLi5uZXcgU2V0KGRhdGEubWFwKHZhbHVlQWNjZXNzb3IpKV07XG59XG5cbmNsYXNzIEJpblNvcnRlciB7XG4gIG1heENvdW50ITogbnVtYmVyO1xuICBtYXhWYWx1ZSE6IG51bWJlcjtcbiAgbWluVmFsdWUhOiBudW1iZXI7XG4gIHRvdGFsQ291bnQhOiBudW1iZXI7XG4gIGFnZ3JlZ2F0ZWRCaW5zOiBBZ2dyZWdhdGVkQmluW107XG4gIHNvcnRlZEJpbnMhOiBBZ2dyZWdhdGVkQmluW107XG4gIGJpbk1hcDogUmVjb3JkPG51bWJlciwgQWdncmVnYXRlZEJpbj47XG5cbiAgY29uc3RydWN0b3IoYmluczogQmluW10gPSBbXSwgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4gPSB7fSkge1xuICAgIHRoaXMuYWdncmVnYXRlZEJpbnMgPSB0aGlzLl9nZXRBZ2dyZWdhdGVkQmlucyhiaW5zLCBwcm9wcyk7XG4gICAgdGhpcy5fdXBkYXRlTWluTWF4VmFsdWVzKCk7XG4gICAgdGhpcy5iaW5NYXAgPSB0aGlzLl9nZXRCaW5NYXAoKTtcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGVkQmlucyhiaW5zOiBCaW5bXSwgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pOiBBZ2dyZWdhdGVkQmluW10ge1xuICAgIGNvbnN0IHtcbiAgICAgIGdldFZhbHVlID0gZGVmYXVsdEdldFZhbHVlLFxuICAgICAgZ2V0UG9pbnRzID0gZGVmYXVsdEdldFBvaW50cyxcbiAgICAgIGdldEluZGV4ID0gZGVmYXVsdEdldEluZGV4LFxuICAgICAgZmlsdGVyRGF0YVxuICAgIH0gPSBwcm9wcztcbiAgICBjb25zdCBoYXNGaWx0ZXIgPSB0eXBlb2YgZmlsdGVyRGF0YSA9PT0gJ2Z1bmN0aW9uJztcbiAgICBjb25zdCBhZ2dyZWdhdGVkQmluczogQWdncmVnYXRlZEJpbltdID0gW107XG4gICAgbGV0IGluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBiaW5JbmRleCA9IDA7IGJpbkluZGV4IDwgYmlucy5sZW5ndGg7IGJpbkluZGV4KyspIHtcbiAgICAgIGNvbnN0IGJpbiA9IGJpbnNbYmluSW5kZXhdO1xuICAgICAgY29uc3QgcG9pbnRzID0gZ2V0UG9pbnRzKGJpbik7XG4gICAgICBjb25zdCBpID0gZ2V0SW5kZXgoYmluKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkUG9pbnRzID0gaGFzRmlsdGVyID8gcG9pbnRzLmZpbHRlcihmaWx0ZXJEYXRhKSA6IHBvaW50cztcbiAgICAgIGJpbi5maWx0ZXJlZFBvaW50cyA9IGhhc0ZpbHRlciA/IGZpbHRlcmVkUG9pbnRzIDogbnVsbDtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmlsdGVyZWRQb2ludHMubGVuZ3RoID8gZ2V0VmFsdWUoZmlsdGVyZWRQb2ludHMpIDogbnVsbDtcbiAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFnZ3JlZ2F0ZWRCaW5zW2luZGV4XSA9IHtcbiAgICAgICAgICBpOiBOdW1iZXIuaXNGaW5pdGUoaSkgPyBpIDogYmluSW5kZXgsXG4gICAgICAgICAgdmFsdWUsXG4gICAgICAgICAgY291bnRzOiBmaWx0ZXJlZFBvaW50cy5sZW5ndGhcbiAgICAgICAgfTtcbiAgICAgICAgaW5kZXgrKztcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFnZ3JlZ2F0ZWRCaW5zO1xuICB9XG5cbiAgX3VwZGF0ZU1pbk1heFZhbHVlcygpIHtcbiAgICBsZXQgbWF4Q291bnQgPSAwO1xuICAgIGxldCBtYXhWYWx1ZSA9IC1NQVhfMzJfQklUX0ZMT0FUO1xuICAgIGxldCBtaW5WYWx1ZSA9IE1BWF8zMl9CSVRfRkxPQVQ7XG4gICAgbGV0IHRvdGFsQ291bnQgPSAwO1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLmFnZ3JlZ2F0ZWRCaW5zKSB7XG4gICAgICBtYXhDb3VudCA9IG1heENvdW50ID4geC5jb3VudHMgPyBtYXhDb3VudCA6IHguY291bnRzO1xuICAgICAgbWF4VmFsdWUgPSBtYXhWYWx1ZSA+IHgudmFsdWUgPyBtYXhWYWx1ZSA6IHgudmFsdWU7XG4gICAgICBtaW5WYWx1ZSA9IG1pblZhbHVlIDwgeC52YWx1ZSA/IG1pblZhbHVlIDogeC52YWx1ZTtcbiAgICAgIHRvdGFsQ291bnQgKz0geC5jb3VudHM7XG4gICAgfVxuICAgIGlmICh0aGlzLmFnZ3JlZ2F0ZWRCaW5zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbWF4VmFsdWUgPSAwO1xuICAgICAgbWluVmFsdWUgPSAwO1xuICAgIH1cbiAgICB0aGlzLm1heENvdW50ID0gbWF4Q291bnQ7XG4gICAgdGhpcy5tYXhWYWx1ZSA9IG1heFZhbHVlO1xuICAgIHRoaXMubWluVmFsdWUgPSBtaW5WYWx1ZTtcbiAgICB0aGlzLnRvdGFsQ291bnQgPSB0b3RhbENvdW50O1xuICB9XG5cbiAgX2dldEJpbk1hcCgpIHtcbiAgICBjb25zdCBiaW5NYXAgPSB7fTtcbiAgICBmb3IgKGNvbnN0IGJpbiBvZiB0aGlzLmFnZ3JlZ2F0ZWRCaW5zKSB7XG4gICAgICBiaW5NYXBbYmluLmldID0gYmluO1xuICAgIH1cbiAgICByZXR1cm4gYmluTWFwO1xuICB9XG5cbiAgX3BlcmNlbnRpbGVUb0luZGV4KHBlcmNlbnRpbGVSYW5nZTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBsZW4gPSB0aGlzLnNvcnRlZEJpbnMubGVuZ3RoO1xuICAgIGlmIChsZW4gPCAyKSByZXR1cm4gWzAsIDBdO1xuICAgIGNvbnN0IFtsb3dlciwgdXBwZXJdID0gcGVyY2VudGlsZVJhbmdlLm1hcChuID0+IGNsYW1wKG4sIDAsIDEwMCkpO1xuICAgIHJldHVybiBbTWF0aC5jZWlsKChsb3dlciAvIDEwMCkgKiAobGVuIC0gMSkpLCBNYXRoLmZsb29yKCh1cHBlciAvIDEwMCkgKiAobGVuIC0gMSkpXTtcbiAgfVxuXG4gIGdldFZhbHVlRG9tYWluQnlTY2FsZShzY2FsZTogc3RyaW5nLCBbbG93ZXIgPSAwLCB1cHBlciA9IDEwMF06IG51bWJlcltdID0gW10pIHtcbiAgICBpZiAoIXRoaXMuc29ydGVkQmlucykge1xuICAgICAgdGhpcy5zb3J0ZWRCaW5zID0gdGhpcy5hZ2dyZWdhdGVkQmlucy5zb3J0KChhLCBiKSA9PiBhc2NlbmRpbmcoYS52YWx1ZSwgYi52YWx1ZSkpO1xuICAgIH1cbiAgICBpZiAoIXRoaXMuc29ydGVkQmlucy5sZW5ndGgpIHJldHVybiBbXTtcbiAgICBjb25zdCBpbmRleEVkZ2UgPSB0aGlzLl9wZXJjZW50aWxlVG9JbmRleChbbG93ZXIsIHVwcGVyXSk7XG4gICAgcmV0dXJuIHRoaXMuX2dldFNjYWxlRG9tYWluKHNjYWxlLCBpbmRleEVkZ2UpO1xuICB9XG5cbiAgX2dldFNjYWxlRG9tYWluKHNjYWxlVHlwZTogc3RyaW5nLCBbbG93ZXJJZHgsIHVwcGVySWR4XTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBiaW5zID0gdGhpcy5zb3J0ZWRCaW5zO1xuICAgIHN3aXRjaCAoc2NhbGVUeXBlKSB7XG4gICAgICBjYXNlICdxdWFudGl6ZSc6XG4gICAgICBjYXNlICdsaW5lYXInOlxuICAgICAgICByZXR1cm4gW2JpbnNbbG93ZXJJZHhdLnZhbHVlLCBiaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gICAgICBjYXNlICdxdWFudGlsZSc6XG4gICAgICAgIHJldHVybiBnZXRRdWFudGlsZURvbWFpbihiaW5zLnNsaWNlKGxvd2VySWR4LCB1cHBlcklkeCArIDEpLCBkID0+IGQudmFsdWUpO1xuICAgICAgY2FzZSAnb3JkaW5hbCc6XG4gICAgICAgIHJldHVybiBnZXRPcmRpbmFsRG9tYWluKGJpbnMsIGQgPT4gZC52YWx1ZSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gW2JpbnNbbG93ZXJJZHhdLnZhbHVlLCBiaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gICAgfVxuICB9XG5cbiAgZ2V0VmFsdWVSYW5nZShwZXJjZW50aWxlUmFuZ2U/OiBudW1iZXJbXSkge1xuICAgIGlmICghdGhpcy5zb3J0ZWRCaW5zKSB7XG4gICAgICB0aGlzLnNvcnRlZEJpbnMgPSB0aGlzLmFnZ3JlZ2F0ZWRCaW5zLnNvcnQoKGEsIGIpID0+IGFzY2VuZGluZyhhLnZhbHVlLCBiLnZhbHVlKSk7XG4gICAgfVxuICAgIGlmICghdGhpcy5zb3J0ZWRCaW5zLmxlbmd0aCkgcmV0dXJuIFtdO1xuICAgIGxldCBsb3dlcklkeCA9IDA7XG4gICAgbGV0IHVwcGVySWR4ID0gdGhpcy5zb3J0ZWRCaW5zLmxlbmd0aCAtIDE7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGVyY2VudGlsZVJhbmdlKSkge1xuICAgICAgY29uc3QgaWR4UmFuZ2UgPSB0aGlzLl9wZXJjZW50aWxlVG9JbmRleChwZXJjZW50aWxlUmFuZ2UpO1xuICAgICAgbG93ZXJJZHggPSBpZHhSYW5nZVswXTtcbiAgICAgIHVwcGVySWR4ID0gaWR4UmFuZ2VbMV07XG4gICAgfVxuICAgIHJldHVybiBbdGhpcy5zb3J0ZWRCaW5zW2xvd2VySWR4XS52YWx1ZSwgdGhpcy5zb3J0ZWRCaW5zW3VwcGVySWR4XS52YWx1ZV07XG4gIH1cbn1cblxuZXhwb3J0IHR5cGUgVXBkYXRlclR5cGUgPSAodGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBCaW5kZWRVcGRhdGVyVHlwZSA9ICgpID0+IHZvaWQ7XG5leHBvcnQgdHlwZSBBZ2dyZWdhdGVkVXBkYXRlclR5cGUgPSAoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikgPT4gdm9pZDtcbmV4cG9ydCB0eXBlIEJpbmRlZEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZSA9IChhZ2dyZWdhdGlvblBhcmFtcykgPT4gdm9pZDtcblxuZXhwb3J0IHR5cGUgVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIG9uU2V0Pzoge1xuICAgIHByb3BzOiBzdHJpbmc7XG4gIH07XG4gIHVwZGF0ZXI6IFVwZGF0ZXJUeXBlO1xufTtcblxuZXhwb3J0IHR5cGUgRGltZW5zaW9uVHlwZTxWYWx1ZVR5cGUgPSBhbnk+ID0ge1xuICBrZXk6IHN0cmluZztcbiAgYWNjZXNzb3I6IHN0cmluZztcbiAgZ2V0UGlja2luZ0luZm86IChkaW1lbnNpb25TdGF0ZSwgY2VsbCwgbGF5ZXJQcm9wcz8pID0+IGFueTtcbiAgbnVsbFZhbHVlOiBWYWx1ZVR5cGU7XG4gIHVwZGF0ZVN0ZXBzOiBVcGRhdGVTdGVwc1R5cGVbXTtcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3Nvcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVXBkYXRlU3RlcHNUeXBlID0ge1xuICBrZXk6IHN0cmluZztcbiAgdHJpZ2dlcnM6IHtcbiAgICBba2V5OiBzdHJpbmddOiB7XG4gICAgICBwcm9wOiBzdHJpbmc7XG4gICAgICB1cGRhdGVUcmlnZ2VyPzogc3RyaW5nO1xuICAgIH07XG4gIH07XG4gIHVwZGF0ZXI6IEFnZ3JlZ2F0ZWRVcGRhdGVyVHlwZTtcbn07XG5cbmV4cG9ydCB0eXBlIEFnZ3JlZ2F0aW9uVHlwZSA9IHtcbiAga2V5OiBzdHJpbmc7XG4gIHVwZGF0ZVN0ZXBzOiBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZVtdO1xufTtcblxuZXhwb3J0IGNvbnN0IERFQ0tfQUdHUkVHQVRJT05fTUFQID0ge1xuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTV06IEFHR1JFR0FUSU9OX1RZUEVTLnN1bSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NRUFOXTogQUdHUkVHQVRJT05fVFlQRVMuYXZlcmFnZSxcbiAgW0FHR1JFR0FUSU9OX09QRVJBVElPTi5NSU5dOiBBR0dSRUdBVElPTl9UWVBFUy5taW5pbXVtLFxuICBbQUdHUkVHQVRJT05fT1BFUkFUSU9OLk1BWF06IEFHR1JFR0FUSU9OX1RZUEVTLm1heGltdW1cbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWYWx1ZUZ1bmMoXG4gIGFnZ3JlZ2F0aW9uOiBzdHJpbmcsXG4gIGFjY2Vzc29yOiAoZDogUmVjb3JkPHN0cmluZywgdW5rbm93bj4pID0+IG51bWJlclxuKSB7XG4gIGlmICghYWdncmVnYXRpb24gfHwgIUFHR1JFR0FUSU9OX09QRVJBVElPTlthZ2dyZWdhdGlvbi50b1VwcGVyQ2FzZSgpXSkge1xuICAgIENvbnNvbGUud2FybihgQWdncmVnYXRpb24gJHthZ2dyZWdhdGlvbn0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG5cbiAgY29uc3Qgb3AgPSBBR0dSRUdBVElPTl9PUEVSQVRJT05bYWdncmVnYXRpb24udG9VcHBlckNhc2UoKV0gfHwgQUdHUkVHQVRJT05fT1BFUkFUSU9OLlNVTTtcbiAgY29uc3Qga2VwbGVyT3AgPSBERUNLX0FHR1JFR0FUSU9OX01BUFtvcF07XG5cbiAgcmV0dXJuIHB0cyA9PiBhZ2dyZWdhdGUocHRzLm1hcChhY2Nlc3NvciksIGtlcGxlck9wKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNjYWxlRnVuY3RvcihzY2FsZVR5cGU6IHN0cmluZykge1xuICBpZiAoIXNjYWxlVHlwZSB8fCAhU0NBTEVfRlVOQ1tzY2FsZVR5cGVdKSB7XG4gICAgQ29uc29sZS53YXJuKGBTY2FsZSAke3NjYWxlVHlwZX0gaXMgbm90IHN1cHBvcnRlZGApO1xuICB9XG4gIHJldHVybiBTQ0FMRV9GVU5DW3NjYWxlVHlwZV0gfHwgU0NBTEVfRlVOQy5xdWFudGl6ZTtcbn1cblxuZnVuY3Rpb24gbm9wKCkge1xuICByZXR1cm47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRHZXRWYWx1ZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHt2YWx1ZSwgd2VpZ2h0LCBhZ2dyZWdhdGlvbn0gPSBzdGVwLnRyaWdnZXJzO1xuXG4gIGxldCBnZXRWYWx1ZSA9IHByb3BzW3ZhbHVlLnByb3BdO1xuXG4gIGlmIChnZXRWYWx1ZSA9PT0gbnVsbCkge1xuICAgIC8vIElmIGBnZXRWYWx1ZWAgaXMgbm90IHByb3ZpZGVkIGZyb20gcHJvcHMsIGJ1aWxkIGl0IHdpdGggYWdncmVnYXRpb24gYW5kIHdlaWdodC5cbiAgICBnZXRWYWx1ZSA9IGdldFZhbHVlRnVuYyhwcm9wc1thZ2dyZWdhdGlvbi5wcm9wXSwgcHJvcHNbd2VpZ2h0LnByb3BdKTtcbiAgfVxuXG4gIGlmIChnZXRWYWx1ZSkge1xuICAgIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge2dldFZhbHVlfSk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblNvcnRlZEJpbnModGhpczogQ1BVQWdncmVnYXRvciwgc3RlcCwgcHJvcHMsIGRpbWVuc2lvblVwZGF0ZXIpIHtcbiAgY29uc3Qge2tleX0gPSBkaW1lbnNpb25VcGRhdGVyO1xuICBjb25zdCB7Z2V0VmFsdWV9ID0gdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV07XG4gIGNvbnN0IHNvcnRlZEJpbnMgPSBuZXcgQmluU29ydGVyKCh0aGlzLnN0YXRlLmxheWVyRGF0YS5kYXRhIHx8IFtdKSBhcyB1bmtub3duIGFzIEJpbltdLCB7XG4gICAgZ2V0VmFsdWUsXG4gICAgZmlsdGVyRGF0YTogcHJvcHMuX2ZpbHRlckRhdGFcbiAgfSk7XG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3NvcnRlZEJpbnN9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldERpbWVuc2lvblZhbHVlRG9tYWluKHRoaXM6IENQVUFnZ3JlZ2F0b3IsIHN0ZXAsIHByb3BzLCBkaW1lbnNpb25VcGRhdGVyKSB7XG4gIGNvbnN0IHtrZXl9ID0gZGltZW5zaW9uVXBkYXRlcjtcbiAgY29uc3Qge1xuICAgIHRyaWdnZXJzOiB7bG93ZXJQZXJjZW50aWxlLCB1cHBlclBlcmNlbnRpbGUsIHNjYWxlVHlwZX1cbiAgfSA9IHN0ZXA7XG5cbiAgaWYgKCF0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCBzb3J0ZWRCaW5zLCBpZiBub3QsIHNvbWV0aGluZyB3ZW50IHdyb25nXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgbGV0IHZhbHVlRG9tYWluID1cbiAgICAvLyBmb3IgbG9nIGFuZCBzcXJ0IHNjYWxlLCByZXR1cm5zIGxpbmVhciBkb21haW4gYnkgZGVmYXVsdFxuICAgIC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgc2NhbGUgZnVuY3Rpb24gZG9tYWluIGluIGJpbiBzb3J0ZXJcbiAgICB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS5zb3J0ZWRCaW5zLmdldFZhbHVlRG9tYWluQnlTY2FsZShwcm9wc1tzY2FsZVR5cGUucHJvcF0sIFtcbiAgICAgIHByb3BzW2xvd2VyUGVyY2VudGlsZS5wcm9wXSxcbiAgICAgIHByb3BzW3VwcGVyUGVyY2VudGlsZS5wcm9wXVxuICAgIF0pO1xuXG4gIGlmIChwcm9wcy5jb2xvclNjYWxlVHlwZSA9PT0gJ2N1c3RvbScgJiYgcHJvcHMuY29sb3JNYXApIHtcbiAgICAvLyBmb3IgY3VzdG9tIHNjYWxlLCByZXR1cm4gY3VzdG9tIGJyZWFrcyBhcyB2YWx1ZSBkb21haW4gZGlyZWN0bHlcbiAgICB2YWx1ZURvbWFpbiA9IHByb3BzLmNvbG9yTWFwLnJlZHVjZShcbiAgICAgIChwcmV2LCBjdXIpID0+IChOdW1iZXIuaXNGaW5pdGUoY3VyWzBdKSA/IHByZXYuY29uY2F0KGN1clswXSkgOiBwcmV2KSxcbiAgICAgIFtdXG4gICAgKTtcbiAgfVxuXG4gIHRoaXMuX3NldERpbWVuc2lvblN0YXRlKGtleSwge3ZhbHVlRG9tYWlufSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25TY2FsZSh0aGlzOiBDUFVBZ2dyZWdhdG9yLCBzdGVwLCBwcm9wcywgZGltZW5zaW9uVXBkYXRlcikge1xuICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvblVwZGF0ZXI7XG4gIGNvbnN0IHtkb21haW4sIHJhbmdlLCBzY2FsZVR5cGUsIGZpeGVkfSA9IHN0ZXAudHJpZ2dlcnM7XG4gIGNvbnN0IHtvblNldH0gPSBzdGVwO1xuICBpZiAoIXRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnZhbHVlRG9tYWluKSB7XG4gICAgLy8gdGhlIHByZXZpb3VzIHN0ZXAgc2hvdWxkIHNldCB2YWx1ZURvbWFpbiwgaWYgbm90LCBzb21ldGhpbmcgd2VudCB3cm9uZ1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGRpbWVuc2lvblJhbmdlID0gcHJvcHNbcmFuZ2UucHJvcF07XG4gIGNvbnN0IGRpbWVuc2lvbkRvbWFpbiA9IHByb3BzW2RvbWFpbi5wcm9wXSB8fCB0aGlzLnN0YXRlLmRpbWVuc2lvbnNba2V5XS52YWx1ZURvbWFpbjtcbiAgY29uc3QgZGltZW5zaW9uRml4ZWQgPSBCb29sZWFuKGZpeGVkICYmIHByb3BzW2ZpeGVkLnByb3BdKTtcblxuICBjb25zdCBzY2FsZUZ1bmN0b3IgPSBnZXRTY2FsZUZ1bmN0b3Ioc2NhbGVUeXBlICYmIHByb3BzW3NjYWxlVHlwZS5wcm9wXSkoKTtcblxuICBjb25zdCBzY2FsZUZ1bmMgPSBzY2FsZUZ1bmN0b3JcbiAgICAuZG9tYWluKGRpbWVuc2lvbkRvbWFpbilcbiAgICAucmFuZ2UoZGltZW5zaW9uRml4ZWQgPyBkaW1lbnNpb25Eb21haW4gOiBkaW1lbnNpb25SYW5nZSk7XG4gIHNjYWxlRnVuYy5zY2FsZVR5cGUgPSBwcm9wcy5jb2xvclNjYWxlVHlwZTtcblxuICBpZiAodHlwZW9mIG9uU2V0ID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgcHJvcHNbb25TZXQucHJvcHNdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY29uc3Qgc29ydGVkQmlucyA9IHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLnNvcnRlZEJpbnM7XG4gICAgaWYgKHNvcnRlZEJpbnMpIHtcbiAgICAgIHByb3BzW29uU2V0LnByb3BzXSh7ZG9tYWluOiBzY2FsZUZ1bmMuZG9tYWluKCksIGFnZ3JlZ2F0ZWRCaW5zOiBzb3J0ZWRCaW5zLmJpbk1hcH0pO1xuICAgIH1cbiAgfVxuICB0aGlzLl9zZXREaW1lbnNpb25TdGF0ZShrZXksIHtzY2FsZUZ1bmN9KTtcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplUmVzdWx0KFxuICByZXN1bHQ6IHtcbiAgICBoZXhhZ29ucz86IFJlY29yZDxzdHJpbmcsIHVua25vd24+W107XG4gICAgbGF5ZXJEYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgICBkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXTtcbiAgfSA9IHt9XG4pIHtcbiAgLy8gc3VwcG9ydCBwcmV2aW91cyBoZXhhZ29uQWdncmVnYXRvciBBUElcbiAgaWYgKHJlc3VsdC5oZXhhZ29ucykge1xuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHtkYXRhOiByZXN1bHQuaGV4YWdvbnN9LCByZXN1bHQpO1xuICB9IGVsc2UgaWYgKHJlc3VsdC5sYXllckRhdGEpIHtcbiAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7ZGF0YTogcmVzdWx0LmxheWVyRGF0YX0sIHJlc3VsdCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QWdncmVnYXRlZERhdGEoXG4gIHRoaXM6IENQVUFnZ3JlZ2F0b3IsXG4gIHN0ZXAsXG4gIHByb3BzLFxuICBhZ2dyZWdhdGlvbixcbiAgYWdncmVnYXRpb25QYXJhbXNcbikge1xuICBjb25zdCB7XG4gICAgdHJpZ2dlcnM6IHthZ2dyZWdhdG9yOiBhZ2dyfVxuICB9ID0gc3RlcDtcbiAgY29uc3QgYWdncmVnYXRvciA9IHByb3BzW2FnZ3IucHJvcF07XG5cbiAgLy8gcmVzdWx0IHNob3VsZCBjb250YWluIGEgZGF0YSBhcnJheSBhbmQgb3RoZXIgcHJvcHNcbiAgLy8gcmVzdWx0ID0ge2RhdGE6IFtdLCAuLi5vdGhlciBwcm9wc31cbiAgY29uc3QgcmVzdWx0ID0gYWdncmVnYXRvcihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICB0aGlzLnNldFN0YXRlKHtcbiAgICBsYXllckRhdGE6IG5vcm1hbGl6ZVJlc3VsdChyZXN1bHQpXG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEFnZ3JlZ2F0aW9uOiBBZ2dyZWdhdGlvblR5cGUgPSB7XG4gIGtleTogJ3Bvc2l0aW9uJyxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdhZ2dyZWdhdGUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgY2VsbFNpemU6IHtcbiAgICAgICAgICBwcm9wOiAnY2VsbFNpemUnXG4gICAgICAgIH0sXG4gICAgICAgIHBvc2l0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2dldFBvc2l0aW9uJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0UG9zaXRpb24nXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0b3I6IHtcbiAgICAgICAgICBwcm9wOiAnZ3JpZEFnZ3JlZ2F0b3InXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRBZ2dyZWdhdGVkRGF0YVxuICAgIH1cbiAgXVxufTtcblxuZnVuY3Rpb24gZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgZGltZW5zaW9uU3RhdGU6IHtzb3J0ZWRCaW5zOiBCaW5Tb3J0ZXI7IHNjYWxlRnVuYzogUmV0dXJuVHlwZTx0eXBlb2YgZ2V0U2NhbGVGdW5jdG9yPn0sXG4gIGRpbWVuc2lvbjogRGltZW5zaW9uVHlwZVxuKSB7XG4gIHJldHVybiAoY2VsbDoge2luZGV4OiBudW1iZXJ9KSA9PiB7XG4gICAgY29uc3Qge3NvcnRlZEJpbnMsIHNjYWxlRnVuY30gPSBkaW1lbnNpb25TdGF0ZTtcbiAgICBjb25zdCBiaW4gPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XTtcblxuICAgIGlmIChiaW4gJiYgYmluLmNvdW50cyA9PT0gMCkge1xuICAgICAgLy8gbm8gcG9pbnRzIGxlZnQgaW4gYmluIGFmdGVyIGZpbHRlcmluZ1xuICAgICAgcmV0dXJuIGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gICAgfVxuXG4gICAgY29uc3QgY3YgPSBiaW4gJiYgYmluLnZhbHVlO1xuICAgIGNvbnN0IGRvbWFpbiA9IHNjYWxlRnVuYy5kb21haW4oKTtcblxuICAgIGNvbnN0IGlzVmFsdWVJbkRvbWFpbiA9XG4gICAgICBzY2FsZUZ1bmMuc2NhbGVUeXBlID09PSAnY3VzdG9tJ1xuICAgICAgICA/IGN2ID49IHNvcnRlZEJpbnMubWluVmFsdWUgJiYgY3YgPD0gc29ydGVkQmlucy5tYXhWYWx1ZVxuICAgICAgICA6IGN2ID49IGRvbWFpblswXSAmJiBjdiA8PSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gaWYgY2VsbCB2YWx1ZSBpcyBvdXRzaWRlIGRvbWFpbiwgc2V0IGFscGhhIHRvIDBcbiAgICByZXR1cm4gaXNWYWx1ZUluRG9tYWluID8gc2NhbGVGdW5jKGN2KSA6IGRpbWVuc2lvbi5udWxsVmFsdWU7XG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29sb3JEaW1lbnNpb246IERpbWVuc2lvblR5cGU8UkdCQUNvbG9yPiA9IHtcbiAga2V5OiAnZmlsbENvbG9yJyxcbiAgYWNjZXNzb3I6ICdnZXRGaWxsQ29sb3InLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGNvbG9yVmFsdWUgPSBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XSAmJiBzb3J0ZWRCaW5zLmJpbk1hcFtjZWxsLmluZGV4XS52YWx1ZTtcbiAgICByZXR1cm4ge2NvbG9yVmFsdWV9O1xuICB9LFxuICBudWxsVmFsdWU6IFswLCAwLCAwLCAwXSxcbiAgdXBkYXRlU3RlcHM6IFtcbiAgICB7XG4gICAgICBrZXk6ICdnZXRWYWx1ZScsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICB2YWx1ZToge1xuICAgICAgICAgIHByb3A6ICdnZXRDb2xvclZhbHVlJyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JWYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldENvbG9yV2VpZ2h0JyxcbiAgICAgICAgICB1cGRhdGVUcmlnZ2VyOiAnZ2V0Q29sb3JXZWlnaHQnXG4gICAgICAgIH0sXG4gICAgICAgIGFnZ3JlZ2F0aW9uOiB7XG4gICAgICAgICAgcHJvcDogJ2NvbG9yQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdsb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICd1cHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdjb2xvclNjYWxlVHlwZSd9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uVmFsdWVEb21haW5cbiAgICB9LFxuICAgIHtcbiAgICAgIGtleTogJ2dldFNjYWxlRnVuYycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBkb21haW46IHtwcm9wOiAnY29sb3JEb21haW4nfSxcbiAgICAgICAgcmFuZ2U6IHtwcm9wOiAnY29sb3JSYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnY29sb3JTY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIG9uU2V0OiB7XG4gICAgICAgIHByb3BzOiAnb25TZXRDb2xvckRvbWFpbidcbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXREaW1lbnNpb25TY2FsZVxuICAgIH1cbiAgXSxcbiAgZ2V0U3ViTGF5ZXJBY2Nlc3NvclxufTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRFbGV2YXRpb25EaW1lbnNpb246IERpbWVuc2lvblR5cGU8bnVtYmVyPiA9IHtcbiAga2V5OiAnZWxldmF0aW9uJyxcbiAgYWNjZXNzb3I6ICdnZXRFbGV2YXRpb24nLFxuICBnZXRQaWNraW5nSW5mbzogKGRpbWVuc2lvblN0YXRlLCBjZWxsKSA9PiB7XG4gICAgaWYgKCFjZWxsKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHtzb3J0ZWRCaW5zfSA9IGRpbWVuc2lvblN0YXRlO1xuICAgIGNvbnN0IGVsZXZhdGlvblZhbHVlID0gc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0gJiYgc29ydGVkQmlucy5iaW5NYXBbY2VsbC5pbmRleF0udmFsdWU7XG4gICAgcmV0dXJuIHtlbGV2YXRpb25WYWx1ZX07XG4gIH0sXG4gIG51bGxWYWx1ZTogLTEsXG4gIHVwZGF0ZVN0ZXBzOiBbXG4gICAge1xuICAgICAga2V5OiAnZ2V0VmFsdWUnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICBwcm9wOiAnZ2V0RWxldmF0aW9uVmFsdWUnLFxuICAgICAgICAgIHVwZGF0ZVRyaWdnZXI6ICdnZXRFbGV2YXRpb25WYWx1ZSdcbiAgICAgICAgfSxcbiAgICAgICAgd2VpZ2h0OiB7XG4gICAgICAgICAgcHJvcDogJ2dldEVsZXZhdGlvbldlaWdodCcsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ2dldEVsZXZhdGlvbldlaWdodCdcbiAgICAgICAgfSxcbiAgICAgICAgYWdncmVnYXRpb246IHtcbiAgICAgICAgICBwcm9wOiAnZWxldmF0aW9uQWdncmVnYXRpb24nXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICB1cGRhdGVyOiBnZXRHZXRWYWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0QmlucycsXG4gICAgICB0cmlnZ2Vyczoge1xuICAgICAgICBfZmlsdGVyRGF0YToge1xuICAgICAgICAgIHByb3A6ICdfZmlsdGVyRGF0YScsXG4gICAgICAgICAgdXBkYXRlVHJpZ2dlcjogJ19maWx0ZXJEYXRhJ1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgdXBkYXRlcjogZ2V0RGltZW5zaW9uU29ydGVkQmluc1xuICAgIH0sXG4gICAge1xuICAgICAga2V5OiAnZ2V0RG9tYWluJyxcbiAgICAgIHRyaWdnZXJzOiB7XG4gICAgICAgIGxvd2VyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25Mb3dlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHVwcGVyUGVyY2VudGlsZToge1xuICAgICAgICAgIHByb3A6ICdlbGV2YXRpb25VcHBlclBlcmNlbnRpbGUnXG4gICAgICAgIH0sXG4gICAgICAgIHNjYWxlVHlwZToge3Byb3A6ICdlbGV2YXRpb25TY2FsZVR5cGUnfVxuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblZhbHVlRG9tYWluXG4gICAgfSxcbiAgICB7XG4gICAgICBrZXk6ICdnZXRTY2FsZUZ1bmMnLFxuICAgICAgdHJpZ2dlcnM6IHtcbiAgICAgICAgZml4ZWQ6IHtwcm9wOiAnZWxldmF0aW9uRml4ZWQnfSxcbiAgICAgICAgZG9tYWluOiB7cHJvcDogJ2VsZXZhdGlvbkRvbWFpbid9LFxuICAgICAgICByYW5nZToge3Byb3A6ICdlbGV2YXRpb25SYW5nZSd9LFxuICAgICAgICBzY2FsZVR5cGU6IHtwcm9wOiAnZWxldmF0aW9uU2NhbGVUeXBlJ31cbiAgICAgIH0sXG4gICAgICBvblNldDoge1xuICAgICAgICBwcm9wczogJ29uU2V0RWxldmF0aW9uRG9tYWluJ1xuICAgICAgfSxcbiAgICAgIHVwZGF0ZXI6IGdldERpbWVuc2lvblNjYWxlXG4gICAgfVxuICBdLFxuICBnZXRTdWJMYXllckFjY2Vzc29yXG59O1xuXG5leHBvcnQgY29uc3QgZGVmYXVsdERpbWVuc2lvbnMgPSBbZGVmYXVsdENvbG9yRGltZW5zaW9uLCBkZWZhdWx0RWxldmF0aW9uRGltZW5zaW9uXTtcblxuZXhwb3J0IHR5cGUgQ1BVQWdncmVnYXRvclN0YXRlID0ge1xuICBsYXllckRhdGE6IHtkYXRhPzogUmVjb3JkPHN0cmluZywgdW5rbm93bj5bXX07XG4gIGRpbWVuc2lvbnM6IFJlY29yZDxcbiAgICBzdHJpbmcsXG4gICAge1xuICAgICAgZ2V0VmFsdWU/OiAoLi4uYXJnczogdW5rbm93bltdKSA9PiBudW1iZXI7XG4gICAgICBzb3J0ZWRCaW5zPzogQmluU29ydGVyO1xuICAgICAgdmFsdWVEb21haW4/OiBudW1iZXJbXTtcbiAgICAgIHNjYWxlRnVuYz86ICgoLi4uYXJnczogdW5rbm93bltdKSA9PiB1bmtub3duKSAmIHtkb21haW46ICgpID0+IG51bWJlcltdOyBzY2FsZVR5cGU/OiBzdHJpbmd9O1xuICAgIH1cbiAgPjtcbiAgZ2VvSlNPTj86IEdlb0pTT04uRmVhdHVyZUNvbGxlY3Rpb247XG4gIGNsdXN0ZXJCdWlsZGVyPzogQ2x1c3RlckJ1aWxkZXI7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDUFVBZ2dyZWdhdG9yIHtcbiAgc3RhdGljIGdldERpbWVuc2lvblNjYWxlOiBhbnk7XG4gIHN0YXRlOiBDUFVBZ2dyZWdhdG9yU3RhdGU7XG4gIGRpbWVuc2lvblVwZGF0ZXJzOiB7W2tleTogc3RyaW5nXTogRGltZW5zaW9uVHlwZX07XG4gIGFnZ3JlZ2F0aW9uVXBkYXRlcjogQWdncmVnYXRpb25UeXBlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIG9wdHM6IHtcbiAgICAgIGluaXRpYWxTdGF0ZT86IENQVUFnZ3JlZ2F0b3JTdGF0ZTtcbiAgICAgIGRpbWVuc2lvbnM/OiBEaW1lbnNpb25UeXBlW107XG4gICAgICBhZ2dyZWdhdGlvbj86IEFnZ3JlZ2F0aW9uVHlwZTtcbiAgICB9ID0ge31cbiAgKSB7XG4gICAgdGhpcy5zdGF0ZSA9IHtcbiAgICAgIGxheWVyRGF0YToge30sXG4gICAgICBkaW1lbnNpb25zOiB7XG4gICAgICAgIC8vIGNvbG9yOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfSxcbiAgICAgICAgLy8gZWxldmF0aW9uOiB7XG4gICAgICAgIC8vICAgZ2V0VmFsdWU6IG51bGwsXG4gICAgICAgIC8vICAgZG9tYWluOiBudWxsLFxuICAgICAgICAvLyAgIHNvcnRlZEJpbnM6IG51bGwsXG4gICAgICAgIC8vICAgc2NhbGVGdW5jOiBub3BcbiAgICAgICAgLy8gfVxuICAgICAgfSxcbiAgICAgIC4uLm9wdHMuaW5pdGlhbFN0YXRlXG4gICAgfTtcblxuICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnMgPSB7fTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciA9IG9wdHMuYWdncmVnYXRpb24gfHwgZGVmYXVsdEFnZ3JlZ2F0aW9uO1xuXG4gICAgdGhpcy5fYWRkRGltZW5zaW9uKG9wdHMuZGltZW5zaW9ucyB8fCBkZWZhdWx0RGltZW5zaW9ucyk7XG4gIH1cblxuICBzdGF0aWMgZGVmYXVsdERpbWVuc2lvbnMoKSB7XG4gICAgcmV0dXJuIGRlZmF1bHREaW1lbnNpb25zO1xuICB9XG5cbiAgdXBkYXRlQWxsRGltZW5zaW9ucyhwcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG4gICAgLy8gdXBkYXRlIGFsbCBkaW1lbnNpb25zXG4gICAgZm9yIChjb25zdCBkaW0gaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9hY2N1bXVsYXRlVXBkYXRlcnMoMCwgcHJvcHMsIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNbZGltXSk7XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzID0gZGltZW5zaW9uQ2hhbmdlcy5jb25jYXQodXBkYXRlcnMpO1xuICAgIH1cblxuICAgIGRpbWVuc2lvbkNoYW5nZXMuZm9yRWFjaChmID0+IHR5cGVvZiBmID09PSAnZnVuY3Rpb24nICYmIGYoKSk7XG4gIH1cblxuICB1cGRhdGVBZ2dyZWdhdGlvbihwcm9wczogUmVjb3JkPHN0cmluZywgYW55PiwgYWdncmVnYXRpb25QYXJhbXM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCB1cGRhdGVycyA9IHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycygwLCBwcm9wcywgdGhpcy5hZ2dyZWdhdGlvblVwZGF0ZXIpO1xuICAgIHVwZGF0ZXJzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKGFnZ3JlZ2F0aW9uUGFyYW1zKSk7XG4gIH1cblxuICB1cGRhdGVTdGF0ZShcbiAgICBvcHRzOiB7XG4gICAgICBvbGRQcm9wczogUmVjb3JkPHN0cmluZywgYW55PjtcbiAgICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+O1xuICAgICAgY2hhbmdlRmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT47XG4gICAgfSxcbiAgICBhZ2dyZWdhdGlvblBhcmFtczogUmVjb3JkPHN0cmluZywgYW55PlxuICApIHtcbiAgICBjb25zdCB7b2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFnc30gPSBvcHRzO1xuICAgIGxldCBkaW1lbnNpb25DaGFuZ2VzOiBCaW5kZWRVcGRhdGVyVHlwZVtdID0gW107XG5cbiAgICBpZiAoY2hhbmdlRmxhZ3MuZGF0YUNoYW5nZWQpIHtcbiAgICAgIC8vIGlmIGRhdGEgY2hhbmdlZCB1cGRhdGUgZXZlcnl0aGluZ1xuICAgICAgdGhpcy51cGRhdGVBZ2dyZWdhdGlvbihwcm9wcywgYWdncmVnYXRpb25QYXJhbXMpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcblxuICAgICAgcmV0dXJuIHRoaXMuc3RhdGU7XG4gICAgfVxuXG4gICAgY29uc3QgYWdncmVnYXRpb25DaGFuZ2VzID0gdGhpcy5fZ2V0QWdncmVnYXRpb25DaGFuZ2VzKG9sZFByb3BzLCBwcm9wcywgY2hhbmdlRmxhZ3MpO1xuXG4gICAgaWYgKGFnZ3JlZ2F0aW9uQ2hhbmdlcyAmJiBhZ2dyZWdhdGlvbkNoYW5nZXMubGVuZ3RoKSB7XG4gICAgICAvLyBnZXQgYWdncmVnYXRlZERhdGFcbiAgICAgIGFnZ3JlZ2F0aW9uQ2hhbmdlcy5mb3JFYWNoKGYgPT4gdHlwZW9mIGYgPT09ICdmdW5jdGlvbicgJiYgZihhZ2dyZWdhdGlvblBhcmFtcykpO1xuICAgICAgdGhpcy51cGRhdGVBbGxEaW1lbnNpb25zKHByb3BzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gb25seSB1cGRhdGUgZGltZW5zaW9uc1xuICAgICAgZGltZW5zaW9uQ2hhbmdlcyA9IHRoaXMuX2dldERpbWVuc2lvbkNoYW5nZXMob2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncykgfHwgW107XG4gICAgICBkaW1lbnNpb25DaGFuZ2VzLmZvckVhY2goZiA9PiB0eXBlb2YgZiA9PT0gJ2Z1bmN0aW9uJyAmJiBmKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzLnN0YXRlO1xuICB9XG5cbiAgLy8gVXBkYXRlIHByaXZhdGUgc3RhdGVcbiAgc2V0U3RhdGUodXBkYXRlT2JqZWN0OiBQYXJ0aWFsPENQVUFnZ3JlZ2F0b3JTdGF0ZT4pIHtcbiAgICB0aGlzLnN0YXRlID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZSwgdXBkYXRlT2JqZWN0KTtcbiAgfVxuXG4gIC8vIFVwZGF0ZSBwcml2YXRlIHN0YXRlLmRpbWVuc2lvbnNcbiAgX3NldERpbWVuc2lvblN0YXRlKGtleTogc3RyaW5nLCB1cGRhdGVPYmplY3Q6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICB0aGlzLnNldFN0YXRlKHtcbiAgICAgIGRpbWVuc2lvbnM6IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc3RhdGUuZGltZW5zaW9ucywge1xuICAgICAgICBba2V5XTogT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5zdGF0ZS5kaW1lbnNpb25zW2tleV0sIHVwZGF0ZU9iamVjdClcbiAgICAgIH0pXG4gICAgfSk7XG4gIH1cblxuICBfYWRkQWdncmVnYXRpb24oYWdncmVnYXRpb246IEFnZ3JlZ2F0aW9uVHlwZSkge1xuICAgIHRoaXMuYWdncmVnYXRpb25VcGRhdGVyID0gYWdncmVnYXRpb247XG4gIH1cblxuICBfYWRkRGltZW5zaW9uKGRpbWVuc2lvbnM6IERpbWVuc2lvblR5cGVbXSA9IFtdKSB7XG4gICAgZGltZW5zaW9ucy5mb3JFYWNoKGRpbWVuc2lvbiA9PiB7XG4gICAgICBjb25zdCB7a2V5fSA9IGRpbWVuc2lvbjtcbiAgICAgIHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XSA9IGRpbWVuc2lvbjtcbiAgICB9KTtcbiAgfVxuXG4gIF9uZWVkVXBkYXRlU3RlcChcbiAgICBkaW1lbnNpb25TdGVwOiBVcGRhdGVTdGVwc1R5cGUgfCBBZ2dyZWdhdGlvblVwZGF0ZVN0ZXBzVHlwZSxcbiAgICBvbGRQcm9wcyxcbiAgICBwcm9wcyxcbiAgICBjaGFuZ2VGbGFnc1xuICApIHtcbiAgICAvLyB3aGV0aGVyIG5lZWQgdG8gdXBkYXRlIGN1cnJlbnQgZGltZW5zaW9uIHN0ZXBcbiAgICAvLyBkaW1lbnNpb24gc3RlcCBpcyB0aGUgdmFsdWUsIGRvbWFpbiwgc2NhbGVGdW5jdGlvbiBvZiBlYWNoIGRpbWVuc2lvblxuICAgIC8vIGVhY2ggc3RlcCBpcyBhbiBvYmplY3Qgd2l0aCBwcm9wZXJ0aWVzIGxpbmtzIHRvIGxheWVyIHByb3AgYW5kIHdoZXRoZXIgdGhlIHByb3AgaXNcbiAgICAvLyBjb250cm9sbGVkIGJ5IHVwZGF0ZVRyaWdnZXJzXG4gICAgcmV0dXJuIE9iamVjdC52YWx1ZXMoZGltZW5zaW9uU3RlcC50cmlnZ2Vycykuc29tZShpdGVtID0+IHtcbiAgICAgIGlmIChpdGVtLnVwZGF0ZVRyaWdnZXIpIHtcbiAgICAgICAgLy8gY2hlY2sgYmFzZWQgb24gdXBkYXRlVHJpZ2dlcnMgY2hhbmdlIGZpcnN0XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgY2hhbmdlRmxhZ3MudXBkYXRlVHJpZ2dlcnNDaGFuZ2VkICYmXG4gICAgICAgICAgKGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZC5hbGwgfHxcbiAgICAgICAgICAgIGNoYW5nZUZsYWdzLnVwZGF0ZVRyaWdnZXJzQ2hhbmdlZFtpdGVtLnVwZGF0ZVRyaWdnZXJdKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgLy8gZmFsbGJhY2sgdG8gZGlyZWN0IGNvbXBhcmlzb25cbiAgICAgIHJldHVybiBvbGRQcm9wc1tpdGVtLnByb3BdICE9PSBwcm9wc1tpdGVtLnByb3BdO1xuICAgIH0pO1xuICB9XG5cbiAgX2FjY3VtdWxhdGVVcGRhdGVyczxVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGUgfCBBZ2dyZWdhdGlvblR5cGU+KFxuICAgIHN0ZXAsXG4gICAgcHJvcHMsXG4gICAgZGltZW5zaW9uOiBVcGRhdGVyT2JqZWN0VHlwZVxuICApIHtcbiAgICB0eXBlIExvY2FsVXBkYXRlclR5cGUgPSBVcGRhdGVyT2JqZWN0VHlwZSBleHRlbmRzIERpbWVuc2lvblR5cGVcbiAgICAgID8gQmluZGVkVXBkYXRlclR5cGVcbiAgICAgIDogQmluZGVkQWdncmVnYXRlZFVwZGF0ZXJUeXBlO1xuICAgIGNvbnN0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gc3RlcDsgaSA8IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdXBkYXRlciA9IGRpbWVuc2lvbi51cGRhdGVTdGVwc1tpXS51cGRhdGVyO1xuICAgICAgaWYgKHR5cGVvZiB1cGRhdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHVwZGF0ZXJzLnB1c2goXG4gICAgICAgICAgKHVwZGF0ZXIgYXMgVXBkYXRlclR5cGUpLmJpbmQoXG4gICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgZGltZW5zaW9uLnVwZGF0ZVN0ZXBzW2ldLFxuICAgICAgICAgICAgcHJvcHMsXG4gICAgICAgICAgICBkaW1lbnNpb25cbiAgICAgICAgICApIGFzIExvY2FsVXBkYXRlclR5cGVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnM7XG4gIH1cblxuICBfZ2V0QWxsVXBkYXRlcnM8VXBkYXRlck9iamVjdFR5cGUgZXh0ZW5kcyBEaW1lbnNpb25UeXBlIHwgQWdncmVnYXRpb25UeXBlPihcbiAgICBkaW1lbnNpb246IFVwZGF0ZXJPYmplY3RUeXBlLFxuICAgIG9sZFByb3BzLFxuICAgIHByb3BzLFxuICAgIGNoYW5nZUZsYWdzXG4gICkge1xuICAgIHR5cGUgTG9jYWxVcGRhdGVyVHlwZSA9IFVwZGF0ZXJPYmplY3RUeXBlIGV4dGVuZHMgRGltZW5zaW9uVHlwZVxuICAgICAgPyBCaW5kZWRVcGRhdGVyVHlwZVxuICAgICAgOiBCaW5kZWRBZ2dyZWdhdGVkVXBkYXRlclR5cGU7XG4gICAgbGV0IHVwZGF0ZXJzOiBMb2NhbFVwZGF0ZXJUeXBlW10gPSBbXTtcbiAgICBjb25zdCBuZWVkVXBkYXRlU3RlcCA9IGRpbWVuc2lvbi51cGRhdGVTdGVwcy5maW5kSW5kZXgoc3RlcCA9PlxuICAgICAgdGhpcy5fbmVlZFVwZGF0ZVN0ZXAoc3RlcCwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncylcbiAgICApO1xuXG4gICAgaWYgKG5lZWRVcGRhdGVTdGVwID4gLTEpIHtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KHRoaXMuX2FjY3VtdWxhdGVVcGRhdGVycyhuZWVkVXBkYXRlU3RlcCwgcHJvcHMsIGRpbWVuc2lvbikpO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVycztcbiAgfVxuXG4gIF9nZXRBZ2dyZWdhdGlvbkNoYW5nZXMoXG4gICAgb2xkUHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgcHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4sXG4gICAgY2hhbmdlRmxhZ3M6IFJlY29yZDxzdHJpbmcsIGFueT5cbiAgKSB7XG4gICAgY29uc3QgdXBkYXRlcnMgPSB0aGlzLl9nZXRBbGxVcGRhdGVycyh0aGlzLmFnZ3JlZ2F0aW9uVXBkYXRlciwgb2xkUHJvcHMsIHByb3BzLCBjaGFuZ2VGbGFncyk7XG4gICAgcmV0dXJuIHVwZGF0ZXJzLmxlbmd0aCA/IHVwZGF0ZXJzIDogbnVsbDtcbiAgfVxuXG4gIF9nZXREaW1lbnNpb25DaGFuZ2VzKFxuICAgIG9sZFByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIHByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIGNoYW5nZUZsYWdzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+XG4gICkge1xuICAgIGxldCB1cGRhdGVyczogQmluZGVkVXBkYXRlclR5cGVbXSA9IFtdO1xuXG4gICAgLy8gZ2V0IGRpbWVuc2lvbiB0byBiZSB1cGRhdGVkXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgLy8gcmV0dXJuIHRoZSBmaXJzdCB0cmlnZ2VyZWQgdXBkYXRlciBmb3IgZWFjaCBkaW1lbnNpb25cbiAgICAgIGNvbnN0IGRpbWVuc2lvbiA9IHRoaXMuZGltZW5zaW9uVXBkYXRlcnNba2V5XTtcbiAgICAgIGNvbnN0IGRpbWVuc2lvblVwZGF0ZXJzID0gdGhpcy5fZ2V0QWxsVXBkYXRlcnMoZGltZW5zaW9uLCBvbGRQcm9wcywgcHJvcHMsIGNoYW5nZUZsYWdzKTtcbiAgICAgIHVwZGF0ZXJzID0gdXBkYXRlcnMuY29uY2F0KGRpbWVuc2lvblVwZGF0ZXJzKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXBkYXRlcnMubGVuZ3RoID8gdXBkYXRlcnMgOiBudWxsO1xuICB9XG5cbiAgZ2V0VXBkYXRlVHJpZ2dlcnMocHJvcHM6IFJlY29yZDxzdHJpbmcsIGFueT4pIHtcbiAgICBjb25zdCBfdXBkYXRlVHJpZ2dlcnMgPSBwcm9wcy51cGRhdGVUcmlnZ2VycyB8fCB7fTtcbiAgICBjb25zdCB1cGRhdGVUcmlnZ2VycyA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5kaW1lbnNpb25VcGRhdGVycykge1xuICAgICAgY29uc3Qge2FjY2Vzc29yLCB1cGRhdGVTdGVwc306IHthY2Nlc3Nvcjogc3RyaW5nOyB1cGRhdGVTdGVwczogVXBkYXRlU3RlcHNUeXBlW119ID1cbiAgICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1trZXldO1xuICAgICAgLy8gZm9sZCBkaW1lbnNpb24gdHJpZ2dlcnMgaW50byBlYWNoIGFjY2Vzc29yXG4gICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0gPSB7fTtcblxuICAgICAgdXBkYXRlU3RlcHMuZm9yRWFjaChzdGVwID0+IHtcbiAgICAgICAgT2JqZWN0LnZhbHVlcyhzdGVwLnRyaWdnZXJzIHx8IFtdKS5mb3JFYWNoKCh7cHJvcCwgdXBkYXRlVHJpZ2dlcn0pID0+IHtcbiAgICAgICAgICBpZiAodXBkYXRlVHJpZ2dlcikge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBiYXNlZCBvbiB1cGRhdGVUcmlnZ2VyIGUuZy4gZ2V0Q29sb3JWYWx1ZSwgZ2V0Q29sb3JXZWlnaHRcbiAgICAgICAgICAgIC8vIGFuZCB1cGRhdGVUcmlnZ2VycyBpcyBwYXNzZWQgaW4gZnJvbSBsYXllciBwcm9wXG4gICAgICAgICAgICAvLyBmb2xkIHRoZSB1cGRhdGVUcmlnZ2VycyBpbnRvIGFjY2Vzc29yXG4gICAgICAgICAgICBjb25zdCBmcm9tUHJvcCA9IF91cGRhdGVUcmlnZ2Vyc1t1cGRhdGVUcmlnZ2VyXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJvbVByb3AgPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGZyb21Qcm9wKSkge1xuICAgICAgICAgICAgICAvLyBpZiB1cGRhdGVUcmlnZ2VyIGlzIGFuIG9iamVjdCBzcHJlYWQgaXRcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl0sIGZyb21Qcm9wKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZnJvbVByb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICB1cGRhdGVUcmlnZ2Vyc1thY2Nlc3Nvcl1bcHJvcF0gPSBmcm9tUHJvcDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgcHJvcCBpcyBub3QgYmFzZWQgb24gdXBkYXRlVHJpZ2dlclxuICAgICAgICAgICAgdXBkYXRlVHJpZ2dlcnNbYWNjZXNzb3JdW3Byb3BdID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiB1cGRhdGVUcmlnZ2VycztcbiAgfVxuXG4gIGdldFBpY2tpbmdJbmZvKHtpbmZvfToge2luZm86IFJlY29yZDxzdHJpbmcsIGFueT59LCBsYXllclByb3BzOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgY29uc3QgaXNQaWNrZWQgPSBpbmZvLnBpY2tlZCAmJiBpbmZvLmluZGV4ID4gLTE7XG4gICAgbGV0IG9iamVjdDogUmVjb3JkPHN0cmluZywgYW55PiB8IG51bGwgPSBudWxsO1xuICAgIGNvbnN0IGNlbGwgPSBpc1BpY2tlZCA/IHRoaXMuc3RhdGUubGF5ZXJEYXRhLmRhdGE/LltpbmZvLmluZGV4XSA6IG51bGw7XG4gICAgaWYgKGNlbGwpIHtcbiAgICAgIGxldCBiaW5JbmZvID0ge307XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzKSB7XG4gICAgICAgIGNvbnN0IHtnZXRQaWNraW5nSW5mb30gPSB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2tleV07XG4gICAgICAgIGlmICh0eXBlb2YgZ2V0UGlja2luZ0luZm8gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBiaW5JbmZvID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgYmluSW5mbyxcbiAgICAgICAgICAgIGdldFBpY2tpbmdJbmZvKHRoaXMuc3RhdGUuZGltZW5zaW9uc1trZXldLCBjZWxsLCBsYXllclByb3BzKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgb2JqZWN0ID0gT2JqZWN0LmFzc2lnbihiaW5JbmZvLCBjZWxsLCB7XG4gICAgICAgIHBvaW50czogY2VsbC5maWx0ZXJlZFBvaW50cyB8fCBjZWxsLnBvaW50c1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gYWRkIGJpbiAgYW5kICB0byBpbmZvXG4gICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oaW5mbywge1xuICAgICAgcGlja2VkOiBCb29sZWFuKG9iamVjdCksXG4gICAgICAvLyBvdmVycmlkZSBvYmplY3Qgd2l0aCBwaWNrZWQgY2VsbFxuICAgICAgb2JqZWN0XG4gICAgfSk7XG4gIH1cblxuICBnZXRBY2Nlc3NvcihkaW1lbnNpb25LZXk6IHN0cmluZywgbGF5ZXJQcm9wczogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRoaXMuZGltZW5zaW9uVXBkYXRlcnMsIGRpbWVuc2lvbktleSkpIHtcbiAgICAgIHJldHVybiBub3A7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRpbWVuc2lvblVwZGF0ZXJzW2RpbWVuc2lvbktleV0uZ2V0U3ViTGF5ZXJBY2Nlc3NvcihcbiAgICAgIHRoaXMuc3RhdGUuZGltZW5zaW9uc1tkaW1lbnNpb25LZXldLFxuICAgICAgdGhpcy5kaW1lbnNpb25VcGRhdGVyc1tkaW1lbnNpb25LZXldLFxuICAgICAgbGF5ZXJQcm9wc1xuICAgICk7XG4gIH1cbn1cblxuQ1BVQWdncmVnYXRvci5nZXREaW1lbnNpb25TY2FsZSA9IGdldERpbWVuc2lvblNjYWxlO1xuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUlBLElBQUFBLE9BQUEsR0FBQUMsT0FBQTtBQUVBLElBQUFDLE1BQUEsR0FBQUQsT0FBQTtBQUNBLElBQUFFLFVBQUEsR0FBQUYsT0FBQTtBQUFtRSxTQUFBRyxRQUFBQyxDQUFBLEVBQUFDLENBQUEsUUFBQUMsQ0FBQSxHQUFBQyxNQUFBLENBQUFDLElBQUEsQ0FBQUosQ0FBQSxPQUFBRyxNQUFBLENBQUFFLHFCQUFBLFFBQUFDLENBQUEsR0FBQUgsTUFBQSxDQUFBRSxxQkFBQSxDQUFBTCxDQUFBLEdBQUFDLENBQUEsS0FBQUssQ0FBQSxHQUFBQSxDQUFBLENBQUFDLE1BQUEsV0FBQU4sQ0FBQSxXQUFBRSxNQUFBLENBQUFLLHdCQUFBLENBQUFSLENBQUEsRUFBQUMsQ0FBQSxFQUFBUSxVQUFBLE9BQUFQLENBQUEsQ0FBQVEsSUFBQSxDQUFBQyxLQUFBLENBQUFULENBQUEsRUFBQUksQ0FBQSxZQUFBSixDQUFBO0FBQUEsU0FBQVUsY0FBQVosQ0FBQSxhQUFBQyxDQUFBLE1BQUFBLENBQUEsR0FBQVksU0FBQSxDQUFBQyxNQUFBLEVBQUFiLENBQUEsVUFBQUMsQ0FBQSxXQUFBVyxTQUFBLENBQUFaLENBQUEsSUFBQVksU0FBQSxDQUFBWixDQUFBLFFBQUFBLENBQUEsT0FBQUYsT0FBQSxDQUFBSSxNQUFBLENBQUFELENBQUEsT0FBQWEsT0FBQSxXQUFBZCxDQUFBLFFBQUFlLGdCQUFBLGFBQUFoQixDQUFBLEVBQUFDLENBQUEsRUFBQUMsQ0FBQSxDQUFBRCxDQUFBLFNBQUFFLE1BQUEsQ0FBQWMseUJBQUEsR0FBQWQsTUFBQSxDQUFBZSxnQkFBQSxDQUFBbEIsQ0FBQSxFQUFBRyxNQUFBLENBQUFjLHlCQUFBLENBQUFmLENBQUEsS0FBQUgsT0FBQSxDQUFBSSxNQUFBLENB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