Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Q
qgroundcontrol
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Valentin Platzgummer
qgroundcontrol
Commits
bd29d5dc
Unverified
Commit
bd29d5dc
authored
Jul 31, 2020
by
Don Gagne
Committed by
GitHub
Jul 31, 2020
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #8957 from DonLakeFlyer/qFuzzyCompare
Replace qFuzzyCompare with better functioning QGC::fuzzyCompare
parents
4c872ca4
3709f42b
Changes
13
Hide whitespace changes
Inline
Side-by-side
Showing
13 changed files
with
37 additions
and
51 deletions
+37
-51
ADSBVehicle.cc
src/ADSB/ADSBVehicle.cc
+3
-2
MissionController.cc
src/MissionManager/MissionController.cc
+1
-1
MissionSettingsItem.cc
src/MissionManager/MissionSettingsItem.cc
+1
-1
SimpleMissionItem.cc
src/MissionManager/SimpleMissionItem.cc
+4
-4
StructureScanComplexItem.cc
src/MissionManager/StructureScanComplexItem.cc
+2
-2
TransectStyleComplexItem.cc
src/MissionManager/TransectStyleComplexItem.cc
+1
-1
VisualMissionItem.cc
src/MissionManager/VisualMissionItem.cc
+8
-8
FlightPathSegment.cc
src/QmlControls/FlightPathSegment.cc
+6
-5
InstrumentValueData.cc
src/QmlControls/InstrumentValueData.cc
+1
-1
TerrainProfile.cc
src/QmlControls/TerrainProfile.cc
+2
-1
Vehicle.cc
src/Vehicle/Vehicle.cc
+1
-1
UnitTest.cc
src/qgcunittest/UnitTest.cc
+7
-20
UnitTest.h
src/qgcunittest/UnitTest.h
+0
-4
No files found.
src/ADSB/ADSBVehicle.cc
View file @
bd29d5dc
...
...
@@ -9,6 +9,7 @@
#include "ADSBVehicle.h"
#include "QGCLoggingCategory.h"
#include "QGC.h"
#include <QDebug>
#include <QtMath>
...
...
@@ -42,13 +43,13 @@ void ADSBVehicle::update(const VehicleInfo_t& vehicleInfo)
}
}
if
(
vehicleInfo
.
availableFlags
&
AltitudeAvailable
)
{
if
(
!
(
qIsNaN
(
vehicleInfo
.
altitude
)
&&
qIsNaN
(
_altitude
))
&&
!
qF
uzzyCompare
(
vehicleInfo
.
altitude
,
_altitude
))
{
if
(
!
QGC
::
f
uzzyCompare
(
vehicleInfo
.
altitude
,
_altitude
))
{
_altitude
=
vehicleInfo
.
altitude
;
emit
altitudeChanged
();
}
}
if
(
vehicleInfo
.
availableFlags
&
HeadingAvailable
)
{
if
(
!
(
qIsNaN
(
vehicleInfo
.
heading
)
&&
qIsNaN
(
_heading
))
&&
!
qF
uzzyCompare
(
vehicleInfo
.
heading
,
_heading
))
{
if
(
!
QGC
::
f
uzzyCompare
(
vehicleInfo
.
heading
,
_heading
))
{
_heading
=
vehicleInfo
.
heading
;
emit
headingChanged
();
}
...
...
src/MissionManager/MissionController.cc
View file @
bd29d5dc
...
...
@@ -2236,7 +2236,7 @@ void MissionController::applyDefaultMissionAltitude(void)
void
MissionController
::
_progressPctChanged
(
double
progressPct
)
{
if
(
!
qF
uzzyCompare
(
progressPct
,
_progressPct
))
{
if
(
!
QGC
::
f
uzzyCompare
(
progressPct
,
_progressPct
))
{
_progressPct
=
progressPct
;
emit
progressPctChanged
(
progressPct
);
}
...
...
src/MissionManager/MissionSettingsItem.cc
View file @
bd29d5dc
...
...
@@ -266,7 +266,7 @@ void MissionSettingsItem::_updateAltitudeInCoordinate(QVariant value)
{
double
newAltitude
=
value
.
toDouble
();
if
(
!
qF
uzzyCompare
(
_plannedHomePositionCoordinate
.
altitude
(),
newAltitude
))
{
if
(
QGC
::
f
uzzyCompare
(
_plannedHomePositionCoordinate
.
altitude
(),
newAltitude
))
{
_plannedHomePositionCoordinate
.
setAltitude
(
newAltitude
);
emit
coordinateChanged
(
_plannedHomePositionCoordinate
);
emit
exitCoordinateChanged
(
_plannedHomePositionCoordinate
);
...
...
src/MissionManager/SimpleMissionItem.cc
View file @
bd29d5dc
...
...
@@ -686,7 +686,7 @@ void SimpleMissionItem::_terrainAltChanged(void)
}
else
{
double
newAboveTerrain
=
terrainAltitude
()
+
_altitudeFact
.
rawValue
().
toDouble
();
double
oldAboveTerrain
=
_amslAltAboveTerrainFact
.
rawValue
().
toDouble
();
if
(
qIsNaN
(
oldAboveTerrain
)
||
!
qF
uzzyCompare
(
newAboveTerrain
,
oldAboveTerrain
))
{
if
(
!
QGC
::
f
uzzyCompare
(
newAboveTerrain
,
oldAboveTerrain
))
{
_missionItem
.
_param7Fact
.
setRawValue
(
newAboveTerrain
);
_amslAltAboveTerrainFact
.
setRawValue
(
newAboveTerrain
);
}
...
...
@@ -941,14 +941,14 @@ void SimpleMissionItem::setMissionFlightStatus(MissionController::MissionFlightS
VisualMissionItem
::
setMissionFlightStatus
(
missionFlightStatus
);
// If speed and/or gimbal are not specifically set on this item. Then use the flight status values as initial defaults should a user turn them on.
if
(
_speedSection
->
available
()
&&
!
_speedSection
->
specifyFlightSpeed
()
&&
!
qF
uzzyCompare
(
_speedSection
->
flightSpeed
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
vehicleSpeed
))
{
if
(
_speedSection
->
available
()
&&
!
_speedSection
->
specifyFlightSpeed
()
&&
!
QGC
::
f
uzzyCompare
(
_speedSection
->
flightSpeed
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
vehicleSpeed
))
{
_speedSection
->
flightSpeed
()
->
setRawValue
(
missionFlightStatus
.
vehicleSpeed
);
}
if
(
_cameraSection
->
available
()
&&
!
_cameraSection
->
specifyGimbal
())
{
if
(
!
qIsNaN
(
missionFlightStatus
.
gimbalYaw
)
&&
!
qF
uzzyCompare
(
_cameraSection
->
gimbalYaw
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
gimbalYaw
))
{
if
(
!
qIsNaN
(
missionFlightStatus
.
gimbalYaw
)
&&
!
QGC
::
f
uzzyCompare
(
_cameraSection
->
gimbalYaw
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
gimbalYaw
))
{
_cameraSection
->
gimbalYaw
()
->
setRawValue
(
missionFlightStatus
.
gimbalYaw
);
}
if
(
!
qIsNaN
(
missionFlightStatus
.
gimbalPitch
)
&&
!
qF
uzzyCompare
(
_cameraSection
->
gimbalPitch
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
gimbalPitch
))
{
if
(
!
qIsNaN
(
missionFlightStatus
.
gimbalPitch
)
&&
!
QGC
::
f
uzzyCompare
(
_cameraSection
->
gimbalPitch
()
->
rawValue
().
toDouble
(),
missionFlightStatus
.
gimbalPitch
))
{
_cameraSection
->
gimbalPitch
()
->
setRawValue
(
missionFlightStatus
.
gimbalPitch
);
}
}
...
...
src/MissionManager/StructureScanComplexItem.cc
View file @
bd29d5dc
...
...
@@ -474,7 +474,7 @@ int StructureScanComplexItem::cameraShots(void) const
void
StructureScanComplexItem
::
setMissionFlightStatus
(
MissionController
::
MissionFlightStatus_t
&
missionFlightStatus
)
{
ComplexMissionItem
::
setMissionFlightStatus
(
missionFlightStatus
);
if
(
!
qF
uzzyCompare
(
_vehicleSpeed
,
missionFlightStatus
.
vehicleSpeed
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_vehicleSpeed
,
missionFlightStatus
.
vehicleSpeed
))
{
_vehicleSpeed
=
missionFlightStatus
.
vehicleSpeed
;
emit
timeBetweenShotsChanged
();
}
...
...
@@ -645,7 +645,7 @@ void StructureScanComplexItem::_recalcScanDistance()
<<
" scanDistance: "
<<
_scanDistance
;
}
if
(
!
qF
uzzyCompare
(
_scanDistance
,
scanDistance
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_scanDistance
,
scanDistance
))
{
_scanDistance
=
scanDistance
;
emit
complexDistanceChanged
();
}
...
...
src/MissionManager/TransectStyleComplexItem.cc
View file @
bd29d5dc
...
...
@@ -327,7 +327,7 @@ double TransectStyleComplexItem::greatestDistanceTo(const QGeoCoordinate &other)
void
TransectStyleComplexItem
::
setMissionFlightStatus
(
MissionController
::
MissionFlightStatus_t
&
missionFlightStatus
)
{
ComplexMissionItem
::
setMissionFlightStatus
(
missionFlightStatus
);
if
(
!
qF
uzzyCompare
(
_vehicleSpeed
,
missionFlightStatus
.
vehicleSpeed
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_vehicleSpeed
,
missionFlightStatus
.
vehicleSpeed
))
{
_vehicleSpeed
=
missionFlightStatus
.
vehicleSpeed
;
// Vehicle speed change affects max climb/descent rates calcs for terrain so we need to re-adjust
_rebuildTransects
();
...
...
src/MissionManager/VisualMissionItem.cc
View file @
bd29d5dc
...
...
@@ -96,7 +96,7 @@ void VisualMissionItem::setHasCurrentChildItem(bool hasCurrentChildItem)
void
VisualMissionItem
::
setDistance
(
double
distance
)
{
if
(
!
qF
uzzyCompare
(
_distance
,
distance
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_distance
,
distance
))
{
_distance
=
distance
;
emit
distanceChanged
(
_distance
);
}
...
...
@@ -104,7 +104,7 @@ void VisualMissionItem::setDistance(double distance)
void
VisualMissionItem
::
setDistanceFromStart
(
double
distanceFromStart
)
{
if
(
!
qF
uzzyCompare
(
_distanceFromStart
,
distanceFromStart
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_distanceFromStart
,
distanceFromStart
))
{
_distanceFromStart
=
distanceFromStart
;
emit
distanceFromStartChanged
(
_distanceFromStart
);
}
...
...
@@ -112,7 +112,7 @@ void VisualMissionItem::setDistanceFromStart(double distanceFromStart)
void
VisualMissionItem
::
setAltDifference
(
double
altDifference
)
{
if
(
!
qF
uzzyCompare
(
_altDifference
,
altDifference
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_altDifference
,
altDifference
))
{
_altDifference
=
altDifference
;
emit
altDifferenceChanged
(
_altDifference
);
}
...
...
@@ -120,7 +120,7 @@ void VisualMissionItem::setAltDifference(double altDifference)
void
VisualMissionItem
::
setAltPercent
(
double
altPercent
)
{
if
(
!
qF
uzzyCompare
(
_altPercent
,
altPercent
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_altPercent
,
altPercent
))
{
_altPercent
=
altPercent
;
emit
altPercentChanged
(
_altPercent
);
}
...
...
@@ -128,7 +128,7 @@ void VisualMissionItem::setAltPercent(double altPercent)
void
VisualMissionItem
::
setTerrainPercent
(
double
terrainPercent
)
{
if
(
!
qF
uzzyCompare
(
_terrainPercent
,
terrainPercent
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_terrainPercent
,
terrainPercent
))
{
_terrainPercent
=
terrainPercent
;
emit
terrainPercentChanged
(
terrainPercent
);
}
...
...
@@ -144,7 +144,7 @@ void VisualMissionItem::setTerrainCollision(bool terrainCollision)
void
VisualMissionItem
::
setAzimuth
(
double
azimuth
)
{
if
(
!
qF
uzzyCompare
(
_azimuth
,
azimuth
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_azimuth
,
azimuth
))
{
_azimuth
=
azimuth
;
emit
azimuthChanged
(
_azimuth
);
}
...
...
@@ -164,7 +164,7 @@ void VisualMissionItem::setMissionFlightStatus(MissionController::MissionFlightS
void
VisualMissionItem
::
setMissionVehicleYaw
(
double
vehicleYaw
)
{
if
(
!
qF
uzzyCompare
(
_missionVehicleYaw
,
vehicleYaw
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_missionVehicleYaw
,
vehicleYaw
))
{
_missionVehicleYaw
=
vehicleYaw
;
emit
missionVehicleYawChanged
(
_missionVehicleYaw
);
}
...
...
@@ -189,7 +189,7 @@ void VisualMissionItem::_updateTerrainAltitude(void)
void
VisualMissionItem
::
_reallyUpdateTerrainAltitude
(
void
)
{
QGeoCoordinate
coord
=
coordinate
();
if
(
specifiesCoordinate
()
&&
coord
.
isValid
()
&&
(
qIsNaN
(
_terrainAltitude
)
||
!
qFuzzyCompare
(
_lastLatTerrainQuery
,
coord
.
latitude
())
||
qF
uzzyCompare
(
_lastLonTerrainQuery
,
coord
.
longitude
())))
{
if
(
specifiesCoordinate
()
&&
coord
.
isValid
()
&&
(
qIsNaN
(
_terrainAltitude
)
||
!
QGC
::
fuzzyCompare
(
_lastLatTerrainQuery
,
coord
.
latitude
())
||
QGC
::
f
uzzyCompare
(
_lastLonTerrainQuery
,
coord
.
longitude
())))
{
_lastLatTerrainQuery
=
coord
.
latitude
();
_lastLonTerrainQuery
=
coord
.
longitude
();
if
(
_currentTerrainAtCoordinateQuery
)
{
...
...
src/QmlControls/FlightPathSegment.cc
View file @
bd29d5dc
...
...
@@ -8,6 +8,7 @@
****************************************************************************/
#include "FlightPathSegment.h"
#include "QGC.h"
QGC_LOGGING_CATEGORY
(
FlightPathSegmentLog
,
"FlightPathSegmentLog"
)
...
...
@@ -51,7 +52,7 @@ void FlightPathSegment::setCoordinate2(const QGeoCoordinate &coordinate)
void
FlightPathSegment
::
setCoord1AMSLAlt
(
double
alt
)
{
if
(
!
qF
uzzyCompare
(
alt
,
_coord1AMSLAlt
))
{
if
(
!
QGC
::
f
uzzyCompare
(
alt
,
_coord1AMSLAlt
))
{
_coord1AMSLAlt
=
alt
;
emit
coord1AMSLAltChanged
();
_updateTerrainCollision
();
...
...
@@ -60,7 +61,7 @@ void FlightPathSegment::setCoord1AMSLAlt(double alt)
void
FlightPathSegment
::
setCoord2AMSLAlt
(
double
alt
)
{
if
(
!
qF
uzzyCompare
(
alt
,
_coord2AMSLAlt
))
{
if
(
!
QGC
::
f
uzzyCompare
(
alt
,
_coord2AMSLAlt
))
{
_coord2AMSLAlt
=
alt
;
emit
coord2AMSLAltChanged
();
_updateTerrainCollision
();
...
...
@@ -104,11 +105,11 @@ void FlightPathSegment::_terrainDataReceived(bool success, const TerrainPathQuer
{
qCDebug
(
FlightPathSegmentLog
)
<<
this
<<
"_terrainDataReceived"
<<
success
<<
pathHeightInfo
.
heights
.
count
();
if
(
success
)
{
if
(
!
qF
uzzyCompare
(
pathHeightInfo
.
distanceBetween
,
_distanceBetween
))
{
if
(
!
QGC
::
f
uzzyCompare
(
pathHeightInfo
.
distanceBetween
,
_distanceBetween
))
{
_distanceBetween
=
pathHeightInfo
.
distanceBetween
;
emit
distanceBetweenChanged
(
_distanceBetween
);
}
if
(
!
qF
uzzyCompare
(
pathHeightInfo
.
finalDistanceBetween
,
_finalDistanceBetween
))
{
if
(
!
QGC
::
f
uzzyCompare
(
pathHeightInfo
.
finalDistanceBetween
,
_finalDistanceBetween
))
{
_finalDistanceBetween
=
pathHeightInfo
.
finalDistanceBetween
;
emit
finalDistanceBetweenChanged
(
_finalDistanceBetween
);
}
...
...
@@ -133,7 +134,7 @@ void FlightPathSegment::_updateTotalDistance(void)
newTotalDistance
=
_coord1
.
distanceTo
(
_coord2
);
}
if
(
!
qF
uzzyCompare
(
newTotalDistance
,
_totalDistance
))
{
if
(
!
QGC
::
f
uzzyCompare
(
newTotalDistance
,
_totalDistance
))
{
_totalDistance
=
newTotalDistance
;
emit
totalDistanceChanged
(
_totalDistance
);
}
...
...
src/QmlControls/InstrumentValueData.cc
View file @
bd29d5dc
...
...
@@ -327,7 +327,7 @@ void InstrumentValueData::_updateOpacity(void)
newOpacity
=
_rangeOpacities
[
rangeIndex
].
toDouble
();
}
if
(
!
qF
uzzyCompare
(
newOpacity
,
_currentOpacity
))
{
if
(
!
QGC
::
f
uzzyCompare
(
newOpacity
,
_currentOpacity
))
{
_currentOpacity
=
newOpacity
;
emit
currentOpacityChanged
(
newOpacity
);
}
...
...
src/QmlControls/TerrainProfile.cc
View file @
bd29d5dc
...
...
@@ -309,7 +309,8 @@ QSGNode* TerrainProfile::updatePaintNode(QSGNode* oldNode, QQuickItem::UpdatePai
emit
widthChanged
();
emit
pixelsPerMeterChanged
();
double
newMaxAMSLAlt
=
qMax
(
_missionController
->
maxAMSLAltitude
(),
maxTerrainHeight
);
if
(
!
qFuzzyCompare
(
newMaxAMSLAlt
,
_maxAMSLAlt
))
{
double
newMaxAMSLAlt
=
qMax
(
_missionController
->
maxAMSLAltitude
(),
maxTerrainHeight
);
if
(
!
QGC
::
fuzzyCompare
(
newMaxAMSLAlt
,
_maxAMSLAlt
))
{
_maxAMSLAlt
=
newMaxAMSLAlt
;
emit
maxAMSLAltChanged
();
}
...
...
src/Vehicle/Vehicle.cc
View file @
bd29d5dc
...
...
@@ -880,7 +880,7 @@ void Vehicle::_handleOrbitExecutionStatus(const mavlink_message_t& message)
mavlink_msg_orbit_execution_status_decode
(
&
message
,
&
orbitStatus
);
double
newRadius
=
qAbs
(
static_cast
<
double
>
(
orbitStatus
.
radius
));
if
(
!
qF
uzzyCompare
(
_orbitMapCircle
.
radius
()
->
rawValue
().
toDouble
(),
newRadius
))
{
if
(
!
QGC
::
f
uzzyCompare
(
_orbitMapCircle
.
radius
()
->
rawValue
().
toDouble
(),
newRadius
))
{
_orbitMapCircle
.
radius
()
->
setRawValue
(
newRadius
);
}
...
...
src/qgcunittest/UnitTest.cc
View file @
bd29d5dc
...
...
@@ -494,19 +494,6 @@ bool UnitTest::fileCompare(const QString& file1, const QString& file2)
return
true
;
}
bool
UnitTest
::
doubleNaNCompare
(
double
value1
,
double
value2
)
{
if
(
qIsNaN
(
value1
)
&&
qIsNaN
(
value2
))
{
return
true
;
}
else
{
bool
ret
=
qFuzzyCompare
(
value1
,
value2
);
if
(
!
ret
)
{
qDebug
()
<<
value1
<<
value2
;
}
return
ret
;
}
}
void
UnitTest
::
changeFactValue
(
Fact
*
fact
,
double
increment
)
{
if
(
fact
->
typeIsBool
())
{
...
...
@@ -525,13 +512,13 @@ void UnitTest::_missionItemsEqual(MissionItem& actual, MissionItem& expected)
QCOMPARE
(
static_cast
<
int
>
(
actual
.
frame
()),
static_cast
<
int
>
(
expected
.
frame
()));
QCOMPARE
(
actual
.
autoContinue
(),
expected
.
autoContinue
());
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param1
(),
expected
.
param1
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param2
(),
expected
.
param2
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param3
(),
expected
.
param3
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param4
(),
expected
.
param4
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param5
(),
expected
.
param5
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param6
(),
expected
.
param6
()));
QVERIFY
(
UnitTest
::
doubleNaN
Compare
(
actual
.
param7
(),
expected
.
param7
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param1
(),
expected
.
param1
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param2
(),
expected
.
param2
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param3
(),
expected
.
param3
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param4
(),
expected
.
param4
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param5
(),
expected
.
param5
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param6
(),
expected
.
param6
()));
QVERIFY
(
QGC
::
fuzzy
Compare
(
actual
.
param7
(),
expected
.
param7
()));
}
bool
UnitTest
::
fuzzyCompareLatLon
(
const
QGeoCoordinate
&
coord1
,
const
QGeoCoordinate
&
coord2
)
...
...
src/qgcunittest/UnitTest.h
View file @
bd29d5dc
...
...
@@ -96,10 +96,6 @@ public:
/// @return true: files are alike, false: files differ
static
bool
fileCompare
(
const
QString
&
file1
,
const
QString
&
file2
);
/// Fuzzy compare on two doubles, where NaN is a possible value
/// @return true: equal
static
bool
doubleNaNCompare
(
double
value1
,
double
value2
);
/// Changes the Facts rawValue such that it emits a valueChanged signal.
/// @param increment 0 use standard increment, other increment by specified amount if double value
void
changeFactValue
(
Fact
*
fact
,
double
increment
=
0
);
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment