Add Time and Percent in Zones I-II-III metrics for HR, Power and Pace

In total 18 new metrics are added and 6 new charts using them are
included in charts.xml (existing users needs to remove their local
copy in config/charts.xml to activate them, reset doesn't work since
it retrieves the server copy which is v3.5 yet.)

Fixes #2555
[publish binaries]
This commit is contained in:
Ale Martinez
2021-03-18 21:07:10 -03:00
parent 5714a74e88
commit 0fe28abe5a
5 changed files with 1034 additions and 15 deletions

View File

@@ -32,9 +32,6 @@ class HrZoneTime : public RideMetric {
int level;
double seconds;
QList<int> lo;
QList<int> hi;
public:
HrZoneTime() : level(0), seconds(0.0)
@@ -741,7 +738,336 @@ class HrZonePTime10 : public RideMetric {
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZonePTime10(*this); }
};
// Time in Zones I, II and III
class HrZoneTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZoneTimeI)
double seconds;
public:
HrZoneTimeI() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_HI");
setInternalName("HI Time in Zone");
}
void initialize ()
{
setName(tr("HI Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Heart Rate Zone I - Below AeT"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride())) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
// get zone ranges
if (item->context->athlete->hrZones(item->isRun) && item->hrZoneRange >= 0 && item->ride()->areDataPresent()->hr) {
int AeT = item->context->athlete->hrZones(item->isRun)->getAeT(item->hrZoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->hr < AeT)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZoneTimeI(*this); }
};
class HrZoneTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZoneTimeII)
double seconds;
public:
HrZoneTimeII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_HII");
setInternalName("HII Time in Zone");
}
void initialize ()
{
setName(tr("HII Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Heart Rate Zone II - Between AeT and LT"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride())) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
// get zone ranges
if (item->context->athlete->hrZones(item->isRun) && item->hrZoneRange >= 0 && item->ride()->areDataPresent()->hr) {
int AeT = item->context->athlete->hrZones(item->isRun)->getAeT(item->hrZoneRange);
int LT = item->context->athlete->hrZones(item->isRun)->getLT(item->hrZoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->hr >= AeT && point->hr < LT)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZoneTimeII(*this); }
};
class HrZoneTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZoneTimeIII)
double seconds;
public:
HrZoneTimeIII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_HIII");
setInternalName("HIII Time in Zone");
}
void initialize ()
{
setName(tr("HIII Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Heart Rate Zone III - Above LT"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride())) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
// get zone ranges
if (item->context->athlete->hrZones(item->isRun) && item->hrZoneRange >= 0 && item->ride()->areDataPresent()->hr) {
int LT = item->context->athlete->hrZones(item->isRun)->getLT(item->hrZoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->hr >= LT)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZoneTimeIII(*this); }
};
// Now for Time In Zone as a Percentage of Ride Time
class HrZonePTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZonePTimeI)
public:
HrZonePTimeI()
{
setSymbol("percent_in_zone_HI");
setInternalName("HI Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("HI Percent in Zone"));
setDescription(tr("Percent of Time in Heart Rate Zone I - Below AeT"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps) {
assert(deps.contains("time_in_zone_HI"));
// compute
double time = deps.value("time_in_zone_HI")->count();
double inzone = deps.value("time_in_zone_HI")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZonePTimeI(*this); }
};
class HrZonePTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZonePTimeII)
public:
HrZonePTimeII()
{
setSymbol("percent_in_zone_HII");
setInternalName("HII Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("HII Percent in Zone"));
setDescription(tr("Percent of Time in Heart Rate Zone II - Between AeT and LT"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps) {
assert(deps.contains("time_in_zone_HII"));
// compute
double time = deps.value("time_in_zone_HII")->count();
double inzone = deps.value("time_in_zone_HII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZonePTimeII(*this); }
};
class HrZonePTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(HrZonePTimeIII)
public:
HrZonePTimeIII()
{
setSymbol("percent_in_zone_HIII");
setInternalName("HIII Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("HIII Percent in Zone"));
setDescription(tr("Percent of Time in Heart Rate Zone III - Above LT"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps) {
assert(deps.contains("time_in_zone_HIII"));
// compute
double time = deps.value("time_in_zone_HIII")->count();
double inzone = deps.value("time_in_zone_HIII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new HrZonePTimeIII(*this); }
};
static bool addAllHrZones() {
RideMetricFactory::instance().addMetric(HrZoneTime1());
RideMetricFactory::instance().addMetric(HrZoneTime2());
RideMetricFactory::instance().addMetric(HrZoneTime3());
@@ -752,6 +1078,7 @@ static bool addAllHrZones() {
RideMetricFactory::instance().addMetric(HrZoneTime8());
RideMetricFactory::instance().addMetric(HrZoneTime9());
RideMetricFactory::instance().addMetric(HrZoneTime10());
QVector<QString> deps;
deps.append("time_in_zone_H1");
RideMetricFactory::instance().addMetric(HrZonePTime1(), &deps);
@@ -782,6 +1109,21 @@ static bool addAllHrZones() {
deps.clear();
deps.append("time_in_zone_H10");
RideMetricFactory::instance().addMetric(HrZonePTime10(), &deps);
RideMetricFactory::instance().addMetric(HrZoneTimeI());
RideMetricFactory::instance().addMetric(HrZoneTimeII());
RideMetricFactory::instance().addMetric(HrZoneTimeIII());
deps.clear();
deps.append("time_in_zone_HI");
RideMetricFactory::instance().addMetric(HrZonePTimeI(), &deps);
deps.clear();
deps.append("time_in_zone_HII");
RideMetricFactory::instance().addMetric(HrZonePTimeII(), &deps);
deps.clear();
deps.append("time_in_zone_HIII");
RideMetricFactory::instance().addMetric(HrZonePTimeIII(), &deps);
return true;
}

View File

@@ -33,9 +33,6 @@ class PaceZoneTime : public RideMetric {
int level;
double seconds;
QList<int> lo;
QList<int> hi;
public:
PaceZoneTime() : level(0), seconds(0.0)
@@ -53,9 +50,9 @@ class PaceZoneTime : public RideMetric {
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride()) &&
if (spec.isEmpty(item->ride()) ||
// pace only makes sense for running or swimming
!item->isRun && !item->isSwim) {
(!item->isRun && !item->isSwim)) {
setValue(RideFile::NIL);
setCount(0);
return;
@@ -752,7 +749,347 @@ class PaceZonePTime10 : public RideMetric {
RideMetric *clone() const { return new PaceZonePTime10(*this); }
};
// Time in Zones I, II and III
class PaceZoneTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZoneTimeI)
double seconds;
public:
PaceZoneTimeI() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_PI");
setInternalName("PI Time in Pace Zone");
}
void initialize ()
{
setName(tr("PI Time in Pace Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Pace Zone I - Below AeT"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &)
{
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
// pace only makes sense for running or swimming
(!item->isRun && !item->isSwim)) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
const PaceZones *zone = item->context->athlete->paceZones(item->isSwim);
int zoneRange = item->paceZoneRange;
// get zone ranges
if (zone && zoneRange >= 0) {
double AeT = zone->getAeT(zoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->kph < AeT)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZoneTimeI(*this); }
};
class PaceZoneTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZoneTimeII)
double seconds;
public:
PaceZoneTimeII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_PII");
setInternalName("PII Time in Pace Zone");
}
void initialize ()
{
setName(tr("PII Time in Pace Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Pace Zone II - Between AeT and CV"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &)
{
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
// pace only makes sense for running or swimming
(!item->isRun && !item->isSwim)) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
const PaceZones *zone = item->context->athlete->paceZones(item->isSwim);
int zoneRange = item->paceZoneRange;
// get zone ranges
if (zone && zoneRange >= 0) {
double AeT = zone->getAeT(zoneRange);
double CV = zone->getCV(zoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->kph >= AeT && point->kph < CV)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZoneTimeII(*this); }
};
class PaceZoneTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZoneTimeIII)
double seconds;
public:
PaceZoneTimeIII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_PIII");
setInternalName("PIII Time in Pace Zone");
}
void initialize ()
{
setName(tr("PIII Time in Pace Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Pace Zone III - Above CV"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &)
{
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
// pace only makes sense for running or swimming
(!item->isRun && !item->isSwim)) {
setValue(RideFile::NIL);
setCount(0);
return;
}
double totalSecs = 0.0;
seconds = 0;
const PaceZones *zone = item->context->athlete->paceZones(item->isSwim);
int zoneRange = item->paceZoneRange;
// get zone ranges
if (zone && zoneRange >= 0) {
double CV = zone->getCV(zoneRange);
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->kph >= CV)
seconds += item->ride()->recIntSecs();
}
}
setValue(seconds);
setCount(totalSecs);
}
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZoneTimeIII(*this); }
};
// Now for Time In Zone as a Percentage of Ride Time
class PaceZonePTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZonePTimeI)
public:
PaceZonePTimeI()
{
setSymbol("percent_in_zone_PI");
setInternalName("PI Percent in Pace Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("PI Percent in Pace Zone"));
setDescription(tr("Percent of Time in Pace Zone I - Below AeT"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_PI"));
// compute
double time = deps.value("time_in_zone_PI")->count();
double inzone = deps.value("time_in_zone_PI")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZonePTimeI(*this); }
};
class PaceZonePTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZonePTimeII)
public:
PaceZonePTimeII()
{
setSymbol("percent_in_zone_PII");
setInternalName("PII Percent in Pace Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("PII Percent in Pace Zone"));
setDescription(tr("Percent of Time in Pace Zone II - Between AeT and CV"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_PII"));
// compute
double time = deps.value("time_in_zone_PII")->count();
double inzone = deps.value("time_in_zone_PII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZonePTimeII(*this); }
};
class PaceZonePTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(PaceZonePTimeIII)
public:
PaceZonePTimeIII()
{
setSymbol("percent_in_zone_PIII");
setInternalName("PIII Percent in Pace Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("PIII Percent in Pace Zone"));
setDescription(tr("Percent of Time in Pace Zone III - Above CV"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_PIII"));
// compute
double time = deps.value("time_in_zone_PIII")->count();
double inzone = deps.value("time_in_zone_PIII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
bool canAggregate() { return false; }
void aggregateWith(const RideMetric &) {}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new PaceZonePTimeIII(*this); }
};
static bool addAllZones() {
RideMetricFactory::instance().addMetric(PaceZoneTime1());
RideMetricFactory::instance().addMetric(PaceZoneTime2());
RideMetricFactory::instance().addMetric(PaceZoneTime3());
@@ -763,6 +1100,7 @@ static bool addAllZones() {
RideMetricFactory::instance().addMetric(PaceZoneTime8());
RideMetricFactory::instance().addMetric(PaceZoneTime9());
RideMetricFactory::instance().addMetric(PaceZoneTime10());
QVector<QString> deps;
deps.append("time_in_zone_P1");
RideMetricFactory::instance().addMetric(PaceZonePTime1(), &deps);
@@ -793,6 +1131,21 @@ static bool addAllZones() {
deps.clear();
deps.append("time_in_zone_P10");
RideMetricFactory::instance().addMetric(PaceZonePTime10(), &deps);
RideMetricFactory::instance().addMetric(PaceZoneTimeI());
RideMetricFactory::instance().addMetric(PaceZoneTimeII());
RideMetricFactory::instance().addMetric(PaceZoneTimeIII());
deps.clear();
deps.append("time_in_zone_PI");
RideMetricFactory::instance().addMetric(PaceZonePTimeI(), &deps);
deps.clear();
deps.append("time_in_zone_PII");
RideMetricFactory::instance().addMetric(PaceZonePTimeII(), &deps);
deps.clear();
deps.append("time_in_zone_PIII");
RideMetricFactory::instance().addMetric(PaceZonePTimeIII(), &deps);
return true;
}

View File

@@ -163,8 +163,9 @@
// 153 8 Dec 2019 Mark Liversedge Regenerate after v3.5 RC2/RC2X re-issue
// 154 18 Apr 2020 Mark Liversedge Added PeakPowerIndex (only for full rides)
// 155 27 Jun 2020 Mark Liversedge Added Ride Date as days since 1900,01,01
// 156 18 Mar 2021 Ale Martinez Added Time and % in Zones I, II and III
int DBSchemaVersion = 155;
int DBSchemaVersion = 156;
RideMetricFactory *RideMetricFactory::_instance;
QVector<QString> RideMetricFactory::noDeps;

View File

@@ -32,9 +32,6 @@ class ZoneTime : public RideMetric {
int level;
double seconds;
QList<int> lo;
QList<int> hi;
public:
ZoneTime() : level(0), seconds(0.0)
@@ -723,7 +720,311 @@ class ZonePTime10 : public RideMetric {
RideMetric *clone() const { return new ZonePTime10(*this); }
};
// Time in Zones I, II and III
class ZoneTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZoneTimeI)
double seconds;
public:
ZoneTimeI() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_LI");
setInternalName("LI Time in Zone");
}
void initialize ()
{
setName(tr("LI Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Power Zone I - Below AeT"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
item->context->athlete->zones(item->isRun) == NULL || item->zoneRange < 0 ||
!item->ride()->areDataPresent()->watts) {
setValue(RideFile::NIL);
setCount(0);
return;
}
int AeT = item->context->athlete->zones(item->isRun)->getAeT(item->zoneRange);
double totalSecs = 0.0;
seconds = 0;
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->watts < AeT)
seconds += item->ride()->recIntSecs();
}
setValue(seconds);
setCount(totalSecs);
}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZoneTimeI(*this); }
};
class ZoneTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZoneTimeII)
double seconds;
public:
ZoneTimeII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_LII");
setInternalName("LII Time in Zone");
}
void initialize ()
{
setName(tr("LII Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Power Zone II - Between AeT and CP"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
item->context->athlete->zones(item->isRun) == NULL || item->zoneRange < 0 ||
!item->ride()->areDataPresent()->watts) {
setValue(RideFile::NIL);
setCount(0);
return;
}
int AeT = item->context->athlete->zones(item->isRun)->getAeT(item->zoneRange);
int CP = item->context->athlete->zones(item->isRun)->getCP(item->zoneRange);
double totalSecs = 0.0;
seconds = 0;
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->watts >= AeT && point->watts < CP)
seconds += item->ride()->recIntSecs();
}
setValue(seconds);
setCount(totalSecs);
}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZoneTimeII(*this); }
};
class ZoneTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZoneTimeIII)
double seconds;
public:
ZoneTimeIII() : seconds(0.0)
{
setType(RideMetric::Total);
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setPrecision(0);
setConversion(1.0);
setSymbol("time_in_zone_LIII");
setInternalName("LIII Time in Zone");
}
void initialize ()
{
setName(tr("LIII Time in Zone"));
setMetricUnits(tr("seconds"));
setImperialUnits(tr("seconds"));
setDescription(tr("Time in Power Zone III - Above CP"));
}
bool isTime() const { return true; }
void compute(RideItem *item, Specification spec, const QHash<QString,RideMetric*> &) {
// no ride or no samples
if (spec.isEmpty(item->ride()) ||
item->context->athlete->zones(item->isRun) == NULL || item->zoneRange < 0 ||
!item->ride()->areDataPresent()->watts) {
setValue(RideFile::NIL);
setCount(0);
return;
}
int CP = item->context->athlete->zones(item->isRun)->getCP(item->zoneRange);
double totalSecs = 0.0;
seconds = 0;
// iterate and compute
RideFileIterator it(item->ride(), spec);
while (it.hasNext()) {
struct RideFilePoint *point = it.next();
totalSecs += item->ride()->recIntSecs();
if (point->watts >= CP)
seconds += item->ride()->recIntSecs();
}
setValue(seconds);
setCount(totalSecs);
}
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZoneTimeIII(*this); }
};
// Now for Time In Zones as a Percentage of Ride Time
class ZonePTimeI : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZonePTimeI)
public:
ZonePTimeI()
{
setSymbol("percent_in_zone_LI");
setInternalName("LI Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("LI Percent in Zone"));
setDescription(tr("Percent of Time in Power Zone I - Below AeT"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_LI"));
// compute
double time = deps.value("time_in_zone_LI")->count();
double inzone = deps.value("time_in_zone_LI")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZonePTimeI(*this); }
};
class ZonePTimeII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZonePTimeII)
public:
ZonePTimeII()
{
setSymbol("percent_in_zone_LII");
setInternalName("LII Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("LII Percent in Zone"));
setDescription(tr("Percent of Time in Power Zone II - Between AeT and CP"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_LII"));
// compute
double time = deps.value("time_in_zone_LII")->count();
double inzone = deps.value("time_in_zone_LII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZonePTimeII(*this); }
};
class ZonePTimeIII : public RideMetric {
Q_DECLARE_TR_FUNCTIONS(ZonePTimeIII)
public:
ZonePTimeIII()
{
setSymbol("percent_in_zone_LIII");
setInternalName("LIII Percent in Zone");
setType(RideMetric::Average);
setMetricUnits("%");
setImperialUnits("%");
setPrecision(0);
setConversion(1.0);
}
void initialize ()
{
setName(tr("LIII Percent in Zone"));
setDescription(tr("Percent of Time in Power Zone III - Above CP"));
}
void compute(RideItem *, Specification, const QHash<QString,RideMetric*> &deps)
{
assert(deps.contains("time_in_zone_LIII"));
// compute
double time = deps.value("time_in_zone_LIII")->count();
double inzone = deps.value("time_in_zone_LIII")->value(true);
if (time && inzone) setValue((inzone / time) * 100.00);
else setValue(0);
setCount(time);
}
bool aggregateZero() const { return true; }
MetricClass classification() const { return Undefined; }
MetricValidity validity() const { return Unknown; }
RideMetric *clone() const { return new ZonePTimeIII(*this); }
};
static bool addAllZones() {
RideMetricFactory::instance().addMetric(ZoneTime1());
RideMetricFactory::instance().addMetric(ZoneTime2());
RideMetricFactory::instance().addMetric(ZoneTime3());
@@ -734,6 +1035,7 @@ static bool addAllZones() {
RideMetricFactory::instance().addMetric(ZoneTime8());
RideMetricFactory::instance().addMetric(ZoneTime9());
RideMetricFactory::instance().addMetric(ZoneTime10());
QVector<QString> deps;
deps.append("time_in_zone_L1");
RideMetricFactory::instance().addMetric(ZonePTime1(), &deps);
@@ -764,6 +1066,21 @@ static bool addAllZones() {
deps.clear();
deps.append("time_in_zone_L10");
RideMetricFactory::instance().addMetric(ZonePTime10(), &deps);
RideMetricFactory::instance().addMetric(ZoneTimeI());
RideMetricFactory::instance().addMetric(ZoneTimeII());
RideMetricFactory::instance().addMetric(ZoneTimeIII());
deps.clear();
deps.append("time_in_zone_LI");
RideMetricFactory::instance().addMetric(ZonePTimeI(), &deps);
deps.clear();
deps.append("time_in_zone_LII");
RideMetricFactory::instance().addMetric(ZonePTimeII(), &deps);
deps.clear();
deps.append("time_in_zone_LIII");
RideMetricFactory::instance().addMetric(ZonePTimeIII(), &deps);
return true;
}

View File

@@ -9,12 +9,12 @@
<chart name="PMC (TriScore)">"AAAAHABQAE0AQwAgACgAVAByAGkAUwBjAG8AcgBlACkAAAAeANoAbAB0AGkAbQBvAHMAIAAzACAAbQBlAHMAZQBzACV9EwAAAAD/ACV+iQAAAAD/AAAAAQAB////////////////AAAAFQAAAAQAAAAHAAAAABAAdAByAGkAcwBjAG8AcgBlAAAAEABUAHIAaQBTAGMAbwByAGUAAAAGAEEAVABMAAAAEABUAHIAaQBTAGMAbwByAGUAAAAAAAEAAAAAAAAAAAAAAAABFWyo+GHfHk4VbKj4AAAAARVsqPj//////////wH/////AAD//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAPnAAAOEAAAABgAdAByAGkAcwBjAG8AcgBlAF8AbAB0AHMAAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAPnAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAABwAAAAAQAHQAcgBpAHMAYwBvAHIAZQAAABAAVAByAGkAUwBjAG8AcgBlAAAABgBDAFQATAAAABAAVAByAGkAUwBjAG8AcgBlAAAAAAABAAAAAAAAAAAAAAAAARVsqPhh3x5OFWyo+AAAAAEVbKj4//////////8B//9VVQAA//8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhAAAAAYAHQAcgBpAHMAYwBvAHIAZQBfAHMAdABzAAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAD5wAADhAAAQAAAAH//////////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAcAAAAAEAB0AHIAaQBzAGMAbwByAGUAAAAQAFQAcgBpAFMAYwBvAHIAZQAAAAYAVABTAEIAAAAQAFQAcgBpAFMAYwBvAHIAZQAAAAAAAAAAAAAAAAAAAAAAAAEVbKj4Yd8eThVsqPgAAAABFWyo+P//////////Af///////39/AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAA4QAAAAFgB0AHIAaQBzAGMAbwByAGUAXwBzAGIAAAAKAAAAAAAAAAABAAAADAAyACAAUABhAHIAbQAAAAAAAAPnAAAOEAABAAAAAv//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAABwAAAAAQAHQAcgBpAHMAYwBvAHIAZQAAABAAVAByAGkAUwBjAG8AcgBlAAAABABSAFIAAAAQAFQAcgBpAFMAYwBvAHIAZQAAAAAAAwAAAAAAAAAAAAAAAAEVbKj4Yd8eThVsqPgAAAABFWyo+P//////////Af//VVX//wAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAQAAA+cAAA4QAAAAFgB0AHIAaQBzAGMAbwByAGUAXwByAHIAAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAAAAAAOEAABAAAAA///////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAAAD"</chart>
<chart name="PMC (TRIMP)">"AAAAFgBQAE0AQwAgACgAVABSAEkATQBQACkAAAAWAFAATQBDACAAKABUAFIASQBNAFAAKQAlfRMAAAAA/wAlfrMAAAAA/wAAAAEAAP///////////////wAAABUAAAADAAAAAgAAAAASAHQAcgBpAG0AcABfAHMAdABzAAAALgBUAFIASQBNAFAAIABTAGgAbwByAHQAIABUAGUAcgBtACAAUwB0AHIAZQBzAHMAAAAuAFQAUgBJAE0AUAAgAFMAaABvAHIAdAAgAFQAZQByAG0AIABTAHQAcgBlAHMAcwAAAAwAUwB0AHIAZQBzAHMAAAAAAAEAAAAAAAAAAAAAAAABAAAAAQAAAAEFrZAAAAB//1+/qXD//////////wH/////xMT//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAACAAAOEP////8AAAAK/////wAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAPnAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAgAAAAASAHQAcgBpAG0AcABfAGwAdABzAAAALABUAFIASQBNAFAAIABMAG8AbgBnACAAVABlAHIAbQAgAFMAdAByAGUAcwBzAAAALABUAFIASQBNAFAAIABMAG8AbgBnACAAVABlAHIAbQAgAFMAdAByAGUAcwBzAAAADABTAHQAcgBlAHMAcwAAAAAAAQAAAAAAAAAAAAAAAAEAAH//AAB//1+/0sAAAH//X7/OMP//////////Af//qqr/////AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAIAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAMADIAIABQAGEAcgBtAAAAAAAAA+cAAA4QAAEAAAAA//////////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAACAAAAABAAdAByAGkAbQBwAF8AcwBiAAAAKABUAFIASQBNAFAAIABTAHQAcgBlAHMAcwAgAEIAYQBsAGEAbgBjAGUAAAAoAFQAUgBJAE0AUAAgAFMAdAByAGUAcwBzACAAQgBhAGwAYQBuAGMAZQAAAAwAUwB0AHIAZQBzAHMAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD//////////wH///////8AAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAOEP////8AAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAPnAAAOEAABAAAAAAAAABwAUwB0AHIAZQBzAHMAIABCAGEAbABhAG4AYwBl/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAg=="</chart>
<chart name="PMC (Session RPE)">"AAAAIgBQAE0AQwAgACgAUwBlAHMAcwBpAG8AbgAgAFIAUABFACkAAAAiAFAATQBDACAAKABTAGUAcwBzAGkAbwBuACAAUgBQAEUAKQAlfjYAAAAA/wAlfpEAAAAA/wAAAAEAAf///////////////wAAABUAAAAEAAAABwAAAAAWAHMAZQBzAHMAaQBvAG4AXwByAHAAZQAAABYAUwBlAHMAcwBpAG8AbgAgAFIAUABFAAAABgBBAFQATAAAABYAUwBlAHMAcwBpAG8AbgAgAFIAUABFAAAAAAABAAAAAAAAAAAAAAAAAQpN9wBh3x5OCk33AAAAAAEKTfcA//////////8B/////wAA//8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhAAAAAeAHMAZQBzAHMAaQBvAG4AXwByAHAAZQBfAGwAdABzAAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAD5wAADhAAAQAAAAAAAAAA/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAcAAAAAFgBzAGUAcwBzAGkAbwBuAF8AcgBwAGUAAAAWAFMAZQBzAHMAaQBvAG4AIABSAFAARQAAAAYAQwBUAEwAAAAWAFMAZQBzAHMAaQBvAG4AIABSAFAARQAAAAAAAQAAAAAAAAAAAAAAAAEKTfcAYd8eTgpN9wAAAAABCk33AP//////////Af//VVUAAP//AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAA+cAAA4QAAAAHgBzAGUAcwBzAGkAbwBuAF8AcgBwAGUAXwBzAHQAcwAAAAoAAAAAAAAAAAAAAAAMADIAIABQAGEAcgBtAAAAAAAAA+cAAA4QAAEAAAABAAAAAP////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAAHAAAAABYAcwBlAHMAcwBpAG8AbgBfAHIAcABlAAAAFgBTAGUAcwBzAGkAbwBuACAAUgBQAEUAAAAGAFQAUwBCAAAAFgBTAGUAcwBzAGkAbwBuACAAUgBQAEUAAAAAAAEAAAAAAAAAAAAAAAABCk33AGHfHk4KTfcAAAAAAQpN9wD//////////wH///////9/fwAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAOEAAAABwAcwBlAHMAcwBpAG8AbgBfAHIAcABlAF8AcwBiAAAACgAAAAAAAAAAAQAAAAwAMgAgAFAAYQByAG0AAAAAAAAD5wAADhAAAQAAAAIAAAAA/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAcAAAAAFgBzAGUAcwBzAGkAbwBuAF8AcgBwAGUAAAAWAFMAZQBzAHMAaQBvAG4AIABSAFAARQAAAAQAUgBSAAAAFgBTAGUAcwBzAGkAbwBuACAAUgBQAEUAAAAAAAMAAAAAAAAAAAAAAAABCk33AGHfHk4KTfcAAAAAAQpN9wD//////////wH//6qq//9/fwAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAEAAAPnAAAOEAAAABwAcwBlAHMAcwBpAG8AbgBfAHIAcABlAF8AcgByAAAACgAAAAAAAAAAAwAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAMAAAAA/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
<chart name="CP History">"AAAAFABDAFAAIABIAGkAcwB0AG8AcgB5AAAACAAyADAAMAA5ACV0mAAAAAD/ACV2QQAAAAD/AAAAAQAB////////////////AAAAFQAAAAQAAAAGAAAAABAAQwBQAF8AKABFAHgAdAApAAAAAAAAABAAQwBQACAAKABFAHgAdAApAAAACgBXAGEAdAB0AHMAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAf//0gZauAAB/////qLD//////////wH/////9fUAAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAPnAAAOEP////8AAAAKAAAAAAAAAAABAAAABgBFAHgAdAAAAAEAAAPnAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAQAAAAAUAGMAcABfAHMAZQB0AHQAaQBuAGcAAAAcAEMAcgBpAHQAaQBjAGEAbAAgAFAAbwB3AGUAcgAAABwAQwByAGkAdABpAGMAYQBsACAAUABvAHcAZQByAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAEAAH/dAAAAAAAAATgAAAAABLvJMP//////////Af////9MzQAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAMADIAIABQAGEAcgBtAAAAAAAAAAEAAA4QAAEAAAAAAAAAAP////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAAGAAAAABAAVwAnAF8AKABFAHgAdAApAAAAAAAAABAAVwAnACAAKABFAHgAdAApAAAADABKAG8AdQBsAGUAcwAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAALlbUAAAAAAAAAAGP//////////Af//AAD/////AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAAAAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAGAEUAeAB0AAAAAAAAAAEAAA4QAAEAAAAA//////////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAAGAAAAABYAcAAtAE0AYQB4AF8AKABFAHgAdAApAAAAAAAAABYAcAAtAE0AYQB4ACAAKABFAHgAdAApAAAACgBXAGEAdAB0AHMAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAABj//////////wH//1VV//8AAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAHAAAAOEP////8AAAAKAAAAAAAAAAABAAAABgBFAHgAdAAAAAMAAAABAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAAAD"</chart>
<chart name="CP History">"AAAAFABDAFAAIABIAGkAcwB0AG8AcgB5AAAAFABDAFAAIABIAGkAcwB0AG8AcgB5ACWCCAAAAAD/ACWDdAAAAAD/AAAAAQAB////////////////AAAAFQAAAAQAAAAGAAAAABAAQwBQAF8AKABlAHgAdAApAAAAAAAAABAAQwBQACAAKABlAHgAdAApAAAACgBXAGEAdAB0AHMAAAAAAAEAAAAAAAAAAAAAAAABAAAAAAAAf//0gZauAAB/////qLD//////////wH/////9fUAAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAPnAAAOEP////8AAAAKAAAAAAAAAAABAAAABgBlAHgAdAAAAAEAAAPnAAAOEAABAAAAAP////8AAAEEACMAIAB0AHkAcABlACAAaQBuACAAYQAgAGYAbwByAG0AdQBsAGEAIAB0AG8AIAB1AHMAZQAKACMAIABmAG8AcgAgAGUALgBnAC4AIABCAGkAawBlAFMAdAByAGUAcwBzACAALwAgAEQAdQByAGEAdABpAG8AbgAKACMAIABhAHMAIAB5AG8AdQAgAHQAeQBwAGUAIAB0AGgAZQAgAGEAdgBhAGkAbABhAGIAbABlACAAbQBlAHQAcgBpAGMAcwAKACMAIAB3AGkAbABsACAAYgBlACAAbwBmAGYAZQByAGUAZAAgAGIAeQAgAGEAdQB0AG8AYwBvAG0AcABsAGUAdABlAAoAAAABAAAADgBzAGUAYQByAGMAaAA6AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAEAAAAAFABjAHAAXwBzAGUAdAB0AGkAbgBnAAAAHABDAHIAaQB0AGkAYwBhAGwAIABQAG8AdwBlAHIAAAAcAEMAcgBpAHQAaQBjAGEAbAAgAFAAbwB3AGUAcgAAAAAAAAAAAAEAAAAAAAAAAAAAAAABAAB/3QAAAAAAAAE4AAAAAAS7yTD//////////wH/////TM0AAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAOEP////8AAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAABAAAOEAABAAAAAAAAAAD/////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAABgAAAAAQAFcAJwBfACgAZQB4AHQAKQAAAAAAAAAQAFcAJwAgACgAZQB4AHQAKQAAAAwASgBvAHUAbABlAHMAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAC5W1AAAAAAAAAABj//////////wH//wAA/////wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAOEP////8AAAAKAAAAAAAAAAAAAAAABgBlAHgAdAAAAAAAAAABAAAOEAABAAAAAP////8AAAEEACMAIAB0AHkAcABlACAAaQBuACAAYQAgAGYAbwByAG0AdQBsAGEAIAB0AG8AIAB1AHMAZQAKACMAIABmAG8AcgAgAGUALgBnAC4AIABCAGkAawBlAFMAdAByAGUAcwBzACAALwAgAEQAdQByAGEAdABpAG8AbgAKACMAIABhAHMAIAB5AG8AdQAgAHQAeQBwAGUAIAB0AGgAZQAgAGEAdgBhAGkAbABhAGIAbABlACAAbQBlAHQAcgBpAGMAcwAKACMAIAB3AGkAbABsACAAYgBlACAAbwBmAGYAZQByAGUAZAAgAGIAeQAgAGEAdQB0AG8AYwBvAG0AcABsAGUAdABlAAoAAAABAAAADgBzAGUAYQByAGMAaAA6AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAYAAAAAFgBwAC0ATQBhAHgAXwAoAGUAeAB0ACkAAAAAAAAAFgBwAC0ATQBhAHgAIAAoAGUAeAB0ACkAAAAKAFcAYQB0AHQAcwAAAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAGP//////////Af//VVX//wAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAcAAAA4Q/////wAAAAoAAAAAAAAAAAEAAAAGAGUAeAB0AAAAAwAAAAEAAA4QAAEAAAAA/////wAAAQQAIwAgAHQAeQBwAGUAIABpAG4AIABhACAAZgBvAHIAbQB1AGwAYQAgAHQAbwAgAHUAcwBlAAoAIwAgAGYAbwByACAAZQAuAGcALgAgAEIAaQBrAGUAUwB0AHIAZQBzAHMAIAAvACAARAB1AHIAYQB0AGkAbwBuAAoAIwAgAGEAcwAgAHkAbwB1ACAAdAB5AHAAZQAgAHQAaABlACAAYQB2AGEAaQBsAGEAYgBsAGUAIABtAGUAdAByAGkAYwBzAAoAIwAgAHcAaQBsAGwAIABiAGUAIABvAGYAZgBlAHIAZQBkACAAYgB5ACAAYQB1AHQAbwBjAG8AbQBwAGwAZQB0AGUACgAAAAEAAAAOAHMAZQBhAHIAYwBoADoAAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAAAD"</chart>
<chart name="Athlete Weight">"AAAAHABBAHQAaABsAGUAdABlACAAVwBlAGkAZwBoAHQAAAAIADIAMAAxADAAJXaeAAAAAP8AJXgLAAAAAP8AAAABAAH///////////////8AAAAVAAAAAwAAAAEAAAAAJgBhAHQAaABsAGUAdABlAF8AZgBhAHQAXwBwAGUAcgBjAGUAbgB0AAAALgBBAHQAaABsAGUAdABlACAAQgBvAGQAeQBmAGEAdAAgAFAAZQByAGMAZQBuAHQAAAAuAEEAdABoAGwAZQB0AGUAIABCAG8AZAB5AGYAYQB0ACAAUABlAHIAYwBlAG4AdAAAAAIAJQAAAAAAAAAAAAAAAAAAAAAAAAEAAH/vAAAAAAAAAUAAAAAABFsU4AAAAAL/////Af///////39/AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAA+cAAA4Q/////wAAAAoAAAADAAAAAAAAAAAMADIAIABQAGEAcgBtAAAAAAAAAAAAAA4QAAEAAAAAAAAAAgAl/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAEAAAAAHABhAHQAaABsAGUAdABlAF8AdwBlAGkAZwBoAHQAAAAcAEEAdABoAGwAZQB0AGUAIABXAGUAaQBnAGgAdAAAABwAQQB0AGgAbABlAHQAZQAgAFcAZQBpAGcAaAB0AAAABABrAGcAAAAAAAEAAAAAAAAAAAAAAAABAAB/ZwAAAAAAAAFAAAAAAAiZ7KAAAAAC/////wH//6qqqqr//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAAAAAOEP////8AAAAKAAAAAwAAAAABAAAADAAyACAAUABhAHIAbQAAAAAAAAAAAAAOEAEBAAAAAAAAAAQAawBn/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAEAAAAAGABhAHQAaABsAGUAdABlAF8AbABlAGEAbgAAACYAQQB0AGgAbABlAHQAZQAgAEwAZQBhAG4AIABXAGUAaQBnAGgAdAAAACYAQQB0AGgAbABlAHQAZQAgAEwAZQBhAG4AIABXAGUAaQBnAGgAdAAAAAQAawBnAAAAAAAAAAAAAAAAAAAAAAAAAQAAf/8AAAAAAAAAAAAAAAAAAAAQAAAAAv////8B//9VVf//AAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAMAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAAAAAAEAGsAZ/////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAAAAAA="</chart>
<chart name="Vo2max Estimation">"AAAAIgBWAG8AMgBtAGEAeAAgAEUAcwB0AGkAbQBhAHQAaQBvAG4AAAAIADIAMAAwADkAJXSlAAAAAP8AJXZBAAAAAP8AAAABAAH///////////////8AAAAVAAAAAgAAAAYAAAAAKgBWAG8AMgBNAGEAeABfAEUAcwB0AGkAbQBhAHQAZQBfACgARQB4AHQAKQAAAAAAAAAqAFYAbwAyAE0AYQB4ACAARQBzAHQAaQBtAGEAdABlACAAKABFAHgAdAApAAAAEgBtAGwALwBtAGkAbgAvAGsAZwAAAAAAAQAAAAAAAAAAAAAAAAEAAAAAAAB//aV4hgAAAAAACNrdEP//////////Af//VVWqqv//AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAA+cAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAGAEUAeAB0AAAABgAAABQAAAA8AQEAAAAA//////////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAAAwAdgBvADIAbQBhAHgAAAAgAEUAcwB0AGkAbQBhAHQAZQBkACAAVgBPADIATQBBAFgAAAAgAEUAcwB0AGkAbQBhAHQAZQBkACAAVgBPADIATQBBAFgAAAASAG0AbAAvAG0AaQBuAC8AawBnAAAAAAABAAAAAAAAAAAAAAAAAQAAf2UAAAAAAAABQAAAAAAI4BnQAAAAAgAAAAAB//9VVf////8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAAAAAASAG0AbAAvAG0AaQBuAC8AawBn/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
<chart name="Vo2max Estimation">"AAAAIgBWAG8AMgBtAGEAeAAgAEUAcwB0AGkAbQBhAHQAaQBvAG4AAAAiAFYAbwAyAG0AYQB4ACAARQBzAHQAaQBtAGEAdABpAG8AbgAlgggAAAAA/wAlg3QAAAAA/wAAAAEAAf///////////////wAAABUAAAACAAAABgAAAAAqAFYAbwAyAE0AYQB4AF8ARQBzAHQAaQBtAGEAdABlAF8AKABlAHgAdAApAAAAAAAAACoAVgBvADIATQBhAHgAIABFAHMAdABpAG0AYQB0AGUAIAAoAGUAeAB0ACkAAAASAG0AbAAvAG0AaQBuAC8AawBnAAAAAAABAAAAAAAAAAAAAAAAAQAAAAAAAH/9pXiGAAAAAAAI2t0Q//////////8B//9VVaqq//8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAYAZQB4AHQAAAAGAAAAFAAAADwBAQAAAAD/////AAABBAAjACAAdAB5AHAAZQAgAGkAbgAgAGEAIABmAG8AcgBtAHUAbABhACAAdABvACAAdQBzAGUACgAjACAAZgBvAHIAIABlAC4AZwAuACAAQgBpAGsAZQBTAHQAcgBlAHMAcwAgAC8AIABEAHUAcgBhAHQAaQBvAG4ACgAjACAAYQBzACAAeQBvAHUAIAB0AHkAcABlACAAdABoAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAgAG0AZQB0AHIAaQBjAHMACgAjACAAdwBpAGwAbAAgAGIAZQAgAG8AZgBmAGUAcgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwBtAHAAbABlAHQAZQAKAAAAAQAAAA4AcwBlAGEAcgBjAGgAOgAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAAAwAdgBvADIAbQBhAHgAAAAgAEUAcwB0AGkAbQBhAHQAZQBkACAAVgBPADIATQBBAFgAAAAgAEUAcwB0AGkAbQBhAHQAZQBkACAAVgBPADIATQBBAFgAAAASAG0AbAAvAG0AaQBuAC8AawBnAAAAAAABAAAAAAAAAAAAAAAAAQAAf2UAAAAAAAABQAAAAAAI4BnQAAAAAgAAAAAB//9VVf////8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAAAAAASAG0AbAAvAG0AaQBuAC8AawBn/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
<chart name="KPI Tracker">"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"</chart>
<chart name="Sustained Time In Zone">"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"</chart>
<chart name="CP Analysis">"AAAAFgBDAFAAIABBAG4AYQBsAHkAcwBpAHMAAAAWAEMAUAAgAEEAbgBhAGwAeQBzAGkAcwAlfjgAAAAA/wAlfpMCX2wA/wAAAAEAAP///////////////wAAABUAAAAEAAAABgAAAAAWAEMAUABfACgAMgBfAFAAYQByAG0AKQAAAAAAAAAWAEMAUAAgACgAMgAgAFAAYQByAG0AKQAAAAoAVwBhAHQAdABzAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAH/95Hp3YAAAAAAJPWLg//////////8B////////AAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAABAAAAAAAADhAAAQAAAAD//////////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAEAAAAAFABjAHAAXwBzAGUAdAB0AGkAbgBnAAAAHABDAHIAaQB0AGkAYwBhAGwAIABQAG8AdwBlAHIAAAAeAEMAUAAgACgAQwBvAG4AZgBpAGcAdQByAGUAZAApAAAACgBXAGEAdAB0AHMAAAAAAAEAAAAAAAAAAAAAAAABAAB/3gAAAAAAAAEoAAAAAAmwJ2D//////////wH/////AAAAAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAwAAAOEP////8AAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAAAAAAOEAABAAAAAAAAAAD/////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAABQD/////AAAAAAAAABIAMwAwAG0AIABQAG8AdwBlAHIAAAAKAFcAYQB0AHQAcwAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAvbypAAAAAAAAAAQAAAAAIAAAAAAf////9VVf//AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAB4AAAA8AAAAKABQAGUAYQBrAF8AMwAwAF8AbQBpAG4AdQB0AGUAXwBQAG8AdwBlAHIAAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAAAAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAABQD/////AAAAAAAAABIANAA1AG0AIABQAG8AdwBlAHIAAAAKAFcAYQB0AHQAcwAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAvbypAAAAAAAAAAQAAAAAIAAAAAAf////+qqv//AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAAC0AAAA8AAAAKABQAGUAYQBrAF8ANAA1AF8AbQBpAG4AdQB0AGUAXwBQAG8AdwBlAHIAAAAKAAAAAAAAAAAAAAAADAAyACAAUABhAHIAbQAAAAAAAAAAAAAOEAABAAAAAP//////////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAAAD"</chart>
<chart name="CP Analysis">"AAAAFgBDAFAAIABBAG4AYQBsAHkAcwBpAHMAAAAWAEMAUAAgAEEAbgBhAGwAeQBzAGkAcwAlgggAAAAA/wAlg3QAAAAA/wAAAAEAAP///////////////wAAABUAAAAEAAAABgAAAAAQAEMAUABfACgAYwBwADIAKQAAAAAAAAAQAEMAUAAgACgAYwBwADIAKQAAAAoAVwBhAHQAdABzAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAH/95Hp3YAAAAAAJPWLg//////////8B////////AAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAYAYwBwADIAAAABAAAAAAAADhAAAQAAAAD/////AAABBAAjACAAdAB5AHAAZQAgAGkAbgAgAGEAIABmAG8AcgBtAHUAbABhACAAdABvACAAdQBzAGUACgAjACAAZgBvAHIAIABlAC4AZwAuACAAQgBpAGsAZQBTAHQAcgBlAHMAcwAgAC8AIABEAHUAcgBhAHQAaQBvAG4ACgAjACAAYQBzACAAeQBvAHUAIAB0AHkAcABlACAAdABoAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAgAG0AZQB0AHIAaQBjAHMACgAjACAAdwBpAGwAbAAgAGIAZQAgAG8AZgBmAGUAcgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwBtAHAAbABlAHQAZQAKAAAAAQAAAA4AcwBlAGEAcgBjAGgAOgAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAABQAYwBwAF8AcwBlAHQAdABpAG4AZwAAABwAQwByAGkAdABpAGMAYQBsACAAUABvAHcAZQByAAAAHgBDAFAAIAAoAEMAbwBuAGYAaQBnAHUAcgBlAGQAKQAAAAoAVwBhAHQAdABzAAAAAAABAAAAAAAAAAAAAAAAAQAAf94AAAAAAAABKAAAAAAJsCdg//////////8B/////wAAAAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAAMAAADhD/////AAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAAAAAAA/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAUA/////wAAAAAAAAASADMAMABtACAAUABvAHcAZQByAAAACgBXAGEAdAB0AHMAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAL28qQAAAAAAAAAEAAAAACAAAAAAH/////VVX//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAeAAAAPAAAACgAUABlAGEAawBfADMAMABfAG0AaQBuAHUAdABlAF8AUABvAHcAZQByAAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAD//////////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAUA/////wAAAAAAAAASADQANQBtACAAUABvAHcAZQByAAAACgBXAGEAdAB0AHMAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAL28qQAAAAAAAAAEAAAAACAAAAAAH/////qqr//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAAtAAAAPAAAACgAUABlAGEAawBfADQANQBfAG0AaQBuAHUAdABlAF8AUABvAHcAZQByAAAACgAAAAAAAAAAAAAAAAwAMgAgAFAAYQByAG0AAAAAAAAAAAAADhAAAQAAAAD//////////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
<chart name="Time in W&apos; Zone">"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"</chart>
<chart name="Time In Power Zone">"AAAAJABUAGkAbQBlACAASQBuACAAUABvAHcAZQByACAAWgBvAG4AZQAAACQAVABpAG0AZQAgAEkAbgAgAFAAbwB3AGUAcgAgAFoAbwBuAGUAJX44AAAAAP8AJX6NA4NOqP8BWcLAAAD///////////////8AAAAVAAAAAwAAAAEBAAAAHgB0AGkAbQBlAF8AaQBuAF8AegBvAG4AZQBfAEwAMwAAAB4ATAAzACAAVABpAG0AZQAgAGkAbgAgAFoAbwBuAGUAAAAeAEwAMwAgAFQAaQBtAGUAIABpAG4AIABaAG8AbgBlAAAADgBzAGUAYwBvAG4AZABzAAAAAAAAAAAAAAAAAAAAAAAAAQAAf/8AAAAAAUfhCAAAAAABZKioAAAAAQAAAAAB///NzdnZ//8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAA478bQAAAf///////AUfhCAAAAAAAAAAAAAAAAAAAAABAAAAAAAZ7DgkBAQAAAAAAAAAOAHMAZQBjAG8AbgBkAHP/////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAQEAAAAeAHQAaQBtAGUAXwBpAG4AXwB6AG8AbgBlAF8ATAA0AAAAHgBMADQAIABUAGkAbQBlACAAaQBuACAAWgBvAG4AZQAAAB4ATAA0ACAAVABpAG0AZQAgAGkAbgAgAFoAbwBuAGUAAAAOAHMAZQBjAG8AbgBkAHMAAAAAAAAAAAAAAAAAAAAAAAABAAB//wAAAAABR+EIAAAAAAFkqKgAAAABAAAAAAH//1VVYGD//wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAIOrhcAAB/mf////8AAAACAAAAAAAAAAAAAAAAAAFOSFAAAAAAAWDVQAABAAAAAAAAAA4AcwBlAGMAbwBuAGQAc/////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAQAAAB4AdABpAG0AZQBfAGkAbgBfAHoAbwBuAGUAXwBMADUAAAAeAEwANQAgAFQAaQBtAGUAIABpAG4AIABaAG8AbgBlAAAAHgBMADUAIABUAGkAbQBlACAAaQBuACAAWgBvAG4AZQAAAA4AcwBlAGMAbwBuAGQAcwAAAAAAAAAAAAAAAAAAAAAAAAEAAH//AAAAAAFH4QgAAAAAAWSoqAAAAAEAAAAAAf/////AwFpaAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAg6uFwAAH+Z/////wAAAAIAAAAAAAAAAAAAAAAAAU5IUAAAAAABYNVAAAEAAAAAAAAADgBzAGUAYwBvAG4AZABz/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAABAAAAAA=="</chart>
<chart name="Time In HR Zone">"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"</chart>
@@ -32,4 +32,10 @@
<chart name="Time &amp; Distance">"AAAAHgBUAGkAbQBlACAAJgAgAEQAaQBzAHQAYQBuAGMAZf////8AAAAA//////8AAAAA//////8BYM1AAAD///////////////8AAAAVAAAAAwAAAAEAAAAAGAB3AG8AcgBrAG8AdQB0AF8AdABpAG0AZQAAABAARAB1AHIAYQB0AGkAbwBuAAAAEABEAHUAcgBhAHQAaQBvAG4AAAAOAHMAZQBjAG8AbgBkAHMAAAAAAAUAAAAAAAAAAAAAAAABAAB//wAAAAABR+EIAAAAAAFgqHgAAAABAAAAAAH//wAA/////wAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAADjvxtAAAB///////8BR+EIAAAAAAAAAAAAAAAAAAAAAEAAAAAABnsOCQEBAAAAAAAAAA4AcwBlAGMAbwBuAGQAc/////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAABwAdABvAHQAYQBsAF8AZABpAHMAdABhAG4AYwBlAAAAEABEAGkAcwB0AGEAbgBjAGUAAAAQAEQAaQBzAHQAYQBuAGMAZQAAAAQAawBtAAAAAAAFAAAAAAAAAAAAAAAAAQAAf/8AAAAAAUfhCAAAAAABYKh4/////wAAAAEB//+qqgAAAAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAACDq4XAAAf5n/////AAAAAgAAAAAAAAAAAAAAAAABTkhQAAAAAAFg1UAAAQAAAAAAAAAEAGsAbf////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAABYAdABpAG0AZQBfAHIAaQBkAGkAbgBnAAAAFgBUAGkAbQBlACAATQBvAHYAaQBuAGcAAAAWAFQAaQBtAGUAIABNAG8AdgBpAG4AZwAAAA4AcwBlAGMAbwBuAGQAcwAAAAAABQAAAAAAAAAAAAAAAAEAAH//AAAAAAFH4QgAAAAAAWCoeAAAAAEAAAAAAf//AABVVX9/AAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAg6uFwAAH+Z/////wAAAAIAAAAAAAAAAAAAAAAAAU5IUAAAAAABYNVAAAEAAAAAAAAADgBzAGUAYwBvAG4AZABz/////wAAAAH/////AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAABAAAAAA=="</chart>
<chart name="Stress and Distance">"AAAAJgBTAHQAcgBlAHMAcwAgAGEAbgBkACAARABpAHMAdABhAG4AYwBl/////wAAAAD//////wAAAAD//////wFk08AAAP///////////////wAAABUAAAACAAAAAQAAAAAUAGMAbwBnAGcAYQBuAF8AdABzAHMAAAAUAEIAaQBrAGUAUwB0AHIAZQBzAHMAAAAGAFQAUwBT/////wAAAAAAAAAAAAAAAAAAAAAAAAEAAH//AAAAAAFH4QgAAAAAAWDz+AAAAAEAAAAAAf///////wAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAOO/G0AAAH///////wFH4QgAAAAAAAAAAAAAAAAAAAAAQAAAAAAGew4JAQEAAAAA//////////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAABwAdABvAHQAYQBsAF8AZABpAHMAdABhAG4AYwBlAAAAEABEAGkAcwB0AGEAbgBjAGUAAAAQAEQAaQBzAHQAYQBuAGMAZQAAAAQAawBtAAAAAAAAAAAAAAAAAAAAAAAAAQAAf/8AAAAAAUfhCAAAAAABYPP4AAAAAgAAAAIB/////wAAAAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAACDq4XAAAf5n/////AAAAAgAAAAAAAAAAAAAAAAABTkhQAAAAAAFg1UAAAQAAAAAAAAAEAGsAbf////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAQAAAAA="</chart>
<chart name="Calories vs Duration">"AAAAKABDAGEAbABvAHIAaQBlAHMAIAB2AHMAIABEAHUAcgBhAHQAaQBvAG7/////AAAAAP//////AAAAAP//////AWDLcAAA////////////////AAAAFQAAAAIAAAABAAAAABQAdABvAHQAYQBsAF8AdwBvAHIAawAAAAgAVwBvAHIAawAAAAgAVwBvAHIAawAAAAQAawBKAAAAAAAAAAAAAAAAAAAAAAAAAQAAf/8AAAAAAUfhCAAAAAABYMLI/////wAAAAAB//8AAAAAf38AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAA478bQAAAf///////AUfhCAAAAAAAAAAAAAAAAAAAAABAAAAAAAZ7DgkBAQAAAAAAAAAEAGsASv////8AAAAB/////wAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAABgAdwBvAHIAawBvAHUAdABfAHQAaQBtAGUAAAAQAEQAdQByAGEAdABpAG8AbgAAABAARAB1AHIAYQB0AGkAbwBuAAAADgBzAGUAYwBvAG4AZABzAAAAAAACAAAAAAAAAAAAAAAAAQAAf/8AAAAAAUfhCAAAAAABYMLIAAAAAQAAAAAB//9OTpub//8AAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAACDq4XAAAf5n/////AAAAAgAAAAAAAAAAAAAAAAABTkhQAAAAAAFg1UAAAQAAAAAAAAAOAHMAZQBjAG8AbgBkAHP/////AAAAAf////8AAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAEAAAAA"</chart>
<chart name="Time in HR Zones I-II-III">"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"</chart>
<chart name="Percent in HR Zones I-II-III">"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"</chart>
<chart name="Time in Power Zones I-II-III">"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"</chart>
<chart name="Percent in Power Zones I-II-III">"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"</chart>
<chart name="Time in Pace Zones I-II-III">"AAAANgBUAGkAbQBlACAAaQBuACAAUABhAGMAZQAgAFoAbwBuAGUAcwAgAEkALQBJAEkALQBJAEkASQAAADYAVABpAG0AZQAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAHMAIABJAC0ASQBJAC0ASQBJAEkAJYIIAAAAAP8AJYN0AAAAAP8AAAABAAD///////////////8AAAAVAAAAAwAAAAEAAAAAHgB0AGkAbQBlAF8AaQBuAF8AegBvAG4AZQBfAFAASQAAACgAUABJACAAVABpAG0AZQAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAAKABQAEkAIABUAGkAbQBlACAAaQBuACAAUABhAGMAZQAgAFoAbwBuAGUAAAAOAHMAZQBjAG8AbgBkAHMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAAFsAAAAB/////wH//wAA//8AAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAPnAAAOEP////8AAAAKAAAAAAAAAAAAAAAABgBjAHAAMgAAAAAAAAAAAAAOEAAAAAAAAAAAAA4AcwBlAGMAbwBuAGQAcwAAAQQAIwAgAHQAeQBwAGUAIABpAG4AIABhACAAZgBvAHIAbQB1AGwAYQAgAHQAbwAgAHUAcwBlAAoAIwAgAGYAbwByACAAZQAuAGcALgAgAEIAaQBrAGUAUwB0AHIAZQBzAHMAIAAvACAARAB1AHIAYQB0AGkAbwBuAAoAIwAgAGEAcwAgAHkAbwB1ACAAdAB5AHAAZQAgAHQAaABlACAAYQB2AGEAaQBsAGEAYgBsAGUAIABtAGUAdAByAGkAYwBzAAoAIwAgAHcAaQBsAGwAIABiAGUAIABvAGYAZgBlAHIAZQBkACAAYgB5ACAAYQB1AHQAbwBjAG8AbQBwAGwAZQB0AGUACgAAAAEAAAAOAHMAZQBhAHIAYwBoADoAAAAAAAAAAAEBAQAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAQAAAAAgAHQAaQBtAGUAXwBpAG4AXwB6AG8AbgBlAF8AUABJAEkAAAAqAFAASQBJACAAVABpAG0AZQAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAAKgBQAEkASQAgAFQAaQBtAGUAIABpAG4AIABQAGEAYwBlACAAWgBvAG4AZQAAAA4AcwBlAGMAbwBuAGQAcwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuAAAAWwAAAAH/////Af///////wAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAA+cAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAGAGMAcAAyAAAAAAAAA+cAAA4QAAAAAAAAAAAADgBzAGUAYwBvAG4AZABzAAABBAAjACAAdAB5AHAAZQAgAGkAbgAgAGEAIABmAG8AcgBtAHUAbABhACAAdABvACAAdQBzAGUACgAjACAAZgBvAHIAIABlAC4AZwAuACAAQgBpAGsAZQBTAHQAcgBlAHMAcwAgAC8AIABEAHUAcgBhAHQAaQBvAG4ACgAjACAAYQBzACAAeQBvAHUAIAB0AHkAcABlACAAdABoAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAgAG0AZQB0AHIAaQBjAHMACgAjACAAdwBpAGwAbAAgAGIAZQAgAG8AZgBmAGUAcgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwBtAHAAbABlAHQAZQAKAAAAAQAAAA4AcwBlAGEAcgBjAGgAOgAAAAAAAAAAAQEBAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAAAAACIAdABpAG0AZQBfAGkAbgBfAHoAbwBuAGUAXwBQAEkASQBJAAAALABQAEkASQBJACAAVABpAG0AZQAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAALABQAEkASQBJACAAVABpAG0AZQAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAADgBzAGUAYwBvAG4AZABzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAABbAAAAAf////8B/////zMzAAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAYAYwBwADIAAAAAAAAD5wAADhAAAAAAAAAAAAAOAHMAZQBjAG8AbgBkAHMAAAEEACMAIAB0AHkAcABlACAAaQBuACAAYQAgAGYAbwByAG0AdQBsAGEAIAB0AG8AIAB1AHMAZQAKACMAIABmAG8AcgAgAGUALgBnAC4AIABCAGkAawBlAFMAdAByAGUAcwBzACAALwAgAEQAdQByAGEAdABpAG8AbgAKACMAIABhAHMAIAB5AG8AdQAgAHQAeQBwAGUAIAB0AGgAZQAgAGEAdgBhAGkAbABhAGIAbABlACAAbQBlAHQAcgBpAGMAcwAKACMAIAB3AGkAbABsACAAYgBlACAAbwBmAGYAZQByAGUAZAAgAGIAeQAgAGEAdQB0AG8AYwBvAG0AcABsAGUAdABlAAoAAAABAAAADgBzAGUAYQByAGMAaAA6AAAAAAAAAAABAQEAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
<chart name="Percent in Pace Zones I-II-III">"AAAAPABQAGUAcgBjAGUAbgB0ACAAaQBuACAAUABhAGMAZQAgAFoAbwBuAGUAcwAgAEkALQBJAEkALQBJAEkASQAAADwAUABlAHIAYwBlAG4AdAAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAHMAIABJAC0ASQBJAC0ASQBJAEkAJYIIAAAAAP8AJYN0AAAAAP8AAAABAAD///////////////8AAAAVAAAAAwAAAAEBAAAAJABwAGUAcgBjAGUAbgB0AF8AaQBuAF8AegBvAG4AZQBfAFAASQAAAC4AUABJACAAUABlAHIAYwBlAG4AdAAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAALgBQAEkAIABQAGUAcgBjAGUAbgB0ACAAaQBuACAAUABhAGMAZQAgAFoAbwBuAGUAAAACACUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAbgAAAFsAAAAB/////wH//wAA//8AAAAAAAAAAD/wAAAAAAAAAAAAAAH//wAAAAAAAAAAAAAAAAAAAAPnAAAOEP////8AAAAKAAAAAAAAAAAAAAAABgBjAHAAMgAAAAAAAAAAAAAOEAAAAAAAAAAAAAIAJQAAAQQAIwAgAHQAeQBwAGUAIABpAG4AIABhACAAZgBvAHIAbQB1AGwAYQAgAHQAbwAgAHUAcwBlAAoAIwAgAGYAbwByACAAZQAuAGcALgAgAEIAaQBrAGUAUwB0AHIAZQBzAHMAIAAvACAARAB1AHIAYQB0AGkAbwBuAAoAIwAgAGEAcwAgAHkAbwB1ACAAdAB5AHAAZQAgAHQAaABlACAAYQB2AGEAaQBsAGEAYgBsAGUAIABtAGUAdAByAGkAYwBzAAoAIwAgAHcAaQBsAGwAIABiAGUAIABvAGYAZgBlAHIAZQBkACAAYgB5ACAAYQB1AHQAbwBjAG8AbQBwAGwAZQB0AGUACgAAAAEAAAAOAHMAZQBhAHIAYwBoADoAAAAAAAAAAAEBAAAAABYAcABvAHcAZQByAF8AaQBuAGQAZQB4AAAAAQEAAAAmAHAAZQByAGMAZQBuAHQAXwBpAG4AXwB6AG8AbgBlAF8AUABJAEkAAAAwAFAASQBJACAAUABlAHIAYwBlAG4AdAAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAAMABQAEkASQAgAFAAZQByAGMAZQBuAHQAIABpAG4AIABQAGEAYwBlACAAWgBvAG4AZQAAAAIAJQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABuAAAAWwAAAAH/////Af///////wAAAAAAAAAAP/AAAAAAAAAAAAAAAf//AAAAAAAAAAAAAAAAAAAAA+cAAA4Q/////wAAAAoAAAAAAAAAAAAAAAAGAGMAcAAyAAAAAAAAA+cAAA4QAAAAAAAAAAAAAgAlAAABBAAjACAAdAB5AHAAZQAgAGkAbgAgAGEAIABmAG8AcgBtAHUAbABhACAAdABvACAAdQBzAGUACgAjACAAZgBvAHIAIABlAC4AZwAuACAAQgBpAGsAZQBTAHQAcgBlAHMAcwAgAC8AIABEAHUAcgBhAHQAaQBvAG4ACgAjACAAYQBzACAAeQBvAHUAIAB0AHkAcABlACAAdABoAGUAIABhAHYAYQBpAGwAYQBiAGwAZQAgAG0AZQB0AHIAaQBjAHMACgAjACAAdwBpAGwAbAAgAGIAZQAgAG8AZgBmAGUAcgBlAGQAIABiAHkAIABhAHUAdABvAGMAbwBtAHAAbABlAHQAZQAKAAAAAQAAAA4AcwBlAGEAcgBjAGgAOgAAAAAAAAAAAQEAAAAAFgBwAG8AdwBlAHIAXwBpAG4AZABlAHgAAAABAQAAACgAcABlAHIAYwBlAG4AdABfAGkAbgBfAHoAbwBuAGUAXwBQAEkASQBJAAAAMgBQAEkASQBJACAAUABlAHIAYwBlAG4AdAAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAAMgBQAEkASQBJACAAUABlAHIAYwBlAG4AdAAgAGkAbgAgAFAAYQBjAGUAIABaAG8AbgBlAAAAAgAlAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG4AAABbAAAAAf////8B/////wzNAAAAAAAAAAA/8AAAAAAAAAAAAAAB//8AAAAAAAAAAAAAAAAAAAAD5wAADhD/////AAAACgAAAAAAAAAAAAAAAAYAYwBwADIAAAAAAAAAAAAADhAAAAAAAAAAAAACACUAAAEEACMAIAB0AHkAcABlACAAaQBuACAAYQAgAGYAbwByAG0AdQBsAGEAIAB0AG8AIAB1AHMAZQAKACMAIABmAG8AcgAgAGUALgBnAC4AIABCAGkAawBlAFMAdAByAGUAcwBzACAALwAgAEQAdQByAGEAdABpAG8AbgAKACMAIABhAHMAIAB5AG8AdQAgAHQAeQBwAGUAIAB0AGgAZQAgAGEAdgBhAGkAbABhAGIAbABlACAAbQBlAHQAcgBpAGMAcwAKACMAIAB3AGkAbABsACAAYgBlACAAbwBmAGYAZQByAGUAZAAgAGIAeQAgAGEAdQB0AG8AYwBvAG0AcABsAGUAdABlAAoAAAABAAAADgBzAGUAYQByAGMAaAA6AAAAAAAAAAABAQAAAAAWAHAAbwB3AGUAcgBfAGkAbgBkAGUAeAAAAAAAAw=="</chart>
</charts>