@gpa-gemstone/react-graph 1.0.74 → 1.0.75
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/lib/GraphContext.d.ts +8 -0
- package/lib/GraphContext.js +3 -1
- package/lib/HeatLegend.js +6 -18
- package/lib/HeatMapChart.js +4 -4
- package/lib/InteractiveButtons.d.ts +2 -0
- package/lib/InteractiveButtons.js +24 -12
- package/lib/Legend.d.ts +6 -1
- package/lib/Legend.js +116 -60
- package/lib/LegendContext.d.ts +3 -5
- package/lib/LegendContext.js +3 -5
- package/lib/Line.js +10 -4
- package/lib/LineLegend.d.ts +1 -1
- package/lib/LineLegend.js +13 -51
- package/lib/LineWithThreshold.js +9 -3
- package/lib/Pill.d.ts +73 -0
- package/lib/Pill.js +165 -0
- package/lib/Plot.d.ts +11 -0
- package/lib/Plot.js +84 -65
- package/lib/index.d.ts +2 -2
- package/lib/index.js +3 -3
- package/package.json +3 -3
- package/lib/Oval.d.ts +0 -64
- package/lib/Oval.js +0 -132
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gpa-gemstone/react-graph",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.75",
|
|
4
4
|
"description": "Interactive UI Components for GPA products",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|
|
@@ -45,8 +45,8 @@
|
|
|
45
45
|
"typescript": "5.5.3"
|
|
46
46
|
},
|
|
47
47
|
"dependencies": {
|
|
48
|
-
"@gpa-gemstone/gpa-symbols": "0.0.
|
|
49
|
-
"@gpa-gemstone/helper-functions": "0.0.
|
|
48
|
+
"@gpa-gemstone/gpa-symbols": "0.0.52",
|
|
49
|
+
"@gpa-gemstone/helper-functions": "0.0.42",
|
|
50
50
|
"html2canvas": "^1.4.1",
|
|
51
51
|
"lodash": "^4.17.21",
|
|
52
52
|
"moment": "^2.29.4",
|
package/lib/Oval.d.ts
DELETED
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { IActionFunctions, AxisIdentifier } from './GraphContext';
|
|
2
|
-
export interface IProps {
|
|
3
|
-
/**
|
|
4
|
-
* Data for the oval and circles:
|
|
5
|
-
* [x1, x2, y]
|
|
6
|
-
* - x1: The x-coordinate of the left edge of the oval.
|
|
7
|
-
* - x2: The x-coordinate of the right edge of the oval.
|
|
8
|
-
* - y: The y-coordinate of the center of the oval.
|
|
9
|
-
*/
|
|
10
|
-
Data: [number, number, number];
|
|
11
|
-
/**
|
|
12
|
-
* Fill color of the oval.
|
|
13
|
-
* @type {string}
|
|
14
|
-
*/
|
|
15
|
-
Color: string;
|
|
16
|
-
/**
|
|
17
|
-
* Color of text in oval.
|
|
18
|
-
* @type {string}
|
|
19
|
-
*/
|
|
20
|
-
TextColor?: string;
|
|
21
|
-
/**
|
|
22
|
-
* The vertical radius of the oval.
|
|
23
|
-
* @type {number}
|
|
24
|
-
*/
|
|
25
|
-
Radius: number;
|
|
26
|
-
/**
|
|
27
|
-
* Stroke color of the oval and circles.
|
|
28
|
-
* @optional
|
|
29
|
-
* @type {string}
|
|
30
|
-
*/
|
|
31
|
-
BorderColor?: string;
|
|
32
|
-
/**
|
|
33
|
-
* Stroke thickness of the oval and circles.
|
|
34
|
-
* @optional
|
|
35
|
-
* @type {number}
|
|
36
|
-
*/
|
|
37
|
-
BorderThickness?: number;
|
|
38
|
-
/**
|
|
39
|
-
* Optional text to display inside the oval.
|
|
40
|
-
* @optional
|
|
41
|
-
* @type {string}
|
|
42
|
-
*/
|
|
43
|
-
Text?: string;
|
|
44
|
-
/**
|
|
45
|
-
* Opacity of the oval and circles.
|
|
46
|
-
* @optional
|
|
47
|
-
* @type {number}
|
|
48
|
-
*/
|
|
49
|
-
Opacity?: number;
|
|
50
|
-
/**
|
|
51
|
-
* Axis identifier used for vertical positioning.
|
|
52
|
-
* @optional
|
|
53
|
-
* @type {AxisIdentifier}
|
|
54
|
-
*/
|
|
55
|
-
Axis?: AxisIdentifier;
|
|
56
|
-
/**
|
|
57
|
-
* Callback function to handle click events on the oval. Provides action functions to update domains.
|
|
58
|
-
* @optional
|
|
59
|
-
* @type {(actions: IActionFunctions) => void}
|
|
60
|
-
*/
|
|
61
|
-
OnClick?: (x: number, y: number, actions: IActionFunctions) => void;
|
|
62
|
-
}
|
|
63
|
-
declare const Oval: (props: IProps) => JSX.Element | null;
|
|
64
|
-
export default Oval;
|
package/lib/Oval.js
DELETED
|
@@ -1,132 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
// ******************************************************************************************************
|
|
3
|
-
// Oval.tsx - Gbtc
|
|
4
|
-
//
|
|
5
|
-
// Copyright © 2024, Grid Protection Alliance. All Rights Reserved.
|
|
6
|
-
//
|
|
7
|
-
// Licensed to the Grid Protection Alliance (GPA) under one or more contributor license agreements. See
|
|
8
|
-
// the NOTICE file distributed with this work for additional information regarding copyright ownership.
|
|
9
|
-
// The GPA licenses this file to you under the MIT License (MIT), the "License"; you may not use this
|
|
10
|
-
// file except in compliance with the License. You may obtain a copy of the License at:
|
|
11
|
-
//
|
|
12
|
-
// http://opensource.org/licenses/MIT
|
|
13
|
-
//
|
|
14
|
-
// Unless agreed to in writing, the subject software distributed under the License is distributed on an
|
|
15
|
-
// "AS-IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. Refer to the
|
|
16
|
-
// License for the specific language governing permissions and limitations.
|
|
17
|
-
//
|
|
18
|
-
// Code Modification History:
|
|
19
|
-
// ----------------------------------------------------------------------------------------------------
|
|
20
|
-
// 09/03/2024 - Preston Crawford
|
|
21
|
-
// Generated original version of source code.
|
|
22
|
-
//
|
|
23
|
-
// ******************************************************************************************************
|
|
24
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
25
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
26
|
-
if (!m) return o;
|
|
27
|
-
var i = m.call(o), r, ar = [], e;
|
|
28
|
-
try {
|
|
29
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
30
|
-
}
|
|
31
|
-
catch (error) { e = { error: error }; }
|
|
32
|
-
finally {
|
|
33
|
-
try {
|
|
34
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
35
|
-
}
|
|
36
|
-
finally { if (e) throw e.error; }
|
|
37
|
-
}
|
|
38
|
-
return ar;
|
|
39
|
-
};
|
|
40
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
|
-
var helper_functions_1 = require("@gpa-gemstone/helper-functions");
|
|
42
|
-
var React = require("react");
|
|
43
|
-
var GraphContext_1 = require("./GraphContext");
|
|
44
|
-
var Oval = function (props) {
|
|
45
|
-
var _a;
|
|
46
|
-
var context = React.useContext(GraphContext_1.GraphContext);
|
|
47
|
-
var _b = __read(React.useState(""), 2), guid = _b[0], setGuid = _b[1];
|
|
48
|
-
var _c = __read(React.useState(1), 2), textSize = _c[0], setTextSize = _c[1];
|
|
49
|
-
// Update data series information in the graph context based on circle properties
|
|
50
|
-
React.useEffect(function () {
|
|
51
|
-
if (guid === "")
|
|
52
|
-
return;
|
|
53
|
-
context.UpdateData(guid, {
|
|
54
|
-
axis: props.Axis,
|
|
55
|
-
legend: undefined,
|
|
56
|
-
getMax: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
|
|
57
|
-
getMin: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
|
|
58
|
-
});
|
|
59
|
-
}, [props.Axis, props.Data]);
|
|
60
|
-
// Add a new data series on component mount / removing on unmount
|
|
61
|
-
React.useEffect(function () {
|
|
62
|
-
var id = context.AddData({
|
|
63
|
-
axis: props.Axis,
|
|
64
|
-
legend: undefined,
|
|
65
|
-
getMax: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
|
|
66
|
-
getMin: function (t) { return (t[0] < props.Data[0] && t[1] > props.Data[1] ? props.Data[2] : undefined); },
|
|
67
|
-
});
|
|
68
|
-
setGuid(id);
|
|
69
|
-
return function () {
|
|
70
|
-
context.RemoveData(id);
|
|
71
|
-
};
|
|
72
|
-
}, []);
|
|
73
|
-
// Adjust text size within the oval to ensure it fits
|
|
74
|
-
React.useEffect(function () {
|
|
75
|
-
if (props.Text === undefined)
|
|
76
|
-
return;
|
|
77
|
-
var fontFamily = "Segoe UI";
|
|
78
|
-
var fontSizeUnit = "em";
|
|
79
|
-
var ovalWidth = Math.abs(context.XTransformation(props.Data[1]) - context.XTransformation(props.Data[0])) + (2 * props.Radius);
|
|
80
|
-
var ovalHeight = 2 * props.Radius;
|
|
81
|
-
var minSize = 0.05;
|
|
82
|
-
var maxSize = 5;
|
|
83
|
-
var bestSize = maxSize;
|
|
84
|
-
var calculateTextSize = function (size) {
|
|
85
|
-
var dX = (0, helper_functions_1.GetTextWidth)(fontFamily, size + fontSizeUnit, props.Text);
|
|
86
|
-
var dY = (0, helper_functions_1.GetTextHeight)(fontFamily, size + fontSizeUnit, props.Text);
|
|
87
|
-
return { dX: dX, dY: dY };
|
|
88
|
-
};
|
|
89
|
-
while (maxSize - minSize > 0.01) {
|
|
90
|
-
var midSize = (maxSize + minSize) / 2;
|
|
91
|
-
var _a = calculateTextSize(midSize), dX = _a.dX, dY = _a.dY;
|
|
92
|
-
if (dX <= ovalWidth && dY <= ovalHeight) {
|
|
93
|
-
bestSize = midSize;
|
|
94
|
-
minSize = midSize; // Try larger
|
|
95
|
-
}
|
|
96
|
-
else
|
|
97
|
-
maxSize = midSize; // Try smaller
|
|
98
|
-
}
|
|
99
|
-
setTextSize(bestSize);
|
|
100
|
-
}, [props.Text, props.Radius, context.XTransformation, props.Data]);
|
|
101
|
-
// Set up a click handler if provided in props
|
|
102
|
-
React.useEffect(function () {
|
|
103
|
-
if (guid === "" || props.OnClick === undefined)
|
|
104
|
-
return;
|
|
105
|
-
context.UpdateSelect(guid, { onClick: onClick });
|
|
106
|
-
}, [props.OnClick, context.UpdateFlag]);
|
|
107
|
-
// Handle click events on the oval
|
|
108
|
-
function onClick(xClick, yClick) {
|
|
109
|
-
if (props.OnClick === undefined)
|
|
110
|
-
return;
|
|
111
|
-
// Calculate positions and determine if the click was within the oval bounds
|
|
112
|
-
var axis = GraphContext_1.AxisMap.get(props.Axis);
|
|
113
|
-
var xClickTransformed = context.XTransformation(xClick);
|
|
114
|
-
var yClickTransformed = context.YTransformation(yClick, axis);
|
|
115
|
-
var x1Transformed = context.XTransformation(props.Data[0]) - props.Radius;
|
|
116
|
-
var x2Transformed = context.XTransformation(props.Data[1]) + props.Radius;
|
|
117
|
-
var yTransformed = context.YTransformation(props.Data[2], axis);
|
|
118
|
-
var isWithinHorizontalBounds = xClickTransformed >= x1Transformed && xClickTransformed <= x2Transformed;
|
|
119
|
-
var isWithinVerticalBounds = yClickTransformed >= yTransformed - props.Radius && yClickTransformed <= yTransformed + props.Radius;
|
|
120
|
-
if (isWithinHorizontalBounds && isWithinVerticalBounds)
|
|
121
|
-
props.OnClick(xClick, yClick, { setYDomain: context.SetYDomain, setTDomain: context.SetXDomain });
|
|
122
|
-
}
|
|
123
|
-
// Render null if coordinates are not valid, otherwise render the circle / text
|
|
124
|
-
if (!isFinite(context.XTransformation((props.Data[0], props.Data[1]) / 2)) || !isFinite(context.YTransformation(props.Data[2], GraphContext_1.AxisMap.get(props.Axis))))
|
|
125
|
-
return null;
|
|
126
|
-
return (React.createElement("g", null,
|
|
127
|
-
React.createElement("rect", { x: context.XTransformation(props.Data[0]) - props.Radius, y: context.YTransformation(props.Data[2], GraphContext_1.AxisMap.get(props.Axis)) - props.Radius, width: Math.abs(context.XTransformation(props.Data[1]) - context.XTransformation(props.Data[0])) + (2 * props.Radius), height: 2 * props.Radius, rx: props.Radius, ry: props.Radius, fill: props.Color, opacity: props.Opacity, stroke: props.BorderColor, strokeWidth: props.BorderThickness, onClick: function (e) { return onClick(e.clientX, e.clientY); } }),
|
|
128
|
-
props.Text !== undefined ?
|
|
129
|
-
React.createElement("text", { fill: (_a = props.TextColor) !== null && _a !== void 0 ? _a : 'currentColor', style: { fontSize: textSize + 'em', textAnchor: 'middle', dominantBaseline: 'middle' }, y: context.YTransformation(props.Data[2], GraphContext_1.AxisMap.get(props.Axis)), x: (context.XTransformation(props.Data[0]) + context.XTransformation(props.Data[1])) / 2 }, props.Text) : null));
|
|
130
|
-
};
|
|
131
|
-
exports.default = Oval;
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT3ZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9PdmFsLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEseUdBQXlHO0FBQ3pHLG1CQUFtQjtBQUNuQixFQUFFO0FBQ0YscUVBQXFFO0FBQ3JFLEVBQUU7QUFDRix3R0FBd0c7QUFDeEcsd0dBQXdHO0FBQ3hHLHNHQUFzRztBQUN0Ryx3RkFBd0Y7QUFDeEYsRUFBRTtBQUNGLDBDQUEwQztBQUMxQyxFQUFFO0FBQ0Ysd0dBQXdHO0FBQ3hHLHdHQUF3RztBQUN4Ryw0RUFBNEU7QUFDNUUsRUFBRTtBQUNGLDhCQUE4QjtBQUM5Qix3R0FBd0c7QUFDeEcsaUNBQWlDO0FBQ2pDLG1EQUFtRDtBQUNuRCxFQUFFO0FBQ0YseUdBQXlHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFHekcsbUVBQTZFO0FBQzdFLDZCQUErQjtBQUMvQiwrQ0FBaUg7QUFzRWpILElBQU0sSUFBSSxHQUFHLFVBQUMsS0FBYTs7SUFDdkIsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQywyQkFBWSxDQUFDLENBQUM7SUFFekMsSUFBQSxLQUFBLE9BQWtCLEtBQUssQ0FBQyxRQUFRLENBQVMsRUFBRSxDQUFDLElBQUEsRUFBM0MsSUFBSSxRQUFBLEVBQUUsT0FBTyxRQUE4QixDQUFDO0lBQzdDLElBQUEsS0FBQSxPQUEwQixLQUFLLENBQUMsUUFBUSxDQUFTLENBQUMsQ0FBQyxJQUFBLEVBQWxELFFBQVEsUUFBQSxFQUFFLFdBQVcsUUFBNkIsQ0FBQztJQUUxRCxpRkFBaUY7SUFDakYsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNaLElBQUksSUFBSSxLQUFLLEVBQUU7WUFDWCxPQUFPO1FBRVgsT0FBTyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUU7WUFDckIsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJO1lBQ2hCLE1BQU0sRUFBRSxTQUFTO1lBQ2pCLE1BQU0sRUFBRSxVQUFDLENBQUMsSUFBSyxPQUFBLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUExRSxDQUEwRTtZQUN6RixNQUFNLEVBQUUsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBMUUsQ0FBMEU7U0FDN0UsQ0FBQyxDQUFBO0lBQ3JCLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUE7SUFFNUIsaUVBQWlFO0lBQ2pFLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFFWixJQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1lBQ3ZCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixNQUFNLEVBQUUsU0FBUztZQUNqQixNQUFNLEVBQUUsVUFBQyxDQUFDLElBQUssT0FBQSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsRUFBMUUsQ0FBMEU7WUFDekYsTUFBTSxFQUFFLFVBQUMsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQTFFLENBQTBFO1NBQzdFLENBQUMsQ0FBQTtRQUNqQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDWCxPQUFPO1lBQ0gsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUMxQixDQUFDLENBQUE7SUFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxxREFBcUQ7SUFDckQsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNaLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTO1lBQUUsT0FBTztRQUVyQyxJQUFNLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRTFCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDakksSUFBTSxVQUFVLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFcEMsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDO1FBQ25CLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQztRQUNoQixJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUM7UUFFdkIsSUFBTSxpQkFBaUIsR0FBRyxVQUFDLElBQVk7WUFDbkMsSUFBTSxFQUFFLEdBQUcsSUFBQSwrQkFBWSxFQUFDLFVBQVUsRUFBRSxJQUFJLEdBQUcsWUFBWSxFQUFFLEtBQUssQ0FBQyxJQUFjLENBQUMsQ0FBQztZQUMvRSxJQUFNLEVBQUUsR0FBRyxJQUFBLGdDQUFhLEVBQUMsVUFBVSxFQUFFLElBQUksR0FBRyxZQUFZLEVBQUUsS0FBSyxDQUFDLElBQWMsQ0FBQyxDQUFDO1lBQ2hGLE9BQU8sRUFBRSxFQUFFLElBQUEsRUFBRSxFQUFFLElBQUEsRUFBRSxDQUFDO1FBQ3RCLENBQUMsQ0FBQTtRQUVELE9BQU8sT0FBTyxHQUFHLE9BQU8sR0FBRyxJQUFJLEVBQUUsQ0FBQztZQUM5QixJQUFNLE9BQU8sR0FBRyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBQSxLQUFhLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxFQUFyQyxFQUFFLFFBQUEsRUFBRSxFQUFFLFFBQStCLENBQUM7WUFFOUMsSUFBSSxFQUFFLElBQUksU0FBUyxJQUFJLEVBQUUsSUFBSSxVQUFVLEVBQUUsQ0FBQztnQkFDdEMsUUFBUSxHQUFHLE9BQU8sQ0FBQztnQkFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLGFBQWE7WUFDcEMsQ0FBQzs7Z0JBQ0csT0FBTyxHQUFHLE9BQU8sQ0FBQyxDQUFDLGNBQWM7UUFDekMsQ0FBQztRQUVELFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQixDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLGVBQWUsRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUVwRSw4Q0FBOEM7SUFDOUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztRQUNaLElBQUksSUFBSSxLQUFLLEVBQUUsSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLFNBQVM7WUFDMUMsT0FBTztRQUVYLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxTQUFBLEVBQWUsQ0FBQyxDQUFBO0lBQ3hELENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUE7SUFFdkMsa0NBQWtDO0lBQ2xDLFNBQVMsT0FBTyxDQUFDLE1BQWMsRUFBRSxNQUFjO1FBQzNDLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxTQUFTO1lBQzNCLE9BQU87UUFFWCw0RUFBNEU7UUFDNUUsSUFBTSxJQUFJLEdBQUcsc0JBQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLElBQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxRCxJQUFNLGlCQUFpQixHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWhFLElBQU0sYUFBYSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFDNUUsSUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM1RSxJQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFbEUsSUFBTSx3QkFBd0IsR0FBRyxpQkFBaUIsSUFBSSxhQUFhLElBQUksaUJBQWlCLElBQUksYUFBYSxDQUFDO1FBQzFHLElBQU0sc0JBQXNCLEdBQUcsaUJBQWlCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLElBQUksaUJBQWlCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFcEksSUFBSSx3QkFBd0IsSUFBSSxzQkFBc0I7WUFDbEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxVQUFzRCxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBb0QsRUFBRSxDQUFDLENBQUM7SUFDaE0sQ0FBQztJQUVELCtFQUErRTtJQUMvRSxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUNwSixPQUFPLElBQUksQ0FBQztJQUVoQixPQUFPLENBQ0g7UUFDSSw4QkFDSSxDQUFDLEVBQUUsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFDeEQsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUNqRixLQUFLLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFDckgsTUFBTSxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUN4QixFQUFFLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFDaEIsRUFBRSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQ2hCLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSyxFQUNqQixPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sRUFDdEIsTUFBTSxFQUFFLEtBQUssQ0FBQyxXQUFXLEVBQ3pCLFdBQVcsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUNsQyxPQUFPLEVBQUUsVUFBQyxDQUFDLElBQUssT0FBQSxPQUFPLENBQUMsQ0FBQyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEVBQTdCLENBQTZCLEdBQy9DO1FBRUQsS0FBSyxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQztZQUN2Qiw4QkFBTSxJQUFJLEVBQUUsTUFBQSxLQUFLLENBQUMsU0FBUyxtQ0FBSSxjQUFjLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsR0FBRyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsRUFBRSxRQUFRLEVBQUUsRUFDakksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxzQkFBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFDbEUsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQ3ZGLEtBQUssQ0FBQyxJQUFJLENBQ1IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNsQixDQUNQLENBQUM7QUFDTixDQUFDLENBQUE7QUFFRCxrQkFBZSxJQUFJLENBQUMifQ==
|