1
0
mirror of https://bitbucket.org/librepilot/librepilot.git synced 2025-01-19 04:52:12 +01:00

Merge branch 'next' into revolution

Conflicts:
	flight/PiOS/Common/pios_flashfs_objlist.c
This commit is contained in:
James Cotton 2011-12-11 22:55:54 -06:00
commit 33a12d829e
42 changed files with 2709 additions and 542 deletions

2
.gitignore vendored
View File

@ -1,3 +1,5 @@
# Exclude temporary and system files
.DS_Store
# /flight/ # /flight/
/flight/*.pnproj /flight/*.pnproj

View File

@ -1,5 +1,9 @@
Short summary of changes. For a complete list see the git log. Short summary of changes. For a complete list see the git log.
2011-12-10
Merged a change that sorts the UAVO fields based on size. Because this changes
all of the objects, erase all existing flash files based on this.
2011-11-04 2011-11-04
New Spektrum/JR satellite receiver driver implementation. New Spektrum/JR satellite receiver driver implementation.
It now provides explicit selection of DSM2 (and DSMJ), DSMX (10bit) and It now provides explicit selection of DSM2 (and DSMJ), DSMX (10bit) and

View File

@ -157,6 +157,11 @@ C: Anders Johansson (dezent)
D: November 2011 D: November 2011
V: http://www.youtube.com/watch?v=Xfas2TUhOPw V: http://www.youtube.com/watch?v=Xfas2TUhOPw
M: First OpenPilot over 1km FixedWing navigation flight
C: Eric Price (Corvus Corax)
D: December 2011
V: http://www.youtube.com/watch?v=nWNWuUiUTNg
M: First Altitude Hold using Sonar M: First Altitude Hold using Sonar
C: C:
@ -184,8 +189,6 @@ An incomplete list of some future Milestones is below:
* First fixed wing navigation flight * First fixed wing navigation flight
* First Multirotor navigation flight * First Multirotor navigation flight
* First Helicopter navigation flight * First Helicopter navigation flight
* First over 1km navigation flight
* First over 5km navigation flight * First over 5km navigation flight
* First "Follow Me" navigation flight * First "Follow Me" navigation flight
* First Channel Crossing with OpenPilot * First Channel Crossing with OpenPilot

View File

@ -70,6 +70,12 @@ int main()
* */ * */
PIOS_Board_Init(); PIOS_Board_Init();
#ifdef ERASE_FLASH
PIOS_Flash_W25X_EraseChip();
PIOS_LED_Off(LED1);
while (1) ;
#endif
/* Initialize modules */ /* Initialize modules */
MODULE_INITIALISE_ALL MODULE_INITIALISE_ALL
@ -82,11 +88,11 @@ int main()
/* If all is well we will never reach here as the scheduler will now be running. */ /* If all is well we will never reach here as the scheduler will now be running. */
/* Do some indication to user that something bad just happened */ /* Do some indication to user that something bad just happened */
PIOS_LED_Off(LED1); \ PIOS_LED_Off(LED1);
for(;;) { \ while (1) {
PIOS_LED_Toggle(LED1); \ PIOS_LED_Toggle(LED1);
PIOS_DELAY_WaitmS(100); \ PIOS_DELAY_WaitmS(100);
}; }
return 0; return 0;
} }

View File

@ -1430,7 +1430,9 @@ void PIOS_Board_Init(void) {
#endif /* PIOS_INCLUDE_USB_HID */ #endif /* PIOS_INCLUDE_USB_HID */
PIOS_IAP_Init(); PIOS_IAP_Init();
#ifndef ERASE_FLASH
PIOS_WDG_Init(); PIOS_WDG_Init();
#endif
} }
/** /**

View File

@ -207,7 +207,7 @@ static void actuatorTask(void* parameters)
nMixers ++; nMixers ++;
} }
} }
if((nMixers < 2) && !ActuatorCommandReadOnly(dummy)) //Nothing can fly with less than two mixers. if((nMixers < 2) && !ActuatorCommandReadOnly()) //Nothing can fly with less than two mixers.
{ {
setFailsafe(); // So that channels like PWM buzzer keep working setFailsafe(); // So that channels like PWM buzzer keep working
continue; continue;

View File

@ -189,19 +189,19 @@ static void manualControlTask(void *parameters)
lastActivityTime = lastSysTime; lastActivityTime = lastSysTime;
} }
if (ManualControlCommandReadOnly(&cmd)) { if (ManualControlCommandReadOnly()) {
FlightTelemetryStatsData flightTelemStats; FlightTelemetryStatsData flightTelemStats;
FlightTelemetryStatsGet(&flightTelemStats); FlightTelemetryStatsGet(&flightTelemStats);
if(flightTelemStats.Status != FLIGHTTELEMETRYSTATS_STATUS_CONNECTED) { if(flightTelemStats.Status != FLIGHTTELEMETRYSTATS_STATUS_CONNECTED) {
/* trying to fly via GCS and lost connection. fall back to transmitter */ /* trying to fly via GCS and lost connection. fall back to transmitter */
UAVObjMetadata metadata; UAVObjMetadata metadata;
UAVObjGetMetadata(&cmd, &metadata); ManualControlCommandGetMetadata(&metadata);
metadata.access = ACCESS_READWRITE; metadata.access = ACCESS_READWRITE;
UAVObjSetMetadata(&cmd, &metadata); ManualControlCommandSetMetadata(&metadata);
} }
} }
if (!ManualControlCommandReadOnly(&cmd)) { if (!ManualControlCommandReadOnly()) {
bool valid_input_detected = true; bool valid_input_detected = true;

View File

@ -56,8 +56,8 @@ struct fileHeader {
} __attribute__((packed)); } __attribute__((packed));
#define OBJECT_TABLE_MAGIC 0x85FB3C33 #define OBJECT_TABLE_MAGIC 0x85FB3D35
#define OBJ_MAGIC 0x3015AE71 #define OBJ_MAGIC 0x3015A371
#define OBJECT_TABLE_START 0x00000010 #define OBJECT_TABLE_START 0x00000010
#define OBJECT_TABLE_END 0x00010000 #define OBJECT_TABLE_END 0x00010000
#define SECTOR_SIZE 0x00010000 #define SECTOR_SIZE 0x00010000

View File

@ -67,7 +67,7 @@
#define $(NAME)InstUpdated(instId) UAVObjUpdated($(NAME)Handle(), instId) #define $(NAME)InstUpdated(instId) UAVObjUpdated($(NAME)Handle(), instId)
#define $(NAME)GetMetadata(dataOut) UAVObjGetMetadata($(NAME)Handle(), dataOut) #define $(NAME)GetMetadata(dataOut) UAVObjGetMetadata($(NAME)Handle(), dataOut)
#define $(NAME)SetMetadata(dataIn) UAVObjSetMetadata($(NAME)Handle(), dataIn) #define $(NAME)SetMetadata(dataIn) UAVObjSetMetadata($(NAME)Handle(), dataIn)
#define $(NAME)ReadOnly(dataIn) UAVObjReadOnly($(NAME)Handle()) #define $(NAME)ReadOnly() UAVObjReadOnly($(NAME)Handle())
// Object data // Object data
typedef struct { typedef struct {

View File

@ -81,10 +81,10 @@ ConfigOutputWidget::ConfigOutputWidget(QWidget *parent) : ConfigTaskWidget(paren
// Connect the help button // Connect the help button
connect(m_config->outputHelp, SIGNAL(clicked()), this, SLOT(openHelp())); connect(m_config->outputHelp, SIGNAL(clicked()), this, SLOT(openHelp()));
addWidget(m_config->outputRate3); addWidget(m_config->cb_outputRate4);
addWidget(m_config->outputRate2); addWidget(m_config->cb_outputRate3);
addWidget(m_config->outputRate1); addWidget(m_config->cb_outputRate2);
addWidget(m_config->cb_outputRate1);
addWidget(m_config->spinningArmed); addWidget(m_config->spinningArmed);
UAVObjectManager *objManager = pm->getObject<UAVObjectManager>(); UAVObjectManager *objManager = pm->getObject<UAVObjectManager>();
@ -277,8 +277,17 @@ void ConfigOutputWidget::refreshWidgetsValues()
m_config->spinningArmed->setChecked(actuatorSettingsData.MotorsSpinWhileArmed == ActuatorSettings::MOTORSSPINWHILEARMED_TRUE); m_config->spinningArmed->setChecked(actuatorSettingsData.MotorsSpinWhileArmed == ActuatorSettings::MOTORSSPINWHILEARMED_TRUE);
// Get Output rates for both banks // Get Output rates for both banks
m_config->outputRate1->setValue(actuatorSettingsData.ChannelUpdateFreq[0]); if(m_config->cb_outputRate1->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[0]))==-1)
m_config->outputRate2->setValue(actuatorSettingsData.ChannelUpdateFreq[1]); {
m_config->cb_outputRate1->addItem(QString::number(actuatorSettingsData.ChannelUpdateFreq[0]));
}
if(m_config->cb_outputRate2->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[1]))==-1)
{
m_config->cb_outputRate2->addItem(QString::number(actuatorSettingsData.ChannelUpdateFreq[1]));
}
m_config->cb_outputRate1->setCurrentIndex(m_config->cb_outputRate1->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[0])));
m_config->cb_outputRate2->setCurrentIndex(m_config->cb_outputRate2->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[1])));
UAVObjectUtilManager* utilMngr = pm->getObject<UAVObjectUtilManager>(); UAVObjectUtilManager* utilMngr = pm->getObject<UAVObjectUtilManager>();
if (utilMngr) { if (utilMngr) {
int board = utilMngr->getBoardModel(); int board = utilMngr->getBoardModel();
@ -288,24 +297,34 @@ void ConfigOutputWidget::refreshWidgetsValues()
m_config->chBank2->setText("4"); m_config->chBank2->setText("4");
m_config->chBank3->setText("5,7-8"); m_config->chBank3->setText("5,7-8");
m_config->chBank4->setText("6,9-10"); m_config->chBank4->setText("6,9-10");
m_config->outputRate1->setEnabled(true); m_config->cb_outputRate1->setEnabled(true);
m_config->outputRate2->setEnabled(true); m_config->cb_outputRate2->setEnabled(true);
m_config->outputRate3->setEnabled(true); m_config->cb_outputRate3->setEnabled(true);
m_config->outputRate4->setEnabled(true); m_config->cb_outputRate4->setEnabled(true);
m_config->outputRate3->setValue(actuatorSettingsData.ChannelUpdateFreq[2]); if(m_config->cb_outputRate3->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[2]))==-1)
m_config->outputRate4->setValue(actuatorSettingsData.ChannelUpdateFreq[3]); {
m_config->cb_outputRate3->addItem(QString::number(actuatorSettingsData.ChannelUpdateFreq[2]));
}
if(m_config->cb_outputRate4->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[3]))==-1)
{
m_config->cb_outputRate4->addItem(QString::number(actuatorSettingsData.ChannelUpdateFreq[3]));
}
m_config->cb_outputRate3->setCurrentIndex(m_config->cb_outputRate3->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[2])));
m_config->cb_outputRate4->setCurrentIndex(m_config->cb_outputRate4->findText(QString::number(actuatorSettingsData.ChannelUpdateFreq[3])));
} else if ((board & 0xff00) == 256 ) { } else if ((board & 0xff00) == 256 ) {
// Mainboard family // Mainboard family
m_config->outputRate1->setEnabled(true); m_config->cb_outputRate1->setEnabled(true);
m_config->outputRate2->setEnabled(true); m_config->cb_outputRate2->setEnabled(true);
m_config->outputRate3->setEnabled(false); m_config->cb_outputRate3->setEnabled(false);
m_config->outputRate4->setEnabled(false); m_config->cb_outputRate4->setEnabled(false);
m_config->chBank1->setText("1-4"); m_config->chBank1->setText("1-4");
m_config->chBank2->setText("5-8"); m_config->chBank2->setText("5-8");
m_config->chBank3->setText("-"); m_config->chBank3->setText("-");
m_config->chBank4->setText("-"); m_config->chBank4->setText("-");
m_config->outputRate3->setValue(0); m_config->cb_outputRate3->addItem("0");
m_config->outputRate4->setValue(0); m_config->cb_outputRate3->setCurrentIndex(m_config->cb_outputRate3->findText("0"));
m_config->cb_outputRate4->addItem("0");
m_config->cb_outputRate4->setCurrentIndex(m_config->cb_outputRate4->findText("0"));
} }
} }
@ -342,11 +361,10 @@ void ConfigOutputWidget::updateObjectsFromWidgets()
} }
// Set update rates // Set update rates
actuatorSettingsData.ChannelUpdateFreq[0] = m_config->outputRate1->value(); actuatorSettingsData.ChannelUpdateFreq[0] = m_config->cb_outputRate1->currentText().toUInt();
actuatorSettingsData.ChannelUpdateFreq[1] = m_config->outputRate2->value(); actuatorSettingsData.ChannelUpdateFreq[1] = m_config->cb_outputRate2->currentText().toUInt();
actuatorSettingsData.ChannelUpdateFreq[2] = m_config->outputRate3->value(); actuatorSettingsData.ChannelUpdateFreq[2] = m_config->cb_outputRate3->currentText().toUInt();
actuatorSettingsData.ChannelUpdateFreq[3] = m_config->outputRate4->value(); actuatorSettingsData.ChannelUpdateFreq[3] = m_config->cb_outputRate4->currentText().toUInt();
// Apply settings // Apply settings
actuatorSettings->setData(actuatorSettingsData); actuatorSettings->setData(actuatorSettingsData);
} }

View File

@ -94,6 +94,7 @@ void inputChannelForm::groupUpdated()
break; break;
case ManualControlSettings::CHANNELGROUPS_GCS: case ManualControlSettings::CHANNELGROUPS_GCS:
count = 5; count = 5;
break;
case ManualControlSettings::CHANNELGROUPS_NONE: case ManualControlSettings::CHANNELGROUPS_NONE:
count = 0; count = 0;
break; break;

View File

@ -38,102 +38,6 @@
<property name="spacing"> <property name="spacing">
<number>2</number> <number>2</number>
</property> </property>
<item row="1" column="4">
<widget class="QSpinBox" name="outputRate4">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<property name="maximum">
<number>400</number>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="chBank3">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="chBank2">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="chBank1">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="1" column="3">
<widget class="QSpinBox" name="outputRate3">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<property name="maximum">
<number>400</number>
</property>
</widget>
</item>
<item row="1" column="2">
<widget class="QSpinBox" name="outputRate2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<property name="maximum">
<number>400</number>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QSpinBox" name="outputRate1">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<property name="maximum">
<number>400</number>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="chBank4">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="0"> <item row="0" column="0">
<layout class="QHBoxLayout" name="horizontalLayout_6"> <layout class="QHBoxLayout" name="horizontalLayout_6">
<item> <item>
@ -206,6 +110,230 @@ Leave at 50Hz for fixed wing.</string>
</item> </item>
</layout> </layout>
</item> </item>
<item row="1" column="1">
<widget class="QComboBox" name="cb_outputRate1">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<item>
<property name="text">
<string>50</string>
</property>
</item>
<item>
<property name="text">
<string>60</string>
</property>
</item>
<item>
<property name="text">
<string>125</string>
</property>
</item>
<item>
<property name="text">
<string>165</string>
</property>
</item>
<item>
<property name="text">
<string>270</string>
</property>
</item>
<item>
<property name="text">
<string>330</string>
</property>
</item>
<item>
<property name="text">
<string>400</string>
</property>
</item>
</widget>
</item>
<item row="1" column="2">
<widget class="QComboBox" name="cb_outputRate2">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<item>
<property name="text">
<string>50</string>
</property>
</item>
<item>
<property name="text">
<string>60</string>
</property>
</item>
<item>
<property name="text">
<string>125</string>
</property>
</item>
<item>
<property name="text">
<string>165</string>
</property>
</item>
<item>
<property name="text">
<string>270</string>
</property>
</item>
<item>
<property name="text">
<string>330</string>
</property>
</item>
<item>
<property name="text">
<string>400</string>
</property>
</item>
</widget>
</item>
<item row="1" column="3">
<widget class="QComboBox" name="cb_outputRate3">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<item>
<property name="text">
<string>50</string>
</property>
</item>
<item>
<property name="text">
<string>60</string>
</property>
</item>
<item>
<property name="text">
<string>125</string>
</property>
</item>
<item>
<property name="text">
<string>165</string>
</property>
</item>
<item>
<property name="text">
<string>270</string>
</property>
</item>
<item>
<property name="text">
<string>330</string>
</property>
</item>
<item>
<property name="text">
<string>400</string>
</property>
</item>
</widget>
</item>
<item row="1" column="4">
<widget class="QComboBox" name="cb_outputRate4">
<property name="enabled">
<bool>false</bool>
</property>
<property name="toolTip">
<string>Setup &quot;TurboPWM&quot; here: usual value is 400 Hz for multirotor airframes.
Leave at 50Hz for fixed wing.</string>
</property>
<item>
<property name="text">
<string>50</string>
</property>
</item>
<item>
<property name="text">
<string>60</string>
</property>
</item>
<item>
<property name="text">
<string>125</string>
</property>
</item>
<item>
<property name="text">
<string>165</string>
</property>
</item>
<item>
<property name="text">
<string>270</string>
</property>
</item>
<item>
<property name="text">
<string>330</string>
</property>
</item>
<item>
<property name="text">
<string>400</string>
</property>
</item>
</widget>
</item>
<item row="0" column="1">
<widget class="QLabel" name="chBank1">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="2">
<widget class="QLabel" name="chBank2">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="3">
<widget class="QLabel" name="chBank3">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
<item row="0" column="4">
<widget class="QLabel" name="chBank4">
<property name="text">
<string>-</string>
</property>
<property name="alignment">
<set>Qt::AlignCenter</set>
</property>
</widget>
</item>
</layout> </layout>
</widget> </widget>
</item> </item>
@ -351,10 +479,6 @@ Applies and Saves all settings to SD</string>
</layout> </layout>
</widget> </widget>
<tabstops> <tabstops>
<tabstop>outputRate1</tabstop>
<tabstop>outputRate2</tabstop>
<tabstop>outputRate3</tabstop>
<tabstop>outputRate4</tabstop>
<tabstop>channelOutTest</tabstop> <tabstop>channelOutTest</tabstop>
<tabstop>saveRCOutputToRAM</tabstop> <tabstop>saveRCOutputToRAM</tabstop>
<tabstop>saveRCOutputToSD</tabstop> <tabstop>saveRCOutputToSD</tabstop>

View File

