@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.
@@ -1,405 +0,0 @@
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 * as i0 from "@angular/core";
8
- import * as i1 from "@angular/common";
9
- import * as i2 from "ngx-echarts";
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
- }
113
- ngOnInit() {
114
- /**
115
- * This is a manual change detection running every 200ms, the memory should not be much afflicted.
116
- * It's necessary because when interacting with the chart (for example addPoint),
117
- * Angular loses the change detection and the point is not added in the chart canvas.
118
- */
119
- interval(200)
120
- .pipe(takeUntil(this.destroyed$))
121
- .subscribe({
122
- next: () => {
123
- this.cd.detectChanges();
124
- }
125
- });
126
- }
127
- onChartInit(ec) {
128
- this.echartsInstance = ec;
129
- this.setupZrEventHandler(ec);
130
- }
131
- setupZrEventHandler(ec) {
132
- this.zr = ec.getZr();
133
- /**
134
- * Intercepts the click event on the chart (if the clickToAddPoint property is set to true)
135
- * and emits the point coordinates to the father component.
136
- */
137
- this.zr.on('click', params => {
138
- let option = ec.getOption();
139
- let active = option?.toolbox?.[0]?.feature?.myAddPoint?.iconStatus;
140
- if (active && this.chart?.clickToAddPoint) {
141
- const pointInPixel = [params.offsetX, params.offsetY];
142
- const pointInGrid = ec.convertFromPixel('grid', pointInPixel);
143
- if (ec.containPixel('grid', pointInPixel) && pointInGrid) {
144
- let newPoint = {
145
- x: +pointInGrid[0].toFixed(3),
146
- y: +pointInGrid[1].toFixed(3)
147
- };
148
- this.addPoint.emit(newPoint);
149
- }
150
- }
151
- });
152
- /**
153
- * This is used perform custom actions when the mouse is hovering the chart area
154
- */
155
- this.zr.on('mousemove', params => {
156
- const pointInPixel = [params.offsetX, params.offsetY];
157
- const pointInGrid = ec.convertFromPixel('grid', pointInPixel);
158
- /*
159
- * Logic to emit to the father component the x and y cdinates when the
160
- * cursor is hovering the chart area .
161
- */
162
- if (ec.containPixel('grid', pointInPixel) && pointInGrid) {
163
- let newPoint = {
164
- x: +pointInGrid[0].toFixed(3),
165
- y: +pointInGrid[1].toFixed(3)
166
- };
167
- this.chartHover.emit(newPoint);
168
- }
169
- /* Logic to change the cursor icon when the "Click to Add Point" feature is active and viceversa. */
170
- const option = ec.getOption();
171
- const addPointIsActive = option?.toolbox?.[0]?.feature?.myAddPoint?.iconStatus;
172
- if (addPointIsActive) {
173
- this.zr?.setCursorStyle(ec.containPixel('grid', pointInPixel) ? 'copy' : 'default');
174
- }
175
- });
176
- }
177
- ngOnChanges(changes) {
178
- let chart = changes['chart']?.currentValue;
179
- if (chart) {
180
- this.chartOption = {
181
- title: {
182
- text: chart.title,
183
- },
184
- grid: {
185
- width: '70%'
186
- },
187
- backgroundColor: this.darkTheme ? this.darkThemeBackground ?? '#303030' : 'transparent', tooltip: {
188
- axisPointer: {
189
- type: 'cross',
190
- crossStyle: {
191
- color: '#bebebe'
192
- }
193
- }
194
- },
195
- toolbox: {
196
- orient: 'horizontal',
197
- left: 'center',
198
- feature: {
199
- dataZoom: {
200
- brushStyle: {
201
- borderColor: '#000',
202
- borderWidth: 1,
203
- borderType: 'dashed'
204
- },
205
- },
206
- saveAsImage: {},
207
- restore: {},
208
- myAddPoint: {
209
- show: chart.clickToAddPoint ?? false,
210
- title: chart.addPointCustomName ?? 'Add Point',
211
- icon: this.darkTheme ? ADD_POINT_IMG_OFF_DARK : ADD_POINT_IMG_OFF_LIGHT,
212
- iconStatus: false,
213
- onclick: () => {
214
- let option = this.echartsInstance?.getOption();
215
- let status = option.toolbox[0].feature.myAddPoint.iconStatus;
216
- this.echartsInstance?.setOption({
217
- toolbox: {
218
- feature: {
219
- myAddPoint: {
220
- iconStatus: !status,
221
- icon: !status ? ADD_POINT_IMG_ON : this.darkTheme ? ADD_POINT_IMG_OFF_DARK : ADD_POINT_IMG_OFF_LIGHT
222
- }
223
- }
224
- }
225
- });
226
- }
227
- }
228
- },
229
- },
230
- dataZoom: [
231
- {
232
- type: 'inside',
233
- xAxisIndex: [0],
234
- throttle: 0,
235
- filterMode: 'none',
236
- disabled: !chart.scrollToZoom ?? true
237
- },
238
- {
239
- type: 'inside',
240
- yAxisIndex: [0],
241
- throttle: 0,
242
- filterMode: 'none',
243
- disabled: !chart.scrollToZoom ?? true
244
- },
245
- ],
246
- legend: {
247
- inactiveColor: this.darkTheme ? '#8b8b8b' : '#ccc',
248
- data: chart.shapes.map((shape) => ({
249
- name: shape.name,
250
- icon: 'circle'
251
- })),
252
- selected: chart.shapes.reduce((accumulator, shape) => ({ ...accumulator, [shape.name]: shape.selectedByDefault ?? true }), {}),
253
- show: chart.showLegend ?? false,
254
- orient: 'vertical',
255
- left: 'right',
256
- padding: [60, 20],
257
- type: 'scroll',
258
- textStyle: {
259
- width: 120,
260
- fontWeight: 'bold',
261
- overflow: 'break'
262
- }
263
- },
264
- xAxis: {
265
- type: chart.xAxisType,
266
- name: chart.xAxisUom ? `${chart.xAxisName} [ ${chart.xAxisUom} ]` : chart.xAxisName,
267
- nameLocation: 'middle',
268
- nameGap: 30,
269
- splitLine: {
270
- show: chart.showGrid ?? true,
271
- lineStyle: {
272
- color: this.darkTheme ? '#595959' : '#ccc'
273
- }
274
- },
275
- min: chart.xMin?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
276
- max: chart.xMax?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
277
- },
278
- yAxis: {
279
- type: chart.yAxisType,
280
- name: chart.yAxisUom ? `${chart.yAxisName} [ ${chart.yAxisUom} ]` : chart.yAxisName,
281
- nameLocation: 'middle',
282
- nameGap: 50,
283
- splitLine: {
284
- show: chart.showGrid ?? true,
285
- lineStyle: {
286
- color: this.darkTheme ? '#595959' : '#ccc'
287
- }
288
- },
289
- min: chart.yMin?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
290
- max: chart.yMax?.toFixed(chart.maxAxesDecimals ?? this.MAX_DECIMALS),
291
- },
292
- series: this.createSeries(chart.shapes),
293
- animation: chart.hasAnimations,
294
- animationDuration: chart.animationDuration ?? 500,
295
- animationEasing: 'cubicOut'
296
- };
297
- }
298
- }
299
- createSeries(shapes) {
300
- let series = [];
301
- shapes.forEach((shape) => {
302
- switch (shape.variant) {
303
- case ShapeVariant.TRACE:
304
- series.push(this.createTrace(shape));
305
- break;
306
- default:
307
- break;
308
- }
309
- });
310
- return series;
311
- }
312
- createTrace(trace) {
313
- return {
314
- type: trace.type,
315
- name: trace.name,
316
- data: trace.points.map((point) => ({
317
- value: [point.x, point.y],
318
- symbol: point.symbol ?? 'circle',
319
- name: point.name,
320
- symbolSize: point.symbolSize ?? 2,
321
- itemStyle: {
322
- color: point.color
323
- },
324
- emphasis: {
325
- disabled: true
326
- },
327
- label: {
328
- show: true,
329
- position: 'bottom',
330
- align: 'left',
331
- verticalAlign: 'bottom',
332
- formatter: () => `${point.name ?? ''}`,
333
- fontSize: 13,
334
- padding: [0, 0, 0, 10],
335
- width: 100,
336
- overflow: 'truncate',
337
- ellipsis: '...',
338
- fontWeight: 'bold',
339
- color: this.darkTheme ? '#fff' : '#000'
340
- },
341
- tooltip: {
342
- formatter: ({ value }) => `
343
- <strong>${this.chart?.xAxisName}:</strong> ${value[0].toFixed(3).replace(/[.,]000$/, "")}
344
- <br>
345
- <strong>${this.chart?.yAxisName}:</strong> ${value[1].toFixed(3).replace(/[.,]000$/, "")}
346
- `
347
- }
348
- })),
349
- color: trace.color,
350
- lineStyle: {
351
- width: trace.width,
352
- type: trace.style,
353
- opacity: trace.opacity ?? 1
354
- },
355
- smooth: trace.smooth ?? false
356
- };
357
- }
358
- ngOnDestroy() {
359
- this.destroyed$.next();
360
- this.destroyed$.complete();
361
- }
362
- }
363
- KiwiChartComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartComponent, deps: [{ token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
364
- KiwiChartComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.0.1", type: KiwiChartComponent, selector: "kiwi-chart", inputs: { chart: "chart", width: "width", height: "height", darkTheme: "darkTheme", darkThemeBackground: "darkThemeBackground" }, outputs: { addPoint: "addPoint", chartHover: "chartHover" }, usesOnChanges: true, ngImport: i0, template: `
365
- <div
366
- echarts
367
- [options]="chartOption"
368
- [ngStyle]="{
369
- 'width': width,
370
- 'height': height
371
- }"
372
- (chartInit)="onChartInit($event)"
373
- [theme]="darkTheme ? 'dark' : ''"
374
- ></div>
375
- `, isInline: true, styles: [""], dependencies: [{ kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i2.NgxEchartsDirective, selector: "echarts, [echarts]", inputs: ["options", "theme", "loading", "initOpts", "merge", "autoResize", "loadingType", "loadingOpts"], outputs: ["chartInit", "optionsError", "chartClick", "chartDblClick", "chartMouseDown", "chartMouseMove", "chartMouseUp", "chartMouseOver", "chartMouseOut", "chartGlobalOut", "chartContextMenu", "chartLegendSelectChanged", "chartLegendSelected", "chartLegendUnselected", "chartLegendScroll", "chartDataZoom", "chartDataRangeSelected", "chartTimelineChanged", "chartTimelinePlayChanged", "chartRestore", "chartDataViewChanged", "chartMagicTypeChanged", "chartPieSelectChanged", "chartPieSelected", "chartPieUnselected", "chartMapSelectChanged", "chartMapSelected", "chartMapUnselected", "chartAxisAreaSelected", "chartFocusNodeAdjacency", "chartUnfocusNodeAdjacency", "chartBrush", "chartBrushEnd", "chartBrushSelected", "chartRendered", "chartFinished"], exportAs: ["echarts"] }] });
376
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartComponent, decorators: [{
377
- type: Component,
378
- args: [{ selector: 'kiwi-chart', template: `
379
- <div
380
- echarts
381
- [options]="chartOption"
382
- [ngStyle]="{
383
- 'width': width,
384
- 'height': height
385
- }"
386
- (chartInit)="onChartInit($event)"
387
- [theme]="darkTheme ? 'dark' : ''"
388
- ></div>
389
- ` }]
390
- }], ctorParameters: function () { return [{ type: i0.ChangeDetectorRef }]; }, propDecorators: { chart: [{
391
- type: Input
392
- }], width: [{
393
- type: Input
394
- }], height: [{
395
- type: Input
396
- }], darkTheme: [{
397
- type: Input
398
- }], darkThemeBackground: [{
399
- type: Input
400
- }], addPoint: [{
401
- type: Output
402
- }], chartHover: [{
403
- type: Output
404
- }] } });
405
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l3aWJpdC9jaGFydC9zcmMvbGliL2NoYXJ0LmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxrQkFBa0I7QUFDbEIsT0FBTyxFQUFxQixTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBZ0MsTUFBTSxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUN2SSxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFHcEQsYUFBYTtBQUNiLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx1QkFBdUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hILE9BQU8sRUFBZ0IsWUFBWSxFQUEyQixTQUFTLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQzs7OztBQWtCdkcsTUFBTSxPQUFPLGtCQUFrQjtJQWdIN0IsWUFDVSxFQUFxQjtRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQS9HL0I7Ozs7OztXQU1HO1FBQ00sVUFBSyxHQUFpQixJQUFJLENBQUM7UUFFcEM7Ozs7Ozs7V0FPRztRQUNNLFVBQUssR0FBVyxNQUFNLENBQUM7UUFDdkIsV0FBTSxHQUFXLE9BQU8sQ0FBQztRQUVsQzs7Ozs7OztXQU9HO1FBQ00sY0FBUyxHQUFZLEtBQUssQ0FBQztRQUdwQzs7Ozs7OztXQU9HO1FBQ08sYUFBUSxHQUE0QixJQUFJLFlBQVksRUFBYSxDQUFDO1FBRTVFOzs7Ozs7V0FNRztRQUNPLGVBQVUsR0FBNEIsSUFBSSxZQUFZLEVBQWEsQ0FBQztRQUU5RTs7Ozs7O1dBTUc7UUFDSCxnQkFBVyxHQUFrQjtZQUMzQixLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLFlBQVk7YUFDbkI7WUFDRCxLQUFLLEVBQUU7Z0JBQ0wsSUFBSSxFQUFFLEdBQUc7YUFDVjtZQUNELEtBQUssRUFB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QyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUUsQ0FBQzs7d0JBRTlFLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxjQUFjLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUM7YUFDekY7aUJBQ0Y7YUFDRixDQUFDLENBQ0g7WUFDRCxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDbEIsU0FBUyxFQUFFO2dCQUNULEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSztnQkFDbEIsSUFBSSxFQUFFLEtBQUssQ0FBQyxLQUFLO2dCQUNqQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sSUFBSSxDQUFDO2FBQzVCO1lBQ0QsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNLElBQUksS0FBSztTQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDN0IsQ0FBQzs7K0dBNVhVLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNRQWZuQjs7Ozs7Ozs7Ozs7R0FXVDsyRkFJVSxrQkFBa0I7a0JBakI5QixTQUFTOytCQUNFLFlBQVksWUFDWjs7Ozs7Ozs7Ozs7R0FXVDt3R0FhUSxLQUFLO3NCQUFiLEtBQUs7Z0JBVUcsS0FBSztzQkFBYixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFVRyxTQUFTO3NCQUFqQixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFVSSxRQUFRO3NCQUFqQixNQUFNO2dCQVNHLFVBQVU7c0JBQW5CLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvLyBBbmd1bGFyIEdlbmVyYWxcclxuaW1wb3J0IHsgQ2hhbmdlRGV0ZWN0b3JSZWYsIENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IGludGVydmFsLCBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuLy8gRWNoYXJ0c1xyXG5pbXBvcnQgeyBDdXN0b21TZXJpZXNPcHRpb24sIEVDaGFydHMsIEVDaGFydHNPcHRpb24sIExpbmVTZXJpZXNPcHRpb24sIFNjYXR0ZXJTZXJpZXNPcHRpb24sIHpyZW5kZXIgfSBmcm9tICdlY2hhcnRzJztcclxuLy8gS2l3aSBDaGFydFxyXG5pbXBvcnQgeyBBRERfUE9JTlRfSU1HX09GRl9EQVJLLCBBRERfUE9JTlRfSU1HX09GRl9MSUdIVCwgQUREX1BPSU5UX0lNR19PTiB9IGZyb20gJy4vY29uc3RhbnRzL2NoYXJ0LmNvbnN0YW50cyc7XHJcbmltcG9ydCB7IENoYXJ0LCBTaGFwZSwgU2hhcGVWYXJpYW50LCBUcmFjZSwgUG9pbnQsIEJhc2VQb2ludCwgVHJhY2VUeXBlIH0gZnJvbSAnLi9tb2RlbHMvY2hhcnQubW9kZWxzJztcclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdraXdpLWNoYXJ0JyxcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGRpdiBcclxuICAgICAgZWNoYXJ0cyBcclxuICAgICAgW29wdGlvbnNdPVwiY2hhcnRPcHRpb25cIiBcclxuICAgICAgW25nU3R5bGVdPVwie1xyXG4gICAgICAgICd3aWR0aCc6IHdpZHRoLFxyXG4gICAgICAgICdoZWlnaHQnOiBoZWlnaHRcclxuICAgICAgfVwiXHJcbiAgICAgIChjaGFydEluaXQpPVwib25DaGFydEluaXQoJGV2ZW50KVwiXHJcbiAgICAgIFt0aGVtZV09XCJkYXJrVGhlbWUgPyAnZGFyaycgOiAnJ1wiXHJcbiAgICA+PC9kaXY+IFxyXG4gIGAsXHJcbiAgc3R5bGVzOiBbYFxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBLaXdpQ2hhcnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIENoYXJ0IE9iamVjdCByZW5kZXJlZCBieSB0aGUgY2FudmFzLiBGb3IgYWxsIHRoZSBhdmFpbGFibGUgb3B0aW9ucyByZWZlciBcclxuICAgKiB0byBDaGFydCBpbnRlcmZhY2UgaW4gdGhlIG1vZGVscyBmb2xkZXIuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7KENoYXJ0IHwgbnVsbCl9XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGNoYXJ0OiBDaGFydCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBXaWR0aCBhbmQgSGVpZ2h0IG9mIHRoZSBjaGFydCBhcmVhLiBUaGUgZGltZW5zaW9ucyByZWZlciB0byB0aGUgZmF0aGVyIGNvbXBvbmVudCBcclxuICAgKiBpbnRvIHdoaWNoIHRoZSBraXdpLWNoYXJ0IGlzIGluc2VydGVkLiBGb3IgZXhhbXBsZSBpbiBhbiBlbXB0eSBwYWdlIHRoZSB3aWR0aC9oZWlnaHQgXHJcbiAgICogb2YgdGhlIGNoYXJ0IGNhbiB0YWtlIHRoZSB3aG9sZSBhdmFpbGFibGUgc3BhY2UgaW4gdGhlIHBhZ2UuXHJcbiAgICpcclxuICAgKiBAdHlwZSB7c3RyaW5nfVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIEBJbnB1dCgpIGhlaWdodDogc3RyaW5nID0gJzQ4MHB4JztcclxuXHJcbiAgLyoqXHJcbiAgICogVGhpcyBwcm9wZXJ0eSBzaW1wbHkgYWN0aXZhdGVzIG9yIG5vdCB0aGUgZGFyayB0aGVtZSBvZiB0aGUgY2hhcnRcclxuICAgKiBkZWZpbmVkIGJ5IHRoZSBFY2hhcnRzIGxpYnJhcnkuIEluIGFkZGl0aW9uIHRoZSBiYWNrZ3JvdW5kIGNvbG9yIGNhbiBiZSBjdXN0b21cclxuICAgKiBzbyB0aGF0IHRoZSBjaGFydCBjYW4gbWF0Y2ggdGhlIGJhY2tncm91bmQgb2YgdGhlIGFwcGxpY2F0aW9uIGluIHdoaWNoIGl0J3MgdXNlZC5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtib29sZWFufVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBASW5wdXQoKSBkYXJrVGhlbWU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBASW5wdXQoKSBkYXJrVGhlbWVCYWNrZ3JvdW5kPzogc3RyaW5nO1xyXG5cclxuICAvKipcclxuICAgKiBPdXRwdXQgZXZlbnQgdXNlZCB0byBlbWl0IHRvIHRoZSBmYXRoZXIgY29tcG9uZW50IHRoZSBjb29yZGluYXRlc1xyXG4gICAqIG9mIHRoZSBwb2ludCBjbGlja2VkIGluIHRoZSBjaGFydCBhcmVhLiBUaGlzIGZ1bmN0aW9uYWxpdHkgdG8gYmUgdXNlZCBtdXN0XHJcbiAgICogaGF2ZSB0aGUgcHJvcGVydHkgXCJjbGlja1RvQWRkUG9pbnRcIiBpbiB0aGUgQ2hhcnQgb2JqZWN0IHNldCB0byB0cnVlLlxyXG4gICAqXHJcbiAgICogQHR5cGUge0V2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+fVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBAT3V0cHV0KCkgYWRkUG9pbnQ6IEV2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFdoZW4gdGhlIGN1cnNvciBob3ZlcnMgdGhlIGNoYXJ0IGFyZWEgaXQgZW1pdHMgdG8gdGhlIGZhdGhlciBjb21wb25lbnQgdGhlXHJcbiAgICogeCBhbmQgeSBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUgY2hhcnQgcmVmZXJlbmNlIHN5c3RlbS5cclxuICAgKlxyXG4gICAqIEB0eXBlIHtFdmVudEVtaXR0ZXI8QmFzZVBvaW50Pn1cclxuICAgKiBAbWVtYmVyb2YgS2l3aUNoYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgQE91dHB1dCgpIGNoYXJ0SG92ZXI6IEV2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxCYXNlUG9pbnQ+KCk7XHJcblxyXG4gIC8qKlxyXG4gICAqIFRoZSBvYmplY3QgdXNlZCBieSBlY2hhcnRzIHRvIGluaXRpYWxseSBjcmVhdGUgdGhlIENoYXJ0LlxyXG4gICAqIEhhcyBhIGRlZmF1bHQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZSB0b3RhbGx5IG92ZXJyaWRlZCB1c2luZyBzcGVjaWZpYyBwcm9wZXJ0aWVzLlxyXG4gICAqXHJcbiAgICogQHR5cGUge0VDaGFydHNPcHRpb259XHJcbiAgICogQG1lbWJlcm9mIEtpd2lDaGFydENvbXBvbmVudFxyXG4gICAqL1xyXG4gIGNoYXJ0T3B0aW9uOiBFQ2hhcnRzT3B0aW9uID0ge1xyXG4gICAgdGl0bGU6IHtcclxuICAgICAgdGV4dDogJ0tpd2kgQ2hhcnQnXHJcbiAgICB9LFxyXG4gICAgeEF4aXM6IHtcclxuICAgICAgbmFtZTogJ1gnXHJcbiAgICB9LFxyXG4gICAgeUF4aXM6IHtcclxuICAgICAgbmFtZTogJ1knXHJcbiAgICB9LFxyXG4gICAgc2VyaWVzOiBbXHJcbiAgICAgIHtcclxuICAgICAgICB0eXBlOiBUcmFjZVR5cGUuTElORSxcclxuICAgICAgICBkYXRhOiBbWzAsIDBdXVxyXG4gICAgICB9XHJcbiAgICBdXHJcbiAgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogVGhlIGluc3RhbmNlIG9mIHRoZSBDaGFydC5cclxuICAgKlxyXG4gICAqIEB0eXBlIHsoRUNoYXJ0cyB8IG51bGwpfVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICBlY2hhcnRzSW5zdGFuY2U6IEVDaGFydHMgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgLyoqXHJcbiAgICogVXNlZCB0byBwZXJmb3JtIGFjdGlvbnMgKGFzIHBvaW50IGFkZGl0aW9uIGJhc2VkIG9uIHRoZSBjdXJzb3IgcG9zaXRpb24pIG9uIHRoZSBjaGFydC5cclxuICAgKlxyXG4gICAqIEB0eXBlIHsoenJlbmRlci5aUmVuZGVyVHlwZSB8IG51bGwpfVxyXG4gICAqIEBtZW1iZXJvZiBLaXdpQ2hhcnRDb21wb25lbnRcclxuICAgKi9cclxuICB6cjogenJlbmRlci5aUmVuZGVyVHlwZSB8IG51bGwgPSBudWxsO1xyXG5cclxuICAvKipcclxuICAgKiBTdWJqZWN0IHVzZWQgdG8gdW5zdWJzY3JpYmUgb25jZSB0aGUgY29tcG9uZW50IGdldHMgZGVzdHJveWVkLlxyXG4gICAqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBAdHlwZSB7U3ViamVjdDx2b2lkPn1cclxuICAgKiBAbWVtYmVyb2YgS2l3aUNoYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBkZXN0cm95ZWQkOiBTdWJqZWN0PHZvaWQ+ID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogRGVmYXVsdCBudW1iZXIgb2YgZGVjaW1hbHMgdGhhdCBjYW4gaGF2ZVxyXG4gICAqIHRoZSB2YWx1ZXMgb24gdGhlIHggYW5kIHkgYXhlcy5cclxuICAgKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogQHR5cGUge251bWJlcn1cclxuICAgKiBAbWVtYmVyb2YgS2l3aUNoYXJ0Q29tcG9uZW50XHJcbiAgICovXHJcbiAgcHJpdmF0ZSByZWFkb25seSBNQVhfREVDSU1BTFM6IG51bWJlciA9IDM7XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBjZDogQ2hhbmdlRGV0ZWN0b3JSZWZcclxuICApIHsgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIC8qKiBcclxuICAgICAqIFRoaXMgaXMgYSBtYW51YWwgY2hhbmdlIGRldGVjdGlvbiBydW5uaW5nIGV2ZXJ5IDIwMG1zLCB0aGUgbWVtb3J5IHNob3VsZCBub3QgYmUgbXVjaCBhZmZsaWN0ZWQuXHJcbiAgICAgKiBJdCdzIG5lY2Vzc2FyeSBiZWNhdXNlIHdoZW4gaW50ZXJhY3Rpbmcgd2l0aCB0aGUgY2hhcnQgKGZvciBleGFtcGxlIGFkZFBvaW50KSxcclxuICAgICAqIEFuZ3VsYXIgbG9zZXMgdGhlIGNoYW5nZSBkZXRlY3Rpb24gYW5kIHRoZSBwb2ludCBpcyBub3QgYWRkZWQgaW4gdGhlIGNoYXJ0IGNhbnZhcy5cclxuICAgICAqL1xyXG4gICAgaW50ZXJ2YWwoMjAwKVxyXG4gICAgICAucGlwZShcclxuICAgICAgICB0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoe1xyXG4gICAgICAgIG5leHQ6ICgpID0+IHtcclxuICAgICAgICAgIHRoaXMuY2QuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgfVxyXG5cclxuICBvbkNoYXJ0SW5pdChlYzogRUNoYXJ0cykge1xyXG4gICAgdGhpcy5lY2hhcnRzSW5zdGFuY2UgPSBlYztcclxuICAgIHRoaXMuc2V0dXBackV2ZW50SGFuZGxlcihlYyk7XHJcbiAgfVxyXG5cclxuICBzZXR1cFpyRXZlbnRIYW5kbGVyKGVjOiBFQ2hhcnRzKSB7XHJcbiAgICB0aGlzLnpyID0gZWMuZ2V0WnIoKTtcclxuICAgIC8qKiBcclxuICAgICAqIEludGVyY2VwdHMgdGhlIGNsaWNrIGV2ZW50IG9uIHRoZSBjaGFydCAoaWYgdGhlIGNsaWNrVG9BZGRQb2ludCBwcm9wZXJ0eSBpcyBzZXQgdG8gdHJ1ZSlcclxuICAgICAqIGFuZCBlbWl0cyB0aGUgcG9pbnQgY29vcmRpbmF0ZXMgdG8gdGhlIGZhdGhlciBjb21wb25lbnQuXHJcbiAgICAgKi9cclxuICAgIHRoaXMuenIub24oJ2NsaWNrJywgcGFyYW1zID0+IHtcclxuICAgICAgbGV0IG9wdGlvbjogYW55ID0gZWMuZ2V0T3B0aW9uKCk7XHJcbiAgICAgIGxldCBhY3RpdmUgPSBvcHRpb24/LnRvb2xib3g/LlswXT8uZmVhdHVyZT8ubXlBZGRQb2ludD8uaWNvblN0YXR1cztcclxuICAgICAgaWYgKGFjdGl2ZSAmJiB0aGlzLmNoYXJ0Py5jbGlja1RvQWRkUG9pbnQpIHtcclxuICAgICAgICBjb25zdCBwb2ludEluUGl4ZWwgPSBbcGFyYW1zLm9mZnNldFgsIHBhcmFtcy5vZmZzZXRZXTtcclxuICAgICAgICBjb25zdCBwb2ludEluR3JpZCA9IGVjLmNvbnZlcnRGcm9tUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpO1xyXG4gICAgICAgIGlmIChlYy5jb250YWluUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpICYmIHBvaW50SW5HcmlkKSB7XHJcbiAgICAgICAgICBsZXQgbmV3UG9pbnQ6IHsgeDogbnVtYmVyLCB5OiBudW1iZXIgfSA9IHtcclxuICAgICAgICAgICAgeDogK3BvaW50SW5HcmlkWzBdLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICAgIHk6ICtwb2ludEluR3JpZFsxXS50b0ZpeGVkKDMpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5hZGRQb2ludC5lbWl0KG5ld1BvaW50KTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgLyoqIFxyXG4gICAgICogVGhpcyBpcyB1c2VkIHBlcmZvcm0gY3VzdG9tIGFjdGlvbnMgd2hlbiB0aGUgbW91c2UgaXMgaG92ZXJpbmcgdGhlIGNoYXJ0IGFyZWFcclxuICAgICAqL1xyXG4gICAgdGhpcy56ci5vbignbW91c2Vtb3ZlJywgcGFyYW1zID0+IHtcclxuICAgICAgY29uc3QgcG9pbnRJblBpeGVsID0gW3BhcmFtcy5vZmZzZXRYLCBwYXJhbXMub2Zmc2V0WV07XHJcbiAgICAgIGNvbnN0IHBvaW50SW5HcmlkID0gZWMuY29udmVydEZyb21QaXhlbCgnZ3JpZCcsIHBvaW50SW5QaXhlbCk7XHJcbiAgICAgIC8qIFxyXG4gICAgICAgKiBMb2dpYyB0byBlbWl0IHRvIHRoZSBmYXRoZXIgY29tcG9uZW50IHRoZSB4IGFuZCB5IGNkaW5hdGVzIHdoZW4gdGhlXHJcbiAgICAgICAqIGN1cnNvciBpcyBob3ZlcmluZyB0aGUgY2hhcnQgYXJlYSAuXHJcbiAgICAgICAqL1xyXG4gICAgICBpZiAoZWMuY29udGFpblBpeGVsKCdncmlkJywgcG9pbnRJblBpeGVsKSAmJiBwb2ludEluR3JpZCkge1xyXG4gICAgICAgIGxldCBuZXdQb2ludDogeyB4OiBudW1iZXIsIHk6IG51bWJlciB9ID0ge1xyXG4gICAgICAgICAgeDogK3BvaW50SW5HcmlkWzBdLnRvRml4ZWQoMyksXHJcbiAgICAgICAgICB5OiArcG9pbnRJbkdyaWRbMV0udG9GaXhlZCgzKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgdGhpcy5jaGFydEhvdmVyLmVtaXQobmV3UG9pbnQpO1xyXG4gICAgICB9XHJcbiAgICAgIC8qIExvZ2ljIHRvIGNoYW5nZSB0aGUgY3Vyc29yIGljb24gd2hlbiB0aGUgXCJDbGljayB0byBBZGQgUG9pbnRcIiBmZWF0dXJlIGlzIGFjdGl2ZSBhbmQgdmljZXZlcnNhLiAqL1xyXG4gICAgICBjb25zdCBvcHRpb246IGFueSA9IGVjLmdldE9wdGlvbigpO1xyXG4gICAgICBjb25zdCBhZGRQb2ludElzQWN0aXZlID0gb3B0aW9uPy50b29sYm94Py5bMF0/LmZlYXR1cmU/Lm15QWRkUG9pbnQ/Lmljb25TdGF0dXM7XHJcbiAgICAgIGlmIChhZGRQb2ludElzQWN0aXZlKSB7XHJcbiAgICAgICAgdGhpcy56cj8uc2V0Q3Vyc29yU3R5bGUoXHJcbiAgICAgICAgICBlYy5jb250YWluUGl4ZWwoJ2dyaWQnLCBwb2ludEluUGl4ZWwpID8gJ2NvcHknIDogJ2RlZmF1bHQnXHJcbiAgICAgICAgKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBsZXQgY2hhcnQ6IENoYXJ0ID0gY2hhbmdlc1snY2hhcnQnXT8uY3VycmVudFZhbHVlO1xyXG4gICAgaWYgKGNoYXJ0KSB7XHJcbiAgICAgIHRoaXMuY2hhcnRPcHRpb24gPSB7XHJcbiAgICAgICAgdGl0bGU6IHtcclxuICAgICAgICAgIHRleHQ6IGNoYXJ0LnRpdGxlLFxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgZ3JpZDoge1xyXG4gICAgICAgICAgd2lkdGg6ICc3MCUnXHJcbiAgICAgICAgfSxcclxuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuZGFya1RoZW1lID8gdGhpcy5kYXJrVGhlbWVCYWNrZ3JvdW5kID8/ICcjMzAzMDMwJyA6ICd0cmFuc3BhcmVudCcsIHRvb2x0aXA6IHtcclxuICAgICAgICAgIGF4aXNQb2ludGVyOiB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdjcm9zcycsXHJcbiAgICAgICAgICAgIGNyb3NzU3R5bGU6IHtcclxuICAgICAgICAgICAgICBjb2xvcjogJyNiZWJlYmUnXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICB9LFxyXG4gICAgICAgIHRvb2xib3g6IHtcclxuICAgICAgICAgIG9yaWVudDogJ2hvcml6b250YWwnLFxyXG4gICAgICAgICAgbGVmdDogJ2NlbnRlcicsXHJcbiAgICAgICAgICBmZWF0dXJlOiB7XHJcbiAgICAgICAgICAgIGRhdGFab29tOiB7XHJcbiAgICAgICAgICAgICAgYnJ1c2hTdHlsZToge1xyXG4gICAgICAgICAgICAgICAgYm9yZGVyQ29sb3I6ICcjMDAwJyxcclxuICAgICAgICAgICAgICAgIGJvcmRlcldpZHRoOiAxLFxyXG4gICAgICAgICAgICAgICAgYm9yZGVyVHlwZTogJ2Rhc2hlZCdcclxuICAgICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgICAgICBzYXZlQXNJbWFnZToge30sXHJcbiAgICAgICAgICAgIHJlc3RvcmU6IHt9LFxyXG4gICAgICAgICAgICBteUFkZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgc2hvdzogY2hhcnQuY2xpY2tUb0FkZFBvaW50ID8/IGZhbHNlLFxyXG4gICAgICAgICAgICAgIHRpdGxlOiBjaGFydC5hZGRQb2ludEN1c3RvbU5hbWUgPz8gJ0FkZCBQb2ludCcsXHJcbiAgICAgICAgICAgICAgaWNvbjogdGhpcy5kYXJrVGhlbWUgPyBBRERfUE9JTlRfSU1HX09GRl9EQVJLIDogQUREX1BPSU5UX0lNR19PRkZfTElHSFQsXHJcbiAgICAgICAgICAgICAgaWNvblN0YXR1czogZmFsc2UsXHJcbiAgICAgICAgICAgICAgb25jbGljazogKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgbGV0IG9wdGlvbjogYW55ID0gdGhpcy5lY2hhcnRzSW5zdGFuY2U/LmdldE9wdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgbGV0IHN0YXR1cyA9IG9wdGlvbi50b29sYm94WzBdLmZlYXR1cmUubXlBZGRQb2ludC5pY29uU3RhdHVzO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5lY2hhcnRzSW5zdGFuY2U/LnNldE9wdGlvbih7XHJcbiAgICAgICAgICAgICAgICAgIHRvb2xib3g6IHtcclxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlOiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICBteUFkZFBvaW50OiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb25TdGF0dXM6ICFzdGF0dXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGljb246ICFzdGF0dXMgPyBBRERfUE9JTlRfSU1HX09OIDogdGhpcy5kYXJrVGhlbWUgPyBBRERfUE9JTlRfSU1HX09GRl9EQVJLIDogQUREX1BPSU5UX0lNR19PRkZfTElHSFRcclxuICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIGRhdGFab29tOiBbXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnNpZGUnLFxyXG4gICAgICAgICAgICB4QXhpc0luZGV4OiBbMF0sXHJcbiAgICAgICAgICAgIHRocm90dGxlOiAwLFxyXG4gICAgICAgICAgICBmaWx0ZXJNb2RlOiAnbm9uZScsXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY2hhcnQuc2Nyb2xsVG9ab29tID8/IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICB7XHJcbiAgICAgICAgICAgIHR5cGU6ICdpbnNpZGUnLFxyXG4gICAgICAgICAgICB5QXhpc0luZGV4OiBbMF0sXHJcbiAgICAgICAgICAgIHRocm90dGxlOiAwLFxyXG4gICAgICAgICAgICBmaWx0ZXJNb2RlOiAnbm9uZScsXHJcbiAgICAgICAgICAgIGRpc2FibGVkOiAhY2hhcnQuc2Nyb2xsVG9ab29tID8/IHRydWVcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgICBsZWdlbmQ6IHtcclxuICAgICAgICAgIGluYWN0aXZlQ29sb3I6IHRoaXMuZGFya1RoZW1lID8gJyM4YjhiOGInIDogJyNjY2MnLFxyXG4gICAgICAgICAgZGF0YTogY2hhcnQuc2hhcGVzLm1hcChcclxuICAgICAgICAgICAgKHNoYXBlOiBTaGFwZSkgPT4gKHtcclxuICAgICAgICAgICAgICBuYW1lOiBzaGFwZS5uYW1lLFxyXG4gICAgICAgICAgICAgIGljb246ICdjaXJjbGUnXHJcbiAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICApLFxyXG4gICAgICAgICAgc2VsZWN0ZWQ6IGNoYXJ0LnNoYXBlcy5yZWR1Y2UoKGFjY3VtdWxhdG9yLCBzaGFwZTogU2hhcGUpID0+ICh7IC4uLmFjY3VtdWxhdG9yLCBbc2hhcGUubmFtZSBhcyBzdHJpbmddOiBzaGFwZS5zZWxlY3RlZEJ5RGVmYXVsdCA/PyB0cnVlIH0pLCB7fSksXHJcbiAgICAgICAgICBzaG93OiBjaGFydC5zaG93TGVnZW5kID8/IGZhbHNlLFxyXG4gICAgICAgICAgb3JpZW50OiAndmVydGljYWwnLFxyXG4gICAgICAgICAgbGVmdDogJ3JpZ2h0JyxcclxuICAgICAgICAgIHBhZGRpbmc6IFs2MCwgMjBdLFxyXG4gICAgICAgICAgdHlwZTogJ3Njcm9sbCcsXHJcbiAgICAgICAgICB0ZXh0U3R5bGU6IHtcclxuICAgICAgICAgICAgd2lkdGg6IDEyMCxcclxuICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxyXG4gICAgICAgICAgICBvdmVyZmxvdzogJ2JyZWFrJ1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0sXHJcbiAgICAgICAgeEF4aXM6IHtcclxuICAgICAgICAgIHR5cGU6IGNoYXJ0LnhBeGlzVHlwZSxcclxuICAgICAgICAgIG5hbWU6IGNoYXJ0LnhBeGlzVW9tID8gYCR7Y2hhcnQueEF4aXNOYW1lfSBbICR7Y2hhcnQueEF4aXNVb219IF1gIDogY2hhcnQueEF4aXNOYW1lLFxyXG4gICAgICAgICAgbmFtZUxvY2F0aW9uOiAnbWlkZGxlJyxcclxuICAgICAgICAgIG5hbWVHYXA6IDMwLFxyXG4gICAgICAgICAgc3BsaXRMaW5lOiB7XHJcbiAgICAgICAgICAgIHNob3c6IGNoYXJ0LnNob3dHcmlkID8/IHRydWUsXHJcbiAgICAgICAgICAgIGxpbmVTdHlsZToge1xyXG4gICAgICAgICAgICAgIGNvbG9yOiB0aGlzLmRhcmtUaGVtZSA/ICcjNTk1OTU5JyA6ICcjY2NjJ1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgbWluOiBjaGFydC54TWluPy50b0ZpeGVkKGNoYXJ0Lm1heEF4ZXNEZWNpbWFscyA/PyB0aGlzLk1BWF9ERUNJTUFMUyksXHJcbiAgICAgICAgICBtYXg6IGNoYXJ0LnhNYXg/LnRvRml4ZWQoY2hhcnQubWF4QXhlc0RlY2ltYWxzID8/IHRoaXMuTUFYX0RFQ0lNQUxTKSxcclxuICAgICAgICB9LFxyXG4gICAgICAgIHlBeGlzOiB7XHJcbiAgICAgICAgICB0eXBlOiBjaGFydC55QXhpc1R5cGUsXHJcbiAgICAgICAgICBuYW1lOiBjaGFydC55QXhpc1VvbSA/IGAke2NoYXJ0LnlBeGlzTmFtZX0gWyAke2NoYXJ0LnlBeGlzVW9tfSBdYCA6IGNoYXJ0LnlBeGlzTmFtZSxcclxuICAgICAgICAgIG5hbWVMb2NhdGlvbjogJ21pZGRsZScsXHJcbiAgICAgICAgICBuYW1lR2FwOiA1MCxcclxuICAgICAgICAgIHNwbGl0TGluZToge1xyXG4gICAgICAgICAgICBzaG93OiBjaGFydC5zaG93R3JpZCA/PyB0cnVlLFxyXG4gICAgICAgICAgICBsaW5lU3R5bGU6IHtcclxuICAgICAgICAgICAgICBjb2xvcjogdGhpcy5kYXJrVGhlbWUgPyAnIzU5NTk1OScgOiAnI2NjYydcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIG1pbjogY2hhcnQueU1pbj8udG9GaXhlZChjaGFydC5tYXhBeGVzRGVjaW1hbHMgPz8gdGhpcy5NQVhfREVDSU1BTFMpLFxyXG4gICAgICAgICAgbWF4OiBjaGFydC55TWF4Py50b0ZpeGVkKGNoYXJ0Lm1heEF4ZXNEZWNpbWFscyA/PyB0aGlzLk1BWF9ERUNJTUFMUyksXHJcbiAgICAgICAgfSxcclxuICAgICAgICBzZXJpZXM6IHRoaXMuY3JlYXRlU2VyaWVzKGNoYXJ0LnNoYXBlcyksXHJcbiAgICAgICAgYW5pbWF0aW9uOiBjaGFydC5oYXNBbmltYXRpb25zLFxyXG4gICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBjaGFydC5hbmltYXRpb25EdXJhdGlvbiA/PyA1MDAsXHJcbiAgICAgICAgYW5pbWF0aW9uRWFzaW5nOiAnY3ViaWNPdXQnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjcmVhdGVTZXJpZXMoc2hhcGVzOiBTaGFwZVtdKTogQXJyYXk8TGluZVNlcmllc09wdGlvbiB8IEN1c3RvbVNlcmllc09wdGlvbiB8IFNjYXR0ZXJTZXJpZXNPcHRpb24+IHtcclxuICAgIGxldCBzZXJpZXM6IEFycmF5PExpbmVTZXJpZXNPcHRpb24gfCBDdXN0b21TZXJpZXNPcHRpb24gfCBTY2F0dGVyU2VyaWVzT3B0aW9uPiA9IFtdO1xyXG4gICAgc2hhcGVzLmZvckVhY2goXHJcbiAgICAgIChzaGFwZTogU2hhcGUpID0+IHtcclxuICAgICAgICBzd2l0Y2ggKHNoYXBlLnZhcmlhbnQpIHtcclxuICAgICAgICAgIGNhc2UgU2hhcGVWYXJpYW50LlRSQUNFOlxyXG4gICAgICAgICAgICBzZXJpZXMucHVzaCh0aGlzLmNyZWF0ZVRyYWNlKHNoYXBlIGFzIFRyYWNlKSlcclxuICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICBkZWZhdWx0OlxyXG4gICAgICAgICAgICBicmVhaztcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgICk7XHJcbiAgICByZXR1cm4gc2VyaWVzO1xyXG4gIH1cclxuXHJcbiAgY3JlYXRlVHJhY2UodHJhY2U6IFRyYWNlKTogTGluZVNlcmllc09wdGlvbiB8IFNjYXR0ZXJTZXJpZXNPcHRpb24ge1xyXG4gICAgcmV0dXJuIHtcclxuICAgICAgdHlwZTogdHJhY2UudHlwZSxcclxuICAgICAgbmFtZTogdHJhY2UubmFtZSxcclxuICAgICAgZGF0YTogdHJhY2UucG9pbnRzLm1hcChcclxuICAgICAgICAocG9pbnQ6IFBvaW50KSA9PiAoe1xyXG4gICAgICAgICAgdmFsdWU6IFtwb2ludC54LCBwb2ludC55XSxcclxuICAgICAgICAgIHN5bWJvbDogcG9pbnQuc3ltYm9sID8/ICdjaXJjbGUnLFxyXG4gICAgICAgICAgbmFtZTogcG9pbnQubmFtZSxcclxuICAgICAgICAgIHN5bWJvbFNpemU6IHBvaW50LnN5bWJvbFNpemUgPz8gMixcclxuICAgICAgICAgIGl0ZW1TdHlsZToge1xyXG4gICAgICAgICAgICBjb2xvcjogcG9pbnQuY29sb3JcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgICBlbXBoYXNpczoge1xyXG4gICAgICAgICAgICBkaXNhYmxlZDogdHJ1ZVxyXG4gICAgICAgICAgfSxcclxuICAgICAgICAgIGxhYmVsOiB7XHJcbiAgICAgICAgICAgIHNob3c6IHRydWUsXHJcbiAgICAgICAgICAgIHBvc2l0aW9uOiAnYm90dG9tJyxcclxuICAgICAgICAgICAgYWxpZ246ICdsZWZ0JyxcclxuICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ2JvdHRvbScsXHJcbiAgICAgICAgICAgIGZvcm1hdHRlcjogKCkgPT4gYCR7cG9pbnQubmFtZSA/PyAnJ31gLFxyXG4gICAgICAgICAgICBmb250U2l6ZTogMTMsXHJcbiAgICAgICAgICAgIHBhZGRpbmc6IFswLCAwLCAwLCAxMF0sXHJcbiAgICAgICAgICAgIHdpZHRoOiAxMDAsXHJcbiAgICAgICAgICAgIG92ZXJmbG93OiAndHJ1bmNhdGUnLFxyXG4gICAgICAgICAgICBlbGxpcHNpczogJy4uLicsXHJcbiAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkJyxcclxuICAgICAgICAgICAgY29sb3I6IHRoaXMuZGFya1RoZW1lID8gJyNmZmYnIDogJyMwMDAnXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAgdG9vbHRpcDoge1xyXG4gICAgICAgICAgICBmb3JtYXR0ZXI6ICh7IHZhbHVlIH06IHsgdmFsdWU6IG51bWJlcltdIH0pID0+IGBcclxuICAgICAgICAgICAgICA8c3Ryb25nPiR7dGhpcy5jaGFydD8ueEF4aXNOYW1lfTo8L3N0cm9uZz4gJHt2YWx1ZVswXS50b0ZpeGVkKDMpLnJlcGxhY2UoL1suLF0wMDAkLywgXCJcIil9XHJcbiAgICAgICAgICAgICAgPGJyPlxyXG4gICAgICAgICAgICAgIDxzdHJvbmc+JHt0aGlzLmNoYXJ0Py55QXhpc05hbWV9Ojwvc3Ryb25nPiAke3ZhbHVlWzFdLnRvRml4ZWQoMykucmVwbGFjZSgvWy4sXTAwMCQvLCBcIlwiKX1cclxuICAgICAgICAgICAgYFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICAgICksXHJcbiAgICAgIGNvbG9yOiB0cmFjZS5jb2xvcixcclxuICAgICAgbGluZVN0eWxlOiB7XHJcbiAgICAgICAgd2lkdGg6IHRyYWNlLndpZHRoLFxyXG4gICAgICAgIHR5cGU6IHRyYWNlLnN0eWxlLFxyXG4gICAgICAgIG9wYWNpdHk6IHRyYWNlLm9wYWNpdHkgPz8gMVxyXG4gICAgICB9LFxyXG4gICAgICBzbW9vdGg6IHRyYWNlLnNtb290aCA/PyBmYWxzZVxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCkge1xyXG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveWVkJC5jb21wbGV0ZSgpO1xyXG4gIH1cclxuXHJcbn1cclxuIl19
@@ -1,43 +0,0 @@
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
- }
24
- KiwiChartModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
25
- KiwiChartModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartModule, declarations: [KiwiChartComponent], imports: [CommonModule, i1.NgxEchartsModule], exports: [KiwiChartComponent] });
26
- KiwiChartModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartModule, imports: [CommonModule,
27
- NgxEchartsModule.forRoot({ echarts })] });
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.0.1", ngImport: i0, type: KiwiChartModule, decorators: [{
29
- type: NgModule,
30
- args: [{
31
- declarations: [
32
- KiwiChartComponent
33
- ],
34
- imports: [
35
- CommonModule,
36
- NgxEchartsModule.forRoot({ echarts })
37
- ],
38
- exports: [
39
- KiwiChartComponent
40
- ]
41
- }]
42
- }] });
43
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2hhcnQubW9kdWxlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2l3aWJpdC9jaGFydC9zcmMvbGliL2NoYXJ0Lm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDL0MsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFDeEMsT0FBTyxFQUFFLGNBQWMsRUFBRSxnQkFBZ0IsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDM0ksT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN6RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7OztBQUNuRCxPQUFPLENBQUMsR0FBRyxDQUFDO0lBQ1YsY0FBYztJQUNkLGdCQUFnQjtJQUNoQixhQUFhO0lBQ2IsU0FBUztJQUNULGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGdCQUFnQjtJQUNoQixZQUFZO0NBQ2IsQ0FBQyxDQUFDO0FBZUgsTUFBTSxPQUFPLGVBQWU7OzRHQUFmLGVBQWU7NkdBQWYsZUFBZSxpQkFWeEIsa0JBQWtCLGFBR2xCLFlBQVksa0NBSVosa0JBQWtCOzZHQUdULGVBQWUsWUFQeEIsWUFBWTtRQUNaLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDOzJGQU01QixlQUFlO2tCQVozQixRQUFRO21CQUFDO29CQUNSLFlBQVksRUFBRTt3QkFDWixrQkFBa0I7cUJBQ25CO29CQUNELE9BQU8sRUFBRTt3QkFDUCxZQUFZO3dCQUNaLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO3FCQUN0QztvQkFDRCxPQUFPLEVBQUU7d0JBQ1Asa0JBQWtCO3FCQUNuQjtpQkFDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE5nTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEtpd2lDaGFydENvbXBvbmVudCB9IGZyb20gJy4vY2hhcnQuY29tcG9uZW50JztcclxuaW1wb3J0IHsgTmd4RWNoYXJ0c01vZHVsZSB9IGZyb20gJ25neC1lY2hhcnRzJztcclxuaW1wb3J0ICogYXMgZWNoYXJ0cyBmcm9tICdlY2hhcnRzL2NvcmUnO1xyXG5pbXBvcnQgeyBUaXRsZUNvbXBvbmVudCwgVG9vbHRpcENvbXBvbmVudCwgR3JpZENvbXBvbmVudCwgTGVnZW5kQ29tcG9uZW50LCBEYXRhWm9vbUNvbXBvbmVudCwgVG9vbGJveENvbXBvbmVudCB9IGZyb20gJ2VjaGFydHMvY29tcG9uZW50cyc7XHJcbmltcG9ydCB7IExpbmVDaGFydCwgU2NhdHRlckNoYXJ0IH0gZnJvbSAnZWNoYXJ0cy9jaGFydHMnO1xyXG5pbXBvcnQgeyBDYW52YXNSZW5kZXJlciB9IGZyb20gJ2VjaGFydHMvcmVuZGVyZXJzJztcclxuZWNoYXJ0cy51c2UoW1xyXG4gIFRpdGxlQ29tcG9uZW50LFxyXG4gIFRvb2x0aXBDb21wb25lbnQsXHJcbiAgR3JpZENvbXBvbmVudCxcclxuICBMaW5lQ2hhcnQsXHJcbiAgQ2FudmFzUmVuZGVyZXIsXHJcbiAgTGVnZW5kQ29tcG9uZW50LFxyXG4gIERhdGFab29tQ29tcG9uZW50LFxyXG4gIFRvb2xib3hDb21wb25lbnQsXHJcbiAgU2NhdHRlckNoYXJ0XHJcbl0pO1xyXG5cclxuXHJcbkBOZ01vZHVsZSh7XHJcbiAgZGVjbGFyYXRpb25zOiBbXHJcbiAgICBLaXdpQ2hhcnRDb21wb25lbnRcclxuICBdLFxyXG4gIGltcG9ydHM6IFtcclxuICAgIENvbW1vbk1vZHVsZSxcclxuICAgIE5neEVjaGFydHNNb2R1bGUuZm9yUm9vdCh7IGVjaGFydHMgfSlcclxuICBdLFxyXG4gIGV4cG9ydHM6IFtcclxuICAgIEtpd2lDaGFydENvbXBvbmVudFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIEtpd2lDaGFydE1vZHVsZSB7IH1cclxuIl19