diff --git a/requirements39.txt b/requirements39.txt
new file mode 100644
index 00000000..47dc6125
--- /dev/null
+++ b/requirements39.txt
@@ -0,0 +1,179 @@
+aiohttp==3.8.4
+aiosignal==1.3.1
+amqp==5.1.1
+arrow==1.2.3
+asgiref==3.7.2
+asttokens==2.2.1
+async-timeout==4.0.2
+attrs==23.1.0
+backcall==0.2.0
+beautifulsoup4==4.12.2
+billiard==3.6.4.0
+bleach==6.0.0
+bokeh==3.1.1
+braintree==4.20.0
+celery==5.2.1
+certifi==2023.5.7
+cffi==1.15.1
+charset-normalizer==3.1.0
+click==8.1.3
+click-didyoumean==0.3.0
+click-plugins==1.1.1
+click-repl==0.2.0
+cloudpickle==2.2.1
+colorcet==3.0.1
+contourpy==1.0.7
+coreapi==2.3.3
+coreschema==0.0.4
+cramjam==2.6.2
+cycler==0.11.0
+Cython==0.29.35
+dask==2023.5.1
+decorator==5.1.1
+Django==3.2.12
+django-analytical==2.5.0
+django-async-messages==0.3.1
+django-classy-tags==4.0.0
+django-cookie-law==2.0.1
+django-cors-headers==3.10.1
+django-countries==7.5.1
+django-datetime-widget2==0.9.5
+django-debug-toolbar==2.0
+django-leaflet==0.28.2
+django-oauth-toolkit==1.2.0
+django-oauth2-provider==0.2.6.1
+django-rest-framework==0.1.0
+django-rest-swagger==2.2.0
+django-rq==2.5.1
+django-shell-plus==1.1.7
+django-social-share==1.3.2
+django-taggit==4.0.0
+django-tz-detect==0.2.9
+djangorestframework==3.14.0
+docopt==0.6.2
+exceptiongroup==1.1.1
+executing==1.2.0
+factory-boy==2.11.1
+Faker==18.10.0
+fastparquet==2023.4.0
+fitparse==1.2.0
+fonttools==4.39.4
+frozenlist==1.3.3
+fsspec==2023.5.0
+future==0.18.3
+geocoder==1.38.1
+geoip2==4.7.0
+greenlet==2.0.2
+grpcio==1.26.0
+h3==3.7.6
+holoviews==1.16.0
+httplib2==0.22.0
+humanize==4.6.0
+icalendar==5.0.7
+idna==3.4
+importlib-metadata==6.6.0
+importlib-resources==5.12.0
+iniconfig==2.0.0
+ipython==8.14.0
+iso8601==1.1.0
+isodate==0.6.1
+itypes==1.2.0
+jedi==0.18.2
+Jinja2==3.0.3
+kiwisolver==1.4.4
+kombu==5.2.4
+linkify-it-py==2.0.2
+locket==1.0.0
+lxml==4.9.2
+Markdown==3.4.3
+markdown-it-py==2.2.0
+MarkupSafe==2.1.2
+matplotlib==3.7.1
+matplotlib-inline==0.1.6
+maxminddb==2.3.0
+mdit-py-plugins==0.3.5
+mdurl==0.1.2
+mock==5.0.2
+mpld3==0.5.9
+multidict==6.0.4
+nose==1.3.7
+nose-parameterized==0.6.0
+numpy==1.24.3
+oauth2==1.9.0.post1
+oauth2-provider==0.0
+oauthlib==3.2.2
+openapi-codec==1.3.2
+packaging==23.1
+pandas==2.0.2
+panel==1.0.4
+param==1.13.0
+parso==0.8.3
+partd==1.4.0
+pathspec==0.11.1
+pendulum==2.1.2
+pexpect==4.8.0
+pickleshare==0.7.5
+Pillow==9.5.0
+Pint==0.22
+pluggy==1.0.0
+prompt-toolkit==3.0.38
+protobuf==3.19.4
+ptyprocess==0.7.0
+pure-eval==0.2.2
+pyarrow==12.0.0
+pycairo==1.23.0
+pycparser==2.21
+pyct==0.5.0
+pydantic==1.10.8
+Pygments==2.15.1
+pyparsing==3.0.9
+pytest==7.3.1
+pytest-runner==6.0.0
+python-dateutil==2.8.2
+python-twitter==3.5
+pytz==2023.3
+pytzdata==2020.1
+pyviz-comms==2.3.0
+PyYAML==6.0
+ratelim==0.1.6
+redis==4.5.5
+requests==2.31.0
+requests-oauthlib==1.2.0
+rowingdata==3.5.29
+rowingphysics==0.5.2
+rq==1.15.0
+rules==3.3
+ruptures==1.1.7
+scipy==1.10.1
+shortuuid==1.0.11
+simplejson==3.19.1
+six==1.16.0
+soupsieve==2.4.1
+SQLAlchemy==2.0.15
+sqlparse==0.4.4
+stack-data==0.6.2
+stravalib==1.3.0
+timezonefinder==6.2.0
+tk==0.1.0
+tomli==2.0.1
+toolz==0.12.0
+tornado==6.3.2
+tqdm==4.65.0
+traitlets==5.9.0
+trueskill==0.4.5
+typing_extensions==4.6.3
+tzdata==2023.3
+uc-micro-py==1.0.2
+uritemplate==4.1.1
+urllib3==2.0.2
+VerbalExpressions==0.0.2
+vine==5.0.0
+wcwidth==0.2.6
+webencodings==0.5.1
+Werkzeug==2.3.4
+xmltodict==0.13.0
+xyzservices==2023.5.0
+yamjam==0.1.7
+yamllint==1.32.0
+yarl==1.9.2
+zipp==3.15.0
diff --git a/rowers/templates/agegroupchart.html b/rowers/templates/agegroupchart.html
index 6d4d01df..2ad2a9a8 100644
--- a/rowers/templates/agegroupchart.html
+++ b/rowers/templates/agegroupchart.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/agegroupcp.html b/rowers/templates/agegroupcp.html
index 2308f5fb..c08a9552 100644
--- a/rowers/templates/agegroupcp.html
+++ b/rowers/templates/agegroupcp.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/boxplot.html b/rowers/templates/boxplot.html
index 7f8bd9db..df98c678 100644
--- a/rowers/templates/boxplot.html
+++ b/rowers/templates/boxplot.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/cum_flex.html b/rowers/templates/cum_flex.html
index e78b002f..4e818a57 100644
--- a/rowers/templates/cum_flex.html
+++ b/rowers/templates/cum_flex.html
@@ -59,12 +59,12 @@
-
-
+
+
-
-
+
+
diff --git a/rowers/templates/cumstats.html b/rowers/templates/cumstats.html
index 7e5c5b83..fbc98813 100644
--- a/rowers/templates/cumstats.html
+++ b/rowers/templates/cumstats.html
@@ -60,12 +60,12 @@
-
-
+
+
-
-
+
+
diff --git a/rowers/templates/disqualification_view.html b/rowers/templates/disqualification_view.html
index 346009d7..dfacbe67 100644
--- a/rowers/templates/disqualification_view.html
+++ b/rowers/templates/disqualification_view.html
@@ -102,7 +102,7 @@
{% endif %}
-
+
diff --git a/rowers/templates/fitnessfit.html b/rowers/templates/fitnessfit.html
index 010f8e09..a5eb088d 100644
--- a/rowers/templates/fitnessfit.html
+++ b/rowers/templates/fitnessfit.html
@@ -48,7 +48,7 @@
});
-
+
diff --git a/rowers/templates/fitnessmetric.html b/rowers/templates/fitnessmetric.html
index c3a0a4d6..94e57b2a 100644
--- a/rowers/templates/fitnessmetric.html
+++ b/rowers/templates/fitnessmetric.html
@@ -48,7 +48,7 @@
});
-
+
diff --git a/rowers/templates/flexchart3otw.html b/rowers/templates/flexchart3otw.html
index bbae4c43..5c965572 100644
--- a/rowers/templates/flexchart3otw.html
+++ b/rowers/templates/flexchart3otw.html
@@ -11,8 +11,8 @@
{{ js_res | safe }}
{{ css_res| safe }}
-
-
+
+
diff --git a/rowers/templates/flexchartstacked.html b/rowers/templates/flexchartstacked.html
index d44b9c33..d5788f79 100644
--- a/rowers/templates/flexchartstacked.html
+++ b/rowers/templates/flexchartstacked.html
@@ -11,8 +11,8 @@
{{ js_res | safe }}
{{ css_res| safe }}
-
-
+
+
diff --git a/rowers/templates/forcecurve_analysis.html b/rowers/templates/forcecurve_analysis.html
index 79638221..b46f8d37 100644
--- a/rowers/templates/forcecurve_analysis.html
+++ b/rowers/templates/forcecurve_analysis.html
@@ -9,8 +9,8 @@
{{ js_res | safe }}
{{ css_res| safe }}
-
-
+
+
diff --git a/rowers/templates/forcecurve_single.html b/rowers/templates/forcecurve_single.html
index 56844a45..d9ea9729 100644
--- a/rowers/templates/forcecurve_single.html
+++ b/rowers/templates/forcecurve_single.html
@@ -11,8 +11,8 @@
{{ js_res | safe }}
{{ css_res| safe }}
-
-
+
+
diff --git a/rowers/templates/goldmedalscores.html b/rowers/templates/goldmedalscores.html
index 020db44c..e56f3624 100644
--- a/rowers/templates/goldmedalscores.html
+++ b/rowers/templates/goldmedalscores.html
@@ -60,7 +60,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/histo.html b/rowers/templates/histo.html
index cbb641c7..a46d9d5e 100644
--- a/rowers/templates/histo.html
+++ b/rowers/templates/histo.html
@@ -60,12 +60,12 @@
-
-
+
+
-
-
+
+
diff --git a/rowers/templates/histo_single.html b/rowers/templates/histo_single.html
index 85539731..4d6111d3 100644
--- a/rowers/templates/histo_single.html
+++ b/rowers/templates/histo_single.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/history.html b/rowers/templates/history.html
index 819b0ff5..358b91a0 100644
--- a/rowers/templates/history.html
+++ b/rowers/templates/history.html
@@ -6,12 +6,12 @@
{% block main %}
-
-
+
+
-
-
+
+
-
+
+
diff --git a/rowers/templates/instroke_interactive.html b/rowers/templates/instroke_interactive.html
index eccdefdb..d7d89704 100644
--- a/rowers/templates/instroke_interactive.html
+++ b/rowers/templates/instroke_interactive.html
@@ -113,7 +113,7 @@ $( function() {
{% block main %}
-
+
+
+
+
diff --git a/rowers/templates/map_view.html b/rowers/templates/map_view.html
index 676aa566..17eedd47 100644
--- a/rowers/templates/map_view.html
+++ b/rowers/templates/map_view.html
@@ -12,7 +12,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/mapcompare.html b/rowers/templates/mapcompare.html
index 4d219412..a00044a6 100644
--- a/rowers/templates/mapcompare.html
+++ b/rowers/templates/mapcompare.html
@@ -12,7 +12,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/multicompare.html b/rowers/templates/multicompare.html
index 6024d130..59ddd994 100644
--- a/rowers/templates/multicompare.html
+++ b/rowers/templates/multicompare.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/multiflex.html b/rowers/templates/multiflex.html
index e9638577..b2290f82 100644
--- a/rowers/templates/multiflex.html
+++ b/rowers/templates/multiflex.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/oterankings.html b/rowers/templates/oterankings.html
index 76c07327..d376974a 100644
--- a/rowers/templates/oterankings.html
+++ b/rowers/templates/oterankings.html
@@ -10,7 +10,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/otwgeeky.html b/rowers/templates/otwgeeky.html
index 4ed742ab..139fdcca 100644
--- a/rowers/templates/otwgeeky.html
+++ b/rowers/templates/otwgeeky.html
@@ -138,7 +138,7 @@
-
+
diff --git a/rowers/templates/otwinteractive.html b/rowers/templates/otwinteractive.html
index 5c5164cb..1dc48cfc 100644
--- a/rowers/templates/otwinteractive.html
+++ b/rowers/templates/otwinteractive.html
@@ -6,7 +6,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/otwrankings.html b/rowers/templates/otwrankings.html
index bd0186b4..a482e4db 100644
--- a/rowers/templates/otwrankings.html
+++ b/rowers/templates/otwrankings.html
@@ -10,7 +10,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/performancemanager.html b/rowers/templates/performancemanager.html
index 43a98877..f7ae5451 100644
--- a/rowers/templates/performancemanager.html
+++ b/rowers/templates/performancemanager.html
@@ -63,7 +63,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/rankings.html b/rowers/templates/rankings.html
index 74591842..e4a04338 100644
--- a/rowers/templates/rankings.html
+++ b/rowers/templates/rankings.html
@@ -13,7 +13,7 @@
{% block main %}
-
+
diff --git a/rowers/templates/splitworkout.html b/rowers/templates/splitworkout.html
index 6a2994df..bd7c0130 100644
--- a/rowers/templates/splitworkout.html
+++ b/rowers/templates/splitworkout.html
@@ -23,7 +23,7 @@
-
+
diff --git a/rowers/templates/streamedit.html b/rowers/templates/streamedit.html
index 16a0e59a..3c62cacc 100644
--- a/rowers/templates/streamedit.html
+++ b/rowers/templates/streamedit.html
@@ -31,7 +31,7 @@
-
+
diff --git a/rowers/templates/summary_edit.html b/rowers/templates/summary_edit.html
index 5fe8d68d..4117c89d 100644
--- a/rowers/templates/summary_edit.html
+++ b/rowers/templates/summary_edit.html
@@ -89,7 +89,7 @@
-
+
diff --git a/rowers/templates/trainingplan_chart.html b/rowers/templates/trainingplan_chart.html
index aca80898..3b1c5c11 100644
--- a/rowers/templates/trainingplan_chart.html
+++ b/rowers/templates/trainingplan_chart.html
@@ -6,8 +6,8 @@
{% block main %}
-
-
+
+
diff --git a/rowers/templates/trainingzones.html b/rowers/templates/trainingzones.html
index 2fa5fb60..19502c31 100644
--- a/rowers/templates/trainingzones.html
+++ b/rowers/templates/trainingzones.html
@@ -6,8 +6,8 @@
{% block main %}
-
-
+
+
diff --git a/rowers/templates/user_analysis_select.html b/rowers/templates/user_analysis_select.html
index bd6f982a..45dd06ad 100644
--- a/rowers/templates/user_analysis_select.html
+++ b/rowers/templates/user_analysis_select.html
@@ -332,12 +332,12 @@
-
-
+
+
-
-
+
+
+
diff --git a/rowers/templates/withdraw_view.html b/rowers/templates/withdraw_view.html
index 91b0809d..a5df85ce 100644
--- a/rowers/templates/withdraw_view.html
+++ b/rowers/templates/withdraw_view.html
@@ -98,7 +98,7 @@
{% endif %}
-
+
diff --git a/rowers/templates/workflow.html b/rowers/templates/workflow.html
index 75bd7179..f61d1348 100644
--- a/rowers/templates/workflow.html
+++ b/rowers/templates/workflow.html
@@ -16,7 +16,7 @@
{% block meta %}
{% leaflet_js %}
{% leaflet_css %}
-
+
diff --git a/rowers/templates/workout_comments.html b/rowers/templates/workout_comments.html
index e802eada..699598eb 100644
--- a/rowers/templates/workout_comments.html
+++ b/rowers/templates/workout_comments.html
@@ -86,7 +86,7 @@
-
+
diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html
index 0ffb7944..278434db 100644
--- a/rowers/templates/workout_form.html
+++ b/rowers/templates/workout_form.html
@@ -157,7 +157,7 @@ $('#id_workouttype').change();
{% endif %}
{% if mapdiv %}
-
+
diff --git a/rowers/templates/workout_view.html b/rowers/templates/workout_view.html
index cfbecfba..bfb12fe2 100644
--- a/rowers/templates/workout_view.html
+++ b/rowers/templates/workout_view.html
@@ -137,7 +137,7 @@
{% endif %}
-
+
diff --git a/rowers/tests/testdata/testdata.tcx.gz b/rowers/tests/testdata/testdata.tcx.gz
index cc629a17..4d0a992c 100644
Binary files a/rowers/tests/testdata/testdata.tcx.gz and b/rowers/tests/testdata/testdata.tcx.gz differ