@kiwibit/chart 15.0.1 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -4,6 +4,10 @@
4
4
 
5
5
  ### Latest versions @npm:
6
6
 
7
+ > **v17.x** for Angular >= **17.x**
8
+ >
9
+ > **v16.x** for Angular >= **16.x**
10
+ >
7
11
  > **v15.x** for Angular >= **15.x**
8
12
  >
9
13
  > **v14.x** for Angular >= **14.x**
@@ -53,6 +57,14 @@ npm install @kiwibit/chart
53
57
 
54
58
  # Latest Updates
55
59
 
60
+ ## [17.0.0] - 2024-03-21
61
+ ### Added
62
+ - Upgrade to Angular 17.
63
+
64
+ ## [16.0.0] - 2024-03-05
65
+ ### Added
66
+ - Upgrade to Angular 16.
67
+
56
68
  ## [15.0.1] - 2022-11-30
57
69
  ### Added
58
70
  - Added initial chart configuration if not passed as an input to the chart, in order to suppress the echarts warning.
@@ -1,5 +1,5 @@
1
- /**
2
- * Generated bundle index. Do not edit.
3
- */
4
- export * from './public-api';
1
+ /**
2
+ * Generated bundle index. Do not edit.
3
+ */
4
+ export * from './public-api';
5
5
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2l3aWJpdC1jaGFydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2tpd2liaXQvY2hhcnQvc3JjL2tpd2liaXQtY2hhcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLGNBQWMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9wdWJsaWMtYXBpJztcbiJdfQ==
@@ -0,0 +1,456 @@
1
+ // Angular General
2
+ import { Component, EventEmitter, Input, Output } from '@angular/core';
3
+ import { interval, Subject, takeUntil } from 'rxjs';
4
+ // Kiwi Chart
5
+ import { ADD_POINT_IMG_OFF_DARK, ADD_POINT_IMG_OFF_LIGHT, ADD_POINT_IMG_ON } from './constants/chart.constants';
6
+ import { ShapeVariant, TraceType } from './models/chart.models';
7
+ import { NgStyle } from '@angular/common';
8
+ import { NgxEchartsDirective } from 'ngx-echarts';
9
+ import * as i0 from "@angular/core";
10
+ export class KiwiChartComponent {
11
+ constructor(cd) {
12
+ this.cd = cd;
13
+ /**
14
+ * The Chart Object rendered by the canvas. For all the available options refer
15
+ * to Chart interface in the models folder.
16
+ *
17
+ * @type {(Chart | null)}
18
+ * @memberof KiwiChartComponent
19
+ */
20
+ this.chart = null;
21
+ /**
22
+ * Width and Height of the chart area. The dimensions refer to the father component
23
+ * into which the kiwi-chart is inserted. For example in an empty page the width/height
24
+ * of the chart can take the whole available space in the page.
25
+ *
26
+ * @type {string}
27
+ * @memberof KiwiChartComponent
28
+ */
29
+ this.width = '100%';
30
+ this.height = '480px';
31
+ /**
32
+ * This property simply activates or not the dark theme of the chart
33
+ * defined by the Echarts library. In addition the background color can be custom
34
+ * so that the chart can match the background of the application in which it's used.
35
+ *
36
+ * @type {boolean}
37
+ * @memberof KiwiChartComponent
38
+ */
39
+ this.darkTheme = false;
40
+ /**
41
+ * Output event used to emit to the father component the coordinates
42
+ * of the point clicked in the chart area. This functionality to be used must
43
+ * have the property "clickToAddPoint" in the Chart object set to true.
44
+ *
45
+ * @type {EventEmitter<BasePoint>}
46
+ * @memberof KiwiChartComponent
47
+ */
48
+ this.addPoint = new EventEmitter();
49
+ /**
50
+ * When the cursor hovers the chart area it emits to the father component the
51
+ * x and y coordinates relative to the chart reference system.
52
+ *
53
+ * @type {EventEmitter<BasePoint>}
54
+ * @memberof KiwiChartComponent
55
+ */
56
+ this.chartHover = new EventEmitter();
57
+ /**
58
+ * The object used by echarts to initially create the Chart.
59
+ * Has a default configuration that can be totally overrided using specific properties.
60
+ *
61
+ * @type {EChartsOption}
62
+ * @memberof KiwiChartComponent
63
+ */
64
+ this.chartOption = {
65
+ title: {
66
+ text: 'Kiwi Chart'
67
+ },
68
+ xAxis: {
69
+ name: 'X'
70
+ },
71
+ yAxis: {
72
+ name: 'Y'
73
+ },
74
+ series: [
75
+ {
76
+ type: TraceType.LINE,
77
+ data: [[0, 0]]
78
+ }
79
+ ]
80
+ };
81
+ /**
82
+ * The instance of the Chart.
83
+ *
84
+ * @type {(ECharts | null)}
85
+ * @memberof KiwiChartComponent
86
+ */
87
+ this.echartsInstance = null;
88
+ /**
89
+ * Used to perform actions (as point addition based on the cursor position) on the chart.
90
+ *
91
+ * @type {(zrender.ZRenderType | null)}
92
+ * @memberof KiwiChartComponent
93
+ */
94
+ this.zr = null;
95
+ /**
96
+ * Subject used to unsubscribe once the component gets destroyed.
97
+ *
98
+ * @private
99
+ * @type {Subject<void>}
100
+ * @memberof KiwiChartComponent
101
+ */
102
+ this.destroyed$ = new Subject();
103
+ /**
104
+ * Default number of decimals that can have
105
+ * the values on the x and y axes.
106
+ *
107
+ * @private
108
+ * @type {number}
109
+ * @memberof KiwiChartComponent
110
+ */
111
+ this.MAX_DECIMALS = 3;
112
+ this.legendSelected = {};
113
+ this.isLegendClicked = false;
114
+ }
115
+ ngOnInit() {
116
+ /**
117
+ * This is a manual change detection running every 200ms, the memory should not be much afflicted.
118
+ * It's necessary because when interacting with the chart (for example addPoint),
119
+ * Angular loses the change detection and the point is not added in the chart canvas.
120
+ */
121
+ interval(200)
122
+ .pipe(takeUntil(this.destroyed$))
123
+ .subscribe({
124
+ next: () => {
125
+ this.cd.detectChanges();
126
+ }
127
+ });
128
+ }
129
+ onChartInit(ec) {
130
+ this.echartsInstance = ec;
131
+ this.setupZrEventHandler(ec);
132
+ this.setupLegendEventHandler(ec);
133
+ }
134
+ /**
135
+ * intercept a selection change event on the legend and save the state
136
+ * of all selections on the supporting variable legendSelected
137
+ *
138
+ * @param ec
139
+ */
140
+ setupLegendEventHandler(ec) {
141
+ if (this.echartsInstance != null) {
142
+ this.echartsInstance.on('legendselectchanged', (params) => {
143
+ this.isLegendClicked = true;
144
+ this.legendSelected = params.selected;
145
+ });
146
+ }
147
+ }
148
+ setupZrEventHandler(ec) {
149
+ this.zr = ec.getZr();
150
+ /**
151
+ * Intercepts the click event on the chart (if the clickToAddPoint property is set to true)
152
+ * and emits the point coordinates to the father component.
153
+ */
154
+ this.zr.on('click', params => {
155
+ let option = ec.getOption();
156
+ let active = option?.toolbox?.[0]?.feature?.myAddPoint?.iconStatus;
157
+ if (active && this.chart?.clickToAddPoint) {
158
+ const pointInPixel = [params.offsetX, params.offsetY];
159
+ const pointInGrid = ec.convertFromPixel('grid', pointInPixel);
160
+ if (ec.containPixel('grid', pointInPixel) && pointInGrid) {
161
+ let newPoint = {
162
+ x: +pointInGrid[0].toFixed(3),
163
+ y: +pointInGrid[1].toFixed(3)
164
+ };
165
+ this.addPoint.emit(newPoint);
166
+ }
167
+ }
168
+ });
169
+ /**
170
+ * This is used perform custom actions when the mouse is hovering the chart area
171
+ */
172
+ this.zr.on('mousemove', params => {
173
+ const pointInPixel = [params.offsetX, params.offsetY];
174
+ const pointInGrid = ec.convertFromPixel('grid', pointInPixel);
175
+ /*
176
+ * Logic to emit to the father component the x and y cdinates when the
177
+ * cursor is hovering the chart area .
178
+ */
179
+ if (ec.containPixel('grid', pointInPixel) && pointInGrid) {
180
+ let newPoint = {
181
+ x: +pointInGrid[0].toFixed(3),
182
+ y: +pointInGrid[1].toFixed(3)
183
+ };
184
+ this.chartHover.emit(newPoint);
185
+ }
186
+ /* Logic to change the cursor icon when the "Click to Add Point" feature is active and viceversa. */
187
+ const option = ec.getOption();
188
+ const addPointIsActive = option?.toolbox?.[0]?.feature?.myAddPoint?.iconStatus;
189
+ if (addPointIsActive) {
190
+ this.zr?.setCursorStyle(ec.containPixel('grid', pointInPixel) ? 'copy' : 'default');
191
+ }
192
+ });
193
+ }
194
+ getLegendItemSelection(shape) {
195
+ if (this.isLegendClicked) {
196
+ return this.legendSelected[shape.name] ?? true;
197
+ }
198
+ else {
199
+ return shape.selectedByDefault ?? true;
200
+ }
201
+ }
202
+ ngOnChanges(changes) {
203
+ let chart = changes['chart']?.currentValue;
204
+ if (chart) {
205
+ this.chartOption = {
206
+ title: {
207
+ text: chart.title,
208
+ },
209
+ grid: {
210
+ width: '70%'
211
+ },
212
+ backgroundColor: this.darkTheme ? this.darkThemeBackground ?? '#303030' : 'transparent', tooltip: {
213
+ axisPointer: {
214
+ type: 'cross',
215
+ crossStyle: {
216
+ color: '#bebebe'
217
+ }
218
+ }
219
+ },
220
+ toolbox: {
221
+ orient: 'horizontal',
222
+ left: 'center',
223
+ top: '25px',
224
+ feature: {
225
+ dataZoom: {
226
+ brushStyle: {
227
+ borderColor: '#000',
228
+ borderWidth: 1,
229
+ borderType: 'dashed'
230
+ },
231
+ emphasis: {
232
+ iconStyle: {
233
+ textPosition: 'top'
234
+ }
235
+ }
236
+ },
237
+ saveAsImage: {
238
+ emphasis: {
239
+ iconStyle: {
240
+ textPosition: 'top'
241
+ }
242
+ }
243
+ },
244
+ restore: {
245
+ emphasis: {
246
+ iconStyle: {
247
+ textPosition: 'top'
248
+ }
249
+ }
250
+ },
251
+ myAddPoint: {
252
+ show: chart.clickToAddPoint ?? false,
253
+ title: chart.addPointCustomName ?? 'Add Point',
254
+ icon: this.darkTheme ? ADD_POINT_IMG_OFF_DARK : ADD_POINT_IMG_OFF_LIGHT,
255
+ iconStatus: false,
256
+ onclick: () => {
257
+ let option = this.echartsInstance?.getOption();
258
+ let status = option.toolbox[0].feature.myAddPoint.iconStatus;
259
+ this.echartsInstance?.setOption({
260
+ toolbox: {
261
+ feature: {
262
+ myAddPoint: {
263
+ iconStatus: !status,
264
+ icon: !status ? ADD_POINT_IMG_ON : this.darkTheme ? ADD_POINT_IMG_OFF_DARK : ADD_POINT_IMG_OFF_LIGHT
265
+ }
266
+ }
267
+ }
268
+ });
269
+ },
270
+ emphasis: {
271
+ iconStyle: {
272
+ textPosition: 'top'
273
+ }
274
+ }
275
+ }
276
+ },
277
+ },
278
+ dataZoom: [
279
+ {
280
+ type: 'inside',
281
+ xAxisIndex: [0],
282
+ throttle: 0,
283
+ filterMode: 'none',
284
+ disabled: !chart.scrollToZoom
285
+ },
286
+ {
287
+ type: 'inside',
288
+ yAxisIndex: [0],
289
+ throttle: 0,
290
+ filterMode: 'none',
291
+ disabled: !chart.scrollToZoom
292
+ },
293
+ ],
294
+ legend: {
295
+ inactiveColor: this.darkTheme ? '#8b8b8b' : '#ccc',
296
+ data: chart.shapes.map((shape) => ({
297
+ name: shape.name,
298
+ icon: 'circle',
299
+ })),
300
+ selected: chart.shapes.reduce((accumulator, shape) => ({
301
+ ...accumulator,
302
+ [shape.name]: this.getLegendItemSelection(shape),
303
+ }), {}),
304
+ show: chart.showLegend ?? false,
305
+ orient: 'vertical',
306
+ left: 'right',
307
+ padding: [60, 20],
308
+ type: 'scroll',
309
+ textStyle: {
310
+ width: 120,
311
+ fontWeight: 'bold',
312
+ overflow: 'break'
313
+ }
314
+ },
315
+ xAxis: {
316
+ type: chart.xAxisType,
317
+ name: chart.xAxisUom ? `${chart.xAxisName} [ ${chart.xAxisUom} ]` : chart.xAxisName,
318
+ nameLocation: 'middle',
319
+ nameGap: 30,
320
+ splitLine: {
321
+ show: chart.showGrid ?? true,
322
+ lineStyle: {
323
+ color: this.darkTheme ? '#595959' : '#ccc'
324
+ }
325
+ },
326
+ min: chart.xMin?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
327
+ max: chart.xMax?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
328
+ },
329
+ yAxis: {
330
+ type: chart.yAxisType,
331
+ name: chart.yAxisUom ? `${chart.yAxisName} [ ${chart.yAxisUom} ]` : chart.yAxisName,
332
+ nameLocation: 'middle',
333
+ nameGap: 50,
334
+ splitLine: {
335
+ show: chart.showGrid ?? true,
336
+ lineStyle: {
337
+ color: this.darkTheme ? '#595959' : '#ccc'
338
+ }
339
+ },
340
+ min: chart.yMin?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
341
+ max: chart.yMax?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
342
+ },
343
+ series: this.createSeries(chart.shapes),
344
+ animation: chart.hasAnimations,
345
+ animationDuration: chart.animationDuration ?? 500,
346
+ animationEasing: 'cubicOut'
347
+ };
348
+ }
349
+ }
350
+ createSeries(shapes) {
351
+ let series = [];
352
+ shapes.forEach((shape) => {
353
+ switch (shape.variant) {
354
+ case ShapeVariant.TRACE:
355
+ series.push(this.createTrace(shape));
356
+ break;
357
+ default:
358
+ break;
359
+ }
360
+ });
361
+ return series;
362
+ }
363
+ createTrace(trace) {
364
+ return {
365
+ type: trace.type,
366
+ name: trace.name,
367
+ data: trace.points.map((point) => ({
368
+ value: [point.x, point.y],
369
+ symbol: point.symbol ?? 'circle',
370
+ name: point.name,
371
+ symbolSize: point.symbolSize ?? 2,
372
+ itemStyle: {
373
+ color: point.color
374
+ },
375
+ emphasis: {
376
+ disabled: true
377
+ },
378
+ label: {
379
+ show: true,
380
+ position: 'bottom',
381
+ align: 'left',
382
+ verticalAlign: 'bottom',
383
+ formatter: () => `${point.name ?? ''}`,
384
+ fontSize: 13,
385
+ padding: [0, 0, 0, 10],
386
+ width: 100,
387
+ overflow: 'truncate',
388
+ ellipsis: '...',
389
+ fontWeight: 'bold',
390
+ color: this.darkTheme ? '#fff' : '#000'
391
+ },
392
+ tooltip: {
393
+ formatter: ({ value }) => `
394
+ <strong>${this.chart?.xAxisName}:</strong> ${value[0].toFixed(3).replace(/[.,]000$/, "")}
395
+ <br>
396
+ <strong>${this.chart?.yAxisName}:</strong> ${value[1].toFixed(3).replace(/[.,]000$/, "")}
397
+ `
398
+ }
399
+ })),
400
+ color: trace.color,
401
+ lineStyle: {
402
+ width: trace.width,
403
+ type: trace.style,
404
+ opacity: trace.opacity ?? 1
405
+ },
406
+ smooth: trace.smooth ?? false
407
+ };
408
+ }
409
+ ngOnDestroy() {
410
+ this.destroyed$.next();
411
+ this.destroyed$.complete();
412
+ }
413
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
414
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.1", type: KiwiChartComponent, isStandalone: true, selector: "kiwi-chart", inputs: { chart: "chart", width: "width", height: "height", darkTheme: "darkTheme", darkThemeBackground: "darkThemeBackground" }, outputs: { addPoint: "addPoint", chartHover: "chartHover" }, usesOnChanges: true, ngImport: i0, template: `
415
+ <div
416
+ echarts
417
+ [options]="chartOption"
418
+ [ngStyle]="{
419
+ 'width': width,
420
+ 'height': height
421
+ }"
422
+ (chartInit)="onChartInit($event)"
423
+ [theme]="darkTheme ? 'dark' : ''"
424
+ ></div>
425
+ `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "initOpts", "merge", "autoResize", "loading", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartHighlight", "chartDownplay", "chartSelectChanged", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendLegendSelectAll", "chartLegendLegendInverseSelect", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartGraphRoam", "chartGeoRoam", "chartTreeRoam", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartGeoSelectChanged", "chartGeoSelected", "chartGeoUnselected", "chartAxisAreaSelected", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartGlobalCursorTaken", "chartRendered", "chartFinished"], exportAs: ["echarts"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }] }); }
426
+ }
427
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartComponent, decorators: [{
428
+ type: Component,
429
+ args: [{ selector: 'kiwi-chart', template: `
430
+ <div
431
+ echarts
432
+ [options]="chartOption"
433
+ [ngStyle]="{
434
+ 'width': width,
435
+ 'height': height
436
+ }"
437
+ (chartInit)="onChartInit($event)"
438
+ [theme]="darkTheme ? 'dark' : ''"
439
+ ></div>
440
+ `, standalone: true, imports: [NgxEchartsDirective, NgStyle] }]
441
+ }], ctorParameters: () => [{ type: i0.ChangeDetectorRef }], propDecorators: { chart: [{
442
+ type: Input
443
+ }], width: [{
444
+ type: Input
445
+ }], height: [{
446
+ type: Input
447
+ }], darkTheme: [{
448
+ type: Input
449
+ }], darkThemeBackground: [{
450
+ type: Input
451
+ }], addPoint: [{
452
+ type: Output
453
+ }], chartHover: [{
454
+ type: Output
455
+ }] } });
456
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l3aWJpdC9jaGFydC9zcmMvbGliL2NoYXJ0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0I7QUFDbEIsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN2SSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEQsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hILE9BQU8sRUFBZ0IsWUFBWSxFQUEyQixTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sYUFBYSxDQUFDOztBQW9CbEQsTUFBTSxPQUFPLGtCQUFrQjtJQW1IN0IsWUFDVSxFQUFxQjtRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQWxIL0I7Ozs7OztXQU1HO1FBQ00sVUFBSyxHQUFpQixJQUFJLENBQUM7UUFFcEM7Ozs7Ozs7V0FPRztRQUNNLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDdkIsV0FBTSxHQUFXLE9BQU8sQ0FBQztRQUVsQzs7Ozs7OztXQU9HO1FBQ00sY0FBUyxHQUFZLEtBQUssQ0FBQztRQUdwQzs7Ozs7OztXQU9HO1FBQ08sYUFBUSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO1FBRTVFOzs7Ozs7V0FNRztRQUNPLGVBQVUsR0FBNEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUU5RTs7Ozs7O1dBTUc7UUFDSCxnQkFBVyxHQUFrQjtZQUMzQixLQUFLLEVB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RyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBVUksUUFBUTtzQkFBakIsTUFBTTtnQkFTRyxVQUFVO3NCQUFuQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQW5ndWxhciBHZW5lcmFsXHJcbmltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIE91dHB1dCwgU2ltcGxlQ2hhbmdlcyB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBpbnRlcnZhbCwgU3ViamVjdCwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XHJcbi8vIEVjaGFydHNcclxuaW1wb3J0IHsgQ3VzdG9tU2VyaWVzT3B0aW9uLCBFQ2hhcnRzLCBFQ2hhcnRzT3B0aW9uLCBMaW5lU2VyaWVzT3B0aW9uLCBTY2F0dGVyU2VyaWVzT3B0aW9uLCB6cmVuZGVyIH0gZnJvbSAnZWNoYXJ0cyc7XHJcbi8vIEtpd2kgQ2hhcnRcclxuaW1wb3J0IHsgQUREX1BPSU5UX0lNR19PRkZfREFSSywgQUREX1BPSU5UX0lNR19PRkZfTElHSFQsIEFERF9QT0lOVF9JTUdfT04gfSBmcm9tICcuL2NvbnN0YW50cy9jaGFydC5jb25zdGFudHMnO1xyXG5pbXBvcnQgeyBDaGFydCwgU2hhcGUsIFNoYXBlVmFyaWFudCwgVHJhY2UsIFBvaW50LCBCYXNlUG9pbnQsIFRyYWNlVHlwZSB9IGZyb20gJy4vbW9kZWxzL2NoYXJ0Lm1vZGVscyc7XHJcbmltcG9ydCB7IE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ3hFY2hhcnRzRGlyZWN0aXZlIH0gZnJvbSAnbmd4LWVjaGFydHMnO1xyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2tpd2ktY2hhcnQnLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8ZGl2IFxyXG4gICAgICBlY2hhcnRzIFxyXG4gICAgICBbb3B0aW9uc109XCJjaGFydE9wdGlvblwiIFxyXG4gICAgICBbbmdTdHlsZV09XCJ7XHJcbiAgICAgICAgJ3dpZHRoJzogd2lkdGgsXHJcbiAgICAgICAgJ2hlaWdodCc6IGhlaWdodFxyXG4gICAgICB9XCJcclxuICAgICAgKGNoYXJ0SW5pdCk9XCJvbkNoYXJ0SW5pdCgkZXZlbnQpXCJcclxuICAgICAgW3RoZW1lXT1cImRhcmtUaGVtZSA/ICdkYXJrJyA6ICcnXCJcclxuICAgID48L2Rpdj4gXHJcbiAgYCxcclxuICBzdHlsZXM6IFtgXHJcbiAgYF0sXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICBpbXBvcnRzOiBbTmd4RWNoYXJ0c0RpcmVjdGl2ZSwgTmdTdHlsZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEtpd2lDaGFydENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3kge1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgQ2hhcnQgT2JqZWN0IHJlbmRlcmVkIGJ5IHRoZSBjYW52YXMuIEZvciBhbGwgdGhlIGF2YWlsYWJsZSBvcHRpb25zIHJlZmVyIFxyXG4gICAqIHRvIENoYXJ0IGludGVyZmFjZSBpbiB0aGUgbW9kZWxzIGZvbGRlci5cclxuICAgKlxyXG4gICAqIEB0eXBlIHsoQ2hhcnQgfCBudWxsKX1cclxuICAgKiBAbWVtYmVyb2YgS2l3aUNoYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgQElucHV0KCkgY2hhcnQ6IENoYXJ0IHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdpZHRoIGFuZCBIZWlnaHQgb2YgdGhlIGNoYXJ0IGFyZWEuIFRoZSBkaW1lbnNpb25zIHJlZmVyIHRvIHRoZSBmYXRoZXIgY29tcG9uZW50IFxyXG4gICAqIGludG8gd2hpY2ggdGhlIGtpd2ktY2hhcnQgaXMgaW5zZXJ0ZWQuIEZvciBleGFtcGxlIGluIGFuIGVtcHR5IHBhZ2UgdGhlIHdpZHRoL2hlaWdodCBcclxuICAgKiBvZiB0aGUgY2hhcnQgY2FuIHRha2UgdGhlIHdob2xlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgcGFnZS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtzdHJpbmd9XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIHdpZHRoOiBzdHJpbmcgPSAnMTAwJSc7XHJcbiAgQElucHV0KCkgaGVpZ2h0OiBzdHJpbmcgPSAnNDgwcHgnO1xyXG5cclxuICAvKipcclxuICAgKiBUaGlzIHByb3BlcnR5IHNpbXBseSBhY3RpdmF0ZXMgb3Igbm90IHRoZSBkYXJrIHRoZW1lIG9mIHRoZSBjaGFydFxyXG4gICAqIGRlZmluZWQgYnkgdGhlIEVjaGFydHMgbGlicmFyeS4gSW4gYWRkaXRpb24gdGhlIGJhY2tncm91bmQgY29sb3IgY2FuIGJlIGN1c3RvbVxyXG4gICAqIHNvIHRoYXQgdGhlIGNoYXJ0IGNhbiBtYXRjaCB0aGUgYmFja2dyb3VuZCBvZiB0aGUgYXBwbGljYXRpb24gaW4gd2hpY2ggaXQncyB1c2VkLlxyXG4gICAqXHJcbiAgICogQHR5cGUge2Jvb2xlYW59XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGRhcmtUaGVtZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIEBJbnB1dCgpIGRhcmtUaGVtZUJhY2tncm91bmQ/OiBzdHJpbmc7XHJcblxyXG4gIC8qKlxyXG4gICAqIE91dHB1dCBldmVudCB1c2VkIHRvIGVtaXQgdG8gdGhlIGZhdGhlciBjb21wb25lbnQgdGhlIGNvb3JkaW5hdGVzXHJcbiAgICogb2YgdGhlIHBvaW50IGNsaWNrZWQgaW4gdGhlIGNoYXJ0IGFyZWEuIFRoaXMgZnVuY3Rpb25hbGl0eSB0byBiZSB1c2VkIG11c3RcclxuICAgKiBoYXZlIHRoZSBwcm9wZXJ0eSBcImNsaWNrVG9BZGRQb2ludFwiIGluIHRoZSBDaGFydCBvYmplY3Qgc2V0IHRvIHRydWUuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7RXZlbnRFbWl0dGVyPEJhc2VQb2ludD59XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBPdXRwdXQoKSBhZGRQb2ludDogRXZlbnRFbWl0dGVyPEJhc2VQb2ludD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJhc2VQb2ludD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogV2hlbiB0aGUgY3Vyc29yIGhvdmVycyB0aGUgY2hhcnQgYXJlYSBpdCBlbWl0cyB0byB0aGUgZmF0aGVyIGNvbXBvbmVudCB0aGVcclxuICAgKiB4IGFuZCB5IGNvb3JkaW5hdGVzIHJlbGF0aXZlIHRvIHRoZSBjaGFydCByZWZlcmVuY2Ugc3lzdGVtLlxyXG4gICAqXHJcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+fVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgY2hhcnRIb3ZlcjogRXZlbnRFbWl0dGVyPEJhc2VQb2ludD4gPSBuZXcgRXZlbnRFbWl0dGVyPEJhc2VQb2ludD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIG9iamVjdCB1c2VkIGJ5IGVjaGFydHMgdG8gaW5pdGlhbGx5IGNyZWF0ZSB0aGUgQ2hhcnQuXHJcbiAgICogSGFzIGEgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlIHRvdGFsbHkgb3ZlcnJpZGVkIHVzaW5nIHNwZWNpZmljIHByb3BlcnRpZXMuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7RUNoYXJ0c09wdGlvbn1cclxuICAgKiBAbWVtYmVyb2YgS2l3aUNoYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgY2hhcnRPcHRpb246IEVDaGFydHNPcHRpb24gPSB7XHJcbiAgICB0aXRsZToge1xyXG4gICAgICB0ZXh0OiAnS2l3aSBDaGFydCdcclxuICAgIH0sXHJcbiAgICB4QXhpczoge1xyXG4gICAgICBuYW1lOiAnWCdcclxuICAgIH0sXHJcbiAgICB5QXhpczoge1xyXG4gICAgICBuYW1lOiAnWSdcclxuICAgIH0sXHJcbiAgICBzZXJpZXM6IFtcclxuICAgICAge1xyXG4gICAgICAgIHR5cGU6IFRyYWNlVHlwZS5MSU5FLFxyXG4gICAgICAgIGRhdGE6IFtbMCwgMF1dXHJcbiAgICAgIH1cclxuICAgIF1cclxuICB9O1xyXG5cclxuICAvKipcclxuICAgKiBUaGUgaW5zdGFuY2Ugb2YgdGhlIENoYXJ0LlxyXG4gICAqXHJcbiAgICogQHR5cGUgeyhFQ2hhcnRzIHwgbnVsbCl9XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGVjaGFydHNJbnN0YW5jZTogRUNoYXJ0cyB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBVc2VkIHRvIHBlcmZvcm0gYWN0aW9ucyAoYXMgcG9pbnQgYWRkaXRpb24gYmFzZWQgb24gdGhlIGN1cnNvciBwb3NpdGlvbikgb24gdGhlIGNoYXJ0LlxyXG4gICAqXHJcbiAgICogQHR5cGUgeyh6cmVuZGVyLlpSZW5kZXJUeXBlIHwgbnVsbCl9XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIHpyOiB6cmVuZGVyLlpSZW5kZXJUeXBlIHwgbnVsbCA9IG51bGw7XHJcblxyXG4gIC8qKlxyXG4gICAqIFN1YmplY3QgdXNlZCB0byB1bnN1YnNjcmliZSBvbmNlIHRoZSBjb21wb25lbnQgZ2V0cyBkZXN0cm95ZWQuXHJcbiAgICpcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIEB0eXBlIHtTdWJqZWN0PHZvaWQ+fVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIGRlc3Ryb3llZCQ6IFN1YmplY3Q8dm9pZD4gPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICAvKipcclxuICAgKiBEZWZhdWx0IG51bWJlciBvZiBkZWNpbWFscyB0aGF0IGNhbiBoYXZlXHJcbiAgICogdGhlIHZhbHVlcyBvbiB0aGUgeCBhbmQgeSBheGVzLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdHlwZSB7bnVtYmVyfVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBwcml2YXRlIHJlYWRvbmx5IE1BWF9ERUNJTUFMUzogbnVtYmVyID0gMztcclxuXHJcbiAgcHJpdmF0ZSBsZWdlbmRTZWxlY3RlZDogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIH0gPSB7fTtcclxuICBwcml2YXRlIGlzTGVnZW5kQ2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgY2Q6IENoYW5nZURldGVjdG9yUmVmXHJcbiAgKSB7IH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICAvKiogXHJcbiAgICAgKiBUaGlzIGlzIGEgbWFudWFsIGNoYW5nZSBkZXRlY3Rpb24gcnVubmluZyBldmVyeSAyMDBtcywgdGhlIG1lbW9yeSBzaG91bGQgbm90IGJlIG11Y2ggYWZmbGljdGVkLlxyXG4gICAgICogSXQncyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIGludGVyYWN0aW5nIHdpdGggdGhlIGNoYXJ0IChmb3IgZXhhbXBsZSBhZGRQb2ludCksXHJcbiAgICAgKiBBbmd1bGFyIGxvc2VzIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCB0aGUgcG9pbnQgaXMgbm90IGFkZGVkIGluIHRoZSBjaGFydCBjYW52YXMuXHJcbiAgICAgKi9cclxuICAgIGludGVydmFsKDIwMClcclxuICAgICAgLnBpcGUoXHJcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJClcclxuICAgICAgKVxyXG4gICAgICAuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAoKSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmNkLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb25DaGFydEluaXQoZWM6IEVDaGFydHMpIHtcclxuICAgIHRoaXMuZWNoYXJ0c0luc3RhbmNlID0gZWM7XHJcbiAgICB0aGlzLnNldHVwWnJFdmVudEhhbmRsZXIoZWMpO1xyXG4gICAgdGhpcy5zZXR1cExlZ2VuZEV2ZW50SGFuZGxlcihlYyk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBpbnRlcmNlcHQgYSBzZWxlY3Rpb24gY2hhbmdlIGV2ZW50IG9uIHRoZSBsZWdlbmQgYW5kIHNhdmUgdGhlIHN0YXRlIFxyXG4gICAqIG9mIGFsbCBzZWxlY3Rpb25zIG9uIHRoZSBzdXBwb3J0aW5nIHZhcmlhYmxlIGxlZ2VuZFNlbGVjdGVkXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGVjIFxyXG4gICAqL1xyXG4gIHNldHVwTGVnZW5kRXZlbnRIYW5kbGVyKGVjOiBFQ2hhcnRzKSB7XHJcbiAgICBpZiAodGhpcy5lY2hhcnRzSW5zdGFuY2UgIT0gbnVsbCkge1xyXG4gICAgICB0aGlzLmVjaGFydHNJbnN0YW5jZS5vbignbGVnZW5kc2VsZWN0Y2hhbmdlZCcsIChwYXJhbXM6IGFueSkgPT4ge1xyXG4gICAgICAgIHRoaXMuaXNMZWdlbmRDbGlja2VkID0gdHJ1ZTtcclxuICAgICAgICB0aGlzLmxlZ2VuZFNlbGVjdGVkID0gcGFyYW1zLnNlbGVjdGVkO1xyXG4gICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBzZXR1cFpyRXZlbnRIYW5kbGVyKGVjOiBFQ2hhcnRzKSB7XHJcbiAgICB0aGlzLnpyID0gZWMuZ2V0WnIoKTtcclxuICAgIC8qKiBcclxuICAgICAqIEludGVyY2VwdHMgdGhlIGNsaWNrIGV2ZW50IG9uIHRoZSBjaGFydCAoaWYgdGhlIGNsaWNrVG9BZGRQb2ludCBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSlcclxuICAgICAqIGFuZCBlbWl0cyB0aGUgcG9pbnQgY29vcmRpbmF0ZXMgdG8gdGhlIGZhdGhlciBjb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHRoaXMuenIub24oJ2NsaWNrJywgcGFyYW1zID0+IHtcclxuICAgICAgbGV0IG9wdGlvbjogYW55ID0gZWMuZ2V0T3B0aW9uKCk7XHJcbiAgICAgIGxldCBhY3RpdmUgPSBvcHRpb24/LnRvb2xib3g/LlswXT8uZmVhdHVyZT8ubXlBZGRQb2ludD8uaWNvblN0YXR1cztcclxuICAgICAgaWYgKGFjdGl2ZSAmJiB0aGlzLmNoYXJ0Py5jbGlja1RvQWRkUG9pbnQpIHtcclxuICAgICAgICBjb25zdCBwb2ludEluUGl4ZWwgPSBbcGFyYW1zLm9mZnNldFgsIHBhcmFtcy5vZmZzZXRZXTtcclxuICAgICAgICBjb25zdCBwb2ludEluR3JpZCA9IGVjLmNvbnZlcnRGcm9tUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpO1xyXG4gICAgICAgIGlmIChlYy5jb250YWluUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpICYmIHBvaW50SW5HcmlkKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UG9pbnQ6IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSA9IHtcclxuICAgICAgICAgICAgeDogK3BvaW50SW5HcmlkWzBdLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIHk6ICtwb2ludEluR3JpZFsxXS50b0ZpeGVkKDMpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5hZGRQb2ludC5lbWl0KG5ld1BvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLyoqIFxyXG4gICAgICogVGhpcyBpcyB1c2VkIHBlcmZvcm0gY3VzdG9tIGFjdGlvbnMgd2hlbiB0aGUgbW91c2UgaXMgaG92ZXJpbmcgdGhlIGNoYXJ0IGFyZWFcclxuICAgICAqL1xyXG4gICAgdGhpcy56ci5vbignbW91c2Vtb3ZlJywgcGFyYW1zID0+IHtcclxuICAgICAgY29uc3QgcG9pbnRJblBpeGVsID0gW3BhcmFtcy5vZmZzZXRYLCBwYXJhbXMub2Zmc2V0WV07XHJcbiAgICAgIGNvbnN0IHBvaW50SW5HcmlkID0gZWMuY29udmVydEZyb21QaXhlbCgnZ3JpZCcsIHBvaW50SW5QaXhlbCk7XHJcbiAgICAgIC8qIFxyXG4gICAgICAgKiBMb2dpYyB0byBlbWl0IHRvIHRoZSBmYXRoZXIgY29tcG9uZW50IHRoZSB4IGFuZCB5IGNkaW5hdGVzIHdoZW4gdGhlXHJcbiAgICAgICAqIGN1cnNvciBpcyBob3ZlcmluZyB0aGUgY2hhcnQgYXJlYSAuXHJcbiAgICAgICAqL1xyXG4gICAgICBpZiAoZWMuY29udGFpblBpeGVsKCdncmlkJywgcG9pbnRJblBpeGVsKSAmJiBwb2ludEluR3JpZCkge1xyXG4gICAgICAgIGxldCBuZXdQb2ludDogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9ID0ge1xyXG4gICAgICAgICAgeDogK3BvaW50SW5HcmlkWzBdLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICB5OiArcG9pbnRJbkdyaWRbMV0udG9GaXhlZCgzKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jaGFydEhvdmVyLmVtaXQobmV3UG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8qIExvZ2ljIHRvIGNoYW5nZSB0aGUgY3Vyc29yIGljb24gd2hlbiB0aGUgXCJDbGljayB0byBBZGQgUG9pbnRcIiBmZWF0dXJlIGlzIGFjdGl2ZSBhbmQgdmljZXZlcnNhLiAqL1xyXG4gICAgICBjb25zdCBvcHRpb246IGFueSA9IGVjLmdldE9wdGlvbigpO1xyXG4gICAgICBjb25zdCBhZGRQb2ludElzQWN0aXZlID0gb3B0aW9uPy50b29sYm94Py5bMF0/LmZlYXR1cmU/Lm15QWRkUG9pbnQ/Lmljb25TdGF0dXM7XHJcbiAgICAgIGlmIChhZGRQb2ludElzQWN0aXZlKSB7XHJcbiAgICAgICAgdGhpcy56cj8uc2V0Q3Vyc29yU3R5bGUoXHJcbiAgICAgICAgICBlYy5jb250YWluUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpID8gJ2NvcHknIDogJ2RlZmF1bHQnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRMZWdlbmRJdGVtU2VsZWN0aW9uKHNoYXBlOiBTaGFwZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuaXNMZWdlbmRDbGlja2VkKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLmxlZ2VuZFNlbGVjdGVkW3NoYXBlLm5hbWUgYXMgc3RyaW5nXSA/PyB0cnVlO1xyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHJldHVybiBzaGFwZS5zZWxlY3RlZEJ5RGVmYXVsdCA/PyB0cnVlXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBsZXQgY2hhcnQ6IENoYXJ0ID0gY2hhbmdlc1snY2hhcnQnXT8uY3VycmVudFZhbHVlO1xyXG4gICAgaWYgKGNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnRPcHRpb24gPSB7XHJcbiAgICAgICAgdGl0bGU6IHtcclxuICAgICAgICAgIHRleHQ6IGNoYXJ0LnRpdGxlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZDoge1xyXG4gICAgICAgICAgd2lkdGg6ICc3MCUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuZGFya1RoZW1lID8gdGhpcy5kYXJrVGhlbWVCYWNrZ3JvdW5kID8/ICcjMzAzMDMwJyA6ICd0cmFuc3BhcmVudCcsIHRvb2x0aXA6IHtcclxuICAgICAgICAgIGF4aXNQb2ludGVyOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjcm9zcycsXHJcbiAgICAgICAgICAgIGNyb3NzU3R5bGU6IHtcclxuICAgICAgICAgICAgICBjb2xvcjogJyNiZWJlYmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xib3g6IHtcclxuICAgICAgICAgIG9yaWVudDogJ2hvcml6b250YWwnLFxyXG4gICAgICAgICAgbGVmdDogJ2NlbnRlcicsXHJcbiAgICAgICAgICB0b3A6ICcyNXB4JyxcclxuICAgICAgICAgIGZlYXR1cmU6IHtcclxuICAgICAgICAgICAgZGF0YVpvb206IHtcclxuICAgICAgICAgICAgICBicnVzaFN0eWxlOiB7XHJcbiAgICAgICAgICAgICAgICBib3JkZXJDb2xvcjogJyMwMDAnLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyV2lkdGg6IDEsXHJcbiAgICAgICAgICAgICAgICBib3JkZXJUeXBlOiAnZGFzaGVkJ1xyXG4gICAgICAgICAgICAgIH0sXHJcbiAgICAgICAgICAgICAgZW1waGFzaXM6IHtcclxuICAgICAgICAgICAgICAgIGljb25TdHlsZToge1xyXG4gICAgICAgICAgICAgICAgICB0ZXh0UG9zaXRpb246ICd0b3AnXHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzYXZlQXNJbWFnZToge1xyXG4gICAgICAgICAgICAgIGVtcGhhc2lzOiB7XHJcbiAgICAgICAgICAgICAgICBpY29uU3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiAndG9wJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgcmVzdG9yZToge1xyXG4gICAgICAgICAgICAgIGVtcGhhc2lzOiB7XHJcbiAgICAgICAgICAgICAgICBpY29uU3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiAndG9wJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSxcclxuICAgICAgICAgICAgbXlBZGRQb2ludDoge1xyXG4gICAgICAgICAgICAgIHNob3c6IGNoYXJ0LmNsaWNrVG9BZGRQb2ludCA/PyBmYWxzZSxcclxuICAgICAgICAgICAgICB0aXRsZTogY2hhcnQuYWRkUG9pbnRDdXN0b21OYW1lID8/ICdBZGQgUG9pbnQnLFxyXG4gICAgICAgICAgICAgIGljb246IHRoaXMuZGFya1RoZW1lID8gQUREX1BPSU5UX0lNR19PRkZfREFSSyA6IEFERF9QT0lOVF9JTUdfT0ZGX0xJR0hULFxyXG4gICAgICAgICAgICAgIGljb25TdGF0dXM6IGZhbHNlLFxyXG4gICAgICAgICAgICAgIG9uY2xpY2s6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIGxldCBvcHRpb246IGFueSA9IHRoaXMuZWNoYXJ0c0luc3RhbmNlPy5nZXRPcHRpb24oKTtcclxuICAgICAgICAgICAgICAgIGxldCBzdGF0dXMgPSBvcHRpb24udG9vbGJveFswXS5mZWF0dXJlLm15QWRkUG9pbnQuaWNvblN0YXR1cztcclxuICAgICAgICAgICAgICAgIHRoaXMuZWNoYXJ0c0luc3RhbmNlPy5zZXRPcHRpb24oe1xyXG4gICAgICAgICAgICAgICAgICB0b29sYm94OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZToge1xyXG4gICAgICAgICAgICAgICAgICAgICAgbXlBZGRQb2ludDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uU3RhdHVzOiAhc3RhdHVzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBpY29uOiAhc3RhdHVzID8gQUREX1BPSU5UX0lNR19PTiA6IHRoaXMuZGFya1RoZW1lID8gQUREX1BPSU5UX0lNR19PRkZfREFSSyA6IEFERF9QT0lOVF9JTUdfT0ZGX0xJR0hUXHJcbiAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICAgIGVtcGhhc2lzOiB7XHJcbiAgICAgICAgICAgICAgICBpY29uU3R5bGU6IHtcclxuICAgICAgICAgICAgICAgICAgdGV4dFBvc2l0aW9uOiAndG9wJ1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGFab29tOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnNpZGUnLFxyXG4gICAgICAgICAgICB4QXhpc0luZGV4OiBbMF0sXHJcbiAgICAgICAgICAgIHRocm90dGxlOiAwLFxyXG4gICAgICAgICAgICBmaWx0ZXJNb2RlOiAnbm9uZScsXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY2hhcnQuc2Nyb2xsVG9ab29tXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0eXBlOiAnaW5zaWRlJyxcclxuICAgICAgICAgICAgeUF4aXNJbmRleDogWzBdLFxyXG4gICAgICAgICAgICB0aHJvdHRsZTogMCxcclxuICAgICAgICAgICAgZmlsdGVyTW9kZTogJ25vbmUnLFxyXG4gICAgICAgICAgICBkaXNhYmxlZDogIWNoYXJ0LnNjcm9sbFRvWm9vbVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICBdLFxyXG4gICAgICAgIGxlZ2VuZDoge1xyXG4gICAgICAgICAgaW5hY3RpdmVDb2xvcjogdGhpcy5kYXJrVGhlbWUgPyAnIzhiOGI4YicgOiAnI2NjYycsXHJcbiAgICAgICAgICBkYXRhOiBjaGFydC5zaGFwZXMubWFwKFxyXG4gICAgICAgICAgICAoc2hhcGU6IFNoYXBlKSA9PiAoe1xyXG4gICAgICAgICAgICAgIG5hbWU6IHNoYXBlLm5hbWUsXHJcbiAgICAgICAgICAgICAgaWNvbjogJ2NpcmNsZScsXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGNoYXJ0LnNoYXBlcy5yZWR1Y2UoXHJcbiAgICAgICAgICAgIChhY2N1bXVsYXRvciwgc2hhcGU6IFNoYXBlKSA9PiAoe1xyXG4gICAgICAgICAgICAgIC4uLmFjY3VtdWxhdG9yLFxyXG4gICAgICAgICAgICAgIFtzaGFwZS5uYW1lIGFzIHN0cmluZ106IHRoaXMuZ2V0TGVnZW5kSXRlbVNlbGVjdGlvbihzaGFwZSksXHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICB7fSksXHJcbiAgICAgICAgICBzaG93OiBjaGFydC5zaG93TGVnZW5kID8/IGZhbHNlLFxyXG4gICAgICAgICAgb3JpZW50OiAndmVydGljYWwnLFxyXG4gICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcclxuICAgICAgICAgIHBhZGRpbmc6IFs2MCwgMjBdLFxyXG4gICAgICAgICAgdHlwZTogJ3Njcm9sbCcsXHJcbiAgICAgICAgICB0ZXh0U3R5bGU6IHtcclxuICAgICAgICAgICAgd2lkdGg6IDEyMCxcclxuICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxyXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2JyZWFrJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeEF4aXM6IHtcclxuICAgICAgICAgIHR5cGU6IGNoYXJ0LnhBeGlzVHlwZSxcclxuICAgICAgICAgIG5hbWU6IGNoYXJ0LnhBeGlzVW9tID8gYCR7Y2hhcnQueEF4aXNOYW1lfSBbICR7Y2hhcnQueEF4aXNVb219IF1gIDogY2hhcnQueEF4aXNOYW1lLFxyXG4gICAgICAgICAgbmFtZUxvY2F0aW9uOiAnbWlkZGxlJyxcclxuICAgICAgICAgIG5hbWVHYXA6IDMwLFxyXG4gICAgICAgICAgc3BsaXRMaW5lOiB7XHJcbiAgICAgICAgICAgIHNob3c6IGNoYXJ0LnNob3dHcmlkID8/IHRydWUsXHJcbiAgICAgICAgICAgIGxpbmVTdHlsZToge1xyXG4gICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmRhcmtUaGVtZSA/ICcjNTk1OTU5JyA6ICcjY2NjJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbWluOiBjaGFydC54TWluPy50b0ZpeGVkKGNoYXJ0Lm1heEF4ZXNEZWNpbWFscyA/PyB0aGlzLk1BWF9ERUNJTUFMUyksXHJcbiAgICAgICAgICBtYXg6IGNoYXJ0LnhNYXg/LnRvRml4ZWQoY2hhcnQubWF4QXhlc0RlY2ltYWxzID8/IHRoaXMuTUFYX0RFQ0lNQUxTKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHlBeGlzOiB7XHJcbiAgICAgICAgICB0eXBlOiBjaGFydC55QXhpc1R5cGUsXHJcbiAgICAgICAgICBuYW1lOiBjaGFydC55QXhpc1VvbSA/IGAke2NoYXJ0LnlBeGlzTmFtZX0gWyAke2NoYXJ0LnlBeGlzVW9tfSBdYCA6IGNoYXJ0LnlBeGlzTmFtZSxcclxuICAgICAgICAgIG5hbWVMb2NhdGlvbjogJ21pZGRsZScsXHJcbiAgICAgICAgICBuYW1lR2FwOiA1MCxcclxuICAgICAgICAgIHNwbGl0TGluZToge1xyXG4gICAgICAgICAgICBzaG93OiBjaGFydC5zaG93R3JpZCA/PyB0cnVlLFxyXG4gICAgICAgICAgICBsaW5lU3R5bGU6IHtcclxuICAgICAgICAgICAgICBjb2xvcjogdGhpcy5kYXJrVGhlbWUgPyAnIzU5NTk1OScgOiAnI2NjYydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG1pbjogY2hhcnQueU1pbj8udG9GaXhlZChjaGFydC5tYXhBeGVzRGVjaW1hbHMgPz8gdGhpcy5NQVhfREVDSU1BTFMpLFxyXG4gICAgICAgICAgbWF4OiBjaGFydC55TWF4Py50b0ZpeGVkKGNoYXJ0Lm1heEF4ZXNEZWNpbWFscyA/PyB0aGlzLk1BWF9ERUNJTUFMUyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXJpZXM6IHRoaXMuY3JlYXRlU2VyaWVzKGNoYXJ0LnNoYXBlcyksXHJcbiAgICAgICAgYW5pbWF0aW9uOiBjaGFydC5oYXNBbmltYXRpb25zLFxyXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBjaGFydC5hbmltYXRpb25EdXJhdGlvbiA/PyA1MDAsXHJcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWNPdXQnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTZXJpZXMoc2hhcGVzOiBTaGFwZVtdKTogQXJyYXk8TGluZVNlcmllc09wdGlvbiB8IEN1c3RvbVNlcmllc09wdGlvbiB8IFNjYXR0ZXJTZXJpZXNPcHRpb24+IHtcclxuICAgIGxldCBzZXJpZXM6IEFycmF5PExpbmVTZXJpZXNPcHRpb24gfCBDdXN0b21TZXJpZXNPcHRpb24gfCBTY2F0dGVyU2VyaWVzT3B0aW9uPiA9IFtdO1xyXG4gICAgc2hhcGVzLmZvckVhY2goXHJcbiAgICAgIChzaGFwZTogU2hhcGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHNoYXBlLnZhcmlhbnQpIHtcclxuICAgICAgICAgIGNhc2UgU2hhcGVWYXJpYW50LlRSQUNFOlxyXG4gICAgICAgICAgICBzZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRyYWNlKHNoYXBlIGFzIFRyYWNlKSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gc2VyaWVzO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlVHJhY2UodHJhY2U6IFRyYWNlKTogTGluZVNlcmllc09wdGlvbiB8IFNjYXR0ZXJTZXJpZXNPcHRpb24ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdHlwZTogdHJhY2UudHlwZSxcclxuICAgICAgbmFtZTogdHJhY2UubmFtZSxcclxuICAgICAgZGF0YTogdHJhY2UucG9pbnRzLm1hcChcclxuICAgICAgICAocG9pbnQ6IFBvaW50KSA9PiAoe1xyXG4gICAgICAgICAgdmFsdWU6IFtwb2ludC54LCBwb2ludC55XSxcclxuICAgICAgICAgIHN5bWJvbDogcG9pbnQuc3ltYm9sID8/ICdjaXJjbGUnLFxyXG4gICAgICAgICAgbmFtZTogcG9pbnQubmFtZSxcclxuICAgICAgICAgIHN5bWJvbFNpemU6IHBvaW50LnN5bWJvbFNpemUgPz8gMixcclxuICAgICAgICAgIGl0ZW1TdHlsZToge1xyXG4gICAgICAgICAgICBjb2xvcjogcG9pbnQuY29sb3JcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlbXBoYXNpczoge1xyXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgIGZvcm1hdHRlcjogKCkgPT4gYCR7cG9pbnQubmFtZSA/PyAnJ31gLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogMTMsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFswLCAwLCAwLCAxMF0sXHJcbiAgICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiAndHJ1bmNhdGUnLFxyXG4gICAgICAgICAgICBlbGxpcHNpczogJy4uLicsXHJcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcclxuICAgICAgICAgICAgY29sb3I6IHRoaXMuZGFya1RoZW1lID8gJyNmZmYnIDogJyMwMDAnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICBmb3JtYXR0ZXI6ICh7IHZhbHVlIH06IHsgdmFsdWU6IG51bWJlcltdIH0pID0+IGBcclxuICAgICAgICAgICAgICA8c3Ryb25nPiR7dGhpcy5jaGFydD8ueEF4aXNOYW1lfTo8L3N0cm9uZz4gJHt2YWx1ZVswXS50b0ZpeGVkKDMpLnJlcGxhY2UoL1suLF0wMDAkLywgXCJcIil9XHJcbiAgICAgICAgICAgICAgPGJyPlxyXG4gICAgICAgICAgICAgIDxzdHJvbmc+JHt0aGlzLmNoYXJ0Py55QXhpc05hbWV9Ojwvc3Ryb25nPiAke3ZhbHVlWzFdLnRvRml4ZWQoMykucmVwbGFjZSgvWy4sXTAwMCQvLCBcIlwiKX1cclxuICAgICAgICAgICAgYFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIGNvbG9yOiB0cmFjZS5jb2xvcixcclxuICAgICAgbGluZVN0eWxlOiB7XHJcbiAgICAgICAgd2lkdGg6IHRyYWNlLndpZHRoLFxyXG4gICAgICAgIHR5cGU6IHRyYWNlLnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IHRyYWNlLm9wYWNpdHkgPz8gMVxyXG4gICAgICB9LFxyXG4gICAgICBzbW9vdGg6IHRyYWNlLnNtb290aCA/PyBmYWxzZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -0,0 +1,41 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { NgModule } from '@angular/core';
3
+ import { KiwiChartComponent } from './chart.component';
4
+ import { NgxEchartsModule } from 'ngx-echarts';
5
+ import * as echarts from 'echarts/core';
6
+ import { TitleComponent, TooltipComponent, GridComponent, LegendComponent, DataZoomComponent, ToolboxComponent } from 'echarts/components';
7
+ import { LineChart, ScatterChart } from 'echarts/charts';
8
+ import { CanvasRenderer } from 'echarts/renderers';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "ngx-echarts";
11
+ echarts.use([
12
+ TitleComponent,
13
+ TooltipComponent,
14
+ GridComponent,
15
+ LineChart,
16
+ CanvasRenderer,
17
+ LegendComponent,
18
+ DataZoomComponent,
19
+ ToolboxComponent,
20
+ ScatterChart
21
+ ]);
22
+ export class KiwiChartModule {
23
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
24
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartModule, imports: [CommonModule, i1.NgxEchartsModule, KiwiChartComponent], exports: [KiwiChartComponent] }); }
25
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartModule, imports: [CommonModule,
26
+ NgxEchartsModule.forRoot({ echarts })] }); }
27
+ }
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.1", ngImport: i0, type: KiwiChartModule, decorators: [{
29
+ type: NgModule,
30
+ args: [{
31
+ imports: [
32
+ CommonModule,
33
+ NgxEchartsModule.forRoot({ echarts }),
34
+ KiwiChartComponent
35
+ ],
36
+ exports: [
37
+ KiwiChartComponent
38
+ ]
39
+ }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l3aWJpdC9jaGFydC9zcmMvbGliL2NoYXJ0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0ksT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ1YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixZQUFZO0NBQ2IsQ0FBQyxDQUFDO0FBYUgsTUFBTSxPQUFPLGVBQWU7OEdBQWYsZUFBZTsrR0FBZixlQUFlLFlBUnBCLFlBQVksdUJBRVosa0JBQWtCLGFBR2xCLGtCQUFrQjsrR0FHYixlQUFlLFlBUnBCLFlBQVk7WUFDWixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQzs7MkZBT2hDLGVBQWU7a0JBVjNCLFFBQVE7bUJBQUM7b0JBQ04sT0FBTyxFQUFFO3dCQUNMLFlBQVk7d0JBQ1osZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUM7d0JBQ3JDLGtCQUFrQjtxQkFDckI7b0JBQ0QsT0FBTyxFQUFFO3dCQUNMLGtCQUFrQjtxQkFDckI7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBLaXdpQ2hhcnRDb21wb25lbnQgfSBmcm9tICcuL2NoYXJ0LmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IE5neEVjaGFydHNNb2R1bGUgfSBmcm9tICduZ3gtZWNoYXJ0cyc7XHJcbmltcG9ydCAqIGFzIGVjaGFydHMgZnJvbSAnZWNoYXJ0cy9jb3JlJztcclxuaW1wb3J0IHsgVGl0bGVDb21wb25lbnQsIFRvb2x0aXBDb21wb25lbnQsIEdyaWRDb21wb25lbnQsIExlZ2VuZENvbXBvbmVudCwgRGF0YVpvb21Db21wb25lbnQsIFRvb2xib3hDb21wb25lbnQgfSBmcm9tICdlY2hhcnRzL2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBMaW5lQ2hhcnQsIFNjYXR0ZXJDaGFydCB9IGZyb20gJ2VjaGFydHMvY2hhcnRzJztcclxuaW1wb3J0IHsgQ2FudmFzUmVuZGVyZXIgfSBmcm9tICdlY2hhcnRzL3JlbmRlcmVycyc7XHJcbmVjaGFydHMudXNlKFtcclxuICBUaXRsZUNvbXBvbmVudCxcclxuICBUb29sdGlwQ29tcG9uZW50LFxyXG4gIEdyaWRDb21wb25lbnQsXHJcbiAgTGluZUNoYXJ0LFxyXG4gIENhbnZhc1JlbmRlcmVyLFxyXG4gIExlZ2VuZENvbXBvbmVudCxcclxuICBEYXRhWm9vbUNvbXBvbmVudCxcclxuICBUb29sYm94Q29tcG9uZW50LFxyXG4gIFNjYXR0ZXJDaGFydFxyXG5dKTtcclxuXHJcblxyXG5ATmdNb2R1bGUoe1xyXG4gICAgaW1wb3J0czogW1xyXG4gICAgICAgIENvbW1vbk1vZHVsZSxcclxuICAgICAgICBOZ3hFY2hhcnRzTW9kdWxlLmZvclJvb3QoeyBlY2hhcnRzIH0pLFxyXG4gICAgICAgIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAgXSxcclxuICAgIGV4cG9ydHM6IFtcclxuICAgICAgICBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEtpd2lDaGFydE1vZHVsZSB7IH1cclxuIl19
@@ -1,4 +1,4 @@
1
- export const ADD_POINT_IMG_OFF_LIGHT = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADkUlEQVR4nO2bz0sUYRjHv8/otviDGDuWrhKdskBaQZi57MmLgVpIkJ06bH9AEdF/kF46dEg726liBSGwBEFnTm0oaF3s4lhdh1BhNuTpsDPLu+MvmHXm0ZzP6X2feWfn+3x33nf3fXlfIOV8Q0dd7O3tvaDr+igzDxPRLQCdANqSkRaZHQBbzPyViEqu65bW19crhzU+1ADDMO4S0QSAq3GoTJAfAJ5alvXhoItN4cDY2FiTruuTRPQSQEfc6hLgEoB7uVyu3XGcBQCsXtxngJ/846TUJYjR3d3dsrm5+VkN1nUB/7V/F7rRI6IpAG9bW1vX5ufnd+JW2giDg4Ntu7u7N5h5HEARQFa9rmna6NLSUimo1wzwB7zvqO/zP4loaHl5eTVu4XFgGEYfEc0BuKKEN1zX7Q0GRi2I6ro+ivrkvbOcPADYtr3CzLcBeEr4WkdHx3BQqRnAzMPqzUQ0dZaTD7BtewXAGzWm5lozgIjyaqO9vb2Z2NUlRziX/qCgKcHLaotsNvstTkVJkslk1kKh2pigGtCutlhcXNyOU1SSHJBLLVcN55xmqQcbhjFERNMA9gA8sizro4QOsTdA07TXqI47XQCmxHRIPZiZO5Vql5SOcz8GpAZIC5AmNUBagDSpAdICpEkNkBYgTWqAtABpUgOkBUgTeT3An89PoX7JOTKmafLxrfZDRFvMXIy6nhD5DfDn8yeSfCP40+rI6wnnvgtENoCZi0S0dZJiIuIQUTHqzZHHAL/PRV7JCfd5y7KO3KsQF2kXkBYgTWqAtABpUgOkBUiTGiAtQJrUAGkB0qQGSAuQJjVA6sGhqbQjpUNyg0SwntDQfL5RxPYINbqecFKkY4BSrttLVygU2vGfMDAwcDEU+hMUVAN+qS08z7sep6gkaW5uDufyOyiom6XLagtN0x7ErCtJxkP1L0FB3SxdCjUqGobRF6eqJPBzqPuVYeZarjUDXNctoXrAKCBLRHNn2QTlwMQFJbzhed5sUKlbijZN8w6A96HPqQCYBjCTyWTWTvsm6kKh0F6pVG4S0X1Uv3k1eTDziG3bBxsAAKZpTgJ4ErtSAZj5hW3bz9TYvlNjjuMs5HK5VgBmYsoSgIgmLMt6juOOzQFgx3E+9fT0rDJzP6rn7s4yG8z80LKsVwglDxxzdDafz2daWlpG/DM2eVSPzp72P0jbALYAlJm55HnebLlc/istKuW08g8wjAev/BoR3wAAAABJRU5ErkJggg==";
2
- export const ADD_POINT_IMG_OFF_DARK = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADgUlEQVR4nO2bz04TURTGvzNtaQOVB1BgYVhZDbSUDixZYwLoTlzXB5CI8QUM4ANQXeOCqCkJiUuWtpNCIaG6gRWoeyx/CmGOC5hyZ/izmDJzgM5vdefMafudr/femd65BQKaG7rqZKVSadndORhjohGAUwB1AGjzSZtbdgHeBmiFmPNt7bF8IpE4vCz5UgMKhZXnBJoG+KE3On2CsEkmv8kM9n27+LSD+fn5UFdX9xQBr71X5x8E/tCvpyaJyFTjmjPxLhYPAAyaMAqr751xWw846fb44sioMSPHbH5ubY2s9/T07HqstSHW1tba9vaOHmuaNg4gC0bUlkA0puvJfP3QalQqlZbqv8NfjjH/G4RhXU+tea7cAwyj3MsmLwJ4oIQ34veiCWtirA+B3Z2DMVvxhNptLh4AMpnkKmn0FISaEu6uVg9HrIO6ASeXujOYkbvNxVtkMslVmPhkj5rnDQDQp6aETG3OU2U+wsT2Whhpq6kacF/NqdYiP72V5R/7+7F1e4Tqc4JqQFxNGRpKVD1V5SMX1FKv9dx9QLMRlvrgYrE8TMwfGTjWGK/6B1PfJXTI9QDmWT6ZdzpNQk5KhuQQ6FDanVIimn4OCAyQFiBNYIC0AGkCA6QFSBMYIC1AmsAAaQHSBAZIC5DG9XpAsVgeBnMO9iVn1xQLK+zypdsaI+t2PcF9D2CexTUV3yAdjawnNP0QcG2AxsgC2L5GLW7ZIpOzbl/seg44HXOuV3KcY14fSF25V8ErgiEgLUCawABpAdIEBkgLkCYwQFqANIEB0gKkCQyQFiBNYIDgZ6s/pbekRIgZoKwnNPR7vlHE9gg1up5wXQRzgNK27aVbWqrEcUcoFArtjtCO1VAN+KNmxKNHj7wU5S8RRy3812qpBiyrKWbIfOmpJh8hpnF7ACWrqZ0lcR52soZR7vVWmvcYRrkXBNtVhpnqtdYNaGuP5UHYPMtClE1evM0mKH+YaFHCG+GwuWAd2JaijR/Lz5joq+N9DsH4yMRz+/ux9Zu+iXppqRJvba09gYkXp9+8WjwYNDowkLzYAAAwCsszDJrwQav/EKZ0PfVWDZ27D+jXU5MAz/inyieYpjOZ5Dtn+NKnMcVieRTMMwC6PRXmPRsMmlC7vcqVj6NKpVLk+Dg0CpgjzNRHJxucb/oNUpWBbSJeZqZ8OGwupNPpI2lRATeV/+HNFJvPZJXuAAAAAElFTkSuQmCC";
3
- export const ADD_POINT_IMG_ON = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADjUlEQVR4nO2by08TURTGvzNAK49oDCsRNqbFxPogtsQ/AhNAowsxLksTlxIxrtwZwJUJsa07E1wQNSUh8X+wrQFDNSklMQGVjRgMj7TIHBcww50WWEyZOTzmt7pz7pn2O1/n3pne3gIeJxvarzM0nvM1LPl7GegGcB3gVgCN7kizzSpACwA+E3NqrbmUyt0NlfZK3tOAyKv8bRANA7jghEoXmSPw43Ss/cNunRUG3Bnnmu+/C0NMeOS8Nvdg8IvsYnAQz0hX41p54nEsHgAINBA5N/e8Mq6wfdm/K8spElNC1/S3G/XrM18eXFt1VGmVXH0z3Vi3Xn+ZGH0ARQH41X4m6s32B1LGsWlAaDznq1/yfYMy5hn4UQO961Ps4rQb4g+azmS+Q9dpkoDzZpBQWD9bChkTozkEGpb8vbBOeMWjXDwApKPtU5rGNwEUzSAjcOqPr9s41Hbi6FZPJqbEUS7eIB1tnwLhtSXIqDQA4LA1Z3PMYW2uoW/CUguBIkZbvQu0qEnr+r+vDutyjSKXZqwRNucE1YAmNSX3MLTiqCoX2aUWs9aK54CTRq3UG4cT+S7SKQnCJjTqz0QDHyV0iF0BxBQHoQVAG3ROSOmQHAKtSrtNSsSJnwM8A6QFSOMZIC1AGs8AaQHSeAZIC5DGM0BagDSeAdICpLG9HhBO5LvAlLAsOVdBJD7LNk9dgEZRu+sJtq8AYoofVPFV0lrNesKJHwL2DdAoCmDh4KTYZp62fgKzhe05YHvM2V7JKR/zmVhw370KTuENAWkB0ngGSAuQxjNAWoA0ngHSAqTxDJAWII1ngLQAaTwDBN9b/So9LyVCzoCd9YSqvs9Xi9geoWrXEw4Kbw5Q2pa9dKHRXBOOCTdezp4uC/01GqoBP9WMeq32kpOi3GSjFmW10C+jpRhAWWsO3XdUlYtoNehTjxmcMfuMBjGnYIGincl8h9PinKYzme8Aw3KXIcCs1TRgrbmUAjCn5Pl1nSaPsgnGHyYA+MwgocC0PLFzqJ4Qz99i0Puy1ymBkNQ3MVbk0sxh30QdGs01Ndb4ruiEe9ufvK8spScTC+5uAACE4/kRAg04LVQCAobSseATNVbxHJBdDA4CNOKeLJcgGk4vBp5WhPfKDycKPQQeASPgrDKHIRTAGFAve2v3PoQTmTrgTA8Y3QSEsbXB+bA/IK0AWGAgS0CKaXki2x/ZkBblcVj5D1vBAfS1aXiGAAAAAElFTkSuQmCC";
1
+ export const ADD_POINT_IMG_OFF_LIGHT = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADkUlEQVR4nO2bz0sUYRjHv8/otviDGDuWrhKdskBaQZi57MmLgVpIkJ06bH9AEdF/kF46dEg726liBSGwBEFnTm0oaF3s4lhdh1BhNuTpsDPLu+MvmHXm0ZzP6X2feWfn+3x33nf3fXlfIOV8Q0dd7O3tvaDr+igzDxPRLQCdANqSkRaZHQBbzPyViEqu65bW19crhzU+1ADDMO4S0QSAq3GoTJAfAJ5alvXhoItN4cDY2FiTruuTRPQSQEfc6hLgEoB7uVyu3XGcBQCsXtxngJ/846TUJYjR3d3dsrm5+VkN1nUB/7V/F7rRI6IpAG9bW1vX5ufnd+JW2giDg4Ntu7u7N5h5HEARQFa9rmna6NLSUimo1wzwB7zvqO/zP4loaHl5eTVu4XFgGEYfEc0BuKKEN1zX7Q0GRi2I6ro+ivrkvbOcPADYtr3CzLcBeEr4WkdHx3BQqRnAzMPqzUQ0dZaTD7BtewXAGzWm5lozgIjyaqO9vb2Z2NUlRziX/qCgKcHLaotsNvstTkVJkslk1kKh2pigGtCutlhcXNyOU1SSHJBLLVcN55xmqQcbhjFERNMA9gA8sizro4QOsTdA07TXqI47XQCmxHRIPZiZO5Vql5SOcz8GpAZIC5AmNUBagDSpAdICpEkNkBYgTWqAtABpUgOkBUgTeT3An89PoX7JOTKmafLxrfZDRFvMXIy6nhD5DfDn8yeSfCP40+rI6wnnvgtENoCZi0S0dZJiIuIQUTHqzZHHAL/PRV7JCfd5y7KO3KsQF2kXkBYgTWqAtABpUgOkBUiTGiAtQJrUAGkB0qQGSAuQJjVA6sGhqbQjpUNyg0SwntDQfL5RxPYINbqecFKkY4BSrttLVygU2vGfMDAwcDEU+hMUVAN+qS08z7sep6gkaW5uDufyOyiom6XLagtN0x7ErCtJxkP1L0FB3SxdCjUqGobRF6eqJPBzqPuVYeZarjUDXNctoXrAKCBLRHNn2QTlwMQFJbzhed5sUKlbijZN8w6A96HPqQCYBjCTyWTWTvsm6kKh0F6pVG4S0X1Uv3k1eTDziG3bBxsAAKZpTgJ4ErtSAZj5hW3bz9TYvlNjjuMs5HK5VgBmYsoSgIgmLMt6juOOzQFgx3E+9fT0rDJzP6rn7s4yG8z80LKsVwglDxxzdDafz2daWlpG/DM2eVSPzp72P0jbALYAlJm55HnebLlc/istKuW08g8wjAev/BoR3wAAAABJRU5ErkJggg==";
2
+ export const ADD_POINT_IMG_OFF_DARK = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADgUlEQVR4nO2bz04TURTGvzNtaQOVB1BgYVhZDbSUDixZYwLoTlzXB5CI8QUM4ANQXeOCqCkJiUuWtpNCIaG6gRWoeyx/CmGOC5hyZ/izmDJzgM5vdefMafudr/femd65BQKaG7rqZKVSadndORhjohGAUwB1AGjzSZtbdgHeBmiFmPNt7bF8IpE4vCz5UgMKhZXnBJoG+KE3On2CsEkmv8kM9n27+LSD+fn5UFdX9xQBr71X5x8E/tCvpyaJyFTjmjPxLhYPAAyaMAqr751xWw846fb44sioMSPHbH5ubY2s9/T07HqstSHW1tba9vaOHmuaNg4gC0bUlkA0puvJfP3QalQqlZbqv8NfjjH/G4RhXU+tea7cAwyj3MsmLwJ4oIQ34veiCWtirA+B3Z2DMVvxhNptLh4AMpnkKmn0FISaEu6uVg9HrIO6ASeXujOYkbvNxVtkMslVmPhkj5rnDQDQp6aETG3OU2U+wsT2Whhpq6kacF/NqdYiP72V5R/7+7F1e4Tqc4JqQFxNGRpKVD1V5SMX1FKv9dx9QLMRlvrgYrE8TMwfGTjWGK/6B1PfJXTI9QDmWT6ZdzpNQk5KhuQQ6FDanVIimn4OCAyQFiBNYIC0AGkCA6QFSBMYIC1AmsAAaQHSBAZIC5DG9XpAsVgeBnMO9iVn1xQLK+zypdsaI+t2PcF9D2CexTUV3yAdjawnNP0QcG2AxsgC2L5GLW7ZIpOzbl/seg44HXOuV3KcY14fSF25V8ErgiEgLUCawABpAdIEBkgLkCYwQFqANIEB0gKkCQyQFiBNYIDgZ6s/pbekRIgZoKwnNPR7vlHE9gg1up5wXQRzgNK27aVbWqrEcUcoFArtjtCO1VAN+KNmxKNHj7wU5S8RRy3812qpBiyrKWbIfOmpJh8hpnF7ACWrqZ0lcR52soZR7vVWmvcYRrkXBNtVhpnqtdYNaGuP5UHYPMtClE1evM0mKH+YaFHCG+GwuWAd2JaijR/Lz5joq+N9DsH4yMRz+/ux9Zu+iXppqRJvba09gYkXp9+8WjwYNDowkLzYAAAwCsszDJrwQav/EKZ0PfVWDZ27D+jXU5MAz/inyieYpjOZ5Dtn+NKnMcVieRTMMwC6PRXmPRsMmlC7vcqVj6NKpVLk+Dg0CpgjzNRHJxucb/oNUpWBbSJeZqZ8OGwupNPpI2lRATeV/+HNFJvPZJXuAAAAAElFTkSuQmCC";
3
+ export const ADD_POINT_IMG_ON = "image://data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAABmJLR0QA/wD/AP+gvaeTAAADjUlEQVR4nO2by08TURTGvzNAK49oDCsRNqbFxPogtsQ/AhNAowsxLksTlxIxrtwZwJUJsa07E1wQNSUh8X+wrQFDNSklMQGVjRgMj7TIHBcww50WWEyZOTzmt7pz7pn2O1/n3pne3gIeJxvarzM0nvM1LPl7GegGcB3gVgCN7kizzSpACwA+E3NqrbmUyt0NlfZK3tOAyKv8bRANA7jghEoXmSPw43Ss/cNunRUG3Bnnmu+/C0NMeOS8Nvdg8IvsYnAQz0hX41p54nEsHgAINBA5N/e8Mq6wfdm/K8spElNC1/S3G/XrM18eXFt1VGmVXH0z3Vi3Xn+ZGH0ARQH41X4m6s32B1LGsWlAaDznq1/yfYMy5hn4UQO961Ps4rQb4g+azmS+Q9dpkoDzZpBQWD9bChkTozkEGpb8vbBOeMWjXDwApKPtU5rGNwEUzSAjcOqPr9s41Hbi6FZPJqbEUS7eIB1tnwLhtSXIqDQA4LA1Z3PMYW2uoW/CUguBIkZbvQu0qEnr+r+vDutyjSKXZqwRNucE1YAmNSX3MLTiqCoX2aUWs9aK54CTRq3UG4cT+S7SKQnCJjTqz0QDHyV0iF0BxBQHoQVAG3ROSOmQHAKtSrtNSsSJnwM8A6QFSOMZIC1AGs8AaQHSeAZIC5DGM0BagDSeAdICpLG9HhBO5LvAlLAsOVdBJD7LNk9dgEZRu+sJtq8AYoofVPFV0lrNesKJHwL2DdAoCmDh4KTYZp62fgKzhe05YHvM2V7JKR/zmVhw370KTuENAWkB0ngGSAuQxjNAWoA0ngHSAqTxDJAWII1ngLQAaTwDBN9b/So9LyVCzoCd9YSqvs9Xi9geoWrXEw4Kbw5Q2pa9dKHRXBOOCTdezp4uC/01GqoBP9WMeq32kpOi3GSjFmW10C+jpRhAWWsO3XdUlYtoNehTjxmcMfuMBjGnYIGincl8h9PinKYzme8Aw3KXIcCs1TRgrbmUAjCn5Pl1nSaPsgnGHyYA+MwgocC0PLFzqJ4Qz99i0Puy1ymBkNQ3MVbk0sxh30QdGs01Ndb4ruiEe9ufvK8spScTC+5uAACE4/kRAg04LVQCAobSseATNVbxHJBdDA4CNOKeLJcgGk4vBp5WhPfKDycKPQQeASPgrDKHIRTAGFAve2v3PoQTmTrgTA8Y3QSEsbXB+bA/IK0AWGAgS0CKaXki2x/ZkBblcVj5D1vBAfS1aXiGAAAAAElFTkSuQmCC";
4
4
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l3aWJpdC9jaGFydC9zcmMvbGliL2NvbnN0YW50cy9jaGFydC5jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsdzBDQUF3MEMsQ0FBQztBQUNoM0MsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsZ3pDQUFnekMsQ0FBQztBQUN2MUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsZzBDQUFnMEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBBRERfUE9JTlRfSU1HX09GRl9MSUdIVCA9IFwiaW1hZ2U6Ly9kYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUVBQUFBQkFDQVlBQUFDcWFYSGVBQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFEa1VsRVFWUjRuTzJiejBzVVlSakh2OC9vdHZpREdEdVdyaEtkc2tCYVFaaTU3TW1MZ1ZwSWtKMDZiSDlBRWRGL2tGNDZkRWc3MjZsaUJTR3dCRUZuVG0wb2FGM3M0bGhkaDFCaE51VHBzRFBMdStNdm1IWG0wWnpQNlgyZmVXZm4rM3gzM25mM2ZYbGZJT1Y4UTBkZDdPM3R2YURyK2lnekR4UFJMUUNkQU5xU2tSYVpIUUJielB5VmlFcXU2NWJXMTljcmh6VSsxQURETU80UzBRU0FxM0dvVEpBZkFKNWFsdlhob0l0TjRjRFkyRmlUcnV1VFJQUVNRRWZjNmhMZ0VvQjd1Vnl1M1hHY0JRQ3NYdHhuZ0ovODQ2VFVKWWpSM2QzZHNybTUrVmtOMW5VQi83Vi9GN3JSSTZJcEFHOWJXMXZYNXVmbmQrSlcyZ2lEZzROdHU3dTdONWg1SEVBUlFGYTlybW5hNk5MU1VpbW8xd3p3Qjd6dnFPL3pQNGxvYUhsNWVUVnU0WEZnR0VZZkVjMEJ1S0tFTjF6WDdRMEdSaTJJNnJvK2l2cmt2Yk9jUEFEWXRyM0N6TGNCZUVyNFdrZEh4M0JRcVJuQXpNUHF6VVEwZFphVEQ3QnRld1hBR3pXbTVsb3pnSWp5YXFPOXZiMloyTlVsUnppWC9xQ2dLY0hMYW90c052c3RUa1ZKa3NsazFrS2gycGlnR3RDdXRsaGNYTnlPVTFTU0hKQkxMVmNONTV4bXFRY2JoakZFUk5NQTlnQThzaXpybzRRT3NUZEEwN1RYcUk0N1hRQ214SFJJUFppWk81VnFsNVNPY3o4R3BBWklDNUFtTlVCYWdEU3BBZElDcEVrTmtCWWdUV3FBdEFCcFVnT2tCVWdUZVQzQW44OVBvWDdKT1RLbWFmTHhyZlpEUkZ2TVhJeTZuaEQ1RGZEbjh5ZVNmQ1A0MCtySTZ3bm52Z3RFTm9DWmkwUzBkWkppSXVJUVVUSHF6WkhIQUwvUFJWN0pDZmQ1eTdLTzNLc1FGMmtYa0JZZ1RXcUF0QUJwVWdPa0JVaVRHaUF0UUpyVUFHa0IwcVFHU0F1UUpqVkE2c0docWJRanBVTnlnMFN3bnREUWZMNVJ4UFlJTmJxZWNGS2tZNEJTcnR0TFZ5Z1UydkdmTURBd2NERVUraE1VVkFOK3FTMDh6N3NlcDZna2FXNXVEdWZ5T3lpb202WExhZ3ROMHg3RXJDdEp4a1AxTDBGQjNTeGRDalVxR29iUkY2ZXFKUEJ6cVB1VlllWmFyalVEWE5jdG9YckFLQ0JMUkhObjJRVGx3TVFGSmJ6aGVkNXNVS2xiaWpaTjh3NkE5NkhQcVFDWUJqQ1R5V1RXVHZzbTZrS2gwRjZwVkc0UzBYMVV2M2sxZVREemlHM2JCeHNBQUtacFRnSjRFcnRTQVpqNWhXM2J6OVRZdmxOamp1TXM1SEs1VmdCbVlzb1NnSWdtTE10Nmp1T096UUZneDNFKzlmVDByREp6UDZybjdzNHlHOHo4MExLc1Z3Z2xEeHh6ZERhZnoyZGFXbHBHL0RNMmVWU1B6cDcyUDBqYkFMWUFsSm01NUhuZWJMbGMvaXN0S3VXMDhnOHdqQWV2L0JvUjN3QUFBQUJKUlU1RXJrSmdnZz09XCI7XHJcbmV4cG9ydCBjb25zdCBBRERfUE9JTlRfSU1HX09GRl9EQVJLID0gXCJpbWFnZTovL2RhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBRUFBQUFCQUNBWUFBQUNxYVhIZUFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQURnVWxFUVZSNG5PMmJ6MDRUVVJUR3Z6TnRhUU9WQjFCZ1lWaFpEYlNVRGl4Wll3TG9UbHpYQjVDSThRVU00QU5RWGVPQ3FDa0ppVXVXdHBOQ0lhRzZnUldvZXl4L0NtR09DNWh5Wi9pem1ESnpnTTV2ZGVmTWFmdWRyL2ZlbWQ2NUJRS2FHN3JxWktWU2FkbmRPUmhqb2hHQVV3QjFBR2p6U1p0YmRnSGVCbWlGbVBOdDdiRjhJcEU0dkN6NVVnTUtoWlhuQkpvRytLRTNPbjJDc0VrbXY4a005bjI3K0xTRCtmbjVVRmRYOXhRQnI3MVg1eDhFL3RDdnB5YUp5RlRqbWpQeExoWVBBQXlhTUFxcjc1MXhXdzg0NmZiNDRzaW9NU1BIYkg1dWJZMnM5L1QwN0hxc3RTSFcxdGJhOXZhT0htdWFOZzRnQzBiVWxrQTBwdXZKZlAzUWFsUXFsWmJxdjhOZmpqSC9HNFJoWFUrdGVhN2NBd3lqM01zbUx3SjRvSVEzNHZlaUNXdGlyQStCM1oyRE1WdnhoTnB0TGg0QU1wbmtLbW4wRklTYUV1NnVWZzlIcklPNkFTZVh1ak9Za2J2TnhWdGtNc2xWbVBoa2o1cm5EUURRcDZhRVRHM09VMlUrd3NUMldoaHBxNmthY0YvTnFkWWlQNzJWNVIvNys3RjFlNFRxYzRKcVFGeE5HUnBLVkQxVjVTTVgxRkt2OWR4OVFMTVJsdnJnWXJFOFRNd2ZHVGpXR0svNkIxUGZKWFRJOVFEbVdUNlpkenBOUWs1S2h1UVE2RkRhblZJaW1uNE9DQXlRRmlCTllJQzBBR2tDQTZRRlNCTVlJQzFBbXNBQWFRSFNCQVpJQzVERzlYcEFzVmdlQm5NTzlpVm4xeFFMSyt6eXBkc2FJK3QyUGNGOUQyQ2V4VFVWM3lBZGphd25OUDBRY0cyQXhzZ0MyTDVHTFc3WklwT3pibC9zZWc0NEhYT3VWM0tjWTE0ZlNGMjVWOEVyZ2lFZ0xVQ2F3QUJwQWRJRUJrZ0xrQ1l3UUZxQU5JRUIwZ0trQ1F5UUZpQk5ZSURnWjZzL3BiZWtSSWdab0t3bk5QUjd2bEhFOWdnMXVwNXdYUVJ6Z05LMjdhVmJXcXJFY1Vjb0ZBcnRqdENPMVZBTitLTm14S05Iajd3VTVTOFJSeTM4MTJxcEJpeXJLV2JJZk9tcEpoOGhwbkY3QUNXcnFaMGxjUjUyc29aUjd2VldtdmNZUnJrWEJOdFZocG5xdGRZTmFHdVA1VUhZUE10Q2xFMWV2TTBtS0grWWFGSENHK0d3dVdBZDJKYWlqUi9MejVqb3ErTjlEc0g0eU1SeisvdXg5WnUraVhwcHFSSnZiYTA5Z1lrWHA5KzhXandZTkRvd2tMellBQUF3Q3NzekRKcndRYXYvRUtaMFBmVldEWjI3RCtqWFU1TUF6L2lueWllWXBqT1o1RHRuK05Lbk1jVmllUlRNTXdDNlBSWG1QUnNNbWxDN3ZjcVZqNk5LcFZMaytEZzBDcGdqek5SSEp4dWNiL29OVXBXQmJTSmVacVo4T0d3dXBOUHBJMmxSQVRlVi8rSE5GSnZQWkpYdUFBQUFBRWxGVGtTdVFtQ0NcIjtcclxuZXhwb3J0IGNvbnN0IEFERF9QT0lOVF9JTUdfT04gPSBcImltYWdlOi8vZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFFQUFBQUJBQ0FZQUFBQ3FhWEhlQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBRGpVbEVRVlI0bk8yYnkwOFRVUlRHdnpOQUs0OW9EQ3NSTnFiRnhQb2d0c1EvQWhOQW93c3hMa3NUbHhJeHJ0d1p3SlVKc2EwN0Uxd1FOU1VoOFgrd3JRRkROU2tsTVFHVmpSZ01qN1RJSEJjd3c1MFdXRXlaT1R6bXQ3cHo3cG4yTzEvbjNwbmUzZ0llSnh2YXJ6TTBudk0xTFBsN0dlZ0djQjNnVmdDTjdraXp6U3BBQ3dBK0UzTnFyYm1VeXQwTmxmWkszdE9BeUt2OGJSQU5BN2pnaEVvWG1TUHc0M1NzL2NOdW5SVUczQm5ubXUrL0MwTk1lT1M4TnZkZzhJdnNZbkFRejBoWDQxcDU0bkVzSGdBSU5CQTVOL2U4TXE2d2ZkbS9LOHNwRWxOQzEvUzNHL1hyTTE4ZVhGdDFWR21WWEgwejNWaTNYbitaR0gwQVJRSDQxWDRtNnMzMkIxTEdzV2xBYUR6bnExL3lmWU15NWhuNFVRTzk2MVBzNHJRYjRnK2F6bVMrUTlkcGtvRHpacEJRV0Q5YkNoa1RvemtFR3BiOHZiQk9lTVdqWER3QXBLUHRVNXJHTndFVXpTQWpjT3FQcjlzNDFIYmk2RlpQSnFiRVVTN2VJQjF0bndMaHRTWElxRFFBNExBMVozUE1ZVzJ1b1cvQ1VndUJJa1pidlF1MHFFbnIrcit2RHV0eWpTS1hacXdSTnVjRTFZQW1OU1gzTUxUaXFDb1gyYVVXczlhSzU0Q1RScTNVRzRjVCtTN1NLUW5DSmpUcXowUURIeVYwaUYwQnhCUUhvUVZBRzNST1NPbVFIQUt0U3J0TlNzU0pud004QTZRRlNPTVpJQzFBR3M4QWFRSFNlQVpJQzVER00wQmFnRFNlQWRJQ3BMRzlIaEJPNUx2QWxMQXNPVmRCSkQ3TE5rOWRnRVpSdStzSnRxOEFZb29mVlBGVjBsck5lc0tKSHdMMkRkQW9DbURoNEtUWVpwNjJmZ0t6aGUwNVlIdk0yVjdKS1Ivem1WaHczNzBLVHVFTkFXa0IwbmdHU0F1UXhqTkFXb0EwbmdIU0FxVHhESkFXSUkxbmdMUUFhVHdEQk45Yi9TbzlMeVZDem9DZDlZU3F2czlYaTlnZW9XclhFdzRLYnc1UTJwYTlkS0hSWEJPT0NUZGV6cDR1Qy8wMUdxb0JQOVdNZXEzMmtwT2kzR1NqRm1XMTBDK2pwUmhBV1dzTzNYZFVsWXRvTmVoVGp4bWNNZnVNQmpHbllJR2luY2w4aDlQaW5LWXptZThBdzNLWEljQ3MxVFJncmJtVUFqQ241UGwxblNhUHNnbkdIeVlBK013Z29jQzBQTEZ6cUo0UXo5OWkwUHV5MXltQmtOUTNNVmJrMHN4aDMwUWRHczAxTmRiNHJ1aUVlOXVmdks4c3BTY1RDKzV1QUFDRTQva1JBZzA0TFZRQ0FvYlNzZUFUTlZieEhKQmREQTRDTk9LZUxKY2dHazR2QnA1V2hQZktEeWNLUFFRZUFTUGdyREtISVJUQUdGQXZlMnYzUG9RVG1UcmdUQThZM1FTRXNiWEIrYkEvSUswQVdHQWdTMENLYVhraTJ4L1prQmJsY1ZqNUQxdkJBZlMxYVhpR0FBQUFBRWxGVGtTdVFtQ0NcIjsiXX0=