@c8y/ngx-components 1021.66.0 → 1021.70.1
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/core/common/bytes.pipe.d.ts +26 -10
- package/core/common/bytes.pipe.d.ts.map +1 -1
- package/echart/charts.component.d.ts +14 -3
- package/echart/charts.component.d.ts.map +1 -1
- package/esm2022/core/common/bytes.pipe.mjs +47 -18
- package/esm2022/core/data-grid/data-grid.component.mjs +3 -3
- package/esm2022/echart/charts.component.mjs +50 -3
- package/esm2022/messaging-management/api/model/backlogQuota.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespace.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceDetails.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceList.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespacePolicies.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespacePublishers.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceSubscribers.mjs +2 -0
- package/esm2022/messaging-management/api/model/namespaceTopics.mjs +2 -0
- package/esm2022/messaging-management/api/model/pageStatistics.mjs +2 -0
- package/esm2022/messaging-management/api/model/pageable.mjs +2 -0
- package/esm2022/messaging-management/api/model/sortable.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriber.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberList.mjs +2 -0
- package/esm2022/messaging-management/api/model/subscriberToDelete.mjs +2 -0
- package/esm2022/messaging-management/api/model/topic.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicDetailFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicList.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicListFilters.mjs +2 -0
- package/esm2022/messaging-management/api/model/topicType.mjs +9 -0
- package/esm2022/messaging-management/api/services/messaging-namespaces.service.mjs +83 -0
- package/esm2022/messaging-management/api/services/messaging-subscribers.service.mjs +55 -0
- package/esm2022/messaging-management/api/services/messaging-topics.service.mjs +48 -0
- package/esm2022/messaging-management/c8y-ngx-components-messaging-management.mjs +5 -0
- package/esm2022/messaging-management/constants.mjs +4 -0
- package/esm2022/messaging-management/index.mjs +2 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.mjs +43 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.mjs +36 -0
- package/esm2022/messaging-management/messaging/namespace-list/namespace-list.component.mjs +51 -0
- package/esm2022/messaging-management/messaging/shared/usage/usage.component.mjs +68 -0
- package/esm2022/messaging-management/messaging/topic/topic-list-view.component.mjs +81 -0
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.mjs +220 -0
- package/esm2022/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.mjs +137 -0
- package/esm2022/messaging-management/messaging/topic/topics-data-grid.service.mjs +113 -0
- package/esm2022/messaging-management/messaging-management.guard.mjs +40 -0
- package/esm2022/messaging-management/messaging-management.module.mjs +72 -0
- package/esm2022/messaging-management/navigator/messaging-navigator-factory.mjs +55 -0
- package/esm2022/messaging-management/navigator/topic-details-tab.factory.mjs +33 -0
- package/esm2022/messaging-management/utils/backlog-quota-limit.pipe.mjs +32 -0
- package/esm2022/messaging-management/utils/namespace-props.mjs +23 -0
- package/esm2022/messaging-management/utils/time-to-live.pipe.mjs +122 -0
- package/esm2022/operations/device-selector/device-selector.component.mjs +5 -1
- package/esm2022/widgets/cockpit/index.mjs +3 -1
- package/esm2022/widgets/cockpit-exports/index.mjs +8 -1
- package/esm2022/widgets/definitions/index.mjs +2 -1
- package/esm2022/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +5 -0
- package/esm2022/widgets/definitions/radial-gauge/index.mjs +33 -0
- package/esm2022/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.mjs +18 -3
- package/esm2022/widgets/implementations/info-gauge/index.mjs +2 -2
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.mjs +295 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.mjs +141 -11
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.mjs +67 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.mjs +34 -6
- package/esm2022/widgets/implementations/info-gauge/info-gauge-widget.module.mjs +9 -4
- package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.mjs +97 -0
- package/esm2022/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.mjs +369 -0
- package/fesm2022/c8y-ngx-components-echart.mjs +49 -2
- package/fesm2022/c8y-ngx-components-echart.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-messaging-management.mjs +1225 -0
- package/fesm2022/c8y-ngx-components-messaging-management.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs +4 -0
- package/fesm2022/c8y-ngx-components-operations-device-selector.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs +7 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit-exports.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs +2 -0
- package/fesm2022/c8y-ngx-components-widgets-cockpit.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs +40 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions-radial-gauge.mjs.map +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs +1 -0
- package/fesm2022/c8y-ngx-components-widgets-definitions.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs +17 -2
- package/fesm2022/c8y-ngx-components-widgets-implementations-datapoints-graph.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs +991 -28
- package/fesm2022/c8y-ngx-components-widgets-implementations-info-gauge.mjs.map +1 -1
- package/fesm2022/c8y-ngx-components.mjs +49 -22
- package/fesm2022/c8y-ngx-components.mjs.map +1 -1
- package/locales/de.po +272 -5
- package/locales/es.po +271 -4
- package/locales/fr.po +272 -5
- package/locales/ja_JP.po +272 -5
- package/locales/ko.po +271 -4
- package/locales/locales.pot +271 -4
- package/locales/nl.po +271 -4
- package/locales/pl.po +271 -4
- package/locales/pt_BR.po +272 -5
- package/locales/zh_CN.po +271 -4
- package/locales/zh_TW.po +272 -5
- package/messaging-management/api/model/backlogQuota.d.ts +14 -0
- package/messaging-management/api/model/backlogQuota.d.ts.map +1 -0
- package/messaging-management/api/model/namespace.d.ts +13 -0
- package/messaging-management/api/model/namespace.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceDetails.d.ts +8 -0
- package/messaging-management/api/model/namespaceDetails.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceList.d.ts +5 -0
- package/messaging-management/api/model/namespaceList.d.ts.map +1 -0
- package/messaging-management/api/model/namespacePolicies.d.ts +10 -0
- package/messaging-management/api/model/namespacePolicies.d.ts.map +1 -0
- package/messaging-management/api/model/namespacePublishers.d.ts +4 -0
- package/messaging-management/api/model/namespacePublishers.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceSubscribers.d.ts +4 -0
- package/messaging-management/api/model/namespaceSubscribers.d.ts.map +1 -0
- package/messaging-management/api/model/namespaceTopics.d.ts +5 -0
- package/messaging-management/api/model/namespaceTopics.d.ts.map +1 -0
- package/messaging-management/api/model/pageStatistics.d.ts +12 -0
- package/messaging-management/api/model/pageStatistics.d.ts.map +1 -0
- package/messaging-management/api/model/pageable.d.ts +8 -0
- package/messaging-management/api/model/pageable.d.ts.map +1 -0
- package/messaging-management/api/model/sortable.d.ts +6 -0
- package/messaging-management/api/model/sortable.d.ts.map +1 -0
- package/messaging-management/api/model/subscriber.d.ts +28 -0
- package/messaging-management/api/model/subscriber.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberFilters.d.ts +13 -0
- package/messaging-management/api/model/subscriberFilters.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberList.d.ts +7 -0
- package/messaging-management/api/model/subscriberList.d.ts.map +1 -0
- package/messaging-management/api/model/subscriberToDelete.d.ts +12 -0
- package/messaging-management/api/model/subscriberToDelete.d.ts.map +1 -0
- package/messaging-management/api/model/topic.d.ts +52 -0
- package/messaging-management/api/model/topic.d.ts.map +1 -0
- package/messaging-management/api/model/topicDetailFilters.d.ts +9 -0
- package/messaging-management/api/model/topicDetailFilters.d.ts.map +1 -0
- package/messaging-management/api/model/topicList.d.ts +7 -0
- package/messaging-management/api/model/topicList.d.ts.map +1 -0
- package/messaging-management/api/model/topicListFilters.d.ts +12 -0
- package/messaging-management/api/model/topicListFilters.d.ts.map +1 -0
- package/messaging-management/api/model/topicType.d.ts +8 -0
- package/messaging-management/api/model/topicType.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-namespaces.service.d.ts +52 -0
- package/messaging-management/api/services/messaging-namespaces.service.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-subscribers.service.d.ts +30 -0
- package/messaging-management/api/services/messaging-subscribers.service.d.ts.map +1 -0
- package/messaging-management/api/services/messaging-topics.service.d.ts +21 -0
- package/messaging-management/api/services/messaging-topics.service.d.ts.map +1 -0
- package/messaging-management/c8y-ngx-components-messaging-management.d.ts.map +1 -0
- package/messaging-management/constants.d.ts +4 -0
- package/messaging-management/constants.d.ts.map +1 -0
- package/messaging-management/index.d.ts +2 -0
- package/messaging-management/index.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts +29 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item-card/namespace-item-card.component.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts +15 -0
- package/messaging-management/messaging/namespace-list/namespace-item/namespace-item.component.d.ts.map +1 -0
- package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts +17 -0
- package/messaging-management/messaging/namespace-list/namespace-list.component.d.ts.map +1 -0
- package/messaging-management/messaging/shared/usage/usage.component.d.ts +40 -0
- package/messaging-management/messaging/shared/usage/usage.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-list-view.component.d.ts +38 -0
- package/messaging-management/messaging/topic/topic-list-view.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts +21 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-data-grid.service.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts +52 -0
- package/messaging-management/messaging/topic/topic-subscribers-view/topic-subscribers-view.component.d.ts.map +1 -0
- package/messaging-management/messaging/topic/topics-data-grid.service.d.ts +13 -0
- package/messaging-management/messaging/topic/topics-data-grid.service.d.ts.map +1 -0
- package/messaging-management/messaging-management.guard.d.ts +12 -0
- package/messaging-management/messaging-management.guard.d.ts.map +1 -0
- package/messaging-management/messaging-management.module.d.ts +7 -0
- package/messaging-management/messaging-management.module.d.ts.map +1 -0
- package/messaging-management/navigator/messaging-navigator-factory.d.ts +18 -0
- package/messaging-management/navigator/messaging-navigator-factory.d.ts.map +1 -0
- package/messaging-management/navigator/topic-details-tab.factory.d.ts +15 -0
- package/messaging-management/navigator/topic-details-tab.factory.d.ts.map +1 -0
- package/messaging-management/utils/backlog-quota-limit.pipe.d.ts +13 -0
- package/messaging-management/utils/backlog-quota-limit.pipe.d.ts.map +1 -0
- package/messaging-management/utils/namespace-props.d.ts +10 -0
- package/messaging-management/utils/namespace-props.d.ts.map +1 -0
- package/messaging-management/utils/time-to-live.pipe.d.ts +16 -0
- package/messaging-management/utils/time-to-live.pipe.d.ts.map +1 -0
- package/operations/device-selector/device-selector.component.d.ts.map +1 -1
- package/package.json +1 -1
- package/widgets/cockpit/index.d.ts +29 -0
- package/widgets/cockpit/index.d.ts.map +1 -1
- package/widgets/cockpit-exports/index.d.ts +6 -0
- package/widgets/cockpit-exports/index.d.ts.map +1 -1
- package/widgets/definitions/index.d.ts +1 -0
- package/widgets/definitions/index.d.ts.map +1 -1
- package/widgets/definitions/radial-gauge/c8y-ngx-components-widgets-definitions-radial-gauge.d.ts.map +1 -0
- package/widgets/definitions/radial-gauge/index.d.ts +33 -0
- package/widgets/definitions/radial-gauge/index.d.ts.map +1 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts +2 -0
- package/widgets/implementations/datapoints-graph/datapoints-graph-view/datapoints-graph-widget-view.component.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/index.d.ts +1 -1
- package/widgets/implementations/info-gauge/index.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts +339 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/gauge.model.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts +27 -7
- package/widgets/implementations/info-gauge/info-gauge-widget-config/info-gauge-widget-config.component.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts +33 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-config/preset-preview/preset-preview.component.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts +7 -3
- package/widgets/implementations/info-gauge/info-gauge-widget-view/info-gauge-widget-view.component.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts +2 -1
- package/widgets/implementations/info-gauge/info-gauge-widget.module.d.ts.map +1 -1
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts +37 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.component.d.ts.map +1 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts +146 -0
- package/widgets/implementations/info-gauge/radial-gauge/radial-gauge.service.d.ts.map +1 -0
- package/esm2022/widgets/implementations/info-gauge/info-gauge.model.mjs +0 -2
- package/widgets/implementations/info-gauge/info-gauge.model.d.ts +0 -7
- package/widgets/implementations/info-gauge/info-gauge.model.d.ts.map +0 -1
|
@@ -0,0 +1,369 @@
|
|
|
1
|
+
import { Injectable } from '@angular/core';
|
|
2
|
+
import { DatePipe } from '@c8y/ngx-components';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "@c8y/ngx-components";
|
|
5
|
+
export class RadialGaugeService {
|
|
6
|
+
constructor(c8yDatePipe) {
|
|
7
|
+
this.c8yDatePipe = c8yDatePipe;
|
|
8
|
+
this.containerSize = 400;
|
|
9
|
+
}
|
|
10
|
+
setChart(chart) {
|
|
11
|
+
this.chart = chart;
|
|
12
|
+
}
|
|
13
|
+
getChartOptions(gaugeOptions, activeDatapointGauge, selectedPresetId, gaugeOptionsColors, rangeColors, measurement, fractionSize) {
|
|
14
|
+
const colorArray = this.getColorArray(activeDatapointGauge, rangeColors);
|
|
15
|
+
return {
|
|
16
|
+
series: [
|
|
17
|
+
{
|
|
18
|
+
type: 'gauge',
|
|
19
|
+
radius: gaugeOptions?.radius || '90%',
|
|
20
|
+
center: gaugeOptions?.center || ['50%', '50%'],
|
|
21
|
+
startAngle: gaugeOptions?.startAngle || 240,
|
|
22
|
+
endAngle: gaugeOptions?.endAngle || 300,
|
|
23
|
+
min: activeDatapointGauge?.min || 0,
|
|
24
|
+
max: activeDatapointGauge?.max !== undefined && activeDatapointGauge?.max !== null
|
|
25
|
+
? activeDatapointGauge.max
|
|
26
|
+
: 100,
|
|
27
|
+
// Split properties
|
|
28
|
+
splitNumber: gaugeOptions?.splitNumber || 10,
|
|
29
|
+
splitLine: {
|
|
30
|
+
distance: gaugeOptions?.splitLineDistanceRatio
|
|
31
|
+
? this.containerSize *
|
|
32
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
33
|
+
gaugeOptions?.splitLineDistanceRatio
|
|
34
|
+
: gaugeOptions?.splitLineDistance || -30,
|
|
35
|
+
length: gaugeOptions?.splitLineLengthRatio
|
|
36
|
+
? this.containerSize *
|
|
37
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
38
|
+
gaugeOptions?.splitLineLengthRatio
|
|
39
|
+
: gaugeOptions?.splitLineLength || 30,
|
|
40
|
+
lineStyle: {
|
|
41
|
+
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
|
|
42
|
+
? gaugeOptions?.splitLineColor
|
|
43
|
+
: gaugeOptionsColors?.splitLineColor || '#fff',
|
|
44
|
+
width: gaugeOptions?.splitLineWidth || 4
|
|
45
|
+
}
|
|
46
|
+
},
|
|
47
|
+
// Tick properties
|
|
48
|
+
axisTick: {
|
|
49
|
+
show: gaugeOptions?.tickShow || false,
|
|
50
|
+
distance: gaugeOptions?.tickDistanceRatio
|
|
51
|
+
? this.containerSize *
|
|
52
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
53
|
+
gaugeOptions?.tickDistanceRatio
|
|
54
|
+
: gaugeOptions?.tickDistance || -30,
|
|
55
|
+
length: gaugeOptions?.tickLengthRatio
|
|
56
|
+
? this.containerSize *
|
|
57
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
58
|
+
gaugeOptions?.tickLengthRatio
|
|
59
|
+
: gaugeOptions?.tickLength || 8,
|
|
60
|
+
lineStyle: {
|
|
61
|
+
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
|
|
62
|
+
? gaugeOptions.tickColor
|
|
63
|
+
: gaugeOptionsColors?.tickColor || '#fff',
|
|
64
|
+
width: gaugeOptions?.tickWidth || 2
|
|
65
|
+
}
|
|
66
|
+
},
|
|
67
|
+
// Axis properties
|
|
68
|
+
axisLine: {
|
|
69
|
+
lineStyle: {
|
|
70
|
+
width: gaugeOptions?.axisLineWidthRatio
|
|
71
|
+
? this.containerSize * gaugeOptions?.axisLineWidthRatio
|
|
72
|
+
: gaugeOptions?.axisLineWidth || 30,
|
|
73
|
+
color: colorArray
|
|
74
|
+
}
|
|
75
|
+
},
|
|
76
|
+
axisLabel: {
|
|
77
|
+
color: selectedPresetId === 'custom' || selectedPresetId === 'grade-rating'
|
|
78
|
+
? gaugeOptions.axisLabelColor
|
|
79
|
+
: gaugeOptionsColors?.axisLabelColor || 'inherit',
|
|
80
|
+
distance: gaugeOptions?.axisLabelDistanceRatio
|
|
81
|
+
? this.containerSize *
|
|
82
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
83
|
+
gaugeOptions?.axisLabelDistanceRatio
|
|
84
|
+
: gaugeOptions?.axisLabelDistance || 40,
|
|
85
|
+
fontSize: gaugeOptions?.axisLabelFontSizeRatio
|
|
86
|
+
? this.clampRelative(gaugeOptions?.axisLabelFontSizeRatio, gaugeOptions?.axisLabelFontSizeMin, gaugeOptions?.axisLabelFontSizeMax)
|
|
87
|
+
: gaugeOptions?.axisLabelFontSize || 16,
|
|
88
|
+
fontWeight: 'bold',
|
|
89
|
+
fontFamily: gaugeOptionsColors?.fontFamily
|
|
90
|
+
},
|
|
91
|
+
// pointer properties
|
|
92
|
+
pointer: {
|
|
93
|
+
...(gaugeOptions?.pointerStyle !== 'default' && {
|
|
94
|
+
icon: gaugeOptions?.pointerStyle
|
|
95
|
+
}),
|
|
96
|
+
show: gaugeOptions?.showPointer || false,
|
|
97
|
+
length: gaugeOptions?.pointerLengthRatio
|
|
98
|
+
? gaugeOptions?.pointerLengthRatio *
|
|
99
|
+
(this.containerSize * gaugeOptions?.axisLineWidthRatio)
|
|
100
|
+
: gaugeOptions?.pointerLength || '65%',
|
|
101
|
+
width: gaugeOptions?.pointerWidthRatio
|
|
102
|
+
? this.containerSize *
|
|
103
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
104
|
+
gaugeOptions?.pointerWidthRatio
|
|
105
|
+
: gaugeOptions?.pointerWidth || 40,
|
|
106
|
+
offsetCenter: selectedPresetId === 'default'
|
|
107
|
+
? [0, this.containerSize * gaugeOptions?.axisLineWidthRatio * -1]
|
|
108
|
+
: [0, gaugeOptions?.pointerOffset || -30],
|
|
109
|
+
itemStyle: {
|
|
110
|
+
color: selectedPresetId === 'custom'
|
|
111
|
+
? gaugeOptions.pointerColor
|
|
112
|
+
: gaugeOptionsColors?.pointerColor || 'inherit'
|
|
113
|
+
}
|
|
114
|
+
},
|
|
115
|
+
// Progress bar properties
|
|
116
|
+
progress: {
|
|
117
|
+
show: gaugeOptions?.progressBar || false,
|
|
118
|
+
roundCap: gaugeOptions?.progressBarRoundCap || false,
|
|
119
|
+
width: gaugeOptions?.progressBarWidthRatio
|
|
120
|
+
? this.containerSize *
|
|
121
|
+
gaugeOptions?.axisLineWidthRatio *
|
|
122
|
+
gaugeOptions?.progressBarWidthRatio
|
|
123
|
+
: gaugeOptions?.progressBarWidth || 18,
|
|
124
|
+
itemStyle: {
|
|
125
|
+
color: selectedPresetId === 'custom'
|
|
126
|
+
? gaugeOptions.progressBarColor
|
|
127
|
+
: gaugeOptionsColors?.progressBarColor || 'inherit'
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
// Anchor properties
|
|
131
|
+
anchor: gaugeOptions?.anchor
|
|
132
|
+
? {
|
|
133
|
+
...gaugeOptions.anchor,
|
|
134
|
+
size: gaugeOptions?.anchor?.sizeRatio
|
|
135
|
+
? this.containerSize * gaugeOptions?.anchor?.sizeRatio
|
|
136
|
+
: gaugeOptions?.anchor?.size || 45,
|
|
137
|
+
itemStyle: {
|
|
138
|
+
color: selectedPresetId === 'custom'
|
|
139
|
+
? gaugeOptions.pointerColor
|
|
140
|
+
: gaugeOptionsColors?.pointerColor
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
: undefined,
|
|
144
|
+
// Detail properties
|
|
145
|
+
detail: {
|
|
146
|
+
show: gaugeOptions?.showDetail || false,
|
|
147
|
+
valueAnimation: true,
|
|
148
|
+
offsetCenter: gaugeOptions?.detailOffsetCenterYRatio
|
|
149
|
+
? [0, gaugeOptions?.detailOffsetCenterYRatio * this.containerSize]
|
|
150
|
+
: gaugeOptions?.detailOffsetCenter || [0, 0],
|
|
151
|
+
formatter: () => {
|
|
152
|
+
const value = measurement?.value.toFixed(fractionSize) || 0;
|
|
153
|
+
const unit = activeDatapointGauge?.unit || measurement?.unit || '';
|
|
154
|
+
const date = new Date(measurement?.date);
|
|
155
|
+
const formattedDate = this.c8yDatePipe.transform(date);
|
|
156
|
+
return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
|
|
157
|
+
},
|
|
158
|
+
color: 'inherit',
|
|
159
|
+
lineHeight: gaugeOptions?.measurementValueFontRatio
|
|
160
|
+
? this.clampRelative(gaugeOptions?.measurementValueFontRatio * 0.9, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
|
|
161
|
+
: gaugeOptions?.measurementValueFontSize || 32,
|
|
162
|
+
rich: {
|
|
163
|
+
value: {
|
|
164
|
+
fontSize: gaugeOptions?.measurementValueFontRatio
|
|
165
|
+
? this.clampRelative(fractionSize > 5 || measurement?.value > 9999
|
|
166
|
+
? gaugeOptions?.measurementValueFontRatio * 0.5
|
|
167
|
+
: gaugeOptions?.measurementValueFontRatio, gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
|
|
168
|
+
: gaugeOptions?.measurementValueFontSize || 32,
|
|
169
|
+
fontWeight: 'bolder',
|
|
170
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
171
|
+
color: selectedPresetId === 'custom'
|
|
172
|
+
? gaugeOptions.measurementValueColor
|
|
173
|
+
: gaugeOptionsColors?.measurementValueColor || '#777'
|
|
174
|
+
},
|
|
175
|
+
unit: {
|
|
176
|
+
fontSize: gaugeOptions?.unitFontRatio
|
|
177
|
+
? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontMin, gaugeOptions?.unitFontMax)
|
|
178
|
+
: gaugeOptions?.unitFontSize || 20,
|
|
179
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
180
|
+
color: selectedPresetId === 'custom'
|
|
181
|
+
? gaugeOptions?.unitColor
|
|
182
|
+
: gaugeOptionsColors?.unitColor || '#999'
|
|
183
|
+
},
|
|
184
|
+
date: {
|
|
185
|
+
fontSize: gaugeOptions?.dateFontRatio
|
|
186
|
+
? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
|
|
187
|
+
: gaugeOptions?.dateFontSize || 12,
|
|
188
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
189
|
+
color: selectedPresetId === 'custom'
|
|
190
|
+
? gaugeOptions?.dateColor
|
|
191
|
+
: gaugeOptionsColors?.dateColor || '#555'
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
},
|
|
195
|
+
markPoint: {
|
|
196
|
+
symbolSize: 0,
|
|
197
|
+
offsetCenter: gaugeOptions?.detailOffsetCenter || [0, 0],
|
|
198
|
+
data: [
|
|
199
|
+
{
|
|
200
|
+
x: '50%',
|
|
201
|
+
y: '50%',
|
|
202
|
+
label: {
|
|
203
|
+
show: gaugeOptions?.showMarkPoint,
|
|
204
|
+
formatter: () => {
|
|
205
|
+
const value = measurement?.value.toFixed(fractionSize) || 0;
|
|
206
|
+
const unit = activeDatapointGauge?.unit || measurement?.unit || '';
|
|
207
|
+
const date = new Date(measurement?.date);
|
|
208
|
+
const formattedDate = this.c8yDatePipe.transform(date);
|
|
209
|
+
return `{value|${value}}{unit|${unit}} \n {date|${formattedDate}} `;
|
|
210
|
+
},
|
|
211
|
+
color: '#fff',
|
|
212
|
+
align: 'center',
|
|
213
|
+
rich: {
|
|
214
|
+
value: {
|
|
215
|
+
fontSize: gaugeOptions?.measurementValueFontRatio
|
|
216
|
+
? this.clampRelative(fractionSize > 5
|
|
217
|
+
? gaugeOptions?.measurementValueFontRatio * 0.5
|
|
218
|
+
: gaugeOptions?.measurementValueFontRatio, fractionSize > 5
|
|
219
|
+
? gaugeOptions.measurementValueFontMin * 0.5
|
|
220
|
+
: gaugeOptions?.measurementValueFontSizeMin, gaugeOptions?.measurementValueFontSizeMax)
|
|
221
|
+
: gaugeOptions?.measurementValueFontSize || 32,
|
|
222
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
223
|
+
fontWeight: 'bolder',
|
|
224
|
+
color: gaugeOptionsColors?.knobFontColor || '#777'
|
|
225
|
+
},
|
|
226
|
+
unit: {
|
|
227
|
+
fontSize: gaugeOptions?.unitFontRatio
|
|
228
|
+
? this.clampRelative(gaugeOptions?.unitFontRatio, gaugeOptions?.unitFontSizeMin, gaugeOptions?.unitFontSizeMax)
|
|
229
|
+
: gaugeOptions?.unitFontSize || 20,
|
|
230
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
231
|
+
color: gaugeOptionsColors?.knobFontColor || '#999'
|
|
232
|
+
},
|
|
233
|
+
date: {
|
|
234
|
+
fontSize: gaugeOptions?.dateFontRatio
|
|
235
|
+
? this.clampRelative(gaugeOptions?.dateFontRatio, gaugeOptions?.dateFontSizeMin, gaugeOptions?.dateFontSizeMax)
|
|
236
|
+
: gaugeOptions?.dateFontSize || 12,
|
|
237
|
+
fontFamily: gaugeOptionsColors?.fontFamily,
|
|
238
|
+
color: gaugeOptionsColors?.knobFontColor || '#555'
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
data: [
|
|
246
|
+
{
|
|
247
|
+
value: 0 || measurement?.value
|
|
248
|
+
}
|
|
249
|
+
]
|
|
250
|
+
}
|
|
251
|
+
]
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
updateRangeColors() {
|
|
255
|
+
if (!this.chart) {
|
|
256
|
+
return;
|
|
257
|
+
}
|
|
258
|
+
return {
|
|
259
|
+
default: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-form-control-border-color-default'),
|
|
260
|
+
yellow: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-warning'),
|
|
261
|
+
red: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-palette-status-danger')
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
updateGaugeOptionsColors() {
|
|
265
|
+
if (!this.chart) {
|
|
266
|
+
return;
|
|
267
|
+
}
|
|
268
|
+
return {
|
|
269
|
+
splitLineColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
|
|
270
|
+
tickColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
|
|
271
|
+
axisLabelColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
|
|
272
|
+
pointerColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
|
|
273
|
+
knobColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
|
|
274
|
+
knobFontColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-background-default'),
|
|
275
|
+
measurementValueColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
|
|
276
|
+
unitColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-color-default'),
|
|
277
|
+
dateColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-text-muted'),
|
|
278
|
+
progressBarColor: getComputedStyle(this.chart.nativeElement).getPropertyValue('--c8y-root-component-brand-primary'),
|
|
279
|
+
fontFamily: getComputedStyle(document.body).getPropertyValue('font-family')
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
getColorArray(activeDatapointGauge, rangeColors) {
|
|
283
|
+
const min = activeDatapointGauge?.min ?? 0;
|
|
284
|
+
const max = activeDatapointGauge?.max ?? 100;
|
|
285
|
+
const range = max - min;
|
|
286
|
+
const yellowMin = activeDatapointGauge?.yellowRangeMin;
|
|
287
|
+
const yellowMax = activeDatapointGauge?.yellowRangeMax;
|
|
288
|
+
const redMin = activeDatapointGauge?.redRangeMin;
|
|
289
|
+
const redMax = activeDatapointGauge?.redRangeMax;
|
|
290
|
+
const ranges = [];
|
|
291
|
+
// First add red range
|
|
292
|
+
if (redMin != null && redMax != null && redMin < redMax) {
|
|
293
|
+
ranges.push({ start: redMin, end: redMax, color: rangeColors.red });
|
|
294
|
+
}
|
|
295
|
+
// Then add yellow, but clip out any overlap with red
|
|
296
|
+
if (yellowMin != null && yellowMax != null && yellowMin < yellowMax) {
|
|
297
|
+
const redRange = ranges.find(r => r.color === rangeColors.red);
|
|
298
|
+
if (!redRange ||
|
|
299
|
+
yellowMax <= redRange.start || // yellow ends before red
|
|
300
|
+
yellowMin >= redRange.end // yellow starts after red
|
|
301
|
+
) {
|
|
302
|
+
// no overlap
|
|
303
|
+
ranges.push({ start: yellowMin, end: yellowMax, color: rangeColors.yellow });
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
// partial overlap – split yellow into non-overlapping parts
|
|
307
|
+
if (yellowMin < redRange.start) {
|
|
308
|
+
ranges.push({
|
|
309
|
+
start: yellowMin,
|
|
310
|
+
end: Math.min(yellowMax, redRange.start),
|
|
311
|
+
color: rangeColors.yellow
|
|
312
|
+
});
|
|
313
|
+
}
|
|
314
|
+
if (yellowMax > redRange.end) {
|
|
315
|
+
ranges.push({
|
|
316
|
+
start: Math.max(yellowMin, redRange.end),
|
|
317
|
+
end: yellowMax,
|
|
318
|
+
color: rangeColors.yellow
|
|
319
|
+
});
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
// Sort by start position
|
|
324
|
+
ranges.sort((a, b) => a.start - b.start);
|
|
325
|
+
// Build segments
|
|
326
|
+
const segments = [];
|
|
327
|
+
let current = min;
|
|
328
|
+
for (const { start, end, color } of ranges) {
|
|
329
|
+
if (start > current) {
|
|
330
|
+
// Default fill before this range
|
|
331
|
+
segments.push([(start - min) / range, rangeColors.default]);
|
|
332
|
+
}
|
|
333
|
+
// Start color
|
|
334
|
+
segments.push([(start - min) / range, color]);
|
|
335
|
+
// End color
|
|
336
|
+
segments.push([(end - min) / range, color]);
|
|
337
|
+
current = Math.max(current, end);
|
|
338
|
+
}
|
|
339
|
+
// Fill remaining with default
|
|
340
|
+
if (current < max) {
|
|
341
|
+
segments.push([(current - min) / range, rangeColors.default]);
|
|
342
|
+
}
|
|
343
|
+
if (segments.length === 0 || segments[segments.length - 1][0] < 1) {
|
|
344
|
+
segments.push([1, rangeColors.default]);
|
|
345
|
+
}
|
|
346
|
+
return segments;
|
|
347
|
+
}
|
|
348
|
+
clampRelative(ratio, min, max) {
|
|
349
|
+
const clampedValue = this.containerSize * ratio;
|
|
350
|
+
if (clampedValue < min) {
|
|
351
|
+
return min;
|
|
352
|
+
}
|
|
353
|
+
else if (clampedValue > max) {
|
|
354
|
+
return max;
|
|
355
|
+
}
|
|
356
|
+
else {
|
|
357
|
+
return clampedValue;
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, deps: [{ token: i1.DatePipe }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
361
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, providedIn: 'root' }); }
|
|
362
|
+
}
|
|
363
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: RadialGaugeService, decorators: [{
|
|
364
|
+
type: Injectable,
|
|
365
|
+
args: [{
|
|
366
|
+
providedIn: 'root'
|
|
367
|
+
}]
|
|
368
|
+
}], ctorParameters: () => [{ type: i1.DatePipe }] });
|
|
369
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFkaWFsLWdhdWdlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi93aWRnZXRzL2ltcGxlbWVudGF0aW9ucy9pbmZvLWdhdWdlL3JhZGlhbC1nYXVnZS9yYWRpYWwtZ2F1Z2Uuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWMsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBSXZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7O0FBSy9DLE1BQU0sT0FBTyxrQkFBa0I7SUFJN0IsWUFBb0IsV0FBcUI7UUFBckIsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFGekMsa0JBQWEsR0FBRyxHQUFHLENBQUM7SUFFd0IsQ0FBQztJQUU3QyxRQUFRLENBQUMsS0FBaUI7UUFDeEIsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDckIsQ0FBQztJQUVELGVBQWUsQ0FDYixZQUEwQixFQUMxQixvQkFBZ0MsRUFDaEMsZ0JBQXdCLEVBQ3hCLGtCQUFzQyxFQUN0QyxXQUE2RCxFQUM3RCxXQUE4QixFQUM5QixZQUFvQjtRQUVwQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLG9CQUFvQixFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBRXpFLE9BQU87WUFDTCxNQUFNLEVBQUU7Z0JBQ047b0JBQ0UsSUFBSSxFQUFFLE9BQU87b0JBQ2IsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksS0FBSztvQkFDckMsTUFBTSxFQUFFLFlBQVksRUFBRSxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDO29CQUM5QyxVQUFVLEVBQUUsWUFBWSxFQUFFLFVBQVUsSUFBSSxHQUFHO29CQUMzQyxRQUFRLEVBQUUsWUFBWSxFQUFFLFFBQVEsSUFBSSxHQUFHO29CQUN2QyxHQUFHLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxJQUFJLENBQUM7b0JB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QUcsQ0FBQztRQUNiLENBQUM7YUFBTSxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxZQUFZLENBQUM7UUFDdEIsQ0FBQztJQUNILENBQUM7K0dBbGRVLGtCQUFrQjttSEFBbEIsa0JBQWtCLGNBRmpCLE1BQU07OzRGQUVQLGtCQUFrQjtrQkFIOUIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFbGVtZW50UmVmLCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBLUElEZXRhaWxzIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cy9kYXRhcG9pbnQtc2VsZWN0b3InO1xuaW1wb3J0IHsgR2F1Z2VPcHRpb25zLCBHYXVnZU9wdGlvbnNDb2xvcnMgfSBmcm9tICcuLi9pbmZvLWdhdWdlLXdpZGdldC1jb25maWcvZ2F1Z2UubW9kZWwnO1xuaW1wb3J0IHsgSU1lYXN1cmVtZW50VmFsdWUgfSBmcm9tICdAYzh5L2NsaWVudCc7XG5pbXBvcnQgeyBEYXRlUGlwZSB9IGZyb20gJ0BjOHkvbmd4LWNvbXBvbmVudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBSYWRpYWxHYXVnZVNlcnZpY2Uge1xuICBwcml2YXRlIGNoYXJ0OiBFbGVtZW50UmVmO1xuICBjb250YWluZXJTaXplID0gNDAwO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYzh5RGF0ZVBpcGU6IERhdGVQaXBlKSB7fVxuXG4gIHNldENoYXJ0KGNoYXJ0OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgdGhpcy5jaGFydCA9IGNoYXJ0O1xuICB9XG5cbiAgZ2V0Q2hhcnRPcHRpb25zKFxuICAgIGdhdWdlT3B0aW9uczogR2F1Z2VPcHRpb25zLFxuICAgIGFjdGl2ZURhdGFwb2ludEdhdWdlOiBLUElEZXRhaWxzLFxuICAgIHNlbGVjdGVkUHJlc2V0SWQ6IHN0cmluZyxcbiAgICBnYXVnZU9wdGlvbnNDb2xvcnM6IEdhdWdlT3B0aW9uc0NvbG9ycyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9LFxuICAgIG1lYXN1cmVtZW50OiBJTWVhc3VyZW1lbnRWYWx1ZSxcbiAgICBmcmFjdGlvblNpemU6IG51bWJlclxuICApIHtcbiAgICBjb25zdCBjb2xvckFycmF5ID0gdGhpcy5nZXRDb2xvckFycmF5KGFjdGl2ZURhdGFwb2ludEdhdWdlLCByYW5nZUNvbG9ycyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc2VyaWVzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICB0eXBlOiAnZ2F1Z2UnLFxuICAgICAgICAgIHJhZGl1czogZ2F1Z2VPcHRpb25zPy5yYWRpdXMgfHwgJzkwJScsXG4gICAgICAgICAgY2VudGVyOiBnYXVnZU9wdGlvbnM/LmNlbnRlciB8fCBbJzUwJScsICc1MCUnXSxcbiAgICAgICAgICBzdGFydEFuZ2xlOiBnYXVnZU9wdGlvbnM/LnN0YXJ0QW5nbGUgfHwgMjQwLFxuICAgICAgICAgIGVuZEFuZ2xlOiBnYXVnZU9wdGlvbnM/LmVuZEFuZ2xlIHx8IDMwMCxcbiAgICAgICAgICBtaW46IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5taW4gfHwgMCxcbiAgICAgICAgICBtYXg6XG4gICAgICAgICAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ubWF4ICE9PSB1bmRlZmluZWQgJiYgYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1heCAhPT0gbnVsbFxuICAgICAgICAgICAgICA/IGFjdGl2ZURhdGFwb2ludEdhdWdlLm1heFxuICAgICAgICAgICAgICA6IDEwMCxcblxuICAgICAgICAgIC8vIFNwbGl0IHByb3BlcnRpZXNcbiAgICAgICAgICBzcGxpdE51bWJlcjogZ2F1Z2VPcHRpb25zPy5zcGxpdE51bWJlciB8fCAxMCxcbiAgICAgICAgICBzcGxpdExpbmU6IHtcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZURpc3RhbmNlIHx8IC0zMCxcblxuICAgICAgICAgICAgbGVuZ3RoOiBnYXVnZU9wdGlvbnM/LnNwbGl0TGluZUxlbmd0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lTGVuZ3RoIHx8IDMwLFxuXG4gICAgICAgICAgICBsaW5lU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zPy5zcGxpdExpbmVDb2xvclxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnNwbGl0TGluZUNvbG9yIHx8ICcjZmZmJyxcbiAgICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8uc3BsaXRMaW5lV2lkdGggfHwgNFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBUaWNrIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzVGljazoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy50aWNrU2hvdyB8fCBmYWxzZSxcbiAgICAgICAgICAgIGRpc3RhbmNlOiBnYXVnZU9wdGlvbnM/LnRpY2tEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy50aWNrRGlzdGFuY2VSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0Rpc3RhbmNlIHx8IC0zMCxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy50aWNrTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKlxuICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnRpY2tMZW5ndGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8udGlja0xlbmd0aCB8fCA4LFxuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nIHx8IHNlbGVjdGVkUHJlc2V0SWQgPT09ICdncmFkZS1yYXRpbmcnXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy50aWNrQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy50aWNrQ29sb3IgfHwgJyNmZmYnLFxuICAgICAgICAgICAgICB3aWR0aDogZ2F1Z2VPcHRpb25zPy50aWNrV2lkdGggfHwgMlxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBeGlzIHByb3BlcnRpZXNcbiAgICAgICAgICBheGlzTGluZToge1xuICAgICAgICAgICAgbGluZVN0eWxlOiB7XG4gICAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpb1xuICAgICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICogZ2F1Z2VPcHRpb25zPy5heGlzTGluZVdpZHRoUmF0aW9cbiAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aCB8fCAzMCxcbiAgICAgICAgICAgICAgY29sb3I6IGNvbG9yQXJyYXlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuXG4gICAgICAgICAgYXhpc0xhYmVsOiB7XG4gICAgICAgICAgICBjb2xvcjpcbiAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbScgfHwgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2dyYWRlLXJhdGluZydcbiAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5heGlzTGFiZWxDb2xvclxuICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5heGlzTGFiZWxDb2xvciB8fCAnaW5oZXJpdCcsXG4gICAgICAgICAgICBkaXN0YW5jZTogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZVJhdGlvXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxEaXN0YW5jZSB8fCA0MCxcbiAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW9cbiAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplUmF0aW8sXG4gICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5heGlzTGFiZWxGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmF4aXNMYWJlbEZvbnRTaXplIHx8IDE2LFxuICAgICAgICAgICAgZm9udFdlaWdodDogJ2JvbGQnLFxuICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIHBvaW50ZXIgcHJvcGVydGllc1xuICAgICAgICAgIHBvaW50ZXI6IHtcbiAgICAgICAgICAgIC4uLihnYXVnZU9wdGlvbnM/LnBvaW50ZXJTdHlsZSAhPT0gJ2RlZmF1bHQnICYmIHtcbiAgICAgICAgICAgICAgaWNvbjogZ2F1Z2VPcHRpb25zPy5wb2ludGVyU3R5bGVcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93UG9pbnRlciB8fCBmYWxzZSxcbiAgICAgICAgICAgIGxlbmd0aDogZ2F1Z2VPcHRpb25zPy5wb2ludGVyTGVuZ3RoUmF0aW9cbiAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/LnBvaW50ZXJMZW5ndGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgKHRoaXMuY29udGFpbmVyU2l6ZSAqIGdhdWdlT3B0aW9ucz8uYXhpc0xpbmVXaWR0aFJhdGlvKVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlckxlbmd0aCB8fCAnNjUlJyxcbiAgICAgICAgICAgIHdpZHRoOiBnYXVnZU9wdGlvbnM/LnBvaW50ZXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wb2ludGVyV2lkdGhSYXRpb1xuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ucG9pbnRlcldpZHRoIHx8IDQwLFxuICAgICAgICAgICAgb2Zmc2V0Q2VudGVyOlxuICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnZGVmYXVsdCdcbiAgICAgICAgICAgICAgICA/IFswLCB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqIC0xXVxuICAgICAgICAgICAgICAgIDogWzAsIGdhdWdlT3B0aW9ucz8ucG9pbnRlck9mZnNldCB8fCAtMzBdLFxuICAgICAgICAgICAgaXRlbVN0eWxlOiB7XG4gICAgICAgICAgICAgIGNvbG9yOlxuICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5wb2ludGVyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wb2ludGVyQ29sb3IgfHwgJ2luaGVyaXQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcblxuICAgICAgICAgIC8vIFByb2dyZXNzIGJhciBwcm9wZXJ0aWVzXG4gICAgICAgICAgcHJvZ3Jlc3M6IHtcbiAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXIgfHwgZmFsc2UsXG4gICAgICAgICAgICByb3VuZENhcDogZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhclJvdW5kQ2FwIHx8IGZhbHNlLFxuICAgICAgICAgICAgd2lkdGg6IGdhdWdlT3B0aW9ucz8ucHJvZ3Jlc3NCYXJXaWR0aFJhdGlvXG4gICAgICAgICAgICAgID8gdGhpcy5jb250YWluZXJTaXplICpcbiAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmF4aXNMaW5lV2lkdGhSYXRpbyAqXG4gICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5wcm9ncmVzc0JhcldpZHRoUmF0aW9cbiAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnByb2dyZXNzQmFyV2lkdGggfHwgMTgsXG4gICAgICAgICAgICBpdGVtU3R5bGU6IHtcbiAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmVzZXRJZCA9PT0gJ2N1c3RvbSdcbiAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLnByb2dyZXNzQmFyQ29sb3JcbiAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5wcm9ncmVzc0JhckNvbG9yIHx8ICdpbmhlcml0J1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG5cbiAgICAgICAgICAvLyBBbmNob3IgcHJvcGVydGllc1xuICAgICAgICAgIGFuY2hvcjogZ2F1Z2VPcHRpb25zPy5hbmNob3JcbiAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgIC4uLmdhdWdlT3B0aW9ucy5hbmNob3IsXG4gICAgICAgICAgICAgICAgc2l6ZTogZ2F1Z2VPcHRpb25zPy5hbmNob3I/LnNpemVSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNvbnRhaW5lclNpemUgKiBnYXVnZU9wdGlvbnM/LmFuY2hvcj8uc2l6ZVJhdGlvXG4gICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uYW5jaG9yPy5zaXplIHx8IDQ1LFxuICAgICAgICAgICAgICAgIGl0ZW1TdHlsZToge1xuICAgICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkUHJlc2V0SWQgPT09ICdjdXN0b20nXG4gICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnMucG9pbnRlckNvbG9yXG4gICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/LnBvaW50ZXJDb2xvclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB1bmRlZmluZWQsXG5cbiAgICAgICAgICAvLyBEZXRhaWwgcHJvcGVydGllc1xuICAgICAgICAgIGRldGFpbDoge1xuICAgICAgICAgICAgc2hvdzogZ2F1Z2VPcHRpb25zPy5zaG93RGV0YWlsIHx8IGZhbHNlLFxuICAgICAgICAgICAgdmFsdWVBbmltYXRpb246IHRydWUsXG4gICAgICAgICAgICBvZmZzZXRDZW50ZXI6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvXG4gICAgICAgICAgICAgID8gWzAsIGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyWVJhdGlvICogdGhpcy5jb250YWluZXJTaXplXVxuICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGV0YWlsT2Zmc2V0Q2VudGVyIHx8IFswLCAwXSxcblxuICAgICAgICAgICAgZm9ybWF0dGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbWVhc3VyZW1lbnQ/LnZhbHVlLnRvRml4ZWQoZnJhY3Rpb25TaXplKSB8fCAwO1xuICAgICAgICAgICAgICBjb25zdCB1bml0ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnVuaXQgfHwgbWVhc3VyZW1lbnQ/LnVuaXQgfHwgJyc7XG4gICAgICAgICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZShtZWFzdXJlbWVudD8uZGF0ZSk7XG4gICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGUgPSB0aGlzLmM4eURhdGVQaXBlLnRyYW5zZm9ybShkYXRlKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGB7dmFsdWV8JHt2YWx1ZX19e3VuaXR8JHt1bml0fX0gXFxuIHtkYXRlfCR7Zm9ybWF0dGVkRGF0ZX19IGA7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29sb3I6ICdpbmhlcml0JyxcbiAgICAgICAgICAgIGxpbmVIZWlnaHQ6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuOSxcbiAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNSB8fCBtZWFzdXJlbWVudD8udmFsdWUgPiA5OTk5XG4gICAgICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpbyAqIDAuNVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250U2l6ZSB8fCAzMixcbiAgICAgICAgICAgICAgICBmb250V2VpZ2h0OiAnYm9sZGVyJyxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucy5tZWFzdXJlbWVudFZhbHVlQ29sb3JcbiAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lm1lYXN1cmVtZW50VmFsdWVDb2xvciB8fCAnIzc3NydcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgdW5pdDoge1xuICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250TWluLFxuICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8udW5pdEZvbnRNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8udW5pdENvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy51bml0Q29sb3IgfHwgJyM5OTknXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGRhdGU6IHtcbiAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy5kYXRlRm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZSB8fCAxMixcbiAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgY29sb3I6XG4gICAgICAgICAgICAgICAgICBzZWxlY3RlZFByZXNldElkID09PSAnY3VzdG9tJ1xuICAgICAgICAgICAgICAgICAgICA/IGdhdWdlT3B0aW9ucz8uZGF0ZUNvbG9yXG4gICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zQ29sb3JzPy5kYXRlQ29sb3IgfHwgJyM1NTUnXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIG1hcmtQb2ludDoge1xuICAgICAgICAgICAgc3ltYm9sU2l6ZTogMCxcbiAgICAgICAgICAgIG9mZnNldENlbnRlcjogZ2F1Z2VPcHRpb25zPy5kZXRhaWxPZmZzZXRDZW50ZXIgfHwgWzAsIDBdLFxuICAgICAgICAgICAgZGF0YTogW1xuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgeDogJzUwJScsXG4gICAgICAgICAgICAgICAgeTogJzUwJScsXG4gICAgICAgICAgICAgICAgbGFiZWw6IHtcbiAgICAgICAgICAgICAgICAgIHNob3c6IGdhdWdlT3B0aW9ucz8uc2hvd01hcmtQb2ludCxcbiAgICAgICAgICAgICAgICAgIGZvcm1hdHRlcjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1lYXN1cmVtZW50Py52YWx1ZS50b0ZpeGVkKGZyYWN0aW9uU2l6ZSkgfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5pdCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy51bml0IHx8IG1lYXN1cmVtZW50Py51bml0IHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUobWVhc3VyZW1lbnQ/LmRhdGUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWREYXRlID0gdGhpcy5jOHlEYXRlUGlwZS50cmFuc2Zvcm0oZGF0ZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBge3ZhbHVlfCR7dmFsdWV9fXt1bml0fCR7dW5pdH19IFxcbiB7ZGF0ZXwke2Zvcm1hdHRlZERhdGV9fSBgO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgIGNvbG9yOiAnI2ZmZicsXG4gICAgICAgICAgICAgICAgICBhbGlnbjogJ2NlbnRlcicsXG4gICAgICAgICAgICAgICAgICByaWNoOiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9udFNpemU6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRSYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmNsYW1wUmVsYXRpdmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhY3Rpb25TaXplID4gNVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBnYXVnZU9wdGlvbnM/Lm1lYXN1cmVtZW50VmFsdWVGb250UmF0aW8gKiAwLjVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFJhdGlvLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYWN0aW9uU2l6ZSA+IDVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gZ2F1Z2VPcHRpb25zLm1lYXN1cmVtZW50VmFsdWVGb250TWluICogMC41XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWluLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8ubWVhc3VyZW1lbnRWYWx1ZUZvbnRTaXplTWF4XG4gICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogZ2F1Z2VPcHRpb25zPy5tZWFzdXJlbWVudFZhbHVlRm9udFNpemUgfHwgMzIsXG4gICAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogZ2F1Z2VPcHRpb25zQ29sb3JzPy5mb250RmFtaWx5LFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRXZWlnaHQ6ICdib2xkZXInLFxuICAgICAgICAgICAgICAgICAgICAgIGNvbG9yOiBnYXVnZU9wdGlvbnNDb2xvcnM/Lmtub2JGb250Q29sb3IgfHwgJyM3NzcnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHVuaXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogZ2F1Z2VPcHRpb25zPy51bml0Rm9udFJhdGlvXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMuY2xhbXBSZWxhdGl2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LnVuaXRGb250UmF0aW8sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNaW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2F1Z2VPcHRpb25zPy51bml0Rm9udFNpemVNYXhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBnYXVnZU9wdGlvbnM/LnVuaXRGb250U2l6ZSB8fCAyMCxcbiAgICAgICAgICAgICAgICAgICAgICBmb250RmFtaWx5OiBnYXVnZU9wdGlvbnNDb2xvcnM/LmZvbnRGYW1pbHksXG4gICAgICAgICAgICAgICAgICAgICAgY29sb3I6IGdhdWdlT3B0aW9uc0NvbG9ycz8ua25vYkZvbnRDb2xvciB8fCAnIzk5OSdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgZGF0ZToge1xuICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBnYXVnZU9wdGlvbnM/LmRhdGVGb250UmF0aW9cbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5jbGFtcFJlbGF0aXZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRSYXRpbyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1pbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYXVnZU9wdGlvbnM/LmRhdGVGb250U2l6ZU1heFxuICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGdhdWdlT3B0aW9ucz8uZGF0ZUZvbnRTaXplIHx8IDEyLFxuICAgICAgICAgICAgICAgICAgICAgIGZvbnRGYW1pbHk6IGdhdWdlT3B0aW9uc0NvbG9ycz8uZm9udEZhbWlseSxcbiAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogZ2F1Z2VPcHRpb25zQ29sb3JzPy5rbm9iRm9udENvbG9yIHx8ICcjNTU1J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBdXG4gICAgICAgICAgfSxcbiAgICAgICAgICBkYXRhOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAwIHx8IG1lYXN1cmVtZW50Py52YWx1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIF1cbiAgICAgICAgfVxuICAgICAgXVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVSYW5nZUNvbG9ycygpOiBhbnkge1xuICAgIGlmICghdGhpcy5jaGFydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBkZWZhdWx0OiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LWZvcm0tY29udHJvbC1ib3JkZXItY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB5ZWxsb3c6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtd2FybmluZydcbiAgICAgICksXG4gICAgICByZWQ6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcGFsZXR0ZS1zdGF0dXMtZGFuZ2VyJ1xuICAgICAgKVxuICAgIH07XG4gIH1cblxuICB1cGRhdGVHYXVnZU9wdGlvbnNDb2xvcnMoKTogYW55IHtcbiAgICBpZiAoIXRoaXMuY2hhcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3BsaXRMaW5lQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtYmFja2dyb3VuZC1kZWZhdWx0J1xuICAgICAgKSxcbiAgICAgIHRpY2tDb2xvcjogZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLmNoYXJ0Lm5hdGl2ZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoXG4gICAgICAgICctLWM4eS1yb290LWNvbXBvbmVudC1iYWNrZ3JvdW5kLWRlZmF1bHQnXG4gICAgICApLFxuICAgICAgYXhpc0xhYmVsQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBwb2ludGVyQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBrbm9iRm9udENvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJhY2tncm91bmQtZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBtZWFzdXJlbWVudFZhbHVlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICB1bml0Q29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtY29sb3ItZGVmYXVsdCdcbiAgICAgICksXG4gICAgICBkYXRlQ29sb3I6IGdldENvbXB1dGVkU3R5bGUodGhpcy5jaGFydC5uYXRpdmVFbGVtZW50KS5nZXRQcm9wZXJ0eVZhbHVlKFxuICAgICAgICAnLS1jOHktcm9vdC1jb21wb25lbnQtdGV4dC1tdXRlZCdcbiAgICAgICksXG4gICAgICBwcm9ncmVzc0JhckNvbG9yOiBnZXRDb21wdXRlZFN0eWxlKHRoaXMuY2hhcnQubmF0aXZlRWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShcbiAgICAgICAgJy0tYzh5LXJvb3QtY29tcG9uZW50LWJyYW5kLXByaW1hcnknXG4gICAgICApLFxuICAgICAgZm9udEZhbWlseTogZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5ib2R5KS5nZXRQcm9wZXJ0eVZhbHVlKCdmb250LWZhbWlseScpXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29sb3JBcnJheShcbiAgICBhY3RpdmVEYXRhcG9pbnRHYXVnZTogS1BJRGV0YWlscyxcbiAgICByYW5nZUNvbG9yczogeyBkZWZhdWx0OiBzdHJpbmc7IHllbGxvdzogc3RyaW5nOyByZWQ6IHN0cmluZyB9XG4gICk6IFtudW1iZXIsIHN0cmluZ11bXSB7XG4gICAgY29uc3QgbWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/Lm1pbiA/PyAwO1xuICAgIGNvbnN0IG1heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy5tYXggPz8gMTAwO1xuICAgIGNvbnN0IHJhbmdlID0gbWF4IC0gbWluO1xuXG4gICAgY29uc3QgeWVsbG93TWluID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnllbGxvd1JhbmdlTWluO1xuICAgIGNvbnN0IHllbGxvd01heCA9IGFjdGl2ZURhdGFwb2ludEdhdWdlPy55ZWxsb3dSYW5nZU1heDtcbiAgICBjb25zdCByZWRNaW4gPSBhY3RpdmVEYXRhcG9pbnRHYXVnZT8ucmVkUmFuZ2VNaW47XG4gICAgY29uc3QgcmVkTWF4ID0gYWN0aXZlRGF0YXBvaW50R2F1Z2U/LnJlZFJhbmdlTWF4O1xuXG4gICAgdHlwZSBSYW5nZSA9IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXI7IGNvbG9yOiBzdHJpbmcgfTtcblxuICAgIGNvbnN0IHJhbmdlczogUmFuZ2VbXSA9IFtdO1xuXG4gICAgLy8gRmlyc3QgYWRkIHJlZCByYW5nZVxuICAgIGlmIChyZWRNaW4gIT0gbnVsbCAmJiByZWRNYXggIT0gbnVsbCAmJiByZWRNaW4gPCByZWRNYXgpIHtcbiAgICAgIHJhbmdlcy5wdXNoKHsgc3RhcnQ6IHJlZE1pbiwgZW5kOiByZWRNYXgsIGNvbG9yOiByYW5nZUNvbG9ycy5yZWQgfSk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiBhZGQgeWVsbG93LCBidXQgY2xpcCBvdXQgYW55IG92ZXJsYXAgd2l0aCByZWRcbiAgICBpZiAoeWVsbG93TWluICE9IG51bGwgJiYgeWVsbG93TWF4ICE9IG51bGwgJiYgeWVsbG93TWluIDwgeWVsbG93TWF4KSB7XG4gICAgICBjb25zdCByZWRSYW5nZSA9IHJhbmdlcy5maW5kKHIgPT4gci5jb2xvciA9PT0gcmFuZ2VDb2xvcnMucmVkKTtcblxuICAgICAgaWYgKFxuICAgICAgICAhcmVkUmFuZ2UgfHxcbiAgICAgICAgeWVsbG93TWF4IDw9IHJlZFJhbmdlLnN0YXJ0IHx8IC8vIHllbGxvdyBlbmRzIGJlZm9yZSByZWRcbiAgICAgICAgeWVsbG93TWluID49IHJlZFJhbmdlLmVuZCAvLyB5ZWxsb3cgc3RhcnRzIGFmdGVyIHJlZFxuICAgICAgKSB7XG4gICAgICAgIC8vIG5vIG92ZXJsYXBcbiAgICAgICAgcmFuZ2VzLnB1c2goeyBzdGFydDogeWVsbG93TWluLCBlbmQ6IHllbGxvd01heCwgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvdyB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHBhcnRpYWwgb3ZlcmxhcCDigJMgc3BsaXQgeWVsbG93IGludG8gbm9uLW92ZXJsYXBwaW5nIHBhcnRzXG4gICAgICAgIGlmICh5ZWxsb3dNaW4gPCByZWRSYW5nZS5zdGFydCkge1xuICAgICAgICAgIHJhbmdlcy5wdXNoKHtcbiAgICAgICAgICAgIHN0YXJ0OiB5ZWxsb3dNaW4sXG4gICAgICAgICAgICBlbmQ6IE1hdGgubWluKHllbGxvd01heCwgcmVkUmFuZ2Uuc3RhcnQpLFxuICAgICAgICAgICAgY29sb3I6IHJhbmdlQ29sb3JzLnllbGxvd1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh5ZWxsb3dNYXggPiByZWRSYW5nZS5lbmQpIHtcbiAgICAgICAgICByYW5nZXMucHVzaCh7XG4gICAgICAgICAgICBzdGFydDogTWF0aC5tYXgoeWVsbG93TWluLCByZWRSYW5nZS5lbmQpLFxuICAgICAgICAgICAgZW5kOiB5ZWxsb3dNYXgsXG4gICAgICAgICAgICBjb2xvcjogcmFuZ2VDb2xvcnMueWVsbG93XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGJ5IHN0YXJ0IHBvc2l0aW9uXG4gICAgcmFuZ2VzLnNvcnQoKGEsIGIpID0+IGEuc3RhcnQgLSBiLnN0YXJ0KTtcblxuICAgIC8vIEJ1aWxkIHNlZ21lbnRzXG4gICAgY29uc3Qgc2VnbWVudHM6IFtudW1iZXIsIHN0cmluZ11bXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gbWluO1xuXG4gICAgZm9yIChjb25zdCB7IHN0YXJ0LCBlbmQsIGNvbG9yIH0gb2YgcmFuZ2VzKSB7XG4gICAgICBpZiAoc3RhcnQgPiBjdXJyZW50KSB7XG4gICAgICAgIC8vIERlZmF1bHQgZmlsbCBiZWZvcmUgdGhpcyByYW5nZVxuICAgICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIHJhbmdlQ29sb3JzLmRlZmF1bHRdKTtcbiAgICAgIH1cbiAgICAgIC8vIFN0YXJ0IGNvbG9yXG4gICAgICBzZWdtZW50cy5wdXNoKFsoc3RhcnQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG4gICAgICAvLyBFbmQgY29sb3JcbiAgICAgIHNlZ21lbnRzLnB1c2goWyhlbmQgLSBtaW4pIC8gcmFuZ2UsIGNvbG9yXSk7XG5cbiAgICAgIGN1cnJlbnQgPSBNYXRoLm1heChjdXJyZW50LCBlbmQpO1xuICAgIH1cblxuICAgIC8vIEZpbGwgcmVtYWluaW5nIHdpdGggZGVmYXVsdFxuICAgIGlmIChjdXJyZW50IDwgbWF4KSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsoY3VycmVudCAtIG1pbikgLyByYW5nZSwgcmFuZ2VDb2xvcnMuZGVmYXVsdF0pO1xuICAgIH1cblxuICAgIGlmIChzZWdtZW50cy5sZW5ndGggPT09IDAgfHwgc2VnbWVudHNbc2VnbWVudHMubGVuZ3RoIC0gMV1bMF0gPCAxKSB7XG4gICAgICBzZWdtZW50cy5wdXNoKFsxLCByYW5nZUNvbG9ycy5kZWZhdWx0XSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHNlZ21lbnRzO1xuICB9XG5cbiAgcHJpdmF0ZSBjbGFtcFJlbGF0aXZlKHJhdGlvOiBudW1iZXIsIG1pbjogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gICAgY29uc3QgY2xhbXBlZFZhbHVlID0gdGhpcy5jb250YWluZXJTaXplICogcmF0aW87XG4gICAgaWYgKGNsYW1wZWRWYWx1ZSA8IG1pbikge1xuICAgICAgcmV0dXJuIG1pbjtcbiAgICB9IGVsc2UgaWYgKGNsYW1wZWRWYWx1ZSA+IG1heCkge1xuICAgICAgcmV0dXJuIG1heDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNsYW1wZWRWYWx1ZTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1496,12 +1496,14 @@ class ChartsComponent {
|
|
|
1496
1496
|
this.chartEventsService = inject(ChartEventsService);
|
|
1497
1497
|
this.chartAlarmsService = inject(ChartAlarmsService);
|
|
1498
1498
|
this.widgetTimeContextDateRangeService = inject(WidgetTimeContextDateRangeService);
|
|
1499
|
+
this.loadedTimeRange = null;
|
|
1499
1500
|
this.chartOption$ = this.configChangedSubject.pipe(switchMap(() => this.loadAlarmsAndEvents()), switchMap(() => this.fetchSeriesForDatapoints$()), switchMap((datapointsWithValues) => {
|
|
1500
1501
|
if (datapointsWithValues.length === 0) {
|
|
1501
1502
|
this.echartsInstance?.clear();
|
|
1502
1503
|
this.showLoadMore = false;
|
|
1503
1504
|
return of(this.getDefaultChartOptions());
|
|
1504
1505
|
}
|
|
1506
|
+
this.loadedTimeRange = { ...this.getTimeRange() };
|
|
1505
1507
|
return this.getChartOptions(datapointsWithValues);
|
|
1506
1508
|
}), tap(v => {
|
|
1507
1509
|
if (v['empty']) {
|
|
@@ -1510,7 +1512,13 @@ class ChartsComponent {
|
|
|
1510
1512
|
this.chartRealtimeService.stopRealtime();
|
|
1511
1513
|
this.startRealtimeIfPossible();
|
|
1512
1514
|
if (this.echartsInstance) {
|
|
1513
|
-
|
|
1515
|
+
/**
|
|
1516
|
+
* * Set the chart options
|
|
1517
|
+
* First parameter is the options to set
|
|
1518
|
+
* Second parameter is a boolean to indicate that the chart should be re-rendered as we do not want to merge.
|
|
1519
|
+
* Third parameter is a boolean to indicate that we want to lazy load the chart.
|
|
1520
|
+
*/
|
|
1521
|
+
this.echartsInstance.setOption(v, true, true);
|
|
1514
1522
|
const options = this.echartsInstance.getOption();
|
|
1515
1523
|
const dataZoom = options['dataZoom'][0];
|
|
1516
1524
|
if (dataZoom.start !== 0) {
|
|
@@ -1520,7 +1528,16 @@ class ChartsComponent {
|
|
|
1520
1528
|
this.sliderZoomUsed = false;
|
|
1521
1529
|
}));
|
|
1522
1530
|
}
|
|
1523
|
-
ngOnChanges() {
|
|
1531
|
+
ngOnChanges(changes) {
|
|
1532
|
+
const currentTimeRange = this.getTimeRange();
|
|
1533
|
+
// Check if the current time range is within the loaded time range to avoid unnecessary updates
|
|
1534
|
+
if (this.loadedTimeRange &&
|
|
1535
|
+
new Date(currentTimeRange.dateFrom) >= new Date(this.loadedTimeRange.dateFrom) &&
|
|
1536
|
+
new Date(currentTimeRange.dateTo) <= new Date(this.loadedTimeRange.dateTo) &&
|
|
1537
|
+
changes.config.previousValue?.dateFrom !== changes.config.currentValue.dateFrom &&
|
|
1538
|
+
changes.config.previousValue?.dateTo !== changes.config.currentValue.dateTo) {
|
|
1539
|
+
return;
|
|
1540
|
+
}
|
|
1524
1541
|
this.configChangedSubject.next();
|
|
1525
1542
|
}
|
|
1526
1543
|
ngOnInit() {
|
|
@@ -1662,6 +1679,36 @@ class ChartsComponent {
|
|
|
1662
1679
|
timeout = setTimeout(() => func(...args), wait);
|
|
1663
1680
|
};
|
|
1664
1681
|
}
|
|
1682
|
+
/**
|
|
1683
|
+
* Toggles the visibility of a series in the chart based on the provided datapoint.
|
|
1684
|
+
* @param datapoint - The datapoint to toggle visibility for.
|
|
1685
|
+
*/
|
|
1686
|
+
toggleDatapointSeriesVisibility(datapoint) {
|
|
1687
|
+
const series = this.echartsInstance.getOption().series;
|
|
1688
|
+
const seriesToUpdate = series.find(s => s.datapointLabel === datapoint.label);
|
|
1689
|
+
if (seriesToUpdate) {
|
|
1690
|
+
this.echartsInstance.dispatchAction({
|
|
1691
|
+
type: 'legendToggleSelect',
|
|
1692
|
+
name: seriesToUpdate.name
|
|
1693
|
+
});
|
|
1694
|
+
}
|
|
1695
|
+
}
|
|
1696
|
+
/**
|
|
1697
|
+
* Toggles the visibility of a series in the chart based on the provided alarm or event.
|
|
1698
|
+
* @param alarmOrEvent - The alarm or event to toggle visibility for.
|
|
1699
|
+
*/
|
|
1700
|
+
toggleAlarmEventSeriesVisibility(alarmOrEvent) {
|
|
1701
|
+
const series = this.echartsInstance.getOption().series;
|
|
1702
|
+
const seriesToUpdate = series.filter(s => s.name === `${alarmOrEvent.label}-markPoint` || s.name === `${alarmOrEvent.label}-markLine`);
|
|
1703
|
+
if (seriesToUpdate) {
|
|
1704
|
+
seriesToUpdate.forEach(s => {
|
|
1705
|
+
this.echartsInstance.dispatchAction({
|
|
1706
|
+
type: 'legendToggleSelect',
|
|
1707
|
+
name: s.name
|
|
1708
|
+
});
|
|
1709
|
+
});
|
|
1710
|
+
}
|
|
1711
|
+
}
|
|
1665
1712
|
getDefaultChartOptions() {
|
|
1666
1713
|
return {
|
|
1667
1714
|
title: {
|