eurostat-map 4.11.0 → 4.11.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/323.eurostatmap.min.js +3 -0
- package/build/323.eurostatmap.min.js.map +1 -0
- package/build/eurostatmap.js +268 -73
- package/build/eurostatmap.min.js +2 -2
- package/build/eurostatmap.min.js.map +1 -1
- package/build/package.json +1 -1
- package/build/src_core_dorling_dorling-worker_js.eurostatmap.js +218 -8
- package/build/types/core/decoration/LabelsConfig.d.ts +2 -1
- package/build/types/layers/composition/bar/BarMapConfig.d.ts +7 -0
- package/build/types/layers/composition/coxcomb/CoxcombMapConfig.d.ts +7 -0
- package/build/types/layers/composition/pie/PieMapConfig.d.ts +7 -0
- package/build/types/layers/composition/waffle/WaffleMapConfig.d.ts +7 -0
- package/build/types/layers/proportional-symbol/ProportionalSymbolConfig.d.ts +5 -1
- package/build/vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42.eurostatmap.js +1320 -0
- package/package.json +1 -1
- package/build/215.eurostatmap.min.js +0 -3
- package/build/215.eurostatmap.min.js.map +0 -1
package/build/package.json
CHANGED
|
@@ -9,15 +9,36 @@
|
|
|
9
9
|
root["eurostatmap"] = factory();
|
|
10
10
|
})(self, () => {
|
|
11
11
|
return /******/ (() => { // webpackBootstrap
|
|
12
|
-
|
|
12
|
+
/******/ "use strict";
|
|
13
|
+
/******/ var __webpack_modules__ = ({
|
|
14
|
+
|
|
15
|
+
/***/ "./src/core/dorling/dorling-worker.js"
|
|
13
16
|
/*!********************************************!*\
|
|
14
17
|
!*** ./src/core/dorling/dorling-worker.js ***!
|
|
15
18
|
\********************************************/
|
|
19
|
+
(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
|
20
|
+
|
|
21
|
+
__webpack_require__.r(__webpack_exports__);
|
|
22
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/collide.js");
|
|
23
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/simulation.js");
|
|
24
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/x.js");
|
|
25
|
+
/* harmony import */ var d3_force__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! d3-force */ "./node_modules/d3-force/src/y.js");
|
|
26
|
+
|
|
27
|
+
|
|
16
28
|
onmessage = (event) => {
|
|
17
29
|
const { nodes: inputNodes, radii, strengthX, strengthY, iterations, d3URL } = event.data
|
|
18
30
|
|
|
19
|
-
//
|
|
20
|
-
|
|
31
|
+
// d3-force is bundled directly by default (fast, no network dependency) - importScripts a
|
|
32
|
+
// full runtime d3 build only if the caller explicitly opted into a custom build via
|
|
33
|
+
// dorlingSettings({ workerD3URL }). Previously this always fetched the full d3 v7 bundle from
|
|
34
|
+
// an external CDN on every single Dorling toggle, even though only these 4 named exports are
|
|
35
|
+
// used - the network round-trip (worker spin-up + fetch + cache revalidation each time) was
|
|
36
|
+
// the actual cause of the "cartogram mode is slow now" regression, not the simulation itself.
|
|
37
|
+
let d3Force = { forceSimulation: d3_force__WEBPACK_IMPORTED_MODULE_1__["default"], forceX: d3_force__WEBPACK_IMPORTED_MODULE_2__["default"], forceY: d3_force__WEBPACK_IMPORTED_MODULE_3__["default"], forceCollide: d3_force__WEBPACK_IMPORTED_MODULE_0__["default"] }
|
|
38
|
+
if (d3URL) {
|
|
39
|
+
importScripts(d3URL)
|
|
40
|
+
d3Force = self.d3
|
|
41
|
+
}
|
|
21
42
|
|
|
22
43
|
const nodes = inputNodes.map((n, i) => {
|
|
23
44
|
n.x = n.properties.centroid[0]
|
|
@@ -26,11 +47,11 @@ onmessage = (event) => {
|
|
|
26
47
|
return n
|
|
27
48
|
})
|
|
28
49
|
|
|
29
|
-
const sim =
|
|
50
|
+
const sim = d3Force
|
|
30
51
|
.forceSimulation(nodes)
|
|
31
|
-
.force('x',
|
|
32
|
-
.force('y',
|
|
33
|
-
.force('collide',
|
|
52
|
+
.force('x', d3Force.forceX((d) => d.properties.centroid[0]).strength(strengthX))
|
|
53
|
+
.force('y', d3Force.forceY((d) => d.properties.centroid[1]).strength(strengthY))
|
|
54
|
+
.force('collide', d3Force.forceCollide((d) => d.r).iterations(iterations))
|
|
34
55
|
.stop()
|
|
35
56
|
|
|
36
57
|
const nTicks = Math.ceil(Math.log(sim.alphaMin()) / Math.log(1 - sim.alphaDecay()))
|
|
@@ -46,8 +67,197 @@ onmessage = (event) => {
|
|
|
46
67
|
self.close()
|
|
47
68
|
}
|
|
48
69
|
|
|
70
|
+
|
|
71
|
+
/***/ }
|
|
72
|
+
|
|
73
|
+
/******/ });
|
|
74
|
+
/************************************************************************/
|
|
75
|
+
/******/ // The module cache
|
|
76
|
+
/******/ var __webpack_module_cache__ = {};
|
|
77
|
+
/******/
|
|
78
|
+
/******/ // The require function
|
|
79
|
+
/******/ function __webpack_require__(moduleId) {
|
|
80
|
+
/******/ // Check if module is in cache
|
|
81
|
+
/******/ var cachedModule = __webpack_module_cache__[moduleId];
|
|
82
|
+
/******/ if (cachedModule !== undefined) {
|
|
83
|
+
/******/ return cachedModule.exports;
|
|
84
|
+
/******/ }
|
|
85
|
+
/******/ // Create a new module (and put it into the cache)
|
|
86
|
+
/******/ var module = __webpack_module_cache__[moduleId] = {
|
|
87
|
+
/******/ // no module.id needed
|
|
88
|
+
/******/ // no module.loaded needed
|
|
89
|
+
/******/ exports: {}
|
|
90
|
+
/******/ };
|
|
91
|
+
/******/
|
|
92
|
+
/******/ // Execute the module function
|
|
93
|
+
/******/ if (!(moduleId in __webpack_modules__)) {
|
|
94
|
+
/******/ delete __webpack_module_cache__[moduleId];
|
|
95
|
+
/******/ var e = new Error("Cannot find module '" + moduleId + "'");
|
|
96
|
+
/******/ e.code = 'MODULE_NOT_FOUND';
|
|
97
|
+
/******/ throw e;
|
|
98
|
+
/******/ }
|
|
99
|
+
/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
|
|
100
|
+
/******/
|
|
101
|
+
/******/ // Return the exports of the module
|
|
102
|
+
/******/ return module.exports;
|
|
103
|
+
/******/ }
|
|
104
|
+
/******/
|
|
105
|
+
/******/ // expose the modules object (__webpack_modules__)
|
|
106
|
+
/******/ __webpack_require__.m = __webpack_modules__;
|
|
107
|
+
/******/
|
|
108
|
+
/******/ // the startup function
|
|
109
|
+
/******/ __webpack_require__.x = () => {
|
|
110
|
+
/******/ // Load entry module and return exports
|
|
111
|
+
/******/ // This entry module depends on other loaded chunks and execution need to be delayed
|
|
112
|
+
/******/ var __webpack_exports__ = __webpack_require__.O(undefined, ["vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42"], () => (__webpack_require__("./src/core/dorling/dorling-worker.js")))
|
|
113
|
+
/******/ __webpack_exports__ = __webpack_require__.O(__webpack_exports__);
|
|
114
|
+
/******/ return __webpack_exports__;
|
|
115
|
+
/******/ };
|
|
116
|
+
/******/
|
|
117
|
+
/************************************************************************/
|
|
118
|
+
/******/ /* webpack/runtime/chunk loaded */
|
|
119
|
+
/******/ (() => {
|
|
120
|
+
/******/ var deferred = [];
|
|
121
|
+
/******/ __webpack_require__.O = (result, chunkIds, fn, priority) => {
|
|
122
|
+
/******/ if(chunkIds) {
|
|
123
|
+
/******/ priority = priority || 0;
|
|
124
|
+
/******/ for(var i = deferred.length; i > 0 && deferred[i - 1][2] > priority; i--) deferred[i] = deferred[i - 1];
|
|
125
|
+
/******/ deferred[i] = [chunkIds, fn, priority];
|
|
126
|
+
/******/ return;
|
|
127
|
+
/******/ }
|
|
128
|
+
/******/ var notFulfilled = Infinity;
|
|
129
|
+
/******/ for (var i = 0; i < deferred.length; i++) {
|
|
130
|
+
/******/ var [chunkIds, fn, priority] = deferred[i];
|
|
131
|
+
/******/ var fulfilled = true;
|
|
132
|
+
/******/ for (var j = 0; j < chunkIds.length; j++) {
|
|
133
|
+
/******/ if ((priority & 1 === 0 || notFulfilled >= priority) && Object.keys(__webpack_require__.O).every((key) => (__webpack_require__.O[key](chunkIds[j])))) {
|
|
134
|
+
/******/ chunkIds.splice(j--, 1);
|
|
135
|
+
/******/ } else {
|
|
136
|
+
/******/ fulfilled = false;
|
|
137
|
+
/******/ if(priority < notFulfilled) notFulfilled = priority;
|
|
138
|
+
/******/ }
|
|
139
|
+
/******/ }
|
|
140
|
+
/******/ if(fulfilled) {
|
|
141
|
+
/******/ deferred.splice(i--, 1)
|
|
142
|
+
/******/ var r = fn();
|
|
143
|
+
/******/ if (r !== undefined) result = r;
|
|
144
|
+
/******/ }
|
|
145
|
+
/******/ }
|
|
146
|
+
/******/ return result;
|
|
147
|
+
/******/ };
|
|
148
|
+
/******/ })();
|
|
149
|
+
/******/
|
|
150
|
+
/******/ /* webpack/runtime/define property getters */
|
|
151
|
+
/******/ (() => {
|
|
152
|
+
/******/ // define getter functions for harmony exports
|
|
153
|
+
/******/ __webpack_require__.d = (exports, definition) => {
|
|
154
|
+
/******/ for(var key in definition) {
|
|
155
|
+
/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
|
|
156
|
+
/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
|
|
157
|
+
/******/ }
|
|
158
|
+
/******/ }
|
|
159
|
+
/******/ };
|
|
160
|
+
/******/ })();
|
|
161
|
+
/******/
|
|
162
|
+
/******/ /* webpack/runtime/ensure chunk */
|
|
163
|
+
/******/ (() => {
|
|
164
|
+
/******/ __webpack_require__.f = {};
|
|
165
|
+
/******/ // This file contains only the entry chunk.
|
|
166
|
+
/******/ // The chunk loading function for additional chunks
|
|
167
|
+
/******/ __webpack_require__.e = (chunkId) => {
|
|
168
|
+
/******/ return Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {
|
|
169
|
+
/******/ __webpack_require__.f[key](chunkId, promises);
|
|
170
|
+
/******/ return promises;
|
|
171
|
+
/******/ }, []));
|
|
172
|
+
/******/ };
|
|
173
|
+
/******/ })();
|
|
174
|
+
/******/
|
|
175
|
+
/******/ /* webpack/runtime/get javascript chunk filename */
|
|
176
|
+
/******/ (() => {
|
|
177
|
+
/******/ // This function allow to reference async chunks and chunks that the entrypoint depends on
|
|
178
|
+
/******/ __webpack_require__.u = (chunkId) => {
|
|
179
|
+
/******/ // return url for filenames based on template
|
|
180
|
+
/******/ return "" + chunkId + ".eurostatmap.js";
|
|
181
|
+
/******/ };
|
|
182
|
+
/******/ })();
|
|
183
|
+
/******/
|
|
184
|
+
/******/ /* webpack/runtime/hasOwnProperty shorthand */
|
|
185
|
+
/******/ (() => {
|
|
186
|
+
/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
|
|
187
|
+
/******/ })();
|
|
188
|
+
/******/
|
|
189
|
+
/******/ /* webpack/runtime/make namespace object */
|
|
190
|
+
/******/ (() => {
|
|
191
|
+
/******/ // define __esModule on exports
|
|
192
|
+
/******/ __webpack_require__.r = (exports) => {
|
|
193
|
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
|
194
|
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
|
195
|
+
/******/ }
|
|
196
|
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
|
197
|
+
/******/ };
|
|
198
|
+
/******/ })();
|
|
199
|
+
/******/
|
|
200
|
+
/******/ /* webpack/runtime/publicPath */
|
|
201
|
+
/******/ (() => {
|
|
202
|
+
/******/ __webpack_require__.p = "/build/";
|
|
203
|
+
/******/ })();
|
|
204
|
+
/******/
|
|
205
|
+
/******/ /* webpack/runtime/importScripts chunk loading */
|
|
206
|
+
/******/ (() => {
|
|
207
|
+
/******/ // no baseURI
|
|
208
|
+
/******/
|
|
209
|
+
/******/ // object to store loaded chunks
|
|
210
|
+
/******/ // "1" means "already loaded"
|
|
211
|
+
/******/ var installedChunks = {
|
|
212
|
+
/******/ "src_core_dorling_dorling-worker_js": 1
|
|
213
|
+
/******/ };
|
|
214
|
+
/******/
|
|
215
|
+
/******/ // importScripts chunk loading
|
|
216
|
+
/******/ var installChunk = (data) => {
|
|
217
|
+
/******/ var [chunkIds, moreModules, runtime] = data;
|
|
218
|
+
/******/ for(var moduleId in moreModules) {
|
|
219
|
+
/******/ if(__webpack_require__.o(moreModules, moduleId)) {
|
|
220
|
+
/******/ __webpack_require__.m[moduleId] = moreModules[moduleId];
|
|
221
|
+
/******/ }
|
|
222
|
+
/******/ }
|
|
223
|
+
/******/ if(runtime) runtime(__webpack_require__);
|
|
224
|
+
/******/ while(chunkIds.length)
|
|
225
|
+
/******/ installedChunks[chunkIds.pop()] = 1;
|
|
226
|
+
/******/ parentChunkLoadingFunction(data);
|
|
227
|
+
/******/ };
|
|
228
|
+
/******/ __webpack_require__.f.i = (chunkId, promises) => {
|
|
229
|
+
/******/ // "1" is the signal for "already loaded"
|
|
230
|
+
/******/ if(!installedChunks[chunkId]) {
|
|
231
|
+
/******/ if(true) { // all chunks have JS
|
|
232
|
+
/******/ importScripts(__webpack_require__.p + __webpack_require__.u(chunkId));
|
|
233
|
+
/******/ }
|
|
234
|
+
/******/ }
|
|
235
|
+
/******/ };
|
|
236
|
+
/******/
|
|
237
|
+
/******/ var chunkLoadingGlobal = self["webpackChunkeurostatmap"] = self["webpackChunkeurostatmap"] || [];
|
|
238
|
+
/******/ var parentChunkLoadingFunction = chunkLoadingGlobal.push.bind(chunkLoadingGlobal);
|
|
239
|
+
/******/ chunkLoadingGlobal.push = installChunk;
|
|
240
|
+
/******/
|
|
241
|
+
/******/ // no HMR
|
|
242
|
+
/******/
|
|
243
|
+
/******/ // no HMR manifest
|
|
244
|
+
/******/ })();
|
|
245
|
+
/******/
|
|
246
|
+
/******/ /* webpack/runtime/startup chunk dependencies */
|
|
247
|
+
/******/ (() => {
|
|
248
|
+
/******/ var next = __webpack_require__.x;
|
|
249
|
+
/******/ __webpack_require__.x = () => {
|
|
250
|
+
/******/ return __webpack_require__.e("vendors-node_modules_d3-force_src_collide_js-node_modules_d3-force_src_simulation_js-node_mod-2a5c42").then(next);
|
|
251
|
+
/******/ };
|
|
252
|
+
/******/ })();
|
|
253
|
+
/******/
|
|
254
|
+
/************************************************************************/
|
|
255
|
+
/******/
|
|
256
|
+
/******/ // run startup
|
|
257
|
+
/******/ var __webpack_exports__ = __webpack_require__.x();
|
|
258
|
+
/******/
|
|
49
259
|
/******/ return __webpack_exports__;
|
|
50
260
|
/******/ })()
|
|
51
261
|
;
|
|
52
262
|
});
|
|
53
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7QUNWQTtBQUNBLFlBQVksb0VBQW9FO0FBQ2hGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiXSwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIHdlYnBhY2tVbml2ZXJzYWxNb2R1bGVEZWZpbml0aW9uKHJvb3QsIGZhY3RvcnkpIHtcblx0aWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgPT09ICdvYmplY3QnKVxuXHRcdG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuXHRlbHNlIGlmKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZClcblx0XHRkZWZpbmUoW10sIGZhY3RvcnkpO1xuXHRlbHNlIGlmKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jylcblx0XHRleHBvcnRzW1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG5cdGVsc2Vcblx0XHRyb290W1wiZXVyb3N0YXRtYXBcIl0gPSBmYWN0b3J5KCk7XG59KShzZWxmLCAoKSA9PiB7XG5yZXR1cm4gIiwib25tZXNzYWdlID0gKGV2ZW50KSA9PiB7XHJcbiAgICBjb25zdCB7IG5vZGVzOiBpbnB1dE5vZGVzLCByYWRpaSwgc3RyZW5ndGhYLCBzdHJlbmd0aFksIGl0ZXJhdGlvbnMsIGQzVVJMIH0gPSBldmVudC5kYXRhXHJcblxyXG4gICAgLy8gTG9hZCBEMyBkeW5hbWljYWxseSBpbnRvIHRoZSB3b3JrZXJcclxuICAgIGltcG9ydFNjcmlwdHMoZDNVUkwgfHwgJ2h0dHBzOi8vdW5wa2cuY29tL2QzQDcvZGlzdC9kMy5taW4uanMnKVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzXHJcbiAgICAgICAgLmZvcmNlU2ltdWxhdGlvbihub2RlcylcclxuICAgICAgICAuZm9yY2UoJ3gnLCBkMy5mb3JjZVgoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFswXSkuc3RyZW5ndGgoc3RyZW5ndGhYKSlcclxuICAgICAgICAuZm9yY2UoJ3knLCBkMy5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkMy5mb3JjZUNvbGxpZGUoKGQpID0+IGQucikuaXRlcmF0aW9ucyhpdGVyYXRpb25zKSlcclxuICAgICAgICAuc3RvcCgpXHJcblxyXG4gICAgY29uc3QgblRpY2tzID0gTWF0aC5jZWlsKE1hdGgubG9nKHNpbS5hbHBoYU1pbigpKSAvIE1hdGgubG9nKDEgLSBzaW0uYWxwaGFEZWNheSgpKSlcclxuXHJcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5UaWNrczsgaSsrKSB7XHJcbiAgICAgICAgc2ltLnRpY2soKVxyXG4gICAgICAgIGlmIChpICUgMTAgPT09IDApIHtcclxuICAgICAgICAgICAgcG9zdE1lc3NhZ2UoeyB0eXBlOiAncHJvZ3Jlc3MnLCBwcm9ncmVzczogaSwgdG90YWw6IG5UaWNrcyB9KVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdlbmQnLCBub2RlcyB9KVxyXG4gICAgc2VsZi5jbG9zZSgpXHJcbn1cclxuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
|
|
263
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3JjX2NvcmVfZG9ybGluZ19kb3JsaW5nLXdvcmtlcl9qcy5ldXJvc3RhdG1hcC5qcyIsIm1hcHBpbmdzIjoiQUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxDQUFDO0FBQ0QsTzs7Ozs7Ozs7Ozs7Ozs7O0FDVndFO0FBQ3hFO0FBQ0E7QUFDQSxZQUFZLG9FQUFvRTtBQUNoRjtBQUNBO0FBQ0E7QUFDQSx5QkFBeUIsYUFBYTtBQUN0QztBQUNBO0FBQ0E7QUFDQSxvQkFBb0IsZUFBZSwwREFBUSwwREFBUSxnRUFBYztBQUNqRTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUFvQixZQUFZO0FBQ2hDO0FBQ0E7QUFDQSwwQkFBMEIsOENBQThDO0FBQ3hFO0FBQ0E7QUFDQTtBQUNBLGtCQUFrQixvQkFBb0I7QUFDdEM7QUFDQTs7Ozs7OztVQzFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBOztVQUVBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBOztVQUVBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTs7Ozs7V0N4Q0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSwrQkFBK0Isd0NBQXdDO1dBQ3ZFO1dBQ0E7V0FDQTtXQUNBO1dBQ0EsaUJBQWlCLHFCQUFxQjtXQUN0QztXQUNBO1dBQ0Esa0JBQWtCLHFCQUFxQjtXQUN2QztXQUNBO1dBQ0EsS0FBSztXQUNMO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFOzs7OztXQzNCQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLHlDQUF5Qyx3Q0FBd0M7V0FDakY7V0FDQTtXQUNBLEU7Ozs7O1dDUEE7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxFQUFFO1dBQ0YsRTs7Ozs7V0NSQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1dDSkEsd0Y7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdELEU7Ozs7O1dDTkEsa0M7Ozs7O1dDQUE7O1dBRUE7V0FDQTtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQTtXQUNBLGFBQWE7V0FDYjtXQUNBO1dBQ0E7V0FDQTs7V0FFQTtXQUNBO1dBQ0E7O1dBRUE7O1dBRUEsa0I7Ozs7O1dDcENBO1dBQ0E7V0FDQTtXQUNBLEU7Ozs7O1VFSEE7VUFDQSIsInNvdXJjZXMiOlsid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svdW5pdmVyc2FsTW9kdWxlRGVmaW5pdGlvbiIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC8uL3NyYy9jb3JlL2RvcmxpbmcvZG9ybGluZy13b3JrZXIuanMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2NodW5rIGxvYWRlZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZGVmaW5lIHByb3BlcnR5IGdldHRlcnMiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2Vuc3VyZSBjaHVuayIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvZ2V0IGphdmFzY3JpcHQgY2h1bmsgZmlsZW5hbWUiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL2hhc093blByb3BlcnR5IHNob3J0aGFuZCIsIndlYnBhY2s6Ly9ldXJvc3RhdG1hcC93ZWJwYWNrL3J1bnRpbWUvbWFrZSBuYW1lc3BhY2Ugb2JqZWN0Iiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9wdWJsaWNQYXRoIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svcnVudGltZS9pbXBvcnRTY3JpcHRzIGNodW5rIGxvYWRpbmciLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9ydW50aW1lL3N0YXJ0dXAgY2h1bmsgZGVwZW5kZW5jaWVzIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYmVmb3JlLXN0YXJ0dXAiLCJ3ZWJwYWNrOi8vZXVyb3N0YXRtYXAvd2VicGFjay9zdGFydHVwIiwid2VicGFjazovL2V1cm9zdGF0bWFwL3dlYnBhY2svYWZ0ZXItc3RhcnR1cCJdLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2UgaWYodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnKVxuXHRcdGV4cG9ydHNbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcblx0ZWxzZVxuXHRcdHJvb3RbXCJldXJvc3RhdG1hcFwiXSA9IGZhY3RvcnkoKTtcbn0pKHNlbGYsICgpID0+IHtcbnJldHVybiAiLCJpbXBvcnQgeyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfSBmcm9tICdkMy1mb3JjZSdcclxuXHJcbm9ubWVzc2FnZSA9IChldmVudCkgPT4ge1xyXG4gICAgY29uc3QgeyBub2RlczogaW5wdXROb2RlcywgcmFkaWksIHN0cmVuZ3RoWCwgc3RyZW5ndGhZLCBpdGVyYXRpb25zLCBkM1VSTCB9ID0gZXZlbnQuZGF0YVxyXG5cclxuICAgIC8vIGQzLWZvcmNlIGlzIGJ1bmRsZWQgZGlyZWN0bHkgYnkgZGVmYXVsdCAoZmFzdCwgbm8gbmV0d29yayBkZXBlbmRlbmN5KSAtIGltcG9ydFNjcmlwdHMgYVxyXG4gICAgLy8gZnVsbCBydW50aW1lIGQzIGJ1aWxkIG9ubHkgaWYgdGhlIGNhbGxlciBleHBsaWNpdGx5IG9wdGVkIGludG8gYSBjdXN0b20gYnVpbGQgdmlhXHJcbiAgICAvLyBkb3JsaW5nU2V0dGluZ3MoeyB3b3JrZXJEM1VSTCB9KS4gUHJldmlvdXNseSB0aGlzIGFsd2F5cyBmZXRjaGVkIHRoZSBmdWxsIGQzIHY3IGJ1bmRsZSBmcm9tXHJcbiAgICAvLyBhbiBleHRlcm5hbCBDRE4gb24gZXZlcnkgc2luZ2xlIERvcmxpbmcgdG9nZ2xlLCBldmVuIHRob3VnaCBvbmx5IHRoZXNlIDQgbmFtZWQgZXhwb3J0cyBhcmVcclxuICAgIC8vIHVzZWQgLSB0aGUgbmV0d29yayByb3VuZC10cmlwICh3b3JrZXIgc3Bpbi11cCArIGZldGNoICsgY2FjaGUgcmV2YWxpZGF0aW9uIGVhY2ggdGltZSkgd2FzXHJcbiAgICAvLyB0aGUgYWN0dWFsIGNhdXNlIG9mIHRoZSBcImNhcnRvZ3JhbSBtb2RlIGlzIHNsb3cgbm93XCIgcmVncmVzc2lvbiwgbm90IHRoZSBzaW11bGF0aW9uIGl0c2VsZi5cclxuICAgIGxldCBkM0ZvcmNlID0geyBmb3JjZVNpbXVsYXRpb24sIGZvcmNlWCwgZm9yY2VZLCBmb3JjZUNvbGxpZGUgfVxyXG4gICAgaWYgKGQzVVJMKSB7XHJcbiAgICAgICAgaW1wb3J0U2NyaXB0cyhkM1VSTClcclxuICAgICAgICBkM0ZvcmNlID0gc2VsZi5kM1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IG5vZGVzID0gaW5wdXROb2Rlcy5tYXAoKG4sIGkpID0+IHtcclxuICAgICAgICBuLnggPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMF1cclxuICAgICAgICBuLnkgPSBuLnByb3BlcnRpZXMuY2VudHJvaWRbMV1cclxuICAgICAgICBuLnIgPSByYWRpaVtpXVxyXG4gICAgICAgIHJldHVybiBuXHJcbiAgICB9KVxyXG5cclxuICAgIGNvbnN0IHNpbSA9IGQzRm9yY2VcclxuICAgICAgICAuZm9yY2VTaW11bGF0aW9uKG5vZGVzKVxyXG4gICAgICAgIC5mb3JjZSgneCcsIGQzRm9yY2UuZm9yY2VYKChkKSA9PiBkLnByb3BlcnRpZXMuY2VudHJvaWRbMF0pLnN0cmVuZ3RoKHN0cmVuZ3RoWCkpXHJcbiAgICAgICAgLmZvcmNlKCd5JywgZDNGb3JjZS5mb3JjZVkoKGQpID0+IGQucHJvcGVydGllcy5jZW50cm9pZFsxXSkuc3RyZW5ndGgoc3RyZW5ndGhZKSlcclxuICAgICAgICAuZm9yY2UoJ2NvbGxpZGUnLCBkM0ZvcmNlLmZvcmNlQ29sbGlkZSgoZCkgPT4gZC5yKS5pdGVyYXRpb25zKGl0ZXJhdGlvbnMpKVxyXG4gICAgICAgIC5zdG9wKClcclxuXHJcbiAgICBjb25zdCBuVGlja3MgPSBNYXRoLmNlaWwoTWF0aC5sb2coc2ltLmFscGhhTWluKCkpIC8gTWF0aC5sb2coMSAtIHNpbS5hbHBoYURlY2F5KCkpKVxyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgblRpY2tzOyBpKyspIHtcclxuICAgICAgICBzaW0udGljaygpXHJcbiAgICAgICAgaWYgKGkgJSAxMCA9PT0gMCkge1xyXG4gICAgICAgICAgICBwb3N0TWVzc2FnZSh7IHR5cGU6ICdwcm9ncmVzcycsIHByb2dyZXNzOiBpLCB0b3RhbDogblRpY2tzIH0pXHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHBvc3RNZXNzYWdlKHsgdHlwZTogJ2VuZCcsIG5vZGVzIH0pXHJcbiAgICBzZWxmLmNsb3NlKClcclxufVxyXG4iLCIvLyBUaGUgbW9kdWxlIGNhY2hlXG52YXIgX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fID0ge307XG5cbi8vIFRoZSByZXF1aXJlIGZ1bmN0aW9uXG5mdW5jdGlvbiBfX3dlYnBhY2tfcmVxdWlyZV9fKG1vZHVsZUlkKSB7XG5cdC8vIENoZWNrIGlmIG1vZHVsZSBpcyBpbiBjYWNoZVxuXHR2YXIgY2FjaGVkTW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXTtcblx0aWYgKGNhY2hlZE1vZHVsZSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0cmV0dXJuIGNhY2hlZE1vZHVsZS5leHBvcnRzO1xuXHR9XG5cdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG5cdHZhciBtb2R1bGUgPSBfX3dlYnBhY2tfbW9kdWxlX2NhY2hlX19bbW9kdWxlSWRdID0ge1xuXHRcdC8vIG5vIG1vZHVsZS5pZCBuZWVkZWRcblx0XHQvLyBubyBtb2R1bGUubG9hZGVkIG5lZWRlZFxuXHRcdGV4cG9ydHM6IHt9XG5cdH07XG5cblx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG5cdGlmICghKG1vZHVsZUlkIGluIF9fd2VicGFja19tb2R1bGVzX18pKSB7XG5cdFx0ZGVsZXRlIF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdFx0dmFyIGUgPSBuZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiICsgbW9kdWxlSWQgKyBcIidcIik7XG5cdFx0ZS5jb2RlID0gJ01PRFVMRV9OT1RfRk9VTkQnO1xuXHRcdHRocm93IGU7XG5cdH1cblx0X193ZWJwYWNrX21vZHVsZXNfX1ttb2R1bGVJZF0obW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG5cblx0Ly8gUmV0dXJuIHRoZSBleHBvcnRzIG9mIHRoZSBtb2R1bGVcblx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xufVxuXG4vLyBleHBvc2UgdGhlIG1vZHVsZXMgb2JqZWN0IChfX3dlYnBhY2tfbW9kdWxlc19fKVxuX193ZWJwYWNrX3JlcXVpcmVfXy5tID0gX193ZWJwYWNrX21vZHVsZXNfXztcblxuLy8gdGhlIHN0YXJ0dXAgZnVuY3Rpb25cbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0Ly8gTG9hZCBlbnRyeSBtb2R1bGUgYW5kIHJldHVybiBleHBvcnRzXG5cdC8vIFRoaXMgZW50cnkgbW9kdWxlIGRlcGVuZHMgb24gb3RoZXIgbG9hZGVkIGNodW5rcyBhbmQgZXhlY3V0aW9uIG5lZWQgdG8gYmUgZGVsYXllZFxuXHR2YXIgX193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyh1bmRlZmluZWQsIFtcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIl0sICgpID0+IChfX3dlYnBhY2tfcmVxdWlyZV9fKFwiLi9zcmMvY29yZS9kb3JsaW5nL2Rvcmxpbmctd29ya2VyLmpzXCIpKSlcblx0X193ZWJwYWNrX2V4cG9ydHNfXyA9IF9fd2VicGFja19yZXF1aXJlX18uTyhfX3dlYnBhY2tfZXhwb3J0c19fKTtcblx0cmV0dXJuIF9fd2VicGFja19leHBvcnRzX187XG59O1xuXG4iLCJ2YXIgZGVmZXJyZWQgPSBbXTtcbl9fd2VicGFja19yZXF1aXJlX18uTyA9IChyZXN1bHQsIGNodW5rSWRzLCBmbiwgcHJpb3JpdHkpID0+IHtcblx0aWYoY2h1bmtJZHMpIHtcblx0XHRwcmlvcml0eSA9IHByaW9yaXR5IHx8IDA7XG5cdFx0Zm9yKHZhciBpID0gZGVmZXJyZWQubGVuZ3RoOyBpID4gMCAmJiBkZWZlcnJlZFtpIC0gMV1bMl0gPiBwcmlvcml0eTsgaS0tKSBkZWZlcnJlZFtpXSA9IGRlZmVycmVkW2kgLSAxXTtcblx0XHRkZWZlcnJlZFtpXSA9IFtjaHVua0lkcywgZm4sIHByaW9yaXR5XTtcblx0XHRyZXR1cm47XG5cdH1cblx0dmFyIG5vdEZ1bGZpbGxlZCA9IEluZmluaXR5O1xuXHRmb3IgKHZhciBpID0gMDsgaSA8IGRlZmVycmVkLmxlbmd0aDsgaSsrKSB7XG5cdFx0dmFyIFtjaHVua0lkcywgZm4sIHByaW9yaXR5XSA9IGRlZmVycmVkW2ldO1xuXHRcdHZhciBmdWxmaWxsZWQgPSB0cnVlO1xuXHRcdGZvciAodmFyIGogPSAwOyBqIDwgY2h1bmtJZHMubGVuZ3RoOyBqKyspIHtcblx0XHRcdGlmICgocHJpb3JpdHkgJiAxID09PSAwIHx8IG5vdEZ1bGZpbGxlZCA+PSBwcmlvcml0eSkgJiYgT2JqZWN0LmtleXMoX193ZWJwYWNrX3JlcXVpcmVfXy5PKS5ldmVyeSgoa2V5KSA9PiAoX193ZWJwYWNrX3JlcXVpcmVfXy5PW2tleV0oY2h1bmtJZHNbal0pKSkpIHtcblx0XHRcdFx0Y2h1bmtJZHMuc3BsaWNlKGotLSwgMSk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRmdWxmaWxsZWQgPSBmYWxzZTtcblx0XHRcdFx0aWYocHJpb3JpdHkgPCBub3RGdWxmaWxsZWQpIG5vdEZ1bGZpbGxlZCA9IHByaW9yaXR5O1xuXHRcdFx0fVxuXHRcdH1cblx0XHRpZihmdWxmaWxsZWQpIHtcblx0XHRcdGRlZmVycmVkLnNwbGljZShpLS0sIDEpXG5cdFx0XHR2YXIgciA9IGZuKCk7XG5cdFx0XHRpZiAociAhPT0gdW5kZWZpbmVkKSByZXN1bHQgPSByO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVzdWx0O1xufTsiLCIvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9ucyBmb3IgaGFybW9ueSBleHBvcnRzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLmQgPSAoZXhwb3J0cywgZGVmaW5pdGlvbikgPT4ge1xuXHRmb3IodmFyIGtleSBpbiBkZWZpbml0aW9uKSB7XG5cdFx0aWYoX193ZWJwYWNrX3JlcXVpcmVfXy5vKGRlZmluaXRpb24sIGtleSkgJiYgIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBrZXkpKSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywga2V5LCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZGVmaW5pdGlvbltrZXldIH0pO1xuXHRcdH1cblx0fVxufTsiLCJfX3dlYnBhY2tfcmVxdWlyZV9fLmYgPSB7fTtcbi8vIFRoaXMgZmlsZSBjb250YWlucyBvbmx5IHRoZSBlbnRyeSBjaHVuay5cbi8vIFRoZSBjaHVuayBsb2FkaW5nIGZ1bmN0aW9uIGZvciBhZGRpdGlvbmFsIGNodW5rc1xuX193ZWJwYWNrX3JlcXVpcmVfXy5lID0gKGNodW5rSWQpID0+IHtcblx0cmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKF9fd2VicGFja19yZXF1aXJlX18uZikucmVkdWNlKChwcm9taXNlcywga2V5KSA9PiB7XG5cdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5mW2tleV0oY2h1bmtJZCwgcHJvbWlzZXMpO1xuXHRcdHJldHVybiBwcm9taXNlcztcblx0fSwgW10pKTtcbn07IiwiLy8gVGhpcyBmdW5jdGlvbiBhbGxvdyB0byByZWZlcmVuY2UgYXN5bmMgY2h1bmtzIGFuZCBjaHVua3MgdGhhdCB0aGUgZW50cnlwb2ludCBkZXBlbmRzIG9uXG5fX3dlYnBhY2tfcmVxdWlyZV9fLnUgPSAoY2h1bmtJZCkgPT4ge1xuXHQvLyByZXR1cm4gdXJsIGZvciBmaWxlbmFtZXMgYmFzZWQgb24gdGVtcGxhdGVcblx0cmV0dXJuIFwiXCIgKyBjaHVua0lkICsgXCIuZXVyb3N0YXRtYXAuanNcIjtcbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsIl9fd2VicGFja19yZXF1aXJlX18ucCA9IFwiL2J1aWxkL1wiOyIsIi8vIG5vIGJhc2VVUklcblxuLy8gb2JqZWN0IHRvIHN0b3JlIGxvYWRlZCBjaHVua3Ncbi8vIFwiMVwiIG1lYW5zIFwiYWxyZWFkeSBsb2FkZWRcIlxudmFyIGluc3RhbGxlZENodW5rcyA9IHtcblx0XCJzcmNfY29yZV9kb3JsaW5nX2Rvcmxpbmctd29ya2VyX2pzXCI6IDFcbn07XG5cbi8vIGltcG9ydFNjcmlwdHMgY2h1bmsgbG9hZGluZ1xudmFyIGluc3RhbGxDaHVuayA9IChkYXRhKSA9PiB7XG5cdHZhciBbY2h1bmtJZHMsIG1vcmVNb2R1bGVzLCBydW50aW1lXSA9IGRhdGE7XG5cdGZvcih2YXIgbW9kdWxlSWQgaW4gbW9yZU1vZHVsZXMpIHtcblx0XHRpZihfX3dlYnBhY2tfcmVxdWlyZV9fLm8obW9yZU1vZHVsZXMsIG1vZHVsZUlkKSkge1xuXHRcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tW21vZHVsZUlkXSA9IG1vcmVNb2R1bGVzW21vZHVsZUlkXTtcblx0XHR9XG5cdH1cblx0aWYocnVudGltZSkgcnVudGltZShfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblx0d2hpbGUoY2h1bmtJZHMubGVuZ3RoKVxuXHRcdGluc3RhbGxlZENodW5rc1tjaHVua0lkcy5wb3AoKV0gPSAxO1xuXHRwYXJlbnRDaHVua0xvYWRpbmdGdW5jdGlvbihkYXRhKTtcbn07XG5fX3dlYnBhY2tfcmVxdWlyZV9fLmYuaSA9IChjaHVua0lkLCBwcm9taXNlcykgPT4ge1xuXHQvLyBcIjFcIiBpcyB0aGUgc2lnbmFsIGZvciBcImFscmVhZHkgbG9hZGVkXCJcblx0aWYoIWluc3RhbGxlZENodW5rc1tjaHVua0lkXSkge1xuXHRcdGlmKHRydWUpIHsgLy8gYWxsIGNodW5rcyBoYXZlIEpTXG5cdFx0XHRpbXBvcnRTY3JpcHRzKF9fd2VicGFja19yZXF1aXJlX18ucCArIF9fd2VicGFja19yZXF1aXJlX18udShjaHVua0lkKSk7XG5cdFx0fVxuXHR9XG59O1xuXG52YXIgY2h1bmtMb2FkaW5nR2xvYmFsID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdID0gc2VsZltcIndlYnBhY2tDaHVua2V1cm9zdGF0bWFwXCJdIHx8IFtdO1xudmFyIHBhcmVudENodW5rTG9hZGluZ0Z1bmN0aW9uID0gY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2guYmluZChjaHVua0xvYWRpbmdHbG9iYWwpO1xuY2h1bmtMb2FkaW5nR2xvYmFsLnB1c2ggPSBpbnN0YWxsQ2h1bms7XG5cbi8vIG5vIEhNUlxuXG4vLyBubyBITVIgbWFuaWZlc3QiLCJ2YXIgbmV4dCA9IF9fd2VicGFja19yZXF1aXJlX18ueDtcbl9fd2VicGFja19yZXF1aXJlX18ueCA9ICgpID0+IHtcblx0cmV0dXJuIF9fd2VicGFja19yZXF1aXJlX18uZShcInZlbmRvcnMtbm9kZV9tb2R1bGVzX2QzLWZvcmNlX3NyY19jb2xsaWRlX2pzLW5vZGVfbW9kdWxlc19kMy1mb3JjZV9zcmNfc2ltdWxhdGlvbl9qcy1ub2RlX21vZC0yYTVjNDJcIikudGhlbihuZXh0KTtcbn07IiwiIiwiLy8gcnVuIHN0YXJ0dXBcbnZhciBfX3dlYnBhY2tfZXhwb3J0c19fID0gX193ZWJwYWNrX3JlcXVpcmVfXy54KCk7XG4iLCIiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=
|
|
@@ -60,7 +60,8 @@ export interface LabelsConfig {
|
|
|
60
60
|
backgroundFill?: string
|
|
61
61
|
|
|
62
62
|
/**
|
|
63
|
-
* Fill/stroke color for statistical value
|
|
63
|
+
* Fill/stroke color for label text - applies to statistical value labels and to
|
|
64
|
+
* geographic labels (country names, country codes, seas) alike.
|
|
64
65
|
* @default '#111111'
|
|
65
66
|
*/
|
|
66
67
|
statLabelTextColor?: string
|
|
@@ -78,6 +78,13 @@ export interface BarMapConfig extends MapConfig {
|
|
|
78
78
|
barTotalCode?: string
|
|
79
79
|
/** Stat codes. */
|
|
80
80
|
statCodes?: string[]
|
|
81
|
+
/**
|
|
82
|
+
* Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
|
|
83
|
+
* own polygon, independently of its bar symbol.
|
|
84
|
+
*/
|
|
85
|
+
categoryFillStyle?: { [rawValue: string]: string }
|
|
86
|
+
/** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
|
|
87
|
+
categoryText?: { [rawValue: string]: string }
|
|
81
88
|
/** Legend. */
|
|
82
89
|
legend?: BarChartLegendConfig | false
|
|
83
90
|
}
|
|
@@ -38,6 +38,13 @@ export interface CoxcombMapConfig extends MapConfig {
|
|
|
38
38
|
catColors?: Record<string, string>
|
|
39
39
|
/** Cat labels. */
|
|
40
40
|
catLabels?: Record<string, string>
|
|
41
|
+
/**
|
|
42
|
+
* Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
|
|
43
|
+
* own polygon, independently of its coxcomb symbol.
|
|
44
|
+
*/
|
|
45
|
+
categoryFillStyle?: { [rawValue: string]: string }
|
|
46
|
+
/** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
|
|
47
|
+
categoryText?: { [rawValue: string]: string }
|
|
41
48
|
/** No data fill style. */
|
|
42
49
|
noDataFillStyle?: string
|
|
43
50
|
/** D3 radial scale mapping a stat value to a wedge radius in pixels. */
|
|
@@ -41,6 +41,13 @@ export interface PieMapConfig extends MapConfig {
|
|
|
41
41
|
compositionTotalCode?: string
|
|
42
42
|
/** Stat codes. */
|
|
43
43
|
statCodes?: string[]
|
|
44
|
+
/**
|
|
45
|
+
* Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
|
|
46
|
+
* own polygon, independently of its pie symbol.
|
|
47
|
+
*/
|
|
48
|
+
categoryFillStyle?: { [rawValue: string]: string }
|
|
49
|
+
/** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
|
|
50
|
+
categoryText?: { [rawValue: string]: string }
|
|
44
51
|
/** Legend. */
|
|
45
52
|
legend?: PieChartLegendConfig | false
|
|
46
53
|
}
|
|
@@ -53,6 +53,13 @@ export interface WaffleMapConfig extends MapConfig {
|
|
|
53
53
|
waffleTotalCode?: string
|
|
54
54
|
/** Stat codes. */
|
|
55
55
|
statCodes?: string[]
|
|
56
|
+
/**
|
|
57
|
+
* Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
|
|
58
|
+
* own polygon, independently of its waffle symbol.
|
|
59
|
+
*/
|
|
60
|
+
categoryFillStyle?: { [rawValue: string]: string }
|
|
61
|
+
/** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
|
|
62
|
+
categoryText?: { [rawValue: string]: string }
|
|
56
63
|
/** Legend. */
|
|
57
64
|
legend?: WaffleLegendConfig | false
|
|
58
65
|
}
|
|
@@ -36,7 +36,11 @@ export interface ProportionalSymbolSettings {
|
|
|
36
36
|
* Configuration for proportional symbol maps
|
|
37
37
|
*/
|
|
38
38
|
export interface ProportionalSymbolConfig extends MapConfig {
|
|
39
|
-
/**
|
|
39
|
+
/**
|
|
40
|
+
* Fill styles for categorical exceptions, keyed by raw value - colors the matching region's
|
|
41
|
+
* own polygon, independently of its symbol (which represents a separate, numeric value and
|
|
42
|
+
* doesn't render at all for a region whose value is a category with no magnitude).
|
|
43
|
+
*/
|
|
40
44
|
categoryFillStyle?: { [rawValue: string]: string }
|
|
41
45
|
/** Legend and tooltip labels for categorical exceptions, keyed by raw value. */
|
|
42
46
|
categoryText?: { [rawValue: string]: string }
|