@ -30,7 +30,7 @@
#include <QWidget> #include <QWidget>
#include "ui_outputchannelform.h" #include "ui_outputchannelform.h"
class ConfigInputWidget; class ConfigOnputWidget;
class OutputChannelForm : public QWidget class OutputChannelForm : public QWidget
{ {
@ -39,7 +39,7 @@ class OutputChannelForm : public QWidget
public: public:
explicit OutputChannelForm(const int index, QWidget *parent = NULL, const bool showLegend = false); explicit OutputChannelForm(const int index, QWidget *parent = NULL, const bool showLegend = false);
~OutputChannelForm(); ~OutputChannelForm();
friend class ConfigInputWidget; friend class ConfigOnputWidget;
void setAssignment(const QString &assignment); void setAssignment(const QString &assignment);
int index() const; int index() const;

View File

@ -6,8 +6,8 @@
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>562</width> <width>605</width>
<height>49</height> <height>56</height>
</rect> </rect>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
@ -136,6 +136,18 @@
</item> </item>
<item row="1" column="9"> <item row="1" column="9">
<widget class="QCheckBox" name="actuatorRev"> <widget class="QCheckBox" name="actuatorRev">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>40</width>
<height>0</height>
</size>
</property>
<property name="toolTip"> <property name="toolTip">
<string>Check to invert the channel.</string> <string>Check to invert the channel.</string>
</property> </property>
@ -143,6 +155,18 @@
</item> </item>
<item row="1" column="10"> <item row="1" column="10">
<widget class="QCheckBox" name="actuatorLink"> <widget class="QCheckBox" name="actuatorLink">
<property name="sizePolicy">
<sizepolicy hsizetype="Fixed" vsizetype="Fixed">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
<property name="minimumSize">
<size>
<width>40</width>
<height>0</height>
</size>
</property>
<property name="toolTip"> <property name="toolTip">
<string>Output mode</string> <string>Output mode</string>
</property> </property>
@ -213,11 +237,17 @@
<item row="0" column="9"> <item row="0" column="9">
<widget class="QLabel" name="legend4"> <widget class="QLabel" name="legend4">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumSize">
<size>
<width>25</width>
<height>0</height>
</size>
</property>
<property name="text"> <property name="text">
<string>Rev.</string> <string>Rev.</string>
</property> </property>
@ -226,11 +256,17 @@
<item row="0" column="10"> <item row="0" column="10">
<widget class="QLabel" name="legend5"> <widget class="QLabel" name="legend5">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Minimum" vsizetype="Preferred"> <sizepolicy hsizetype="Fixed" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="minimumSize">
<size>
<width>25</width>
<height>0</height>
</size>
</property>
<property name="text"> <property name="text">
<string>Link</string> <string>Link</string>
</property> </property>

View File

@ -1,134 +1,140 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"> <ui version="4.0">
<class>GCSControl</class> <class>GCSControl</class>
<widget class="QWidget" name="GCSControl"> <widget class="QWidget" name="GCSControl">
<property name="geometry"> <property name="geometry">
<rect> <rect>
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>653</width> <width>653</width>
<height>295</height> <height>295</height>
</rect> </rect>
</property> </property>
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Expanding"> <sizepolicy hsizetype="Expanding" vsizetype="Expanding">
<horstretch>0</horstretch> <horstretch>0</horstretch>
<verstretch>0</verstretch> <verstretch>0</verstretch>
</sizepolicy> </sizepolicy>
</property> </property>
<property name="windowTitle"> <property name="windowTitle">
<string>Form</string> <string>Form</string>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout_2"> <property name="styleSheet">
<property name="spacing"> <string notr="true">background:transparent</string>
<number>2</number> </property>
</property> <layout class="QVBoxLayout" name="verticalLayout_2">
<property name="margin"> <property name="spacing">
<number>5</number> <number>2</number>
</property> </property>
<item> <property name="margin">
<layout class="QVBoxLayout" name="verticalLayout"> <number>5</number>
<item> </property>
<layout class="QHBoxLayout" name="horizontalLayout"> <item>
<item> <layout class="QVBoxLayout" name="verticalLayout">
<widget class="QCheckBox" name="checkBoxGcsControl"> <item>
<property name="text"> <layout class="QHBoxLayout" name="horizontalLayout">
<string>GCS Control</string> <item>
</property> <widget class="QCheckBox" name="checkBoxGcsControl">
</widget> <property name="text">
</item> <string>GCS Control</string>
<item> </property>
<widget class="QCheckBox" name="checkBoxArmed"> </widget>
<property name="text"> </item>
<string>Armed</string> <item>
</property> <widget class="QCheckBox" name="checkBoxArmed">
</widget> <property name="text">
</item> <string>Armed</string>
<item> </property>
<widget class="QLabel" name="label"> </widget>
<property name="text"> </item>
<string>Flight Mode:</string> <item>
</property> <widget class="QLabel" name="label">
<property name="alignment"> <property name="text">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set> <string>Flight Mode:</string>
</property> </property>
</widget> <property name="alignment">
</item> <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
<item> </property>
<widget class="QComboBox" name="comboBoxFlightMode"/> </widget>
</item> </item>
</layout> <item>
</item> <widget class="QComboBox" name="comboBoxFlightMode"/>
</layout> </item>
</item> </layout>
<item> </item>
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0,0"> </layout>
<property name="horizontalSpacing"> </item>
<number>10</number> <item>
</property> <layout class="QGridLayout" name="gridLayout" columnstretch="0,0,0,0">
<property name="leftMargin"> <property name="horizontalSpacing">
<number>0</number> <number>10</number>
</property> </property>
<item row="0" column="0"> <property name="leftMargin">
<widget class="JoystickControl" name="widgetLeftStick" native="true"> <number>0</number>
<property name="sizePolicy"> </property>
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <item row="0" column="0">
<horstretch>0</horstretch> <widget class="JoystickControl" name="widgetLeftStick" native="true">
<verstretch>0</verstretch> <property name="sizePolicy">
</sizepolicy> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
</property> <horstretch>0</horstretch>
<property name="minimumSize"> <verstretch>0</verstretch>
<size> </sizepolicy>
<width>100</width> </property>
<height>100</height> <property name="minimumSize">
</size> <size>
</property> <width>100</width>
<property name="mouseTracking"> <height>100</height>
<bool>false</bool> </size>
</property> </property>
</widget> <property name="mouseTracking">
</item> <bool>false</bool>
<item row="0" column="2"> </property>
<widget class="JoystickControl" name="widgetRightStick" native="true"> <property name="styleSheet">
<property name="sizePolicy"> <string notr="true">background:transparent</string>
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> </property>
<horstretch>0</horstretch> </widget>
<verstretch>0</verstretch> </item>
</sizepolicy> <item row="0" column="1">
</property> <spacer name="verticalSpacer">
<property name="minimumSize"> <property name="orientation">
<size> <enum>Qt::Vertical</enum>
<width>100</width> </property>
<height>100</height> <property name="sizeHint" stdset="0">
</size> <size>
</property> <width>2</width>
</widget> <height>40</height>
</item> </size>
<item row="0" column="1"> </property>
<spacer name="verticalSpacer"> </spacer>
<property name="orientation"> </item>
<enum>Qt::Vertical</enum> <item row="0" column="2">
</property> <widget class="JoystickControl" name="widgetRightStick" native="true">
<property name="sizeHint" stdset="0"> <property name="sizePolicy">
<size> <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<width>2</width> <horstretch>0</horstretch>
<height>40</height> <verstretch>0</verstretch>
</size> </sizepolicy>
</property> </property>
</spacer> <property name="minimumSize">
</item> <size>
</layout> <width>100</width>
</item> <height>100</height>
</layout> </size>
</widget> </property>
<customwidgets> </widget>
<customwidget> </item>
<class>JoystickControl</class> </layout>
<extends>QWidget</extends> </item>
<header>joystickcontrol.h</header> </layout>
<container>1</container> </widget>
</customwidget> <customwidgets>
</customwidgets> <customwidget>
<resources/> <class>JoystickControl</class>
<connections/> <extends>QWidget</extends>
</ui> <header>joystickcontrol.h</header>
<container>1</container>
</customwidget>
</customwidgets>
<resources/>
<connections/>
</ui>

View File

@ -1,5 +1,5 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) --> <!-- Generator: Adobe Illustrator 12.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 51448) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
@ -11,185 +11,1885 @@
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.1" version="1.1"
width="490"
height="487"
viewBox="0 0 490 487"
overflow="visible"
enable-background="new 0 0 490 487"
xml:space="preserve"
id="svg2"
inkscape:version="0.48.2 r9819"
sodipodi:docname="joystick.svg"><metadata
id="metadata723"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
id="defs721" /><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1052"
inkscape:window-height="826"
id="namedview719"
showgrid="false"
inkscape:zoom="0.96919918"
inkscape:cx="295.47102"
inkscape:cy="210.00484"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="0"
inkscape:current-layer="svg2" />
<g
id="background"
inkscape:label="#BG"
transform="matrix(0.78514439,0,0,0.78293167,43.169635,40.476837)">
<linearGradient
id="XMLID_52_"
gradientUnits="userSpaceOnUse"
x1="3.6933999"
y1="241"
x2="480.30661"
y2="241">
<stop
offset="0.6629"
style="stop-color:#BCBEC0"
id="stop6" />
<stop
offset="0.7256"
style="stop-color:#B2B4B6"
id="stop8" />
<stop
offset="0.8308"
style="stop-color:#999A9C"
id="stop10" />
<stop
offset="0.9649"
style="stop-color:#6F7072"
id="stop12" />
<stop
offset="1"
style="stop-color:#636466"
id="stop14" />
</linearGradient>
<path
d="M 461.069,2.524 H 22.927 c -10.622,0 -19.234,8.041 -19.234,17.961 v 441.031 c 0,9.918 8.612,17.959 19.234,17.959 h 438.142 c 10.626,0 19.237,-8.041 19.237,-17.959 V 20.485 c 0.001,-9.92 -8.611,-17.961 -19.237,-17.961 z m 11.143,451.502 c 0,9.582 -8.318,17.35 -18.582,17.35 H 30.368 c -10.262,0 -18.581,-7.768 -18.581,-17.35 V 27.976 c 0,-9.583 8.319,-17.351 18.581,-17.351 H 453.63 c 10.264,0 18.582,7.768 18.582,17.351 v 426.05 z"
id="path16"
style="fill:url(#XMLID_52_)"
inkscape:connector-curvature="0" />
<linearGradient
id="XMLID_53_"
gradientUnits="userSpaceOnUse"
x1="13.9385"
y1="468.12891"
x2="469.09351"
y2="12.9739">
<stop
offset="0.0056"
style="stop-color:#FFFFFF"
id="stop19" />
<stop
offset="0.1438"
style="stop-color:#DADADA"
id="stop21" />
<stop
offset="0.3481"
style="stop-color:#AAAAAA"
id="stop23" />
<stop
offset="0.5423"
style="stop-color:#848484"
id="stop25" />
<stop
offset="0.7213"
style="stop-color:#696969"
id="stop27" />
<stop
offset="0.8794"
style="stop-color:#595959"
id="stop29" />
<stop
offset="1"
style="stop-color:#535353"
id="stop31" />
</linearGradient>
<path
d="m 474.797,455.541 c 0,9.67 -8.43,17.51 -18.83,17.51 H 27.063 c -10.399,0 -18.83,-7.84 -18.83,-17.51 V 25.562 c 0,-9.671 8.431,-17.511 18.83,-17.511 h 428.903 c 10.4,0 18.83,7.84 18.83,17.511 v 429.979 z"
id="path33"
style="fill:url(#XMLID_53_)"
inkscape:connector-curvature="0" />
<g
id="g35"
transform="matrix(0.96656026,0,0,0.9743773,4.0468958,2.3324246)">
<g
id="g37">
<g
id="g39">
<image
width="64" width="64"
height="64" height="64"
id="svg2" xlink:href="data:image/png;base64,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"
inkscape:version="0.47 r22583" transform="translate(1,1)"
sodipodi:docname="joystick-3.svg"> id="image41"
<sodipodi:namedview style="opacity:0.75">
pagecolor="#ffffff" </image>
bordercolor="#666666" <radialGradient
borderopacity="1" id="XMLID_54_"
objecttolerance="10" cx="30.4263"
gridtolerance="10" cy="30.189899"
guidetolerance="10" r="16.5"
inkscape:pageopacity="0" gradientUnits="userSpaceOnUse">
inkscape:pageshadow="2" <stop
inkscape:window-width="1280" offset="0.5899"
inkscape:window-height="725" style="stop-color:#231F20"
id="namedview7" id="stop44" />
showgrid="false" <stop
inkscape:zoom="6.4523494" offset="0.6789"
inkscape:cx="34.428448" style="stop-color:#403D3E"
inkscape:cy="32.074874" id="stop46" />
inkscape:window-x="0" <stop
inkscape:window-y="24" offset="0.8716"
inkscape:window-maximized="1" style="stop-color:#88888A"
inkscape:current-layer="background" id="stop48" />
showguides="true" <stop
inkscape:guide-bbox="true" /> offset="1"
<defs style="stop-color:#BCBEC0"
id="defs4"> id="stop50" />
<inkscape:perspective </radialGradient>
sodipodi:type="inkscape:persp3d" <circle
inkscape:vp_x="0 : 32 : 1" cx="30.426001"
inkscape:vp_y="0 : 1000 : 0" cy="30.190001"
inkscape:vp_z="64 : 32 : 1" r="16.5"
inkscape:persp3d-origin="32 : 21.333333 : 1" id="circle52"
id="perspective9" /> d="m 46.926001,30.190001 c 0,9.112698 -7.387302,16.5 -16.5,16.5 -9.112699,0 -16.5,-7.387302 -16.5,-16.5 0,-9.112699 7.387301,-16.5 16.5,-16.5 9.112698,0 16.5,7.387301 16.5,16.5 z"
<inkscape:perspective style="fill:url(#XMLID_54_)"
id="perspective4576" sodipodi:cx="30.426001"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1" sodipodi:cy="30.190001"
inkscape:vp_z="1 : 0.5 : 1" sodipodi:rx="16.5"
inkscape:vp_y="0 : 1000 : 0" sodipodi:ry="16.5" />
inkscape:vp_x="0 : 0.5 : 1" </g>
sodipodi:type="inkscape:persp3d" /> <g
<linearGradient id="g54">
inkscape:collect="always"
xlink:href="#linearGradient3899" <image
id="linearGradient3820" width="57"
gradientUnits="userSpaceOnUse" height="56"
x1="337.63348" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA4CAYAAABHRFAgAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQPSURB VHja7JoNb+MgDIaB0OzW7f//0tvWjwRulUCy3rONSei03TWSRZWuSZ69xjYmzj2Ox/FjDv9N7pF/ IqQ3nM9fBezveD1vuE9W4PJ3hPTGkQNpjbuOeAf1PIB5AZSCZEFJPwI03kG9mwUARFiEu1liYIeA xsGAgYzUNMhUzBPQNBJ0lJIc3ARjIL9BwBVGNxI0DpyHFG4q156IUUUR8GZL+W4l1x4CGne6KQdX AQ9lrEbVzARwKRYIqBsJGgcBBgJXAecyUliqJAW8ftpFSWkJALtA4wD3DABXAZ/KOBPQQAJMhbyA O2vFQN6iaNwRRTnACvWrQNaxwlN3rQoemDnrFEXRdZtFQ+wExCiKgE/FngtgHWcCUx+2qngWlLSA mlSNG9MEBpiZKHezYwE8EjVnBvLMKGn5Z2dmnm5Skt7QCvhc7KUAHkFNCnkFhYNQ41IXXkHNRABF 2GiMolbACvYKoBLkWZmTXgCmbhoIsKhqS0kOUgN8KfZKPiNkTfhVyWiYj1JhnyzBJxrSRehQsQK+ gpo9kK21Zy0JJyF3/qVmbKjIgVJIdFOEfGXmJIU8kHNOWaFkKN4Tcdfd0dUrkE/CfDyCy2qBJ5KA 48AN0VawROak19y2Z06iu2qB50gi7VFIIRGKg8zALFD61c9T+d5bcmtstENwESzNS5oj0ep3WAwE WJGsBKbWstQO5fwkrFO9lE6iIZp5ZkE8MQX5AUq7GWrXA9SuDgr1K1znAAX+ZFiI7yoGJNggLLUm 5qECUdIp32u/90IkVkHD/9BBjx1dbSmUS9FvZf7GwVLLEkETpI3U27qMCqBX4FZm0csFDKxLMYXg 318FWxhoqZXZhMxKRy0D3JUslW7B5cR0AyhgEmrXk2DnYhcFNguwucddqa1CmD9DiwMDhyPqc5Af n/bO2AeBpaDUlU1KTo0iwClNYq6JHJjoR71hIevIEwF8+7Tfxd6IISwqulpcdzLmSNfohktLoywk ewskAiJkvWZTzclQoG/dIMoMZHVxDvCtAXlpAOYttWtmiubVCOcYuLkxJyU3PQGg2U2tKQQf2HVA YttxVqLrOwGt0JagkwQ1u5T0UFCnTsikQGIA+lDm4cK4aXL6Jm5Xty6TKgV7Kj2QWkvyBO6JgWYV 8qNzG4oBzW099FRceVALpNZcvgCYFdCkYq+SWWjwLo20cTVsE1yIqpcOwGHbBE5YjEqgWCUtHRs+ UrJPzDQZvuEjqUpB1wZka+sODRXcBLh1f1IDzQKkdRN2HeWieyG1pRjCrm7bdvowwD2QXHrxjJrY MtRejEhCkt/9Ts/el5Xu9YrLMMARkNKqZevLSnhuN+AoSE3VVkftS147e7xAeIfr/hOvgm69R3aP 43E8jtvxR4ABAL1S3PlRWBIpAAAAAElFTkSuQmCC"
y1="371.99725" transform="translate(5,5)"
x2="729.8302" id="image56"
y2="676.58545" /> style="opacity:0.75">
<linearGradient </image>
id="linearGradient3899"> <radialGradient
<stop id="XMLID_55_"
id="stop3901" cx="30.4268"
offset="0" cy="30.190399"
style="stop-color:#9699a3;stop-opacity:1;" /> r="12.8335"
<stop gradientUnits="userSpaceOnUse">
style="stop-color:#1f1616;stop-opacity:1;" <stop
offset="0.49412024" offset="0"
id="stop3903" /> style="stop-color:#FFFFFF"
<stop id="stop59" />
id="stop3905" <stop
offset="1" offset="1"
style="stop-color:#9498a5;stop-opacity:0;" /> style="stop-color:#393939"
</linearGradient> id="stop61" />
<linearGradient </radialGradient>
inkscape:collect="always" <path
xlink:href="#linearGradient3899" d="m 39.948,26.878 h -6.209 v -6.209 c 0,-1.829 -1.483,-3.313 -3.313,-3.313 -1.828,0 -3.312,1.483 -3.312,3.313 v 6.209 h -6.21 c -1.829,0 -3.312,1.483 -3.312,3.313 0,1.828 1.482,3.312 3.312,3.312 h 6.21 v 6.21 c 0,1.829 1.483,3.312 3.312,3.312 1.829,0 3.313,-1.482 3.313,-3.312 v -6.21 h 6.209 c 1.829,0 3.313,-1.483 3.313,-3.312 -0.001,-1.829 -1.484,-3.313 -3.313,-3.313 z"
id="linearGradient4790" id="path63"
x1="14.99304" style="fill:url(#XMLID_55_)"
y1="1038.3234" inkscape:connector-curvature="0" />
x2="105.25183" </g>
y2="941.66919" <g
gradientUnits="userSpaceOnUse" /> id="g65">
</defs> <g
<metadata id="g67">
id="metadata7">
<rdf:RDF> <image
<cc:Work width="67"
rdf:about=""> height="67"
<dc:format>image/svg+xml</dc:format> xlink:href="data:image/png;base64,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 AElFTkSuQmCC"
<dc:type id="image69"
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> style="opacity:0.75">
<dc:title></dc:title> </image>
</cc:Work> <g
</rdf:RDF> id="g71">
</metadata> <g
<g id="g73">
id="background" <linearGradient
inkscape:label="#g4757"> id="XMLID_56_"
<g gradientUnits="userSpaceOnUse"
inkscape:label="#layer1" x1="48.4263"
id="Baba" y1="30.189899"
transform="matrix(1.1638314,0,0,-1.1066141,-5.6432489,1159.5817)" x2="12.4263"
style="fill-opacity:1;fill:url(#linearGradient4790)"> y2="30.189899">
<rect <stop
style="fill:url(#linearGradient4790);fill-opacity:1.0;stroke:#202020;stroke-width:0.88116424000000004;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" offset="0"
id="rect2985" style="stop-color:#FFFFFF"
y="990.19446" id="stop76" />
x="5.0757694" <stop
ry="28.718821" offset="1"
rx="0.09363886" style="stop-color:#000000"
height="57.437641" id="stop78" />
width="54.725903" /> </linearGradient>
</g> <path
<g d="m 30.426,12.19 c -9.941,0 -18,8.059 -18,18 0,9.941 8.059,18 18,18 9.941,0 18,-8.059 18,-18 0,-9.941 -8.058,-18 -18,-18 z m 0,33.837 c -8.746,0 -15.837,-7.091 -15.837,-15.837 0,-8.746 7.091,-15.836 15.837,-15.836 8.746,0 15.836,7.09 15.836,15.836 0,8.746 -7.09,15.837 -15.836,15.837 z"
id="g3789" id="path80"
transform="matrix(0.13698764,0,0,0.13698764,-19.020289,-22.990069)"> style="fill:url(#XMLID_56_)"
<path inkscape:connector-curvature="0" />
style="fill:none;stroke:#f1f4fc;stroke-width:3.96819687;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" </g>
d="m 147.64949,401.70025 448.62372,0" </g>
id="path3604" /> </g>
<path <g
id="path3606" id="g82">
d="m 371.96135,177.80154 0,447.79741"
style="fill:none;stroke:#f1f4fc;stroke-width:3.96454072;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" /> <image
<g width="63"
transform="translate(-55.093487,1.6686132)" height="64"
id="text4694" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAABACAYAAACtK6/LAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAU9SURB VHja7FsBjtswDLMcd/9/75pYw4AroGmkJCfpcNsugJH0mktMUZYl2m3t6/g/D/lE79R/DfzV5+vf Bl5ueo++2xDyxmcJ+LssANZ3G0JufoYUz/4aAc3Ol40w3gDaX0tiBARawWd0v1wxwLgJ+Gqzz/BM +jaBQbwBTnmBXADuGe7guoPvBLzXszyTsxKD6LuYz9jupIm79uxHwH0TZ4B5ZRiMi8A9uI1cd2AA BN4DP9zZXqOYsGSAccLlEdObOfvGwAsZ6wi4bWL+3hz7SwYYi2NcCNPDgB0FA7QieNt2Y7zDPeOU AcZF4BbscI2Bl2Cqs26PgO+uL4f5/7ka9MYNwH+2BwA/3HCwMQJNdZ79l9vvSdxozgBSZX8sjnUG /GEM8HDMs0CHmLdt+zBAB89hwwZ5ATXAOMF6N+BfoL858Nbl2dwuSV4/zbt24DksG5QgdV5ye+by iPWHY72DzrIcnU2n3biyFLLCTtiG7I9idVYF/gCM285OAp6lv1KoA1jWl7I/iuOcBbpBgHdjbT+F KZiaWFr8+m4j7o6ywE5S39/YHzdE+gECnCRJC+qYfb6CnMB+x4AfYKhQ5rcAdA/c/RsIdMMxZqes nbTDdV5JLKjkBrpQDodjXojrbyST81PZNHO0b5Z9NI2+DKmGnA7um+b+g0yr4tz9F9evjnlkgA6A W5d8gX1+NMS2fc9mQCEv6EHOYfvjXX8p2rNpjhUzErj607XdpKw2KndTI8xkJkDlc5RGC0t2RkF1 ZS9Ec6/Py18G+O7ATxfxrStrgYRIP4jS30u5PeqIDz5RkHu6etxmZDOZASZIhHpCChr3SwGvBcw3 wLyvxnx03wHQDj7vZgwfJGOUBDDzZl1lvkUPAnPvQZqP9g14wWGAswCYeaZkOmWlno+k6JYIEqyp i/ZWn2P3o9Q1MsBbNLxM+dViq8jWGsjWq338bdz39nmOsxJ0mWl/9BMdyzq4unCxutgRedqSQUcB tBK3XMkJbLO1tyUBafy9sOBRNcTSmK8UB1456aQO2EDE9hF+K0jfKKnKCpqlwkbJyiiKwN4AAooO NFWhDK8DJdjLYT2ZXbK1vVYtbDSxMMvIFAC393aQ21vmH0Qj6IT1bFrUipKjRG+rvKQ513+xP9z3 NnNjzI/AAI2k04z5U2OesTzJmpkHyATKbsrNCPxwgqgvm2eg5DBydDXgscVDm6Zuxt27Yz8qUqb7 fgMSmXf5bElrFpKpNOC1wst2Jx50opsj1tGYjxY6hVSOB5HDWNALBUwNgsphgtVuFhN8MOouiAlx +RmUpyzITVAxZuwvS9caSM9+8RCVmh3EAD9mNUmQkCa4KoaeXrFRt/gnhv29oJowGWyC+r0lAgRS h54A/FF1eSRdR3JxZctZdbkbaYIrstjTXCPwWaKTgm8BWHad7ZmTQjWmRAXeHegK8LayaNEKTEth qGQZYiMdnCS27IDtJxFFyxpAVcxQt+7dgtWTV8dHW9uVoYWp1RvidKSvBDyvfswC8OkSoK3Fm5Gi NJqBP84GudV6PjMAY2xlTw7KJi2wHRhiBmt9t21Fywzgy9TZalvRKuDZlrRZGOe3bEVjAW26jnfX 8comxKryeywou63dvAmRbfCdIBPsLpmRxTGPxAlWts5kel2We1eSldbObTxmuUFUSmuBaT0D5KwB ziiwVRU2U2Uu7bi+Ar6SBK382EADL2gJy3oHgLuNUKkBpMW/q8mA6l0dv9MIlXpgZdXm0/7AaHXN 7O4Vok8F/s7n/3U/Kjz7Tm1fx9fxR44fAgwAvmzh1nziJNEAAAAASUVORK5CYII="
style="font-size:18.68679619px;font-style:normal;font-weight:normal;fill:#f1f4fc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"> transform="translate(2,1)"
<path id="image84"
id="path4735" style="opacity:0.75">
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" </image>
d="m 442.33813,294.19735 0,2.33585 -5.47523,0 -0.4298,2.76565 c 0.7101,-0.53568 1.47625,-0.80353 2.29848,-0.80354 1.22086,10e-6 2.21126,0.42358 2.9712,1.27071 0.77238,0.84714 1.15857,1.94966 1.15858,3.30756 -10e-6,1.43266 -0.44226,2.59124 -1.32676,3.47574 -0.88452,0.88451 -2.03687,1.32676 -3.45706,1.32677 -1.28316,-10e-6 -2.32962,-0.35505 -3.13938,-1.06515 -0.79731,-0.72256 -1.20841,-1.66312 -1.23333,-2.82171 l 2.57878,0 c 0.0623,1.0963 0.67272,1.64444 1.8313,1.64444 0.66027,0 1.17727,-0.22424 1.55101,-0.67272 0.38619,-0.44849 0.57928,-1.05892 0.57929,-1.83131 -10e-6,-0.7973 -0.1931,-1.42019 -0.57929,-1.86868 -0.37374,-0.46093 -0.89074,-0.69141 -1.55101,-0.69141 -0.83468,0 -1.39528,0.33637 -1.68181,1.00909 l -2.35453,0 1.17726,-7.38129 7.0823,0" /> <g
<path id="g86">
id="path4737" <g
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" id="g88">
d="m 450.94603,307.35286 c -0.61044,0.34882 -1.35792,0.52322 -2.24242,0.52323 -0.88451,-10e-6 -1.63198,-0.17441 -2.24241,-0.52323 -0.61044,-0.36128 -1.08384,-0.87205 -1.4202,-1.53232 -0.32391,-0.66027 -0.55438,-1.38282 -0.69141,-2.16767 -0.13704,-0.7973 -0.20556,-1.71295 -0.20556,-2.74696 0,-2.52894 0.37374,-4.29172 1.12121,-5.28836 0.82222,-1.13366 1.96834,-1.70049 3.43837,-1.7005 1.60706,10e-6 2.81547,0.65405 3.62524,1.96211 0.62288,1.0091 0.93433,2.7096 0.93434,5.1015 -1e-5,0.99663 -0.0685,1.88737 -0.20555,2.67221 -0.13705,0.77239 -0.36752,1.49495 -0.69142,2.16767 -0.32391,0.66027 -0.79731,1.17104 -1.42019,1.53232 m -0.29899,-6.42826 c -1e-5,-1.33299 -0.0872,-2.36699 -0.26162,-3.10201 -0.16196,-0.735 -0.37374,-1.21463 -0.63535,-1.43888 -0.26162,-0.23669 -0.61044,-0.35504 -1.04646,-0.35505 -0.69764,10e-6 -1.19596,0.35506 -1.49494,1.06514 -0.29899,0.69765 -0.44849,1.96213 -0.44848,3.79342 -1e-5,1.27071 0.081,2.26734 0.24292,2.98989 0.16195,0.7101 0.37374,1.1835 0.63535,1.4202 0.27407,0.22424 0.62912,0.33636 1.06515,0.33636 0.75993,0 1.29561,-0.40488 1.60707,-1.21464 0.22423,-0.62289 0.33635,-1.7877 0.33636,-3.49443" /> <linearGradient
<path id="XMLID_57_"
id="path4739" gradientUnits="userSpaceOnUse"
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" x1="14.2183"
d="m 457.85343,294.34684 c 0.95925,2e-5 1.76901,0.33638 2.42928,1.00909 0.67272,0.66028 1.00908,1.47004 1.00909,2.42929 -1e-5,0.90943 -0.3426,1.7005 -1.02778,2.37322 -0.67273,0.66027 -1.47626,0.99041 -2.41059,0.9904 -0.9468,10e-6 -1.75656,-0.33013 -2.42929,-0.9904 -0.67272,-0.67272 -1.00908,-1.47625 -1.00908,-2.4106 0,-0.93433 0.33636,-1.73163 1.00908,-2.39191 0.67273,-0.67271 1.48249,-1.00907 2.42929,-1.00909 m 1.1212,2.31717 c -0.31145,-0.31144 -0.68518,-0.46716 -1.1212,-0.46717 -0.43603,10e-6 -0.80977,0.15573 -1.12121,0.46717 -0.31145,0.299 -0.46717,0.66027 -0.46717,1.08383 0,0.43604 0.15572,0.80977 0.46717,1.12121 0.31144,0.299 0.68518,0.44849 1.12121,0.44848 0.43602,1e-5 0.80975,-0.14948 1.1212,-0.44848 0.31145,-0.31144 0.46717,-0.67894 0.46717,-1.10252 0,-0.43602 -0.15572,-0.80352 -0.46717,-1.10252 m 6.35351,-2.46666 1.4202,0 -7.38128,13.62267 -1.43889,0 7.39997,-13.62267 m 1.36414,6.67119 c 0.95924,0 1.769,0.33637 2.42928,1.00908 0.67271,0.66028 1.00908,1.47626 1.00909,2.44797 -10e-6,0.90943 -0.34261,1.7005 -1.02777,2.37323 -0.67274,0.66026 -1.47627,0.9904 -2.4106,0.9904 -0.94681,0 -1.75657,-0.33014 -2.42928,-0.9904 -0.67274,-0.67273 -1.0091,-1.48249 -1.00909,-2.42929 -1e-5,-0.93433 0.33635,-1.73163 1.00909,-2.39191 0.67271,-0.67271 1.48247,-1.00908 2.42928,-1.00908 m 1.12121,2.31716 c -0.31146,-0.31144 -0.6852,-0.46717 -1.12121,-0.46717 -0.43604,0 -0.80977,0.15573 -1.12121,0.46717 -0.31145,0.29899 -0.46718,0.6665 -0.46717,1.10252 -1e-5,0.43603 0.15572,0.80976 0.46717,1.12121 0.31144,0.29899 0.68517,0.44848 1.12121,0.44848 0.43601,0 0.80975,-0.14949 1.12121,-0.44848 0.31143,-0.31145 0.46715,-0.67895 0.46717,-1.10252 -2e-5,-0.43602 -0.15574,-0.80976 -0.46717,-1.12121" /> y1="30.189899"
</g> x2="46.6353"
<g y2="30.189899">
transform="translate(-84.518596,-20.468429)" <stop
id="text4705" offset="0"
style="font-size:18.68679619px;font-style:normal;font-weight:normal;fill:#f1f4fc;fill-opacity:1;stroke:none;font-family:Bitstream Vera Sans"> style="stop-color:#FFFFFF"
<path id="stop91" />
id="path4742" <stop
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" offset="1"
d="m 472.26662,250.39779 0,2.05555 c -1.5697,1.8936 -2.72205,3.71245 -3.45706,5.45654 -0.73501,1.73165 -1.16481,3.64393 -1.28938,5.73685 l -2.63484,0 c 0.3239,-2.56632 0.90319,-4.72776 1.73787,-6.48432 0.26161,-0.57305 0.71009,-1.34544 1.34545,-2.31716 0.6478,-0.97171 1.17103,-1.67557 1.56969,-2.11161 l -6.59644,0 0,-2.33585 9.32471,0" /> style="stop-color:#000000"
<path id="stop93" />
id="path4744" </linearGradient>
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" <path
d="m 481.93967,250.39779 0,2.33585 -5.47523,0 -0.4298,2.76565 c 0.71009,-0.53568 1.47625,-0.80353 2.29848,-0.80354 1.22086,1e-5 2.21126,0.42358 2.9712,1.27071 0.77237,0.84714 1.15857,1.94966 1.15858,3.30756 -10e-6,1.43266 -0.44227,2.59124 -1.32677,3.47574 -0.88451,0.88451 -2.03686,1.32676 -3.45705,1.32676 -1.28317,0 -2.32963,-0.35504 -3.13938,-1.06514 -0.79731,-0.72256 -1.20842,-1.66313 -1.23333,-2.82171 l 2.57877,0 c 0.0623,1.0963 0.67273,1.64444 1.83131,1.64444 0.66026,0 1.17726,-0.22424 1.55101,-0.67273 0.38618,-0.44848 0.57928,-1.05891 0.57929,-1.8313 -10e-6,-0.7973 -0.19311,-1.42019 -0.57929,-1.86868 -0.37375,-0.46094 -0.89075,-0.69141 -1.55101,-0.69141 -0.83468,0 -1.39528,0.33637 -1.68181,1.00908 l -2.35454,0 1.17727,-7.38128 7.0823,0" /> d="m 30.426,13.982 c -8.951,0 -16.208,7.257 -16.208,16.208 0,8.95 7.257,16.208 16.208,16.208 8.951,0 16.209,-7.258 16.209,-16.208 0,-8.951 -7.258,-16.208 -16.209,-16.208 z m 0,30.47 c -7.876,0 -14.261,-6.386 -14.261,-14.262 0,-7.876 6.385,-14.262 14.261,-14.262 7.877,0 14.262,6.386 14.262,14.262 0,7.876 -6.385,14.262 -14.262,14.262 z"
<path id="path95"
id="path4746" style="fill:url(#XMLID_57_)"
style="font-variant:normal;font-weight:bold;font-stretch:normal;fill:#f1f4fc;fill-opacity:1;font-family:FreeSans;-inkscape-font-specification:FreeSans Bold" inkscape:connector-curvature="0" />
d="m 487.05313,250.54728 c 0.95925,2e-5 1.76901,0.33638 2.42929,1.00909 0.67271,0.66028 1.00908,1.47004 1.00908,2.42928 0,0.90944 -0.34259,1.70051 -1.02777,2.37323 -0.67273,0.66027 -1.47626,0.9904 -2.4106,0.9904 -0.9468,0 -1.75656,-0.33013 -2.42928,-0.9904 -0.67273,-0.67272 -1.00909,-1.47625 -1.00909,-2.4106 0,-0.93433 0.33636,-1.73163 1.00909,-2.39191 0.67272,-0.67271 1.48248,-1.00907 2.42928,-1.00909 m 1.12121,2.31717 c -0.31145,-0.31144 -0.68519,-0.46716 -1.12121,-0.46717 -0.43603,1e-5 -0.80976,0.15573 -1.1212,0.46717 -0.31145,0.299 -0.46718,0.66027 -0.46717,1.08383 -1e-5,0.43604 0.15572,0.80977 0.46717,1.12121 0.31144,0.299 0.68517,0.44849 1.1212,0.44848 0.43602,1e-5 0.80976,-0.14948 1.12121,-0.44848 0.31144,-0.31144 0.46717,-0.67895 0.46717,-1.10252 0,-0.43602 -0.15573,-0.80352 -0.46717,-1.10252 m 6.35351,-2.46666 1.4202,0 -7.38129,13.62267 -1.43888,0 7.39997,-13.62267 m 1.36414,6.67119 c 0.95924,0 1.769,0.33636 2.42928,1.00908 0.67271,0.66027 1.00907,1.47626 1.00909,2.44797 -2e-5,0.90943 -0.34261,1.7005 -1.02778,2.37323 -0.67273,0.66026 -1.47627,0.9904 -2.41059,0.9904 -0.94681,0 -1.75657,-0.33014 -2.42929,-0.9904 -0.67273,-0.67273 -1.00909,-1.48249 -1.00908,-2.42929 -10e-6,-0.93433 0.33635,-1.73164 1.00908,-2.39191 0.67272,-0.67272 1.48248,-1.00908 2.42929,-1.00908 m 1.12121,2.31716 c -0.31146,-0.31144 -0.6852,-0.46717 -1.12121,-0.46717 -0.43604,0 -0.80978,0.15573 -1.12121,0.46717 -0.31146,0.29899 -0.46718,0.6665 -0.46717,1.10252 -10e-6,0.43603 0.15571,0.80976 0.46717,1.12121 0.31143,0.29899 0.68517,0.44848 1.12121,0.44848 0.43601,0 0.80975,-0.14949 1.12121,-0.44848 0.31143,-0.31145 0.46715,-0.67895 0.46717,-1.10252 -2e-5,-0.43602 -0.15574,-0.80976 -0.46717,-1.12121" /> </g>
</g> </g>
<rect </g>
style="fill:none;fill-opacity:1;stroke:#f1f4fc;stroke-width:0.53500000000000003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" </g>
id="rect4780" </g>
width="31.073954" <g
height="31.228935" id="g97">
x="16.428125" <g
y="16.420431" id="g99">
transform="matrix(7.2999287,0,0,7.2999287,138.84675,167.82586)" />
<rect <image
style="fill:none;stroke:#f1f4fc;stroke-width:0.53500003;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" width="64"
id="rect4782" height="64"
width="46.52055" xlink:href="data:image/png;base64,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"
height="48.931507" transform="translate(424,1)"
x="8.6575346" id="image101"
y="7.5616441" style="opacity:0.75">
transform="matrix(7.2999287,0,0,7.2999287,138.84675,167.82586)" /> </image>
</g> <radialGradient
</g> id="XMLID_58_"
<path cx="453.42581"
sodipodi:type="arc" cy="30.189899"
style="fill:#ff201d;fill-opacity:1;stroke:#ef7d7d;stroke-width:0.39996386;stroke-miterlimit:4;stroke-opacity:0.59336093;stroke-dasharray:none" r="16.5"
id="joystickEnd" gradientUnits="userSpaceOnUse">
sodipodi:cx="25.013699" <stop
sodipodi:cy="28.684931" offset="0.5899"
sodipodi:rx="1.0136986" style="stop-color:#231F20"
sodipodi:ry="1.0136986" id="stop104" />
d="m 26.027397,28.684931 a 1.0136986,1.0136986 0 1 1 -2.027397,0 1.0136986,1.0136986 0 1 1 2.027397,0 z" <stop
inkscape:label="#path3034" offset="0.6789"
transform="matrix(2.1651956,0,0,2.1651956,-34.537402,-34.234392)" /> style="stop-color:#403D3E"
</svg> id="stop106" />
<stop
offset="0.8716"
style="stop-color:#88888A"
id="stop108" />
<stop
offset="1"
style="stop-color:#BCBEC0"
id="stop110" />
</radialGradient>
<circle
cx="453.42599"
cy="30.190001"
r="16.5"
id="circle112"
d="m 469.92599,30.190001 c 0,9.112698 -7.3873,16.5 -16.5,16.5 -9.11269,0 -16.5,-7.387302 -16.5,-16.5 0,-9.112699 7.38731,-16.5 16.5,-16.5 9.1127,0 16.5,7.387301 16.5,16.5 z"
style="fill:url(#XMLID_58_)"
sodipodi:cx="453.42599"
sodipodi:cy="30.190001"
sodipodi:rx="16.5"
sodipodi:ry="16.5" />
</g>
<g
id="g114">
<image
width="57"
height="56"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA4CAYAAABHRFAgAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQPSURB VHja7JoNb+MgDIaB0OzW7f//0tvWjwRulUCy3rONSei03TWSRZWuSZ69xjYmzj2Ox/FjDv9N7pF/ IqQ3nM9fBezveD1vuE9W4PJ3hPTGkQNpjbuOeAf1PIB5AZSCZEFJPwI03kG9mwUARFiEu1liYIeA xsGAgYzUNMhUzBPQNBJ0lJIc3ARjIL9BwBVGNxI0DpyHFG4q156IUUUR8GZL+W4l1x4CGne6KQdX AQ9lrEbVzARwKRYIqBsJGgcBBgJXAecyUliqJAW8ftpFSWkJALtA4wD3DABXAZ/KOBPQQAJMhbyA O2vFQN6iaNwRRTnACvWrQNaxwlN3rQoemDnrFEXRdZtFQ+wExCiKgE/FngtgHWcCUx+2qngWlLSA mlSNG9MEBpiZKHezYwE8EjVnBvLMKGn5Z2dmnm5Skt7QCvhc7KUAHkFNCnkFhYNQ41IXXkHNRABF 2GiMolbACvYKoBLkWZmTXgCmbhoIsKhqS0kOUgN8KfZKPiNkTfhVyWiYj1JhnyzBJxrSRehQsQK+ gpo9kK21Zy0JJyF3/qVmbKjIgVJIdFOEfGXmJIU8kHNOWaFkKN4Tcdfd0dUrkE/CfDyCy2qBJ5KA 48AN0VawROak19y2Z06iu2qB50gi7VFIIRGKg8zALFD61c9T+d5bcmtstENwESzNS5oj0ep3WAwE WJGsBKbWstQO5fwkrFO9lE6iIZp5ZkE8MQX5AUq7GWrXA9SuDgr1K1znAAX+ZFiI7yoGJNggLLUm 5qECUdIp32u/90IkVkHD/9BBjx1dbSmUS9FvZf7GwVLLEkETpI3U27qMCqBX4FZm0csFDKxLMYXg 318FWxhoqZXZhMxKRy0D3JUslW7B5cR0AyhgEmrXk2DnYhcFNguwucddqa1CmD9DiwMDhyPqc5Af n/bO2AeBpaDUlU1KTo0iwClNYq6JHJjoR71hIevIEwF8+7Tfxd6IISwqulpcdzLmSNfohktLoywk ewskAiJkvWZTzclQoG/dIMoMZHVxDvCtAXlpAOYttWtmiubVCOcYuLkxJyU3PQGg2U2tKQQf2HVA YttxVqLrOwGt0JagkwQ1u5T0UFCnTsikQGIA+lDm4cK4aXL6Jm5Xty6TKgV7Kj2QWkvyBO6JgWYV 8qNzG4oBzW099FRceVALpNZcvgCYFdCkYq+SWWjwLo20cTVsE1yIqpcOwGHbBE5YjEqgWCUtHRs+ UrJPzDQZvuEjqUpB1wZka+sODRXcBLh1f1IDzQKkdRN2HeWieyG1pRjCrm7bdvowwD2QXHrxjJrY MtRejEhCkt/9Ts/el5Xu9YrLMMARkNKqZevLSnhuN+AoSE3VVkftS147e7xAeIfr/hOvgm69R3aP 43E8jtvxR4ABAL1S3PlRWBIpAAAAAElFTkSuQmCC"
transform="translate(428,5)"
id="image116"
style="opacity:0.75">
</image>
<radialGradient
id="XMLID_59_"
cx="453.42679"
cy="30.190399"
r="12.8333"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop119" />
<stop
offset="1"
style="stop-color:#393939"
id="stop121" />
</radialGradient>
<path
d="m 462.947,26.878 h -6.209 v -6.209 c 0,-1.829 -1.482,-3.313 -3.313,-3.313 -1.828,0 -3.311,1.483 -3.311,3.313 v 6.209 h -6.211 c -1.828,0 -3.311,1.483 -3.311,3.313 0,1.828 1.482,3.312 3.311,3.312 h 6.211 v 6.21 c 0,1.829 1.482,3.312 3.311,3.312 1.83,0 3.313,-1.482 3.313,-3.312 v -6.21 h 6.209 c 1.83,0 3.313,-1.483 3.313,-3.312 0,-1.829 -1.483,-3.313 -3.313,-3.313 z"
id="path123"
style="fill:url(#XMLID_59_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g125">
<g
id="g127">
<image
width="67"
height="67"
xlink:href="data:image/png;base64,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"
transform="translate(423,0)"
id="image129"
style="opacity:0.75">
</image>
<g
id="g131">
<g
id="g133">
<linearGradient
id="XMLID_60_"
gradientUnits="userSpaceOnUse"
x1="471.42581"
y1="30.189899"
x2="435.42581"
y2="30.189899">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop136" />
<stop
offset="1"
style="stop-color:#000000"
id="stop138" />
</linearGradient>
<path
d="m 453.426,12.19 c -9.941,0 -18,8.059 -18,18 0,9.941 8.059,18 18,18 9.941,0 18,-8.059 18,-18 0,-9.941 -8.059,-18 -18,-18 z m 0,33.837 c -8.746,0 -15.836,-7.091 -15.836,-15.837 0,-8.746 7.09,-15.836 15.836,-15.836 8.746,0 15.836,7.09 15.836,15.836 0,8.746 -7.09,15.837 -15.836,15.837 z"
id="path140"
style="fill:url(#XMLID_60_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g142">
<image
width="63"
height="64"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAABACAYAAACtK6/LAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAUoSURB VHja7FuLjts4DBRlpf//vRdbKgpsAJad4cNxdtPrGhDsTbK2hi+RQ7m17+PfPOSNnrn+b+Cfvf/6 28DLRc9ZrxaEvPBeAj6XAuD1akHIxfeQ5NleI6DR+WkhyAtA22sJhIBAr+BvJoxPAW+BV4e+h9Wk HRN81sz1KSHIE8Cthju47uA7Ac+1gGZwRsIoC0Au1HYnQ8y11b4HnA3721NuIE8Ct+A2ct2BABB4 C/wwZ30duUR4jBMmjzS9qbMdDLwQX0fA9RD1efu4ti4kGQGMoo8L0fRQYEdCAC0JXo9dCe8w9zgl gPEkcA12mMHAi7PUaXNGwHczl0P9/6z6/LgA+K9xA+CHcQcdI9BSZ7X/MPs9iBvNCECy2h9FX2fA b0oAN6N5FuiQ5vXYPgTQwX2Y2yAroAIYJ7TeFfgH6B8GvDZ5trZLkNdP9awdWA7L/sRJnUtmz0we af1mtN7BZL31WIilTSBAlhV2om2o/ZGszrLAb0DjerKTgGfpryTqAJb1hdofST9ngW4Q4F1J2y5h CyxNLC1+fLcRc0fZXyep7x/aHxdE+gECnARJC5qYvv8COYH+jgE/gKtQzW8O6O6Y+w8Q6IbRmF6y djIOkrOz2OPlBpnKL+XzQkx/I5mcXcqmWqPt0NpHy+hDkEspp4PfTfX7gyyrYsz9N9PP+jwSQAfA tUk+wN4/BtK2fs6mQCEr6E7OoedjTb8U7dkyx4oZcUz9bsauUlYdlbuqEWawEqDy2UujhSU7I8G6 sgeitdfm5Q8B/GfATxPxtSmvhBI8/sBLf5/K7dFEbPDxgtzd1OM6I5vBCjBBItQDpSC/LwW85mi+ Ac3basxG9x0A7eDvXfnwQTJGCQAza15VzTfvRmDtPciw0b4BKzgUcBYAI8uUiK3K1PMeFd0CQsLj 4HS0n+rscXY2dfUEcBmNVWlBreTI0NaMpT0zxz/8vrf3Oc5S0GlN26OfmFg0wWrjotrs8CytJNCR AL2IWVZyAj107a2VgDj+nmh4ZAVR8vlMcWCZk07qgA1EbBvhtwT1jZKqqKApFTasKYgisBWAgKID LVUow+uACbZ0WA9WF1TlUVeoaJ41EG3CsQBw/dsOcnut+RvhCDrRerQsrgyTswjflnlIM6b/0P4w 3+vMjWl+OAJoJJ1mmj/l80zLk/TMLEBGUHZVbnrghyFEbdk8HSaHKWdVAx5rHuo0dVPm3o32vSJl mu83QJFZk49aWqXG5XB8PXrYbsiDTnhzpHXk816jU0jleBA6jAU9l8BcTlA5VLDaVTPBBqNugpgQ k59OecqC3AQVY6T9MnW9HOrZNg9RqdlBDLA+u4IECXGCVTL0dMdmmeafKO3vCdaE0WAT1O8tICAQ O3QH4I+sySPq2qOLM1vOsu1uxAlWaLG7ukbgo0QnBN8csOw62jMniWpsERZ4N6AzwFuladESmpaE q0QZYiMTnCS27EDbd0KKpjmALJmxTN+7Od2Tx8RHq+3KWIml1QridKTPBDzLfswE8GkSoK35m5G8 NJqBP84GuWo9HwmAaayyJwdlkxrYDgQxnV7fZVvRIgHYMnW23Fa0DHi2JW0m/PySrWgsoE0z8W4m ntmEmGV+jwKzm+YAv3r7aRTworL1U7aftiDBqW48ZrmBV0pntpu+bONxxQquYGEjVuZLtpxnk6DK ywbLsYLW3uxlg4wQMjWANP+9mgjol71m8mw9UOnavO0LRtWe2dUdorcCf+X9/7qXCs8+c7Xv4/v4 lOOnAAMAme3iy7JhkzkAAAAASUVORK5CYII="
transform="translate(425,1)"
id="image144"
style="opacity:0.75">
</image>
<g
id="g146">
<g
id="g148">
<linearGradient
id="XMLID_61_"
gradientUnits="userSpaceOnUse"
x1="437.21881"
y1="30.189899"
x2="469.6348"
y2="30.189899">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop151" />
<stop
offset="1"
style="stop-color:#000000"
id="stop153" />
</linearGradient>
<path
d="m 453.426,13.982 c -8.951,0 -16.207,7.257 -16.207,16.208 0,8.95 7.256,16.208 16.207,16.208 8.951,0 16.209,-7.258 16.209,-16.208 0,-8.951 -7.258,-16.208 -16.209,-16.208 z m 0,30.47 c -7.875,0 -14.26,-6.386 -14.26,-14.262 0,-7.876 6.385,-14.262 14.26,-14.262 7.877,0 14.262,6.386 14.262,14.262 0,7.876 -6.385,14.262 -14.262,14.262 z"
id="path155"
style="fill:url(#XMLID_61_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</g>
<g
id="g157">
<g
id="g159">
<image
width="64"
height="64"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEAAAABACAYAAACqaXHeAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAYeSURB VHja7FuLjts2ECQlSn4k6f9/Z5OzrSdbA2KxmMwuSdlO7poTQEhnnyzPcHa5D9q5z+PPPvw7fl78 PxDwzM+PH4UAX/l3Cdj4KjL8i4Cza7+DgEgAx2cS4V8E3Bdc470ILMJ1KSm/lACvAC8ZGgGxcjxE gn/SrONoyLkxiGDAV3Fe4bV07RR1FB/hSbOOQHG0QEIDBEgAKxkLeY2Zga8lIjwAHmdcgtVGel+S 4BTwS2Z4UAYSEZ9NAAPPgAcyWnFGNSABEuSsjEb8zwr3+xoSwoPgE5gErtuuOzIkIegTIhCQgE7K SO/77f/ddm8DJDxFARZ4OeMJaK8MSYRUgRMA5MzfgY5iDNu53d5jK8oiSHAlRNQoQAOfgB02oPfz cTvLIUlohS/wYP8I/g78tt1/2545iO+SjhnMoMgfhMrljoHvBcg78NM2juKMJEhf4Ij8pw1kAn+/ 9wo+BRWEx1pCQtjp9BB8AnoW4yTOR0FAL0CgAhYx+4mA6zZ6YUKNEsPIOMKXBEmhUPoNgA9C9kcB 9gsMSUZSAfqBdCyCgGmb+ZsgD++zgqgoVBAtfxAqIj0pf5z9O8ivYnwDEk4GEGco4E7AJTP7LHiS KjCDo1Dh+BqwfTn7XwTwv7bzV0FCIqAHAjQTkApg4PEeFj02xP5/UkGoiPOZ4zsK6SMBiYQzIaA1 CJg3BRwM6UcSMc4QRK3EH1SZgDfk34H8JQGoAukDegiGPIkD0ipwAIcpzQXjBRYtrmJJ3LUKOMMB ogLOYP/fhB84g/13xJFFADbB/6GvmJVgadxeCyQocswMQoX8W2X5OwEJuBIw+28UBSQVhAx4XCrT YObiLWcYdjpADH7OyjgR+SMwzAVWkjBp4G8iUOqVUNtbdY+wYwkMIqBJBBwh+juJ17Uv55UgZiEz huBv5PPxGUwFcc8yyBSAKjiQHACToM5IhZ2xdiezOMDqcDDA52b/PzJyJuAKkqAevkivpMAtOFRX kLRIAjojw+zgOa1RglN9gC8MhVkK3GW+EJbIWHU4fTHp9Fql0NIVgm9ydc9QEANoRZCWVHoCKYE1 hkfOZZ5amS0o5TZGcLUTtFTAzIFdNwZ4TXExU2ZnBdbcs7JV72ZHm6u29u8ywGsLsCW9huJyf+P+ 8CNHQDQKDnu7NqU1+z2dIkee/XBRNCpdGZl14bWWn+eaF9HoC5Y2TLRJKFaAxfBKQM+ZlLT0i0UD MOsVLAXPyioiKF6Yzf6aqduPSu0+rRArEB+VslYOOHs2koK9xGoTYAyyuv0ENfsRiOiM2N8rLfGV gJ6M1JeRoKmuKheIpPLCgA9Qwj5Caop5f0vWfGZmk6gOjaRPMADxk6KCaDn3oLzpM7MykpT0uoG/ FhQwG6UgEmHmB/KMq/j7ZpDAVFBtApoCRvhyF6WGh1mdVRBhdcFBAL8IAi5AxLBDBZSAaMwKI+AK LbFcyXs2/MIK5a4RwL+JcRFDI+BhH8Bq7jOZnYvS82PgWVHUE/nLwkcC/+Pf8X07/9hekyYxgjNc lVUglpqA5gMm0aAMRr8OKzlaXdARApJNJ4BvG/jvgoQ3QYJmArHWBHJmMBu7QFjTAk2mN1pj2BgZ gICkgL+FCqQvGAQB66NOEFWwiv57AsXS0FwN71BIAJrYRYBORLyBD0jEWQ4w1qwC2lLYiA0KjVHD QyAH0huwOkOD4gRR/tIJSvuPe02AqUDuuJiVHDwaBFwr2uPSB9yECq6wAjAHyHICt7c5ioVKaQqz siFBA3Eg5XFW91+M2v9VCYRGJRQuyghLFIDyzoXNKGNri0yj9AYx2pThL4bBJdHfbhNg8lkNAhZC gLZJqjVaY1rfbxQOz4r8Vle4e7S0IOINEnIhs7VNrlEIWJy9TU4Cn2vtfq8CNBKi0a+fXH6jpM98 BhsS+LKnElRLgEWClThpW2VZc0RKd1EKIlrZDTdPF9cea/cKs5XBKxnk4so3S7PaIwO6OH33+K6t 8+95u7y2VX7NVIR3A3mEiN/1gwn3CPhnEKB1fV7xkxlnzPZv+8lMjghNJTVNEefe+Y+mSvqJtc/8 kD+be/Xnf5gfTj7redF9Hp/Hy49/BBgApEegBA3kNcsAAAAASUVORK5CYII="
transform="translate(1,421)"
id="image161"
style="opacity:0.75">
</image>
<radialGradient
id="XMLID_62_"
cx="30.4263"
cy="450.18951"
r="16.5"
gradientUnits="userSpaceOnUse">
<stop
offset="0.5899"
style="stop-color:#231F20"
id="stop164" />
<stop
offset="0.6789"
style="stop-color:#403D3E"
id="stop166" />
<stop
offset="0.8716"
style="stop-color:#88888A"
id="stop168" />
<stop
offset="1"
style="stop-color:#BCBEC0"
id="stop170" />
</radialGradient>
<circle
cx="30.426001"
cy="450.189"
r="16.5"
id="circle172"
d="m 46.926001,450.189 c 0,9.11269 -7.387302,16.5 -16.5,16.5 -9.112699,0 -16.5,-7.38731 -16.5,-16.5 0,-9.1127 7.387301,-16.5 16.5,-16.5 9.112698,0 16.5,7.3873 16.5,16.5 z"
style="fill:url(#XMLID_62_)"
sodipodi:cx="30.426001"
sodipodi:cy="450.189"
sodipodi:rx="16.5"
sodipodi:ry="16.5" />
</g>
<g
id="g174">
<image
width="57"
height="56"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA4CAYAAABHRFAgAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQPSURB VHja7JoNb+MgDIaB0OzW7f//0tvWjwRulUCy3rONSei03TWSRZWuSZ69xjYmzj2Ox/FjDv9N7pF/ IqQ3nM9fBezveD1vuE9W4PJ3hPTGkQNpjbuOeAf1PIB5AZSCZEFJPwI03kG9mwUARFiEu1liYIeA xsGAgYzUNMhUzBPQNBJ0lJIc3ARjIL9BwBVGNxI0DpyHFG4q156IUUUR8GZL+W4l1x4CGne6KQdX AQ9lrEbVzARwKRYIqBsJGgcBBgJXAecyUliqJAW8ftpFSWkJALtA4wD3DABXAZ/KOBPQQAJMhbyA O2vFQN6iaNwRRTnACvWrQNaxwlN3rQoemDnrFEXRdZtFQ+wExCiKgE/FngtgHWcCUx+2qngWlLSA mlSNG9MEBpiZKHezYwE8EjVnBvLMKGn5Z2dmnm5Skt7QCvhc7KUAHkFNCnkFhYNQ41IXXkHNRABF 2GiMolbACvYKoBLkWZmTXgCmbhoIsKhqS0kOUgN8KfZKPiNkTfhVyWiYj1JhnyzBJxrSRehQsQK+ gpo9kK21Zy0JJyF3/qVmbKjIgVJIdFOEfGXmJIU8kHNOWaFkKN4Tcdfd0dUrkE/CfDyCy2qBJ5KA 48AN0VawROak19y2Z06iu2qB50gi7VFIIRGKg8zALFD61c9T+d5bcmtstENwESzNS5oj0ep3WAwE WJGsBKbWstQO5fwkrFO9lE6iIZp5ZkE8MQX5AUq7GWrXA9SuDgr1K1znAAX+ZFiI7yoGJNggLLUm 5qECUdIp32u/90IkVkHD/9BBjx1dbSmUS9FvZf7GwVLLEkETpI3U27qMCqBX4FZm0csFDKxLMYXg 318FWxhoqZXZhMxKRy0D3JUslW7B5cR0AyhgEmrXk2DnYhcFNguwucddqa1CmD9DiwMDhyPqc5Af n/bO2AeBpaDUlU1KTo0iwClNYq6JHJjoR71hIevIEwF8+7Tfxd6IISwqulpcdzLmSNfohktLoywk ewskAiJkvWZTzclQoG/dIMoMZHVxDvCtAXlpAOYttWtmiubVCOcYuLkxJyU3PQGg2U2tKQQf2HVA YttxVqLrOwGt0JagkwQ1u5T0UFCnTsikQGIA+lDm4cK4aXL6Jm5Xty6TKgV7Kj2QWkvyBO6JgWYV 8qNzG4oBzW099FRceVALpNZcvgCYFdCkYq+SWWjwLo20cTVsE1yIqpcOwGHbBE5YjEqgWCUtHRs+ UrJPzDQZvuEjqUpB1wZka+sODRXcBLh1f1IDzQKkdRN2HeWieyG1pRjCrm7bdvowwD2QXHrxjJrY MtRejEhCkt/9Ts/el5Xu9YrLMMARkNKqZevLSnhuN+AoSE3VVkftS147e7xAeIfr/hOvgm69R3aP 43E8jtvxR4ABAL1S3PlRWBIpAAAAAElFTkSuQmCC"
transform="translate(5,425)"
id="image176"
style="opacity:0.75">
</image>
<radialGradient
id="XMLID_63_"
cx="30.4268"
cy="450.1904"
r="12.8333"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop179" />
<stop
offset="1"
style="stop-color:#393939"
id="stop181" />
</radialGradient>
<path
d="m 39.948,446.879 h -6.209 v -6.209 c 0,-1.83 -1.483,-3.313 -3.313,-3.313 -1.828,0 -3.312,1.482 -3.312,3.313 v 6.209 h -6.21 c -1.829,0 -3.312,1.482 -3.312,3.313 0,1.828 1.482,3.311 3.312,3.311 h 6.21 v 6.211 c 0,1.828 1.483,3.311 3.312,3.311 1.829,0 3.313,-1.482 3.313,-3.311 v -6.211 h 6.209 c 1.829,0 3.313,-1.482 3.313,-3.311 -0.001,-1.831 -1.484,-3.313 -3.313,-3.313 z"
id="path183"
style="fill:url(#XMLID_63_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g185">
<g
id="g187">
<image
width="67"
height="67"
xlink:href="data:image/png;base64,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"
transform="translate(0,420)"
id="image189"
style="opacity:0.75">
</image>
<g
id="g191">
<g
id="g193">
<linearGradient
id="XMLID_64_"
gradientUnits="userSpaceOnUse"
x1="48.4263"
y1="450.18951"
x2="12.4263"
y2="450.18951">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop196" />
<stop
offset="1"
style="stop-color:#000000"
id="stop198" />
</linearGradient>
<path
d="m 30.426,432.189 c -9.941,0 -18,8.059 -18,18 0,9.941 8.059,18 18,18 9.941,0 18,-8.059 18,-18 0,-9.941 -8.058,-18 -18,-18 z m 0,33.838 c -8.746,0 -15.837,-7.092 -15.837,-15.838 0,-8.746 7.091,-15.836 15.837,-15.836 8.746,0 15.836,7.09 15.836,15.836 0,8.746 -7.09,15.838 -15.836,15.838 z"
id="path200"
style="fill:url(#XMLID_64_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g202">
<image
width="63"
height="64"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAABACAYAAACtK6/LAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAUoSURB VHja7FuLjts4DBRlpf//vRdbKgpsAJad4cNxdtPrGhDsTbK2hi+RQ7m17+PfPOSNnrn+b+Cfvf/6 28DLRc9ZrxaEvPBeAj6XAuD1akHIxfeQ5NleI6DR+WkhyAtA22sJhIBAr+BvJoxPAW+BV4e+h9Wk HRN81sz1KSHIE8Cthju47uA7Ac+1gGZwRsIoC0Au1HYnQ8y11b4HnA3721NuIE8Ct+A2ct2BABB4 C/wwZ30duUR4jBMmjzS9qbMdDLwQX0fA9RD1efu4ti4kGQGMoo8L0fRQYEdCAC0JXo9dCe8w9zgl gPEkcA12mMHAi7PUaXNGwHczl0P9/6z6/LgA+K9xA+CHcQcdI9BSZ7X/MPs9iBvNCECy2h9FX2fA b0oAN6N5FuiQ5vXYPgTQwX2Y2yAroAIYJ7TeFfgH6B8GvDZ5trZLkNdP9awdWA7L/sRJnUtmz0we af1mtN7BZL31WIilTSBAlhV2om2o/ZGszrLAb0DjerKTgGfpryTqAJb1hdofST9ngW4Q4F1J2y5h CyxNLC1+fLcRc0fZXyep7x/aHxdE+gECnARJC5qYvv8COYH+jgE/gKtQzW8O6O6Y+w8Q6IbRmF6y djIOkrOz2OPlBpnKL+XzQkx/I5mcXcqmWqPt0NpHy+hDkEspp4PfTfX7gyyrYsz9N9PP+jwSQAfA tUk+wN4/BtK2fs6mQCEr6E7OoedjTb8U7dkyx4oZcUz9bsauUlYdlbuqEWawEqDy2UujhSU7I8G6 sgeitdfm5Q8B/GfATxPxtSmvhBI8/sBLf5/K7dFEbPDxgtzd1OM6I5vBCjBBItQDpSC/LwW85mi+ Ac3basxG9x0A7eDvXfnwQTJGCQAza15VzTfvRmDtPciw0b4BKzgUcBYAI8uUiK3K1PMeFd0CQsLj 4HS0n+rscXY2dfUEcBmNVWlBreTI0NaMpT0zxz/8vrf3Oc5S0GlN26OfmFg0wWrjotrs8CytJNCR AL2IWVZyAj107a2VgDj+nmh4ZAVR8vlMcWCZk07qgA1EbBvhtwT1jZKqqKApFTasKYgisBWAgKID LVUow+uACbZ0WA9WF1TlUVeoaJ41EG3CsQBw/dsOcnut+RvhCDrRerQsrgyTswjflnlIM6b/0P4w 3+vMjWl+OAJoJJ1mmj/l80zLk/TMLEBGUHZVbnrghyFEbdk8HSaHKWdVAx5rHuo0dVPm3o32vSJl mu83QJFZk49aWqXG5XB8PXrYbsiDTnhzpHXk816jU0jleBA6jAU9l8BcTlA5VLDaVTPBBqNugpgQ k59OecqC3AQVY6T9MnW9HOrZNg9RqdlBDLA+u4IECXGCVTL0dMdmmeafKO3vCdaE0WAT1O8tICAQ O3QH4I+sySPq2qOLM1vOsu1uxAlWaLG7ukbgo0QnBN8csOw62jMniWpsERZ4N6AzwFuladESmpaE q0QZYiMTnCS27EDbd0KKpjmALJmxTN+7Od2Tx8RHq+3KWIml1QridKTPBDzLfswE8GkSoK35m5G8 NJqBP84GuWo9HwmAaayyJwdlkxrYDgQxnV7fZVvRIgHYMnW23Fa0DHi2JW0m/PySrWgsoE0z8W4m ntmEmGV+jwKzm+YAv3r7aRTworL1U7aftiDBqW48ZrmBV0pntpu+bONxxQquYGEjVuZLtpxnk6DK ywbLsYLW3uxlg4wQMjWANP+9mgjol71m8mw9UOnavO0LRtWe2dUdorcCf+X9/7qXCs8+c7Xv4/v4 lOOnAAMAme3iy7JhkzkAAAAASUVORK5CYII="
transform="translate(2,421)"
id="image204"
style="opacity:0.75">
</image>
<g
id="g206">
<g
id="g208">
<linearGradient
id="XMLID_65_"
gradientUnits="userSpaceOnUse"
x1="14.2183"
y1="450.1904"
x2="46.6353"
y2="450.1904">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop211" />
<stop
offset="1"
style="stop-color:#000000"
id="stop213" />
</linearGradient>
<path
d="m 30.426,433.982 c -8.951,0 -16.208,7.256 -16.208,16.207 0,8.951 7.257,16.209 16.208,16.209 8.951,0 16.209,-7.258 16.209,-16.209 0,-8.951 -7.258,-16.207 -16.209,-16.207 z m 0,30.469 c -7.876,0 -14.261,-6.385 -14.261,-14.262 0,-7.875 6.385,-14.262 14.261,-14.262 7.877,0 14.262,6.387 14.262,14.262 0,7.877 -6.385,14.262 -14.262,14.262 z"
id="path215"
style="fill:url(#XMLID_65_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</g>
<g
id="g217">
<g
id="g219">
<image
width="64"
height="64"
xlink:href="data:image/png;base64,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"
transform="translate(424,421)"
id="image221"
style="opacity:0.75">
</image>
<radialGradient
id="XMLID_66_"
cx="453.42581"
cy="450.18951"
r="16.5"
gradientUnits="userSpaceOnUse">
<stop
offset="0.5899"
style="stop-color:#231F20"
id="stop224" />
<stop
offset="0.6789"
style="stop-color:#403D3E"
id="stop226" />
<stop
offset="0.8716"
style="stop-color:#88888A"
id="stop228" />
<stop
offset="1"
style="stop-color:#BCBEC0"
id="stop230" />
</radialGradient>
<circle
cx="453.42599"
cy="450.189"
r="16.5"
id="circle232"
d="m 469.92599,450.189 c 0,9.11269 -7.3873,16.5 -16.5,16.5 -9.11269,0 -16.5,-7.38731 -16.5,-16.5 0,-9.1127 7.38731,-16.5 16.5,-16.5 9.1127,0 16.5,7.3873 16.5,16.5 z"
style="fill:url(#XMLID_66_)"
sodipodi:cx="453.42599"
sodipodi:cy="450.189"
sodipodi:rx="16.5"
sodipodi:ry="16.5" />
</g>
<g
id="g234">
<image
width="57"
height="56"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADkAAAA4CAYAAABHRFAgAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAQPSURB VHja7JoNb+MgDIaB0OzW7f//0tvWjwRulUCy3rONSei03TWSRZWuSZ69xjYmzj2Ox/FjDv9N7pF/ IqQ3nM9fBezveD1vuE9W4PJ3hPTGkQNpjbuOeAf1PIB5AZSCZEFJPwI03kG9mwUARFiEu1liYIeA xsGAgYzUNMhUzBPQNBJ0lJIc3ARjIL9BwBVGNxI0DpyHFG4q156IUUUR8GZL+W4l1x4CGne6KQdX AQ9lrEbVzARwKRYIqBsJGgcBBgJXAecyUliqJAW8ftpFSWkJALtA4wD3DABXAZ/KOBPQQAJMhbyA O2vFQN6iaNwRRTnACvWrQNaxwlN3rQoemDnrFEXRdZtFQ+wExCiKgE/FngtgHWcCUx+2qngWlLSA mlSNG9MEBpiZKHezYwE8EjVnBvLMKGn5Z2dmnm5Skt7QCvhc7KUAHkFNCnkFhYNQ41IXXkHNRABF 2GiMolbACvYKoBLkWZmTXgCmbhoIsKhqS0kOUgN8KfZKPiNkTfhVyWiYj1JhnyzBJxrSRehQsQK+ gpo9kK21Zy0JJyF3/qVmbKjIgVJIdFOEfGXmJIU8kHNOWaFkKN4Tcdfd0dUrkE/CfDyCy2qBJ5KA 48AN0VawROak19y2Z06iu2qB50gi7VFIIRGKg8zALFD61c9T+d5bcmtstENwESzNS5oj0ep3WAwE WJGsBKbWstQO5fwkrFO9lE6iIZp5ZkE8MQX5AUq7GWrXA9SuDgr1K1znAAX+ZFiI7yoGJNggLLUm 5qECUdIp32u/90IkVkHD/9BBjx1dbSmUS9FvZf7GwVLLEkETpI3U27qMCqBX4FZm0csFDKxLMYXg 318FWxhoqZXZhMxKRy0D3JUslW7B5cR0AyhgEmrXk2DnYhcFNguwucddqa1CmD9DiwMDhyPqc5Af n/bO2AeBpaDUlU1KTo0iwClNYq6JHJjoR71hIevIEwF8+7Tfxd6IISwqulpcdzLmSNfohktLoywk ewskAiJkvWZTzclQoG/dIMoMZHVxDvCtAXlpAOYttWtmiubVCOcYuLkxJyU3PQGg2U2tKQQf2HVA YttxVqLrOwGt0JagkwQ1u5T0UFCnTsikQGIA+lDm4cK4aXL6Jm5Xty6TKgV7Kj2QWkvyBO6JgWYV 8qNzG4oBzW099FRceVALpNZcvgCYFdCkYq+SWWjwLo20cTVsE1yIqpcOwGHbBE5YjEqgWCUtHRs+ UrJPzDQZvuEjqUpB1wZka+sODRXcBLh1f1IDzQKkdRN2HeWieyG1pRjCrm7bdvowwD2QXHrxjJrY MtRejEhCkt/9Ts/el5Xu9YrLMMARkNKqZevLSnhuN+AoSE3VVkftS147e7xAeIfr/hOvgm69R3aP 43E8jtvxR4ABAL1S3PlRWBIpAAAAAElFTkSuQmCC"
transform="translate(428,425)"
id="image236"
style="opacity:0.75">
</image>
<radialGradient
id="XMLID_67_"
cx="453.42679"
cy="450.1904"
r="12.833"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop239" />
<stop
offset="1"
style="stop-color:#393939"
id="stop241" />
</radialGradient>
<path
d="m 462.947,446.879 h -6.209 v -6.209 c 0,-1.83 -1.482,-3.313 -3.313,-3.313 -1.828,0 -3.311,1.482 -3.311,3.313 v 6.209 h -6.211 c -1.828,0 -3.311,1.482 -3.311,3.313 0,1.828 1.482,3.311 3.311,3.311 h 6.211 v 6.211 c 0,1.828 1.482,3.311 3.311,3.311 1.83,0 3.313,-1.482 3.313,-3.311 v -6.211 h 6.209 c 1.83,0 3.313,-1.482 3.313,-3.311 0,-1.831 -1.483,-3.313 -3.313,-3.313 z"
id="path243"
style="fill:url(#XMLID_67_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g245">
<g
id="g247">
<image
width="67"
height="67"
xlink:href="data:image/png;base64,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"
transform="translate(423,420)"
id="image249"
style="opacity:0.75">
</image>
<g
id="g251">
<g
id="g253">
<linearGradient
id="XMLID_68_"
gradientUnits="userSpaceOnUse"
x1="471.42581"
y1="450.18951"
x2="435.42581"
y2="450.18951">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop256" />
<stop
offset="1"
style="stop-color:#000000"
id="stop258" />
</linearGradient>
<path
d="m 453.426,432.189 c -9.941,0 -18,8.059 -18,18 0,9.941 8.059,18 18,18 9.941,0 18,-8.059 18,-18 0,-9.941 -8.059,-18 -18,-18 z m 0,33.838 c -8.746,0 -15.836,-7.092 -15.836,-15.838 0,-8.746 7.09,-15.836 15.836,-15.836 8.746,0 15.836,7.09 15.836,15.836 0,8.746 -7.09,15.838 -15.836,15.838 z"
id="path260"
style="fill:url(#XMLID_68_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g262">
<image
width="63"
height="64"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAD8AAABACAYAAACtK6/LAAAACXBIWXMAAAsSAAALEgHS3X78AAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAUoSURB VHja7FuLjts4DBRlpf//vRdbKgpsAJad4cNxdtPrGhDsTbK2hi+RQ7m17+PfPOSNnrn+b+Cfvf/6 28DLRc9ZrxaEvPBeAj6XAuD1akHIxfeQ5NleI6DR+WkhyAtA22sJhIBAr+BvJoxPAW+BV4e+h9Wk HRN81sz1KSHIE8Cthju47uA7Ac+1gGZwRsIoC0Au1HYnQ8y11b4HnA3721NuIE8Ct+A2ct2BABB4 C/wwZ30duUR4jBMmjzS9qbMdDLwQX0fA9RD1efu4ti4kGQGMoo8L0fRQYEdCAC0JXo9dCe8w9zgl gPEkcA12mMHAi7PUaXNGwHczl0P9/6z6/LgA+K9xA+CHcQcdI9BSZ7X/MPs9iBvNCECy2h9FX2fA b0oAN6N5FuiQ5vXYPgTQwX2Y2yAroAIYJ7TeFfgH6B8GvDZ5trZLkNdP9awdWA7L/sRJnUtmz0we af1mtN7BZL31WIilTSBAlhV2om2o/ZGszrLAb0DjerKTgGfpryTqAJb1hdofST9ngW4Q4F1J2y5h CyxNLC1+fLcRc0fZXyep7x/aHxdE+gECnARJC5qYvv8COYH+jgE/gKtQzW8O6O6Y+w8Q6IbRmF6y djIOkrOz2OPlBpnKL+XzQkx/I5mcXcqmWqPt0NpHy+hDkEspp4PfTfX7gyyrYsz9N9PP+jwSQAfA tUk+wN4/BtK2fs6mQCEr6E7OoedjTb8U7dkyx4oZcUz9bsauUlYdlbuqEWawEqDy2UujhSU7I8G6 sgeitdfm5Q8B/GfATxPxtSmvhBI8/sBLf5/K7dFEbPDxgtzd1OM6I5vBCjBBItQDpSC/LwW85mi+ Ac3basxG9x0A7eDvXfnwQTJGCQAza15VzTfvRmDtPciw0b4BKzgUcBYAI8uUiK3K1PMeFd0CQsLj 4HS0n+rscXY2dfUEcBmNVWlBreTI0NaMpT0zxz/8vrf3Oc5S0GlN26OfmFg0wWrjotrs8CytJNCR AL2IWVZyAj107a2VgDj+nmh4ZAVR8vlMcWCZk07qgA1EbBvhtwT1jZKqqKApFTasKYgisBWAgKID LVUow+uACbZ0WA9WF1TlUVeoaJ41EG3CsQBw/dsOcnut+RvhCDrRerQsrgyTswjflnlIM6b/0P4w 3+vMjWl+OAJoJJ1mmj/l80zLk/TMLEBGUHZVbnrghyFEbdk8HSaHKWdVAx5rHuo0dVPm3o32vSJl mu83QJFZk49aWqXG5XB8PXrYbsiDTnhzpHXk816jU0jleBA6jAU9l8BcTlA5VLDaVTPBBqNugpgQ k59OecqC3AQVY6T9MnW9HOrZNg9RqdlBDLA+u4IECXGCVTL0dMdmmeafKO3vCdaE0WAT1O8tICAQ O3QH4I+sySPq2qOLM1vOsu1uxAlWaLG7ukbgo0QnBN8csOw62jMniWpsERZ4N6AzwFuladESmpaE q0QZYiMTnCS27EDbd0KKpjmALJmxTN+7Od2Tx8RHq+3KWIml1QridKTPBDzLfswE8GkSoK35m5G8 NJqBP84GuWo9HwmAaayyJwdlkxrYDgQxnV7fZVvRIgHYMnW23Fa0DHi2JW0m/PySrWgsoE0z8W4m ntmEmGV+jwKzm+YAv3r7aRTworL1U7aftiDBqW48ZrmBV0pntpu+bONxxQquYGEjVuZLtpxnk6DK ywbLsYLW3uxlg4wQMjWANP+9mgjol71m8mw9UOnavO0LRtWe2dUdorcCf+X9/7qXCs8+c7Xv4/v4 lOOnAAMAme3iy7JhkzkAAAAASUVORK5CYII="
transform="translate(425,421)"
id="image264"
style="opacity:0.75">
</image>
<g
id="g266">
<g
id="g268">
<linearGradient
id="XMLID_69_"
gradientUnits="userSpaceOnUse"
x1="437.21881"
y1="450.1904"
x2="469.6348"
y2="450.1904">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop271" />
<stop
offset="1"
style="stop-color:#000000"
id="stop273" />
</linearGradient>
<path
d="m 453.426,433.982 c -8.951,0 -16.207,7.256 -16.207,16.207 0,8.951 7.256,16.209 16.207,16.209 8.951,0 16.209,-7.258 16.209,-16.209 0,-8.951 -7.258,-16.207 -16.209,-16.207 z m 0,30.469 c -7.875,0 -14.26,-6.385 -14.26,-14.262 0,-7.875 6.385,-14.262 14.26,-14.262 7.877,0 14.262,6.387 14.262,14.262 0,7.877 -6.385,14.262 -14.262,14.262 z"
id="path275"
style="fill:url(#XMLID_69_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</g>
</g>
<g
id="g277">
<radialGradient
id="XMLID_70_"
cx="242"
cy="241"
r="5.9590001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop280" />
<stop
offset="0.1303"
style="stop-color:#FBFBFB"
id="stop282" />
<stop
offset="0.2725"
style="stop-color:#EDEDED"
id="stop284" />
<stop
offset="0.4204"
style="stop-color:#D8D8D8"
id="stop286" />
<stop
offset="0.5722"
style="stop-color:#B9B9B9"
id="stop288" />
<stop
offset="0.727"
style="stop-color:#929292"
id="stop290" />
<stop
offset="0.8821"
style="stop-color:#626262"
id="stop292" />
<stop
offset="1"
style="stop-color:#393939"
id="stop294" />
</radialGradient>
<circle
cx="242"
cy="241"
r="5.9590001"
id="circle296"
d="m 247.959,241 c 0,3.29106 -2.66794,5.959 -5.959,5.959 -3.29106,0 -5.959,-2.66794 -5.959,-5.959 0,-3.29106 2.66794,-5.959 5.959,-5.959 3.29106,0 5.959,2.66794 5.959,5.959 z"
style="fill:url(#XMLID_70_)"
sodipodi:cx="242"
sodipodi:cy="241"
sodipodi:rx="5.9590001"
sodipodi:ry="5.9590001" />
<g
id="g298">
<g
id="g300">
<linearGradient
id="XMLID_71_"
gradientUnits="userSpaceOnUse"
x1="248.5"
y1="241.0005"
x2="235.5005"
y2="241.0005">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop303" />
<stop
offset="1"
style="stop-color:#000000"
id="stop305" />
</linearGradient>
<path
d="m 242,234.5 c -3.59,0 -6.5,2.91 -6.5,6.5 0,3.59 2.91,6.5 6.5,6.5 3.59,0 6.5,-2.91 6.5,-6.5 0,-3.59 -2.91,-6.5 -6.5,-6.5 z m 0,12.219 c -3.158,0 -5.719,-2.561 -5.719,-5.719 0,-3.158 2.561,-5.718 5.719,-5.718 3.158,0 5.719,2.56 5.719,5.718 0,3.158 -2.561,5.719 -5.719,5.719 z"
id="path307"
style="fill:url(#XMLID_71_)"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g309">
<g
id="g311">
<linearGradient
id="XMLID_72_"
gradientUnits="userSpaceOnUse"
x1="236.1465"
y1="241"
x2="247.8535"
y2="241">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop314" />
<stop
offset="1"
style="stop-color:#000000"
id="stop316" />
</linearGradient>
<path
d="m 242,235.147 c -3.232,0 -5.854,2.621 -5.854,5.853 0,3.232 2.621,5.854 5.854,5.854 3.233,0 5.854,-2.621 5.854,-5.854 0,-3.233 -2.622,-5.853 -5.854,-5.853 z m 0,11.003 c -2.845,0 -5.15,-2.307 -5.15,-5.15 0,-2.844 2.305,-5.15 5.15,-5.15 2.845,0 5.15,2.306 5.15,5.15 0,2.844 -2.305,5.15 -5.15,5.15 z"
id="path318"
style="fill:url(#XMLID_72_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<text
transform="translate(225.9526,245.5713)"
font-size="14"
id="text320"
style="font-size:14px;fill:#ffffff;font-family:ArialRoundedMTBold">50 %</text>
<text
transform="translate(225.9526,245.5713)"
font-size="14"
id="text322"
style="font-size:14px;fill:#ffffff;font-family:ArialRoundedMTBold">75 %</text>
<radialGradient
id="XMLID_73_"
cx="242"
cy="241"
r="196.6895"
gradientUnits="userSpaceOnUse">
<stop
offset="0.0381"
style="stop-color:#FFFFFF"
id="stop325" />
<stop
offset="0.4259"
style="stop-color:#979797"
id="stop327" />
<stop
offset="1"
style="stop-color:#000000"
id="stop329" />
</radialGradient>
<circle
cx="242"
cy="240.99899"
r="196.689"
id="circle331"
d="m 438.689,240.99899 c 0,108.62834 -88.06067,196.689 -196.689,196.689 -108.62833,0 -196.688995,-88.06066 -196.688995,-196.689 0,-108.62833 88.060665,-196.688992 196.688995,-196.688992 108.62833,0 196.689,88.060662 196.689,196.688992 z"
style="fill:url(#XMLID_73_)"
sodipodi:cx="242"
sodipodi:cy="240.99899"
sodipodi:rx="196.689"
sodipodi:ry="196.689" />
<g
id="g333">
<g
id="g335">
<linearGradient
id="XMLID_74_"
gradientUnits="userSpaceOnUse"
x1="87.023399"
y1="395.97659"
x2="396.97711"
y2="86.022903">
<stop
offset="0"
style="stop-color:#231F20"
id="stop338" />
<stop
offset="0.3491"
style="stop-color:#84858E"
id="stop340" />
<stop
offset="0.4719"
style="stop-color:#A7AAB6"
id="stop342" />
<stop
offset="1"
style="stop-color:#231F20"
id="stop344" />
</linearGradient>
<path
d="m 241.999,21.829 c -121.044,0 -219.168,98.124 -219.168,219.169 0,121.046 98.124,219.173 219.168,219.173 121.045,0 219.17,-98.127 219.17,-219.173 0,-121.045 -98.125,-219.169 -219.17,-219.169 z m 0,411.999 c -106.496,0 -192.829,-86.332 -192.829,-192.83 0,-106.496 86.333,-192.829 192.829,-192.829 106.497,0 192.828,86.333 192.828,192.829 0,106.498 -86.331,192.83 -192.828,192.83 z"
id="path346"
style="fill:url(#XMLID_74_)"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g348"
style="opacity:0.76999996">
<g
id="g350">
<g
id="g352">
<image
width="420"
height="34"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAacAAAAkCAYAAAAtvPVaAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAMwSURB VHja7N2BitswDIBhOcne/4GX2uOgYUKVErm5Y7P7fxDa5npdYdAfJb5UBAAAAAAAAMBgyn/2OgCA sbV/GZVCqAAAiSC9Faty47kl8VqECgA+J0it8/HtOBXnfnSbDRcAYI4wteRtOlCl4zn61t4vzn7i BADzx0kHyN5vzv5UoEry5zY8i9q3ECgA+PiJyW412J8K1NYRpmKCpLezSBEmAJgzUlGQ6vNz3+7T v1/OArV1hkkHaXUipUMlQagAAOPHyQvT1/ZQ949IHWFKB2pLvhEvTJu6vzrBEqYoAJhuWpJgWnqo OOnNqpI457R1TE3FhGlT91ezHXFagsmJQAHAeFHSj6szMR3bLv4ahGb2h9PT1eTkHdJbTaA2Eys9 PUXnoAgUAIwbpxaEaXfC5J2fKsFrX8bJW523BIH69dx0oBYnUEQJAOaIlDc17eozPwqZHlZunXOK DuutzgRlA+Wt4CNOADB2mOwKvEcQpeoMNl6guianO6FanelJiBMATBMnPTXp0Bz7VvFP7aQ//zcn QFGUokB5WzQ5ESYAGDtSLZikvNM52RXbL1PU5vzDJXgz9o1dbd7rNf5vAWCKOLWTPtyZzNw49b6p arbHM0bHMUj9RjmsBwBjh8m2QC8fty24unzRqS3xZtpJmPR6dpHXVRn2ihHECQDGDZPI64KIKn+X kO9BrKr4562646SnHS9I+riiOGGKrrcnRAoAhg2T/ayvTqB+m0hFU9StySmaoPQhPPvHVlVyqzSI EwCMG6fo6hBRlKIJ6q04NROd43ySV9Cv/fbaenq6Ik4AMEecRM4vX/RQ09NuwpSanrbgjRSJ17Vr dk27XkIuwoVfAWDGSGUu/Krvd3+vU89hversW8Q/D1VO4gQAGD9UV6u37WII77BeqCR+Fl2dvMj5 lw0KExMAfMwE1YIQVXnj23C/42vae/4SmEABwBxhEsldoKE6z5OrCSoTi3IRqhI8hygBwGdMT1Go oiBdHtrLRqNcxEqEQ3gAQKjOb1Nh6o1I6XxMqADgM6IU7WuJ3/nWcJQfeE0AwDyh6g7ST4SEIAEA 3o4RAAAAAAAAgOH9EWAAFB+kItkjc+0AAAAASUVORK5CYII="
transform="matrix(1.02,0,0,1.02,35.0356,231.8022)"
id="image354"
style="opacity:0.75">
</image>
<path
d="m 43.449,243.666 c 0,0.154 1.229,0.28 2.747,0.28 h 391.196 c 1.517,0 2.746,-0.126 2.746,-0.28 v -3.292 H 43.449 v 3.292 z"
id="path356"
inkscape:connector-curvature="0" />
</g>
<g
id="g358">
<image
width="420"
height="35"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAacAAAAkCAYAAAAtvPVaAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAANrSURB VHja7N3dbqMwEEDhMXj7/u8bfvYGq5Opx4zJVhuc80koiWi77E2OJjEgAgAAAAAAAOBm0pv8DQDA GPb/FadEqAAAwSBdilV64Wd7XwMAxg7S3tjfFal04edS8JFAAcBnBCr6GI5U6tiv4+NtXqQAAGPH aXde232hQEW/P/JiNB1bK1KECgDGC1IrQmXbjs0LmCsHp6takOym99spi0gBwNhh2o7HVT0vDdhV pETt23vjVPsIT4doNo/2eWuKAgDcP1A2SmVKWlWg1uP9v4QpHKgcnJhsmPLxqLfsTFIECgDGDFMt SmVbjvf91bz/bxL4zik3piYbqcmEqLbpiar2PZQQKgC4ZZCkEib9Md6iorQ0hpNdvXanpxyYmuzk VEL059js89mZoAAA40xOm9pKmB7yc92BHPvL7yQTp/Dk5EXKTk4lSF/quQ6UXc3HxAQA44SpTE2r CdMk9Y/x9mPfpqalS985nQVqVnH6qsRplvp3T/ZvAwDeO0j2tZ2aFhMlPVnNlakpSedqvda5TXbp +FyZpL7k+2M/XdCJOAHAEHGyiyBslHZ5XiDhnQtrW7D3Tk6tUM2NTS+MmAgRAAwRqk2eP54TMyW1 zn9N0ekp/8J/IDUqSaAA4J5h0t8TiZxfyu6l9/3ccWDRTV+uQqS9Yo9YAcD7T0u1FuiTbfV7v3ed vbO/3YyTXX9+FiB9stWkyrpLbDk5cQKA+8VpMx14yPN5TjZc3kVg3evs5eDB2YPRB1RbobGKf6UI AMC9Y+Wd4/QwodKRsleGePnCr/bA7CqMpRInuxCCyxgBwBhhqq3IKxNTCdPihKl2+4xLcdorB2Jj o/fpK0QkJicAGHZy8gK1VCaorXd6yicHoONTArMGwjSrKYnr6wHA/YPkDS3eRV/1Vn4mPD1l50BS 5UC2ys+Vf3CW70URZRPhIz0AGDFUXqBqk9QqP9ctnN50MAdr6YVJL36onXBLmADgcwJlQ7WZOIW/ c4rcpr11a3bv/k3cCRcAxg2TjZN348G98hi6VXvuPBiR59vvbtK+bhJhAoCxAyWNSEXOceqenLy4 nE1IBAkAPitUtatBnAXppTidRar1CAD43EjJlShdmWxS52tCBQCfEaWrr/9JnCK/Q4wAgFD17Pu1 mBAkAMBLMQIAAAAA9PorwAAKdbgZEEjcdAAAAABJRU5ErkJggg=="
transform="matrix(1.02,0,0,1.02,35.0356,227.7222)"
id="image360"
style="opacity:0.75">
</image>
<path
d="m 43.449,237.082 v 3.292 h 396.689 v -3.292 c 0,-0.155 -1.229,-0.28 -2.746,-0.28 H 46.196 c -1.517,-0.001 -2.747,0.125 -2.747,0.28 z"
id="path362"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g364">
<g
id="g366">
<image
width="35"
height="420"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAGoCAYAAAAuBUePAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAPLSURB VHja7NcNb9wgDIBhTNL9//+7AFMlqDzXEOCadapeJJQrl4/nbENoCDTaa00eukf5l6Cda8oTN5eN a8sqTDYw0jl6Dy2DsS1QDzJCFedYBsAtkAy6Ps8ibL9FyQYmmqOXMt3zBO6jnQsYDdFdnJRldZR6 zDM1dE4WdOtHRRwOyoLeezLfZZNescBzITqtnxV0KJiom1tMMlgZzbhzMjrRIE7VG1RHIal+majY +vkrSudEmizq/Zq32k8TpRahS0F0ccf6OXnpWo1QVFF5MygLOkxt6VRmde5tDXkLYTQpa6Bftbco 6dkUTZ209LV75VcjZFOmUW8G5M2sq56TOmvXB262hqKJlE7bLwUqTu2kev5lZqSsTvvRTPPqSEy6 kqqnQ6Fl9IY4J9MlTi1p2GFqI9fvkrNWee/BsrJShwHqVMeoXg/ZWTi9VX3r1THC2foKzsvXLpxb KZvZdthCF1NHdkcQnWXlU1HHxaj0ojO7G7jdocbNdM3skWRyy7u1/egde7NGViOzk7Ler1yJwJen LHRmiwz+EVhqr4Bmf708DZLwYIsPREa+G/TfRQgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ IECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECA AAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAEC BAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQIECAAAECBAgQ IECAAAECBAgQIECAAAECBAgQIECAAAECBAjQjwCVm78fB5Unz/9RKStPpO5cfLj30GK+LwNc+QpQ cY5eD4PxaVTcSJPXszmOYF+WMguwPThjHnILVCYi8t5T7aLG21i+iZgLXI1QVg9LN6AebDtlozTp B171/Ia6JlBlBVTqzT1YNpDf9dysQKmOXwbkzchPs+5cmE3JwbRZejig1lMHFnZqyCtijWnRsaBL RelaSds5SFdxprKOkAbMgEYFXnYilGpULoP2QElhrpXZtrIOZTOr2lhU6dPpvQwsfcU6pDFi1hwN EmdcRyo5K7jbjs64mM9ixkaFnztrkMUsTXv7wNxZm5KKkD3fzs7thVHPNn1hdurKi15vF5Bn1iG5 iY6YtEWDuAN5uOG+aBYUBghZ3C2EV0AeKmyAwgxmFjSC3YGmITugV64pT9585h4l0Gjf1P4IMACC CdEE2qwKSwAAAABJRU5ErkJggg=="
transform="matrix(1.02,0,0,1.02,232.916,32.9019)"
id="image368"
style="opacity:0.75">
</image>
<path
d="m 245.084,438.72 c 0.155,0 0.28,-1.229 0.28,-2.746 V 44.776 c 0,-1.517 -0.125,-2.746 -0.28,-2.746 h -3.293 v 396.69 h 3.293 z"
id="path370"
inkscape:connector-curvature="0" />
</g>
<g
id="g372">
<image
width="34"
height="420"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAGoCAYAAAAuBUePAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAOiSURB VHja7NftjuMgDIVhTNn7v+BtYFUpkSyPATudzs6PFwllmo/m0bFJM6UwGL9jyP/8ouw141NfLolr x12Y3MBIEjQyKElg9HaFsoBh9i9RLYGxf9t9w0F4WFmhJIGxs25AqzlNqiUxVW2rScnDdLUNJdUS TV0nU9SXW4goTI80ddsgbDqv+Tjn9bcHOtTWplKyJZNFMo/zmoeaHqhOymST+lK2tklHoy5MM6hq QP3cZ9PpzuNi3Fn2s5Qs6rrpYVLr6trtsm9vYP4olAY9TTm6QnWD3YJk0di6oVcgXZZ+Hj+ch2nx +qglV5iXkgXp3jicR0RZpRTtIZuQbfBqlvs1bePL7vezBX5OdqiH07C6byRarmhTr57UGncl1BdP 87JLqQV/NuwXVPO7Jmp/qDRZkGweA15i+iltsWFkS+B3ryGi+kgCkPQqk8A7kffmuOsZeTchCb4v rfaH39/rD/87Jd8NkklPrVZkarXVD6Zxa9QPlej2s6iWXzYAAQIECBAgQIAAAQIECBAgQIAAAQIE CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAg QIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAA AQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIE CBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQIECBAgQIAAAQI0GeOckXPGTyfk3XT8ZEJjc+PovrdA 45vKGPqud3toBGYqqXrjxtfnfk4L6JNrQ7CWiNa74fW5TFB9Uc6RAc2W8DDpdAM6zP5VCcsd0HDS 0fMFEHX8cM7ZlXALGuomZZLOcc56nnul9Nr3VOf0TULjTkIe5LrxBa/qnOc59bk9WrYW7Btbpqda oX0DsqVblq1NyuXhvHQ80Ov430RCI1oyLyGLeR17qM8afDgpjTtNbVFdNe61qmw6+nM3sNlqu/Vg 9Jpap1MNcJgV5pUs1UO2j4ZJyZZzBRqqdF5jp5e991AswYT65Gfm7R4qBmP31UlyM9h2SOCYqFnN VhxQcdLpkzeGFGiGEgcji8UwopgIqDg3lUk6q/eoEsFEQfY8L5nVe3fqrTEK8s6VwGJIv+xnQHev eevfortDCoPxS8Y/AQYAJhapOpCAmu4AAAAASUVORK5CYII="
transform="matrix(1.02,0,0,1.02,229.856,32.9019)"
id="image374"
style="opacity:0.75">
</image>
<path
d="m 238.5,438.72 h 3.291 V 42.03 H 238.5 c -0.153,0 -0.279,1.229 -0.279,2.746 v 391.197 c 0,1.518 0.126,2.747 0.279,2.747 z"
id="path376"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g378">
<g
id="g380">
<image
width="43"
height="43"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAALfSURB VHja7JnrcuMgDIUBE6ft+z/rbnxD28zAztkzkgHbbfdHmNHkUsd8OTlIgjr3Gq/xbcPnuPymP3Ef +Qlgf+BechbenwT1O+9ZYFJ57zJgC9STX70BK5XnTeDxICxGMMA14BJJgZP8WTmrMCsXCDQQdIDr WckEjwlei6L8JQoHIwZ67RV1n3AbgG75uvK6SenYYQUGxIgEjdZARdcMWmA3uH9q8XJstALDRoob QA8EnAByzbEYfkdvqyq3KIzeHAhypEdUmoEXCM06aAfTGrExK7C6T7h7Br1DFOgAkyVQdfqMmWDF WHiuV2G/o/CY4/0z3nIgNAMvGTSCZUTJGKmW2losEXYUfsvQHwA95mvKxFuGncAujiCLx4Oi9D9f IFYWG8ZgAH9AFOgBJl9B3XLvjRZiufdGczZbosXDo6Lye34PFV7BJg4sUnzNKTHR3HJ1lmDoOyw8 AQUFIOccg5K/3RGFW8BZ7VFZeAlgi5dvVHSC0o+4o4XDCq3iRfoF8OeNSnUMSjm3oP+qHQ5ue7xS Ca1GaK+z6x6x83oxWkUtuI8QpUPr3nXETjgx8udKfYLAosOSvFJKs1pMsbZRsUNZBl0hx2JhECWt PfLfS2le4PPbjvLdltCUxdQ0Uf9QABn4ed3vDP4gaFTb2jpVgYV6AbZAAX5Ab+DgywxUmou6vwxo zf/NzQ/CcpOCQLPSGyxgDQReFJUnskaq+LjLEuzd2WghtY4MPzMR8NzgY+nJEo72Yz5P4Am2qHij XYcovp+VxWf5uNvD2ibSK9kDrWLtOFZKcZzqUs0OrZbgDaKrAAeqoFoqXBVlU8t2v2YJr1jDKcoN ZIWgfKmNMs3W490ehfGnDVR2ESaQurzN184mUmt2OHPy440Gx2psrGOqvZIsZw8DfWPbqR0ISqU3 kZ6TzN4Wzxv7Plc5vaydYDZ3bV9xPmwp3HJO/N+fwMvZSb/jXw/iXuM1rht/BBgATenS1pVPKE4A AAAASUVORK5CYII="
transform="matrix(1.02,0,0,1.02,226.7959,225.6821)"
id="image382"
style="opacity:0.75">
</image>
<path
d="m 247.875,240.374 c 0,3.359 -2.725,6.083 -6.084,6.083 -3.357,0 -6.077,-2.724 -6.077,-6.083 0,-3.359 2.72,-6.079 6.077,-6.079 3.359,-10e-4 6.084,2.72 6.084,6.079 z"
id="path384"
inkscape:connector-curvature="0" />
</g>
<g
id="g386">
<image
width="44"
height="44"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAC0AAAAtCAYAAAA6GuKaAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAJkSURB VHja7JmBboMwDETjkP//4iWeJhXJu50dh7TdNBEpAiqgD3OxL6GUu93tfzV54z31r0DvXK/v/lPZ uI/uwsvG+Zl9BqcOsL4CmoEJ7Hv3RDh1HiQF3haBERZ7BK2wz2QiGfi2AVxhi/AM+qsPOF6WSLsA XAGYwReIGkIPAz+ciOuuPBDY6160FSD745wTeAm8JaPMgA/YeuAswvIAt21kU2FGHkLAD9IRvDjQ PRi4A2BptFsyvXnAzWxZtNXAMGCW8mQW7ZaIcnGk0UzHaCPYCY1vAtNgJQ/yI9otWaJRIizaFtyD tm/ADs5qfpNZzr6q6UrkwaBtBLujc9wKie63453sgRo/wYVAazAwT9kMEqQlTUcSqUH687LHMPsH 6HuW4y9XxBk8VsTqZIBKBmRkAeSKpotjiCKzJInBHBktISn3G3j9hemd7Pr6K9DqGCHPJ0fnM+s6 nZa1JORKH06e9mzpygOkoDVhL23hQBnYa7op5YNYVM3OH1sAm/HD3UjsTGdKsscJ7YHPJgfpSGtQ DDop15iH0Xae132YB+iJaJeM99DAxA/i2Ow51dG0lQdCd0cql1yeOvO7Hvhlz+XZaztEfAQD9PJ0 C7NCJJ8Z9CBRttFODcbZQMTXNEgxUOIlInl1gB9BtLcmtkrmcQrWEz2It3wwgpQ3MksKM00zw8LA M7NxLDLe4Juuf2RqfmSUqrNfgilVtjo+Zd3DGyBo2GUyYCNIfVaks4uP4pynjr5ni5EvXerNrJqW 5EqprkI8Y0FdFiR2eXH9ePOnC03+9rJvJjv3edpHo7vdDdqnAAMABfWZSb34uVMAAAAASUVORK5C YII="
transform="matrix(1.02,0,0,1.02,226.7959,224.6621)"
id="image388"
style="opacity:0.75">
</image>
<g
id="g390">
<g
id="g392">
<path
d="m 241.791,233.741 c -3.662,0 -6.63,2.97 -6.63,6.632 0,3.664 2.968,6.635 6.63,6.635 3.665,0 6.636,-2.972 6.636,-6.635 0,-3.662 -2.971,-6.632 -6.636,-6.632 z m 0,12.47 c -3.221,0 -5.833,-2.613 -5.833,-5.837 0,-3.224 2.612,-5.835 5.833,-5.835 3.224,0 5.839,2.612 5.839,5.835 0,3.224 -2.615,5.837 -5.839,5.837 z"
id="path394"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
<g
id="g396">
<image
width="43"
height="43"
xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACwAAAAsCAYAAAAehFoBAAAACXBIWXMAAArrAAAK6wGCiw1aAAAA BGdBTUEAAK/INwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUgSW1hZ2VSZWFkeXHJZTwAAAIvSURB VHja7JnhbsMgDIRxwvs/ccH7s0reyWdskraaVCSUpmnpx83YB2vt277tfzf5wDj6SWBJvK93gssN oJIYU4N7fSWwByqFsZRc0+ByAVbgNQNHKCWvU9C9COtBHgRYHDgFUJyYrKD7JuxhrgdMIAKecFXn LxBC9yIsgh7wHkKjuvO3C8Cnle7FGEbYk8B7wNP0YaBbBbon1WWgp+leeHjqPmEH/N68Y9GJ0y10 D6CtWggrRFFZqdyT6c6DPQG6OyqjunYyXtZYpre+GbtW4Q5KP59bpYZZbC1IdWKubSeGWd5lKj+7 /e5T2eGECca4OGHw576icKQyQtsftrBexhDS02lNNsFPAqwkxQ2SWVxlr2QJIdWO5eJpYKNCk4Ku FI5VbONkmqmOWdhlO15o/qVo9FNtR2EvZ0ZuTAMDX/bDPQmoxMtOsuIb5FL8nC4KR6vkYUzczBPM AFgXwAx8We16MRQ8I2Mrm5oFJlDpsDPwsJ0XtkPR6sZJYX/AdTjwt8QwOi5mIw/n+yMBqas47gEk M+FioL3nWDg8tR+J0NiKYVZW2W5iOG6twfNZCIVSaVbHu84gZCYpzWyLNGASmll82Ri2NX0SYGZk NICeZCfdroSE55omgbE+gu0sJsCnU1qllmfMjgSVzjubwPvUFmnnqGqVl6PjKk2UZX3FYSCDj8bU xflaygDtHLdGJ5gZ4LedXu743VaAf9u/DHbHeOsJ/M542r7t2+5vPwIMAJsLejqxHbqBAAAAAElF TkSuQmCC"
transform="matrix(1.02,0,0,1.02,226.7959,225.6821)"
id="image398"
style="opacity:0.75">
</image>
<g
id="g400">
<g
id="g402">
<path
d="m 241.791,234.402 c -3.297,0 -5.971,2.672 -5.971,5.972 0,3.3 2.674,5.975 5.971,5.975 3.3,0 5.977,-2.676 5.977,-5.975 0,-3.299 -2.677,-5.972 -5.977,-5.972 z m 0,11.229 c -2.901,0 -5.252,-2.354 -5.252,-5.257 0,-2.904 2.351,-5.254 5.252,-5.254 2.904,0 5.258,2.351 5.258,5.254 0,2.902 -2.354,5.257 -5.258,5.257 z"
id="path404"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</g>
<g
id="g406">
<g
id="g408">
<path
d="m 43.525,244.19 c 0,0.154 1.229,0.28 2.747,0.28 h 391.19 c 1.517,0 2.746,-0.126 2.746,-0.28 V 240.9 H 43.525 v 3.29 z"
id="path410"
inkscape:connector-curvature="0"
style="fill:#808284" />
<path
d="m 43.525,237.61 v 3.29 h 396.683 v -3.29 c 0,-0.154 -1.229,-0.28 -2.746,-0.28 H 46.272 c -1.518,10e-4 -2.747,0.126 -2.747,0.28 z"
id="path412"
inkscape:connector-curvature="0"
style="fill:#e0e1e2" />
</g>
<g
id="g414">
<path
d="m 245.156,439.242 c 0.155,0 0.28,-1.229 0.28,-2.747 V 45.306 c 0,-1.517 -0.125,-2.746 -0.28,-2.746 h -3.29 v 396.683 h 3.29 z"
id="path416"
inkscape:connector-curvature="0"
style="fill:#808284" />
<path
d="m 238.577,439.242 h 3.29 V 42.56 h -3.29 c -0.154,0 -0.28,1.229 -0.28,2.746 v 391.189 c -0.001,1.518 0.125,2.747 0.28,2.747 z"
id="path418"
inkscape:connector-curvature="0"
style="fill:#e0e1e2" />
</g>
<g
id="g420">
<radialGradient
id="XMLID_75_"
cx="241.8672"
cy="240.90041"
r="6.0776"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop423" />
<stop
offset="0.1303"
style="stop-color:#FBFBFB"
id="stop425" />
<stop
offset="0.2725"
style="stop-color:#EDEDED"
id="stop427" />
<stop
offset="0.4204"
style="stop-color:#D8D8D8"
id="stop429" />
<stop
offset="0.5722"
style="stop-color:#B9B9B9"
id="stop431" />
<stop
offset="0.727"
style="stop-color:#929292"
id="stop433" />
<stop
offset="0.8821"
style="stop-color:#626262"
id="stop435" />
<stop
offset="1"
style="stop-color:#393939"
id="stop437" />
</radialGradient>
<circle
cx="241.867"
cy="240.89999"
r="6.0770001"
id="circle439"
d="m 247.944,240.89999 c 0,3.35624 -2.72076,6.077 -6.077,6.077 -3.35623,0 -6.077,-2.72076 -6.077,-6.077 0,-3.35623 2.72077,-6.077 6.077,-6.077 3.35624,0 6.077,2.72077 6.077,6.077 z"
style="fill:url(#XMLID_75_)"
sodipodi:cx="241.867"
sodipodi:cy="240.89999"
sodipodi:rx="6.0770001"
sodipodi:ry="6.0770001" />
<g
id="g441">
<g
id="g443">
<linearGradient
id="XMLID_76_"
gradientUnits="userSpaceOnUse"
x1="248.4971"
y1="240.90089"
x2="235.2373"
y2="240.90089">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop446" />
<stop
offset="1"
style="stop-color:#000000"
id="stop448" />
</linearGradient>
<path
d="m 241.867,234.271 c -3.662,0 -6.63,2.968 -6.63,6.63 0,3.662 2.968,6.63 6.63,6.63 3.662,0 6.63,-2.968 6.63,-6.63 0,-3.662 -2.969,-6.63 -6.63,-6.63 z m 0,12.462 c -3.222,0 -5.833,-2.611 -5.833,-5.833 0,-3.221 2.611,-5.833 5.833,-5.833 3.221,0 5.833,2.612 5.833,5.833 0,3.222 -2.612,5.833 -5.833,5.833 z"
id="path450"
style="fill:url(#XMLID_76_)"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g452">
<g
id="g454">
<linearGradient
id="XMLID_77_"
gradientUnits="userSpaceOnUse"
x1="235.896"
y1="240.90041"
x2="247.8369"
y2="240.90041">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop457" />
<stop
offset="1"
style="stop-color:#000000"
id="stop459" />
</linearGradient>
<path
d="m 241.867,234.93 c -3.297,0 -5.971,2.673 -5.971,5.97 0,3.297 2.673,5.971 5.971,5.971 3.298,0 5.97,-2.674 5.97,-5.971 0,-3.297 -2.673,-5.97 -5.97,-5.97 z m 0,11.224 c -2.902,0 -5.252,-2.354 -5.252,-5.254 0,-2.901 2.351,-5.253 5.252,-5.253 2.901,0 5.253,2.352 5.253,5.253 0,2.901 -2.351,5.254 -5.253,5.254 z"
id="path461"
style="fill:url(#XMLID_77_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
<g
id="g463"
style="opacity:0.36000001">
<path
d="m 42,241 c 0,110.28 89.72,200 200,200 110.28,0 200,-89.72 200,-200 C 442,130.72 352.28,41 242,41 131.72,41 42,130.72 42,241 z m 2,0 C 44,131.822 132.822,43 242,43 351.178,43 440,131.822 440,241 440,350.178 351.178,439 242,439 132.822,439 44,350.178 44,241 z"
id="path465"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
id="g467"
style="opacity:0.36000001">
<path
d="m 191.25,241 c 0,27.983 22.766,50.75 50.75,50.75 27.983,0 50.75,-22.767 50.75,-50.75 0,-27.983 -22.767,-50.75 -50.75,-50.75 -27.984,0 -50.75,22.767 -50.75,50.75 z m 2,0 c 0,-26.881 21.869,-48.75 48.75,-48.75 26.881,0 48.75,21.869 48.75,48.75 0,26.881 -21.869,48.75 -48.75,48.75 -26.881,0 -48.75,-21.869 -48.75,-48.75 z"
id="path469"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
id="g471"
style="opacity:0.8">
<path
d="m 141.5,241 c 0,55.416 45.084,100.5 100.5,100.5 55.416,0 100.5,-45.084 100.5,-100.5 0,-55.416 -45.084,-100.5 -100.5,-100.5 -55.416,0 -100.5,45.084 -100.5,100.5 z m 2,0 c 0,-54.313 44.187,-98.5 98.5,-98.5 54.313,0 98.5,44.187 98.5,98.5 0,54.313 -44.187,98.5 -98.5,98.5 -54.313,0 -98.5,-44.187 -98.5,-98.5 z"
id="path473"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
id="g475"
style="opacity:0.8">
<path
d="m 91.75,241 c 0,82.848 67.402,150.25 150.25,150.25 82.848,0 150.25,-67.402 150.25,-150.25 C 392.25,158.152 324.848,90.75 242,90.75 159.152,90.75 91.75,158.152 91.75,241 z m 2,0 c 0,-81.745 66.505,-148.25 148.25,-148.25 81.745,0 148.25,66.505 148.25,148.25 0,81.745 -66.505,148.25 -148.25,148.25 C 160.255,389.25 93.75,322.745 93.75,241 z"
id="path477"
inkscape:connector-curvature="0"
style="fill:#ffffff" />
</g>
<g
id="g479">
<linearGradient
id="XMLID_78_"
gradientUnits="userSpaceOnUse"
x1="471.75"
y1="241"
x2="12.2505"
y2="241">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop482" />
<stop
offset="1"
style="stop-color:#000000"
id="stop484" />
</linearGradient>
<path
d="M 12.25,241 C 12.25,367.685 115.315,470.75 242,470.75 368.685,470.75 471.75,367.685 471.75,241 471.75,114.315 368.685,11.25 242,11.25 115.315,11.25 12.25,114.315 12.25,241 z m 15.049,0 C 27.299,122.613 123.613,26.299 242,26.299 360.386,26.299 456.701,122.613 456.701,241 456.701,359.386 360.386,455.701 242,455.701 123.613,455.701 27.299,359.386 27.299,241 z"
id="path486"
style="fill:url(#XMLID_78_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g488">
<linearGradient
id="XMLID_79_"
gradientUnits="userSpaceOnUse"
x1="28.433599"
y1="241"
x2="455.56641"
y2="241">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop491" />
<stop
offset="1"
style="stop-color:#000000"
id="stop493" />
</linearGradient>
<path
d="m 28.434,240.999 c 0,117.763 95.806,213.567 213.566,213.567 117.762,0 213.566,-95.805 213.566,-213.567 C 455.566,123.238 359.761,27.434 242,27.434 124.239,27.434 28.434,123.238 28.434,240.999 z m 7.874,0 C 36.308,127.58 128.58,35.307 242,35.307 c 113.419,0 205.692,92.273 205.692,205.692 0,113.42 -92.273,205.693 -205.692,205.693 -113.42,0 -205.692,-92.273 -205.692,-205.693 z"
id="path495"
style="fill:url(#XMLID_79_)"
inkscape:connector-curvature="0" />
</g>
<text
transform="translate(250,86.457)"
font-size="18"
id="text497"
style="font-size:18px;fill:#ffffff;font-family:ArialRoundedMTBold">75 %</text>
<text
transform="translate(250,135.457)"
font-size="18"
id="text499"
style="font-size:18px;fill:#ffffff;font-family:ArialRoundedMTBold">50 %</text>
</g>
<g
id="joystickEnd"
inkscape:label="#STICK"
transform="translate(215.51483,-164.18009)">
<g
id="g502">
<g
id="g504">
<g
id="g506">
<radialGradient
id="XMLID_80_"
cx="241"
cy="239.5107"
r="16.643999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop509" />
<stop
offset="1"
style="stop-color:#000000"
id="stop511" />
</radialGradient>
<path
d="m 257.645,239.511 c 0,9.193 -7.452,16.643 -16.645,16.643 -9.193,0 -16.644,-7.45 -16.644,-16.643 0,-9.192 7.452,-16.644 16.644,-16.644 9.192,0 16.645,7.452 16.645,16.644 z M 241,227.442 c -6.666,0 -12.072,5.403 -12.072,12.068 0,6.667 5.406,12.07 12.072,12.07 6.666,0 12.07,-5.402 12.07,-12.07 0,-6.665 -5.404,-12.068 -12.07,-12.068 z"
id="path513"
style="fill:url(#XMLID_80_)"
inkscape:connector-curvature="0" />
<g
id="g515">
<radialGradient
id="XMLID_81_"
cx="241.00101"
cy="221.3071"
r="3.0035"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop518" />
<stop
offset="1"
style="stop-color:#000000"
id="stop520" />
</radialGradient>
<path
d="m 242.695,222.523 c -0.018,-0.291 -0.239,-3.895 -0.239,-3.895 -0.021,-0.331 -0.264,-0.652 -0.548,-0.689 -0.722,-0.101 -1.093,-0.101 -1.815,0 -0.285,0.037 -0.528,0.358 -0.548,0.689 0,0 -0.223,3.604 -0.242,3.895 -0.017,0.293 -0.686,0.496 -0.686,0.496 -0.041,0.456 -0.061,0.684 -0.101,1.144 -0.029,0.326 0.246,0.588 0.612,0.588 0.749,0 1.123,0 1.871,0 0.751,0 1.125,0 1.874,0 0.368,0 0.644,-0.263 0.613,-0.588 -0.04,-0.459 -0.062,-0.688 -0.101,-1.144 -0.002,0 -0.671,-0.203 -0.69,-0.496 z"
id="path522"
style="fill:url(#XMLID_81_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g524">
<radialGradient
id="XMLID_82_"
cx="235.29539"
cy="222.62109"
r="3.2993"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop527" />
<stop
offset="1"
style="stop-color:#000000"
id="stop529" />
</radialGradient>
<path
d="m 236.784,222.969 c -0.117,-0.27 -1.558,-3.578 -1.558,-3.578 -0.134,-0.305 -0.472,-0.524 -0.751,-0.464 -0.714,0.154 -1.062,0.28 -1.706,0.624 -0.254,0.132 -0.374,0.516 -0.279,0.835 0,0 1.024,3.461 1.109,3.743 0.081,0.281 -0.478,0.701 -0.478,0.701 0.117,0.442 0.176,0.665 0.295,1.109 0.082,0.315 0.431,0.468 0.775,0.342 0.704,-0.253 1.056,-0.384 1.761,-0.64 0.704,-0.255 1.055,-0.384 1.759,-0.64 0.345,-0.125 0.512,-0.466 0.375,-0.761 -0.194,-0.418 -0.293,-0.625 -0.488,-1.043 0,0 -0.698,0.039 -0.814,-0.228 z"
id="path531"
style="fill:url(#XMLID_82_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g533">
<radialGradient
id="XMLID_83_"
cx="229.74409"
cy="225.9478"
r="3.5329001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop536" />
<stop
offset="1"
style="stop-color:#000000"
id="stop538" />
</radialGradient>
<path
d="m 231.38,225.409 c -0.203,-0.213 -2.687,-2.829 -2.687,-2.829 -0.231,-0.242 -0.624,-0.33 -0.867,-0.177 -0.616,0.387 -0.899,0.625 -1.391,1.166 -0.193,0.213 -0.172,0.614 0.026,0.881 0,0 2.145,2.904 2.319,3.139 0.174,0.237 -0.209,0.823 -0.209,0.823 0.263,0.377 0.396,0.564 0.659,0.94 0.187,0.267 0.565,0.291 0.846,0.057 0.575,-0.483 0.861,-0.722 1.434,-1.204 0.576,-0.481 0.861,-0.721 1.436,-1.202 0.282,-0.236 0.321,-0.615 0.091,-0.845 -0.326,-0.325 -0.488,-0.487 -0.813,-0.811 0,-0.001 -0.642,0.274 -0.844,0.062 z"
id="path540"
style="fill:url(#XMLID_83_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g542">
<radialGradient
id="XMLID_84_"
cx="225.5361"
cy="230.90331"
r="3.4546001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop545" />
<stop
offset="1"
style="stop-color:#000000"
id="stop547" />
</radialGradient>
<path
d="m 227.136,229.548 c -0.262,-0.129 -3.495,-1.737 -3.495,-1.737 -0.297,-0.151 -0.697,-0.099 -0.872,0.127 -0.448,0.575 -0.631,0.896 -0.909,1.572 -0.108,0.266 0.049,0.638 0.327,0.821 0,0 3.01,1.994 3.253,2.156 0.245,0.161 0.084,0.844 0.084,0.844 0.375,0.263 0.563,0.395 0.939,0.659 0.268,0.188 0.633,0.081 0.815,-0.237 0.375,-0.649 0.563,-0.972 0.937,-1.621 0.375,-0.65 0.562,-0.972 0.937,-1.622 0.184,-0.319 0.092,-0.687 -0.204,-0.826 -0.416,-0.193 -0.624,-0.289 -1.041,-0.484 0.002,0.001 -0.508,0.48 -0.771,0.348 z"
id="path549"
style="fill:url(#XMLID_84_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g551">
<radialGradient
id="XMLID_85_"
cx="223.1982"
cy="236.80569"
r="3.1020999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop554" />
<stop
offset="1"
style="stop-color:#000000"
id="stop556" />
</radialGradient>
<path
d="m 224.564,234.892 c -0.291,-0.034 -3.878,-0.44 -3.878,-0.44 -0.33,-0.036 -0.687,0.146 -0.776,0.418 -0.223,0.696 -0.288,1.059 -0.313,1.79 -0.012,0.287 0.262,0.582 0.584,0.657 0,0 3.511,0.846 3.794,0.917 0.286,0.067 0.368,0.761 0.368,0.761 0.443,0.119 0.665,0.179 1.109,0.299 0.315,0.084 0.622,-0.14 0.686,-0.501 0.129,-0.737 0.194,-1.106 0.325,-1.845 0.129,-0.736 0.195,-1.105 0.326,-1.842 0.063,-0.364 -0.149,-0.677 -0.474,-0.705 -0.457,-0.041 -0.686,-0.06 -1.144,-0.1 -0.001,-0.002 -0.315,0.622 -0.607,0.591 z"
id="path558"
style="fill:url(#XMLID_85_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g560">
<radialGradient
id="XMLID_86_"
cx="223.1958"
cy="242.2168"
r="3.1020999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop563" />
<stop
offset="1"
style="stop-color:#000000"
id="stop565" />
</radialGradient>
<path
d="m 223.975,240.789 c -0.286,0.07 -3.794,0.914 -3.794,0.914 -0.322,0.08 -0.596,0.372 -0.586,0.659 0.028,0.728 0.092,1.096 0.315,1.789 0.089,0.273 0.445,0.456 0.775,0.419 0,0 3.588,-0.405 3.879,-0.44 0.292,-0.032 0.605,0.592 0.605,0.592 0.458,-0.038 0.687,-0.059 1.145,-0.098 0.326,-0.03 0.537,-0.343 0.471,-0.708 -0.127,-0.734 -0.193,-1.105 -0.323,-1.841 -0.13,-0.739 -0.195,-1.105 -0.325,-1.843 -0.065,-0.363 -0.372,-0.587 -0.686,-0.502 -0.445,0.12 -0.667,0.18 -1.109,0.298 10e-4,0 -0.082,0.695 -0.367,0.761 z"
id="path567"
style="fill:url(#XMLID_86_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g569">
<radialGradient
id="XMLID_87_"
cx="225.53709"
cy="248.11909"
r="3.4547999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop572" />
<stop
offset="1"
style="stop-color:#000000"
id="stop574" />
</radialGradient>
<path
d="m 225.44,246.536 c -0.245,0.161 -3.253,2.155 -3.253,2.155 -0.277,0.186 -0.435,0.554 -0.327,0.821 0.276,0.675 0.461,0.996 0.908,1.571 0.176,0.228 0.576,0.279 0.873,0.128 0,0 3.233,-1.607 3.495,-1.737 0.262,-0.132 0.772,0.349 0.772,0.349 0.416,-0.193 0.625,-0.291 1.04,-0.484 0.296,-0.139 0.388,-0.508 0.204,-0.826 -0.375,-0.647 -0.561,-0.973 -0.936,-1.62 -0.375,-0.651 -0.562,-0.972 -0.936,-1.623 -0.185,-0.315 -0.549,-0.425 -0.816,-0.235 -0.377,0.265 -0.563,0.395 -0.939,0.657 -0.001,-0.001 0.16,0.685 -0.085,0.844 z"
id="path576"
style="fill:url(#XMLID_87_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g578">
<radialGradient
id="XMLID_88_"
cx="229.7446"
cy="253.0742"
r="3.5330999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop581" />
<stop
offset="1"
style="stop-color:#000000"
id="stop583" />
</radialGradient>
<path
d="m 228.779,251.433 c -0.172,0.239 -2.317,3.14 -2.317,3.14 -0.199,0.268 -0.216,0.67 -0.026,0.883 0.49,0.54 0.773,0.781 1.39,1.166 0.244,0.151 0.636,0.063 0.867,-0.176 0,0 2.485,-2.618 2.688,-2.829 0.2,-0.213 0.844,0.062 0.844,0.062 0.326,-0.324 0.487,-0.485 0.813,-0.811 0.229,-0.23 0.19,-0.609 -0.093,-0.845 -0.572,-0.481 -0.859,-0.723 -1.434,-1.203 -0.573,-0.482 -0.86,-0.721 -1.435,-1.205 -0.281,-0.235 -0.66,-0.211 -0.847,0.06 -0.261,0.375 -0.394,0.562 -0.658,0.94 0.001,-0.001 0.385,0.585 0.208,0.818 z"
id="path585"
style="fill:url(#XMLID_88_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g587">
<radialGradient
id="XMLID_89_"
cx="235.29491"
cy="256.40039"
r="3.2997999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop590" />
<stop
offset="1"
style="stop-color:#000000"
id="stop592" />
</radialGradient>
<path
d="m 233.596,254.894 c -0.083,0.283 -1.107,3.743 -1.107,3.743 -0.094,0.318 0.025,0.703 0.278,0.837 0.645,0.341 0.992,0.468 1.705,0.621 0.281,0.06 0.619,-0.157 0.751,-0.462 0,0 1.443,-3.309 1.559,-3.58 0.117,-0.267 0.815,-0.227 0.815,-0.227 0.193,-0.417 0.293,-0.626 0.488,-1.042 0.137,-0.297 -0.03,-0.636 -0.375,-0.762 -0.704,-0.257 -1.057,-0.384 -1.76,-0.642 -0.704,-0.255 -1.055,-0.382 -1.76,-0.639 -0.345,-0.128 -0.693,0.027 -0.776,0.343 -0.118,0.445 -0.179,0.667 -0.296,1.111 0.001,-0.003 0.561,0.417 0.478,0.699 z"
id="path594"
style="fill:url(#XMLID_89_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g596">
<radialGradient
id="XMLID_90_"
cx="240.99899"
cy="257.71579"
r="3.0042"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop599" />
<stop
offset="1"
style="stop-color:#000000"
id="stop601" />
</radialGradient>
<path
d="m 239.303,256.499 c 0.018,0.293 0.241,3.895 0.241,3.895 0.021,0.333 0.264,0.655 0.549,0.689 0.721,0.104 1.092,0.104 1.815,0 0.283,-0.034 0.527,-0.356 0.547,-0.689 0,0 0.222,-3.604 0.24,-3.895 0.019,-0.293 0.688,-0.496 0.688,-0.496 0.04,-0.458 0.062,-0.684 0.102,-1.144 0.027,-0.322 -0.245,-0.588 -0.614,-0.588 -0.747,0 -1.123,0 -1.872,0 -0.75,0 -1.123,0 -1.872,0 -0.368,0 -0.642,0.266 -0.613,0.588 0.041,0.46 0.062,0.686 0.101,1.144 0.002,0 0.671,0.201 0.688,0.496 z"
id="path603"
style="fill:url(#XMLID_90_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g605">
<radialGradient
id="XMLID_91_"
cx="246.7041"
cy="256.40039"
r="3.299"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop608" />
<stop
offset="1"
style="stop-color:#000000"
id="stop610" />
</radialGradient>
<path
d="m 245.216,256.053 c 0.117,0.271 1.558,3.58 1.558,3.58 0.134,0.303 0.472,0.521 0.751,0.46 0.713,-0.151 1.062,-0.278 1.707,-0.619 0.253,-0.134 0.371,-0.519 0.279,-0.837 0,0 -1.024,-3.463 -1.107,-3.743 -0.084,-0.281 0.476,-0.697 0.476,-0.697 -0.117,-0.444 -0.177,-0.666 -0.297,-1.111 -0.083,-0.315 -0.43,-0.471 -0.774,-0.343 -0.705,0.257 -1.054,0.384 -1.76,0.639 -0.703,0.256 -1.056,0.385 -1.759,0.64 -0.347,0.126 -0.514,0.467 -0.374,0.762 0.193,0.416 0.292,0.625 0.485,1.044 -0.001,-0.002 0.699,-0.044 0.815,0.225 z"
id="path612"
style="fill:url(#XMLID_91_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g614">
<radialGradient
id="XMLID_92_"
cx="252.2549"
cy="253.0742"
r="3.5329001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop617" />
<stop
offset="1"
style="stop-color:#000000"
id="stop619" />
</radialGradient>
<path
d="m 250.62,253.616 c 0.201,0.211 2.688,2.829 2.688,2.829 0.229,0.239 0.624,0.327 0.864,0.176 0.618,-0.387 0.901,-0.626 1.393,-1.166 0.189,-0.213 0.17,-0.613 -0.027,-0.883 0,0 -2.146,-2.9 -2.319,-3.14 -0.175,-0.232 0.21,-0.818 0.21,-0.818 -0.264,-0.379 -0.395,-0.565 -0.66,-0.94 -0.187,-0.271 -0.565,-0.295 -0.845,-0.06 -0.573,0.484 -0.862,0.723 -1.434,1.205 -0.576,0.48 -0.863,0.722 -1.435,1.203 -0.281,0.235 -0.323,0.614 -0.092,0.845 0.324,0.325 0.486,0.486 0.813,0.811 -0.001,0 0.643,-0.275 0.844,-0.062 z"
id="path621"
style="fill:url(#XMLID_92_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g623">
<radialGradient
id="XMLID_93_"
cx="256.46289"
cy="248.11909"
r="3.454"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop626" />
<stop
offset="1"
style="stop-color:#000000"
id="stop628" />
</radialGradient>
<path
d="m 254.863,249.475 c 0.262,0.13 3.495,1.737 3.495,1.737 0.294,0.151 0.694,0.1 0.872,-0.128 0.448,-0.575 0.632,-0.896 0.906,-1.571 0.109,-0.27 -0.046,-0.636 -0.324,-0.821 0,0 -3.009,-1.994 -3.254,-2.155 -0.245,-0.159 -0.083,-0.845 -0.083,-0.845 -0.379,-0.263 -0.563,-0.396 -0.938,-0.657 -0.27,-0.189 -0.634,-0.084 -0.817,0.235 -0.374,0.649 -0.562,0.972 -0.936,1.623 -0.375,0.647 -0.563,0.973 -0.937,1.62 -0.184,0.318 -0.092,0.688 0.203,0.824 0.416,0.193 0.626,0.293 1.04,0.484 0.001,0 0.513,-0.478 0.773,-0.346 z"
id="path630"
style="fill:url(#XMLID_93_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g632">
<radialGradient
id="XMLID_94_"
cx="258.80179"
cy="242.2168"
r="3.1026001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop635" />
<stop
offset="1"
style="stop-color:#000000"
id="stop637" />
</radialGradient>
<path
d="m 257.436,244.13 c 0.291,0.035 3.879,0.44 3.879,0.44 0.328,0.037 0.688,-0.147 0.772,-0.419 0.226,-0.693 0.291,-1.06 0.317,-1.789 0.01,-0.287 -0.264,-0.58 -0.586,-0.659 0,0 -3.51,-0.844 -3.795,-0.914 -0.285,-0.066 -0.367,-0.761 -0.367,-0.761 -0.441,-0.119 -0.665,-0.179 -1.109,-0.299 -0.316,-0.084 -0.619,0.14 -0.686,0.502 -0.129,0.738 -0.195,1.105 -0.324,1.842 -0.132,0.737 -0.195,1.106 -0.327,1.843 -0.063,0.365 0.149,0.678 0.473,0.706 0.46,0.041 0.688,0.062 1.146,0.1 10e-4,0 0.314,-0.624 0.607,-0.592 z"
id="path639"
style="fill:url(#XMLID_94_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g641">
<radialGradient
id="XMLID_95_"
cx="258.8027"
cy="236.8047"
r="3.1022999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop644" />
<stop
offset="1"
style="stop-color:#000000"
id="stop646" />
</radialGradient>
<path
d="m 258.025,238.234 c 0.285,-0.072 3.795,-0.915 3.795,-0.915 0.32,-0.08 0.596,-0.373 0.584,-0.661 -0.026,-0.73 -0.092,-1.095 -0.317,-1.791 -0.085,-0.27 -0.444,-0.453 -0.772,-0.417 0,0 -3.588,0.406 -3.879,0.441 -0.293,0.031 -0.605,-0.593 -0.605,-0.593 -0.458,0.041 -0.686,0.06 -1.146,0.1 -0.325,0.027 -0.536,0.342 -0.473,0.703 0.13,0.739 0.195,1.107 0.325,1.846 0.132,0.738 0.195,1.105 0.324,1.844 0.066,0.362 0.373,0.586 0.686,0.501 0.446,-0.12 0.666,-0.179 1.109,-0.298 0,0.001 0.082,-0.694 0.369,-0.76 z"
id="path648"
style="fill:url(#XMLID_95_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g650">
<radialGradient
id="XMLID_96_"
cx="256.46191"
cy="230.90331"
r="3.4546001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop653" />
<stop
offset="1"
style="stop-color:#000000"
id="stop655" />
</radialGradient>
<path
d="m 256.559,232.487 c 0.245,-0.163 3.254,-2.157 3.254,-2.157 0.276,-0.183 0.434,-0.556 0.324,-0.82 -0.274,-0.675 -0.458,-0.997 -0.906,-1.572 -0.178,-0.226 -0.576,-0.279 -0.872,-0.127 0,0 -3.231,1.608 -3.495,1.737 -0.261,0.131 -0.771,-0.35 -0.771,-0.35 -0.419,0.194 -0.626,0.293 -1.044,0.486 -0.295,0.138 -0.387,0.507 -0.201,0.825 0.374,0.649 0.562,0.971 0.937,1.621 0.374,0.65 0.562,0.973 0.934,1.623 0.186,0.317 0.55,0.424 0.819,0.237 0.376,-0.266 0.56,-0.396 0.938,-0.659 0,0 -0.163,-0.683 0.083,-0.844 z"
id="path657"
style="fill:url(#XMLID_96_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g659">
<radialGradient
id="XMLID_97_"
cx="252.25591"
cy="225.9473"
r="3.5329001"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop662" />
<stop
offset="1"
style="stop-color:#000000"
id="stop664" />
</radialGradient>
<path
d="m 253.22,227.588 c 0.174,-0.235 2.319,-3.138 2.319,-3.138 0.197,-0.268 0.217,-0.669 0.025,-0.882 -0.491,-0.541 -0.774,-0.778 -1.393,-1.166 -0.24,-0.152 -0.635,-0.065 -0.864,0.177 0,0 -2.484,2.616 -2.688,2.829 -0.201,0.212 -0.845,-0.063 -0.845,-0.063 -0.326,0.324 -0.488,0.486 -0.813,0.811 -0.229,0.23 -0.189,0.608 0.094,0.843 0.571,0.481 0.858,0.723 1.433,1.203 0.571,0.482 0.86,0.722 1.432,1.205 0.283,0.234 0.662,0.209 0.847,-0.057 0.266,-0.377 0.396,-0.564 0.66,-0.94 0.001,0.001 -0.384,-0.587 -0.207,-0.822 z"
id="path666"
style="fill:url(#XMLID_97_)"
inkscape:connector-curvature="0" />
</g>
<g
id="g668">
<radialGradient
id="XMLID_98_"
cx="246.70509"
cy="222.62061"
r="3.2988999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop671" />
<stop
offset="1"
style="stop-color:#000000"
id="stop673" />
</radialGradient>
<path
d="m 248.405,224.128 c 0.081,-0.282 1.105,-3.743 1.105,-3.743 0.094,-0.319 -0.026,-0.703 -0.279,-0.835 -0.644,-0.343 -0.992,-0.469 -1.705,-0.624 -0.281,-0.06 -0.619,0.16 -0.751,0.464 0,0 -1.442,3.308 -1.558,3.578 -0.118,0.267 -0.815,0.229 -0.815,0.229 -0.195,0.417 -0.294,0.624 -0.487,1.04 -0.138,0.297 0.029,0.637 0.375,0.763 0.702,0.255 1.055,0.383 1.758,0.639 0.706,0.257 1.055,0.383 1.76,0.641 0.347,0.125 0.693,-0.027 0.776,-0.342 0.12,-0.446 0.178,-0.667 0.297,-1.109 0,0.001 -0.562,-0.419 -0.476,-0.701 z"
id="path675"
style="fill:url(#XMLID_98_)"
inkscape:connector-curvature="0" />
</g>
<radialGradient
id="XMLID_99_"
cx="240.99899"
cy="239.5107"
r="3.3778999"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop678" />
<stop
offset="1"
style="stop-color:#000000"
id="stop680" />
</radialGradient>
<circle
cx="241"
cy="239.511"
r="3.378"
id="circle682"
style="fill:url(#XMLID_99_)"
sodipodi:cx="241"
sodipodi:cy="239.511"
sodipodi:rx="3.378"
sodipodi:ry="3.378"
d="m 244.378,239.511 c 0,1.86562 -1.51238,3.378 -3.378,3.378 -1.86562,0 -3.378,-1.51238 -3.378,-3.378 0,-1.86562 1.51238,-3.378 3.378,-3.378 1.86562,0 3.378,1.51238 3.378,3.378 z" />
</g>
</g>
<radialGradient
id="XMLID_100_"
cx="241"
cy="239.5117"
r="16.830099"
gradientUnits="userSpaceOnUse">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop685" />
<stop
offset="0.2855"
style="stop-color:#BEBEBE"
id="stop687" />
<stop
offset="0.6285"
style="stop-color:#777777"
id="stop689" />
<stop
offset="0.8756"
style="stop-color:#4A4A4A"
id="stop691" />
<stop
offset="1"
style="stop-color:#393939"
id="stop693" />
</radialGradient>
<circle
cx="241"
cy="239.513"
r="16.83"
id="circle695"
style="fill:url(#XMLID_100_)"
sodipodi:cx="241"
sodipodi:cy="239.513"
sodipodi:rx="16.83"
sodipodi:ry="16.83"
d="m 257.83,239.513 c 0,9.29495 -7.53505,16.83 -16.83,16.83 -9.29495,0 -16.83,-7.53505 -16.83,-16.83 0,-9.29495 7.53505,-16.83 16.83,-16.83 9.29495,0 16.83,7.53505 16.83,16.83 z" />
<g
id="g697">
<g
id="g699">
<linearGradient
id="XMLID_101_"
gradientUnits="userSpaceOnUse"
x1="259.36041"
y1="239.51221"
x2="222.64059"
y2="239.51221">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop702" />
<stop
offset="1"
style="stop-color:#000000"
id="stop704" />
</linearGradient>
<path
d="m 241,221.152 c -10.14,0 -18.36,8.22 -18.36,18.361 0,10.139 8.22,18.359 18.36,18.359 10.141,0 18.36,-8.22 18.36,-18.359 0,-10.141 -8.219,-18.361 -18.36,-18.361 z m 0,34.514 c -8.921,0 -16.154,-7.233 -16.154,-16.153 0,-8.922 7.233,-16.154 16.154,-16.154 8.921,0 16.152,7.232 16.152,16.154 0,8.92 -7.231,16.153 -16.152,16.153 z"
id="path706"
style="fill:url(#XMLID_101_)"
inkscape:connector-curvature="0" />
</g>
</g>
<g
id="g708">
<g
id="g710">
<linearGradient
id="XMLID_102_"
gradientUnits="userSpaceOnUse"
x1="224.4668"
y1="239.5127"
x2="257.5332"
y2="239.5127">
<stop
offset="0"
style="stop-color:#FFFFFF"
id="stop713" />
<stop
offset="1"
style="stop-color:#000000"
id="stop715" />
</linearGradient>
<path
d="m 241,222.98 c -9.13,0 -16.533,7.402 -16.533,16.532 0,9.129 7.403,16.533 16.533,16.533 9.13,0 16.533,-7.403 16.533,-16.533 0,-9.13 -7.403,-16.532 -16.533,-16.532 z m 0,31.079 c -8.035,0 -14.547,-6.513 -14.547,-14.546 0,-8.033 6.512,-14.547 14.547,-14.547 8.034,0 14.547,6.513 14.547,14.547 0,8.034 -6.513,14.546 -14.547,14.546 z"
id="path717"
style="fill:url(#XMLID_102_)"
inkscape:connector-curvature="0" />
</g>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 95 KiB

