diff --git a/Figure.png b/Figure.png
index cc71e54..6ca8dae 100644
Binary files a/Figure.png and b/Figure.png differ
diff --git a/Polars.pdf b/Polars.pdf
new file mode 100644
index 0000000..092e4b1
Binary files /dev/null and b/Polars.pdf differ
diff --git a/Polars.png b/Polars.png
deleted file mode 100644
index cc71e54..0000000
Binary files a/Polars.png and /dev/null differ
diff --git a/README.md b/README.md
index d9c66a3..592b128 100644
--- a/README.md
+++ b/README.md
@@ -6,17 +6,38 @@ Please see the demo hosted at [https://yacht-vpp.streamlit.app/](https://yacht-v
## Using the code
-To use the code, first clone or download this repository then install the required dependencies (see below).
+The project is managed with [uv](https://docs.astral.sh/uv/). Install it once (see the [uv docs](https://docs.astral.sh/uv/getting-started/installation/) for other methods):
+
+```bash
+curl -LsSf https://astral.sh/uv/install.sh | sh
+```
+
+Then clone the repository and install the dependencies into a local `.venv`:
+
+```bash
+git clone https://github.com/marinlauber/Python-VPP.git
+cd Python-VPP
+uv sync
+```
The main files that are used are `runVPP.py` and `righting_moment.json`. These have to be filled with the data of your boat. By default they are using the YD-41 (from Principle of Yacht Design).
-The VPP is run with.
+The VPP is run from the root of the repository with
```bash
-$ python runVPP.py
+uv run python runVPP.py
```
-Once the code has run, it should generate the following figure (or a similar one)
+At each TWS/TWA the boat speed is maximised over boat speed, heel, leeway, sail flattening and reefing, subject to force and moment equilibrium (SLSQP). `VPP.set_analysis` takes an optional maximum heel angle (`phi_max`, default 35 degrees); the sails are only flattened (down to flat = 0.53) and reefed as much as is fastest within it, following the ORC VPP 2026 depowering scheme. Kites are further limited to their own `max_heel` (default 21.5 degrees, the ORC limit under spinnaker). Points where a sail set cannot be carried within its heel limit are left at 0 and not plotted. The apparent wind follows the ORC heeled wind triangle: TWS is taken at 10 m and scaled to the sail plan's centre of effort with a log wind profile (z0 = 0.005 m), and its cross-track component is reduced by cos(heel). Appendage drag follows the ORC strip friction, form factor and lift-dependent drag, and the induced drag the ORC rudder ramp (zero lift upright), heel multiplier and free-surface/funsteady span corrections. Appendage lift uses the geometric aspect ratio span²/area, doubled for the reflection in the hull, in a lifting-line lift-curve slope (Jones slender-wing slope for short keels). `VPP.run` accepts `method="sequential"` (default) or `"parallel"` (same results, spread over all CPU cores).
+
+To run the Streamlit demo locally:
+
+```bash
+uv sync --extra demo --extra api
+uv run streamlit run demos/Home.py
+```
+
+The run writes the results to `results.json` and saves the polars (`Polars.pdf`) and the sail chart (`SailChart.pdf`) as PDF, so the curves stay sharp when zoomed. For the YD-41 the polars look like this (`Figure.png` is a PNG copy of `Polars.pdf` for this page)
@@ -32,6 +53,7 @@ Here is a list of the key variables used in the VPP.
* Cu : Root Chord / Upper Chord (m)
* Cl : Tip Chord / Lower Chord (m)
* Span : Span (m)
+ * Tc_ratio : thickness/chord ratio for the ORC form factor (keel 0.20, rudder 0.10 by default)
1. Yacht :
* Lwl : Length waterline (m)
* Vol : Displ. volume of canoebody (m^3)
@@ -49,7 +71,8 @@ Here is a list of the key variables used in the VPP.
* Sails : List of Sails
1. Sails:
Standard measurements, except Roach is defined as 1-A/(0.5PE)
- Kite only takes area and vce estimate (this is very rough)
+ HBI (jib) is the height of the base of I above the waterline; sail centres of effort (kite vce) are measured from it
+ Kite only takes area and vce estimate (this is very rough), min_reef (default 0.85) for depowering and max_heel (default 21.5 degrees)
1. VPP.set_analysis()
* TWA range : range of TWA to use
* TWS range : range of TWS, must be between [2, 35]
@@ -64,16 +87,18 @@ Follow the steps below to contribute to this project.
### Install dependencies
-Install the project using [uv](https://docs.astral.sh/uv/):
+Install the project with the development tools (pytest, ruff, mypy) and the API dependencies:
```bash
-uv sync --extra dev
+uv sync --extra dev --extra api
```
-If using `pip`:
+Note that `uv sync` removes extras that are not listed, so pass every extra you need (or use `uv sync --all-extras`).
+
+If using `pip` instead:
```bash
-pip install -e ".[dev]"
+pip install -e ".[dev,api]"
```
### Run tests
@@ -83,13 +108,13 @@ Tests are implemented using [pytest](https://docs.pytest.org/en/8.0.x/).
You can run tests with
```bash
-pytest -vv
+uv run pytest -vv
```
-You can run a benchmark against the YD-41 results from WinVPP by running the `benchmark.py` script.
+You can run a benchmark against the YD-41 results from WinVPP by running the `benchmark.py` script (`-g` saves the polars as one `Figure__.pdf` per wind speed plus a `Figure__stats.pdf` error summary, `-s` saves the results).
```bash
-$ python benchmark/benchmark.py -g -o
+uv run python benchmark/benchmark.py -g -s
```
## Acknowledgements
diff --git a/SailChart.pdf b/SailChart.pdf
new file mode 100644
index 0000000..2a26183
Binary files /dev/null and b/SailChart.pdf differ
diff --git a/SailChart.png b/SailChart.png
deleted file mode 100644
index 1e83311..0000000
Binary files a/SailChart.png and /dev/null differ
diff --git a/benchmark/benchmark.py b/benchmark/benchmark.py
index 25c66ce..a44fcbe 100644
--- a/benchmark/benchmark.py
+++ b/benchmark/benchmark.py
@@ -165,7 +165,7 @@ def plot_polar(bm, calc, stats):
transform=ax.transAxes, fontsize=12)
plt.tight_layout()
- plt.savefig("Figure_%s_%02d.png" % (label, s), dpi=500)
+ plt.savefig("Figure_%s_%02d.pdf" % (label, s), dpi=500)
def plot_stats(stats):
print("Generating statistics plots...")
@@ -210,7 +210,7 @@ def plot_stats(stats):
ax.legend(title=r"Stats",loc=1, bbox_to_anchor=(1.05, 1.05))
plt.tight_layout()
- plt.savefig("Figure_%s_stats.png" % (label), dpi=500)
+ plt.savefig("Figure_%s_stats.pdf" % (label), dpi=500)
def benchmark(args):
if args.purge:
diff --git a/dat/Daring/righting_moment.json b/dat/Daring/righting_moment.json
new file mode 100644
index 0000000..4faf95d
--- /dev/null
+++ b/dat/Daring/righting_moment.json
@@ -0,0 +1,4 @@
+{
+ "Heel": [0.0, 10.0, 20.0, 30.0, 40.0, 50.0, 60.0],
+ "GZ": [0.000, 0.120, 0.230, 0.310, 0.350, 0.330, 0.260]
+}
diff --git a/dat/YD-41/post.py b/dat/YD-41/post.py
index bad2533..d531b2c 100644
--- a/dat/YD-41/post.py
+++ b/dat/YD-41/post.py
@@ -56,5 +56,5 @@
ax.set_ylabel(r"$V_B$ (knots)", labelpad=-40)
ax.legend(title=r"TWS (knots)", loc=1, bbox_to_anchor=(1.05, 1.05))
plt.tight_layout()
-plt.savefig("Figure.png", dpi=500)
+plt.savefig("Figure.pdf")
plt.show()
diff --git a/dat/orc/asym_cl_kite.dat b/dat/orc/asym_cl_kite.dat
new file mode 100644
index 0000000..703b795
--- /dev/null
+++ b/dat/orc/asym_cl_kite.dat
@@ -0,0 +1,5 @@
+# asymmetric spinnaker tacked on centreline (table 5.9) lift drag and lift coefficients (ORC VPP 2026). first row is awa
+0.02648,,,,,,,,,,,,
+0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,170.000,180.000
+0.0000,0.15405,0.23500,0.28500,0.33500,0.36500,0.40000,0.51500,0.56500,0.54000,0.42000,0.22800,0.19500
+0.0000,0.01738,0.69825,0.92000,1.08000,1.12500,1.13000,1.03500,0.88500,0.59200,0.24000,0.03900,0.00000
diff --git a/dat/orc/asym_pole_kite.dat b/dat/orc/asym_pole_kite.dat
new file mode 100644
index 0000000..bb261eb
--- /dev/null
+++ b/dat/orc/asym_pole_kite.dat
@@ -0,0 +1,5 @@
+# asymmetric spinnaker tacked on a pole (table 5.10) lift drag and lift coefficients (ORC VPP 2026). first row is awa
+0.02648,,,,,,,,,,,,
+0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,170.000,180.000
+0.0000,0.15405,0.23500,0.28500,0.33500,0.36500,0.40000,0.51500,0.59000,0.68000,0.70200,0.65500,0.63500
+0.0000,0.01738,0.69825,0.92000,1.08000,1.12500,1.13000,1.03500,0.95000,0.71000,0.39100,0.11500,0.00000
diff --git a/dat/orc/jib.dat b/dat/orc/jib.dat
new file mode 100644
index 0000000..14db946
--- /dev/null
+++ b/dat/orc/jib.dat
@@ -0,0 +1,5 @@
+# jib lift drag and lift coefficient (high, ORC VPP 2026 table 5.5). first row is awa
+0.016,,,,,,,,,
+0.00000,7.0000,15.0000,20.0000,27.0000,50.0000,60.0000,100.0000,150.0000,180.0000
+0.003,0.05000,0.03200,0.03100,0.03700,0.25000,0.35000,0.73000,0.95000,0.90000
+0.00000,0.00000,1.10000,1.47500,1.50000,1.45000,1.25000,0.40000,0.00000,-0.10000
\ No newline at end of file
diff --git a/dat/orc/jib_low.dat b/dat/orc/jib_low.dat
new file mode 100644
index 0000000..1fc72a9
--- /dev/null
+++ b/dat/orc/jib_low.dat
@@ -0,0 +1,5 @@
+# jib lift drag and lift coefficient (low, ORC VPP 2026 table 5.5). first row is awa
+0.016,,,,,,,,,
+0.00000,7.0000,15.0000,20.0000,27.0000,50.0000,60.0000,100.0000,150.0000,180.0000
+0.003,0.05000,0.03200,0.03100,0.03700,0.25000,0.35000,0.73000,0.95000,0.90000
+0.00000,0.00000,1.00000,1.37500,1.45000,1.45000,1.25000,0.40000,0.00000,-0.10000
diff --git a/dat/orc/kite.dat b/dat/orc/kite.dat
new file mode 100644
index 0000000..db3eaf6
--- /dev/null
+++ b/dat/orc/kite.dat
@@ -0,0 +1,5 @@
+# symmetric spinnaker (table 5.8, default kite) lift drag and lift coefficients (ORC VPP 2026). first row is awa
+0.02639,,,,,,,,,,,,
+0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,170.000,180.000
+0.0000,0.18194,0.26744,0.33721,0.41724,0.47100,0.51100,0.58824,0.63200,0.66200,0.70200,0.65500,0.63500
+0.0000,-0.02360,0.65965,0.86143,0.99180,1.01300,1.00000,0.92500,0.82700,0.67300,0.39100,0.11500,0.00000
diff --git a/dat/orc/main.dat b/dat/orc/main.dat
new file mode 100644
index 0000000..d597145
--- /dev/null
+++ b/dat/orc/main.dat
@@ -0,0 +1,5 @@
+# mainsail lift drag and lift coefficient (high, ORC VPP 2026 table 5.2). first row is awa
+0.01379,,,,,,,,,
+0.00000,7.0000,9.0000,12.0000,28.0000,60.0000,90.0000,120.0000,150.0000,180.000
+0.03448,0.01724,0.01466,0.01466,0.02586,0.11302,0.38250,0.96888,1.31578,1.34483
+0.00000,0.94828,1.13793,1.25000,1.42681,1.38319,1.26724,0.93103,0.38793,-0.11207
\ No newline at end of file
diff --git a/dat/orc/main_low.dat b/dat/orc/main_low.dat
new file mode 100644
index 0000000..2cce7cc
--- /dev/null
+++ b/dat/orc/main_low.dat
@@ -0,0 +1,5 @@
+# mainsail lift drag and lift coefficient (low, ORC VPP 2026 table 5.2). first row is awa
+0.01379,,,,,,,,,
+0.00000,7.0000,9.0000,12.0000,28.0000,60.0000,90.0000,120.0000,150.0000,180.000
+0.04310,0.02586,0.02328,0.02328,0.03259,0.11302,0.38250,0.96888,1.31578,1.34483
+0.00000,0.86207,1.05172,1.16379,1.34698,1.35345,1.26724,0.93103,0.38793,-0.11207
diff --git a/dat/orc/sym_kite.dat b/dat/orc/sym_kite.dat
new file mode 100644
index 0000000..6588f5c
--- /dev/null
+++ b/dat/orc/sym_kite.dat
@@ -0,0 +1,5 @@
+# symmetric spinnaker (table 5.8) lift drag and lift coefficients (ORC VPP 2026). first row is awa
+0.02639,,,,,,,,,,,,
+0.0000,28.000,41.000,50.000,60.000,67.000,75.000,100.000,115.000,130.000,150.000,170.000,180.000
+0.0000,0.18194,0.26744,0.33721,0.41724,0.47100,0.51100,0.58824,0.63200,0.66200,0.70200,0.65500,0.63500
+0.0000,-0.02360,0.65965,0.86143,0.99180,1.01300,1.00000,0.92500,0.82700,0.67300,0.39100,0.11500,0.00000
diff --git a/pyproject.toml b/pyproject.toml
index b82ab36..76bee68 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,12 +1,12 @@
[project]
name = "python-vpp"
-version = "0.0.2"
+version = "1.0.0"
description = "OOP Velocity Prediction Program"
readme = "README.md"
license = "MIT"
requires-python = ">=3.11"
authors = [
- { name = "Marin Lauber", email = "M.Lauber@soton.ac.uk" },
+ { name = "Marin Lauber", email = "marinlauber@gmail.com" },
{ name = "Otto Villani" },
{ name = "Thomas Dickson" },
]
@@ -19,7 +19,6 @@ dependencies = [
"numpy>=2.0",
"matplotlib>=3.8",
"scipy>=1.12",
- "tqdm>=4.66",
]
[project.optional-dependencies]
diff --git a/results.json b/results.json
index 53ac0fc..7185367 100644
--- a/results.json
+++ b/results.json
@@ -12,36 +12,44 @@
10.288
],
"twa": [
- 30.0,
- 35.0,
+ 28.0,
+ 32.0,
+ 36.0,
40.0,
- 45.0,
- 50.0,
- 55.0,
+ 44.0,
+ 48.0,
+ 52.0,
+ 56.0,
60.0,
- 65.0,
- 70.0,
- 75.0,
+ 64.0,
+ 68.0,
+ 72.0,
+ 76.0,
80.0,
- 85.0,
- 90.0,
- 95.0,
+ 84.0,
+ 88.0,
+ 92.0,
+ 96.0,
100.0,
- 105.0,
- 110.0,
- 115.0,
+ 104.0,
+ 108.0,
+ 112.0,
+ 116.0,
120.0,
- 125.0,
- 130.0,
- 135.0,
+ 124.0,
+ 128.0,
+ 132.0,
+ 136.0,
140.0,
- 145.0,
- 150.0,
- 155.0,
+ 144.0,
+ 148.0,
+ 152.0,
+ 156.0,
160.0,
- 165.0,
- 170.0,
- 175.0,
+ 164.0,
+ 168.0,
+ 172.0,
+ 176.0,
180.0
],
"sails": [
@@ -50,5864 +58,8096 @@
"MN1 + A5"
],
"results": [
- {
- "Speed": 2.561569616552873,
- "Heel": 2.6110567429378033,
- "Leeway": 4.472736970112156,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.2261873028682526,
- "Heel": 3.112997910600455,
- "Leeway": 3.422583434474393,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.7615342163864542,
- "Heel": 3.4626338225603632,
- "Leeway": 2.861764366658557,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.189475175390796,
- "Heel": 3.67825293726073,
- "Leeway": 2.488787560283444,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.484209707298338,
- "Heel": 3.781306587698491,
- "Leeway": 2.25089425142381,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.7391202525437635,
- "Heel": 3.838593121475754,
- "Leeway": 2.055354715953424,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.955559631838637,
- "Heel": 3.8514666883961697,
- "Leeway": 1.888712321792068,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.10763795263753,
- "Heel": 3.800397702249712,
- "Leeway": 1.749145076633882,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.286516304374415,
- "Heel": 3.175619778591795,
- "Leeway": 2.952101864389654,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.4775728001892134,
- "Heel": 1.7503674130569762,
- "Leeway": 1.9395237873652205,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.178063940150709,
- "Heel": 3.6566735223474716,
- "Leeway": 1.6222269262737672,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.6420267274142657,
- "Heel": 3.386773291189649,
- "Leeway": 2.596510904372786,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.753994938134146,
- "Heel": 1.8040840279033845,
- "Leeway": 1.7588809959249048,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.209865569735387,
- "Heel": 3.474224728438659,
- "Leeway": 1.504951446265048,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.9519062832050986,
- "Heel": 3.5550899506788456,
- "Leeway": 2.340081602618497,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.9911503940387885,
- "Heel": 1.8285895456864085,
- "Leeway": 1.6153756935177666,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.200494589404944,
- "Heel": 3.2527077477676385,
- "Leeway": 1.395969705258638,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.223959277824621,
- "Heel": 3.6789790347994957,
- "Leeway": 2.1368229098898657,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.198234971689516,
- "Heel": 1.826456266533262,
- "Leeway": 1.49112995635843,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.152608770133769,
- "Heel": 2.9941116337522176,
- "Leeway": 1.293025055843081,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.433484110160443,
- "Heel": 3.7589784389460252,
- "Leeway": 1.991323099854493,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.344560881121004,
- "Heel": 1.7886226443000917,
- "Leeway": 1.39650747539177,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.069649550624901,
- "Heel": 2.699750620921443,
- "Leeway": 1.1943519153121458,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.612140987897024,
- "Heel": 3.7917135379280356,
- "Leeway": 1.8586542833791946,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.429623289037254,
- "Heel": 1.7001629761109285,
- "Leeway": 1.299266038327358,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.956966466661626,
- "Heel": 2.3731837567370158,
- "Leeway": 1.098230926328109,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.699448329832093,
- "Heel": 3.6768145293250543,
- "Leeway": 1.7203944185655984,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.46183180065075,
- "Heel": 1.573021571500328,
- "Leeway": 1.2004619556560983,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.814398194068853,
- "Heel": 2.0426236307567485,
- "Leeway": 1.0051017255141308,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.750097207794773,
- "Heel": 3.513354976011307,
- "Leeway": 1.589799531035046,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.467742256563833,
- "Heel": 1.4325516814987254,
- "Leeway": 1.1051474935431889,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.657775782476055,
- "Heel": 1.7282870421334744,
- "Leeway": 0.9115835200751912,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.770151452592594,
- "Heel": 3.3093119756484484,
- "Leeway": 1.4646120691176494,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.447737005216443,
- "Heel": 1.282562683573817,
- "Leeway": 1.0123999122972762,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.481658554998872,
- "Heel": 1.4274577148734902,
- "Leeway": 0.8159534611826471,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.75993176286718,
- "Heel": 3.064877422597849,
- "Leeway": 1.343296799201094,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.391831581237419,
- "Heel": 1.1204840072062139,
- "Leeway": 0.9188363629706284,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.249886585543892,
- "Heel": 1.1105139401452933,
- "Leeway": 0.7082467099780321,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.720089613937065,
- "Heel": 2.777314414967685,
- "Leeway": 1.2236900234889325,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.298662439660925,
- "Heel": 0.9508520703151614,
- "Leeway": 0.8230112391258358,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.9330725006876666,
- "Heel": 0.8120527706102271,
- "Leeway": 0.6072056710170376,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.619521251461353,
- "Heel": 2.3944500049858592,
- "Leeway": 1.097393629715977,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.1833217254192485,
- "Heel": 0.787573897426107,
- "Leeway": 0.7287100828469785,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.557324543456671,
- "Heel": 0.5640887767146237,
- "Leeway": 0.5191730882921,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.494934445565906,
- "Heel": 2.006360508604818,
- "Leeway": 0.9721670031283858,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.995846315097238,
- "Heel": 0.6204376151413878,
- "Leeway": 0.6379580862844646,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.21163941811998,
- "Heel": 0.38827868031459883,
- "Leeway": 0.43950882201493047,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.350067582479646,
- "Heel": 1.6359398411597066,
- "Leeway": 0.8474892809128495,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.768452334497469,
- "Heel": 0.46505149571830645,
- "Leeway": 0.5445409547269344,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.136895552660251,
- "Heel": 1.2430006285986304,
- "Leeway": 0.7143008379316433,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.5140869277521576,
- "Heel": 0.3288435172446348,
- "Leeway": 0.44652866262592306,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.8618396847165526,
- "Heel": 0.8712890977025518,
- "Leeway": 0.5767820414443814,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.2483672094969815,
- "Heel": 0.2179925081583601,
- "Leeway": 0.34694882201470173,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.553711184951611,
- "Heel": 0.5502745719512074,
- "Leeway": 0.43173947857631756,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.99270503815722,
- "Heel": 0.14198395818772572,
- "Leeway": 0.26786559249376496,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.250834115379853,
- "Heel": 0.32524184894026026,
- "Leeway": 0.3063450339962598,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.7625608780541646,
- "Heel": 0.09426155217012386,
- "Leeway": 0.20661710074219092,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.968063409679798,
- "Heel": 0.18344756376552485,
- "Leeway": 0.20746413694844357,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.573277783864865,
- "Heel": 0.06382853703813963,
- "Leeway": 0.1563739932566918,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.7197551390971277,
- "Heel": 0.09929430374023775,
- "Leeway": 0.13237138838375553,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.3989177523251333,
- "Heel": 0.044013701464996724,
- "Leeway": 0.11984520806050926,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.528876148472367,
- "Heel": 0.05980104816354102,
- "Leeway": 0.09072006486865837,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.2845307138103075,
- "Heel": 0.034649213643758586,
- "Leeway": 0.10003112157755681,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.4133004699705713,
- "Heel": 0.039362331972094586,
- "Leeway": 0.06480967910735788,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.2095142151797464,
- "Heel": 0.024288069091597378,
- "Leeway": 0.07344022637584666,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.350477888724648,
- "Heel": 0.02196172911526278,
- "Leeway": 0.03784788184072311,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.166998441547587,
- "Heel": 0.015252698056784095,
- "Leeway": 0.04746128894828413,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.334189092032038,
- "Heel": 0.009643060171898596,
- "Leeway": 0.016851984586512252,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 2.15820332619536,
- "Heel": 0.007714397091359412,
- "Leeway": 0.024097405981924547,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.899286075344636,
- "Heel": 5.071105134794291,
- "Leeway": 4.360160115293261,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.711767538129434,
- "Heel": 5.800415914446172,
- "Leeway": 3.5297509896040484,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.3670517095252235,
- "Heel": 6.318375426622176,
- "Leeway": 3.0002474646161374,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.999486995083984,
- "Heel": 6.792030170811468,
- "Leeway": 2.588884976715289,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.469951179145504,
- "Heel": 7.085624844687612,
- "Leeway": 2.318059964393761,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.804728144332203,
- "Heel": 7.183355183868299,
- "Leeway": 2.122635666437524,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.032430597574462,
- "Heel": 7.101614304530023,
- "Leeway": 1.9683698644781569,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.142353791902521,
- "Heel": 6.802797634617789,
- "Leeway": 1.834458574751132,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.850025002027048,
- "Heel": 6.011972552770249,
- "Leeway": 3.037691525467854,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.074298757163126,
- "Heel": 3.6597498661803844,
- "Leeway": 2.030381253637955,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.207717322292395,
- "Heel": 6.439600920897409,
- "Leeway": 1.7052005978975455,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.332391250497242,
- "Heel": 6.446696090440634,
- "Leeway": 2.713710990816648,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.455697827571803,
- "Heel": 3.737588756561197,
- "Leeway": 1.8526542722531818,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.234969743749513,
- "Heel": 6.053541499492204,
- "Leeway": 1.5829271452619744,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.8049019116424985,
- "Heel": 6.828091978524921,
- "Leeway": 2.4263925307138576,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.8200058334810185,
- "Heel": 3.78137997866651,
- "Leeway": 1.6903979908959457,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.22499110368902,
- "Heel": 5.652323174787527,
- "Leeway": 1.4662999306280171,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.193126346083537,
- "Heel": 7.143378929425427,
- "Leeway": 2.221781626502823,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.10680171756611,
- "Heel": 3.7705256686830446,
- "Leeway": 1.5659013742486783,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.180521237723679,
- "Heel": 5.241049976760262,
- "Leeway": 1.353953839982302,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.511459045658114,
- "Heel": 7.361967892918808,
- "Leeway": 2.061267545814325,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.342549955213473,
- "Heel": 3.7137951900752917,
- "Leeway": 1.4558013398588796,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.106052110853164,
- "Heel": 4.822623841477925,
- "Leeway": 1.2444786803103935,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.7191027127978975,
- "Heel": 7.302186439636354,
- "Leeway": 1.9207446530894483,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.433253471837538,
- "Heel": 3.5333825882463246,
- "Leeway": 1.3464808649047921,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.001478193699883,
- "Heel": 4.396589088895034,
- "Leeway": 1.1382556850903227,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.8350543687907885,
- "Heel": 6.972448869067321,
- "Leeway": 1.779535494020808,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.479810004291103,
- "Heel": 3.314798897810764,
- "Leeway": 1.2436471446996191,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.857234663904952,
- "Heel": 3.9529239320544196,
- "Leeway": 1.0355011016170228,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.899915625188863,
- "Heel": 6.577223251526935,
- "Leeway": 1.647880840878095,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.490231907697427,
- "Heel": 3.061699033398183,
- "Leeway": 1.144084786589654,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.665120132396449,
- "Heel": 3.480887803352275,
- "Leeway": 0.9355583417798582,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.92733630754455,
- "Heel": 6.145919838509825,
- "Leeway": 1.5191236438052778,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.4658141200740396,
- "Heel": 2.773621744279308,
- "Leeway": 1.0468034662003571,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.407641632864899,
- "Heel": 2.930391228944299,
- "Leeway": 0.8282967287910431,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.9171632750234435,
- "Heel": 5.689807009886519,
- "Leeway": 1.3924404770834669,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.36882921288762,
- "Heel": 2.416452647085209,
- "Leeway": 0.9465115738952768,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.026273364321343,
- "Heel": 2.2691437159350407,
- "Leeway": 0.7206402416069873,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.847357472263064,
- "Heel": 5.164831437937939,
- "Leeway": 1.2600484157950242,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.224442136761386,
- "Heel": 2.0448051095633657,
- "Leeway": 0.8485390988760906,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.530507646120144,
- "Heel": 1.6439763200507282,
- "Leeway": 0.6234509423940068,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.716884509938393,
- "Heel": 4.60096096946138,
- "Leeway": 1.1276168358818581,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.042426530371825,
- "Heel": 1.686358965079522,
- "Leeway": 0.7524872795656057,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.057766614014445,
- "Heel": 1.1715535438564535,
- "Leeway": 0.5341800887071363,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.5504874513565525,
- "Heel": 4.028175678159122,
- "Leeway": 0.9969170491367318,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.762964000859664,
- "Heel": 1.3204075328948934,
- "Leeway": 0.6560074662316578,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.673659374373028,
- "Heel": 0.8405609736665967,
- "Leeway": 0.4490681693279574,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.322599696657643,
- "Heel": 3.397319106078804,
- "Leeway": 0.8639713134404041,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.40957997226431,
- "Heel": 0.9791972151190418,
- "Leeway": 0.5582844472484715,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.993973571825034,
- "Heel": 2.655058091316036,
- "Leeway": 0.7283945082867322,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.0756971464556635,
- "Heel": 0.6964008193975818,
- "Leeway": 0.45348676525564713,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.5934904977870845,
- "Heel": 1.8486351569983477,
- "Leeway": 0.5838626105119289,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.75365269003444,
- "Heel": 0.471905536204152,
- "Leeway": 0.35075575524828273,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.155972124135593,
- "Heel": 1.1636937060477657,
- "Leeway": 0.4340296670112946,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.444411492810563,
- "Heel": 0.31622671217128867,
- "Leeway": 0.2705897740630409,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.773665161819413,
- "Heel": 0.7091727384179249,
- "Leeway": 0.3099539782205789,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.159705996340931,
- "Heel": 0.21251784097610613,
- "Leeway": 0.20554885278572674,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.42074573105769,
- "Heel": 0.4093860393107844,
- "Leeway": 0.20866938559679823,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.886896354349036,
- "Heel": 0.14390904772222438,
- "Leeway": 0.15467402083498197,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.094511244373853,
- "Heel": 0.223873057534199,
- "Leeway": 0.1317195296645853,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.6398167195384916,
- "Heel": 0.09824755477856288,
- "Leeway": 0.11642329657226917,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.817979694627767,
- "Heel": 0.13369296489603721,
- "Leeway": 0.08901030433816327,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.4689705336149967,
- "Heel": 0.07648699817984324,
- "Leeway": 0.09591568203193528,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.651681923896128,
- "Heel": 0.08769411124680271,
- "Leeway": 0.06307726115281655,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.3579045809091483,
- "Heel": 0.05375163703580453,
- "Leeway": 0.07039753933082829,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.558041259377993,
- "Heel": 0.04856098514920144,
- "Leeway": 0.036523574786747025,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.294541775624435,
- "Heel": 0.03352747429725701,
- "Leeway": 0.045141098014153586,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.533631992243373,
- "Heel": 0.021138756750039015,
- "Leeway": 0.01611924913947008,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 3.2812110308544074,
- "Heel": 0.01681008169721984,
- "Leeway": 0.022717176808041032,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.00670116949316,
- "Heel": 8.6246205709952,
- "Leeway": 4.554820775987639,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.187407920055945,
- "Heel": 10.715492710633711,
- "Leeway": 3.544353852589292,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.940762990158405,
- "Heel": 11.910097690244552,
- "Leeway": 3.039958014106463,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.4053160012674955,
- "Heel": 12.375957919152444,
- "Leeway": 2.747863156723882,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.66630947785322,
- "Heel": 12.340542188730346,
- "Leeway": 2.5601219410166607,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.87447870562492,
- "Heel": 12.09712888068183,
- "Leeway": 2.3934536016673076,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.952239826755748,
- "Heel": 11.369755289097496,
- "Leeway": 2.246806852251952,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.008103885284877,
- "Heel": 10.533580127385349,
- "Leeway": 2.101439101152284,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.418484449284785,
- "Heel": 11.484784738192065,
- "Leeway": 3.0270099353659994,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.660727932378767,
- "Heel": 5.658636786868139,
- "Leeway": 2.07774953883622,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.042675095932594,
- "Heel": 9.687871579875978,
- "Leeway": 1.959303064568863,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.993824700198823,
- "Heel": 12.710551331558124,
- "Leeway": 2.7441521676905603,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.067094748228624,
- "Heel": 5.742633478412799,
- "Leeway": 1.9388441376231915,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.057396701977291,
- "Heel": 8.885397613730039,
- "Leeway": 1.8192968095975695,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.427700632293086,
- "Heel": 13.723429620550293,
- "Leeway": 2.573755506568138,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.38333714222309,
- "Heel": 5.744493443871703,
- "Leeway": 1.8319464018791447,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.05368255638196,
- "Heel": 8.048116319434087,
- "Leeway": 1.6814639575862997,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.726177653570329,
- "Heel": 14.483622790209793,
- "Leeway": 2.4749483390982414,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.573763578216786,
- "Heel": 5.63729992852014,
- "Leeway": 1.7520093395202319,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.031072523697388,
- "Heel": 7.20375943202514,
- "Leeway": 1.5464280438666054,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.893147781170329,
- "Heel": 14.204659035343868,
- "Leeway": 2.3343056112468075,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.664250934825591,
- "Heel": 5.376620047212393,
- "Leeway": 1.6384639665055172,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.992097530767815,
- "Heel": 6.4821797105374594,
- "Leeway": 1.4130547577115287,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.987742095875764,
- "Heel": 13.591383650053663,
- "Leeway": 2.2030043744317864,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.73095190757066,
- "Heel": 5.087852422080344,
- "Leeway": 1.5238033241341944,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.940443684400231,
- "Heel": 5.85395625932522,
- "Leeway": 1.2804210092660053,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.061327647528765,
- "Heel": 12.788323155476283,
- "Leeway": 2.066017156642733,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.772259556179872,
- "Heel": 4.773797168082708,
- "Leeway": 1.4085834200672094,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.871425075864138,
- "Heel": 5.261784342754399,
- "Leeway": 1.146067230739344,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.111788868824037,
- "Heel": 11.809812803548597,
- "Leeway": 1.9244927183217606,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.7772898902744565,
- "Heel": 4.423737604025408,
- "Leeway": 1.28947142218624,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.718287030184707,
- "Heel": 4.609818635144034,
- "Leeway": 1.0068131304473764,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.116896913981291,
- "Heel": 10.481783909004605,
- "Leeway": 1.7652808185321511,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.739443372067974,
- "Heel": 4.0324173703546355,
- "Leeway": 1.165007230257703,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.5525427227718875,
- "Heel": 3.9926573606513935,
- "Leeway": 0.8730581491793361,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.093447951372665,
- "Heel": 9.185577014932527,
- "Leeway": 1.6003080301582724,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.678232383010578,
- "Heel": 3.6224083580653756,
- "Leeway": 1.0424021052122625,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.358958845856639,
- "Heel": 3.3820882312211284,
- "Leeway": 0.7476809596267675,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.047697381568764,
- "Heel": 7.933019623132993,
- "Leeway": 1.4345657109981294,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.595610699052058,
- "Heel": 3.1902607320442065,
- "Leeway": 0.9218290885445234,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.00336612571257,
- "Heel": 2.6945244036791074,
- "Leeway": 0.6397283804639731,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.979876390560853,
- "Heel": 6.750038996157418,
- "Leeway": 1.2682882120537184,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.453891707769054,
- "Heel": 2.697948412390906,
- "Leeway": 0.8002592192530945,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.578250869042223,
- "Heel": 2.010690653244344,
- "Leeway": 0.5420726216739402,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.863929786787751,
- "Heel": 5.727032148204245,
- "Leeway": 1.090988089548562,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.263468719254678,
- "Heel": 2.173131285904598,
- "Leeway": 0.6838159899539942,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.0954429397589855,
- "Heel": 1.455380992267711,
- "Leeway": 0.4568265151295812,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.680007665360494,
- "Heel": 4.825319501450383,
- "Leeway": 0.923573138383536,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.985669397774461,
- "Heel": 1.662223419642298,
- "Leeway": 0.5695716352616119,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.462182776347462,
- "Heel": 3.941429073644051,
- "Leeway": 0.7523545252635099,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.63518736134377,
- "Heel": 1.2007570425558225,
- "Leeway": 0.4576156798026558,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.151340041391437,
- "Heel": 3.0035600202859283,
- "Leeway": 0.5883961616345718,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.246595232737753,
- "Heel": 0.8205221807189609,
- "Leeway": 0.3531917129889434,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.7469322056967735,
- "Heel": 2.0000110228978634,
- "Leeway": 0.43569180024309095,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.811607389366975,
- "Heel": 0.5517355855620327,
- "Leeway": 0.27622939294630194,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.289985837786323,
- "Heel": 1.2397625379768293,
- "Leeway": 0.3121525578879877,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.381132422923635,
- "Heel": 0.37236667184720307,
- "Leeway": 0.2144400780290574,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.797500397724515,
- "Heel": 0.7146305873404492,
- "Leeway": 0.21171893673666778,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.051659619523926,
- "Heel": 0.25421262297417346,
- "Leeway": 0.1611943420871609,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.3192377533418576,
- "Heel": 0.3929657714939348,
- "Leeway": 0.136719301185858,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.764210088216766,
- "Heel": 0.17694778579213927,
- "Leeway": 0.12202104176611489,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.994669918956161,
- "Heel": 0.24230412358474643,
- "Leeway": 0.09417070385907694,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.571933504080339,
- "Heel": 0.1384612583358568,
- "Leeway": 0.09981516611740063,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.796080931278461,
- "Heel": 0.15858205273819997,
- "Leeway": 0.06609771628376919,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.4426776315107315,
- "Heel": 0.09650158287276075,
- "Leeway": 0.07218487049612189,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.6879096734068115,
- "Heel": 0.08830877682114117,
- "Leeway": 0.03825832460668311,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.368777676930061,
- "Heel": 0.06017584666557224,
- "Leeway": 0.04607252752860947,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.6592387538642335,
- "Heel": 0.038784189283701545,
- "Leeway": 0.017011104794069976,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 4.353272028136822,
- "Heel": 0.03024306023233024,
- "Leeway": 0.023219172664673535,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.267118115652627,
- "Heel": 14.975063780247556,
- "Leeway": 4.427748262722796,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.322818480912646,
- "Heel": 17.583312527276256,
- "Leeway": 3.6862394998014203,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.787375970358124,
- "Heel": 18.128569581442427,
- "Leeway": 3.3439411333309335,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.080847525059086,
- "Heel": 18.16933536920731,
- "Leeway": 3.1132078966901773,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.311858296223445,
- "Heel": 17.94077190771431,
- "Leeway": 2.9145744988265445,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.465695118290375,
- "Heel": 17.236060611658658,
- "Leeway": 2.72326099480503,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.594776119515592,
- "Heel": 16.34590239343974,
- "Leeway": 2.5359031237406278,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.688673458538087,
- "Heel": 15.312406816062419,
- "Leeway": 2.36110196758839,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.620311856123459,
- "Heel": 19.59170259891216,
- "Leeway": 3.258311787451566,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.72163783981931,
- "Heel": 8.488342809870327,
- "Leeway": 2.3503863498461164,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.749566590930016,
- "Heel": 14.15489133595764,
- "Leeway": 2.195734055453108,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.045040988265361,
- "Heel": 21.84705363958181,
- "Leeway": 3.141382609817859,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.005825457946935,
- "Heel": 8.518071444134433,
- "Leeway": 2.279276622927746,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.779163103830811,
- "Heel": 12.89280447567176,
- "Leeway": 2.0372577149528177,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.365854027733306,
- "Heel": 23.41189348752423,
- "Leeway": 3.0396689429018844,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.202373853540584,
- "Heel": 8.317051679595519,
- "Leeway": 2.1931407546100377,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.774777942091541,
- "Heel": 11.54920651408176,
- "Leeway": 1.8861162066393926,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.59273466690872,
- "Heel": 23.167169582310844,
- "Leeway": 2.858228408516219,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.324479546858832,
- "Heel": 7.837090531143627,
- "Leeway": 2.0618645568396192,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.743504916144715,
- "Heel": 10.150896224381079,
- "Leeway": 1.7382246181493868,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.797192411952604,
- "Heel": 22.544853082330583,
- "Leeway": 2.6755571821924815,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.428289348870864,
- "Heel": 7.293415991207425,
- "Leeway": 1.9264494199774713,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.69143080211048,
- "Heel": 8.939826173697057,
- "Leeway": 1.589036945058244,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.972380790305278,
- "Heel": 21.538285980282424,
- "Leeway": 2.4952905077950827,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.514582434841994,
- "Heel": 6.760925935261364,
- "Leeway": 1.7869557713395856,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.587512454305337,
- "Heel": 7.601797138943901,
- "Leeway": 1.4279840187681114,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.108278230676548,
- "Heel": 20.060445393598293,
- "Leeway": 2.3159223876367436,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.54405701437451,
- "Heel": 6.195733054356211,
- "Leeway": 1.6366651182791156,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.448131456949985,
- "Heel": 6.426747083882084,
- "Leeway": 1.2644082927781748,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.161484079787895,
- "Heel": 18.38238039289464,
- "Leeway": 2.1283358631559204,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.540175292668444,
- "Heel": 5.649731621377461,
- "Leeway": 1.4865816021663858,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.304897464680376,
- "Heel": 5.541239536107098,
- "Leeway": 1.1048725763263139,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.17286826915485,
- "Heel": 16.523038580394815,
- "Leeway": 1.9472731527761584,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.508926263508451,
- "Heel": 5.12108272548297,
- "Leeway": 1.3389014826830934,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.13875440096554,
- "Heel": 4.785103488152481,
- "Leeway": 0.9576209301169621,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.14336855418222,
- "Heel": 14.504524939389826,
- "Leeway": 1.7707182059659627,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.426614472767925,
- "Heel": 4.576839471295092,
- "Leeway": 1.191313706209335,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.96903130796391,
- "Heel": 4.10354641327166,
- "Leeway": 0.8194319460763466,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.040467346362531,
- "Heel": 12.1687896970731,
- "Leeway": 1.5898292854649687,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.314807895494413,
- "Heel": 4.027183294642999,
- "Leeway": 1.0440749274813368,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.7607388558162835,
- "Heel": 3.444056262933565,
- "Leeway": 0.6931071865844939,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.883804419939228,
- "Heel": 9.753974844101757,
- "Leeway": 1.404140269088569,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.18327233868519,
- "Heel": 3.4602522755637284,
- "Leeway": 0.8948137729209271,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.509326567433543,
- "Heel": 2.7853520892044776,
- "Leeway": 0.5789540490571627,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.693041169945605,
- "Heel": 7.678751273376105,
- "Leeway": 1.205037809072191,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.038669108932769,
- "Heel": 2.874512687285524,
- "Leeway": 0.7500888350543822,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.203259748100359,
- "Heel": 2.1413609287078033,
- "Leeway": 0.48031608020493033,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.479471174231957,
- "Heel": 6.049119711081231,
- "Leeway": 1.0064076862177058,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.877410173151802,
- "Heel": 2.248063142828709,
- "Leeway": 0.6074947121307919,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.24575229883419,
- "Heel": 4.804350549737878,
- "Leeway": 0.8008698446919719,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.636022905278717,
- "Heel": 1.6654301601612451,
- "Leeway": 0.4795004559060566,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.020781724950268,
- "Heel": 3.74874946242638,
- "Leeway": 0.613508040231461,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.386559923935502,
- "Heel": 1.195390137177191,
- "Leeway": 0.36892003076388247,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.762335540973506,
- "Heel": 2.744942841895556,
- "Leeway": 0.45437487826760264,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.032479143407609,
- "Heel": 0.8377510145389025,
- "Leeway": 0.2861603496146203,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.4444840282643145,
- "Heel": 1.7944103153390751,
- "Leeway": 0.3226651260627099,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.6518245698708025,
- "Heel": 0.5791868832191565,
- "Leeway": 0.2179790095067216,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.053219733881746,
- "Heel": 1.085887604022652,
- "Leeway": 0.21720444945832906,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.2785905242973366,
- "Heel": 0.396805626125209,
- "Leeway": 0.16275494592078946,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.596891820617031,
- "Heel": 0.6121817661673865,
- "Leeway": 0.1383917702796448,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.913037233087093,
- "Heel": 0.2779359339736404,
- "Leeway": 0.1242808308854246,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.213642801691225,
- "Heel": 0.3805108235790742,
- "Leeway": 0.09552949702955409,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.6548431129983685,
- "Heel": 0.21992091223993399,
- "Leeway": 0.10349885611308589,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.962251512498037,
- "Heel": 0.24932423574161336,
- "Leeway": 0.0672332992722485,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.476486848454987,
- "Heel": 0.15343923927594627,
- "Leeway": 0.07550213568439608,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.8223700382128,
- "Heel": 0.13965042873337946,
- "Leeway": 0.03922011644441139,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.375731085920928,
- "Heel": 0.09659129156069741,
- "Leeway": 0.04883639784741841,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.785545810017779,
- "Heel": 0.06172293872477994,
- "Leeway": 0.017557607771842888,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 5.355067345935869,
- "Heel": 0.04906569462697382,
- "Leeway": 0.024894329819662435,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.204319368499826,
- "Heel": 22.521454488878877,
- "Leeway": 4.576181364798577,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.922011451982043,
- "Heel": 25.027059445443207,
- "Leeway": 4.079744594696405,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.312949990072957,
- "Heel": 25.457916379689006,
- "Leeway": 3.755175700958929,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.712745842423233,
- "Heel": 25.704010887715427,
- "Leeway": 3.4462274923987373,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.041494204006112,
- "Heel": 25.38834873097577,
- "Leeway": 3.1742050513644062,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.292089596057258,
- "Heel": 24.402482732974963,
- "Leeway": 2.922825661921523,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.497651222221181,
- "Heel": 23.12059314227339,
- "Leeway": 2.6975117981066474,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.655405334532086,
- "Heel": 21.54620781083049,
- "Leeway": 2.494987201678334,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.350088414582371,
- "Heel": 31.381995622004013,
- "Leeway": 4.186039818579681,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.404693762522042,
- "Heel": 12.47531418124128,
- "Leeway": 2.7465449962544786,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.759218817209037,
- "Heel": 19.76174278479236,
- "Leeway": 2.312126634042093,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.876216250347218,
- "Heel": 34.87463108420466,
- "Leeway": 4.002027032696338,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.770428330498016,
- "Heel": 12.53540860705034,
- "Leeway": 2.6190430543836243,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.810039830432613,
- "Heel": 18.210482622886545,
- "Leeway": 2.14151174939726,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.267054781874307,
- "Heel": 35.29845266757778,
- "Leeway": 3.70480197575839,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.006653791982002,
- "Heel": 11.994216995977675,
- "Leeway": 2.4445812311272337,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.808663622949679,
- "Heel": 16.51076326033704,
- "Leeway": 1.983766504817516,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.641212173941263,
- "Heel": 35.16961723614471,
- "Leeway": 3.4112979632935834,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.222533311216653,
- "Heel": 11.316912708915762,
- "Leeway": 2.271139496467263,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.769264499084965,
- "Heel": 14.702906869689361,
- "Leeway": 1.8311104830038858,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.984333803374927,
- "Heel": 34.48053604844781,
- "Leeway": 3.1305171568278967,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.404060002022108,
- "Heel": 10.498989107010539,
- "Leeway": 2.103065009409499,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.669481592866285,
- "Heel": 12.675456522557731,
- "Leeway": 1.6753861225677023,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.290806993222233,
- "Heel": 33.20587028385052,
- "Leeway": 2.8628781429971526,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.51857328090073,
- "Heel": 9.558644875084484,
- "Leeway": 1.9340658540825297,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.477405318167559,
- "Heel": 10.363897180883574,
- "Leeway": 1.5120971131497443,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.488652131513774,
- "Heel": 30.68593118059843,
- "Leeway": 2.605545203428352,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.566649812924007,
- "Heel": 8.569940156936493,
- "Leeway": 1.7666186793944847,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.263403685195922,
- "Heel": 8.483825296078324,
- "Leeway": 1.3486541861912056,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.631086213701163,
- "Heel": 28.078883025579167,
- "Leeway": 2.166010800096515,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.570379995626181,
- "Heel": 7.528741691877999,
- "Leeway": 1.6048864900809103,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.001018855440611,
- "Heel": 6.853678981687011,
- "Leeway": 1.195883999577062,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.657516615264692,
- "Heel": 25.09741138046956,
- "Leeway": 1.971258427775608,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.507802273202971,
- "Heel": 6.559389675490821,
- "Leeway": 1.4469717369035837,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.738020537764227,
- "Heel": 5.735215887431274,
- "Leeway": 1.0481698979217,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.615642512408701,
- "Heel": 21.669363306025247,
- "Leeway": 1.7945306277595992,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.35828674476759,
- "Heel": 5.715811430421642,
- "Leeway": 1.2912991962992393,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.486720394787836,
- "Heel": 4.865150371298299,
- "Leeway": 0.9057068053347493,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.40981726319784,
- "Heel": 17.91764589632194,
- "Leeway": 1.620824467691918,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.173351813978433,
- "Heel": 4.957058266852559,
- "Leeway": 1.1325870776293432,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.262554519209983,
- "Heel": 4.121277010812508,
- "Leeway": 0.7691935028078396,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.160251465020021,
- "Heel": 14.518778561556394,
- "Leeway": 1.4424918815858843,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.959129560948071,
- "Heel": 4.2408056709832325,
- "Leeway": 0.9738200787229574,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.057775161062876,
- "Heel": 3.451437543487418,
- "Leeway": 0.6437694658377527,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.847545723725446,
- "Heel": 10.993549575695859,
- "Leeway": 1.2521640773481053,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.724599063258461,
- "Heel": 3.5268159920045603,
- "Leeway": 0.8120746313777711,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.861395719985954,
- "Heel": 2.829611747003592,
- "Leeway": 0.5333296083633694,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.491394152334816,
- "Heel": 7.983666357078287,
- "Leeway": 1.0472479828872265,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.48669243809271,
- "Heel": 2.8123559319507327,
- "Leeway": 0.6587444827258983,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.127847952647572,
- "Heel": 5.868010344624862,
- "Leeway": 0.8411328396723189,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.262987526271257,
- "Heel": 2.1150454378517836,
- "Leeway": 0.5209541271425042,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.777461028241094,
- "Heel": 4.512591655799132,
- "Leeway": 0.6537279187511996,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.0458659114186,
- "Heel": 1.5737132683966533,
- "Leeway": 0.4108739157449619,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.44829071990969,
- "Heel": 3.402908134649702,
- "Leeway": 0.4923061954451142,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.820662862444846,
- "Heel": 1.145044052311941,
- "Leeway": 0.31456454201251605,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.150678496769288,
- "Heel": 2.3331927983964986,
- "Leeway": 0.3497492117704487,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.563622840833893,
- "Heel": 0.8203793128832592,
- "Leeway": 0.23711858681969272,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.888919111909314,
- "Heel": 1.4673306131162616,
- "Leeway": 0.23407365697297874,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.2751284465580595,
- "Heel": 0.5696292228519811,
- "Leeway": 0.17320409244157944,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.550397178447732,
- "Heel": 0.8713019305895755,
- "Leeway": 0.14986812449425524,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.954439370221036,
- "Heel": 0.4064720128234979,
- "Leeway": 0.13099202151867836,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.2580194145957595,
- "Heel": 0.5645321994731252,
- "Leeway": 0.10374695268000826,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.710090907493888,
- "Heel": 0.3222081359812377,
- "Leeway": 0.10755176356742882,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.026904989541314,
- "Heel": 0.3663649213720923,
- "Leeway": 0.07109310551125904,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.532901684874543,
- "Heel": 0.22258124517279157,
- "Leeway": 0.07695390406789013,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.891132468338262,
- "Heel": 0.20625531209111062,
- "Leeway": 0.04134867477427907,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.431709510455198,
- "Heel": 0.13978951584065338,
- "Leeway": 0.04937318341040293,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.855584303701534,
- "Heel": 0.09196783443778916,
- "Leeway": 0.018631771316979576,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 6.409601645982556,
- "Heel": 0.0710730046906942,
- "Leeway": 0.02517066093987956,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.589829304093802,
- "Heel": 30.84102734854441,
- "Leeway": 5.722333008668588,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.249282969613434,
- "Heel": 33.14310628845854,
- "Leeway": 5.100500474533835,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.821331123564383,
- "Heel": 34.256590462183425,
- "Leeway": 4.576549931690612,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.412447175693913,
- "Heel": 35.09748804938003,
- "Leeway": 4.100426428665641,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.87278049593021,
- "Heel": 34.77979926037813,
- "Leeway": 3.7055911235210144,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.286542631477818,
- "Heel": 33.85705202798442,
- "Leeway": 3.348102425487225,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.649696734953892,
- "Heel": 32.47947760236681,
- "Leeway": 3.0338916521145918,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.938859803543426,
- "Heel": 30.535632850245552,
- "Leeway": 2.7598512666344472,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.102692144328298,
- "Heel": 44.533975741627685,
- "Leeway": 4.810219085913932,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.250750598170475,
- "Heel": 17.40715230242235,
- "Leeway": 2.9794947083858996,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.220342813940992,
- "Heel": 28.766443380535655,
- "Leeway": 2.2996149950700646,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.70297039981047,
- "Heel": 46.38413919600232,
- "Leeway": 4.436696566805277,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.722946297708235,
- "Heel": 17.368455207285923,
- "Leeway": 2.758605017632081,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.3147888965456,
- "Heel": 26.462220431052586,
- "Leeway": 2.1147131466307982,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.241396301696682,
- "Heel": 46.878545199658895,
- "Leeway": 4.032698780946958,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.08739140973012,
- "Heel": 16.819281004856485,
- "Leeway": 2.5363419966893437,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.314067188616434,
- "Heel": 23.740210823112108,
- "Leeway": 1.9556084706654455,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.777275935556835,
- "Heel": 46.9265938446381,
- "Leeway": 3.645411835725819,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.416096998681658,
- "Heel": 16.070660445567754,
- "Leeway": 2.3285119592024213,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.24476897226212,
- "Heel": 20.673986218818786,
- "Leeway": 1.811665254505315,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.297243709849473,
- "Heel": 46.51352909777687,
- "Leeway": 3.281470236499611,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.704931250166451,
- "Heel": 15.130402228310604,
- "Leeway": 2.133470841258384,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.043257348158315,
- "Heel": 17.74259149258358,
- "Leeway": 1.6693927985334673,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.778871096494003,
- "Heel": 45.59595231062371,
- "Leeway": 2.947411833843889,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.867802437694257,
- "Heel": 13.817063204386045,
- "Leeway": 1.9522775460332427,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.722426644788682,
- "Heel": 14.64140306347736,
- "Leeway": 1.5244115212560583,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.134645706980109,
- "Heel": 43.528629543606,
- "Leeway": 2.6346155998688294,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.94478880917017,
- "Heel": 12.298656736433008,
- "Leeway": 1.783609877908594,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.368639480650106,
- "Heel": 11.676790922268196,
- "Leeway": 1.3801109783290122,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.403417875539354,
- "Heel": 40.74429511535355,
- "Leeway": 2.354187174609207,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.953752934369467,
- "Heel": 10.661184753011483,
- "Leeway": 1.6244387973227383,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.944497875871683,
- "Heel": 9.104035635871847,
- "Leeway": 1.2476292671949138,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.558986955922501,
- "Heel": 37.09859771203556,
- "Leeway": 2.105692762223069,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.83486578857658,
- "Heel": 9.036453784097482,
- "Leeway": 1.4736225019776823,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.55479056682962,
- "Heel": 7.152026322614642,
- "Leeway": 1.1103702086448306,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.57554453381598,
- "Heel": 32.38681008971425,
- "Leeway": 1.8865553151307406,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.605276629724424,
- "Heel": 7.464068065873704,
- "Leeway": 1.3277275459417894,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.196019226134354,
- "Heel": 5.849405331075145,
- "Leeway": 0.9721691155480285,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.327810704962175,
- "Heel": 26.75908918108136,
- "Leeway": 1.553245041333477,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.31473911854622,
- "Heel": 6.16616910440189,
- "Leeway": 1.1723120401028246,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.868813940670051,
- "Heel": 4.909770119828604,
- "Leeway": 0.8388953998604978,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.919264881491662,
- "Heel": 20.92190437303,
- "Leeway": 1.3980286374659043,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.9978222290515,
- "Heel": 5.169289106594585,
- "Leeway": 1.0137682745359429,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.581187553099554,
- "Heel": 4.15156192773857,
- "Leeway": 0.7160137143514692,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.411687161145531,
- "Heel": 15.943174321988325,
- "Leeway": 1.233305003761509,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.650125708184271,
- "Heel": 4.275145561625392,
- "Leeway": 0.8503861359220618,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.303874163134227,
- "Heel": 3.5667471824434527,
- "Leeway": 0.6259423966641324,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.841581909468303,
- "Heel": 11.216880602822995,
- "Leeway": 1.0506927694031973,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.315418324803646,
- "Heel": 3.4524245192236407,
- "Leeway": 0.6945134023498063,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.298428599944481,
- "Heel": 7.6145830120314475,
- "Leeway": 0.8578978621723438,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.97364318876277,
- "Heel": 2.7009697390182272,
- "Leeway": 0.5670707625285751,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.789029316111785,
- "Heel": 5.512972074753141,
- "Leeway": 0.6808395434274737,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.665589491550598,
- "Heel": 2.026077472135744,
- "Leeway": 0.4550045500067895,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.309816025072415,
- "Heel": 4.131209255397667,
- "Leeway": 0.5189351607557456,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.386641326335234,
- "Heel": 1.5017339079205632,
- "Leeway": 0.35605020985566466,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.893433392656009,
- "Heel": 2.9675498355224663,
- "Leeway": 0.37749257110761514,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.162926592340265,
- "Heel": 1.1057507152552453,
- "Leeway": 0.2706912266940385,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.503507265280808,
- "Heel": 1.8878730280508182,
- "Leeway": 0.2579019609026488,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.936278871341309,
- "Heel": 0.7802793824184705,
- "Leeway": 0.19767430007618028,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.196218891286865,
- "Heel": 1.1911902344614862,
- "Leeway": 0.17313672374621222,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.7079878585975745,
- "Heel": 0.5774887516431375,
- "Leeway": 0.15040044323178584,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.978282612926164,
- "Heel": 0.8252826898178685,
- "Leeway": 0.1252368249909448,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.533021373935309,
- "Heel": 0.46484302646021824,
- "Leeway": 0.12260345490011862,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.820709527880875,
- "Heel": 0.5252593535046245,
- "Leeway": 0.08220115679440393,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.400459968005457,
- "Heel": 0.31396854503387145,
- "Leeway": 0.08452603418968033,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.710762618597458,
- "Heel": 0.3019780090753742,
- "Leeway": 0.04834438152945783,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.316454618199522,
- "Heel": 0.19831834448315652,
- "Leeway": 0.05411833703588422,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.682735605740955,
- "Heel": 0.13868244178485234,
- "Leeway": 0.022371553703750265,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.296169587049998,
- "Heel": 0.10220333682666799,
- "Leeway": 0.02793359305483613,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.924467519909696,
- "Heel": 40.401677293656405,
- "Leeway": 6.537366893260317,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.633833007214223,
- "Heel": 42.00220283344436,
- "Leeway": 5.7283160842408805,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.394155438826404,
- "Heel": 43.40232692332444,
- "Leeway": 5.012156624220767,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.143413827402615,
- "Heel": 44.403835282975585,
- "Leeway": 4.412506262463724,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.780683109635657,
- "Heel": 44.36679331539559,
- "Leeway": 3.9081513877014005,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.415387714673512,
- "Heel": 44.04056310121143,
- "Leeway": 3.462115947530888,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.013167554561232,
- "Heel": 43.361021106198955,
- "Leeway": 3.0782556333206283,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.54686158650964,
- "Heel": 42.23386354104649,
- "Leeway": 2.7490213343790293,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.82347780782249,
- "Heel": 54.169073684268234,
- "Leeway": 5.383737497616505,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.310132997207944,
- "Heel": 23.914953276655467,
- "Leeway": 3.0447748221933466,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.965952007863002,
- "Heel": 40.48168693945135,
- "Leeway": 2.471502263342431,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.52136102504086,
- "Heel": 55.11532232630858,
- "Leeway": 4.825836314234407,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.96462734399137,
- "Heel": 23.960334744420727,
- "Leeway": 2.748139387629851,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.263383153151379,
- "Heel": 38.04210733825359,
- "Leeway": 2.2338041154089083,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.253688364347216,
- "Heel": 55.69078781724273,
- "Leeway": 4.291595177756218,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.528883596544594,
- "Heel": 23.367775324756455,
- "Leeway": 2.476372700513029,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.404231491287769,
- "Heel": 34.74451174305254,
- "Leeway": 2.0322983184487864,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.982908247057699,
- "Heel": 55.872791474403215,
- "Leeway": 3.805933919733268,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.040959545225485,
- "Heel": 22.40967087761371,
- "Leeway": 2.236173233423896,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.36292963267487,
- "Heel": 30.366136031241115,
- "Leeway": 1.8601405741689847,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.675858577676014,
- "Heel": 55.633691481752024,
- "Leeway": 3.3763440077524085,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.474319251979262,
- "Heel": 21.046259162803437,
- "Leeway": 2.0272263743407883,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.178862708752993,
- "Heel": 26.363974003641864,
- "Leeway": 1.5666939470859613,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.276320997954954,
- "Heel": 54.83762551668359,
- "Leeway": 3.0045974106292466,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.73582885439417,
- "Heel": 19.28419564410593,
- "Leeway": 1.8482452614033686,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.629982297259026,
- "Heel": 20.7860843372463,
- "Leeway": 1.4483723265976332,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.747754079152719,
- "Heel": 53.14720913795133,
- "Leeway": 2.665354351191314,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.839371105110635,
- "Heel": 17.41241894101848,
- "Leeway": 1.6886703363804294,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.007234770331955,
- "Heel": 16.464429037271422,
- "Leeway": 1.3361065621837693,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.131135469967484,
- "Heel": 50.869963051132004,
- "Leeway": 2.3638324008249136,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.840619857637307,
- "Heel": 15.335599223831705,
- "Leeway": 1.5431494853947139,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.270408748657209,
- "Heel": 12.586377983754435,
- "Leeway": 1.240050714106743,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.41322896259439,
- "Heel": 47.88911519045748,
- "Leeway": 2.094372705995733,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.696790138680115,
- "Heel": 13.025190753910845,
- "Leeway": 1.4096690875307147,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.639876029853124,
- "Heel": 9.464613743588544,
- "Leeway": 1.130711570946118,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.572380374845368,
- "Heel": 44.030564392287104,
- "Leeway": 1.8535780283828371,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.330143771780605,
- "Heel": 10.446431073280703,
- "Leeway": 1.2880512993036317,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.114709964232015,
- "Heel": 7.282865765185633,
- "Leeway": 1.0086337125738114,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.499315250593028,
- "Heel": 38.46214012481252,
- "Leeway": 1.6351557795740623,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.874303616827364,
- "Heel": 8.241865098012124,
- "Leeway": 1.1560532806123711,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.662037759760539,
- "Heel": 5.887079795543459,
- "Leeway": 0.8854710155691043,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.113853839684149,
- "Heel": 30.58888673321167,
- "Leeway": 1.4442882467691383,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.375586576297486,
- "Heel": 6.430206467390789,
- "Leeway": 1.0145803755548692,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.266507203390436,
- "Heel": 4.9502427502592505,
- "Leeway": 0.7710016445838604,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.444451867970141,
- "Heel": 22.900887061680578,
- "Leeway": 1.168450095155542,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.84427013032545,
- "Heel": 5.1670178695952735,
- "Leeway": 0.8622635669917238,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.868355508211007,
- "Heel": 4.365429027332485,
- "Leeway": 0.7103844682334117,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.655198122299108,
- "Heel": 16.10302889597835,
- "Leeway": 1.0128069979774423,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.3652203461078,
- "Heel": 4.158254580715778,
- "Leeway": 0.7113149587992831,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.834359417732344,
- "Heel": 10.539216953376297,
- "Leeway": 0.8452049366158773,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.890530020599375,
- "Heel": 3.3338388565304697,
- "Leeway": 0.5938590778937497,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.074888832002646,
- "Heel": 6.923836276072279,
- "Leeway": 0.6851783053201277,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.463050168879697,
- "Heel": 2.5803204347045527,
- "Leeway": 0.4847254927636262,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.389195671250606,
- "Heel": 4.97362612220515,
- "Leeway": 0.5313063071316809,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.105619621994812,
- "Heel": 1.9328897640870435,
- "Leeway": 0.38678876982711985,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.82597263227653,
- "Heel": 3.6242839743973905,
- "Leeway": 0.3928071882553591,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.776945941472881,
- "Heel": 1.4260645517953754,
- "Leeway": 0.29990188078345187,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.29747741080768,
- "Heel": 2.4172064412690393,
- "Leeway": 0.27547175222206954,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.478288957558116,
- "Heel": 1.0378825569187093,
- "Leeway": 0.22846143042192052,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.88438987162702,
- "Heel": 1.5814160882754402,
- "Leeway": 0.1951072728303694,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.260542156551558,
- "Heel": 0.799193325173701,
- "Leeway": 0.17979430417245887,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.606786957611888,
- "Heel": 1.158992901263238,
- "Leeway": 0.15087420615577699,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.115110041505494,
- "Heel": 0.652110146328968,
- "Leeway": 0.14754766097925798,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.423399893222747,
- "Heel": 0.7305043544763197,
- "Leeway": 0.09844585170105373,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.004588648790355,
- "Heel": 0.4368788568594928,
- "Leeway": 0.10040877338784732,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.325530805841922,
- "Heel": 0.4319496798415761,
- "Leeway": 0.05930606745478007,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.943645586699635,
- "Heel": 0.28020145908885163,
- "Leeway": 0.06484290775391288,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.301754031505173,
- "Heel": 0.20594235996744173,
- "Leeway": 0.02845188858801268,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 7.932241296268953,
- "Heel": 0.14802133688365762,
- "Leeway": 0.03422814457508885,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.102096938913997,
- "Heel": 47.47396285498962,
- "Leeway": 7.470255487573004,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.983795713216503,
- "Heel": 49.219438610348206,
- "Leeway": 6.36889418998746,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.931498620488126,
- "Heel": 50.76981509371812,
- "Leeway": 5.440730972780667,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.847992518990893,
- "Heel": 51.81300295018351,
- "Leeway": 4.699951285607713,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.712467405160979,
- "Heel": 52.13506338125195,
- "Leeway": 4.073969383135376,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.570781136465017,
- "Heel": 52.207266671473704,
- "Leeway": 3.5486049472767567,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.329640608570704,
- "Heel": 51.81847519133657,
- "Leeway": 3.126195573843961,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.017305482700747,
- "Heel": 51.03273204613721,
- "Leeway": 2.7699200358209786,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.502315137829225,
- "Heel": 60.959313672384475,
- "Leeway": 5.851089934559998,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.546185539164778,
- "Heel": 32.04596216246131,
- "Leeway": 3.312575886421022,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.620694396564291,
- "Heel": 49.802044676779005,
- "Leeway": 2.465426989410198,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.43071113359599,
- "Heel": 61.92669159793112,
- "Leeway": 5.105717340984107,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.500577753938943,
- "Heel": 32.63932137239536,
- "Leeway": 2.9095865431182117,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.096392296343476,
- "Heel": 47.99264426912814,
- "Leeway": 2.206966287370736,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.387325316954673,
- "Heel": 62.55035344224307,
- "Leeway": 4.44362229304132,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.276638545303495,
- "Heel": 32.12044242937441,
- "Leeway": 2.5814169605846735,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.417832740734065,
- "Heel": 45.49250505542562,
- "Leeway": 1.9871402898617558,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.282970814877086,
- "Heel": 62.776602235159274,
- "Leeway": 3.8956665592683164,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.964757950442984,
- "Heel": 30.967837889470236,
- "Leeway": 2.302900768761267,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.59930124957754,
- "Heel": 42.2219436286847,
- "Leeway": 1.7930187717631731,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.118595304480822,
- "Heel": 62.62151111458227,
- "Leeway": 3.429242547273626,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.60251797827849,
- "Heel": 29.47764359816851,
- "Leeway": 1.8877969532066896,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.618306577342512,
- "Heel": 37.976905865367506,
- "Leeway": 1.6200511849448715,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.859749650765412,
- "Heel": 61.97004854816861,
- "Leeway": 3.0255171505590073,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.006363391244179,
- "Heel": 27.548915241699394,
- "Leeway": 1.708368043357703,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.17861745882525,
- "Heel": 30.956095729410126,
- "Leeway": 1.467310536334407,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.429272553419798,
- "Heel": 60.565186850556195,
- "Leeway": 2.6738735836075196,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.124984042527274,
- "Heel": 24.632783965825567,
- "Leeway": 1.558107498171498,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.292432175244837,
- "Heel": 23.82977526990202,
- "Leeway": 1.2412225203551095,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.883654654547307,
- "Heel": 58.63183032211455,
- "Leeway": 2.366538926719526,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.103006440828475,
- "Heel": 21.226088448387188,
- "Leeway": 1.4284291918280085,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.203649750972044,
- "Heel": 17.559387462958096,
- "Leeway": 1.1684458117946777,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.22402668897068,
- "Heel": 56.08345607321081,
- "Leeway": 2.0928523504027696,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.953956584431317,
- "Heel": 18.132955078549827,
- "Leeway": 1.3092457644116304,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.19225491235143,
- "Heel": 13.06649871330453,
- "Leeway": 1.0935216823954925,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.448435642033132,
- "Heel": 52.79331071815703,
- "Leeway": 1.845801892908742,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.467884583495794,
- "Heel": 14.841290358218375,
- "Leeway": 1.2065250917062755,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.344787378146284,
- "Heel": 9.556385225479005,
- "Leeway": 1.0040058791053312,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.486568428607644,
- "Heel": 48.197024716711624,
- "Leeway": 1.6171639057978457,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.852586493910062,
- "Heel": 11.515035698965635,
- "Leeway": 1.100515775323125,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.665683622117259,
- "Heel": 7.265192395214114,
- "Leeway": 0.9028679602160647,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.2899996270211,
- "Heel": 41.78111039960927,
- "Leeway": 1.4064217698365789,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.176259920344046,
- "Heel": 8.635737259628922,
- "Leeway": 0.98116215132177,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.106301645900675,
- "Heel": 5.915664959589164,
- "Leeway": 0.8081718147870166,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.77348323821098,
- "Heel": 32.656778519015546,
- "Leeway": 1.2131379144694767,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.422594314432802,
- "Heel": 6.38387207948933,
- "Leeway": 0.8451055767067744,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.582432769322605,
- "Heel": 5.231652762246088,
- "Leeway": 0.7685625296245258,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.814440629756431,
- "Heel": 22.791393766564642,
- "Leeway": 0.961042797568732,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.720056124236233,
- "Heel": 4.991862116447968,
- "Leeway": 0.7066439308562131,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.69936082194503,
- "Heel": 14.846903783888619,
- "Leeway": 0.8124520567695382,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.030767608302888,
- "Heel": 3.996674708263733,
- "Leeway": 0.6001078226991443,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.69608977600777,
- "Heel": 9.284214496521262,
- "Leeway": 0.666989748971318,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.440718513297325,
- "Heel": 3.166326535963399,
- "Leeway": 0.49841302608210003,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.745351887242037,
- "Heel": 6.029376047701313,
- "Leeway": 0.527090933443266,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.976532359376037,
- "Heel": 2.4319869939709133,
- "Leeway": 0.4042612441622961,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.9561462909523,
- "Heel": 4.323169433308247,
- "Leeway": 0.3967477276833254,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.536333796818582,
- "Heel": 1.7965239506915118,
- "Leeway": 0.3189047247514961,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.25192525604682,
- "Heel": 2.998695703702666,
- "Leeway": 0.28436517225065183,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.15672311402372,
- "Heel": 1.3337970193644937,
- "Leeway": 0.2504671898602931,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.726056901170702,
- "Heel": 2.0245208833608177,
- "Leeway": 0.2081412023196355,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.87670133691181,
- "Heel": 1.0552162436899553,
- "Leeway": 0.20455916996492468,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.375208637326166,
- "Heel": 1.5277128923646344,
- "Leeway": 0.1674692738091924,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.691319055229805,
- "Heel": 0.8549607968863342,
- "Leeway": 0.1683611429664411,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.147951450256835,
- "Heel": 0.9581513489160066,
- "Leeway": 0.10942259523541488,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.551899750930849,
- "Heel": 0.5844329123308363,
- "Leeway": 0.11756531388328234,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.021097063821479,
- "Heel": 0.5777745124671139,
- "Leeway": 0.06755957716903173,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.475964327736556,
- "Heel": 0.38189775442110024,
- "Leeway": 0.07760156134117853,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.99061181174512,
- "Heel": 0.2820659409696527,
- "Leeway": 0.03322580184312882,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.462949042488907,
- "Heel": 0.206845305151321,
- "Leeway": 0.04201960374131932,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 8.219063724417644,
- "Heel": 53.261752287294094,
- "Leeway": 8.513932144983206,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.303911411076383,
- "Heel": 55.14032211153173,
- "Leeway": 7.024600578450865,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.461473907068461,
- "Heel": 56.79973630432835,
- "Leeway": 5.846451397286192,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.59782343624989,
- "Heel": 57.92809443196576,
- "Leeway": 4.932459390656114,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.708366555942424,
- "Heel": 58.532483604184236,
- "Leeway": 4.19253391423398,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.726267764275713,
- "Heel": 58.73288692754955,
- "Leeway": 3.6214541238554268,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.691917912720216,
- "Heel": 58.62779915000213,
- "Leeway": 3.154699895702523,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.527305367339434,
- "Heel": 58.072677174204905,
- "Leeway": 2.7791649490890604,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.280794942974577,
- "Heel": 66.37227664674995,
- "Leeway": 6.186775237596669,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.901108682095062,
- "Heel": 41.48466157476745,
- "Leeway": 3.2798552267516192,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.2213858377445,
- "Heel": 57.03505323701554,
- "Leeway": 2.469254867981764,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.480556355330357,
- "Heel": 67.34493119983473,
- "Leeway": 5.252976385438944,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.058057267401256,
- "Heel": 42.2811547304713,
- "Leeway": 2.8595186524790566,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.7752842792981,
- "Heel": 55.489068055753755,
- "Leeway": 2.2067607101539117,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.623038458436698,
- "Heel": 67.94443834499391,
- "Leeway": 4.517384188900604,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.046338525077177,
- "Heel": 42.0701576107796,
- "Leeway": 2.51039159635549,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.17859164191438,
- "Heel": 53.37158480008424,
- "Leeway": 1.9815671079163313,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.724673954828946,
- "Heel": 68.21444700272669,
- "Leeway": 3.9099658927308796,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.908227287236528,
- "Heel": 41.22077576724295,
- "Leeway": 2.22472971321126,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.460098406764473,
- "Heel": 50.64107362533476,
- "Leeway": 1.7801222004064958,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.707293330969131,
- "Heel": 68.1177394269457,
- "Leeway": 3.4224529893031232,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.631790201626135,
- "Heel": 39.69065774708999,
- "Leeway": 1.985538246060042,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.616993187041846,
- "Heel": 47.175472181554774,
- "Leeway": 1.5969787161660605,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.53186696672173,
- "Heel": 67.56223960566592,
- "Leeway": 3.0202853745808613,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.202926909202905,
- "Heel": 37.406909573777476,
- "Leeway": 1.7816111796388214,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.51561224126757,
- "Heel": 42.12958201110828,
- "Leeway": 1.4254577399289359,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.15447676600829,
- "Heel": 66.33910259187303,
- "Leeway": 2.671618415539329,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.501838567924242,
- "Heel": 33.82979805971086,
- "Leeway": 1.6054404037238545,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.967551729262723,
- "Heel": 34.47668001625214,
- "Leeway": 1.2725548676411906,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.648002576013173,
- "Heel": 64.65353493235565,
- "Leeway": 2.3666273970435943,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.55705352335999,
- "Heel": 29.268713499097814,
- "Leeway": 1.3336255956046557,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.788809382931852,
- "Heel": 25.411740336266686,
- "Leeway": 1.0688365933399062,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 18.017706745432573,
- "Heel": 62.43006615209185,
- "Leeway": 2.094197425738012,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.360753244190924,
- "Heel": 25.033334353851174,
- "Leeway": 1.2168634366803768,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.23692897056174,
- "Heel": 17.814782065957743,
- "Leeway": 1.0207340361728656,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 18.267972595493408,
- "Heel": 59.55973415100371,
- "Leeway": 1.8468332698104473,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.901216915419457,
- "Heel": 20.003253890128416,
- "Leeway": 1.1199258194801978,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.002984325143105,
- "Heel": 12.963570000585065,
- "Leeway": 0.9573775896849462,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 18.336295808568437,
- "Heel": 55.5665647157808,
- "Leeway": 1.6155380153412817,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 16.171276493554064,
- "Heel": 15.958281649587642,
- "Leeway": 1.0293597222677002,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.001902189373354,
- "Heel": 9.393769582022893,
- "Leeway": 0.8822496856899287,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 18.2055683229175,
- "Heel": 50.05945110117748,
- "Leeway": 1.3981302650991194,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.277591720196344,
- "Heel": 11.853496807611018,
- "Leeway": 0.9286464594497125,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.176457930026514,
- "Heel": 7.213566866051803,
- "Leeway": 0.8116629844359168,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.873910208514314,
- "Heel": 42.58279927463667,
- "Leeway": 1.1940106087197502,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.287671738599206,
- "Heel": 8.370079877707184,
- "Leeway": 0.8140875071929897,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.446810430705497,
- "Heel": 6.233621263533679,
- "Leeway": 0.7970232218598119,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 17.136209668939415,
- "Heel": 31.624014642854192,
- "Leeway": 1.0064408110281835,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.358234260960073,
- "Heel": 6.043840655136547,
- "Leeway": 0.6882062329742216,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 15.823745468145155,
- "Heel": 19.96409502755517,
- "Leeway": 0.7746349814804012,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.464500280748346,
- "Heel": 4.730783818081382,
- "Leeway": 0.5859400437675908,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 14.537334792148782,
- "Heel": 12.616096895753854,
- "Leeway": 0.6394948794697088,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.652808052924849,
- "Heel": 3.760760302636879,
- "Leeway": 0.4946319656503032,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 13.336489467212006,
- "Heel": 7.592284589101475,
- "Leeway": 0.5128114967323828,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.019486647803065,
- "Heel": 2.963936836030265,
- "Leeway": 0.40809680924205055,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 12.32994451884244,
- "Heel": 5.109596237480674,
- "Leeway": 0.38975495213777966,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.43312491844818,
- "Heel": 2.215034174196007,
- "Leeway": 0.3279555435739832,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 11.390810052716013,
- "Heel": 3.572216521633928,
- "Leeway": 0.2841220324612129,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.954191481293947,
- "Heel": 1.6618117857470502,
- "Leeway": 0.26338631276703367,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.704285617290655,
- "Heel": 2.5098905135822323,
- "Leeway": 0.2129063896834985,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.612969261095785,
- "Heel": 1.3339777178173713,
- "Leeway": 0.21993040866186822,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 10.264440119133189,
- "Heel": 1.9090691529496346,
- "Leeway": 0.17449868282379544,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.38000775399891,
- "Heel": 1.0772770346580314,
- "Leeway": 0.18196530724830587,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.982391497754396,
- "Heel": 1.2040924082225108,
- "Leeway": 0.1154489607587883,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.209306803870971,
- "Heel": 0.7448257448281856,
- "Leeway": 0.1291346290936031,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.829461104586764,
- "Heel": 0.7331215607017073,
- "Leeway": 0.07220022831389432,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.117896155161867,
- "Heel": 0.49177268689221515,
- "Leeway": 0.08633861784743259,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 0.0,
- "Heel": 0.0,
- "Leeway": 0.0,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.793397441007038,
- "Heel": 0.3620091596851739,
- "Leeway": 0.03593797724132038,
- "flat": 0.0,
- "RED": 0.0
- },
- {
- "Speed": 9.1031457777938,
- "Heel": 0.27003383879925746,
- "Leeway": 0.04741145565671415,
- "flat": 0.0,
- "RED": 0.0
- }
+ [
+ [
+ [
+ 1.803114408136825,
+ 1.591214684427556,
+ 5.47811540282392,
+ 0.7480815484343576,
+ 1.0000000022663973
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 2.649210402077476,
+ 2.912691141052593,
+ 4.23995448914862,
+ 0.9499999900255878,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 3.1879153444439883,
+ 3.3272165889266954,
+ 3.3824013653298244,
+ 0.9499999923755088,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 3.618320052676365,
+ 3.6350841294649165,
+ 2.9052089176687166,
+ 0.9500000014885452,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 3.9678864413061756,
+ 3.9269466225197434,
+ 2.6332120782456196,
+ 0.9659266677151898,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.263823116835597,
+ 4.235431782776835,
+ 2.4719593647526055,
+ 0.9989622947809633,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.480052410452434,
+ 4.315980872299177,
+ 2.2840773272901784,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.66743288322666,
+ 4.347845373281806,
+ 2.1161850787373675,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.82104517146135,
+ 4.33526923526082,
+ 1.969064027454095,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.9464674186372015,
+ 4.28849558495598,
+ 1.8386437281113712,
+ 1.0,
+ 2.0
+ ],
+ [
+ 3.2554456364134277,
+ 3.973306241439019,
+ 3.1792602933767924,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 3.3514971262065294,
+ 3.387157409279169,
+ 2.549256341577362,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.041124760102213,
+ 4.208662072903055,
+ 1.723242180008742,
+ 1.0,
+ 2.0
+ ],
+ [
+ 3.55196753766665,
+ 4.192029633119149,
+ 2.842999891630629,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 3.617479412030813,
+ 3.5673821322759385,
+ 2.3183793199954827,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.105346427070452,
+ 4.097262058170041,
+ 1.6195831417573159,
+ 1.0,
+ 2.0
+ ],
+ [
+ 3.815081715656396,
+ 4.377578189497097,
+ 2.5907503054374836,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.8515086144299726,
+ 3.7133587195827658,
+ 2.138596216736691,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.138605827595461,
+ 3.955191156993033,
+ 1.5254190296892443,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 4.0481605082419065,
+ 4.52681291831729,
+ 2.3894486192509046,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.060128629915525,
+ 3.8244198263001077,
+ 1.987194130450168,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.1399259995703686,
+ 3.783106862151372,
+ 1.4392108094651448,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.248675071325639,
+ 4.6359476744407875,
+ 2.2252083810575587,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 4.237280549087909,
+ 3.897652392189026,
+ 1.8600939022331349,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.111080009700442,
+ 3.583066825029814,
+ 1.3590270581789545,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 4.404731730571804,
+ 4.6985382889771214,
+ 2.0962590666753074,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.369513499044576,
+ 3.9267632185238877,
+ 1.7582667382110153,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.056330283433853,
+ 3.3582100385564284,
+ 1.2828169427748748,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.536823973246112,
+ 4.713487306190734,
+ 1.9752416042913432,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.476843731146556,
+ 3.913599809856111,
+ 1.6611214627853343,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.978513524859663,
+ 3.1095014944358272,
+ 1.2090743733101101,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.642439411586384,
+ 4.678040348598399,
+ 1.8605947265478007,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.556550871065453,
+ 3.855534479458283,
+ 1.5675413844054051,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.8798717620279835,
+ 2.836169197372866,
+ 1.1364945767397354,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 4.719915462254156,
+ 4.591645218473593,
+ 1.7508461835169604,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.607246153445149,
+ 3.752180248065727,
+ 1.4765519923916497,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 4.759441786388814,
+ 2.534750728299728,
+ 1.0648314523193654,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.76567326063975,
+ 4.454522317583348,
+ 1.6459859028818251,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.628544082567891,
+ 3.604575761703928,
+ 1.3873022211068835,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.625061132867368,
+ 2.2187254668952767,
+ 0.991054675917057,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 4.784464732995017,
+ 4.271726629484237,
+ 1.5423278786578898,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 4.621317237914779,
+ 3.4149437781985776,
+ 1.2990151815880087,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.473089028682731,
+ 1.905653629898385,
+ 0.9136657001510604,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.774667351526079,
+ 4.04627410458678,
+ 1.440235046592003,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.589567431733858,
+ 3.188065385236181,
+ 1.2108479552698543,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.306892289348535,
+ 1.600396192045327,
+ 0.8304825113630081,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 4.739822949436443,
+ 3.7846177573608903,
+ 1.3388373413571313,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.538042382717212,
+ 2.930118040191335,
+ 1.1229742814628894,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 4.092118390410564,
+ 1.290583225416504,
+ 0.7440554095176245,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.682998245038059,
+ 3.49343982393536,
+ 1.2386335503743593,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.470056790312875,
+ 2.643526387440943,
+ 1.0354606412026897,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 3.8164176175262607,
+ 0.9906840484717916,
+ 0.6579696596488755,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.606930955088626,
+ 3.174136103952093,
+ 1.1389661478557598,
+ 0.9999999999999997,
+ 1.0
+ ],
+ [
+ 4.384884832460506,
+ 2.3270167262249237,
+ 0.9473788112915863,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 3.535242104195219,
+ 0.7451202874064987,
+ 0.576676476084871,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.511634867515119,
+ 2.81985457008492,
+ 1.0382330564254103,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.2806414739420235,
+ 2.0036009456118493,
+ 0.857447259708145,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 3.261465441699558,
+ 0.5549344169542185,
+ 0.5032560434462499,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.394712372222766,
+ 2.418167933123657,
+ 0.9348066848402875,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 4.141568274889702,
+ 1.6708693301631823,
+ 0.765688258363273,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 3.0081181497231873,
+ 0.4162421444388546,
+ 0.4413812456334024,
+ 1.0,
+ 2.0
+ ],
+ [
+ 4.251706443876162,
+ 1.9945194461594613,
+ 0.8262435548285391,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 3.9529206269051302,
+ 1.3292440206374696,
+ 0.6709679629328864,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.057240932926602,
+ 1.5613309822400903,
+ 0.7131856333087087,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 3.7517997552753704,
+ 1.013273062446437,
+ 0.5703156648642463,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.8374914405633733,
+ 1.15733858119045,
+ 0.5940749279590718,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.5417102957275,
+ 0.7410047206541218,
+ 0.4706526625895771,
+ 0.9999999999999997,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.6160753759859148,
+ 0.8207655470857019,
+ 0.47744031035416484,
+ 0.9999999999999873,
+ 0.9999999999999976
+ ],
+ [
+ 3.333718910855576,
+ 0.5224293981241966,
+ 0.37706212778522125,
+ 0.9999999999999891,
+ 0.9999999999999983
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.392373395386236,
+ 0.5547065727152658,
+ 0.3694052352409042,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.134808151576938,
+ 0.356372591624999,
+ 0.2931388405020447,
+ 0.9999999999999993,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.180135044035698,
+ 0.35865128795709506,
+ 0.2740205599570299,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 2.9429403318377583,
+ 0.2357670331118357,
+ 0.2216445266226205,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.977779764949582,
+ 0.22001039009757822,
+ 0.19311226796332995,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.7697299824963015,
+ 0.15009182170109406,
+ 0.1601681834844422,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.7931252324919997,
+ 0.1245733767458734,
+ 0.1250103587196822,
+ 0.9999999999999996,
+ 1.0
+ ],
+ [
+ 2.614494799996774,
+ 0.09182291734593892,
+ 0.11045572581941239,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.6369230894287905,
+ 0.0714329808951501,
+ 0.08092558050998915,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.48215408411365,
+ 0.06020704903188397,
+ 0.08078928169074573,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.5136595487361677,
+ 0.046297752281024715,
+ 0.05814595704434784,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.3808704179232545,
+ 0.043188864487475095,
+ 0.06338507438918883,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.421648374548298,
+ 0.03186855186589984,
+ 0.04346882830983233,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.305012468226299,
+ 0.03184025469110537,
+ 0.050191590471380367,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.3624675377399513,
+ 0.022639688586686486,
+ 0.032681174153388476,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.2563929237774247,
+ 0.02318060837796326,
+ 0.038359795004932674,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 2.339504462042428,
+ 0.012426925510003668,
+ 0.018357504927971353,
+ 1.0,
+ 1.0
+ ],
+ [
+ 2.2372736347323956,
+ 0.012971569610851892,
+ 0.021899318383703407,
+ 1.0,
+ 1.0
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 3.2453895407756033,
+ 4.568811630539931,
+ 4.992607042008341,
+ 0.8837421890049378,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.184341378194548,
+ 5.772598838326006,
+ 3.861732061666116,
+ 0.9499999980302511,
+ 1.9999999926055323
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 4.74331317860681,
+ 6.373350892573372,
+ 3.321463813667398,
+ 0.9499999999990103,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 5.251439250123568,
+ 7.1815909146829755,
+ 2.976989690313925,
+ 0.970668991336104,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 5.775596364510548,
+ 8.322572842511791,
+ 2.6857044644273027,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.180273398935198,
+ 8.820879839158186,
+ 2.4261095907723047,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.491511037162496,
+ 9.06704068984461,
+ 2.22858023092427,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.71331967073432,
+ 9.06635825007131,
+ 2.0739075734808554,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.8831071101065735,
+ 8.911543721320948,
+ 1.9417348124637834,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.00002602148141,
+ 8.62599817525596,
+ 1.8299032626587541,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 4.830059220664465,
+ 8.117610096000858,
+ 3.067097895564796,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.930439009660225,
+ 6.49397961862145,
+ 2.553400814083303,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.0771491742349495,
+ 8.247745467369501,
+ 1.7313692386022341,
+ 1.0,
+ 2.0
+ ],
+ [
+ 5.216980486483829,
+ 8.83584156847418,
+ 2.7687440423279126,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 5.277582611206732,
+ 6.912438971902591,
+ 2.346045233715656,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.127655585099226,
+ 7.809029985243797,
+ 1.6403584717837218,
+ 1.0,
+ 2.0
+ ],
+ [
+ 5.584769375405589,
+ 9.455105209470092,
+ 2.513403196844264,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.616697365538665,
+ 7.307170881281065,
+ 2.152692791640818,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.1502248414890754,
+ 7.320757715940062,
+ 1.555494401079166,
+ 1.0,
+ 2.0
+ ],
+ [
+ 5.91620183991025,
+ 9.958810815191228,
+ 2.304426934732347,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.913504580386388,
+ 7.64389942190513,
+ 1.9931632830185697,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.145472383265634,
+ 6.849583157144525,
+ 1.4740591093423108,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.189577287028243,
+ 10.39690459388902,
+ 2.140117498893383,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.154090064358766,
+ 7.860945792254162,
+ 1.865980363231427,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.116245602280883,
+ 6.405963984207556,
+ 1.3945391003199348,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 6.417800478189765,
+ 10.654281395192864,
+ 2.0035363028640614,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.353137923481955,
+ 7.9449179744073755,
+ 1.7545951341566584,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.06472456186639,
+ 5.981835211909237,
+ 1.3160796064297886,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.588695260587189,
+ 10.688084828799555,
+ 1.8936303461556905,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.497096440400128,
+ 7.8729433341324055,
+ 1.6593781856865717,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.99195218174636,
+ 5.569623513895808,
+ 1.2379642269042994,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 6.722100782445331,
+ 10.495980093992507,
+ 1.7934262314274312,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.595846830425262,
+ 7.645846882712795,
+ 1.5712044664127593,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.886872520073857,
+ 5.1552385237349485,
+ 1.161523057434277,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.818955479194181,
+ 10.08308191632202,
+ 1.699780464135645,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.656774948900738,
+ 7.2867150416013535,
+ 1.4851891362846816,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 6.7468239734392315,
+ 4.730561146032924,
+ 1.0855288833778252,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 6.870791873601835,
+ 9.55696593647395,
+ 1.6102783312879831,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.6798060064755145,
+ 6.85954361898175,
+ 1.399494445371139,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 6.572289920692041,
+ 4.288407909656837,
+ 1.0079205224064178,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.88923441832731,
+ 8.904915927182348,
+ 1.5207874460448159,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 6.667940396493356,
+ 6.404273935109115,
+ 1.3130734993250641,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 6.368885335202125,
+ 3.822442921405758,
+ 0.9258274717703996,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.8773523126772895,
+ 8.143994766431284,
+ 1.4305695774663694,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 6.6265852439456925,
+ 5.944332513881839,
+ 1.225861622682089,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.083968288782865,
+ 3.2834179877289955,
+ 0.8414001015747758,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.839159358793671,
+ 7.319284678398202,
+ 1.339003912747502,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 6.561367629624154,
+ 5.491041003322754,
+ 1.1383012051243733,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 5.745621745327446,
+ 2.686020818754793,
+ 0.7542153516159916,
+ 1.0,
+ 1.9999999999999982
+ ],
+ [
+ 6.769583328597248,
+ 6.5804894885035,
+ 1.2451687097364112,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.472477673857361,
+ 5.038014098249035,
+ 1.0499463317123354,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.327627156758133,
+ 2.048598950187423,
+ 0.6717374228889136,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 6.670009042181665,
+ 5.926258677148591,
+ 1.148157112759007,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.348303108926655,
+ 4.568822234082182,
+ 0.961352363309021,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 5.0059301828495855,
+ 1.5845135532430126,
+ 0.589730014554126,
+ 1.0,
+ 1.9999999999999996
+ ],
+ [
+ 6.540766765098611,
+ 5.3090707922643405,
+ 1.0473719268409725,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.17490423767873,
+ 4.063316473430668,
+ 0.8718325382478953,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.705828952618981,
+ 1.220866623735,
+ 0.51389174094292,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.370531940704497,
+ 4.6895289846770405,
+ 0.9425396906457949,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 5.954060486476285,
+ 3.506730903970588,
+ 0.7779812543786139,
+ 0.9999999999999992,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 4.42819721708228,
+ 0.9456356270080638,
+ 0.4482303943181935,
+ 0.9999999999999999,
+ 1.9999999999999996
+ ],
+ [
+ 6.131695848099736,
+ 4.02249396039895,
+ 0.8335355260569326,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.687016765221349,
+ 2.8822474058320973,
+ 0.6790697283159907,
+ 1.0,
+ 0.9999999999999996
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.855401575488286,
+ 3.3082505475138166,
+ 0.7164862451160091,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.384755843970738,
+ 2.1941656838992873,
+ 0.5771505766709717,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.5340385549546545,
+ 2.5180835757868394,
+ 0.5968381146117655,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.117275289965425,
+ 1.6195534222141508,
+ 0.4759728309954218,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.227343140333125,
+ 1.7890538811264847,
+ 0.48050261863348304,
+ 0.9999999999999951,
+ 0.9999999999999993
+ ],
+ [
+ 4.8576777598818,
+ 1.157801729629336,
+ 0.3810804581660779,
+ 1.0,
+ 0.9999999999999997
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.943696997798257,
+ 1.2259778060218363,
+ 0.3719910675823277,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.610544945148278,
+ 0.8031127686110361,
+ 0.29613482010365483,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.675567390490088,
+ 0.8059677415787107,
+ 0.2760998443815203,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.377189702205719,
+ 0.5406635824689228,
+ 0.22297870219760021,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.423446629716692,
+ 0.5025590224123059,
+ 0.19395824169146114,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 4.15779147984963,
+ 0.34787188002588804,
+ 0.1600415778688358,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.191777541572067,
+ 0.28873638805987056,
+ 0.12495715513548662,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ],
+ [
+ 3.9316829897302252,
+ 0.2125978117597249,
+ 0.11004301245265587,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.9628635376774244,
+ 0.1652088252159921,
+ 0.08062313640450727,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.745998560866002,
+ 0.1385519221275654,
+ 0.07952063651283751,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.788135875047817,
+ 0.10641523920377706,
+ 0.057314299838880055,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.6001353325750505,
+ 0.09860813326457667,
+ 0.06171828375391473,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.6571581710829566,
+ 0.07266362954265292,
+ 0.042361805254762686,
+ 1.0,
+ 1.0
+ ],
+ [
+ 3.4885381175779155,
+ 0.07223698388484721,
+ 0.04851492965473943,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.5698873846578003,
+ 0.05135136554600286,
+ 0.031666953216462776,
+ 0.9999999999999993,
+ 1.0
+ ],
+ [
+ 3.4169646439409553,
+ 0.05235400364710729,
+ 0.03688927320344233,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 3.5360510063377713,
+ 0.028055974596064508,
+ 0.017701771959364534,
+ 0.9999999999999997,
+ 1.0
+ ],
+ [
+ 3.3888588445223093,
+ 0.029146569852248443,
+ 0.020946652139857184,
+ 1.0,
+ 1.0
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 4.598459809452464,
+ 9.032718534094201,
+ 4.6498874870209095,
+ 0.9499999922623475,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 5.550993324010758,
+ 11.240203618109279,
+ 3.5926431107383414,
+ 0.9499999999995109,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.331777402682402,
+ 13.333791820459076,
+ 2.9796037046038406,
+ 0.9499999994399685,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.851493984324127,
+ 14.674924488680075,
+ 2.648945806445483,
+ 0.950000003530105,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.208072195586035,
+ 15.760721140983707,
+ 2.4533568707885545,
+ 0.9635247157005559,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.455100619793586,
+ 16.66394977617604,
+ 2.3261306458116273,
+ 0.9885716598803254,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.617246530536548,
+ 16.702610085260055,
+ 2.2122046157382713,
+ 0.9999999999999997,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.747573453665,
+ 16.17034688382299,
+ 2.0951450346084344,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.8538051212056175,
+ 15.525416418122825,
+ 1.9906665456631407,
+ 1.0,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.916131493982732,
+ 14.724601736879913,
+ 1.9034903012759212,
+ 1.0,
+ 1.9999999999999978
+ ],
+ [
+ 6.242188902732396,
+ 16.48912265841874,
+ 2.6995545609456078,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.440840195820074,
+ 13.12843926218554,
+ 2.3315902472082346,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.955754741346815,
+ 13.846471930778135,
+ 1.8240598306166502,
+ 1.0,
+ 2.0
+ ],
+ [
+ 6.664669273799372,
+ 17.866626094137008,
+ 2.4433003039173204,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.819893860093998,
+ 14.196653224666273,
+ 2.146545061981518,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.980513665657855,
+ 12.920862979891947,
+ 1.7483711810455331,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.012661089332891,
+ 19.005911418151697,
+ 2.2578331026345135,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.116845923125848,
+ 15.026133200832986,
+ 2.0134146397772645,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.9915585055078235,
+ 11.9514481408027,
+ 1.6744867625596749,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.2950318007144235,
+ 19.86778056396609,
+ 2.117745189066679,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 7.36546976167439,
+ 15.598315578060241,
+ 1.901933773864835,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.98967250787165,
+ 10.941579013469859,
+ 1.6006909524116686,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.490435972435064,
+ 19.999999997157484,
+ 2.0193538619594738,
+ 0.9899831648406261,
+ 1.0
+ ],
+ [
+ 7.519354838489206,
+ 15.821385593215355,
+ 1.8273474432185643,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.975268531594285,
+ 9.915870683236054,
+ 1.5249100950491803,
+ 0.9999999999999998,
+ 1.9999999999999998
+ ],
+ [
+ 7.642258841336182,
+ 19.999999993101078,
+ 1.9334521292510445,
+ 0.9865939931664681,
+ 0.9999999999999999
+ ],
+ [
+ 7.64262140920978,
+ 15.716976151235007,
+ 1.7536980077275781,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.946475825232977,
+ 9.056007976145784,
+ 1.4428443236539352,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.768190538458521,
+ 19.99999999447895,
+ 1.8505836531166155,
+ 0.9925002521403392,
+ 1.0
+ ],
+ [
+ 7.7374191823760805,
+ 15.295294181942888,
+ 1.6798416007852213,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.9070280672760545,
+ 8.174890397894533,
+ 1.3572506241377948,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.871342160192761,
+ 19.73165286104783,
+ 1.7682719128573225,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.806400757021988,
+ 14.599076804390126,
+ 1.6054619683298048,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.846619861641327,
+ 7.268015405428437,
+ 1.2684574438130363,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.926858293468076,
+ 18.81157308780508,
+ 1.6934424832924677,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.850782653242372,
+ 13.680639727403452,
+ 1.5308065235133723,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.752675254851515,
+ 6.478458525406341,
+ 1.1741225369613355,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.964478458859832,
+ 17.66116098688294,
+ 1.617936712460072,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.873288942505033,
+ 12.602828618995005,
+ 1.4557261938670214,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.6424839103185,
+ 5.803174602427604,
+ 1.0729119058389023,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.9877237885741055,
+ 16.3598024493649,
+ 1.5421637541588022,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.876874771310716,
+ 11.422254759811066,
+ 1.3797614034210919,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.5142017401702175,
+ 5.18939781486027,
+ 0.9687323514365203,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.996403201942367,
+ 14.936607699349585,
+ 1.4655152775231797,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.860735755105839,
+ 10.150569428206618,
+ 1.3013846753199512,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.368360454982294,
+ 4.613535606455118,
+ 0.8647751539712955,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.988115692648764,
+ 13.386081550921519,
+ 1.3860618236707523,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.819831685333454,
+ 9.027106357305072,
+ 1.2141595410610253,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.119037385097718,
+ 4.002266331444459,
+ 0.7684481783550475,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.960506594448528,
+ 11.709272121666602,
+ 1.3012853882609907,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.754461395982694,
+ 7.873152883934755,
+ 1.1213927284066052,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.843213090293676,
+ 3.4065594734592253,
+ 0.6771807914412092,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.911289466185528,
+ 9.932407523417414,
+ 1.2078234023313994,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 7.6624281166305925,
+ 6.766891305870021,
+ 1.0210436153834377,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 6.501385312999165,
+ 2.7854873282587316,
+ 0.5941909863818233,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.820457340200451,
+ 8.396528615721582,
+ 1.0997250868886792,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.545655505869083,
+ 5.88833781508829,
+ 0.9120581671029963,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.1145267458043575,
+ 2.164408485068033,
+ 0.520859814126603,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 7.687761076116998,
+ 6.884196321098701,
+ 0.9831413845710979,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.40565128706216,
+ 5.1159667319058695,
+ 0.7990594141533965,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 5.7139588544791025,
+ 1.6742643847727006,
+ 0.46162622584390084,
+ 0.9999999999999998,
+ 2.0
+ ],
+ [
+ 7.535011726800003,
+ 5.772769390015995,
+ 0.8540931881593915,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 7.203381468126223,
+ 4.362088258987788,
+ 0.6876074806219103,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.36277100941307,
+ 4.854260725525023,
+ 0.7225819616056045,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.961890417931838,
+ 3.618263666687316,
+ 0.5793034182731779,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.101005055365423,
+ 3.966436439290126,
+ 0.5981299292097078,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 6.681926400680479,
+ 2.8548171051521534,
+ 0.477097555794843,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.8193061736597045,
+ 3.102204308680779,
+ 0.4801937669868538,
+ 0.999999999999998,
+ 0.9999999999999993
+ ],
+ [
+ 6.379830747183564,
+ 2.0765582091699617,
+ 0.3824567056557178,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.492250830972742,
+ 2.195768144613961,
+ 0.37252726065625213,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 6.042987879307193,
+ 1.4369101871758605,
+ 0.2987712583627539,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.141178148725831,
+ 1.4443098074245386,
+ 0.2775783504347556,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.712140287146052,
+ 0.9633006741562341,
+ 0.22664507814193796,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.792824629189049,
+ 0.8954292296926757,
+ 0.19561801646538077,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.384864113517296,
+ 0.6149291473311884,
+ 0.16429887804908397,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.443006562558614,
+ 0.5101888567918775,
+ 0.12751933065817703,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 5.114920593772254,
+ 0.38315170138697796,
+ 0.11429162253381611,
+ 0.9999999999998636,
+ 0.999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.165303787164178,
+ 0.30147353605249166,
+ 0.08444687873252554,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.893886132230701,
+ 0.2554872181777334,
+ 0.08388031296908799,
+ 0.9999999999999994,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.954907874646799,
+ 0.19792052205130498,
+ 0.06081063485763569,
+ 1.0,
+ 1.0
+ ],
+ [
+ 4.724067559343654,
+ 0.18325205996396143,
+ 0.0650708626710695,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.796639443438756,
+ 0.13625723511674362,
+ 0.045093276893750193,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 4.593624280944988,
+ 0.13440228421632114,
+ 0.05087264590281906,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.695641839596496,
+ 0.09639386546295904,
+ 0.03355603617585465,
+ 0.9999999999999993,
+ 1.0
+ ],
+ [
+ 4.509671830493148,
+ 0.09729422327546754,
+ 0.03846773036070745,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 4.655535406526705,
+ 0.05288145030974946,
+ 0.01880038473043171,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 4.476582340578628,
+ 0.054287091476134225,
+ 0.021854245124993815,
+ 0.9999999999999996,
+ 0.9999999999999999
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 5.820248053506667,
+ 16.65915513881285,
+ 3.987729875789485,
+ 0.9499999962842787,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 6.686274868860291,
+ 19.724727122620177,
+ 3.2525569839550204,
+ 0.9499999961165251,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.225313262177895,
+ 20.685617187496703,
+ 2.839519613790355,
+ 0.9146820959121221,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.559282525531416,
+ 22.351327445770014,
+ 2.6283091316527614,
+ 0.9195712208509766,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.809078974298776,
+ 23.47572386126509,
+ 2.474572122106363,
+ 0.9320416845233772,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.986901605242196,
+ 24.040718550951084,
+ 2.357047338250705,
+ 0.9499999941128762,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.124549855253022,
+ 22.96895157363403,
+ 2.2344057944210656,
+ 0.9499999984057803,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.24269101459831,
+ 21.687438976704883,
+ 2.1268396767402806,
+ 0.9500000000579097,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.343180389876581,
+ 20.842916999199662,
+ 2.0408854543139943,
+ 0.9597528387687294,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.431372038721507,
+ 20.566558592348567,
+ 1.9709978419004641,
+ 0.981976926102388,
+ 2.0
+ ],
+ [
+ 7.070356153817363,
+ 21.15728495389402,
+ 2.525840259245736,
+ 0.9499999942479114,
+ 0.9504933926960675
+ ],
+ [
+ 7.371318575554706,
+ 19.999999994488608,
+ 2.252019686018115,
+ 0.9626938149246614,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.50770266530299,
+ 19.946273537309548,
+ 1.9038239554598393,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 7.412613374789325,
+ 21.5,
+ 2.3194246062630874,
+ 0.9499999888408979,
+ 0.9296247703636182
+ ],
+ [
+ 7.622798032294935,
+ 20.905892377637436,
+ 2.138462747623066,
+ 0.9500000002945722,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.55398128988991,
+ 18.769745108780803,
+ 1.8213508837393921,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.6436761932696,
+ 21.5,
+ 2.2018629970688437,
+ 0.9377359382963684,
+ 0.9207832911257422
+ ],
+ [
+ 7.841815526294872,
+ 21.5,
+ 2.037969165526416,
+ 0.9407251916150848,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.580179074545779,
+ 17.511442329661048,
+ 1.7450749036505735,
+ 1.0,
+ 2.0
+ ],
+ [
+ 7.849612669651752,
+ 21.499999999908272,
+ 2.1218415829918866,
+ 0.8999999996951656,
+ 0.9372548060213929
+ ],
+ [
+ 7.992859914800187,
+ 21.5,
+ 1.9650769290471872,
+ 0.9320748237293462,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.585022500663767,
+ 16.171824268953383,
+ 1.6732770372685426,
+ 0.9999999999999998,
+ 1.999999999999999
+ ],
+ [
+ 7.991566310294536,
+ 21.5,
+ 2.056509851803589,
+ 0.8787927014261414,
+ 0.951330858972196
+ ],
+ [
+ 8.120420269935432,
+ 21.5,
+ 1.8891991053439072,
+ 0.934033531134128,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 8.56787757962189,
+ 14.752118933240542,
+ 1.6036684180528125,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.116693857245377,
+ 21.5,
+ 2.0034571317942045,
+ 0.8500000003100547,
+ 0.9782799232074019
+ ],
+ [
+ 8.235750208739814,
+ 21.5,
+ 1.8081065456636436,
+ 0.9448582011196026,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.531925528383427,
+ 13.248470549014332,
+ 1.5317533363610232,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.234524456567124,
+ 21.5,
+ 1.9245068924099673,
+ 0.8475322196321247,
+ 0.9907332128882684
+ ],
+ [
+ 8.334271267394362,
+ 21.5,
+ 1.7276649703545541,
+ 0.9628286114701541,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.478051707718203,
+ 11.65492887771574,
+ 1.4534086502360295,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.346385049925173,
+ 21.5,
+ 1.8383906455502343,
+ 0.8544207797645209,
+ 1.0
+ ],
+ [
+ 8.420034919274364,
+ 21.5,
+ 1.648465333205533,
+ 0.986680860215519,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 8.402451122504887,
+ 9.983534908735573,
+ 1.3663642406836825,
+ 0.9999999999999999,
+ 1.9999999999999991
+ ],
+ [
+ 8.456788128021188,
+ 21.5,
+ 1.7393468110298096,
+ 0.8774664878590474,
+ 1.0
+ ],
+ [
+ 8.50081180607586,
+ 20.59581691986878,
+ 1.573762489872907,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.313293848624397,
+ 8.641784839758497,
+ 1.2624319387994936,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.56440772490092,
+ 21.5,
+ 1.640378156070549,
+ 0.9053288568084372,
+ 1.0
+ ],
+ [
+ 8.554704284790914,
+ 19.049950827280707,
+ 1.4985982454858973,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.208682647397557,
+ 7.337454135408343,
+ 1.1533857282450601,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.659981394342486,
+ 21.5,
+ 1.5443194283517794,
+ 0.939278202299852,
+ 1.0
+ ],
+ [
+ 8.581753866077916,
+ 17.505721399218483,
+ 1.4214925731710646,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.092957587588572,
+ 6.337933120779636,
+ 1.0392051424637891,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.72666820984837,
+ 21.5,
+ 1.4583012080973727,
+ 0.9792048336144029,
+ 1.0
+ ],
+ [
+ 8.581323117595174,
+ 15.768799144298454,
+ 1.345370765605839,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.9721462014435724,
+ 5.575496380709149,
+ 0.9255260624533366,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.763664721191848,
+ 19.926183487108688,
+ 1.386476785786019,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.547558907688382,
+ 13.830017448965151,
+ 1.2675151582904802,
+ 0.9999999999999999,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 7.833651258558829,
+ 4.917942299392629,
+ 0.8169979470144668,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 8.737086689586466,
+ 17.57682037046972,
+ 1.304902210118909,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 8.480647663656791,
+ 11.730645574734428,
+ 1.1838557765537263,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.641856012437249,
+ 4.2979480979439275,
+ 0.7175041931953313,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.673040295412425,
+ 14.99517349772537,
+ 1.221483135762178,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 8.387291792964417,
+ 9.638819401920848,
+ 1.088022459696365,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.447611103547025,
+ 3.72337639644744,
+ 0.6243274360880346,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 8.577117395882743,
+ 12.277388028923617,
+ 1.12954973281031,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 8.28044841709303,
+ 7.9126922157178825,
+ 0.9742312049674134,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.193340241175403,
+ 3.1534233254632977,
+ 0.5434507518362548,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.451229851911538,
+ 9.63296474904179,
+ 1.0227122209509907,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 8.158916881417921,
+ 6.461182765945753,
+ 0.8521677423131379,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 6.8901515785129614,
+ 2.602224691717025,
+ 0.47809063309944383,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.309700987140642,
+ 7.559978346763979,
+ 0.8956627563227191,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.027860076679366,
+ 5.442365880335378,
+ 0.727004256421157,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.1588124379381,
+ 6.0380775749651505,
+ 0.7590415295297758,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 7.8918820391559175,
+ 4.591698995865134,
+ 0.6061396139247737,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.000261895303305,
+ 4.957375391044813,
+ 0.6228976580513689,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.696870480444865,
+ 3.781731777164838,
+ 0.4955848525449249,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.822731290930746,
+ 4.019713180474601,
+ 0.4960194052150303,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 7.492071918099923,
+ 2.9941284293210404,
+ 0.39493756530911495,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.5931682835362135,
+ 3.104951196085237,
+ 0.3829040449951795,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.253371779677422,
+ 2.186535396551453,
+ 0.30671444383960833,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.360364116932437,
+ 2.1800332766714434,
+ 0.2834110345957272,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.962583875494997,
+ 1.5026758481228173,
+ 0.23127733695515687,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.044761175157945,
+ 1.3820722586274783,
+ 0.19844674116868533,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.653912542827862,
+ 0.976238870469256,
+ 0.16606531349301254,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.719405717128579,
+ 0.8087069361719613,
+ 0.12894184512037074,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.353139921617371,
+ 0.6136284270014153,
+ 0.11547075049044532,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.417178409883476,
+ 0.48444739794182945,
+ 0.08555035313010449,
+ 1.0,
+ 0.9999999999999994
+ ],
+ [
+ 6.076591612054713,
+ 0.41134235115750406,
+ 0.08538073005944681,
+ 0.9999999999998141,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.158070400933519,
+ 0.3194014348022322,
+ 0.061900848192389724,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.858574362855954,
+ 0.2964252011326983,
+ 0.06678940052619942,
+ 1.0,
+ 0.9999999999999971
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.957514952777985,
+ 0.2207846983636144,
+ 0.046195762123974034,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.6843626616679686,
+ 0.21883007055556644,
+ 0.0528433936293298,
+ 0.9999999999999996,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.8265624466322095,
+ 0.15686151888517855,
+ 0.03461215636882748,
+ 0.9999999999999997,
+ 1.0
+ ],
+ [
+ 5.569505140613952,
+ 0.15941478645419702,
+ 0.0403960337100428,
+ 0.9999999999999806,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 5.774623143887336,
+ 0.08642723584654718,
+ 0.01949558675850307,
+ 1.0,
+ 1.0
+ ],
+ [
+ 5.524220507604432,
+ 0.08957384134057632,
+ 0.02315342451524087,
+ 1.0,
+ 1.0
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 6.554288036418403,
+ 20.35039121228838,
+ 3.586161124840838,
+ 0.8309635567168456,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.217831297732644,
+ 22.687677870574564,
+ 3.0436679121687193,
+ 0.8044684689391085,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.606300742689865,
+ 24.476020331572293,
+ 2.794354862185497,
+ 0.7999999968279282,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.898868887689079,
+ 25.7617974373622,
+ 2.618117527890263,
+ 0.8059293699847517,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.092610869492132,
+ 27.06554142279523,
+ 2.511248349037808,
+ 0.829044728350759,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.27210151094806,
+ 27.71373780616097,
+ 2.3962920823176845,
+ 0.8509155726726931,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.442046365439673,
+ 28.5748209688937,
+ 2.2964600582315255,
+ 0.8813783852145407,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.611043244898164,
+ 28.682955875574372,
+ 2.181846139747887,
+ 0.9031271759951975,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.765438956470435,
+ 29.04258239821698,
+ 2.0866824499464456,
+ 0.9323428480567585,
+ 1.9999999999999998
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.904278954011547,
+ 28.4693091125253,
+ 1.980237130747463,
+ 0.9499999922533832,
+ 2.0
+ ],
+ [
+ 7.520210558923209,
+ 21.5,
+ 2.4733487789062476,
+ 0.9162023719398509,
+ 0.85
+ ],
+ [
+ 7.752428856893213,
+ 21.5,
+ 2.2542458499303795,
+ 0.9344051585649065,
+ 0.9105600069346094
+ ]
+ ],
+ [
+ [
+ 9.026719312714498,
+ 26.70581596961876,
+ 1.864271002177972,
+ 0.9499999979922084,
+ 2.0
+ ],
+ [
+ 7.7840919918020015,
+ 21.5,
+ 2.350573873210162,
+ 0.887210304933625,
+ 0.85
+ ],
+ [
+ 7.9695390895474025,
+ 21.5,
+ 2.1738879684336467,
+ 0.8999999812994355,
+ 0.918116657370525
+ ]
+ ],
+ [
+ [
+ 9.125649509036435,
+ 24.787315070701816,
+ 1.7675302183567267,
+ 0.9499999999935645,
+ 2.0
+ ],
+ [
+ 7.982438142069811,
+ 21.5,
+ 2.2498715740311908,
+ 0.8724038577908025,
+ 0.85
+ ],
+ [
+ 8.137845731001615,
+ 21.5,
+ 2.130363875897394,
+ 0.8515372523925051,
+ 0.9454721054573105
+ ]
+ ],
+ [
+ [
+ 9.199794516867671,
+ 22.686712239155902,
+ 1.6876520572273144,
+ 0.950000000882471,
+ 2.0
+ ],
+ [
+ 8.141169213960996,
+ 21.5,
+ 2.154837108179865,
+ 0.8694508599311966,
+ 0.85
+ ],
+ [
+ 8.2941263598744,
+ 21.5,
+ 2.0538714820012562,
+ 0.836096435458975,
+ 0.957091400102219
+ ]
+ ],
+ [
+ [
+ 9.245425104698624,
+ 21.679016566574006,
+ 1.6346338147814463,
+ 0.9729672382525816,
+ 2.0
+ ],
+ [
+ 8.290845427597315,
+ 21.5,
+ 2.079202428694728,
+ 0.8500000117524334,
+ 0.8664553003820198
+ ],
+ [
+ 8.44467449517057,
+ 21.5,
+ 1.9862042443699075,
+ 0.8126066147281817,
+ 0.981221488764216
+ ]
+ ],
+ [
+ [
+ 9.2712702514169,
+ 20.549111231523874,
+ 1.5878678545706824,
+ 0.9985161781954116,
+ 2.0
+ ],
+ [
+ 8.438118266416442,
+ 21.5,
+ 1.9882680082662363,
+ 0.8458162860212043,
+ 0.8768349260376636
+ ],
+ [
+ 8.598421546564353,
+ 21.5,
+ 1.9029412346431396,
+ 0.8018638268677529,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.25261455264299,
+ 18.49662998522678,
+ 1.5192216640814429,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.59399684738807,
+ 21.5,
+ 1.9101686397137712,
+ 0.826546386428493,
+ 0.9004332346762354
+ ],
+ [
+ 8.746994806255476,
+ 21.5,
+ 1.7952740668285523,
+ 0.8185402504906283,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.194814704641065,
+ 16.3799945812368,
+ 1.4456117042376315,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.748664763553915,
+ 21.5,
+ 1.8335981577429297,
+ 0.8080964312086198,
+ 0.9268966114686545
+ ],
+ [
+ 8.891162137663743,
+ 21.5,
+ 1.689615591258187,
+ 0.8393821711481639,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.097964415973323,
+ 14.129977829387695,
+ 1.370422788734715,
+ 1.0,
+ 2.0
+ ],
+ [
+ 8.899922531225782,
+ 21.5,
+ 1.7491999175907098,
+ 0.8000000015255295,
+ 0.9495067557094665
+ ],
+ [
+ 9.033539561988256,
+ 21.5,
+ 1.5847058793716384,
+ 0.8649793123003399,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.964536217326156,
+ 11.851254304331492,
+ 1.291094654817187,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.051218998605705,
+ 21.5,
+ 1.6579408849545898,
+ 0.7999999734677614,
+ 0.9698778217416079
+ ],
+ [
+ 9.166714735858578,
+ 21.5,
+ 1.4822898434560858,
+ 0.8966986809620778,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.813243853688501,
+ 9.743649740004148,
+ 1.2026298520142258,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.194172930368932,
+ 21.5,
+ 1.5767729409377318,
+ 0.7936579093404005,
+ 1.0
+ ],
+ [
+ 9.284294560050999,
+ 21.499999999999996,
+ 1.3835525532817512,
+ 0.9359656955054018,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 8.646388893747494,
+ 8.139455189292066,
+ 1.1018056941695384,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.32217969609924,
+ 21.5,
+ 1.4604989048545058,
+ 0.8330442168303317,
+ 1.0
+ ],
+ [
+ 9.366591774066244,
+ 21.5,
+ 1.295135099772087,
+ 0.9830813036031162,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.471771277050417,
+ 6.77782843115881,
+ 0.9972495884771134,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.434178343840355,
+ 21.5,
+ 1.3475554524507205,
+ 0.8819812169935792,
+ 1.0
+ ],
+ [
+ 9.388738215702693,
+ 19.39805762747391,
+ 1.2248017567093326,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.304982809411747,
+ 5.851914983169157,
+ 0.8885277256740376,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.532441715576729,
+ 21.5,
+ 1.2377762739379932,
+ 0.9418044813199635,
+ 1.0
+ ],
+ [
+ 9.331680276411463,
+ 16.733163013192218,
+ 1.149297888158656,
+ 1.0,
+ 0.9999999999999997
+ ]
+ ],
+ [
+ [
+ 8.146948203397017,
+ 5.125390423941781,
+ 0.7828501563567573,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.576800052555493,
+ 20.871204164399,
+ 1.1491885186336153,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 9.234657997954464,
+ 13.917871000227658,
+ 1.07118239112099,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.992897868439912,
+ 4.507352721613851,
+ 0.6849568044441258,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.504774437799636,
+ 17.309174918154497,
+ 1.073153421552374,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 9.101441775424986,
+ 11.085045705502953,
+ 0.9852866230547521,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 7.828932843529443,
+ 3.9589722777514713,
+ 0.5989325862484097,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 9.374053799548028,
+ 13.908779538067078,
+ 0.9909985368148887,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 8.932663450891209,
+ 8.68245522086873,
+ 0.8833468427534397,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 7.620144489358209,
+ 3.461135475257809,
+ 0.5304227776550946,
+ 0.9999999999999999,
+ 1.9999999999999998
+ ],
+ [
+ 9.200510541655031,
+ 10.565581530886384,
+ 0.8986251057466839,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 8.75059243325252,
+ 6.772577264346603,
+ 0.768392900571226,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.985410917175132,
+ 7.9262574660868195,
+ 0.7837048262353451,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.55350803992134,
+ 5.523925510308875,
+ 0.6478491546963218,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.755396422465855,
+ 6.049286228858269,
+ 0.6554692931871475,
+ 0.9999999999999997,
+ 1.0
+ ],
+ [
+ 8.355904230571698,
+ 4.5554944917017846,
+ 0.5323516857476747,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.519715110707914,
+ 4.826299510147209,
+ 0.5271999797918474,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.173343519310537,
+ 3.706362133004768,
+ 0.42576846984322414,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.296334946582556,
+ 3.8086128068060425,
+ 0.4084820809160228,
+ 0.9999999999999994,
+ 1.0
+ ],
+ [
+ 7.995983338466176,
+ 2.888898179447926,
+ 0.3305133001358231,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.09023978152124,
+ 2.832986180061659,
+ 0.3015316654883905,
+ 0.9999999999999815,
+ 0.9999999999999987
+ ],
+ [
+ 7.805499853241252,
+ 2.056785677591609,
+ 0.24684813092380717,
+ 1.0,
+ 0.9999999999999996
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.8932948265258,
+ 1.8567079370376551,
+ 0.20817616553335458,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.578644227037471,
+ 1.370329413064542,
+ 0.17589750607689314,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.646477404215313,
+ 1.1384162255594,
+ 0.1372887038708249,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.363416631394833,
+ 0.8969317732849927,
+ 0.12283995607832804,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.425210985574069,
+ 0.7200047654379097,
+ 0.09289357820797717,
+ 0.9999999999999962,
+ 0.9999999999999993
+ ],
+ [
+ 7.116206931278776,
+ 0.6165600822436882,
+ 0.09120489983744372,
+ 0.9999999999995396,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.206478177940137,
+ 0.4837767988230513,
+ 0.06690955418398921,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.911348144234608,
+ 0.44653009125087967,
+ 0.07064404704176772,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.018556555720553,
+ 0.33604966824655835,
+ 0.049495703394497576,
+ 0.9999999999999228,
+ 0.9999999999999999
+ ],
+ [
+ 6.741247422220165,
+ 0.3291666115324198,
+ 0.05522282576803478,
+ 0.9999999999999579,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.890172887476024,
+ 0.23868747943347518,
+ 0.036790295689239874,
+ 1.0,
+ 1.0
+ ],
+ [
+ 6.6256663454063345,
+ 0.2390721453791581,
+ 0.041826160839950895,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 6.839480707731639,
+ 0.13188153861687282,
+ 0.020714111196996243,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 6.579904412593043,
+ 0.13442178065926005,
+ 0.02393020879583378,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 6.958033530392773,
+ 23.400207572579838,
+ 3.430024835931001,
+ 0.7230420462236976,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.501292549346552,
+ 24.967879469015955,
+ 3.0189370286793853,
+ 0.6978389416797925,
+ 1.9999999999999996
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.859752596980577,
+ 26.58931812645843,
+ 2.799610884098178,
+ 0.6972104843298494,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.091247858667149,
+ 28.041236340180888,
+ 2.67485537607992,
+ 0.7126138610358949,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.30646771645982,
+ 29.3937731897301,
+ 2.560459995882902,
+ 0.7360955321662217,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.518948061324402,
+ 29.999999978025116,
+ 2.4265785392844905,
+ 0.7560394771459775,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.72458872365163,
+ 29.999999903908876,
+ 2.284303387811768,
+ 0.7714593973004671,
+ 1.999999997641169
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.916180865104465,
+ 29.999999991387035,
+ 2.1587734510370797,
+ 0.7895735271937824,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.104239102707758,
+ 29.999999979130166,
+ 2.0426095483539295,
+ 0.8098800884094992,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.276615285147543,
+ 29.99999999480504,
+ 1.9396421066898042,
+ 0.8335946408448314,
+ 2.0
+ ],
+ [
+ 7.74945652404602,
+ 21.5,
+ 2.6858476038987966,
+ 0.77017914254703,
+ 0.85
+ ],
+ [
+ 8.001280751150746,
+ 21.5,
+ 2.3245366703633867,
+ 0.8773516893416141,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 9.436019249028337,
+ 29.99999999496225,
+ 1.846601624302887,
+ 0.8610616997026874,
+ 2.0
+ ],
+ [
+ 7.9889829798786565,
+ 21.5,
+ 2.5557705443849925,
+ 0.7521433646167945,
+ 0.85
+ ],
+ [
+ 8.19496675504887,
+ 21.5,
+ 2.233730108927247,
+ 0.8604473565635357,
+ 0.8511553879902386
+ ]
+ ],
+ [
+ [
+ 9.586009690185504,
+ 29.999999993235473,
+ 1.760552589109203,
+ 0.8925731664294791,
+ 1.9999999999999996
+ ],
+ [
+ 8.178689899221236,
+ 21.5,
+ 2.4394229870482245,
+ 0.7453827519658913,
+ 0.85
+ ],
+ [
+ 8.374780982134832,
+ 21.5,
+ 2.1448059863725724,
+ 0.8445036450498853,
+ 0.8592066577787023
+ ]
+ ],
+ [
+ [
+ 9.718268492632756,
+ 29.999999991355562,
+ 1.6833021644765485,
+ 0.92927726824851,
+ 2.0
+ ],
+ [
+ 8.35961009215061,
+ 21.5,
+ 2.3171696981470618,
+ 0.7461660797902687,
+ 0.85
+ ],
+ [
+ 8.558765556328927,
+ 21.5,
+ 2.0603540804159723,
+ 0.8209342479604146,
+ 0.8780531937030203
+ ]
+ ],
+ [
+ [
+ 9.82431257502718,
+ 28.772585320050187,
+ 1.5935826249532619,
+ 0.9499999950760603,
+ 1.9999999999999998
+ ],
+ [
+ 8.549012300989096,
+ 21.5,
+ 2.1867354688552245,
+ 0.7517857720073307,
+ 0.85
+ ],
+ [
+ 8.73912653006328,
+ 21.5,
+ 1.9716207567109585,
+ 0.8039828173164261,
+ 0.8968368601699456
+ ]
+ ],
+ [
+ [
+ 9.901034288723586,
+ 26.081372987927722,
+ 1.4982358729872365,
+ 0.9499999996661823,
+ 2.0
+ ],
+ [
+ 8.741596267025733,
+ 21.5,
+ 2.056088575963254,
+ 0.7609405728052521,
+ 0.85
+ ],
+ [
+ 8.918032429955472,
+ 21.5,
+ 1.872583117834961,
+ 0.7999999984833467,
+ 0.9092762612774274
+ ]
+ ],
+ [
+ [
+ 9.946140445055573,
+ 22.999802162653282,
+ 1.4205178737262314,
+ 0.9499999999256844,
+ 2.0
+ ],
+ [
+ 8.932876273592731,
+ 21.5,
+ 1.9276892322456936,
+ 0.7740036375581169,
+ 0.85
+ ],
+ [
+ 9.1055574250648,
+ 21.5,
+ 1.7706795667305875,
+ 0.7989110435645668,
+ 0.9219860935152849
+ ]
+ ],
+ [
+ [
+ 9.951745455677202,
+ 21.73377987191103,
+ 1.3756425088750737,
+ 0.9886406753698835,
+ 2.0
+ ],
+ [
+ 9.128757772303215,
+ 21.5,
+ 1.7985646014879464,
+ 0.7915928676238999,
+ 0.85
+ ],
+ [
+ 9.290126703424798,
+ 21.5,
+ 1.6856852335669938,
+ 0.7851580155688646,
+ 0.9475202058477973
+ ]
+ ],
+ [
+ [
+ 9.895206022807008,
+ 18.950111810009727,
+ 1.3194219348497298,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.315103445162954,
+ 21.499999999992326,
+ 1.6878196301696877,
+ 0.7999999949350575,
+ 0.8601264362432296
+ ],
+ [
+ 9.470220074532412,
+ 21.5,
+ 1.6011775503312708,
+ 0.7748242887012166,
+ 0.974654001576286
+ ]
+ ],
+ [
+ [
+ 9.749950701958854,
+ 16.15456113961154,
+ 1.2529552621379754,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.492603750772517,
+ 21.5,
+ 1.591277111952491,
+ 0.7999999886735638,
+ 0.8802335179450475
+ ],
+ [
+ 9.645326174093775,
+ 21.5,
+ 1.5123979896262851,
+ 0.7726291140387542,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.565913283843642,
+ 13.45821905740324,
+ 1.1877669644805173,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.664498111848985,
+ 21.5,
+ 1.4985980026581258,
+ 0.7999999785646814,
+ 0.9049947231996767
+ ],
+ [
+ 9.806352972087918,
+ 21.5,
+ 1.396153480253341,
+ 0.8091883962411696,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.356460737303582,
+ 10.93500978146195,
+ 1.1175956855487712,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.831167122055383,
+ 21.5,
+ 1.4095969293376216,
+ 0.7997655141495005,
+ 0.9349615832643619
+ ],
+ [
+ 9.955441121637941,
+ 21.5,
+ 1.2832044695779636,
+ 0.8545651956163675,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.130056484737034,
+ 8.907650374199443,
+ 1.0346070101557387,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.99924649150872,
+ 21.5,
+ 1.3246080408973526,
+ 0.796441432293459,
+ 0.9725347027770742
+ ],
+ [
+ 10.097058014435609,
+ 21.5,
+ 1.1728522079283976,
+ 0.9100521392826737,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.897616963282456,
+ 7.279043603830103,
+ 0.9438787714417659,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.169219960104316,
+ 21.5,
+ 1.2242266146655234,
+ 0.8147796207949463,
+ 1.0
+ ],
+ [
+ 10.21026065892081,
+ 21.5,
+ 1.0720852126802558,
+ 0.9760278156294215,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 8.677293080251534,
+ 6.172719990415399,
+ 0.8489891280670367,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 10.322984780719533,
+ 21.5,
+ 1.0999076199245799,
+ 0.8816323449563681,
+ 1.0
+ ],
+ [
+ 10.210855548178895,
+ 18.914513506908392,
+ 1.0011238681295465,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.464046441533354,
+ 5.395101898110183,
+ 0.7601555693615974,
+ 1.0,
+ 1.9999999999999984
+ ],
+ [
+ 10.448792521684984,
+ 21.5,
+ 0.9870555035196332,
+ 0.9615912686208712,
+ 1.0
+ ],
+ [
+ 10.089606277313747,
+ 15.564814348585902,
+ 0.9318490982160306,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.278431681453233,
+ 4.793317986941664,
+ 0.6805652369824184,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.441126732728463,
+ 18.97388983281578,
+ 0.9124489018702714,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 9.913449348652295,
+ 12.215620103861296,
+ 0.8589364319380445,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.115313442231528,
+ 4.30035079284276,
+ 0.6118354304787321,
+ 0.9999999999999991,
+ 1.999999999999999
+ ],
+ [
+ 10.274068856349746,
+ 15.023592200205206,
+ 0.8416524597506029,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 9.690410545172075,
+ 9.203025484217367,
+ 0.7718532068182248,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.03659188619408,
+ 11.106984159830706,
+ 0.7631209468624989,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 9.429190626616482,
+ 6.932275013644084,
+ 0.6693147071419323,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.742918122594702,
+ 7.976706508820096,
+ 0.661944303118217,
+ 1.0,
+ 1.0
+ ],
+ [
+ 9.158249596946575,
+ 5.518471945522724,
+ 0.559948961374544,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.422421957396121,
+ 5.906622791679309,
+ 0.5458306042743009,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 8.890867985960593,
+ 4.4738353481201205,
+ 0.45554062812103474,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.10766231501729,
+ 4.600332534259479,
+ 0.42905913041817906,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.644145049627562,
+ 3.5578304991219776,
+ 0.3583882582073364,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.809164274475929,
+ 3.478492011806664,
+ 0.3195446729534758,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.407653424323472,
+ 2.6481130847129877,
+ 0.27002685963090217,
+ 1.0,
+ 0.9999999999999997
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.53373017248532,
+ 2.3749587060857955,
+ 0.2241824772808163,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 8.203616549638747,
+ 1.8080062747441588,
+ 0.19509280009801266,
+ 0.9999999999999998,
+ 0.9999999999999997
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.295384413217867,
+ 1.5294483455472343,
+ 0.154415201940044,
+ 0.9999999999999989,
+ 0.9999999999999993
+ ],
+ [
+ 8.022502210874505,
+ 1.2438378762813194,
+ 0.1413900606981284,
+ 0.9999999999999974,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.104010784077435,
+ 1.0265351575121076,
+ 0.10955476641849816,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.868467442602251,
+ 0.8899916102655236,
+ 0.10590965956772568,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.94858805775897,
+ 0.711969268725865,
+ 0.07965151799160382,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 7.699635963499546,
+ 0.6554945007296404,
+ 0.08212379935912469,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.810944217651605,
+ 0.5037058936583966,
+ 0.05886847320969132,
+ 0.99999999999995,
+ 0.9999999999999999
+ ],
+ [
+ 7.569661170150615,
+ 0.4864025527837183,
+ 0.06354449112080096,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.704884285945398,
+ 0.3607784809600423,
+ 0.043668341058502085,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 7.481372485574726,
+ 0.3532701799740453,
+ 0.04755809782645862,
+ 0.9999999999999994,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 7.662930020260706,
+ 0.2021721384957669,
+ 0.024831045752513152,
+ 1.0,
+ 1.0
+ ],
+ [
+ 7.44590960884995,
+ 0.20032633128730398,
+ 0.027313847574876655,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 7.227005287440128,
+ 24.334529373046347,
+ 3.346304818086884,
+ 0.6176080340361106,
+ 1.9999999999999998
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.6926127007002165,
+ 26.080454141976524,
+ 3.021821175746115,
+ 0.6050693293251329,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.010544530917928,
+ 27.792712410064738,
+ 2.8388986855782923,
+ 0.6112160589562179,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.256153638911544,
+ 29.0748176293787,
+ 2.6999487235825987,
+ 0.6255102300616039,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.495554996040493,
+ 29.999999978972074,
+ 2.557123815439328,
+ 0.6429750446014585,
+ 1.9999999863432127
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.66965053196552,
+ 29.99999998766333,
+ 2.414263685946964,
+ 0.7999999912185315,
+ 0.8479659230172846
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.95436282223734,
+ 29.999999996254044,
+ 2.245491077713101,
+ 0.6675631257800874,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.173637796810794,
+ 29.999999994642145,
+ 2.1121133743625737,
+ 0.68270114914785,
+ 1.9999999998245686
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.378466691797417,
+ 29.999999995851976,
+ 1.9941672687040122,
+ 0.7005045123432097,
+ 1.9999999937564137
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.575608270751275,
+ 29.99999999565031,
+ 1.8862806006873425,
+ 0.7210591671467705,
+ 1.999999999475527
+ ],
+ [
+ 7.8752334841963005,
+ 21.5,
+ 2.937318364262455,
+ 0.6637453078011579,
+ 0.85
+ ],
+ [
+ 8.15847414106067,
+ 21.5,
+ 2.509366313660064,
+ 0.7611222118458072,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 9.763247201606347,
+ 29.999999998889415,
+ 1.7875005943667948,
+ 0.7450225592973483,
+ 2.0
+ ],
+ [
+ 8.094399317327936,
+ 21.5,
+ 2.797772775834305,
+ 0.6525339897347702,
+ 0.85
+ ],
+ [
+ 8.367780711890843,
+ 21.5,
+ 2.3912735569912127,
+ 0.7519320416148346,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 9.94110094098988,
+ 30.000000001976463,
+ 1.6963922809954577,
+ 0.7730285987061438,
+ 2.0
+ ],
+ [
+ 8.303384394407244,
+ 21.5,
+ 2.652239424287149,
+ 0.6487100459029728,
+ 0.85
+ ],
+ [
+ 8.58119149303565,
+ 21.5,
+ 2.260337482018132,
+ 0.750593985130789,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.109637579694224,
+ 30.000000001690154,
+ 1.6115624103716089,
+ 0.8055934462670403,
+ 1.999999999999999
+ ],
+ [
+ 8.51880336782653,
+ 21.5,
+ 2.499109069396865,
+ 0.6494836753314298,
+ 0.85
+ ],
+ [
+ 8.790478689618308,
+ 21.5,
+ 2.1281325354439233,
+ 0.7550430084317616,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.2660309493805,
+ 29.99999999925739,
+ 1.5325575085101724,
+ 0.8439864183867728,
+ 2.0
+ ],
+ [
+ 8.745967098596045,
+ 21.5,
+ 2.3424603245147737,
+ 0.6531335799712447,
+ 0.85
+ ],
+ [
+ 9.002425517808268,
+ 21.5,
+ 1.996390646227454,
+ 0.7633400270569523,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.41185376958915,
+ 29.999999999846512,
+ 1.4575377530373668,
+ 0.8894786129812241,
+ 1.9999999999523967
+ ],
+ [
+ 8.977573111047136,
+ 21.5,
+ 2.1875954566397233,
+ 0.6599329438399414,
+ 0.85
+ ],
+ [
+ 9.221472301824546,
+ 21.5,
+ 1.8651714305799434,
+ 0.7749720379759916,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.544242480695864,
+ 29.99999998851699,
+ 1.3862879237154124,
+ 0.9435289390581095,
+ 2.0
+ ],
+ [
+ 9.215697599526793,
+ 21.5,
+ 2.0331162770605578,
+ 0.6704992509149573,
+ 0.85
+ ],
+ [
+ 9.43826934823591,
+ 21.5,
+ 1.737513828691482,
+ 0.7910677791657482,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.62570549218475,
+ 26.802216905941634,
+ 1.2850343582304842,
+ 0.9499999998205371,
+ 1.999999999896553
+ ],
+ [
+ 9.447490662102288,
+ 21.5,
+ 1.8838285975385114,
+ 0.685988653741825,
+ 0.85
+ ],
+ [
+ 9.654250751866261,
+ 21.5,
+ 1.6344606328376758,
+ 0.7879979942322654,
+ 0.8664710780218801
+ ]
+ ],
+ [
+ [
+ 10.631499775941815,
+ 23.567652703818887,
+ 1.2179406808865623,
+ 0.9637132106717914,
+ 2.0
+ ],
+ [
+ 9.673910229671625,
+ 21.5,
+ 1.7382204915975015,
+ 0.7073196379018886,
+ 0.85
+ ],
+ [
+ 9.86105988874005,
+ 21.5,
+ 1.5391941675224232,
+ 0.7836862171152869,
+ 0.8879367680051509
+ ]
+ ],
+ [
+ [
+ 10.58738903558307,
+ 21.373297926584264,
+ 1.1787256603079888,
+ 1.0,
+ 2.0
+ ],
+ [
+ 9.89090679233205,
+ 21.5,
+ 1.5972455165479635,
+ 0.7355719331013443,
+ 0.85
+ ],
+ [
+ 10.062574890419473,
+ 21.5,
+ 1.4442110375725383,
+ 0.7842424310091245,
+ 0.9104306028279688
+ ]
+ ],
+ [
+ [
+ 10.422085898050407,
+ 17.824133056428277,
+ 1.1289197211633195,
+ 1.0,
+ 1.9999999999999996
+ ],
+ [
+ 10.10760287862975,
+ 21.5,
+ 1.4585944785278875,
+ 0.7713389190940508,
+ 0.85
+ ],
+ [
+ 10.262822966487821,
+ 21.5,
+ 1.3509643039660586,
+ 0.7868573518186628,
+ 0.936050162860319
+ ]
+ ],
+ [
+ [
+ 10.18870256027356,
+ 14.81789776652921,
+ 1.0772378786157861,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.323231896083042,
+ 21.49999999980959,
+ 1.3359293245375614,
+ 0.799999999622747,
+ 0.859933918907351
+ ],
+ [
+ 10.465274954786574,
+ 21.5,
+ 1.260733141652183,
+ 0.789010950408953,
+ 0.9669188739225025
+ ]
+ ],
+ [
+ [
+ 9.921473888377005,
+ 12.01435193849837,
+ 1.0229461621997697,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.54198452491244,
+ 21.499999999986535,
+ 1.2416860388164959,
+ 0.799999997517229,
+ 0.8928733924053032
+ ],
+ [
+ 10.677156154671572,
+ 21.5,
+ 1.168904714974502,
+ 0.7949812697339387,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.640969588102726,
+ 9.601779529262249,
+ 0.9595757803713423,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.766294645505816,
+ 21.5,
+ 1.1504328372303845,
+ 0.7999999894094634,
+ 0.9307106032056434
+ ],
+ [
+ 10.879275501798801,
+ 21.5,
+ 1.0475845946995055,
+ 0.8556186969132532,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.351535021956838,
+ 7.874280551724735,
+ 0.887534683318708,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 10.98691535083794,
+ 21.5,
+ 1.064248261396121,
+ 0.7999999911410101,
+ 0.9742023125097793
+ ],
+ [
+ 11.066354161801506,
+ 21.5,
+ 0.9346615923527406,
+ 0.9289452108926071,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.078551339782834,
+ 6.603137307768886,
+ 0.8167701137934688,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.206981262568785,
+ 21.499999999999996,
+ 0.9599712847436123,
+ 0.8350611484448018,
+ 1.0
+ ],
+ [
+ 11.181434187142685,
+ 20.77283968153303,
+ 0.846642507422143,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 8.83156993428573,
+ 5.812787111249024,
+ 0.7517050979411819,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.402133329471532,
+ 21.5,
+ 0.8406991045785359,
+ 0.9234597537427445,
+ 1.0
+ ],
+ [
+ 11.040535215240407,
+ 16.73714979563526,
+ 0.7902576830430643,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 8.622050650915034,
+ 5.237478747431853,
+ 0.6941753894264004,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.48787605171515,
+ 20.09583662202243,
+ 0.7566737852164694,
+ 1.0,
+ 1.0
+ ],
+ [
+ 10.80638331330538,
+ 12.891653528624966,
+ 0.7297814235081529,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 11.263596349829571,
+ 15.558910284449942,
+ 0.6977542702941701,
+ 0.9999999999999998,
+ 0.9999999999999999
+ ],
+ [
+ 10.497032181167297,
+ 9.383499881816313,
+ 0.657822541333821,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.932320531381782,
+ 11.089890021608355,
+ 0.6323283842450467,
+ 1.0,
+ 0.9999999999999994
+ ],
+ [
+ 10.153700725598993,
+ 6.884409452493992,
+ 0.5675807530895971,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.530392223959197,
+ 7.638711474786636,
+ 0.5430071068666821,
+ 0.9999999999999996,
+ 0.9999999999999999
+ ],
+ [
+ 9.802862220071443,
+ 5.392545335033924,
+ 0.47020927456399275,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.11629825253519,
+ 5.566661486322573,
+ 0.43649756197440004,
+ 0.9999999999999961,
+ 0.999999999999999
+ ],
+ [
+ 9.469204809381372,
+ 4.284528636328751,
+ 0.3750804508197863,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.717998053608044,
+ 4.192289092299281,
+ 0.32901906556586,
+ 1.0,
+ 1.0
+ ],
+ [
+ 9.157742411836706,
+ 3.289278402278363,
+ 0.28640980869347993,
+ 1.0,
+ 0.9999999999999994
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.349474720134227,
+ 3.0109329463124594,
+ 0.23554141951437338,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.872980429168917,
+ 2.3553470574248085,
+ 0.21353805642735166,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.031916226287704,
+ 2.0243100252322175,
+ 0.1693124461570029,
+ 1.0,
+ 0.9999999999999997
+ ],
+ [
+ 8.6344172519112,
+ 1.6761689074005273,
+ 0.16210203426511002,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.77558597404827,
+ 1.406860905745111,
+ 0.126070427100619,
+ 0.9999999999999994,
+ 0.9999999999999999
+ ],
+ [
+ 8.435767014613978,
+ 1.2419464573609829,
+ 0.12694011497352836,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.570459820813726,
+ 1.0043879230230817,
+ 0.09531950240651378,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.282867984043461,
+ 0.9329396650237181,
+ 0.0997016694638217,
+ 0.9999999999999786,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.411720351092441,
+ 0.7312915646682735,
+ 0.07271652006107931,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.166860628038231,
+ 0.70382013278819,
+ 0.0779475109187132,
+ 0.9999999999999997,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.315220577400689,
+ 0.5312010847683454,
+ 0.054443594847171595,
+ 0.9999999999999876,
+ 1.0
+ ],
+ [
+ 8.091331540521633,
+ 0.5158089718777714,
+ 0.058549349362686263,
+ 0.999999999999992,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.276973540006116,
+ 0.3037723748821808,
+ 0.03153129011142393,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 8.06083129303217,
+ 0.2979101560776414,
+ 0.034174468076422194,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 7.4125422821904845,
+ 25.526249909688644,
+ 3.332898756275518,
+ 0.5411259756142718,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.8504778267312565,
+ 27.171500881293515,
+ 3.035637923179578,
+ 0.5324502708985959,
+ 1.9999999999999998
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.134450807116007,
+ 28.870111135676712,
+ 2.8812312439174286,
+ 0.5418434690187628,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.396652525166266,
+ 29.999999986065134,
+ 2.7261076922827727,
+ 0.5547471852891153,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.664950209348776,
+ 29.999999984099844,
+ 2.530636096831737,
+ 0.5616298286806123,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.914140277024797,
+ 29.999999996675037,
+ 2.3620129394511884,
+ 0.5717025266625877,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.160490762273078,
+ 29.999999992290764,
+ 2.2091378753724733,
+ 0.5829993737422268,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.392444708683582,
+ 30.00000000042032,
+ 2.0750359171829373,
+ 0.5963647993533062,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.615739313068735,
+ 29.999999974692347,
+ 1.9540712260837327,
+ 0.6118471213152565,
+ 2.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.827464188024802,
+ 29.99999999449878,
+ 1.845228231058151,
+ 0.6300522702953444,
+ 2.0
+ ],
+ [
+ 7.905846190210978,
+ 21.5,
+ 3.242258202119645,
+ 0.5828488815574785,
+ 0.8500000000000001
+ ],
+ [
+ 8.258227966778882,
+ 21.5,
+ 2.711122242516931,
+ 0.6710061293924937,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.033176859493855,
+ 29.99999999575823,
+ 1.7443770789508255,
+ 0.6512896391830831,
+ 1.9999999999464675
+ ],
+ [
+ 8.140031750134401,
+ 21.5,
+ 3.069992437423242,
+ 0.5745876294414574,
+ 0.85
+ ],
+ [
+ 8.490276473638245,
+ 21.5,
+ 2.564700744473053,
+ 0.6646573933365084,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.23375694588472,
+ 30.00000000840358,
+ 1.6498923599351318,
+ 0.676128087647881,
+ 1.9999999989389559
+ ],
+ [
+ 8.369163148016971,
+ 21.5,
+ 2.895705538370683,
+ 0.5713904615947167,
+ 0.8500000000000001
+ ],
+ [
+ 8.726905551228235,
+ 21.5,
+ 2.410724737179099,
+ 0.6640096005668585,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.4267403326427,
+ 30.000000001282675,
+ 1.560284853520871,
+ 0.7078857571634394,
+ 1.8564634283418
+ ],
+ [
+ 8.620927151937206,
+ 21.5,
+ 2.710107619960719,
+ 0.5707562792835896,
+ 0.85
+ ],
+ [
+ 8.964602800080458,
+ 21.5,
+ 2.258300462775337,
+ 0.6671999557282513,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.625198234553125,
+ 29.99999999747538,
+ 1.473549010332623,
+ 0.740222711284146,
+ 2.0
+ ],
+ [
+ 8.881438615884884,
+ 21.5,
+ 2.526185811976023,
+ 0.5726616623067003,
+ 0.85
+ ],
+ [
+ 9.216366402739162,
+ 21.5,
+ 2.1047470164677735,
+ 0.6730060123145745,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.821509706210543,
+ 30.000000002537032,
+ 1.3882880126034456,
+ 0.7817444916524907,
+ 2.0
+ ],
+ [
+ 9.154047821194595,
+ 21.5,
+ 2.3420005427893935,
+ 0.577577776430097,
+ 0.85
+ ],
+ [
+ 9.469845041113109,
+ 21.5,
+ 1.9555424985888765,
+ 0.6823567164858861,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.006325965114003,
+ 29.99999999509633,
+ 1.3073444152872526,
+ 0.8319064582626126,
+ 2.0
+ ],
+ [
+ 9.424680560436956,
+ 21.5,
+ 2.1642697423943136,
+ 0.5864317266198494,
+ 0.85
+ ],
+ [
+ 9.725201263004893,
+ 21.5,
+ 1.809745574190954,
+ 0.6960012708571035,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.177433473037272,
+ 29.999999999890058,
+ 1.2309312236820282,
+ 0.8912029380660313,
+ 2.0
+ ],
+ [
+ 9.692032905839202,
+ 21.5,
+ 1.9923517897002456,
+ 0.599936602583182,
+ 0.85
+ ],
+ [
+ 9.97178546249915,
+ 21.5,
+ 1.6700283920556658,
+ 0.7152142044203491,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.306147724645738,
+ 29.39262972108734,
+ 1.1571588503133174,
+ 0.9499999968475289,
+ 2.0
+ ],
+ [
+ 9.95318442269417,
+ 21.5,
+ 1.8267338995078644,
+ 0.618857351757452,
+ 0.85
+ ],
+ [
+ 10.21606081475877,
+ 21.5,
+ 1.533610872648268,
+ 0.740714633755676,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.323934233081276,
+ 25.115725178385375,
+ 1.075631818902778,
+ 0.9500000011008175,
+ 2.0
+ ],
+ [
+ 10.222271407673485,
+ 21.5,
+ 1.6629127214064159,
+ 0.6435160779239517,
+ 0.85
+ ],
+ [
+ 10.45526164944192,
+ 21.5,
+ 1.4015536077683026,
+ 0.7734858266697927,
+ 0.8500000000000001
+ ]
+ ],
+ [
+ [
+ 11.274759406311585,
+ 23.54626335471182,
+ 1.0418477119286218,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.498522467690737,
+ 21.5,
+ 1.502267873101312,
+ 0.6749998608080431,
+ 0.85
+ ],
+ [
+ 10.704854668833677,
+ 21.5,
+ 1.281251411742833,
+ 0.7999999864092834,
+ 0.8587835209917323
+ ]
+ ],
+ [
+ [
+ 11.13013623933116,
+ 19.200931243900076,
+ 1.0052048666526878,
+ 1.0,
+ 2.0
+ ],
+ [
+ 10.787572133479058,
+ 21.5,
+ 1.3456939158401091,
+ 0.7137989180822878,
+ 0.85
+ ],
+ [
+ 10.957832938574928,
+ 21.5,
+ 1.1870638676386864,
+ 0.7999999926824621,
+ 0.8889356469157716
+ ]
+ ],
+ [
+ [
+ 10.833629912356795,
+ 15.924623496229867,
+ 0.9665982360735883,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.073180648790352,
+ 21.5,
+ 1.198485695012723,
+ 0.7615019581336901,
+ 0.85
+ ],
+ [
+ 11.220955522443644,
+ 21.5,
+ 1.0958922115238063,
+ 0.7999999960757949,
+ 0.9234909648478294
+ ]
+ ],
+ [
+ [
+ 10.497104628897992,
+ 12.921069588951395,
+ 0.9288480216977166,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.35519674356708,
+ 21.5,
+ 1.0741276295307642,
+ 0.7999999997662672,
+ 0.8613093002324141
+ ],
+ [
+ 11.48247471742444,
+ 21.5,
+ 1.0102845822596462,
+ 0.799999999477444,
+ 0.9631040325708718
+ ]
+ ],
+ [
+ [
+ 10.158083350228143,
+ 10.335307265849492,
+ 0.8868213254265146,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.630938983322809,
+ 21.5,
+ 0.9860626173757658,
+ 0.8000000191737671,
+ 0.901045991471427
+ ],
+ [
+ 11.746924783151908,
+ 21.5,
+ 0.921824244539397,
+ 0.8120253771372457,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.819355087734442,
+ 8.57171210157421,
+ 0.8390358139686636,
+ 0.9999999999999999,
+ 2.0
+ ],
+ [
+ 11.906354717335683,
+ 21.5,
+ 0.8993622228390451,
+ 0.806478074383005,
+ 0.9426328978188363
+ ],
+ [
+ 11.997430467281944,
+ 21.5,
+ 0.8066601184773778,
+ 0.8914594756702422,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.516445013528617,
+ 7.247706681239599,
+ 0.7938752769862131,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 12.176431898863264,
+ 21.5,
+ 0.814767925773349,
+ 0.8199264173114929,
+ 0.986842974041085
+ ],
+ [
+ 12.200043086732855,
+ 21.5,
+ 0.7076191290441782,
+ 0.9862139828315784,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 9.257506809262303,
+ 6.395802294978498,
+ 0.7502099304632499,
+ 1.0,
+ 2.0
+ ],
+ [
+ 12.436284690611538,
+ 21.499999999999996,
+ 0.7065720041353877,
+ 0.8982443906426629,
+ 1.0
+ ],
+ [
+ 12.076289109389986,
+ 17.394041215251224,
+ 0.6576844686350077,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 12.589519504952644,
+ 20.658143348147657,
+ 0.6168171027010638,
+ 0.9999999999999997,
+ 1.0
+ ],
+ [
+ 11.764177579502189,
+ 13.083630048754923,
+ 0.6084973728527934,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 12.30128072840766,
+ 15.423636424548139,
+ 0.5694872373734529,
+ 1.0,
+ 1.0
+ ],
+ [
+ 11.355518819320064,
+ 9.23389142563116,
+ 0.5477036015501977,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 11.86414984472765,
+ 10.467968627270912,
+ 0.5127048783470338,
+ 0.9999999999999998,
+ 0.9999999999999999
+ ],
+ [
+ 10.90206341343869,
+ 6.61376144255851,
+ 0.4686493246758652,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 11.337916689137936,
+ 6.9378597434405,
+ 0.42929470518548357,
+ 0.9999999999999998,
+ 1.0
+ ],
+ [
+ 10.46102793429784,
+ 5.103129126680782,
+ 0.38033700872683956,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.806170954539676,
+ 5.0054258690798035,
+ 0.3300418550739203,
+ 1.0,
+ 1.0
+ ],
+ [
+ 10.055837169643981,
+ 3.9489701676919604,
+ 0.2946556987810548,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.322360421380052,
+ 3.6593564392222753,
+ 0.24056035862317468,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 9.693455808766496,
+ 2.9778480936510747,
+ 0.2245457928762166,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.91722901025085,
+ 2.615946741932531,
+ 0.17749328732654693,
+ 0.999999999999973,
+ 1.0
+ ],
+ [
+ 9.386036942331806,
+ 2.188008023993548,
+ 0.17568557714234556,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.592058832723371,
+ 1.8491885668237549,
+ 0.13593349504934613,
+ 1.0,
+ 1.0
+ ],
+ [
+ 9.13676087128293,
+ 1.6491020571412582,
+ 0.1412651435511031,
+ 0.9999999999999988,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.329733188863205,
+ 1.339453952316105,
+ 0.10535126851825642,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.932461260826084,
+ 1.2577872705262372,
+ 0.11382758999044774,
+ 0.9999999999999944,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.131110022226983,
+ 0.9910095551207085,
+ 0.08223028334763773,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.782607955661105,
+ 0.9633323354816755,
+ 0.09094382847498833,
+ 1.0,
+ 0.9999999999999993
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.002373781698983,
+ 0.7287536608083881,
+ 0.06270779104988738,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.685288612898088,
+ 0.713653154079188,
+ 0.06934150797470945,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.950727773733577,
+ 0.42301193396028464,
+ 0.03696044822298105,
+ 1.0,
+ 1.0
+ ],
+ [
+ 8.645838377991677,
+ 0.41900163387433137,
+ 0.041216724740494516,
+ 0.9999999999999661,
+ 0.9999999999999996
+ ]
+ ]
+ ],
+ [
+ [
+ [
+ 7.455322692733378,
+ 25.886836487548074,
+ 3.393927904985547,
+ 0.590941989364378,
+ 0.834709453230133
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 7.900109660903107,
+ 27.680595986769053,
+ 3.0959433504075404,
+ 0.6088738784310677,
+ 0.799414519580014
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.1887072581538,
+ 29.1867461563917,
+ 2.928669187033044,
+ 0.626981830631031,
+ 0.788623883743621
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.470128032250953,
+ 29.999999979557018,
+ 2.7481830590261893,
+ 0.6737161448816525,
+ 0.7446701803719089
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 8.750727782253433,
+ 29.99999999573637,
+ 2.5443166327737705,
+ 0.6884547147545133,
+ 0.7401034521255413
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.013430633901066,
+ 29.999999996665057,
+ 2.3689034457749663,
+ 0.6986902636661184,
+ 0.7441222023852008
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.267518015082198,
+ 30.000000005419036,
+ 2.213331966552846,
+ 0.7149460466100517,
+ 0.7418550928905926
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.506865421758224,
+ 30.000000003200523,
+ 2.076804537283185,
+ 0.7214229935218888,
+ 0.7535570478775439
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.736947554849896,
+ 29.999999995647446,
+ 1.9538218451462213,
+ 0.7284303166194839,
+ 0.7667866911847683
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ]
+ ],
+ [
+ [
+ 9.957051176222764,
+ 30.000000002525063,
+ 1.8423894487010315,
+ 0.7374919707192329,
+ 0.7806773439234006
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.309429187747265,
+ 21.5,
+ 2.9343906478472968,
+ 0.598617705634306,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.274753191436524,
+ 30.00000000047401,
+ 1.702263065724271,
+ 0.5882115215276589,
+ 1.0000054255339883
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.562189192858193,
+ 21.5,
+ 2.7605036338169993,
+ 0.5934672816911364,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.490890145149773,
+ 30.000000050141754,
+ 1.606041448060787,
+ 0.611096654799393,
+ 1.0000000002959797
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 8.819889013534157,
+ 21.5,
+ 2.5844588451163815,
+ 0.5923990203474895,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.712133533053306,
+ 29.999999541298273,
+ 1.5120680742038657,
+ 0.6379185491101738,
+ 1.0000003775933886
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.091437296777324,
+ 21.5,
+ 2.4079020784288714,
+ 0.5937468364499249,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 10.934274809868288,
+ 30.00000094923478,
+ 1.4208076990912761,
+ 0.6703401219855442,
+ 1.0000002023299506
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.37315935698253,
+ 21.499999999999996,
+ 2.234076231055524,
+ 0.5977537289031355,
+ 0.8500000000000001
+ ]
+ ],
+ [
+ [
+ 11.164410748372017,
+ 30.000000000981018,
+ 1.3299350454508623,
+ 0.7091735309265428,
+ 1.0000000555409956
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.660508250490697,
+ 21.5,
+ 2.064590805635643,
+ 0.6051515461270721,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.39146977755283,
+ 29.999999978022785,
+ 1.2423904806354635,
+ 0.7558108976699873,
+ 1.0000000000096305
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.943273429468432,
+ 21.5,
+ 1.9026165907472579,
+ 0.616887465894314,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.60676368056849,
+ 29.99999999544723,
+ 1.1651219232470178,
+ 0.7999999960029686,
+ 1.629777332837891
+ ],
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.224742851835488,
+ 21.5,
+ 1.7458644906553433,
+ 0.6336023932975349,
+ 0.8500000000000001
+ ]
+ ],
+ [
+ [
+ 11.80437962641902,
+ 29.999999999089226,
+ 1.0925500169508977,
+ 0.8569702685292043,
+ 1.9999999983833052
+ ],
+ [
+ 10.161580864916628,
+ 21.499999999999993,
+ 1.9409156335104212,
+ 0.5442851945118115,
+ 0.8500000000000001
+ ],
+ [
+ 10.50562664851661,
+ 21.5,
+ 1.594004500525893,
+ 0.6560112938677428,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.968694138293184,
+ 29.99999999990663,
+ 1.025872399904517,
+ 0.9298764621630823,
+ 2.0
+ ],
+ [
+ 10.488649045616924,
+ 21.5,
+ 1.7490712897446752,
+ 0.5656249145560481,
+ 0.85
+ ],
+ [
+ 10.805799131900706,
+ 21.5,
+ 1.4421937792224648,
+ 0.6844502415019174,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 12.016930531671331,
+ 26.75937422687154,
+ 0.9533198409536346,
+ 0.949999998136706,
+ 2.0
+ ],
+ [
+ 10.836804497158408,
+ 21.5,
+ 1.5618102672285477,
+ 0.592419511186061,
+ 0.85
+ ],
+ [
+ 11.115714295327809,
+ 21.5,
+ 1.2950203025262312,
+ 0.7200673538226208,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.963749707470981,
+ 24.722406913312636,
+ 0.9178936159055455,
+ 0.9939085796042066,
+ 2.0
+ ],
+ [
+ 11.191775163299768,
+ 21.5,
+ 1.3855784031468954,
+ 0.6255809203635962,
+ 0.85
+ ],
+ [
+ 11.43280846283155,
+ 21.5,
+ 1.1546753141061932,
+ 0.763751322458422,
+ 0.85
+ ]
+ ],
+ [
+ [
+ 11.842218535596645,
+ 20.336075555841333,
+ 0.8882912300225699,
+ 1.0,
+ 1.9999999999999984
+ ],
+ [
+ 11.546763359926628,
+ 21.5,
+ 1.2223743417095017,
+ 0.666225171546859,
+ 0.85
+ ],
+ [
+ 11.749148847758066,
+ 21.5,
+ 1.0308038856971082,
+ 0.8053705829097544,
+ 0.8566686737688883
+ ]
+ ],
+ [
+ [
+ 11.4904387054382,
+ 16.810204966135096,
+ 0.8627198724113527,
+ 1.0,
+ 2.0
+ ],
+ [
+ 11.903769034116113,
+ 21.5,
+ 1.0710490743540897,
+ 0.7160085525415127,
+ 0.85
+ ],
+ [
+ 12.06013009109803,
+ 21.5,
+ 0.9379820506617774,
+ 0.815678288729206,
+ 0.8868492805224086
+ ]
+ ],
+ [
+ [
+ 11.08660608526904,
+ 13.769761384085163,
+ 0.8414978778402726,
+ 1.0,
+ 2.0
+ ],
+ [
+ 12.250998558300774,
+ 21.499999999999996,
+ 0.9327498508324117,
+ 0.7776626841539866,
+ 0.85
+ ],
+ [
+ 12.374623472086835,
+ 21.5,
+ 0.8483201314729427,
+ 0.8317019237808763,
+ 0.9185814203447888
+ ]
+ ],
+ [
+ [
+ 10.684992189361186,
+ 11.260022759903793,
+ 0.8211999126545305,
+ 1.0,
+ 2.0
+ ],
+ [
+ 12.58085587674409,
+ 21.5,
+ 0.8162809867900329,
+ 0.8370816907768902,
+ 0.8590078802357853
+ ],
+ [
+ 12.681798201444899,
+ 21.5,
+ 0.7651596063050574,
+ 0.8499999949526713,
+ 0.9551200868909201
+ ]
+ ],
+ [
+ [
+ 10.315931892832975,
+ 9.421650108955768,
+ 0.7986073118068885,
+ 1.0,
+ 1.9999999999999998
+ ],
+ [
+ 12.896280036569303,
+ 21.499999999736044,
+ 0.7358934349271373,
+ 0.8499999936860455,
+ 0.9004195707043556
+ ],
+ [
+ 12.979047001368853,
+ 21.5,
+ 0.6886605819855035,
+ 0.8694410110620161,
+ 0.998219139425639
+ ]
+ ],
+ [
+ [
+ 10.005527837546017,
+ 8.170384083242507,
+ 0.771594020797406,
+ 1.0,
+ 2.0
+ ],
+ [
+ 13.204218090291477,
+ 21.5,
+ 0.6581909358227944,
+ 0.8715845892693584,
+ 0.9448303698832514
+ ],
+ [
+ 13.243045161509404,
+ 21.5,
+ 0.5907913951462874,
+ 0.9754356569385922,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 13.510146801006389,
+ 21.5,
+ 0.5835968178798893,
+ 0.8999999980671277,
+ 0.9949102647462893
+ ],
+ [
+ 13.110713444857476,
+ 17.38244477349673,
+ 0.5446672897345325,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 13.685779228242046,
+ 20.01572347561574,
+ 0.5051030828525599,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 12.722984838888367,
+ 12.69181743519868,
+ 0.5025565363693448,
+ 0.9999999999999996,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 13.295007510246188,
+ 14.457199292052833,
+ 0.4622466703499753,
+ 1.0,
+ 1.0
+ ],
+ [
+ 12.212980126610056,
+ 8.694846270153034,
+ 0.4473047742614745,
+ 1.0,
+ 0.9999999999999999
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 12.751429461133254,
+ 9.287661736189179,
+ 0.40584376761726537,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 11.656795793979509,
+ 6.126125485759469,
+ 0.3736458142502998,
+ 0.9999999999999998,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 12.103551172473576,
+ 6.027733331940285,
+ 0.3226479880057024,
+ 0.9999999999999999,
+ 0.9999999999999999
+ ],
+ [
+ 11.121183268903039,
+ 4.65909092538986,
+ 0.2944047835734617,
+ 0.9999999999999999,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 11.475850676306143,
+ 4.343150343408392,
+ 0.2387070272912455,
+ 0.9999999999999999,
+ 1.0
+ ],
+ [
+ 10.650041455465011,
+ 3.5831021025994128,
+ 0.22832971074080005,
+ 0.9999999999999999,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.948796139950135,
+ 3.2127286004375963,
+ 0.17917296435851882,
+ 1.0,
+ 0.9999999999999998
+ ],
+ [
+ 10.26222598479895,
+ 2.7625647704554517,
+ 0.18216491018627196,
+ 0.9999999999999745,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.533019407533606,
+ 2.352571720734295,
+ 0.1399581177609152,
+ 0.9999999999999992,
+ 0.9999999999999997
+ ],
+ [
+ 9.950299817895292,
+ 2.109843065920061,
+ 0.14926583581603076,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 10.206966521361613,
+ 1.7156743209723702,
+ 0.11031080313572042,
+ 1.0,
+ 1.0
+ ],
+ [
+ 9.70144898581948,
+ 1.621202603354916,
+ 0.12205044848547156,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.959419631516893,
+ 1.2802007721754636,
+ 0.08751331201441519,
+ 0.9999999999999988,
+ 1.0
+ ],
+ [
+ 9.511696650808021,
+ 1.252161069681441,
+ 0.09902855084034003,
+ 1.0,
+ 0.9999999999999998
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.802851375666098,
+ 0.9468714163187568,
+ 0.06740497065919905,
+ 0.9999999999999479,
+ 0.9999999999999999
+ ],
+ [
+ 9.390185633533193,
+ 0.9332098975085831,
+ 0.07627911046874146,
+ 1.0,
+ 1.0
+ ]
+ ],
+ [
+ [
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0,
+ 0.0
+ ],
+ [
+ 9.74059761686937,
+ 0.5535639550163278,
+ 0.04008076697668415,
+ 1.0,
+ 0.9999999999999999
+ ],
+ [
+ 9.34119320051703,
+ 0.5528398125697014,
+ 0.045828223937557866,
+ 0.9999999999999997,
+ 1.0
+ ]
+ ]
+ ]
]
}
\ No newline at end of file
diff --git a/runVPP.py b/runVPP.py
index 55251b4..39559ec 100755
--- a/runVPP.py
+++ b/runVPP.py
@@ -1,4 +1,4 @@
-#!/opt/miniconda3/bin/python
+#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import numpy as np
@@ -29,14 +29,14 @@
Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
Kite("A2", area=150.0, vce=9.55),
- Kite("A5", area=75.0, vce=2.75),
+ Kite("A5", area=110.0, vce=9.0),
],
)
vpp = VPP(Yacht=YD41)
vpp.set_analysis(
- tws_range=np.arange(4.0, 22.0, 2.0), twa_range=np.linspace(30.0, 180.0, 31)
+ tws_range=np.arange(4.0, 22.0, 2.0), twa_range=np.linspace(28.0, 180.0, 39)
)
vpp.run()
diff --git a/src/AeroMod.py b/src/AeroMod.py
index 4c876d3..5127f18 100644
--- a/src/AeroMod.py
+++ b/src/AeroMod.py
@@ -1,16 +1,59 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-import numpy as np
-from scipy.optimize import fsolve
+import functools
+
import matplotlib.pyplot as plt
+import numpy as np
+
from src.UtilsMod import build_interp_func
+Z_REF = 10.0 # m, height the true wind speed is given at (ORC 7.1)
+Z_0 = 0.005 # m, roughness length of the log wind profile (ORC since 2022)
+
+
+def wind_gradient(z):
+ """Log-profile ratio of the true wind speed at height z to that at Z_REF (ORC 7.1)."""
+ return np.log(max(z, 10 * Z_0) / Z_0) / np.log(Z_REF / Z_0)
+
+
+@functools.lru_cache(maxsize=512)
+def wind_triangle(tws, twa, vb, phi=0.0, z=Z_REF):
+ """Heeled wind triangle: TWS/TWA/VB → (AWA, AWS) in degrees (ORC 7.2, 7.3).
+
+ The true wind is scaled to height z with the log wind profile, and its
+ component normal to the boat's track is projected onto the heeled mast
+ plane (times cos(phi)). With phi = 0 and z = Z_REF this is the plain
+ law-of-cosines velocity triangle.
+ """
+ twa_rad = np.radians(twa)
+ vt = tws * wind_gradient(z)
+ vy = vt * np.sin(twa_rad) * np.cos(np.radians(phi))
+ vx = vt * np.cos(twa_rad) + vb
+ aws = np.hypot(vx, vy)
+ if aws < 1e-12:
+ return twa, 0.0
+ awa = np.degrees(np.arctan2(vy, vx))
+ return awa, aws
+
+
class AeroMod(object):
def __init__(self, Yacht, rho=1.225, mu=0.0000181):
"""
- Initializes an Aero Model, given a set of sails
+ Aerodynamic force model.
+
+ Computes sail drive force, side force, and heeling moment from the
+ yacht's sail plan using ORC aerodynamic coefficients.
+
+ Parameters
+ ----------
+ Yacht : Yacht
+ Yacht object containing sail definitions and hull geometry.
+ rho : float, optional
+ Air density (kg/m^3). Default is 1.225 (ISA sea level).
+ mu : float, optional
+ Dynamic viscosity of air (Pa.s). Default is 1.81e-5.
"""
# physical params
self.rho = rho
@@ -37,6 +80,8 @@ def _measure_windage(self):
self.boa = self.yacht.boa
self.loa = self.yacht.loa
self.fbav = 0.625 * self.yacht.ff + 0.375 * self.yacht.fa
+ # hull windage acts at about half the average freeboard
+ self.z_hull = 0.5 * self.fbav
def _measure_sails(self):
@@ -44,7 +89,7 @@ def _measure_sails(self):
for sail in self.sails:
sail.measure(self.rfm, self.ftj)
if sail.type == "main":
- self.fractionality /= sail.P + sail.BAD
+ self.fractionality /= sail.P_r + sail.BAD
b1 = sail.P_r + sail.BAD
self.roach = sail.roach
tf = (0.16*(sail.CE-0.024)/sail.P+0.94)*sail.P+sail.BAD
@@ -53,12 +98,18 @@ def _measure_sails(self):
b2 = sail.I*sail.IG_r/sail.IG
self.overlap = sail.LPG_r / sail.J
self.HBI = sail.HBI
+ # a reefed main can drop below the jib head, treat that as a masthead rig
+ self.fractionality = min(self.fractionality, 1.0)
self.eff_span_corr = (
1.1
+ 0.08 * (self.roach - 0.2)
- + 0.5 * (0.68 + 0.31 * self.fractionality + 0.0075 * self.overlap - 1.1)
+ + 0.5 * (0.68 + 0.31 * self.fractionality + 0.075 * self.overlap - 1.1)
)
self.b = max(b1, b2)
+ # geometric centre of effort of the sail plan above the waterline,
+ # height of the apparent wind for the sail forces (ORC 7.1)
+ self.z_sails = self.HBI + sum(sail.area * sail.vce for sail in self.sails) / sum(
+ sail.area for sail in self.sails)
# assumes no mizain mast
self.heff_height_max_spi = max(tf+self.HBI, 0)
@@ -66,16 +117,47 @@ def _measure_sails(self):
# prototype top function in hydro mod
def update(self, vb, phi, tws, twa, flat, RED):
"""
- Update the aero model for current iter
+ Update aerodynamic forces for current sailing state.
+
+ Solves the wind triangle, computes sail coefficients, and projects
+ forces into the boat reference frame.
+
+ Parameters
+ ----------
+ vb : float
+ Boat speed (m/s).
+ phi : float
+ Heel angle (degrees).
+ tws : float
+ True wind speed (m/s).
+ twa : float
+ True wind angle (degrees).
+ flat : float
+ Sail flattening factor (0.53 to 1.0). Reduces lift and drag.
+ RED : float
+ Reef/reduction factor. Upwind, values > 1 reduce the jib foot
+ (ftj = RED - 1) and values <= 1 reef the mainsail (rfm = RED).
+ Downwind (kite), reef = min(RED, 1) scales the whole sail area by
+ reef^2 and the centre of effort by reef.
+
+ Returns
+ -------
+ tuple of float
+ (Fx, Fy, Mx) — drive force (N), side force (N), heeling moment (N.m).
"""
self.vb = max(0, vb)
self.phi = max(0, phi)
self.tws = tws
self.twa = twa
- # gradual flattening of the sails with tws increase, min is 0.62 from 17 knots
- self.flat = flat #np.where(tws<2.5, 1, np.where(tws < 8.5, 0.81 + 0.19 * np.cos((tws - 2.5) / 6 * np.pi), 0.62))
- self.ftj = max(RED-1., 0.)
- self.rfm = min(RED, 1.)
+ self.flat = flat
+ if self.up:
+ self.ftj = max(RED-1., 0.)
+ self.rfm = min(RED, 1.)
+ self.reef = 1.0
+ else:
+ self.ftj = 1.0
+ self.rfm = 1.0
+ self.reef = min(RED, 1.)
self._measure_sails()
self._update_windTriangle()
@@ -102,21 +184,21 @@ def _compute_forces(self):
self.Fx = self.lift * np.sin(awa) - self.drag * np.cos(awa)
self.Fy = self.lift * np.cos(awa) + self.drag * np.sin(awa)
- # side-force is horizontal component of Fh
- self.Fy *= np.cos(np.radians(self.phi))
-
- # heeling moment
+ # heeling moment: heeling force (normal to the mast plane) times its height
self.Mx = self.Fy * self._vce()
+ # side-force is horizontal component of the heeling force
+ self.Fy *= np.cos(np.radians(self.phi))
+
def _get_Rw(self, awa):
- Rw = 0.5 * self.rho * self.aws ** 2 * self._get_Aref(awa) * 0.816
- return Rw * np.cos(awa / 180.0 * np.pi)
+ """Hull windage drag (N), along the apparent wind. awa in radians."""
+ return 0.5 * self.rho * self.aws_hull ** 2 * self._get_Aref(awa) * 0.816
def _get_Aref(self, awa):
- # only hull part
- d = 0.5 * (1 - np.cos(awa / 90.0 * np.pi))
+ # only hull part, blends from head-on (AWA 0) to side (AWA 90) area
+ d = 0.5 * (1 - np.cos(2.0 * awa))
return self.fbav * ((1 - d) * self.boa + d * self.loa)
@@ -128,18 +210,23 @@ def _get_coeffs(self):
self.cl = 0.0
self.cd = 0.0
kpp = 0.0
+ sail_cd = {}
for sail in self.sails:
-
- self.cl += sail.cl(self.awa) * sail.area * sail.bk
- self.cd += sail.cd(self.awa) * sail.area * sail.bk
- kpp += sail.cl(self.awa) ** 2 * sail.area * sail.bk * sail.kp
-
- self.cl /= self.area
- self.cd /= self.area
+ cl_i = sail.cl(self.awa)
+ cd_i = sail.cd(self.awa)
+ sail_cd[id(sail)] = cd_i
+ self.cl += cl_i * sail.area * sail.bk
+ self.cd += cd_i * sail.area * sail.bk
+ kpp += cl_i ** 2 * sail.area * sail.bk * sail.kp
+
+ # coefficients are based on the full sail areas, reefing only scales self.area
+ a0 = sum(sail.area for sail in self.sails)
+ self.cl /= a0
+ self.cd /= a0
# viscous quadratic parasitic drag and induced drag
- devisor_1 = self.area * self.cl ** 2
+ devisor_1 = a0 * self.cl ** 2
devisor_2 = np.pi * self._heff(self.awa) ** 2
self.CE = (kpp / devisor_1 if devisor_1 else 0.0) + (self.area / devisor_2 if devisor_2 else 0.0)
@@ -148,7 +235,7 @@ def _get_coeffs(self):
for sail in self.sails:
if sail.type == "jib":
self.fcdj = (
- sail.bk * sail.cd(self.awa) * sail.area / (self.cd * self.area)
+ sail.bk * sail_cd[id(sail)] * sail.area / (self.cd * a0)
)
# final lift and drag
@@ -160,19 +247,11 @@ def _get_coeffs(self):
def _update_windTriangle(self):
"""
- find AWS and AWA for a given TWS, TWA and VB
+ find AWS and AWA for a given TWS, TWA, VB and heel, at the sails' centre
+ of effort and (AWS only) at the hull windage height
"""
- _awa_ = lambda awa: self.vb * np.sin(awa / 180.0 * np.pi) - self.tws * np.sin(
- (self.twa - awa) / 180.0 * np.pi
- )
- self.awa = fsolve(_awa_, self.twa)[0]
- self.aws = np.sqrt(
- (self.tws * np.sin(self.twa / 180.0 * np.pi)) ** 2
- + (self.tws * np.cos(self.twa / 180.0 * np.pi) + self.vb) ** 2
- )
- # self.awa = np.arccos((self.tws*np.cos(np.radians(self.twa)) + self.vb) / np.sqrt((self.tws**2) + (self.vb**2) +
- # 2*self.tws*self.vb * np.cos(np.radians(self.twa))))
- # self.aws = (self.tws * np.sin(np.radians(self.twa))) / np.sin(self.awa)
+ self.awa, self.aws = wind_triangle(self.tws, self.twa, self.vb, self.phi, self.z_sails)
+ _, self.aws_hull = wind_triangle(self.tws, self.twa, self.vb, self.phi, self.z_hull)
def _area(self):
@@ -182,28 +261,30 @@ def _area(self):
self.area = 0.0
for sail in self.sails:
self.area += sail.area
+ self.area *= self.reef ** 2
def _vce(self):
"""
- Vectical centre of effort lift/drag weigted
- """
- sum = 0.0
- for sail in self.sails:
- cl2 = sail.cl(self.awa)**2
- cd2 = sail.cd(self.awa)**2
- sum += sail.area * sail.vce * sail.bk * np.sqrt(cl2+cd2)
- self._area()
- deltaCH = 0 if self.sails[1].up!=True else (1-self.ftj)*0.05*self.sails[1].IG
- Zce = sum/(self.area*np.sqrt(self.cl**2+self.cd**2)) - deltaCH
- return (Zce*(1-0.203*(1-self.flat)-0.451*(1-self.flat)*(1-self.fractionality)))
+ Height of the centre of effort above the waterline (ORC 2026, 5.4.2 and 5.5.2).
-
- def phi_up(self):
- """
- heel angle correction for AWA and AWS (5.51), this is in Radians!
+ Sail centres of effort are lift/drag weighted, measured from the base
+ of I, lowered by the twist function with flat and scaled with reef
+ (kites), then raised by HBI.
"""
- return 0.5 * (self.phi + 10 * (self.phi / 30.0) ** 2) / 180.0 * np.pi
+ sum, cl, cd = 0.0, 0.0, 0.0
+ for sail in self.sails:
+ cl_i, cd_i = sail.cl(self.awa), sail.cd(self.awa)
+ sum += sail.area * sail.vce * sail.bk * np.sqrt(cl_i**2 + cd_i**2)
+ cl += sail.area * sail.bk * cl_i
+ cd += sail.area * sail.bk * cd_i
+ Zce = sum / np.sqrt(cl**2 + cd**2) # (5.39)
+ # twist function (5.40); the overlap term follows Figure 5.14, the
+ # printed equation drops its 1/3 and gives no lowering at 150% overlap
+ olap = 1.0 - np.clip((self.overlap - 0.9) / 0.6, 0.0, 1.0) / 3.0
+ twist = 1.0 - (0.5 * (1 - self.flat)
+ + 0.902 * (1 - self.flat) * (1 - self.fractionality)) * olap
+ return self.HBI + Zce * twist * self.reef
def _heff(self, awa):
diff --git a/src/HydroMod.py b/src/HydroMod.py
index 6fb0727..a91962c 100644
--- a/src/HydroMod.py
+++ b/src/HydroMod.py
@@ -1,13 +1,33 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-import numpy as np
-from scipy.interpolate import RegularGridInterpolator
import warnings
+
import matplotlib.pyplot as plt
+import numpy as np
+from scipy.interpolate import RegularGridInterpolator
+
class HydroMod(object):
def __init__(self, Yacht, rho=1025.0, mu=0.00119, g=9.81):
+ """
+ Hydrodynamic resistance and righting moment model.
+
+ Computes total resistance (viscous + residuary + induced), side force
+ from appendage lift, and righting moment using ORC methods and
+ interpolated resistance surfaces.
+
+ Parameters
+ ----------
+ Yacht : Yacht
+ Yacht object containing hull geometry and appendage definitions.
+ rho : float, optional
+ Seawater density (kg/m^3). Default is 1025.0.
+ mu : float, optional
+ Dynamic viscosity of seawater (Pa.s). Default is 1.19e-3.
+ g : float, optional
+ Gravitational acceleration (m/s^2). Default is 9.81.
+ """
# physical parameters
self.rho = rho
@@ -74,65 +94,204 @@ def _get_Rr(self):
def _get_Rv(self):
"""
- Get viscous resistance at this froude number
+ Viscous resistance of the canoe body (ORC 6.1.1) and appendages (6.1.2).
+ Needs the appendage side forces, so _get_Ri() is called first.
"""
+ q = 0.5 * self.rho * self.vb ** 2
# length correction and form factor of 1.05
- Rv = 0.5 * self.rho * self.wsa * self.vb ** 2 * self._cf(0.85 * self.lsm) * 1.05
- for appendages in self.yacht.appendages:
- Rv += (
- 0.5
- * self.rho
- * appendages.wsa
- * self.vb ** 2
- * self._cf(appendages.chord)
- * appendages.cof
- )
+ Rv = q * self.wsa * self._cf(0.85 * self.lsm) * 1.05
+ for appendage, side_force in zip(self.yacht.appendages, self.Ksfj[1:]):
+ Rv += q * self._app_cd_area(appendage, side_force)
return Rv
- def _get_Ri(self):
-
- # prevent from crashing
- if self.vb == 0.0:
- return 0.0
-
- # reset each time
- self.cla = self.yacht.cla
- self.Teff = self.yacht.teff
+ def _app_cd_area(self, app, side_force):
+ """
+ Viscous drag area (m^2) of an appendage, ORC 6.1.2: five spanwise strips
+ with their local Reynolds number, the ORC friction line (6.3) and form
+ factor (6.4, 6.6), plus the lift-dependent drag (6.7) with CL capped at 0.5.
+ """
+ root = getattr(app, "cu", app.chord)
+ tip = getattr(app, "cl", app.chord)
+ chords = root + (tip - root) * (np.arange(5) + 0.5) / 5
+ if app.type == "bulb":
+ tcr = min(app.tc_ratio, 0.25)
+ kf = -13.1753 * tcr ** 3 + 9.3842 * tcr ** 2 - 0.7581 * tcr + 0.1442
+ elif app.type == "short_keel":
+ kf = app.cof - 1 # own form factor for low aspect-ratio keels
+ else:
+ tcr = min(app.tc_ratio, 0.18)
+ kf = 1.75 * tcr + 30 * tcr ** 4
+ q = 0.5 * self.rho * self.vb ** 2
+ cl = min(abs(side_force) / (q * app.area), 0.5) if q > 0 and app.area > 0 else 0.0
+ dcd = 0.0016 * cl + 0.0032 * cl ** 2
+ return sum(app.wsa / 5 * (self._cf_app(c) * (1 + kf) + dcd) for c in chords)
+ def _get_Ri(self):
+ """
+ Induced drag of the canoe body and appendages (ORC 6.5), each from its
+ share of the side force and its effective span. The appendage spans
+ are corrected for the keel root free surface and funsteady (6.5.1), and
+ the total by the heel multiplier of Figure 6.10.
+ """
+ cla = [self.yacht.cla]
+ teff = [self.yacht.teff]
for appendage in self.yacht.appendages:
- self.cla = np.hstack((self.cla, appendage.cla * appendage._Ksff(self.phi)))
- self.Teff = np.hstack((self.Teff, appendage.teff))
+ cla.append(appendage.cla * appendage._Ksff(self.phi))
+ teff.append(appendage.teff * self.span_mult)
+ cla, teff = np.array(cla), np.array(teff)
- self.Ksfj = (
- 0.5 * self.rho * self.vb ** 2 * self.cla * self.leeway / 180.0 * np.pi
- )
+ q = 0.5 * self.rho * self.vb ** 2
+ self.Ksfj = q * cla * np.radians(self.leeway)
self.Ksf = np.sum(self.Ksfj)
+ if q == 0.0:
+ return 0.0
+ lifting = teff > 0
+ return np.sum(self.Ksfj[lifting] ** 2 / (q * np.pi * teff[lifting] ** 2))
- # contribution of each
- Ri = self.Ksfj ** 2 / (0.5 * self.rho * self.vb ** 2 * np.pi * self.Teff ** 2)
+ def _span_multiplier(self, tws):
+ """
+ Keel root free surface factor times funsteady on the appendage effective
+ span (ORC 6.5.1, 6.39-6.48), both 1 when no TWS is given. TWS enters the
+ empirical wave height and funsteady in knots; fact_Fn is taken as Fn.
+ """
+ if tws is None:
+ return 1.0
+ tws_kn = tws / 0.5144
+ hdyn = -0.087641 * self.lsm * self.fn * np.exp(-0.417 * self.lvr)
+ ew = tws_kn * (1 - 0.8375 * 1.174 ** (-0.00248 * tws_kn ** 3.5))
+ hw = 0.25 * tws_kn * np.sqrt(2 * ew / (self.rho * self.g))
+ beff = 0.0
+ # keel root at the canoe body draft, under a wave peak and trough
+ for dist in (self.tc + hdyn + 0.5 * hw, self.tc + hdyn - 0.5 * hw):
+ tratio = np.clip(2 * dist / (0.15 * self.lsm), 0.0, 0.5)
+ beff += 0.5 * (0.5 + 0.5 * np.sin(np.pi * tratio))
+ funsteady = max(0.9, 1 - ((tws_kn - 10) / (self.vol + 3)) ** 2 / 200)
+ return beff * funsteady
- return sum(Ri)
+ def _di_factor(self, ratio):
+ """
+ Heel multiplier of the induced drag (ORC Figure 6.10, fitted as
+ 1 + 0.56 (1 - phi/16)^2 below 16 deg), fully active upwind and faded
+ out as the drive to side force ratio goes from 0.2 to 0.4.
+ """
+ di = 1 + 0.56 * max(0.0, 1 - self.phi / 16.0) ** 2
+ w = 0.5 * (1 + np.cos(np.pi * np.clip((ratio - 0.2) / 0.2, 0.0, 1.0)))
+ return 1 + (di - 1) * w
def _cf(self, L):
"""
- Flate plate turbulent boudnary layer friction coefficient.
- Take a length scale, such that it can be used for appendags as well
+ Flat plate turbulent boundary layer friction coefficient (Hughes line,
+ as in the ORC VPP since 2013) with optional ITTC 1978 roughness
+ allowance. Takes a length scale so it can be used for hull and
+ appendages.
"""
Re = max(
1e4, self.vb * L / self.nu
) # prevents dividing by zero, lowest for turbulence on plate
- return 0.066 * (np.log10(Re) - 2.03) ** (-2)
+ cf = 0.066 * (np.log10(Re) - 2.03) ** (-2)
+ ks = self.yacht.roughness
+ if ks > 0:
+ cf += (105.0 * (ks / L) ** (1.0 / 3.0) - 0.64) * 1e-3
+ return cf
+
+ def _cf_app(self, L):
+ """
+ ORC appendage friction line (6.3, the quadratic term read as
+ 0.0278513 log^2 Rn), with the optional roughness allowance.
+ """
+ lr = np.log10(max(1e5, self.vb * L / self.nu))
+ cf = (0.0000853 * lr ** 4 - 0.0025252 * lr ** 3 + 0.0278513 * lr ** 2
+ - 0.1363492 * lr + 0.2539752)
+ ks = self.yacht.roughness
+ if ks > 0:
+ cf += (105.0 * (ks / L) ** (1.0 / 3.0) - 0.64) * 1e-3
+ return cf
+
+ def _added_resistance_waves(self, twa):
+ """Added resistance in waves (simplified Gerritsma scaling).
+
+ Uses a Bretschneider-type spectrum with hull-form scaling to
+ estimate the mean added resistance from ocean waves.
+
+ Parameters
+ ----------
+ twa : float
+ True wind angle (degrees), used as wave encounter angle
+ unless ``yacht.wave_direction`` overrides it.
+
+ Returns
+ -------
+ float
+ Added resistance in Newtons. Returns 0 when Hs = 0.
+ """
+ Hs = self.yacht.Hs
+ Ts = self.yacht.Ts
+ if Hs <= 0 or Ts <= 0:
+ return 0.0
+
+ # wave encounter angle
+ if self.yacht.wave_direction is not None:
+ mu = np.radians(twa - self.yacht.wave_direction)
+ else:
+ mu = np.radians(twa)
- def update(self, vb, phi, leeway):
+ # heading correction — full drag head-on, near-zero following
+ cos2_mu = np.cos(mu) ** 2
+
+ # hull-form coefficient (empirical, typical displacement hull)
+ C_aw = 6.0
+
+ # wave encounter frequency
+ omega_0 = 2.0 * np.pi / Ts
+ omega_e = abs(omega_0 - omega_0 ** 2 * self.vb * np.cos(mu) / self.g)
+
+ # resonance tuning factor (peak when encounter ≈ hull natural freq)
+ omega_n = np.sqrt(self.g / self.l)
+ r = omega_e / omega_n if omega_n > 0 else 0.0
+ f_omega = r ** 2 * np.exp(1.0 - r ** 2) if r > 0 else 0.0
+
+ Raw = C_aw * (Hs ** 2 / self.l) * (self.bwl ** 2 / self.tc) * f_omega * cos2_mu
+ # convert to Newtons (rho * g scaling)
+ Raw *= self.rho * self.g / 1000.0
+
+ return max(0.0, Raw)
+
+ def update(self, vb, phi, leeway, twa=0.0, tws=None):
+ """
+ Update hydrodynamic forces for current sailing state.
+
+ Parameters
+ ----------
+ vb : float
+ Boat speed (m/s).
+ phi : float
+ Heel angle (degrees).
+ leeway : float
+ Leeway angle (degrees).
+ twa : float, optional
+ True wind angle (degrees). Used for wave encounter angle.
+ tws : float, optional
+ True wind speed (m/s), for the free surface and funsteady
+ corrections of the appendage effective span. None skips them.
+
+ Returns
+ -------
+ tuple of float
+ (Fx, Fy, Mx) — total resistance (N), side force (N),
+ total righting moment (N.m).
+ """
self.vb = max(0, vb)
self.phi = max(0, phi)
- self.leeway = max(0, leeway)
+ self.leeway = leeway
self.lsm, self.lvr, self.btr = self.yacht.measureLSM()
self.fn = self.vb / (np.sqrt(self.g * self.lsm))
- # resistance
- self.Fx = self._get_Rr() + self._get_Rv() + self._get_Ri()
+ # resistance, induced drag first as it sets the appendage lift
+ self.span_mult = self._span_multiplier(tws)
+ Ri = self._get_Ri()
+ self.Fx = self._get_Rr() + self._get_Rv() + self._added_resistance_waves(twa)
+ self.Fx += Ri * self._di_factor(self.Fx / max(self.Ksf, 1e-6))
# keel side force, calculated when _get_Ri() is called
self.Fy = self.Ksf * np.cos(self.phi / 180.0 * np.pi)
@@ -148,15 +307,19 @@ def update(self, vb, phi, leeway):
# def _limit_heel(self):
# self.phi = max(0,min(self.phi,self.phi_max))
- # dynamic RM
def _get_RmV(self, vb):
+ """
+ Dynamic righting moment (N.m), ORC 2026 eq. 4.32. Negative: stability
+ lost with forward speed. Displacement x length gives kg.m, so the
+ formula holds in SI with the speed-length ratio in knots/sqrt(ft).
+ """
+ slr = (vb / 0.5144) / np.sqrt(self.lsm / 0.3048)
return (
(5.955e-5 / 3.0)
- * self.vol
+ * self.mass * self.g
* self.lsm
- * (1 - 6.25 * (self.bwl / np.sqrt(self.yacht.amax)))
- * self.vb
- / self.lsm
+ * (1 - 6.25 * self.bwl / np.sqrt(self.yacht.amax) - 2.1)
+ * slr
* self.phi
)
@@ -184,6 +347,8 @@ def show_resistance(self, vb, file_name="None"):
self.phi = 0
self.lsm, self.lvr, self.btr = self.yacht.measureLSM()
self.fn = self.vb / (np.sqrt(self.g * self.lsm))
+ self.leeway, self.span_mult = 0.0, 1.0
+ self._get_Ri() # zero side force, sets the appendage lift
resR[i] = self._get_Rr()
resV[i] = self._get_Rv()
plt.plot(vb, resR, "-x", lw=1, label="Residuary Resistance")
diff --git a/src/SailMod.py b/src/SailMod.py
index 0e286d2..1612750 100644
--- a/src/SailMod.py
+++ b/src/SailMod.py
@@ -1,32 +1,112 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-import numpy as np
import matplotlib.pyplot as plt
-from scipy.interpolate import Akima1DInterpolator
+import numpy as np
+from scipy import interpolate
+
+
+SAIL_TYPES = {
+ "main": "main",
+ "main_low": "main_low",
+ "jib": "jib",
+ "jib_low": "jib_low",
+ "kite": "kite",
+ "sym_kite": "sym_kite",
+ "asym_cl_kite": "asym_cl_kite",
+ "asym_pole_kite": "asym_pole_kite",
+}
+
class Sail(object):
- def __init__(self, name, type, area, vce, up=True):
+ def __init__(self, name, type, area, vce, up=True, data_source="orc",
+ cl_data=None, cd_data=None, sail_type=None):
+ """
+ Base sail class.
+ Parameters
+ ----------
+ name : str
+ Sail identifier (e.g. "J1", "A2").
+ type : str
+ Sail type, used to load coefficient data from ``dat/.dat``.
+ One of ``"main"``, ``"jib"``, or ``"kite"``.
+ area : float
+ Sail area (m^2).
+ vce : float
+ Vertical centre of effort above the base of I (m).
+ up : bool, optional
+ Whether this is an upwind sail. Default is True.
+ data_source : str, optional
+ Coefficient data source directory under ``dat/``. Default "orc".
+ cl_data : dict, optional
+ User-provided CL data: ``{"awa": [...], "values": [...]}``.
+ cd_data : dict, optional
+ User-provided CD data: ``{"awa": [...], "values": [...]}``.
+ sail_type : str, optional
+ Override for the coefficient data file name. E.g. ``"main_low"``,
+ ``"sym_kite"``, ``"asym_cl_kite"``, ``"asym_pole_kite"``.
+ If None, uses *type*.
+ """
self.name = name
self.type = type
self.area = area
self.vce = vce
+ # Determine which data file to load
+ coeff_file = sail_type if sail_type is not None else self.type
# get sails coefficients
- self._build_interp_func(self.type)
+ if cl_data is not None and cd_data is not None:
+ self._build_interp_func(coeff_file, data_source=data_source)
+ self._build_interp_from_arrays(cl_data, cd_data)
+ else:
+ self._build_interp_func(coeff_file, data_source=data_source)
self.bk = 1.0 # always valid for main, only AWA<135 for jib
self.up = up # is that an upwind sail?
- def _build_interp_func(self, fname):
- """
- build interpolation function and returns it in a list
+ def _build_interp_func(self, fname, data_source="orc"):
+ """Build cubic B-spline interpolation functions for CL and CD.
+
+ Falls back to linear (k=1) if fewer than 4 data points are available.
+ Tries ``dat/{data_source}/{fname}.dat`` first, then ``dat/{fname}.dat``.
"""
- a = np.genfromtxt("dat/" + fname + ".dat", delimiter=",", skip_header=1)
+ import os
+ path = os.path.join("dat", data_source, fname + ".dat")
+ if not os.path.exists(path):
+ path = os.path.join("dat", fname + ".dat")
+ a = np.genfromtxt(path, delimiter=",", skip_header=1)
self.kp = a[0, 0]
- # linear for now, this is not good, might need to polish data outside
- self.interp_cd = Akima1DInterpolator(a[1, :], a[2, :])
- self.interp_cl = Akima1DInterpolator(a[1, :], a[3, :])
+ # Filter NaN values (trailing commas in CSV create NaNs)
+ mask = ~(np.isnan(a[1, :]) | np.isnan(a[2, :]) | np.isnan(a[3, :]))
+ x = a[1, mask]
+ cd = a[2, mask]
+ cl = a[3, mask]
+ k = 3 if len(x) >= 4 else 1
+ self.interp_cd = interpolate.make_interp_spline(x, cd, k=k)
+ self.interp_cd.extrapolate = True
+ self.interp_cl = interpolate.make_interp_spline(x, cl, k=k)
+ self.interp_cl.extrapolate = True
+
+ def _build_interp_from_arrays(self, cl_data, cd_data):
+ """Build interpolation from user-provided coefficient arrays.
+
+ Parameters
+ ----------
+ cl_data : dict
+ {"awa": [...], "values": [...]} for lift coefficients.
+ cd_data : dict
+ {"awa": [...], "values": [...]} for drag coefficients.
+ """
+ cl_awa = np.array(cl_data["awa"])
+ cl_vals = np.array(cl_data["values"])
+ cd_awa = np.array(cd_data["awa"])
+ cd_vals = np.array(cd_data["values"])
+ k_cl = 3 if len(cl_awa) >= 4 else 1
+ k_cd = 3 if len(cd_awa) >= 4 else 1
+ self.interp_cl = interpolate.make_interp_spline(cl_awa, cl_vals, k=k_cl)
+ self.interp_cl.extrapolate = True
+ self.interp_cd = interpolate.make_interp_spline(cd_awa, cd_vals, k=k_cd)
+ self.interp_cd.extrapolate = True
def cl(self, awa):
awa = max(0, min(awa, 180))
@@ -36,6 +116,9 @@ def cd(self, awa):
awa = max(0, min(awa, 180))
return self.interp_cd(awa)
+ def measure(self, rfm, ftj):
+ """Update sail dimensions for current reef/furl state."""
+
def debbug_coeffs(self, N=256):
awa = np.linspace(0, 180, N)
coeffs = np.empty((N, 2))
@@ -49,46 +132,31 @@ def debbug_coeffs(self, N=256):
class Main(Sail):
- def __init__(self, name, P, E, Roach, BAD):
+ def __init__(self, name, P, E, Roach, BAD, data_source="orc",
+ cl_data=None, cd_data=None, sail_type=None):
"""
- Initialize mainsail
-
- This function initializes an object of class Main which inherits the class Sail.
- It calculates the area, the Vertical Center of Effort (vce),
- sets CE = 1 and calls the super class constructor.
+ Initialize mainsail.
Parameters
----------
- name : string
- Of the sail
-
- P : Float
- Height of the Mainsail in meters
-
- E: Float
- Length (Foot) of the Mainsail in meters
-
- Roach: Float
- Percentage by which the triangular area is increased in order to obtain the mainsail area.
- This is area behind the line from clew to head.
- To get this number you have to calculate Mainsail_area / (P*E/2) -1
-
- BAD: Float
- Boom Above Deck: Distance between boom and Deck in meters
-
- Returns
- -------
- Main
- Object of type Main( Sail )
-
- See Also
- --------
- Jib( Sail )
-
- Examples
- --------
- >>> Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0)
-
+ name : str
+ Sail identifier.
+ P : float
+ Height of the Mainsail in meters.
+ E : float
+ Length (Foot) of the Mainsail in meters.
+ Roach : float
+ Roach factor (Mainsail_area / (P*E/2) - 1).
+ BAD : float
+ Boom Above Deck in meters.
+ data_source : str, optional
+ Coefficient data source. Default "orc".
+ cl_data : dict, optional
+ User-provided CL data.
+ cd_data : dict, optional
+ User-provided CD data.
+ sail_type : str, optional
+ Coefficient variant: ``"main"`` (default) or ``"main_low"``.
"""
self.name = name
self.type = "main"
@@ -98,10 +166,23 @@ def __init__(self, name, P, E, Roach, BAD):
self.BAD = BAD
self.area0 = 0.5 * P * E * (1 + self.roach)
self.vce = P / 3.0 * (1 + self.roach) + self.BAD
- super().__init__(self.name, self.type, self.area0, self.vce)
+ super().__init__(self.name, self.type, self.area0, self.vce,
+ data_source=data_source, cl_data=cl_data, cd_data=cd_data,
+ sail_type=sail_type)
self.measure()
def measure(self, rfm=1, ftj=1):
+ """
+ Update mainsail dimensions for reef state.
+
+ Parameters
+ ----------
+ rfm : float
+ Reef factor for mainsail (0 to 1). 1 = fully unreefed.
+ ftj : float
+ Furl factor for jib (unused for mainsail, present for interface
+ compatibility).
+ """
self.P_r = self.P*rfm
self.vce = self.P_r / 3.0 * (1 + self.roach) + self.BAD
self.area = self.area0*rfm**2
@@ -109,7 +190,34 @@ def measure(self, rfm=1, ftj=1):
class Jib(Sail):
- def __init__(self, name, I, J, LPG, HBI):
+ def __init__(self, name, I, J, LPG, HBI, data_source="orc",
+ cl_data=None, cd_data=None, sail_type=None):
+ """
+ Headsail (jib/genoa).
+
+ Parameters
+ ----------
+ name : str
+ Sail identifier (e.g. "J1").
+ I : float
+ Forestay height (m).
+ J : float
+ Base of the foretriangle (m).
+ LPG : float
+ Luff perpendicular (m).
+ HBI : float
+ Height of the base of I (foretriangle base, roughly the deck at the
+ mast) above the waterline (m). All sail centres of effort are
+ measured from this datum, as in the ORC VPP.
+ data_source : str, optional
+ Coefficient data source. Default "orc".
+ cl_data : dict, optional
+ User-provided CL data.
+ cd_data : dict, optional
+ User-provided CD data.
+ sail_type : str, optional
+ Coefficient variant: ``"jib"`` (default) or ``"jib_low"``.
+ """
self.name = name
self.type = "jib"
self.I = I
@@ -118,28 +226,85 @@ def __init__(self, name, I, J, LPG, HBI):
self.LPG = LPG
self.HBI = HBI
self.area = 0.5 * I * max(J, LPG)
- self.vce = I / 3.0 + HBI
- super().__init__(self.name, self.type, self.area, self.vce)
+ self.vce = I / 3.0 # above base of I
+ super().__init__(self.name, self.type, self.area, self.vce,
+ data_source=data_source, cl_data=cl_data, cd_data=cd_data,
+ sail_type=sail_type)
self.measure()
def measure(self, rfm=1, ftj=1):
- self.LPG_r = self.LPG*ftj
- self.IG_r = self.IG*ftj
+ """
+ Update jib dimensions for furl state.
+
+ Parameters
+ ----------
+ rfm : float
+ Reef factor for mainsail (unused for jib, present for interface
+ compatibility).
+ ftj : float
+ Furl factor for jib (0 to 1). 1 = full jib, 0 = minimum jib.
+ """
+ # the foot is reduced down to the minimum jib, a full-hoist jib with LPG = J
+ self.LPG_r = min(self.LPG, self.J) + max(self.LPG - self.J, 0.0) * ftj
+ self.IG_r = self.IG
self.area = 0.5 * self.I * max(self.J, self.LPG_r)
class Kite(Sail):
- def __init__(self, name, area, vce):
+ def __init__(self, name, area, vce, min_reef=0.85, max_heel=21.5, data_source="orc",
+ cl_data=None, cd_data=None, sail_type=None):
+ """
+ Spinnaker or asymmetric downwind sail.
+
+ Parameters
+ ----------
+ name : str
+ Sail identifier (e.g. "A2", "A5").
+ area : float
+ Sail area (m^2).
+ vce : float
+ Vertical centre of effort above the base of I (m), 0.565 * ISP in
+ the ORC VPP.
+ min_reef : float, optional
+ Lowest reef factor when depowering under this sail (sail area
+ scales with reef^2, centre of effort with reef). ORC uses
+ 0.85 * default spinnaker area / spinnaker area. Default 0.85.
+ max_heel : float, optional
+ Largest heel angle (deg) this sail can be carried at. ORC caps heel
+ under spinnaker at about 21.5 deg (since 2014) with a soft resistance
+ boundary; here it is a hard bound, still within the VPP phi_max.
+ Default 21.5.
+ data_source : str, optional
+ Coefficient data source. Default "orc".
+ cl_data : dict, optional
+ User-provided CL data.
+ cd_data : dict, optional
+ User-provided CD data.
+ sail_type : str, optional
+ Coefficient variant: ``"kite"`` (default), ``"sym_kite"``,
+ ``"asym_cl_kite"``, or ``"asym_pole_kite"``.
+ """
self.name = name
self.type = "kite"
self.area = area
- self.min_area = self.area
+ self.min_reef = min_reef
+ self.max_heel = max_heel
self.vce = vce
- super().__init__(self.name, self.type, self.area, self.vce, up=False)
+ super().__init__(self.name, self.type, self.area, self.vce, up=False,
+ data_source=data_source, cl_data=cl_data, cd_data=cd_data,
+ sail_type=sail_type)
self.measure()
def measure(self, rfm=1, ftj=1):
pass
+# class Kite(Sail):
+# def __init__(self, SLU, SLE, SFL, SHW, ISP, J, SPL):
+# self.type = 'kite'
+# area_d = 1.14*np.sqrt(ISP**2+J**2)*max(SPL,J) # only for symm kite
+# self.area = max(area_d, 0.5*(SLU+SLE)*(SFL+4*SHW)/6.)
+# self.vce = 0.565*ISP # above base of I
+# super().__init__(self.type, self.area, self.vce, up=False)
+
if __name__=="__main__":
pass
diff --git a/src/UtilsMod.py b/src/UtilsMod.py
index 3106a5f..3b33893 100644
--- a/src/UtilsMod.py
+++ b/src/UtilsMod.py
@@ -5,7 +5,9 @@
import matplotlib.pyplot as plt
import numpy as np
-from scipy.interpolate import Akima1DInterpolator,RectBivariateSpline
+from matplotlib.lines import Line2D
+from scipy import interpolate
+from scipy.interpolate import RegularGridInterpolator
KNOTS_TO_MPS = 0.5144
stl = [
@@ -39,11 +41,17 @@ def json_write(data, fname):
def build_interp_func(fname, i=1, kind="linear"):
"""
- build interpolatison function and returns it in a list
+ build interpolation function and returns it in a list
"""
a = np.genfromtxt("dat/" + fname + ".dat", delimiter=",", skip_header=1)
- # linear for now, this is not good, might need to polish data outside
- return Akima1DInterpolator(a[0, :], a[i, :], extrapolate=True)
+ # Filter out NaN values for make_interp_spline compatibility
+ mask = ~(np.isnan(a[0, :]) | np.isnan(a[i, :]))
+ x = a[0, mask]
+ y = a[i, mask]
+ k = {"linear": 1, "quadratic": 2, "cubic": 3}.get(kind, 1)
+ spline = interpolate.make_interp_spline(x, y, k=k)
+ spline.extrapolate = True
+ return spline
def _polar(n) -> plt.Figure:
@@ -94,18 +102,34 @@ def _get_vmg(dat, twa_range):
return np.array([ix[sup], iy[sdn]], dtype=int), np.array([sup, sdn])
-def _get_cross(dat, n):
+def _get_cross(dat, n, pad=2):
+ """Return [start, end) TWA indices where sail *n* is fastest.
+
+ Parameters
+ ----------
+ dat : ndarray
+ Shape ``(ntwa, nsails, nvars)``.
+ n : int
+ Sail index.
+ pad : int
+ Number of extra TWA indices to include on each side for visual
+ overlap. Use 0 for a tight (no-overlap) range.
+ """
max_ = np.where(dat[:, n, 0] >= np.max(dat[:, :, 0], axis=1))[0]
if len(max_) > 0:
- idx = np.array(
- [max(min(max_) - 2, 0), min(max(max_) + 2, len(dat[:, n, 0]))], dtype=int
- )
- return idx
+ lo, hi = min(max_), max(max_) + 1
+ # only pad over points that were solved for this sail (skipped ones are 0)
+ for _ in range(pad):
+ if lo > 0 and dat[lo - 1, n, 0] > 0:
+ lo -= 1
+ if hi < len(dat) and dat[hi, n, 0] > 0:
+ hi += 1
+ return np.array([lo, hi], dtype=int)
else:
return np.array([0, 0])
-def polar_plot(VPP_list, n, save, fname="Polars.png") -> None:
+def polar_plot(VPP_list, n, save, fname="Polars.pdf") -> None:
"""
Generate a polar plot of the equilibrium variables.
@@ -119,24 +143,25 @@ def polar_plot(VPP_list, n, save, fname="Polars.png") -> None:
"""
# if we just want the velocity, we also output the gradient
fig, ax = _polar(n)
- for l, VPP in enumerate(VPP_list):
+ tws_handles = []
+ for VPP in VPP_list:
wind = VPP.twa_range
name = "" if len(VPP_list) == 1 else VPP.name
for i in range(len(VPP.tws_range)):
vmg, ids = _get_vmg(VPP.store[i, :, :, :], VPP.twa_range)
for k in range(VPP.Nsails):
- idx = _get_cross(VPP.store[i, :, :, :], k)
for j in range(n):
- lab = "_nolegend_"
- if k == 0:
- lab = name + " " + f"{VPP.tws_range[i]/KNOTS_TO_MPS:.1f}"
+ # Speed plot (j=0) uses overlap padding so sail curves
+ # connect visually; heel/leeway (j>0) use tight range
+ # to avoid discontinuities at sail crossover points.
+ pad = 2 if j == 0 else 0
+ idx = _get_cross(VPP.store[i, :, :, :], k, pad=pad)
ax[j].plot(
wind[idx[0] : idx[1]] / 180 * np.pi,
VPP.store[i, idx[0] : idx[1], k, j],
color=cols[k % 7],
lw=np.where(i < 7, 1.5, 2.5),
linestyle=stl[i % 7],
- label=lab,
)
# add VMG points
for pts in range(2):
@@ -149,51 +174,73 @@ def polar_plot(VPP_list, n, save, fname="Polars.png") -> None:
markersize=4,
mfc="None",
)
- # add legend only on first axis
- ax[0].legend(title=r"TWS (knots)", loc=1, bbox_to_anchor=(1.05, 1.05))
+ # TWS legend entry in black, colours are reserved for sail sets
+ tws_handles.append(Line2D(
+ [0], [0], color="k", lw=np.where(i < 7, 1.5, 2.5), linestyle=stl[i % 7],
+ label=name + " " + f"{VPP.tws_range[i]/KNOTS_TO_MPS:.1f}",
+ ))
+
+ # TWS legend on every axis
+ for j in range(n):
+ ax[j].legend(handles=tws_handles, title=r"TWS (knots)", loc=1,
+ bbox_to_anchor=(1.05, 1.05))
+
+ # Sail colour legend along the bottom of the figure
+ VPP = VPP_list[-1]
+ sail_handles = [
+ Line2D([0], [0], color=cols[k % 7], lw=2, label=VPP.sail_name[k])
+ for k in range(VPP.Nsails)
+ ]
+ fig.legend(
+ handles=sail_handles, title="Sail set",
+ loc="lower center", ncol=VPP.Nsails, frameon=True,
+ )
plt.tight_layout()
+ fig.subplots_adjust(bottom=0.12)
if save:
- plt.savefig(fname, dpi=96)
+ plt.savefig(fname)
else:
plt.show()
-def sail_chart(VPP, save, fname="SailChart.png"):
+def sail_chart(VPP, save, fname="SailChart.pdf"):
sailset = _get_best_sails(VPP.store)
- print(sailset)
+
twa = VPP.twa_range
- tws = VPP.tws_range
+ tws = VPP.tws_range / KNOTS_TO_MPS # stored in m/s, plotted in knots
twas = np.hstack((twa[0] - (twa[1] - twa[0]), twa, twa[-1] + (twa[-1] - twa[-2])))
twss = np.hstack((tws[0] - (tws[1] - tws[0]), tws, tws[-1] + (tws[-1] - tws[-2])))
- xnew = np.linspace(twss[0], twss[-1], 51)
- ynew = np.linspace(twas[0], twas[-1], 51)
+ xnew = np.linspace(twas[0], twas[-1], 101)
+ ynew = np.linspace(twss[0], twss[-1], 51)
fig, ax = _polar(1)
ax[0].set_ylabel(r"TWS (Knots)", labelpad=-60)
h = []
ntws, ntwa, _, _ = VPP.store.shape
for id in range(VPP.Nsails):
- sail = np.zeros((ntws+2, ntwa+2))
+ sail = np.zeros((ntws + 2, ntwa + 2))
for i in range(ntws):
for j in range(ntwa):
if sailset[i, j] == id:
- sail[i+1, j+1] = 1.0
- func = RectBivariateSpline(twss, twas, sail)
- data = func(xnew, ynew)
- data = np.where(data > 1.0, 1.0, data)
- print(data)
+ sail[i + 1, j + 1] = 1.0
+ func = RegularGridInterpolator(
+ (twss, twas), sail, method="cubic", bounds_error=False, fill_value=0.0
+ )
+ yy, xx = np.meshgrid(ynew, xnew, indexing="ij")
+ data = func((yy, xx))
+ data = np.clip(data, 0.0, 1.0)
ax[0].contour(
- np.radians(ynew), xnew, data, levels=[0.4], colors=cols[id], alpha=0.8
+ np.radians(xnew), ynew, data, levels=[0.4], colors=cols[id], alpha=0.8
)
c = ax[0].contourf(
- np.radians(ynew), xnew, data, levels=[0.4, 1.0], colors=cols[id], alpha=0.5
+ np.radians(xnew), ynew, data, levels=[0.4, 1.0], colors=cols[id], alpha=0.5
)
h1, _ = c.legend_elements()
h.append(h1[0])
ax[0].legend(h, VPP.sail_name, title=r"Sail Set", loc=1, bbox_to_anchor=(1.05, 0.7))
plt.tight_layout()
if save:
- plt.savefig(fname, dpi=96)
+ plt.savefig(fname)
else:
plt.show()
@@ -234,11 +281,11 @@ def polar(self, n=1, save=False):
[self],
n,
save,
- "Figure.png",
+ "Figure.pdf",
)
def SailChart(self, save=False):
sail_chart(self, save)
def polar_comp(self, other, n=1, save=False):
- polar_plot([self, other], n, save, "VPP_comparison.png")
+ polar_plot([self, other], n, save, "VPP_comparison.pdf")
diff --git a/src/VPPMod.py b/src/VPPMod.py
index 3f6abd5..73a265e 100644
--- a/src/VPPMod.py
+++ b/src/VPPMod.py
@@ -1,18 +1,11 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
-__author__ = "Marin Lauber"
-__copyright__ = "Copyright 2020, Marin Lauber"
-__license__ = "GPL"
-__version__ = "1.0.2"
-__email__ = "marinlauber@gmail.com"
-
import logging
-import warnings
+from concurrent.futures import ProcessPoolExecutor
import numpy as np
-from scipy.optimize import root
-from tqdm import trange
+from scipy.optimize import minimize
from src.AeroMod import AeroMod
from src.HydroMod import HydroMod
@@ -20,8 +13,108 @@
from src.YachtMod import Yacht as YachtClass
logger = logging.getLogger(__name__)
-debug_mode = logging.getLogger().getEffectiveLevel() == logging.DEBUG
-info_mode = logging.getLogger().getEffectiveLevel() == logging.INFO
+
+
+# Residual scales (N, N, N.m) so the three equilibrium equations have similar magnitude
+RESID_SCALE = np.array([1e3, 1e3, 1e4])
+# Tolerance on the scaled residuals for a point to count as an equilibrium
+RESID_TOL = 1e-4
+# Minimum flat (ORC 2026, 5.1.3)
+FLAT_MIN = 0.53
+
+
+def _equilibrium(x, aero, hydro, tws, twa):
+ """Scaled force/moment imbalance (Fx, Fy, Mx) at state x = [vb, phi, leeway, flat, red]."""
+ vb, phi, leeway, flat, red = x
+ Fxh, Fyh, Mxh = hydro.update(vb, phi, leeway, twa, tws)
+ Fxa, Fya, Mxa = aero.update(vb, phi, tws, twa, flat, red)
+ return np.array([Fxh - Fxa, Fyh - Fya, Mxh - Mxa]) / RESID_SCALE
+
+
+def _solve_point(aero, hydro, tws, twa, phi_max, guesses, fallbacks=(), red_bounds=(0.5, 2.0)):
+ """Find the fastest equilibrium at one (tws, twa) for the current sail set.
+
+ Maximises boat speed over [vb, phi, leeway, flat, red] subject to force and
+ moment equilibrium, with heel bounded by phi_max. Sails are flattened
+ (flat: 1.0 -> FLAT_MIN) and reefed (red within red_bounds) only as much
+ as is fast.
+ Every guess is tried and the fastest converged solution is kept; the
+ fallback guesses are only tried if none of them converge.
+
+ Returns
+ -------
+ ndarray or None
+ [vb (m/s), phi, leeway, flat, red], or None if no equilibrium exists
+ (e.g. a kite that cannot be carried at this heel limit).
+ """
+ bounds = [(0.0, None), (0.0, phi_max), (-2.0, 6.0), (FLAT_MIN, 1.0), red_bounds]
+ lo = np.array([b[0] for b in bounds], dtype=float)
+ hi = np.array([np.inf if b[1] is None else b[1] for b in bounds])
+ best = None
+ for k, x0 in enumerate([*guesses, *fallbacks]):
+ x0 = np.clip(x0, lo, hi)
+ if k >= len(guesses) and best is not None:
+ break
+ sol = minimize(
+ lambda x: -x[0], x0, method="SLSQP", bounds=bounds,
+ constraints={"type": "eq", "fun": _equilibrium, "args": (aero, hydro, tws, twa)},
+ options={"maxiter": 300, "ftol": 1e-10},
+ )
+ if not sol.success:
+ continue
+ if np.abs(_equilibrium(sol.x, aero, hydro, tws, twa)).max() > RESID_TOL:
+ continue
+ if best is None or sol.x[0] > best[0]:
+ best = sol.x
+ return best
+
+
+def _solve_row(yacht, tws, twa_range, n, phi_max, lim_up, lim_dn):
+ """Solve all TWAs for one TWS and sail set, warm-starting from the previous TWA.
+
+ Creates its own AeroMod/HydroMod so there is no shared mutable state.
+ This is a module-level function so it can be pickled by ProcessPoolExecutor.
+
+ Returns
+ -------
+ ndarray
+ Shape (len(twa_range), 5), rows [vb_kts, phi, leeway, flat, red];
+ skipped or infeasible points are left at 0.
+ """
+ aero = AeroMod(yacht)
+ hydro = HydroMod(yacht)
+ sail = yacht.sails[n + 1]
+ aero.sails[1] = sail
+ aero.up = sail.up
+ # upwind: RED 2 -> 1 reduces the jib, 1 -> 0.5 reefs the main;
+ # downwind: RED is the kite reef factor
+ red_bounds = (0.5, 2.0) if sail.up else (getattr(sail, "min_reef", 0.85), 1.0)
+ # kites carry their own (lower) heel limit, ORC ~21.5 deg
+ phi_max = min(phi_max, getattr(sail, "max_heel", phi_max))
+
+ row = np.zeros((len(twa_range), 5))
+ prev = None
+ for j, twa in enumerate(twa_range):
+ # don't do low twa with downwind sails (and vice versa)
+ if aero.up and twa >= lim_dn:
+ continue
+ if not aero.up and twa <= lim_up:
+ continue
+
+ guesses = [np.array([0.6 * tws, 10.0, 3.0, 1.0, 2.0])]
+ if prev is not None:
+ guesses.insert(0, prev)
+ fallbacks = [np.array([3.5, 20.0, 3.0, 1.0, 2.0]), np.array([0.4 * tws, 5.0, 3.0, 1.0, 2.0])]
+
+ x = _solve_point(aero, hydro, tws, twa, phi_max, guesses, fallbacks, red_bounds)
+ if x is None:
+ logger.debug("No equilibrium for %s at TWS %.1f TWA %.1f",
+ sail.name, tws / KNOTS_TO_MPS, twa)
+ continue
+ prev = x
+ row[j] = x * np.array([1.0 / KNOTS_TO_MPS, 1, 1, 1, 1])
+ return row
+
class VPP(object):
"""A VPP Class that run an analysis on a given Yacht."""
@@ -42,17 +135,9 @@ def __init__(self, Yacht):
# maximum allows heel angle
self.phi_max = 35.0
- # flag for later
self.upToDate = False
- # debbuging flag
- self.debbug = False
- if not self.debbug:
- warnings.filterwarnings(
- "ignore", "The iteration is not making good progress"
- )
-
- def set_analysis(self, tws_range, twa_range):
+ def set_analysis(self, tws_range, twa_range, phi_max=35.0):
"""
Sets the analysis range.
Parameters
@@ -63,19 +148,28 @@ def set_analysis(self, tws_range, twa_range):
A numpy.array with the different TWA to run the analysis at.
"""
- if tws_range.max() <= 35.0 and tws_range.min() >= 2.0:
- logging.info("Analysis set for TWS: " + str(tws_range))
- self.tws_range = tws_range * KNOTS_TO_MPS
- else:
- logging.info("Analysis only valid for TWS range : 2. < TWS < 35. knots.")
-
- if twa_range.max() <= 180.0 and twa_range.min() >= 0.0:
- self.twa_range = twa_range
- logging.info("Analysis set for TWA: " + str(self.twa_range))
- else:
- logging.info(
- "Analysis only valid for TWA range : 0. < TWA < 180. degrees."
+ self.phi_max = phi_max
+
+ if tws_range.size == 0:
+ raise ValueError("TWS range is empty. Ensure min and max TWS are not equal.")
+ if twa_range.size == 0:
+ raise ValueError("TWA range is empty. Ensure min and max TWA are not equal.")
+
+ if tws_range.min() < 2.0 or tws_range.max() > 35.0:
+ raise ValueError(
+ f"TWS range [{tws_range.min():.1f}, {tws_range.max():.1f}] "
+ f"is outside valid bounds [2.0, 35.0] knots."
)
+ self.tws_range = tws_range * KNOTS_TO_MPS
+ logger.debug("Analysis set for TWS: %s", tws_range)
+
+ if twa_range.min() < 0.0 or twa_range.max() > 180.0:
+ raise ValueError(
+ f"TWA range [{twa_range.min():.1f}, {twa_range.max():.1f}] "
+ f"is outside valid bounds [0.0, 180.0] degrees."
+ )
+ self.twa_range = twa_range
+ logger.debug("Analysis set for TWA: %s", self.twa_range)
# prepare storage array
self.Nsails = len(self.yacht.sails) - 1 # main not counted
@@ -86,161 +180,91 @@ def set_analysis(self, tws_range, twa_range):
self.yacht.sails[0].name + " + " + self.yacht.sails[n + 1].name
for n in range(self.Nsails)
]
- logging.info("Using sail quiver " + str(self.sail_name))
+ logging.debug("Using sail quiver ", self.sail_name)
# tws bounds for downwind/upwind sails
self.lim_up = 60.0
self.lim_dn = 135.0 if (self.Nsails != 1) else 200.0
- # minimzation bounds
- self.bnds = ((0, None), (0.0, self.phi_max), (-2.0, 6.0), (0.62, 1.0), (0, 2.0))
-
# flag for later
self.upToDate = True
- def Vb(self, x, grad):
- # this should not be used
- if grad.size > 0:
- grad = 0.0
- return self.vb0
-
- def SumForce(self, res, x, grad, twa_, tws_):
- # this should not be used
- if grad.size > 0:
- grad[:, :] = 0.0
-
- vb0 = x[0]
- phi0 = x[1]
- leeway = x[2]
- flat = x[3]
- red = x[4]
-
- Fxh, Fyh, Mxh = self.hydro.update(vb0, phi0, leeway)
- Fxa, Fya, Mxa = self.aero.update(vb0, phi0, tws_, twa_, flat, red)
-
- res[0] = Fxh - Fxa
- res[1] = Mxh - Mxa
- res[2] = Fyh - Fya
-
- return None
-
- def run(self):
+ def run(self, method="sequential", progress_callback=None):
"""
Run the analysis for the given analysis range.
+
+ At each point the boat speed is maximised over [vb, phi, leeway, flat, red]
+ subject to force/moment equilibrium and phi <= phi_max. Points where no
+ equilibrium exists (e.g. a kite that cannot be carried) are left at 0.
+
+ Parameters
+ ----------
+ method
+ "sequential" (default) or "parallel" (multiprocessing across TWS and
+ sail sets, identical results). "iterative" and "5dof" are accepted
+ as aliases of "sequential" for backward compatibility.
+ progress_callback
+ Optional callable(tws_index, tws_kts, n_tws) invoked after each
+ TWS wind speed is completed (sequential only).
"""
+ if method in ("iterative", "5dof"):
+ method = "sequential"
+ if method not in ("sequential", "parallel"):
+ raise ValueError(f"Unknown method '{method}'. Use 'sequential' or 'parallel'.")
if not self.upToDate:
- raise AssertionError("VPP run stop: no analysis set!")
+ raise RuntimeError("VPP run stop: no analysis set!")
- for i, tws in enumerate(self.tws_range):
- logging.info("Sailing in TWS : %.1f" % (tws / KNOTS_TO_MPS))
+ if method == "parallel":
+ return self._run_parallel()
+ n_tws = len(self.tws_range)
+ for i, tws in enumerate(self.tws_range):
+ logging.debug("Sailing in TWS : %.1f" % (tws / KNOTS_TO_MPS))
for n in range(self.Nsails):
- self.aero.sails[1] = self.yacht.sails[n + 1]
-
- logging.info(
- "Sail Config : " + self.aero.sails[0].name + " + " + self.aero.sails[1].name
+ self.store[i, :, n, :] = _solve_row(
+ self.yacht, tws, self.twa_range, n,
+ self.phi_max, self.lim_up, self.lim_dn,
)
-
- self.aero.up = self.aero.sails[1].up
-
- for j in trange(len(self.twa_range), disable=not info_mode):
- twa = self.twa_range[j]
-
- self.vb0 = 0.8 * tws
- self.phi0 = 0
- self.leeway0 = (
- 100.0 / twa
- if (twa > 1.0 and 100.0 / twa < 2 * tws)
- else 2 * tws
- )
- self.flat = 1.0
- self.red = 2.0
-
- # don't do low twa with downwind sails
- if (self.aero.up == True) and (twa >= self.lim_dn):
- continue
- if (self.aero.up == False) and (twa <= self.lim_up):
- continue
-
- sol = root(
- self.resid,
- [self.vb0, self.phi0, self.leeway0],
- args=(twa, tws),
- method="lm",
- )
- self.vb0, self.phi0, self.leeway0 = res = sol.x
-
- if not sol.success:
- logger.debug(sol.message)
-
- # # contraints
- # con1 = {'type': 'eq', 'fun': self.Fx, 'args': (twa, tws)}
- # con2 = {'type': 'eq', 'fun': self.Fy, 'args': (twa, tws)}
- # con3 = {'type': 'eq', 'fun': self.Mx, 'args': (twa, tws)}
- # con = (con1, con2, con3)
-
- # # initial guess at this twa/tws
- # x0 = [self.vb0, self.phi0, self.leeway0, self.flat, self.red]
-
- # # minimize
- # sol = minimize(self.objective, args=(twa, tws), x0=x0, method='SLSQP',
- # constraints=con, bounds=self.bnds, tol=1e-2,
- # options={"maxiter": 100, "disp": debug_mode})
-
- # # get result
- # self.vb0, self.phi0, self.leeway0, self.flat, self.red = res = sol.x
-
- # logging.info(
- # "Equilibrium residuals (Fx, Fy, Mx): (%.4f, %.4f, %.4f)" % (self.resid(sol.x, twa, tws))
- # )
-
- # store data for later
- self.store[i, j, n, : len(res)] = (
- res[:] * np.array([1.0 / KNOTS_TO_MPS, 1, 1, 1, 1])[: len(res)]
- )
+ if progress_callback:
+ progress_callback(i, tws / KNOTS_TO_MPS, n_tws)
logging.info("Optimization successful.")
- def resid(self, x0, twa, tws):
+ def _run_parallel(self):
+ """Run the row solver in parallel across TWS and sail sets."""
+ work = [(i, n) for i in range(len(self.tws_range)) for n in range(self.Nsails)]
+ with ProcessPoolExecutor() as pool:
+ rows = pool.map(
+ _solve_row,
+ *zip(*[(self.yacht, self.tws_range[i], self.twa_range, n,
+ self.phi_max, self.lim_up, self.lim_dn) for i, n in work])
+ )
+ for (i, n), row in zip(work, rows):
+ self.store[i, :, n, :] = row
+
+ logging.info("Parallel optimization successful.")
+
+ def resid(self, x0, twa, tws, flat=1.0, red=2.0):
"""
Computes the residuals of the force/moment equilibrium at the given state.
Parameters
----------
x0
- A numpy array of the variables (DOF).
+ A numpy array of the variables (DOF): vb (m/s), phi, leeway.
twa
A float of the TWA at which to compute the residuals.
tws
A float of the TWs at which to compute the residuals.
+ flat
+ Sail flattening factor (0.62 to 1.0). Default 1.0 (no flattening).
+ red
+ Reef/reduction factor. Default 2.0 (full sails, no reef/furl).
Returns
-------
Numpy.Array
- Residuals on each DOF
+ Scaled (Fx, Fy, Mx) imbalance, see RESID_SCALE.
"""
-
- vb0 = x0[0]
- phi0 = x0[1] # min(x0[1], self.phi_max)
- leeway = x0[2]
- flat = 1.0 # x0[3]
- red = 1.0 # x0[4]
-
- Fxh, Fyh, Mxh = self.hydro.update(vb0, phi0, leeway)
- Fxa, Fya, Mxa = self.aero.update(vb0, phi0, tws, twa, flat, 2.0)
-
- return [(Fxh - Fxa) ** 2, (Mxh - Mxa) ** 2, (Fyh - Fya) ** 2]
-
- @staticmethod
- def objective(x0):
- return -x0[0]
-
- def Fx(self, x0, twa, tws):
- return self.resid(x0, twa, tws)[0]
-
- def Fy(self, x0, twa, tws):
- return self.resid(x0, twa, tws)[1]
-
- def Mx(self, x0, twa, tws):
- return self.resid(x0, twa, tws)[2]
+ return _equilibrium([x0[0], x0[1], x0[2], flat, red], self.aero, self.hydro, tws, twa)
def results(self):
"""
@@ -257,8 +281,8 @@ def results(self):
def write(self, fname):
json_write(self.results(), fname)
- def polar(self, n=1, save=False, fname="Polars.png"):
+ def polar(self, n=1, save=False, fname="Polars.pdf"):
polar_plot([self], n, save, fname)
- def SailChart(self, save=False, fname="SailChart.png"):
+ def SailChart(self, save=False, fname="SailChart.pdf"):
sail_chart(self, save, fname)
diff --git a/src/YachtMod.py b/src/YachtMod.py
index 0905d67..0628263 100644
--- a/src/YachtMod.py
+++ b/src/YachtMod.py
@@ -2,13 +2,36 @@
# -*- coding: utf-8 -*-
import numpy as np
-from src.UtilsMod import build_interp_func,json_read,json_write
from scipy import interpolate
+from src.UtilsMod import build_interp_func, json_read, json_write
+
+
+def _zero_cr(fn):
+ """Zero residuary resistance (for appendages without Cr data)."""
+ return 0.0
+
+
class Appendage(object):
def __init__(self, type, chord, area, span, vol, ce):
"""
-
+ Base class for underwater appendages (keels, rudders, bulbs).
+
+ Parameters
+ ----------
+ type : str
+ Appendage type (``"keel"``, ``"rudder"``, or ``"bulb"``).
+ Controls residuary resistance coefficient lookup.
+ chord : float
+ Mean chord length (m).
+ area : float
+ Planform (wetted) area (m^2).
+ span : float
+ Appendage span (m). Set to 0 for non-lifting bodies (bulbs).
+ vol : float
+ Displaced volume (m^3). Used for residuary resistance calculation.
+ ce : float
+ Centre of effort — depth below waterline (m, positive downward).
"""
self.type = type
self.chord = chord
@@ -17,22 +40,21 @@ def __init__(self, type, chord, area, span, vol, ce):
self.ce = ce
self.vol = vol
self.span = span
- self.Ar = self.span / self.area
+ # geometric aspect ratio, doubled for the reflection in the hull
+ self.Ar = self.span**2 / self.area
+ self.Ae = 2.0 * self.Ar
- # lift-curve slope and coefficient of lift area
- self.dclda = 2 * np.pi / (1.0 + 0.5 * self.Ar)
+ # lift-curve slope (lifting line) and coefficient of lift area
+ self.dclda = 2 * np.pi * self.Ae / (self.Ae + 2.0)
self.cla = self.dclda * self.area
self.teff = 1.8 * self.span
# no residuary resistance
- self._interp_cr = lambda fn: 0.0
+ self._interp_cr = _zero_cr
if self.type == "keel":
self._interp_cr = build_interp_func("rrk")
if self.type == "bulb":
self._interp_cr = build_interp_func("rrk", i=2)
- def _cl(self, leeway):
- return self.dclda * np.radians(leeway)
-
def _cr(self, fn):
return self._interp_cr(max(0.0, min(fn, 0.6)))
@@ -49,8 +71,27 @@ def _print(self):
class Keel(Appendage):
- def __init__(self, Cu=1, Cl=1, Span=0):
+ def __init__(self, Cu=1, Cl=1, Span=0, Tc_ratio=0.20):
+ """
+ Trapezoidal keel appendage.
+
+ Computes area, mean chord, span, volume, and centre of effort from
+ the root and tip chord lengths assuming a trapezoidal planform.
+
+ Parameters
+ ----------
+ Cu : float, optional
+ Root (upper) chord length (m). Default is 1.
+ Cl : float, optional
+ Tip (lower) chord length (m). Default is 1.
+ Span : float, optional
+ Keel span (m). Default is 0.
+ Tc_ratio : float, optional
+ Thickness-to-chord ratio, sets the form factor (ORC caps it at
+ 0.18). Default 0.20.
+ """
self.type = "keel"
+ self.tc_ratio = Tc_ratio
self.cu = Cu
self.cl = Cl
self.span = Span
@@ -63,8 +104,23 @@ def __init__(self, Cu=1, Cl=1, Span=0):
class Rudder(Appendage):
- def __init__(self, Cu=1, Cl=1, Span=0):
+ def __init__(self, Cu=1, Cl=1, Span=0, Tc_ratio=0.10):
+ """
+ Trapezoidal rudder appendage.
+
+ Parameters
+ ----------
+ Cu : float, optional
+ Root (upper) chord length (m). Default is 1.
+ Cl : float, optional
+ Tip (lower) chord length (m). Default is 1.
+ Span : float, optional
+ Rudder span (m). Default is 0.
+ Tc_ratio : float, optional
+ Thickness-to-chord ratio. Default 0.10.
+ """
self.type = "rudder"
+ self.tc_ratio = Tc_ratio
self.cu = Cu
self.cl = Cl
self.span = Span
@@ -76,35 +132,138 @@ def __init__(self, Cu=1, Cl=1, Span=0):
super().__init__(self.type, self.chord, self.area, self.span, self.vol, self.ce)
def _Ksff(self, phi):
- # rudder influence gradually ramped up to twice its area
- return np.where(phi <= 30, 1 + 0.5 * (1 - np.cos(phi / 30.0 * np.pi)), 1.0)
+ # rudder lift area ramps sinusoidally from 0 upright to twice its
+ # area at 30 deg of heel (ORC since 2018)
+ return np.where(phi <= 30, 1 - np.cos(phi / 30.0 * np.pi), 2.0)
class Bulb(Appendage):
- def __init__(self, Chord, area, vol, CG):
+ def __init__(self, Chord, area, vol, CG, Tc_ratio=0.25):
+ """
+ Keel bulb appendage.
+
+ A non-lifting body attached to the keel tip. Contributes wetted
+ surface area and residuary resistance but no side force.
+
+ Parameters
+ ----------
+ Chord : float
+ Bulb chord length (m).
+ area : float
+ Wetted surface area (m^2).
+ vol : float
+ Displaced volume (m^3).
+ CG : float
+ Centre of gravity depth below waterline (m).
+ Tc_ratio : float, optional
+ Thickness-to-chord ratio (ORC caps it at 0.25). Default 0.25.
+ """
self.type = "bulb"
+ self.tc_ratio = Tc_ratio
self.chord = Chord
self.area = area
self.ce = CG
self.vol = vol
self.cof = 1.50
super().__init__(self.type, self.chord, self.area, 0.0, self.vol, self.ce)
+ # area is already the wetted area, and a bulb carries no side force
+ self.wsa = self.area
+ self.cla = 0.0
+
+
+class ShortKeel(Appendage):
+ def __init__(self, Length=1.0, Depth=0.5, Tc_ratio=0.15):
+ """
+ Short/integrated keel appendage.
+
+ For traditional or hull-integrated keels with low aspect ratio.
+ Uses the Jones low-AR lift formula instead of Prandtl correction,
+ higher form drag, and zero appendage residuary resistance (hull
+ resistance surfaces capture it).
+
+ Parameters
+ ----------
+ Length : float
+ Fore-aft keel length along hull bottom (m).
+ Depth : float
+ Keel depth below canoe body (m).
+ Tc_ratio : float
+ Average thickness-to-chord ratio. Default 0.15.
+ """
+ self.type = "short_keel"
+ self.length = Length
+ self.depth = Depth
+ self.tc_ratio = Tc_ratio
+ self.span = Depth
+ self.chord = Length
+ self.area = Length * Depth
+ self.ce = -Depth / 2.0
+ self.cof = 1.4 + 0.5 * Tc_ratio
+ self.vol = Length * Depth * Length * Tc_ratio * 0.7
+ super().__init__(self.type, self.chord, self.area, self.span, self.vol, self.ce)
+ # Override Prandtl lift model with Jones low-AR formula
+ self.dclda = np.pi * self.Ae / 2.0
+ self.cla = self.dclda * self.area
+ self.teff = 1.5 * self.span
class Yacht(object):
def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax,
- Amax, Mass, Loa, Boa, Ff, Fa, App=[], Sails=[]):
+ Amax, Mass, Loa, Boa, Ff, Fa, App=[], Sails=[], GZ=None, crew_weight=None,
+ roughness=0.0, Hs=0.0, Ts=0.0, wave_direction=None):
"""
- Name : Name of particular design
- Lwl : waterline length (m)
- Vol : volume of canoe body (m^3)
- Bwl : waterline beam (m)
- Tc : Canoe body draft (m)
- WSA : Wetted surface area (m^2)
- Tmax : Maximum draft of yacht (m)
- Amax : Max section area (m^2)
- Mass : total mass of the yacht (kg)
- App : appendages (Appendages object as list, i.e [Keel(...)] )
+ Yacht hull and rig definition.
+
+ Parameters
+ ----------
+ Name : str
+ Name of the yacht design.
+ Lwl : float
+ Waterline length (m).
+ Vol : float
+ Displaced volume of the canoe body (m^3).
+ Bwl : float
+ Waterline beam (m).
+ Tc : float
+ Canoe body draft (m).
+ WSA : float
+ Wetted surface area of the canoe body (m^2).
+ Tmax : float
+ Maximum draft including keel (m).
+ Amax : float
+ Maximum cross-section area (m^2).
+ Mass : float
+ Total displacement mass including keel (kg).
+ Loa : float
+ Length overall (m).
+ Boa : float
+ Beam overall (m).
+ Ff : float
+ Freeboard height at the bow (m).
+ Fa : float
+ Freeboard height at the stern (m).
+ App : list of Appendage, optional
+ Underwater appendages (keels, rudders, bulbs). Default is [].
+ Sails : list of Sail, optional
+ Sail inventory. Default is [].
+ GZ : dict, optional
+ Righting arm curve as ``{"Heel": [...], "GZ": [...]}``.
+ Heel in degrees, GZ in metres. If *None*, loads from
+ ``righting_moment.json`` (backward compatible).
+ crew_weight : float, optional
+ Total crew weight (kg). If *None*, uses empirical formula
+ ``25.8 * Lwl ** 1.4262``.
+ roughness : float, optional
+ Mean hull roughness height (m) for the optional ITTC 1978
+ roughness allowance. Default 0.0 (hydrodynamically smooth, as in
+ the ORC VPP). The allowance was calibrated on ships and adds
+ ~80% to the friction of a 12 m yacht at 150e-6, so use with care.
+ Hs : float, optional
+ Significant wave height (m). Default 0.0 (flat water).
+ Ts : float, optional
+ Modal wave period (s). Default 0.0.
+ wave_direction : float or None, optional
+ Wave direction (degrees). If None, waves align with wind.
"""
self.g = 9.81
self.Name = Name
@@ -125,7 +284,7 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax,
self.Rm4 = 0.43 * self.tmax
# standard crew weight
- self.cw = 25.8 * self.l ** 1.4262
+ self.cw = crew_weight if crew_weight is not None else 25.8 * self.l ** 1.4262
self.carm = 0.8 * self.bmax # must be average of rail where crew sits
# rough estimate of projected area of the hull
@@ -133,10 +292,19 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax,
self.cla = self.area_proj * 2 * np.pi / (1.0 + 0.5 * self.area_proj / self.tc)
self.teff = 2.07 * self.tc
+ # hull roughness and wave parameters
+ self.roughness = roughness
+ self.Hs = Hs
+ self.Ts = Ts
+ self.wave_direction = wave_direction
+
# appendages object
self.appendages = App
self.sails = Sails
+ # GZ data (righting arm curve)
+ self._gz_data = GZ
+
# righting moment interpolation function
self._interp_rm = self._build_rm_interp()
@@ -145,7 +313,10 @@ def __init__(self, Name, Lwl, Vol, Bwl, Tc, WSA, Tmax,
def _build_rm_interp(self):
- a = json_read('righting_moment')
+ if self._gz_data is not None:
+ a = self._gz_data
+ else:
+ a = json_read('righting_moment')
return interpolate.interp1d(np.array(a["Heel"]), np.array(a["GZ"]),
kind="linear", fill_value="extrapolate")
diff --git a/src/api.py b/src/api.py
index 7d48b23..006ec15 100644
--- a/src/api.py
+++ b/src/api.py
@@ -13,7 +13,7 @@
sys.path.append(os.path.realpath("."))
from src.SailMod import Jib, Kite, Main
from src.VPPMod import VPP
-from src.YachtMod import Keel, Rudder, Yacht
+from src.YachtMod import Keel, Rudder, ShortKeel, Yacht
app = Flask(__name__)
@@ -28,16 +28,34 @@ def ping():
def data_to_vpp(data: Dict[str, Any]) -> VPP:
- keel = Keel(
- Cu=float(data["keel"]["Cu"]),
- Cl=float(data["keel"]["Cl"]),
- Span=float(data["keel"]["Span"])
- )
+ keel_data = data["keel"]
+ keel_type = keel_data.get("type", "fin")
+ # Also detect from keys if type is missing or inconsistent
+ if keel_type == "short" or "Length" in keel_data:
+ keel = ShortKeel(
+ Length=float(keel_data["Length"]),
+ Depth=float(keel_data["Depth"]),
+ Tc_ratio=float(keel_data.get("Tc_ratio", 0.15)),
+ )
+ else:
+ keel = Keel(
+ Cu=float(keel_data["Cu"]),
+ Cl=float(keel_data["Cl"]),
+ Span=float(keel_data["Span"]),
+ )
rudder = Rudder(
Cu=float(data["rudder"]["Cu"]),
Cl=float(data["rudder"]["Cu"]),
Span=float(data["rudder"]["Span"])
)
+ # Environment parameters
+ roughness = float(data.get("roughness", 0.0))
+ Hs = float(data.get("Hs", 0.0))
+ Ts = float(data.get("Ts", 0.0))
+ wave_direction = data.get("wave_direction")
+ if wave_direction is not None:
+ wave_direction = float(wave_direction)
+
yacht = Yacht(
Name=data["yacht"]["Name"],
Lwl=float(data["yacht"]["Lwl"]),
@@ -52,6 +70,10 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP:
Fa=float(data["yacht"]["Fa"]),
Boa=float(data["yacht"]["Boa"]),
Loa=float(data["yacht"]["Loa"]),
+ roughness=roughness,
+ Hs=Hs,
+ Ts=Ts,
+ wave_direction=wave_direction,
App=[keel, rudder],
Sails=[
Main(
@@ -60,6 +82,10 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP:
E=float(data["main"]["E"]),
Roach=float(data["main"]["Roach"]),
BAD=float(data["main"]["BAD"]),
+ data_source=data.get("data_source", "orc"),
+ cl_data=data["main"].get("cl_data"),
+ cd_data=data["main"].get("cd_data"),
+ sail_type=data["main"].get("sail_type"),
),
Jib(
name=data["jib"]["Name"],
@@ -67,11 +93,19 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP:
J=float(data["jib"]["J"]),
LPG=float(data["jib"]["LPG"]),
HBI=float(data["jib"]["HBI"]),
+ data_source=data.get("data_source", "orc"),
+ cl_data=data["jib"].get("cl_data"),
+ cd_data=data["jib"].get("cd_data"),
+ sail_type=data["jib"].get("sail_type"),
),
Kite(
name=data["kite"]["Name"],
area=float(data["kite"]["area"]),
vce=float(data["kite"]["vce"]),
+ data_source=data.get("data_source", "orc"),
+ cl_data=data["kite"].get("cl_data"),
+ cd_data=data["kite"].get("cd_data"),
+ sail_type=data["kite"].get("sail_type"),
),
],
)
@@ -81,17 +115,26 @@ def data_to_vpp(data: Dict[str, Any]) -> VPP:
tws_range=np.array(data["tws_range"]),
twa_range=np.array(data["twa_range"]),
)
- return vpp
+ return vpp, data.get("method", "sequential")
+
@app.route("/api/vpp/", methods=["POST"])
def makevppresults():
data = request.get_json()
-
- # TODO: Support multiple implementations of different sails: require API design
- # TODO: Error handling incorrect ranges
-
- vpp = data_to_vpp(data)
- vpp.run()
+ if data is None:
+ return jsonify({"error": "Request body must be valid JSON."}), 400
+
+ try:
+ vpp, method = data_to_vpp(data)
+ except (KeyError, TypeError, ValueError) as e:
+ logging.warning("Invalid VPP input: %s", e)
+ return jsonify({"error": f"Invalid input: {e}"}), 400
+
+ try:
+ vpp.run(method=method)
+ except Exception as e:
+ logging.exception("VPP simulation failed")
+ return jsonify({"error": f"Simulation failed: {e}"}), 500
return jsonify(vpp.results())
diff --git a/tests/conftest.py b/tests/conftest.py
new file mode 100644
index 0000000..da2faa6
--- /dev/null
+++ b/tests/conftest.py
@@ -0,0 +1,2 @@
+import matplotlib
+matplotlib.use("Agg")
diff --git a/tests/test_aero.py b/tests/test_aero.py
new file mode 100644
index 0000000..7e4718c
--- /dev/null
+++ b/tests/test_aero.py
@@ -0,0 +1,150 @@
+"""Tests for AeroMod — wind triangle and coefficient caching."""
+
+import numpy as np
+import pytest
+
+
+class TestWindTriangleCache:
+ """Verify that wind_triangle uses lru_cache."""
+
+ def test_wind_triangle_is_cached(self):
+ from src.AeroMod import wind_triangle
+
+ # lru_cache-decorated functions have cache_info()
+ assert hasattr(wind_triangle, "cache_info"), "wind_triangle should be lru_cache-decorated"
+ wind_triangle.cache_clear()
+ wind_triangle(10.0, 90.0, 5.0)
+ wind_triangle(10.0, 90.0, 5.0)
+ info = wind_triangle.cache_info()
+ assert info.hits == 1
+ assert info.misses == 1
+
+ def test_cache_returns_same_result(self):
+ from src.AeroMod import wind_triangle
+
+ wind_triangle.cache_clear()
+ r1 = wind_triangle(10.0, 45.0, 6.0)
+ r2 = wind_triangle(10.0, 45.0, 6.0)
+ assert r1 == r2
+
+
+class TestSailCoefficientCalls:
+ """Verify that _get_coeffs doesn't call sail.cl() redundantly."""
+
+ def test_get_coeffs_calls_cl_once_per_sail(self):
+ """Each sail's cl(awa) should be called at most once per _get_coeffs()."""
+ from unittest.mock import MagicMock, patch
+ from src.AeroMod import AeroMod
+
+ # Create a mock yacht with minimal structure
+ mock_sail = MagicMock()
+ mock_sail.cl = MagicMock(return_value=1.0)
+ mock_sail.cd = MagicMock(return_value=0.1)
+ mock_sail.area = 30.0
+ mock_sail.bk = 1.0
+ mock_sail.kp = 1.0
+ mock_sail.type = "main"
+
+ aero = object.__new__(AeroMod)
+ aero.sails = [mock_sail]
+ aero.area = 30.0
+ aero.awa = 30.0
+ aero.flat = 1.0
+ aero.fcdmult = lambda flat: 1.0
+
+ # Provide _heff so CE computation works
+ aero._heff = lambda awa: 10.0
+
+ aero._get_coeffs()
+
+ # cl should be called exactly once per sail (not twice as before)
+ assert mock_sail.cl.call_count == 1, (
+ f"sail.cl() called {mock_sail.cl.call_count} times, expected 1"
+ )
+ assert mock_sail.cd.call_count == 1, (
+ f"sail.cd() called {mock_sail.cd.call_count} times, expected 1"
+ )
+
+
+class TestWindTriangle:
+ """Verify analytical wind triangle: given TWS, TWA, VB → AWS, AWA."""
+
+ @pytest.mark.parametrize(
+ "tws, twa, vb, expected_aws, expected_awa",
+ [
+ # Beam reach: TWA=90°, VB=5, TWS=10
+ # AWS = sqrt(10² + 5² + 2·10·5·cos(90°)) = sqrt(125) ≈ 11.18
+ # AWA = arccos((10·cos(90°) + 5) / 11.18) = arccos(5/11.18) ≈ 63.43°
+ (10.0, 90.0, 5.0, np.sqrt(125), np.degrees(np.arccos(5.0 / np.sqrt(125)))),
+ # Close-hauled: TWA=45°, VB=6, TWS=12
+ (
+ 12.0,
+ 45.0,
+ 6.0,
+ np.sqrt(12**2 + 6**2 + 2 * 12 * 6 * np.cos(np.radians(45))),
+ np.degrees(
+ np.arccos(
+ (12 * np.cos(np.radians(45)) + 6)
+ / np.sqrt(12**2 + 6**2 + 2 * 12 * 6 * np.cos(np.radians(45)))
+ )
+ ),
+ ),
+ # Dead downwind: TWA=180°, VB=4, TWS=10
+ # AWS = sqrt(100 + 16 - 80) = sqrt(36) = 6
+ # AWA = arccos((10·cos(180°) + 4) / 6) = arccos(-6/6) = 180°
+ (10.0, 180.0, 4.0, 6.0, 180.0),
+ # No boat speed: VB=0 → AWA=TWA, AWS=TWS
+ (10.0, 90.0, 0.0, 10.0, 90.0),
+ # Boat speed equals TWS, broad reach
+ (8.0, 120.0, 8.0,
+ np.sqrt(8**2 + 8**2 + 2 * 8 * 8 * np.cos(np.radians(120))),
+ np.degrees(
+ np.arccos(
+ (8 * np.cos(np.radians(120)) + 8)
+ / np.sqrt(8**2 + 8**2 + 2 * 8 * 8 * np.cos(np.radians(120)))
+ )
+ )),
+ ],
+ ids=["beam_reach", "close_hauled", "dead_downwind", "no_boat_speed", "broad_reach"],
+ )
+ def test_wind_triangle_analytical(self, tws, twa, vb, expected_aws, expected_awa):
+ """AWA and AWS must match law-of-cosines closed-form solution."""
+ from src.AeroMod import wind_triangle
+
+ awa, aws = wind_triangle(tws, twa, vb)
+ assert aws == pytest.approx(expected_aws, abs=1e-10)
+ assert awa == pytest.approx(expected_awa, abs=1e-10)
+
+ def test_no_fsolve_import_used(self):
+ """The analytical path must not import or call fsolve."""
+ from src.AeroMod import wind_triangle
+ import inspect
+
+ source = inspect.getsource(wind_triangle)
+ assert "fsolve" not in source
+
+
+class TestHeeledWindTriangle:
+ """ORC 7.1: heel and the log wind gradient in the wind triangle."""
+
+ def test_gradient_reference_height(self):
+ from src.AeroMod import Z_REF, wind_gradient
+
+ assert wind_gradient(Z_REF) == pytest.approx(1.0)
+ assert wind_gradient(5.0) < 1.0 < wind_gradient(20.0)
+ # ORC log profile, z0 = 0.005 m
+ assert wind_gradient(5.0) == pytest.approx(np.log(1000.0) / np.log(2000.0))
+
+ def test_heel_reduces_cross_wind(self):
+ from src.AeroMod import wind_triangle
+
+ awa0, aws0 = wind_triangle(10.0, 45.0, 3.0)
+ awa, aws = wind_triangle(10.0, 45.0, 3.0, 30.0)
+ vy = 10.0 * np.sin(np.radians(45.0)) * np.cos(np.radians(30.0))
+ vx = 10.0 * np.cos(np.radians(45.0)) + 3.0
+ assert aws == pytest.approx(np.hypot(vx, vy))
+ assert awa == pytest.approx(np.degrees(np.arctan2(vy, vx)))
+ assert awa < awa0 and aws < aws0
+ # dead downwind heel has no effect
+ heeled = wind_triangle(10.0, 180.0, 3.0, 20.0)
+ assert heeled == pytest.approx(wind_triangle(10.0, 180.0, 3.0))
diff --git a/tests/test_api.py b/tests/test_api.py
index 53aab60..87d2fc7 100644
--- a/tests/test_api.py
+++ b/tests/test_api.py
@@ -4,6 +4,9 @@
from src.api import app
+HEADERS = {"content-type": "application/json", "Accept-Charset": "UTF-8"}
+
+
def test_ping_route():
client = app.test_client()
response = client.get("/ping")
@@ -11,29 +14,27 @@ def test_ping_route():
assert response.data.decode("utf-8") == "Pong! The server is up and running."
-def make_yd41():
- yacht = dict(
- {
- "Name": "YD41",
- "Lwl": 11.90,
- "Vol": 6.05,
- "Bwl": 3.18,
- "Tc": 0.4,
- "WSA": 28.20,
- "Tmax": 2.30,
- "Amax": 1.051,
- "Mass": 6500,
- "Ff": 1.5,
- "Fa": 1.5,
- "Boa": 4.2,
- "Loa": 12.5,
- }
- )
- keel = dict({"Cu": 1.00, "Cl": 0.78, "Span": 1.90})
- rudder = dict({"Cu": 0.48, "Cl": 0.22, "Span": 1.15})
- main = dict({"Name": "MN1", "P": 16.60, "E": 5.60, "Roach": 0.1, "BAD": 1.0})
- jib = dict({"Name": "J1", "I": 16.20, "J": 5.10, "LPG": 5.40, "HBI": 1.8})
- kite = dict({"Name": "A2", "area": 150.0, "vce": 9.55})
+def make_yd41(**overrides):
+ yacht = {
+ "Name": "YD41",
+ "Lwl": 11.90,
+ "Vol": 6.05,
+ "Bwl": 3.18,
+ "Tc": 0.4,
+ "WSA": 28.20,
+ "Tmax": 2.30,
+ "Amax": 1.051,
+ "Mass": 6500,
+ "Ff": 1.5,
+ "Fa": 1.5,
+ "Boa": 4.2,
+ "Loa": 12.5,
+ }
+ keel = {"Cu": 1.00, "Cl": 0.78, "Span": 1.90}
+ rudder = {"Cu": 0.48, "Cl": 0.22, "Span": 1.15}
+ main = {"Name": "MN1", "P": 16.60, "E": 5.60, "Roach": 0.1, "BAD": 1.0}
+ jib = {"Name": "J1", "I": 16.20, "J": 5.10, "LPG": 5.40, "HBI": 1.8}
+ kite = {"Name": "A2", "area": 150.0, "vce": 9.55}
tws_range = np.arange(4.0, 7.0, 2.0).tolist()
twa_range = np.linspace(30.0, 180.0, 5).tolist()
@@ -48,17 +49,156 @@ def make_yd41():
"tws_range": tws_range,
"twa_range": twa_range,
}
+ d.update(overrides)
return d
+def post_vpp(data):
+ client = app.test_client()
+ return client.post("/api/vpp/", data=json.dumps(data), headers=HEADERS)
+
+
def test_vpp_simulation():
d = make_yd41()
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+
+def test_empty_tws_range_returns_400():
+ d = make_yd41(tws_range=[])
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "empty" in response.json["error"].lower()
+
+
+def test_empty_twa_range_returns_400():
+ d = make_yd41(twa_range=[])
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "empty" in response.json["error"].lower()
+
+
+def test_tws_out_of_range_returns_400():
+ d = make_yd41(tws_range=[1.0, 5.0])
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "outside valid bounds" in response.json["error"]
+
- json_string = json.dumps(d)
- headers = {"content-type": "application/json", "Accept-Charset": "UTF-8"}
+def test_tws_above_range_returns_400():
+ d = make_yd41(tws_range=[10.0, 40.0])
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "outside valid bounds" in response.json["error"]
+
+def test_twa_out_of_range_returns_400():
+ d = make_yd41(twa_range=[-10.0, 90.0])
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "outside valid bounds" in response.json["error"]
+
+
+def test_missing_field_returns_400():
+ d = make_yd41()
+ del d["keel"]
+ response = post_vpp(d)
+ assert response.status_code == 400
+ assert "error" in response.json
+
+
+def test_invalid_json_returns_400():
client = app.test_client()
- response = client.post("/api/vpp/", data=json_string, headers=headers)
+ response = client.post("/api/vpp/", data="not json", headers=HEADERS)
+ assert response.status_code == 400
+
+
+def test_short_keel_with_type_field():
+ """Short keel payload with explicit type='short' should succeed."""
+ d = make_yd41()
+ d["keel"] = {"type": "short", "Length": 1.2, "Depth": 0.90, "Tc_ratio": 0.15}
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+
+def test_short_keel_without_type_field():
+ """Short keel payload detected from keys alone (no type field)."""
+ d = make_yd41()
+ d["keel"] = {"Length": 1.2, "Depth": 0.90, "Tc_ratio": 0.15}
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+
+def test_fin_keel_with_type_field():
+ """Fin keel payload with explicit type='fin' should succeed."""
+ d = make_yd41()
+ d["keel"] = {"type": "fin", "Cu": 1.00, "Cl": 0.78, "Span": 1.90}
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+
+def test_api_legacy_5dof_method():
+ """API still accepts the legacy method='5dof'."""
+ d = make_yd41()
+ d["method"] = "5dof"
+ response = post_vpp(d)
+ assert response.status_code == 200
+ results = np.array(response.json["results"])
+ assert np.any(results[:, :, :, 0] > 0), "5-DOF should produce non-zero speeds"
+
+
+def test_api_data_source():
+ """API accepts data_source parameter."""
+ d = make_yd41()
+ d["data_source"] = "orc"
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+
+def test_api_sail_type_sym_kite():
+ """API accepts sail_type in kite section and produces results."""
+ d = make_yd41()
+ d["kite"]["sail_type"] = "sym_kite"
+ response = post_vpp(d)
+ assert response.status_code == 200
+ results = np.array(response.json["results"])
+ assert np.any(results[:, :, :, 0] > 0)
+
+
+def test_api_sail_type_low_performance():
+ """API accepts low-performance sail_type for main and jib."""
+ d = make_yd41()
+ d["main"]["sail_type"] = "main_low"
+ d["jib"]["sail_type"] = "jib_low"
+ response = post_vpp(d)
+ assert response.status_code == 200
+ results = np.array(response.json["results"])
+ assert np.any(results[:, :, :, 0] > 0)
+
+
+def test_api_roughness():
+ """API accepts roughness parameter and rough hull is slower."""
+ d_smooth = make_yd41(roughness=0.0)
+ d_rough = make_yd41(roughness=500e-6)
+ r_smooth = post_vpp(d_smooth)
+ r_rough = post_vpp(d_rough)
+ assert r_smooth.status_code == 200
+ assert r_rough.status_code == 200
+ speeds_smooth = np.array(r_smooth.json["results"])[:, :, :, 0].max()
+ speeds_rough = np.array(r_rough.json["results"])[:, :, :, 0].max()
+ assert speeds_smooth > speeds_rough, "Rough hull should be slower"
+
+
+def test_api_wave_params():
+ """API accepts Hs and Ts parameters."""
+ d = make_yd41(Hs=1.0, Ts=6.0)
+ response = post_vpp(d)
+ assert response.status_code == 200
+
+def test_api_wave_direction():
+ """API accepts wave_direction parameter."""
+ d = make_yd41(Hs=1.0, Ts=6.0, wave_direction=45.0)
+ response = post_vpp(d)
assert response.status_code == 200
diff --git a/tests/test_hydro.py b/tests/test_hydro.py
new file mode 100644
index 0000000..2de97b2
--- /dev/null
+++ b/tests/test_hydro.py
@@ -0,0 +1,185 @@
+"""Tests for HydroMod — roughness and wave resistance."""
+
+import numpy as np
+
+from src.HydroMod import HydroMod
+from src.SailMod import Jib, Kite, Main
+from src.YachtMod import Keel, Rudder, Yacht
+
+
+def _make_yacht(**kwargs):
+ """Create a YD41-like yacht with optional overrides."""
+ defaults = dict(
+ Name="TestYacht",
+ Lwl=11.90,
+ Vol=6.05,
+ Bwl=3.18,
+ Tc=0.4,
+ WSA=28.20,
+ Tmax=2.30,
+ Amax=1.051,
+ Mass=6500,
+ Ff=1.5,
+ Fa=1.5,
+ Boa=4.2,
+ Loa=12.5,
+ App=[Keel(Cu=1.00, Cl=0.78, Span=1.90), Rudder(Cu=0.48, Cl=0.22, Span=1.15)],
+ Sails=[
+ Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ Kite("A2", area=150.0, vce=9.55),
+ ],
+ )
+ defaults.update(kwargs)
+ return Yacht(**defaults)
+
+
+class TestRoughness:
+ def test_roughness_increases_resistance(self):
+ """Higher roughness should increase total resistance."""
+ yacht_smooth = _make_yacht(roughness=0.0)
+ yacht_rough = _make_yacht(roughness=300e-6)
+
+ hydro_smooth = HydroMod(yacht_smooth)
+ hydro_rough = HydroMod(yacht_rough)
+
+ Fx_smooth, _, _ = hydro_smooth.update(3.0, 5.0, 2.0)
+ Fx_rough, _, _ = hydro_rough.update(3.0, 5.0, 2.0)
+
+ assert Fx_rough > Fx_smooth, "Rough hull should have more resistance"
+
+ def test_zero_roughness_gives_smooth_cf(self):
+ """Zero roughness should give bare Hughes-line Cf (no allowance)."""
+ yacht = _make_yacht(roughness=0.0)
+ hydro = HydroMod(yacht)
+ hydro.vb = 3.0
+ cf = hydro._cf(hydro.l)
+
+ # Hughes line only
+ Re = 3.0 * hydro.l / hydro.nu
+ cf_expected = 0.066 * (np.log10(Re) - 2.03) ** (-2)
+ assert abs(cf - cf_expected) < 1e-10
+
+ def test_roughness_adds_allowance(self):
+ """150 μm roughness should add positive Cf allowance."""
+ yacht = _make_yacht(roughness=150e-6)
+ hydro = HydroMod(yacht)
+ hydro.vb = 3.0
+ cf_rough = hydro._cf(hydro.l)
+
+ yacht_smooth = _make_yacht(roughness=0.0)
+ hydro_smooth = HydroMod(yacht_smooth)
+ hydro_smooth.vb = 3.0
+ cf_smooth = hydro_smooth._cf(hydro_smooth.l)
+
+ assert cf_rough > cf_smooth
+
+
+class TestWaveResistance:
+ def test_no_waves_zero_resistance(self):
+ """Hs=0 should add zero wave resistance."""
+ yacht = _make_yacht(Hs=0.0, Ts=0.0)
+ hydro = HydroMod(yacht)
+ raw = hydro._added_resistance_waves(90.0)
+ assert raw == 0.0
+
+ def test_waves_add_resistance(self):
+ """Hs > 0 should produce positive added resistance upwind."""
+ yacht = _make_yacht(Hs=1.0, Ts=6.0)
+ hydro = HydroMod(yacht)
+ hydro.vb = 3.0
+ raw = hydro._added_resistance_waves(45.0)
+ assert raw > 0.0, "Waves should add resistance upwind"
+
+ def test_wave_resistance_increases_with_Hs(self):
+ """Larger waves should produce more resistance."""
+ yacht_small = _make_yacht(Hs=0.5, Ts=6.0)
+ yacht_large = _make_yacht(Hs=1.5, Ts=6.0)
+
+ hydro_small = HydroMod(yacht_small)
+ hydro_large = HydroMod(yacht_large)
+ hydro_small.vb = 3.0
+ hydro_large.vb = 3.0
+
+ raw_small = hydro_small._added_resistance_waves(45.0)
+ raw_large = hydro_large._added_resistance_waves(45.0)
+
+ assert raw_large > raw_small
+
+ def test_wave_resistance_higher_upwind(self):
+ """Upwind wave resistance should exceed downwind."""
+ yacht = _make_yacht(Hs=1.0, Ts=6.0)
+ hydro = HydroMod(yacht)
+ hydro.vb = 3.0
+
+ raw_upwind = hydro._added_resistance_waves(30.0)
+ raw_downwind = hydro._added_resistance_waves(150.0)
+
+ assert raw_upwind > raw_downwind
+
+ def test_flat_water_unchanged(self):
+ """VPP output with Hs=0 should match no-wave behaviour."""
+ yacht = _make_yacht(Hs=0.0, Ts=0.0)
+ hydro = HydroMod(yacht)
+
+ Fx_flat, Fy_flat, Mx_flat = hydro.update(3.0, 5.0, 2.0, twa=45.0)
+ Fx_no_twa, Fy_no_twa, Mx_no_twa = hydro.update(3.0, 5.0, 2.0, twa=0.0)
+
+ # With no waves, twa shouldn't matter for resistance
+ assert abs(Fx_flat - Fx_no_twa) < 1e-6
+
+ def test_default_roughness_is_smooth(self):
+ """Default hull is smooth (no roughness allowance), as in the ORC VPP."""
+ assert _make_yacht().roughness == 0.0
+
+ def test_roughness_allowance_uses_given_length(self):
+ """The roughness allowance scales with the length passed in (hull or appendage chord)."""
+ yacht = _make_yacht(roughness=150e-6)
+ hydro = HydroMod(yacht)
+ hydro.vb = 3.0
+ smooth = HydroMod(_make_yacht(roughness=0.0))
+ smooth.vb = 3.0
+ for L in [hydro.l, 1.0]:
+ dcf = hydro._cf(L) - smooth._cf(L)
+ assert abs(dcf - (105.0 * (150e-6 / L) ** (1.0 / 3.0) - 0.64) * 1e-3) < 1e-12
+
+
+class TestORCAppendages:
+ """ORC 2026 6.1.2 and 6.5: appendage friction, lift drag and induced drag."""
+
+ def test_rudder_lift_ramps_from_zero(self):
+ rudder = Rudder(Cu=0.48, Cl=0.22, Span=1.15)
+ assert rudder._Ksff(0.0) == 0.0
+ assert abs(rudder._Ksff(15.0) - 1.0) < 1e-12
+ assert rudder._Ksff(30.0) == 2.0
+ assert rudder._Ksff(40.0) == 2.0
+
+ def test_appendage_friction_line(self):
+ hydro = HydroMod(_make_yacht())
+ hydro.vb = 2e6 * hydro.nu # Rn = 2e6 on a 1 m chord
+ assert 0.0030 < hydro._cf_app(1.0) < 0.0038
+
+ def test_lift_increases_appendage_drag_capped(self):
+ hydro = HydroMod(_make_yacht())
+ hydro.vb = 3.0
+ keel = hydro.yacht.appendages[0]
+ q_a = 0.5 * hydro.rho * hydro.vb ** 2 * keel.area
+ d0 = hydro._app_cd_area(keel, 0.0)
+ d_half = hydro._app_cd_area(keel, 0.5 * q_a)
+ assert abs(d_half - d0 - keel.wsa * (0.0016 * 0.5 + 0.0032 * 0.25)) < 1e-12
+ assert hydro._app_cd_area(keel, 2.0 * q_a) == d_half # CL capped at 0.5
+
+ def test_induced_drag_heel_multiplier(self):
+ hydro = HydroMod(_make_yacht())
+ hydro.phi = 0.0
+ assert abs(hydro._di_factor(0.1) - 1.56) < 1e-12
+ assert hydro._di_factor(0.5) == 1.0 # off at large drive/side force ratios
+ hydro.phi = 20.0
+ assert hydro._di_factor(0.1) == 1.0
+
+ def test_span_multiplier(self):
+ hydro = HydroMod(_make_yacht())
+ hydro.update(3.0, 20.0, 3.0, twa=45.0)
+ assert hydro.span_mult == 1.0
+ hydro.update(3.0, 20.0, 3.0, twa=45.0, tws=20 * 0.5144)
+ assert 0.8 < hydro.span_mult < 1.0
diff --git a/tests/test_resistance.py b/tests/test_resistance.py
index f557ecb..f395ff4 100644
--- a/tests/test_resistance.py
+++ b/tests/test_resistance.py
@@ -43,3 +43,15 @@ def test_Rr_interpolation():
np_testing.assert_approx_equal(YD41._interp_Rr((0.700, 3.0, 9.0)), 357.062, 4)
np_testing.assert_approx_equal(YD41._interp_Rr((0.700, 9.0, 2.5)), 38.0526, 4)
np_testing.assert_approx_equal(YD41._interp_Rr((0.700, 9.0, 9.0)), 42.2353, 4)
+
+
+def test_build_interp_func_no_deprecation():
+ """Verify build_interp_func doesn't use deprecated interp1d."""
+ import warnings
+
+ from src.UtilsMod import build_interp_func
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", DeprecationWarning)
+ func = build_interp_func("main", i=1)
+ result = func(30.0)
+ assert isinstance(float(result), float)
diff --git a/tests/test_utils.py b/tests/test_utils.py
index 654af74..2edba8e 100644
--- a/tests/test_utils.py
+++ b/tests/test_utils.py
@@ -1,6 +1,10 @@
+import numpy as np
+
from src.SailMod import Jib, Kite, Main
+from src.UtilsMod import _get_cross
from src.YachtMod import Keel, Rudder, Yacht
+
def return_YD41_particulars():
YD41 = Yacht(
@@ -22,7 +26,30 @@ def return_YD41_particulars():
Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
Kite("A2", area=150.0, vce=9.55),
- Kite("A5", area=75.0, vce=2.75),
+ Kite("A5", area=110.0, vce=9.0),
],
)
- return YD41
\ No newline at end of file
+ return YD41
+
+
+def _cross_store():
+ """Store (ntwa=8, nsails=2, nvars=1): sail 1 is skipped (0) at the first 3 TWAs."""
+ dat = np.zeros((8, 2, 1))
+ dat[:, 0, 0] = [6.0, 7.0, 8.0, 8.0, 7.0, 6.0, 5.0, 4.0]
+ dat[:, 1, 0] = [0.0, 0.0, 0.0, 7.5, 7.5, 7.0, 6.0, 5.0]
+ return dat
+
+
+def test_get_cross_pad_skips_unsolved_points():
+ """Padding must not extend a sail's range over points it was not solved at."""
+ lo, hi = _get_cross(_cross_store(), 1, pad=2)
+ assert (lo, hi) == (3, 8) # fastest from index 4; index 3 is solved, 1-2 are not
+
+
+def test_get_cross_pad_is_symmetric():
+ lo, hi = _get_cross(_cross_store(), 0, pad=2)
+ assert (lo, hi) == (0, 6) # fastest at 0-3, plus two points after
+
+
+def test_get_cross_no_pad():
+ assert tuple(_get_cross(_cross_store(), 1, pad=0)) == (4, 8)
diff --git a/tests/test_vpp.py b/tests/test_vpp.py
index 9c9f3a8..8e85037 100644
--- a/tests/test_vpp.py
+++ b/tests/test_vpp.py
@@ -1,11 +1,14 @@
+import os
import numpy as np
+import pytest
-from tests.test_utils import return_YD41_particulars
+from src.SailMod import Jib, Kite, Main
from src.VPPMod import VPP
-from src.SailMod import Jib, Main
+from tests.test_utils import return_YD41_particulars
+
-def test_single_sail_set():
+def test_single_sail_set(tmp_path):
YD41 = return_YD41_particulars()
YD41_no_kite = YD41
@@ -22,5 +25,287 @@ def test_single_sail_set():
vpp.run()
vpp.write("results")
- vpp.polar(3, False)
- vpp.SailChart(False)
+
+ polar_path = str(tmp_path / "test_polar.pdf")
+ sail_path = str(tmp_path / "test_sail.pdf")
+ vpp.polar(3, True, fname=polar_path)
+ vpp.SailChart(True, fname=sail_path)
+ assert os.path.exists(polar_path), "Polar plot was not created"
+ assert os.path.exists(sail_path), "Sail chart was not created"
+
+
+def test_sail_chart_no_deprecation_warning(tmp_path):
+ """Verify sail_chart doesn't use deprecated interp2d."""
+ import warnings
+
+ yacht = return_YD41_particulars()
+ yacht.sails = [
+ Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ ]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(
+ tws_range=np.array([6.0, 10.0]),
+ twa_range=np.linspace(30.0, 180.0, 16),
+ )
+ vpp.run()
+ fname = str(tmp_path / "test_sailchart.pdf")
+ with warnings.catch_warnings():
+ warnings.simplefilter("error", DeprecationWarning)
+ vpp.SailChart(save=True, fname=fname)
+ assert os.path.exists(fname), "Sail chart was not created"
+
+
+def test_phi_max_configurable():
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([10.0]),
+ twa_range=np.linspace(30.0, 180.0, 3),
+ phi_max=25.0)
+ assert vpp.phi_max == 25.0
+
+
+def test_run_without_analysis_raises():
+ """Issue #46: raise with string literal should be a proper exception."""
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(RuntimeError, match="no analysis set"):
+ vpp.run()
+
+
+def test_set_analysis_empty_tws_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(ValueError, match="TWS range is empty"):
+ vpp.set_analysis(tws_range=np.array([]), twa_range=np.linspace(30, 180, 5))
+
+
+def test_set_analysis_empty_twa_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(ValueError, match="TWA range is empty"):
+ vpp.set_analysis(tws_range=np.array([6.0, 10.0]), twa_range=np.array([]))
+
+
+def test_set_analysis_tws_below_minimum_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(ValueError, match="outside valid bounds"):
+ vpp.set_analysis(tws_range=np.array([1.0, 5.0]), twa_range=np.linspace(30, 180, 5))
+
+
+def test_set_analysis_tws_above_maximum_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(ValueError, match="outside valid bounds"):
+ vpp.set_analysis(tws_range=np.array([10.0, 40.0]), twa_range=np.linspace(30, 180, 5))
+
+
+def test_set_analysis_twa_out_of_range_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ vpp = VPP(Yacht=yacht)
+ with pytest.raises(ValueError, match="outside valid bounds"):
+ vpp.set_analysis(tws_range=np.array([6.0, 10.0]), twa_range=np.array([-5.0, 90.0]))
+
+
+def test_legacy_method_names_accepted():
+ """'iterative' and '5dof' are aliases of the sequential solver."""
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)]
+ stores = []
+ for method in ("sequential", "iterative", "5dof"):
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([8.0]),
+ twa_range=np.linspace(40.0, 160.0, 4))
+ vpp.run(method=method)
+ stores.append(vpp.store)
+ assert np.all(stores[0][0, :, 0, 0] > 0)
+ np.testing.assert_array_equal(stores[0], stores[1])
+ np.testing.assert_array_equal(stores[0], stores[2])
+
+
+def _upwind_vpp(tws_range, twa_range):
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=tws_range, twa_range=twa_range)
+ vpp.run()
+ return vpp
+
+
+def test_speed_increases_with_tws_when_depowered():
+ """Optimal depowering can never make the boat slower in more wind."""
+ vpp = _upwind_vpp(np.array([14.0, 16.0, 18.0, 20.0]), np.array([28.0, 36.0, 44.0, 52.0, 60.0]))
+ vb = vpp.store[:, :, 0, 0]
+ assert np.all(vb > 0)
+ assert np.all(np.diff(vb, axis=0) > -1e-3), f"VB drops with TWS:\n{vb}"
+ # heavy air is depowered and held at the heel limit
+ assert np.all(vpp.store[-1, :, 0, 1] <= vpp.phi_max + 1e-6)
+ assert np.all(vpp.store[-1, :, 0, 3] < 1.0) or np.all(vpp.store[-1, :, 0, 4] < 2.0)
+
+
+def test_stored_points_are_in_equilibrium():
+ """Every stored point satisfies force and moment equilibrium."""
+ from src.UtilsMod import KNOTS_TO_MPS
+ from src.VPPMod import RESID_TOL
+
+ vpp = _upwind_vpp(np.array([6.0, 20.0]), np.linspace(30.0, 120.0, 4))
+ vpp.aero.sails[1] = vpp.yacht.sails[1]
+ for i, tws in enumerate(vpp.tws_range):
+ for j, twa in enumerate(vpp.twa_range):
+ vb, phi, leeway, flat, red = vpp.store[i, j, 0]
+ r = vpp.resid([vb * KNOTS_TO_MPS, phi, leeway], twa, tws, flat, red)
+ assert np.abs(r).max() < RESID_TOL, f"TWS {tws} TWA {twa}: {r}"
+
+
+def test_kite_heel_capped():
+ """Kites are held to their own heel limit (ORC ~21.5 deg), the jib to phi_max."""
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ Kite("A2", area=150.0, vce=9.55)]
+ assert yacht.sails[2].max_heel == 21.5
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([16.0]), twa_range=np.array([60.0, 120.0]))
+ vpp.run()
+ assert vpp.store[0, 1, 1, 0] > 0
+ assert vpp.store[0, 1, 1, 1] <= 21.5 + 1e-6
+ assert vpp.store[0, 0, 0, 1] > 21.5 # J1 at 60 deg heels past the kite limit
+
+
+def test_infeasible_kite_left_unsolved():
+ """A kite that cannot be held at the heel limit is stored as 0, not a fake point."""
+ from src.UtilsMod import KNOTS_TO_MPS
+ from src.VPPMod import RESID_TOL
+
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ Kite("A2", area=150.0, vce=9.55)]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([20.0]), twa_range=np.array([80.0, 150.0]))
+ vpp.run()
+ vpp.aero.sails[1] = vpp.yacht.sails[2]
+ vpp.aero.up = False
+ assert np.all(vpp.store[0, 0, 1] == 0.0), "A2 at 20 kn/80 deg should be infeasible"
+ vb, phi, leeway, flat, red = vpp.store[0, 1, 1]
+ assert vb > 0
+ r = vpp.resid([vb * KNOTS_TO_MPS, phi, leeway], 150.0, vpp.tws_range[0], flat, red)
+ assert np.abs(r).max() < RESID_TOL
+
+
+def test_invalid_method_raises():
+ import pytest
+
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([8.0]),
+ twa_range=np.linspace(40.0, 160.0, 3))
+ with pytest.raises(ValueError, match="Unknown method"):
+ vpp.run(method="bogus")
+
+
+def test_sail_type_main_low():
+ """Main with sail_type='main_low' loads lower CL coefficients."""
+ main_hi = Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0)
+ main_lo = Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0, sail_type="main_low")
+ # At peak CL angle (~28 deg), low should have less lift
+ assert main_lo.cl(28) < main_hi.cl(28)
+
+
+def test_sail_type_jib_low():
+ """Jib with sail_type='jib_low' loads lower CL coefficients."""
+ jib_hi = Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)
+ jib_lo = Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8, sail_type="jib_low")
+ assert jib_lo.cl(27) < jib_hi.cl(27)
+
+
+def test_sail_type_sym_kite():
+ """The default kite is the ORC 2026 symmetric spinnaker (table 5.8)."""
+ kite_default = Kite("A2", area=150.0, vce=9.55)
+ kite_sym = Kite("A2", area=150.0, vce=9.55, sail_type="sym_kite")
+ assert kite_sym.cl(67) == pytest.approx(1.013)
+ assert kite_sym.cd(150) == pytest.approx(0.702)
+ assert kite_default.cl(67) == pytest.approx(kite_sym.cl(67))
+
+
+def test_sail_type_asym_kite_variants():
+ """Asymmetric spinnakers follow ORC 2026 tables 5.9 and 5.10."""
+ kite_cl = Kite("A2", area=150.0, vce=9.55, sail_type="asym_cl_kite")
+ kite_pole = Kite("A2", area=150.0, vce=9.55, sail_type="asym_pole_kite")
+ # same up to 100 deg AWA ...
+ assert kite_cl.cl(67) == pytest.approx(1.125)
+ assert kite_pole.cl(67) == pytest.approx(kite_cl.cl(67))
+ # ... but a pole keeps the sail working deeper
+ assert kite_pole.cl(150) == pytest.approx(0.391)
+ assert kite_pole.cl(150) > kite_cl.cl(150)
+
+
+def test_parallel_matches_sequential():
+ """Parallel solver must produce identical results to the sequential one."""
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ Kite("A2", area=150.0, vce=9.55)]
+
+ tws_range = np.array([6.0, 10.0])
+ twa_range = np.linspace(40.0, 160.0, 5)
+
+ vpp_seq = VPP(Yacht=yacht)
+ vpp_seq.set_analysis(tws_range=tws_range, twa_range=twa_range)
+ vpp_seq.run(method="sequential")
+
+ vpp_par = VPP(Yacht=yacht)
+ vpp_par.set_analysis(tws_range=tws_range, twa_range=twa_range)
+ vpp_par.run(method="parallel")
+
+ np.testing.assert_allclose(
+ vpp_par.store, vpp_seq.store, atol=1e-6,
+ err_msg="Parallel results differ from sequential"
+ )
+
+
+def test_parallel_method_accepted():
+ """VPP.run(method='parallel') should not raise."""
+ yacht = return_YD41_particulars()
+ yacht.sails = [Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8)]
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([8.0]),
+ twa_range=np.linspace(40.0, 160.0, 3))
+ vpp.run(method="parallel")
+ assert np.any(vpp.store[0, :, 0, 0] > 0)
+
+
+def test_sym_kite_vpp_runs():
+ """VPP runs with symmetric spinnaker coefficients."""
+ from src.YachtMod import Keel, Rudder, Yacht
+ yacht = Yacht(
+ Name="YD41", Lwl=11.90, Vol=6.05, Bwl=3.18, Tc=0.4, WSA=28.20,
+ Tmax=2.30, Amax=1.051, Mass=6500, Ff=1.5, Fa=1.5, Boa=4.2, Loa=12.5,
+ App=[Keel(Cu=1.00, Cl=0.78, Span=1.90), Rudder(Cu=0.48, Cl=0.22, Span=1.15)],
+ Sails=[Main("MN1", P=16.60, E=5.60, Roach=0.1, BAD=1.0),
+ Jib("J1", I=16.20, J=5.10, LPG=5.40, HBI=1.8),
+ Kite("A2", area=150.0, vce=9.55, sail_type="sym_kite")])
+ vpp = VPP(Yacht=yacht)
+ vpp.set_analysis(tws_range=np.array([10.0]), twa_range=np.linspace(40.0, 160.0, 4))
+ vpp.run()
+ assert np.any(vpp.store[0, :, :, 0] > 0)
diff --git a/tests/test_yacht.py b/tests/test_yacht.py
new file mode 100644
index 0000000..7f1a1b9
--- /dev/null
+++ b/tests/test_yacht.py
@@ -0,0 +1,88 @@
+import numpy as np
+import pytest
+from src.YachtMod import Yacht, Keel, Rudder, ShortKeel
+from src.SailMod import Main, Jib
+
+
+def _minimal_yacht(**overrides):
+ """Create a minimal Yacht for testing with sensible defaults."""
+ defaults = dict(
+ Name="TestYacht", Lwl=7.01, Vol=1.95, Bwl=1.70, Tc=0.45,
+ WSA=11.5, Tmax=1.35, Amax=0.38, Mass=2000, Loa=9.90, Boa=1.98,
+ Ff=0.75, Fa=0.55,
+ App=[Keel(Cu=0.70, Cl=0.45, Span=0.90), Rudder(Cu=0.32, Cl=0.18, Span=0.75)],
+ Sails=[Main("MN1", P=10.80, E=3.30, Roach=0.1, BAD=0.80),
+ Jib("J1", I=8.50, J=2.70, LPG=2.70, HBI=0.50)],
+ )
+ defaults.update(overrides)
+ return Yacht(**defaults)
+
+
+def test_yacht_accepts_gz_parameter():
+ """Yacht should accept an optional gz dict to override the global file."""
+ gz = {"Heel": [0, 10, 20, 30], "GZ": [0.0, 0.12, 0.23, 0.31]}
+ yacht = _minimal_yacht(GZ=gz)
+ rm_10 = yacht._get_RmH(10.0)
+ expected = 0.12 * 2000 * 9.81
+ assert abs(rm_10 - expected) < 1.0
+
+
+def test_yacht_falls_back_to_file_when_no_gz():
+ """When no GZ parameter given, should still load from file (backward compat)."""
+ yacht = _minimal_yacht()
+ rm_10 = yacht._get_RmH(10.0)
+ assert rm_10 > 0
+
+
+def test_yacht_accepts_crew_weight():
+ """Yacht should accept an optional crew_weight to override the empirical formula."""
+ yacht = _minimal_yacht(crew_weight=240.0)
+ assert yacht.cw == 240.0
+
+
+def test_yacht_default_crew_weight():
+ """Without crew_weight param, should use empirical formula."""
+ yacht = _minimal_yacht()
+ expected = 25.8 * 7.01 ** 1.4262
+ assert abs(yacht.cw - expected) < 0.1
+
+
+def test_appendage_aspect_ratio():
+ """Aspect ratio is span^2/area and the lift slope grows with it."""
+ keel = Keel(Cu=1.00, Cl=0.78, Span=1.90)
+ assert abs(keel.Ar - 1.90**2 / keel.area) < 1e-12
+ deep = Keel(Cu=0.50, Cl=0.39, Span=3.80) # same area, twice the span
+ assert deep.dclda > keel.dclda
+ assert keel.dclda < 2 * np.pi
+
+
+# --- ShortKeel-specific unit tests ---
+
+def test_short_keel_jones_lift_formula():
+ """ShortKeel dclda should match Jones low-AR formula: pi*Ae/2, Ae = 2 span^2/area."""
+ sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15)
+ ae = 2.0 * sk.span**2 / sk.area # = 2 * 0.90 / 1.2, reflected in the hull
+ expected = np.pi * ae / 2.0
+ assert abs(sk.dclda - expected) < 1e-10, f"dclda={sk.dclda}, expected={expected}"
+
+
+def test_short_keel_no_appendage_residuary():
+ """ShortKeel should return zero appendage residuary resistance."""
+ sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15)
+ for fn in [0.0, 0.2, 0.4, 0.6]:
+ assert sk._cr(fn) == 0.0, f"_cr({fn}) should be 0.0 for short_keel"
+
+
+def test_short_keel_lower_lift_than_fin():
+ """A ShortKeel with equivalent area should produce less lift than a fin Keel."""
+ sk = ShortKeel(Length=1.2, Depth=0.90, Tc_ratio=0.15)
+ # Fin keel with similar area: chord ~0.575, span 0.90 -> area ~0.5175
+ # Use root/tip that give similar area to short keel
+ fk = Keel(Cu=1.40, Cl=1.00, Span=0.90) # area = 1.08, same span
+ # At the same leeway, short keel should generate less lift coefficient
+ leeway_rad = np.radians(5.0)
+ cl_short = sk.dclda * leeway_rad
+ cl_fin = fk.dclda * leeway_rad
+ assert cl_short < cl_fin, (
+ f"ShortKeel cl={cl_short:.4f} should be less than Keel cl={cl_fin:.4f}"
+ )
diff --git a/uv.lock b/uv.lock
index ac5486f..9cebaee 100644
--- a/uv.lock
+++ b/uv.lock
@@ -1139,13 +1139,12 @@ wheels = [
[[package]]
name = "python-vpp"
-version = "0.0.2"
+version = "1.0.0"
source = { editable = "." }
dependencies = [
{ name = "matplotlib" },
{ name = "numpy" },
{ name = "scipy" },
- { name = "tqdm" },
]
[package.optional-dependencies]
@@ -1173,7 +1172,6 @@ requires-dist = [
{ name = "ruff", marker = "extra == 'dev'" },
{ name = "scipy", specifier = ">=1.12" },
{ name = "streamlit", marker = "extra == 'demo'", specifier = ">=1.37" },
- { name = "tqdm", specifier = ">=4.66" },
]
provides-extras = ["api", "demo", "dev"]
@@ -1503,18 +1501,6 @@ wheels = [
{ url = "https://files.pythonhosted.org/packages/50/49/8dc3fd90902f70084bd2cd059d576ddb4f8bb44c2c7c0e33a11422acb17e/tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1", size = 445910, upload-time = "2025-12-15T19:21:02.571Z" },
]
-[[package]]
-name = "tqdm"
-version = "4.67.3"
-source = { registry = "https://pypi.org/simple" }
-dependencies = [
- { name = "colorama", marker = "sys_platform == 'win32'" },
-]
-sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598, upload-time = "2026-02-03T17:35:53.048Z" }
-wheels = [
- { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374, upload-time = "2026-02-03T17:35:50.982Z" },
-]
-
[[package]]
name = "typing-extensions"
version = "4.15.0"