View File

@ -88,9 +88,12 @@ void LogFile::timerFired()
if(file.bytesAvailable() > 4) if(file.bytesAvailable() > 4)
{ {
// TODO: going back in time will be a problem int time;
while ((myTime.elapsed() - timeOffset) * playbackSpeed > lastTimeStamp) { time = myTime.elapsed();
// TODO: going back in time will be a problem
while ((lastPlayed + ((time - timeOffset)* playbackSpeed) > lastTimeStamp)) {
lastPlayed += ((time - timeOffset)* playbackSpeed);
if(file.bytesAvailable() < 4) { if(file.bytesAvailable() < 4) {
stopReplay(); stopReplay();
return; return;
@ -98,6 +101,11 @@ void LogFile::timerFired()
file.read((char *) &dataSize, sizeof(dataSize)); file.read((char *) &dataSize, sizeof(dataSize));
if (dataSize<1 || dataSize>(1024*1024)) {
qDebug() << "Error: Logfile corrupted! Unlikely packet size: " << dataSize << "\n";
stopReplay();
return;
}
if(file.bytesAvailable() < dataSize) { if(file.bytesAvailable() < dataSize) {
stopReplay(); stopReplay();
return; return;
@ -113,7 +121,19 @@ void LogFile::timerFired()
return; return;
} }
int save=lastTimeStamp;
file.read((char *) &lastTimeStamp,sizeof(lastTimeStamp)); file.read((char *) &lastTimeStamp,sizeof(lastTimeStamp));
// some validity checks
if (lastTimeStamp<save // logfile goies back in time
|| (lastTimeStamp-save) > (60*60*1000)) { // gap of more than 60 minutes)
qDebug() << "Error: Logfile corrupted! Unlikely timestamp " << lastTimeStamp << " after "<< save << "\n";
stopReplay();
return;
}
timeOffset = time;
time = myTime.elapsed();
} }
} else { } else {
stopReplay(); stopReplay();
@ -125,6 +145,7 @@ bool LogFile::startReplay() {
dataBuffer.clear(); dataBuffer.clear();
myTime.restart(); myTime.restart();
timeOffset = 0; timeOffset = 0;
lastPlayed = 0;
playbackSpeed = 1; playbackSpeed = 1;
file.read((char *) &lastTimeStamp,sizeof(lastTimeStamp)); file.read((char *) &lastTimeStamp,sizeof(lastTimeStamp));
timer.setInterval(10); timer.setInterval(10);
@ -142,12 +163,11 @@ bool LogFile::stopReplay() {
void LogFile::pauseReplay() void LogFile::pauseReplay()
{ {
timer.stop(); timer.stop();
pausedTime = myTime.elapsed();
} }
void LogFile::resumeReplay() void LogFile::resumeReplay()
{ {
timeOffset += myTime.elapsed() - pausedTime; timeOffset = myTime.elapsed();
timer.start(); timer.start();
} }

View File

@ -27,7 +27,7 @@ public:
bool stopReplay(); bool stopReplay();
public slots: public slots:
void setReplaySpeed(double val) { playbackSpeed = pow(10,(val)/100); qDebug() << playbackSpeed; }; void setReplaySpeed(double val) { playbackSpeed = val; qDebug() << playbackSpeed; };
void pauseReplay(); void pauseReplay();
void resumeReplay(); void resumeReplay();
@ -45,11 +45,11 @@ protected:
QTime myTime; QTime myTime;
QFile file; QFile file;
qint32 lastTimeStamp; qint32 lastTimeStamp;
qint32 lastPlayed;
QMutex mutex; QMutex mutex;
int timeOffset; int timeOffset;
int pausedTime;
double playbackSpeed; double playbackSpeed;
}; };

View File

@ -7,9 +7,11 @@ HEADERS += rawhid_global.h \
rawhid.h \ rawhid.h \
pjrc_rawhid.h \ pjrc_rawhid.h \
rawhid_const.h \ rawhid_const.h \
usbmonitor.h usbmonitor.h \
usbsignalfilter.h
SOURCES += rawhidplugin.cpp \ SOURCES += rawhidplugin.cpp \
rawhid.cpp rawhid.cpp \
usbsignalfilter.cpp
FORMS += FORMS +=
RESOURCES += RESOURCES +=
DEFINES += RAWHID_LIBRARY DEFINES += RAWHID_LIBRARY

View File

@ -31,7 +31,7 @@
#include "rawhid_global.h" #include "rawhid_global.h"
#include "rawhid.h" #include "rawhid.h"
#include "usbmonitor.h" #include "usbmonitor.h"
#include "usbsignalfilter.h"
#include "coreplugin/iconnection.h" #include "coreplugin/iconnection.h"
#include <extensionsystem/iplugin.h> #include <extensionsystem/iplugin.h>

View File

@ -202,5 +202,4 @@ private:
#endif #endif
}; };
#endif // USBMONITOR_H #endif // USBMONITOR_H

View File

@ -78,6 +78,15 @@ USBMonitor::~USBMonitor()
QList<USBPortInfo> USBMonitor::availableDevices(int vid, int pid, int bcdDeviceMSB, int bcdDeviceLSB) QList<USBPortInfo> USBMonitor::availableDevices(int vid, int pid, int bcdDeviceMSB, int bcdDeviceLSB)
{ {
QList<USBPortInfo> allPorts = availableDevices(); QList<USBPortInfo> allPorts = availableDevices();
qDebug()<<"USBMonitor::availableDevices list off all ports:";
qDebug()<<"USBMonitor::availableDevices total ports:"<<allPorts.length();
foreach (USBPortInfo info, allPorts) {
qDebug()<<"----------";
qDebug()<<"bcdDevice:"<<info.bcdDevice;
qDebug()<<"devicePath:"<<info.devicePath;
qDebug()<<"product:"<<info.product;
}
qDebug()<<"END OF LIST";
QList<USBPortInfo> thePortsWeWant; QList<USBPortInfo> thePortsWeWant;
qDebug()<<"USBMonitor::availableDevices bcdLSB="<<bcdDeviceLSB; qDebug()<<"USBMonitor::availableDevices bcdLSB="<<bcdDeviceLSB;
foreach (USBPortInfo port, allPorts) { foreach (USBPortInfo port, allPorts) {
@ -86,6 +95,15 @@ QList<USBPortInfo> USBMonitor::availableDevices(int vid, int pid, int bcdDeviceM
( (port.bcdDevice&0x00ff) ==bcdDeviceLSB || bcdDeviceLSB==-1)) ( (port.bcdDevice&0x00ff) ==bcdDeviceLSB || bcdDeviceLSB==-1))
thePortsWeWant.append(port); thePortsWeWant.append(port);
} }
qDebug()<<"USBMonitor::availableDevices list off matching ports vid pid bcdMSD bcdLSD:"<<vid<<pid<<bcdDeviceMSB<<bcdDeviceLSB;
qDebug()<<"USBMonitor::availableDevices total matching ports:"<<thePortsWeWant.length();
foreach (USBPortInfo info, thePortsWeWant) {
qDebug()<<"----------";
qDebug()<<"bcdDevice:"<<info.bcdDevice;
qDebug()<<"devicePath:"<<info.devicePath;
qDebug()<<"product:"<<info.product;
}
qDebug()<<"END OF LIST";
return thePortsWeWant; return thePortsWeWant;
} }
@ -160,6 +178,7 @@ bool USBRegistrationWidget::winEvent( MSG* message, long* result )
#endif #endif
bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const GUID & guid, WPARAM wParam) bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const GUID & guid, WPARAM wParam)
{ {
qDebug()<<"USB_MONITOR matchAndDispatchChangedDevice deviceID="<<deviceID;
bool rv = false; bool rv = false;
DWORD dwFlag = (DBT_DEVICEARRIVAL == wParam) ? DIGCF_PRESENT : DIGCF_ALLCLASSES; DWORD dwFlag = (DBT_DEVICEARRIVAL == wParam) ? DIGCF_PRESENT : DIGCF_ALLCLASSES;
HDEVINFO devInfo; HDEVINFO devInfo;
@ -178,10 +197,7 @@ bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const G
info.devicePath=deviceID; info.devicePath=deviceID;
if( wParam == DBT_DEVICEARRIVAL ) if( wParam == DBT_DEVICEARRIVAL )
{ {
qDebug()<<"INSERTION"; qDebug()<<"USB_MONITOR INSERTION";
QEventLoop m_eventloop;
QTimer::singleShot(1000,&m_eventloop, SLOT(quit()));
m_eventloop.exec();
if(infoFromHandle(guid,info,devInfo,i)!=1) if(infoFromHandle(guid,info,devInfo,i)!=1)
{ {
qDebug()<<"USB_MONITOR infoFromHandle failed on matchAndDispatchChangedDevice"; qDebug()<<"USB_MONITOR infoFromHandle failed on matchAndDispatchChangedDevice";
@ -189,11 +205,20 @@ bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const G
} }
bool m_break=false; bool m_break=false;
foreach (USBPortInfo m_info, knowndevices) { foreach (USBPortInfo m_info, knowndevices) {
if(m_info.serialNumber==info.serialNumber && m_info.productID==info.productID) if(m_info.serialNumber==info.serialNumber && m_info.productID==info.productID && m_info.bcdDevice==info.bcdDevice && m_info.devicePath==info.devicePath)
{
qDebug()<<"USB_MONITOR device already present don't emit signal";
m_break=true; m_break=true;
}
} }
if(m_break) if(m_break)
break; break;
if(info.bcdDevice==0 || info.product.isEmpty())
{
qDebug()<<"USB_MONITOR empty information on device not emiting signal";
break;
}
knowndevices.append(info); knowndevices.append(info);
qDebug()<<"USB_MONITOR emit device discovered on device:"<<info.product<<info.bcdDevice; qDebug()<<"USB_MONITOR emit device discovered on device:"<<info.product<<info.bcdDevice;
emit deviceDiscovered(info); emit deviceDiscovered(info);
@ -208,13 +233,18 @@ bool USBMonitor::matchAndDispatchChangedDevice(const QString & deviceID, const G
if(knowndevices[x].devicePath==deviceID) if(knowndevices[x].devicePath==deviceID)
{ {
USBPortInfo temp=knowndevices.at(x); USBPortInfo temp=knowndevices.at(x);
knowndevices.removeAt(x);
qDebug()<<"USB_MONITOR emit device removed on device:"<<temp.product<<temp.bcdDevice;
emit deviceRemoved(temp); emit deviceRemoved(temp);
found=true; found=true;
break; break;
} }
} }
if(!found) if(!found)
{
qDebug()<<"USB_MONITOR emit device removed on unknown device";
emit deviceRemoved(info); emit deviceRemoved(info);
}
} }
break; break;

View File

@ -0,0 +1,22 @@
#include "usbsignalfilter.h"
#include <QDebug>
void USBSignalFilter::m_deviceDiscovered(USBPortInfo port)
{
if((port.vendorID==m_vid || m_vid==-1) && (port.productID==m_pid || m_pid==-1) && ((port.bcdDevice>>8)==m_boardModel || m_boardModel==-1) &&
( (port.bcdDevice&0x00ff) ==m_runState || m_runState==-1))
{
qDebug()<<"USBSignalFilter emit device discovered";
emit deviceDiscovered();
}
}
USBSignalFilter::USBSignalFilter(int vid, int pid, int boardModel, int runState):
m_vid(vid),
m_pid(pid),
m_boardModel(boardModel),
m_runState(runState)
{
connect(USBMonitor::instance(),SIGNAL(deviceDiscovered(USBPortInfo)),this,SLOT(m_deviceDiscovered(USBPortInfo)));
}

View File

@ -0,0 +1,21 @@
#ifndef USBSIGNALFILTER_H
#define USBSIGNALFILTER_H
#include <QObject>
#include "usbmonitor.h"
class RAWHID_EXPORT USBSignalFilter : public QObject
{
Q_OBJECT
private:
int m_vid;
int m_pid;
int m_boardModel;
int m_runState;
signals:
void deviceDiscovered();
private slots:
void m_deviceDiscovered(USBPortInfo port);
public:
USBSignalFilter(int vid, int pid, int boardModel, int runState);
};
#endif // USBSIGNALFILTER_H

View File

@ -49,9 +49,14 @@ PlotData::PlotData(QString p_uavObject, QString p_uavField)
xData = new QVector<double>(); xData = new QVector<double>();
yData = new QVector<double>(); yData = new QVector<double>();
yDataHistory = new QVector<double>();
curve = 0; curve = 0;
scalePower = 0; scalePower = 0;
interpolationSamples = 1;
interpolationSum = 0.0f;
correctionSum = 0.0f;
correctionCount = 0;
yMinimum = 0; yMinimum = 0;
yMaximum = 0; yMaximum = 0;
@ -78,6 +83,7 @@ PlotData::~PlotData()
{ {
delete xData; delete xData;
delete yData; delete yData;
delete yDataHistory;
} }
@ -91,7 +97,24 @@ bool SequencialPlotData::append(UAVObject* obj)
if (field) { if (field) {
//Shift data forward and put the new value at the front //Shift data forward and put the new value at the front
yData->append( valueAsDouble(obj, field) * pow(10, scalePower));
// calculate interpolated (smoothed) value
double currentValue = valueAsDouble(obj, field) * pow(10, scalePower);
yDataHistory->append( currentValue );
interpolationSum += currentValue;
if(yDataHistory->size() > interpolationSamples) {
interpolationSum -= yDataHistory->first();
yDataHistory->pop_front();
}
// make sure to correct the sum every interpolationSamples steps to prevent it
// from running away due to flouting point rounding errors
correctionSum += currentValue;
if (++correctionCount >= interpolationSamples) {
interpolationSum = correctionSum;
correctionSum = 0.0f;
correctionCount = 0;
}
yData->append(interpolationSum/yDataHistory->size());
if (yData->size() > m_xWindowSize) { if (yData->size() > m_xWindowSize) {
yData->pop_front(); yData->pop_front();
} else } else
@ -117,8 +140,25 @@ bool ChronoPlotData::append(UAVObject* obj)
//Put the new value at the front //Put the new value at the front
QDateTime NOW = QDateTime::currentDateTime(); QDateTime NOW = QDateTime::currentDateTime();
// calculate interpolated (smoothed) value
double currentValue = valueAsDouble(obj, field) * pow(10, scalePower);
yDataHistory->append( currentValue );
interpolationSum += currentValue;
if(yDataHistory->size() > interpolationSamples) {
interpolationSum -= yDataHistory->first();
yDataHistory->pop_front();
}
// make sure to correct the sum every interpolationSamples steps to prevent it
// from running away due to flouting point rounding errors
correctionSum += currentValue;
if (++correctionCount >= interpolationSamples) {
interpolationSum = correctionSum;
correctionSum = 0.0f;
correctionCount = 0;
}
double valueX = NOW.toTime_t() + NOW.time().msec() / 1000.0; double valueX = NOW.toTime_t() + NOW.time().msec() / 1000.0;
double valueY = valueAsDouble(obj, field) * pow(10, scalePower); double valueY = interpolationSum/yDataHistory->size();
xData->append(valueX); xData->append(valueX);
yData->append(valueY); yData->append(valueY);

View File

@ -72,12 +72,17 @@ public:
QString uavSubField; QString uavSubField;
bool haveSubField; bool haveSubField;
int scalePower; //This is the power to which each value must be raised int scalePower; //This is the power to which each value must be raised
int interpolationSamples;
double interpolationSum;
double correctionSum;
int correctionCount;
double yMinimum; double yMinimum;
double yMaximum; double yMaximum;
double m_xWindowSize; double m_xWindowSize;
QwtPlotCurve* curve; QwtPlotCurve* curve;
QVector<double>* xData; QVector<double>* xData;
QVector<double>* yData; QVector<double>* yData;
QVector<double>* yDataHistory;
virtual bool append(UAVObject* obj) = 0; virtual bool append(UAVObject* obj) = 0;
virtual PlotType plotType() = 0; virtual PlotType plotType() = 0;

View File

@ -61,12 +61,14 @@ void ScopeGadget::loadConfiguration(IUAVGadgetConfiguration* config)
QString uavObject = plotCurveConfig->uavObject; QString uavObject = plotCurveConfig->uavObject;
QString uavField = plotCurveConfig->uavField; QString uavField = plotCurveConfig->uavField;
int scale = plotCurveConfig->yScalePower; int scale = plotCurveConfig->yScalePower;
int interpolation = plotCurveConfig->yInterpolationSamples;
QRgb color = plotCurveConfig->color; QRgb color = plotCurveConfig->color;
widget->addCurvePlot( widget->addCurvePlot(
uavObject, uavObject,
uavField, uavField,
scale, scale,
interpolation,
QPen( QBrush(QColor(color),Qt::SolidPattern), QPen( QBrush(QColor(color),Qt::SolidPattern),
// (qreal)2, // (qreal)2,
(qreal)1, (qreal)1,

View File

@ -65,6 +65,7 @@ ScopeGadgetConfiguration::ScopeGadgetConfiguration(QString classId, QSettings* q
color = qSettings->value("color").value<QRgb>(); color = qSettings->value("color").value<QRgb>();
plotCurveConf->color = color; plotCurveConf->color = color;
plotCurveConf->yScalePower = qSettings->value("yScalePower").toInt(); plotCurveConf->yScalePower = qSettings->value("yScalePower").toInt();
plotCurveConf->yInterpolationSamples = qSettings->value("yInterpolationSamples").toInt();
plotCurveConf->yMinimum = qSettings->value("yMinimum").toDouble(); plotCurveConf->yMinimum = qSettings->value("yMinimum").toDouble();
plotCurveConf->yMaximum = qSettings->value("yMaximum").toDouble(); plotCurveConf->yMaximum = qSettings->value("yMaximum").toDouble();
@ -118,6 +119,7 @@ IUAVGadgetConfiguration *ScopeGadgetConfiguration::clone()
newPlotCurveConf->uavField = currentPlotCurveConf->uavField; newPlotCurveConf->uavField = currentPlotCurveConf->uavField;
newPlotCurveConf->color = currentPlotCurveConf->color; newPlotCurveConf->color = currentPlotCurveConf->color;
newPlotCurveConf->yScalePower = currentPlotCurveConf->yScalePower; newPlotCurveConf->yScalePower = currentPlotCurveConf->yScalePower;
newPlotCurveConf->yInterpolationSamples = currentPlotCurveConf->yInterpolationSamples;
newPlotCurveConf->yMinimum = currentPlotCurveConf->yMinimum; newPlotCurveConf->yMinimum = currentPlotCurveConf->yMinimum;
newPlotCurveConf->yMaximum = currentPlotCurveConf->yMaximum; newPlotCurveConf->yMaximum = currentPlotCurveConf->yMaximum;
@ -157,6 +159,7 @@ void ScopeGadgetConfiguration::saveConfig(QSettings* qSettings) const {
qSettings->setValue("uavField", plotCurveConf->uavField); qSettings->setValue("uavField", plotCurveConf->uavField);
qSettings->setValue("color", plotCurveConf->color); qSettings->setValue("color", plotCurveConf->color);
qSettings->setValue("yScalePower", plotCurveConf->yScalePower); qSettings->setValue("yScalePower", plotCurveConf->yScalePower);
qSettings->setValue("yInterpolationSamples", plotCurveConf->yInterpolationSamples);
qSettings->setValue("yMinimum", plotCurveConf->yMinimum); qSettings->setValue("yMinimum", plotCurveConf->yMinimum);
qSettings->setValue("yMaximum", plotCurveConf->yMaximum); qSettings->setValue("yMaximum", plotCurveConf->yMaximum);

View File

@ -41,6 +41,7 @@ struct PlotCurveConfiguration
QString uavField; QString uavField;
int yScalePower; //This is the power to which each value must be raised int yScalePower; //This is the power to which each value must be raised
QRgb color; QRgb color;
int yInterpolationSamples;
double yMinimum; double yMinimum;
double yMaximum; double yMaximum;
}; };

View File

@ -101,9 +101,10 @@ QWidget* ScopeGadgetOptionsPage::createPage(QWidget *parent)
QString uavObject = plotData->uavObject; QString uavObject = plotData->uavObject;
QString uavField = plotData->uavField; QString uavField = plotData->uavField;
int scale = plotData->yScalePower; int scale = plotData->yScalePower;
int interpolation = plotData->yInterpolationSamples;
QVariant varColor = plotData->color; QVariant varColor = plotData->color;
addPlotCurveConfig(uavObject,uavField,scale,varColor); addPlotCurveConfig(uavObject,uavField,scale,interpolation,varColor);
} }
if(m_config->plotCurveConfigs().count() > 0) if(m_config->plotCurveConfigs().count() > 0)
@ -163,6 +164,10 @@ void ScopeGadgetOptionsPage::setYAxisWidgetFromPlotCurve()
int rgb = varColor.toInt(&parseOK); int rgb = varColor.toInt(&parseOK);
setButtonColor(QColor((QRgb)rgb)); setButtonColor(QColor((QRgb)rgb));
int interpolation = listItem->data(Qt::UserRole + 4).toInt(&parseOK);
if(!parseOK) interpolation = 1;
options_page->spnInterpolationSamples->setValue(interpolation);
} }
void ScopeGadgetOptionsPage::setButtonColor(const QColor &color) void ScopeGadgetOptionsPage::setButtonColor(const QColor &color)
@ -235,6 +240,10 @@ void ScopeGadgetOptionsPage::apply()
newPlotCurveConfigs->color = QColor(Qt::black).rgb(); newPlotCurveConfigs->color = QColor(Qt::black).rgb();
else else
newPlotCurveConfigs->color = (QRgb)rgb; newPlotCurveConfigs->color = (QRgb)rgb;
newPlotCurveConfigs->yInterpolationSamples = listItem->data(Qt::UserRole + 4).toInt(&parseOK);
if(!parseOK)
newPlotCurveConfigs->yInterpolationSamples = 1;
plotCurveConfigs.append(newPlotCurveConfigs); plotCurveConfigs.append(newPlotCurveConfigs);
} }
@ -261,6 +270,7 @@ void ScopeGadgetOptionsPage::on_btnAddCurve_clicked()
if(!parseOK) if(!parseOK)
scale = 0; scale = 0;
int interpolation = options_page->spnInterpolationSamples->value();
QVariant varColor = (int)QColor(options_page->btnColor->text()).rgb(); QVariant varColor = (int)QColor(options_page->btnColor->text()).rgb();
@ -270,27 +280,27 @@ void ScopeGadgetOptionsPage::on_btnAddCurve_clicked()
options_page->lstCurves->currentItem()->text() == uavObject + "." + uavField) options_page->lstCurves->currentItem()->text() == uavObject + "." + uavField)
{ {
QListWidgetItem *listWidgetItem = options_page->lstCurves->currentItem(); QListWidgetItem *listWidgetItem = options_page->lstCurves->currentItem();
setCurvePlotProperties(listWidgetItem,uavObject,uavField,scale,varColor); setCurvePlotProperties(listWidgetItem,uavObject,uavField,scale,interpolation,varColor);
}else }else
{ {
addPlotCurveConfig(uavObject,uavField,scale,varColor); addPlotCurveConfig(uavObject,uavField,scale,interpolation,varColor);
options_page->lstCurves->setCurrentRow(options_page->lstCurves->count() - 1); options_page->lstCurves->setCurrentRow(options_page->lstCurves->count() - 1);
} }
} }
void ScopeGadgetOptionsPage::addPlotCurveConfig(QString uavObject, QString uavField, int scale, QVariant varColor) void ScopeGadgetOptionsPage::addPlotCurveConfig(QString uavObject, QString uavField, int scale, int interpolation, QVariant varColor)
{ {
//Add a new curve config to the list //Add a new curve config to the list
QString listItemDisplayText = uavObject + "." + uavField; QString listItemDisplayText = uavObject + "." + uavField;
options_page->lstCurves->addItem(listItemDisplayText); options_page->lstCurves->addItem(listItemDisplayText);
QListWidgetItem *listWidgetItem = options_page->lstCurves->item(options_page->lstCurves->count() - 1); QListWidgetItem *listWidgetItem = options_page->lstCurves->item(options_page->lstCurves->count() - 1);
setCurvePlotProperties(listWidgetItem,uavObject,uavField,scale,varColor); setCurvePlotProperties(listWidgetItem,uavObject,uavField,scale,interpolation,varColor);
} }
void ScopeGadgetOptionsPage::setCurvePlotProperties(QListWidgetItem *listWidgetItem,QString uavObject, QString uavField, int scale, QVariant varColor) void ScopeGadgetOptionsPage::setCurvePlotProperties(QListWidgetItem *listWidgetItem,QString uavObject, QString uavField, int scale, int interpolation, QVariant varColor)
{ {
bool parseOK = false; bool parseOK = false;
@ -306,6 +316,7 @@ void ScopeGadgetOptionsPage::setCurvePlotProperties(QListWidgetItem *listWidgetI
listWidgetItem->setData(Qt::UserRole + 1,QVariant(uavField)); listWidgetItem->setData(Qt::UserRole + 1,QVariant(uavField));
listWidgetItem->setData(Qt::UserRole + 2,QVariant(scale)); listWidgetItem->setData(Qt::UserRole + 2,QVariant(scale));
listWidgetItem->setData(Qt::UserRole + 3,varColor); listWidgetItem->setData(Qt::UserRole + 3,varColor);
listWidgetItem->setData(Qt::UserRole + 4,QVariant(interpolation));
} }
/*! /*!

View File

@ -66,8 +66,8 @@ private:
Ui::ScopeGadgetOptionsPage *options_page; Ui::ScopeGadgetOptionsPage *options_page;
ScopeGadgetConfiguration *m_config; ScopeGadgetConfiguration *m_config;
void addPlotCurveConfig(QString uavObject, QString uavField, int scale, QVariant varColor); void addPlotCurveConfig(QString uavObject, QString uavField, int scale, int interpolation, QVariant varColor);
void setCurvePlotProperties(QListWidgetItem *listWidgetItem, QString uavObject, QString uavField, int scale, QVariant varColor); void setCurvePlotProperties(QListWidgetItem *listWidgetItem, QString uavObject, QString uavField, int scale, int interpolation, QVariant varColor);
void setYAxisWidgetFromPlotCurve(); void setYAxisWidgetFromPlotCurve();
void setButtonColor(const QColor &color); void setButtonColor(const QColor &color);

View File

@ -159,6 +159,32 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="9" column="0">
<widget class="QLabel" name="label_10">
<property name="text">
<string>Display smoothed interpolation:</string>
</property>
</widget>
</item>
<item row="9" column="1">
<widget class="QSpinBox" name="spnInterpolationSamples">
<property name="suffix">
<string> samples</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
<number>1001</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>1</number>
</property>
</widget>
</item>
</layout> </layout>
</item> </item>
<item> <item>
@ -268,7 +294,7 @@ Update</string>
<item> <item>
<widget class="QCheckBox" name="LoggingEnable"> <widget class="QCheckBox" name="LoggingEnable">
<property name="text"> <property name="text">
<string>Log data to csv file</string> <string>Log data to csv file (not interpolated)</string>
</property> </property>
</widget> </widget>
</item> </item>

View File

@ -356,7 +356,7 @@ void ScopeGadgetWidget::setupChronoPlot()
// scaleWidget->setMinBorderDist(0, fmw); // scaleWidget->setMinBorderDist(0, fmw);
} }
void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavFieldSubField, int scaleOrderFactor, QPen pen) void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavFieldSubField, int scaleOrderFactor, int interpolationSamples, QPen pen)
{ {
PlotData* plotData; PlotData* plotData;
@ -369,6 +369,7 @@ void ScopeGadgetWidget::addCurvePlot(QString uavObject, QString uavFieldSubField
plotData->m_xWindowSize = m_xWindowSize; plotData->m_xWindowSize = m_xWindowSize;
plotData->scalePower = scaleOrderFactor; plotData->scalePower = scaleOrderFactor;
plotData->interpolationSamples = interpolationSamples;
//If the y-bounds are supplied, set them //If the y-bounds are supplied, set them
if (plotData->yMinimum != plotData->yMaximum) if (plotData->yMinimum != plotData->yMaximum)
@ -446,6 +447,7 @@ void ScopeGadgetWidget::uavObjectReceived(UAVObject* obj)
foreach(PlotData* plotData, m_curvesData.values()) { foreach(PlotData* plotData, m_curvesData.values()) {
if (plotData->append(obj)) m_csvLoggingDataUpdated=1; if (plotData->append(obj)) m_csvLoggingDataUpdated=1;
} }
csvLoggingAddData();
} }
void ScopeGadgetWidget::replotNewData() void ScopeGadgetWidget::replotNewData()
@ -609,6 +611,7 @@ int ScopeGadgetWidget::csvLoggingStart()
m_csvLoggingStartTime = NOW; m_csvLoggingStartTime = NOW;
m_csvLoggingHeaderSaved=0; m_csvLoggingHeaderSaved=0;
m_csvLoggingDataSaved=0; m_csvLoggingDataSaved=0;
m_csvLoggingBuffer.clear();
QDir PathCheck(m_csvLoggingPath); QDir PathCheck(m_csvLoggingPath);
if (!PathCheck.exists()) if (!PathCheck.exists())
{ {
@ -676,13 +679,50 @@ int ScopeGadgetWidget::csvLoggingInsertHeader()
return 0; return 0;
} }
int ScopeGadgetWidget::csvLoggingAddData()
{
if (!m_csvLoggingStarted) return -1;
m_csvLoggingDataValid=0;
QDateTime NOW = QDateTime::currentDateTime();
QString tempString;
QTextStream ss( &tempString );
ss << NOW.toString("yyyy-MM-dd") << ", " << NOW.toString("hh:mm:ss.z") << ", " ;
#if QT_VERSION >= 0x040700
ss <<(NOW.toMSecsSinceEpoch() - m_csvLoggingStartTime.toMSecsSinceEpoch())/1000.00;
#else
ss <<(NOW.toTime_t() - m_csvLoggingStartTime.toTime_t());
#endif
ss << ", " << m_csvLoggingConnected << ", " << m_csvLoggingDataUpdated;
m_csvLoggingDataUpdated=0;
foreach(PlotData* plotData2, m_curvesData.values())
{
ss << ", ";
if (plotData2->xData->isEmpty ())
{
}
else
{
ss << QString().sprintf("%3.6g",plotData2->yDataHistory->last()/pow(10,plotData2->scalePower));
m_csvLoggingDataValid=1;
}
}
ss << endl;
if (m_csvLoggingDataValid)
{
QTextStream ts( &m_csvLoggingBuffer );
ts << tempString;
}
return 0;
}
int ScopeGadgetWidget::csvLoggingInsertData() int ScopeGadgetWidget::csvLoggingInsertData()
{ {
if (!m_csvLoggingStarted) return -1; if (!m_csvLoggingStarted) return -1;
m_csvLoggingDataSaved=1; m_csvLoggingDataSaved=1;
m_csvLoggingDataValid=0;
QDateTime NOW = QDateTime::currentDateTime();
QString tempString;
if(m_csvLoggingFile.open(QIODevice::WriteOnly | QIODevice::Append)== FALSE) if(m_csvLoggingFile.open(QIODevice::WriteOnly | QIODevice::Append)== FALSE)
{ {
@ -690,38 +730,11 @@ int ScopeGadgetWidget::csvLoggingInsertData()
} }
else else
{ {
QTextStream ss( &tempString ); QTextStream ts( &m_csvLoggingFile );
ss << NOW.toString("yyyy-MM-dd") << ", " << NOW.toString("hh:mm:ss.z") << ", " ; ts << m_csvLoggingBuffer;
#if QT_VERSION >= 0x040700
ss <<(NOW.toMSecsSinceEpoch() - m_csvLoggingStartTime.toMSecsSinceEpoch())/1000.00;
#else
ss <<(NOW.toTime_t() - m_csvLoggingStartTime.toTime_t());
#endif
ss << ", " << m_csvLoggingConnected << ", " << m_csvLoggingDataUpdated;
m_csvLoggingDataUpdated=0;
foreach(PlotData* plotData2, m_curvesData.values())
{
ss << ", ";
if (plotData2->xData->isEmpty ())
{
}
else
{
ss << QString().sprintf("%3.6g",plotData2->yData->last()/pow(10,plotData2->scalePower));
m_csvLoggingDataValid=1;
}
}
ss << endl;
if (m_csvLoggingDataValid)
{
QTextStream ts( &m_csvLoggingFile );
ts << tempString;
}
m_csvLoggingFile.close(); m_csvLoggingFile.close();
} }
m_csvLoggingBuffer.clear();
return 0; return 0;
} }

View File

@ -110,7 +110,7 @@ public:
int refreshInterval(){return m_refreshInterval;} int refreshInterval(){return m_refreshInterval;}
void addCurvePlot(QString uavObject, QString uavFieldSubField, int scaleOrderFactor = 0, QPen pen = QPen(Qt::black)); void addCurvePlot(QString uavObject, QString uavFieldSubField, int scaleOrderFactor = 0, int interpolationSamples = 1, QPen pen = QPen(Qt::black));
//void removeCurvePlot(QString uavObject, QString uavField); //void removeCurvePlot(QString uavObject, QString uavField);
void clearCurvePlots(); void clearCurvePlots();
int csvLoggingStart(); int csvLoggingStart();
@ -166,11 +166,13 @@ private:
QString m_csvLoggingName; QString m_csvLoggingName;
QString m_csvLoggingPath; QString m_csvLoggingPath;
QString m_csvLoggingBuffer;
QFile m_csvLoggingFile; QFile m_csvLoggingFile;
QMutex mutex; QMutex mutex;
int csvLoggingInsertHeader(); int csvLoggingInsertHeader();
int csvLoggingAddData();
int csvLoggingInsertData(); int csvLoggingInsertData();
void deleteLegend(); void deleteLegend();

View File

@ -492,6 +492,45 @@ QVariant UAVObjectField::getValue(quint32 index)
return QVariant(); return QVariant();
} }
bool UAVObjectField::checkValue(const QVariant& value, quint32 index)
{
QMutexLocker locker(obj->getMutex());
// Check that index is not out of bounds
if ( index >= numElements )
{
return false;
}
// Get metadata
UAVObject::Metadata mdata = obj->getMetadata();
// Update value if the access mode permits
if ( mdata.gcsAccess == UAVObject::ACCESS_READWRITE )
{
switch (type)
{
case INT8:
case INT16:
case INT32:
case UINT8:
case UINT16:
case UINT32:
case FLOAT32:
case STRING:
return true;
break;
case ENUM:
{
qint8 tmpenum = options.indexOf( value.toString() );
return ((tmpenum < 0) ? false : true);
break;
}
default:
qDebug() << "checkValue: other types" << type;
Q_ASSERT(0); // To catch any programming errors where we tried to test invalid values
break;
}
}
}
void UAVObjectField::setValue(const QVariant& value, quint32 index) void UAVObjectField::setValue(const QVariant& value, quint32 index)
{ {
QMutexLocker locker(obj->getMutex()); QMutexLocker locker(obj->getMutex());

View File

@ -56,6 +56,7 @@ public:
qint32 pack(quint8* dataOut); qint32 pack(quint8* dataOut);
qint32 unpack(const quint8* dataIn); qint32 unpack(const quint8* dataIn);
QVariant getValue(quint32 index = 0); QVariant getValue(quint32 index = 0);
bool checkValue(const QVariant& data, quint32 index = 0);
void setValue(const QVariant& data, quint32 index = 0); void setValue(const QVariant& data, quint32 index = 0);
double getDouble(quint32 index = 0); double getDouble(quint32 index = 0);
void setDouble(double value, quint32 index = 0); void setDouble(double value, quint32 index = 0);

View File

@ -153,6 +153,7 @@ void UAVSettingsImportExportFactory::importUAVSettings()
// - Update each field // - Update each field
// - Issue and "updated" command // - Issue and "updated" command
bool error=false; bool error=false;
bool setError=false;
QDomNode field = node.firstChild(); QDomNode field = node.firstChild();
while(!field.isNull()) { while(!field.isNull()) {
QDomElement f = field.toElement(); QDomElement f = field.toElement();
@ -161,16 +162,24 @@ void UAVSettingsImportExportFactory::importUAVSettings()
if (uavfield) { if (uavfield) {
QStringList list = f.attribute("values").split(","); QStringList list = f.attribute("values").split(",");
if (list.length() == 1) { if (list.length() == 1) {
uavfield->setValue(f.attribute("values")); if (false == uavfield->checkValue(f.attribute("values"))) {
qDebug() << "checkValue returned false on: " << uavObjectName << f.attribute("values");
setError = true;
} else
uavfield->setValue(f.attribute("values"));
} else { } else {
// This is an enum: // This is an enum:
int i=0; int i=0;
QStringList list = f.attribute("values").split(","); QStringList list = f.attribute("values").split(",");
foreach (QString element, list) { foreach (QString element, list) {
uavfield->setValue(element,i++); if (false == uavfield->checkValue(element,i)) {
qDebug() << "checkValue(list) returned false on: " << uavObjectName << list;
setError = true;
} else
uavfield->setValue(element,i);
i++;
} }
} }
error = false;
} else { } else {
error = true; error = true;
} }
@ -183,7 +192,9 @@ void UAVSettingsImportExportFactory::importUAVSettings()
} else if (uavObjectID != obj->getObjID()) { } else if (uavObjectID != obj->getObjID()) {
qDebug() << "Mismatch for Object " << uavObjectName << uavObjectID << " - " << obj->getObjID(); qDebug() << "Mismatch for Object " << uavObjectName << uavObjectID << " - " << obj->getObjID();
swui.addLine(uavObjectName, "Warning (ObjectID mismatch)", true); swui.addLine(uavObjectName, "Warning (ObjectID mismatch)", true);
} else } else if (setError) {
swui.addLine(uavObjectName, "Warning (Objects field value(s) invalid)", false);
} else
swui.addLine(uavObjectName, "OK", true); swui.addLine(uavObjectName, "OK", true);
} }
} }

View File

@ -80,30 +80,41 @@ DFUObject::DFUObject(bool _debug,bool _use_serial,QString portname):
} }
else else
{ {
mready = false;
QEventLoop m_eventloop; QEventLoop m_eventloop;
QTimer::singleShot(200,&m_eventloop, SLOT(quit())); QTimer::singleShot(200,&m_eventloop, SLOT(quit()));
m_eventloop.exec(); m_eventloop.exec();
QList<USBPortInfo> devices; QList<USBPortInfo> devices;
devices = USBMonitor::instance()->availableDevices(0x20a0,-1,-1,USBMonitor::Bootloader); devices = USBMonitor::instance()->availableDevices(0x20a0,-1,-1,USBMonitor::Bootloader);
if (devices.length()==1) { if (devices.length()==1 && hidHandle.open(1,devices.first().vendorID,devices.first().productID,0,0)==1) {
hidHandle.open(1,devices.first().vendorID,devices.first().productID,0,0);
qDebug()<<"OP_DFU detected first time"; qDebug()<<"OP_DFU detected first time";
mready=true;
} else { } else {
// Wait for the board to appear on the USB bus: // Wait for the board to appear on the USB bus:
connect(USBMonitor::instance(), SIGNAL(deviceDiscovered(USBPortInfo)),&m_eventloop, SLOT(quit())); USBSignalFilter filter(0x20a0,-1,-1,USBMonitor::Bootloader);
QTimer::singleShot(15000,&m_eventloop, SLOT(quit())); connect(&filter, SIGNAL(deviceDiscovered()),&m_eventloop, SLOT(quit()));
m_eventloop.exec(); for(int x=0;x<4;++x)
disconnect(USBMonitor::instance(), SIGNAL(deviceDiscovered(USBPortInfo)),&m_eventloop, SLOT(quit())); {
devices = USBMonitor::instance()->availableDevices(0x20a0,-1,-1,USBMonitor::Bootloader); qDebug()<<"OP_DFU trying to detect bootloader:"<<x;
if (devices.length()==1) {
QTimer::singleShot(1000,&m_eventloop, SLOT(quit())); if(x==0)
m_eventloop.exec(); QTimer::singleShot(10000,&m_eventloop, SLOT(quit()));
hidHandle.open(1,devices.first().vendorID,devices.first().productID,0,0); else
qDebug()<<"OP_DFU detected after delay"; QTimer::singleShot(2000,&m_eventloop, SLOT(quit()));
} m_eventloop.exec();
else { devices = USBMonitor::instance()->availableDevices(0x20a0,-1,-1,USBMonitor::Bootloader);
qDebug() << devices.length() << " device(s) detected, don't know what to do!"; if (devices.length()==1) {
mready = false; if(hidHandle.open(1,devices.first().vendorID,devices.first().productID,0,0)==1)
{
qDebug()<<"OP_DFU detected after delay";
mready=true;
break;
}
}
else {
qDebug() << devices.length() << " device(s) detected, don't know what to do!";
mready = false;
}
} }
} }

View File

@ -4,6 +4,7 @@
#include <QByteArray> #include <QByteArray>
#include <rawhid/pjrc_rawhid.h> #include <rawhid/pjrc_rawhid.h>
#include <rawhid/usbmonitor.h> #include <rawhid/usbmonitor.h>
#include <rawhid/usbsignalfilter.h>
#include <QDebug> #include <QDebug>
#include <QFile> #include <QFile>
#include <QThread> #include <QThread>

View File

@ -205,6 +205,9 @@ QString UAVObjectParser::parseXML(QString& xml, QString& filename)
// Get next element // Get next element
childNode = childNode.nextSibling(); childNode = childNode.nextSibling();
} }
// Sort all fields according to size
qStableSort(info->fields.begin(), info->fields.end(), fieldTypeLessThan);
// Sort all fields according to size // Sort all fields according to size
qStableSort(info->fields.begin(), info->fields.end(), fieldTypeLessThan); qStableSort(info->fields.begin(), info->fields.end(), fieldTypeLessThan);

Binary file not shown.

View File

@ -30,8 +30,10 @@ cp "${ROOT_DIR}/HISTORY.txt" "/Volumes/${VOL_NAME}"
hdiutil detach ${device} hdiutil detach ${device}
echo "Resizing dmg" min=`hdiutil resize ${TEMP_FILE} | awk \{print\ \$\1\}`
hdiutil resize -size 250m ${TEMP_FILE} echo "Resizing dmg to ${min}"
hdiutil resize -sectors ${min} ${TEMP_FILE}
hdiutil convert "${TEMP_FILE}" -format UDZO -o "${OUT_FILE}" hdiutil convert "${TEMP_FILE}" -format UDZO -o "${OUT_FILE}"
# cleanup # cleanup