From 848277141a1bfb4ecce0b650e62ad3b8524739ad Mon Sep 17 00:00:00 2001 From: Leon Styhre Date: Mon, 11 Oct 2021 21:28:37 +0200 Subject: [PATCH] Optimized the badges code. Also made a small adjustment to the alternative emulator badge. --- .../views/gamelist/DetailedGameListView.cpp | 24 +- .../src/views/gamelist/VideoGameListView.cpp | 24 +- es-core/src/components/BadgesComponent.cpp | 129 +++--- es-core/src/components/BadgesComponent.h | 24 +- es-core/src/components/FlexboxComponent.cpp | 100 ++--- es-core/src/components/FlexboxComponent.h | 54 +-- resources/graphics/badge_altemulator.svg | 388 +++++++++--------- 7 files changed, 360 insertions(+), 383 deletions(-) diff --git a/es-app/src/views/gamelist/DetailedGameListView.cpp b/es-app/src/views/gamelist/DetailedGameListView.cpp index 24c1450a9..f8ab72d50 100644 --- a/es-app/src/views/gamelist/DetailedGameListView.cpp +++ b/es-app/src/views/gamelist/DetailedGameListView.cpp @@ -404,17 +404,19 @@ void DetailedGameListView::updateInfoPanel() mGenre.setValue(file->metadata.get("genre")); mPlayers.setValue(file->metadata.get("players")); - // Generate badges slots value based on the game metadata. - std::stringstream ss; - ss << (file->metadata.get("favorite").compare("true") ? "" : "favorite "); - ss << (file->metadata.get("completed").compare("true") ? "" : "completed "); - ss << (file->metadata.get("kidgame").compare("true") ? "" : "kidgame "); - ss << (file->metadata.get("broken").compare("true") ? "" : "broken "); - ss << (file->metadata.get("altemulator").compare("") ? "altemulator " : ""); - std::string slots = ss.str(); - if (!slots.empty()) - slots.pop_back(); - mBadges.setValue(slots); + // Populate the badge slots based on game metadata. + std::vector badgeSlots; + for (auto badge : mBadges.getBadgeTypes()) { + if (badge == "altemulator") { + if (file->metadata.get(badge).compare("") != 0) + badgeSlots.push_back(badge); + } + else { + if (file->metadata.get(badge).compare("true") == 0) + badgeSlots.push_back(badge); + } + } + mBadges.setBadges(badgeSlots); mName.setValue(file->metadata.get("name")); diff --git a/es-app/src/views/gamelist/VideoGameListView.cpp b/es-app/src/views/gamelist/VideoGameListView.cpp index acff97747..3f5af0828 100644 --- a/es-app/src/views/gamelist/VideoGameListView.cpp +++ b/es-app/src/views/gamelist/VideoGameListView.cpp @@ -445,17 +445,19 @@ void VideoGameListView::updateInfoPanel() mGenre.setValue(file->metadata.get("genre")); mPlayers.setValue(file->metadata.get("players")); - // Generate badges slots value based on the game metadata. - std::stringstream ss; - ss << (file->metadata.get("favorite").compare("true") ? "" : "favorite "); - ss << (file->metadata.get("completed").compare("true") ? "" : "completed "); - ss << (file->metadata.get("kidgame").compare("true") ? "" : "kidgame "); - ss << (file->metadata.get("broken").compare("true") ? "" : "broken "); - ss << (file->metadata.get("altemulator").compare("") ? "altemulator " : ""); - std::string slots = ss.str(); - if (!slots.empty()) - slots.pop_back(); - mBadges.setValue(slots); + // Populate the badge slots based on game metadata. + std::vector badgeSlots; + for (auto badge : mBadges.getBadgeTypes()) { + if (badge == "altemulator") { + if (file->metadata.get(badge).compare("") != 0) + badgeSlots.push_back(badge); + } + else { + if (file->metadata.get(badge).compare("true") == 0) + badgeSlots.push_back(badge); + } + } + mBadges.setBadges(badgeSlots); mName.setValue(file->metadata.get("name")); diff --git a/es-core/src/components/BadgesComponent.cpp b/es-core/src/components/BadgesComponent.cpp index 1d6ebfaab..6a16f8722 100644 --- a/es-core/src/components/BadgesComponent.cpp +++ b/es-core/src/components/BadgesComponent.cpp @@ -7,72 +7,55 @@ // Used by gamelist views. // +#define SLOT_FAVORITE "favorite" +#define SLOT_COMPLETED "completed" +#define SLOT_KIDGAME "kidgame" +#define SLOT_BROKEN "broken" +#define SLOT_ALTERNATIVE_EMULATOR "altemulator" + #include "components/BadgesComponent.h" -#include "Settings.h" #include "ThemeData.h" -#include "resources/TextureResource.h" - -// Available slot definitions. -std::vector BadgesComponent::mSlots = {SLOT_FAVORITE, SLOT_COMPLETED, SLOT_KIDS, - SLOT_BROKEN, SLOT_ALTERNATIVE_EMULATOR}; +#include "utils/StringUtil.h" BadgesComponent::BadgesComponent(Window* window) - : FlexboxComponent(window) + : FlexboxComponent{window, mBadgeImages} + , mBadgeTypes{ + {SLOT_FAVORITE, SLOT_COMPLETED, SLOT_KIDGAME, SLOT_BROKEN, SLOT_ALTERNATIVE_EMULATOR}} { mBadgeIcons[SLOT_FAVORITE] = ":/graphics/badge_favorite.svg"; mBadgeIcons[SLOT_COMPLETED] = ":/graphics/badge_completed.svg"; - mBadgeIcons[SLOT_KIDS] = ":/graphics/badge_kidgame.svg"; + mBadgeIcons[SLOT_KIDGAME] = ":/graphics/badge_kidgame.svg"; mBadgeIcons[SLOT_BROKEN] = ":/graphics/badge_broken.svg"; mBadgeIcons[SLOT_ALTERNATIVE_EMULATOR] = ":/graphics/badge_altemulator.svg"; - - ImageComponent mImageFavorite = ImageComponent(window); - mImageComponents.insert({SLOT_FAVORITE, mImageFavorite}); - ImageComponent mImageCompleted = ImageComponent(window); - mImageComponents.insert({SLOT_COMPLETED, mImageCompleted}); - ImageComponent mImageKids = ImageComponent(window); - mImageComponents.insert({SLOT_KIDS, mImageKids}); - ImageComponent mImageBroken = ImageComponent(window); - mImageComponents.insert({SLOT_BROKEN, mImageBroken}); - ImageComponent mImageAltEmulator = ImageComponent(window); - mImageComponents.insert({SLOT_ALTERNATIVE_EMULATOR, mImageAltEmulator}); } -BadgesComponent::~BadgesComponent() +void BadgesComponent::setBadges(const std::vector& badges) { - for (GuiComponent* c : mChildren) - c->clearChildren(); - clearChildren(); - mBadgeIcons.clear(); - mImageComponents.clear(); -} + std::map prevVisibility; -void BadgesComponent::setValue(const std::string& value) -{ - mChildren.clear(); - if (!value.empty()) { - std::string temp; - std::istringstream ss(value); - while (std::getline(ss, temp, ' ')) { - if (!(temp == SLOT_FAVORITE || temp == SLOT_COMPLETED || temp == SLOT_KIDS || - temp == SLOT_BROKEN || temp == SLOT_ALTERNATIVE_EMULATOR)) - LOG(LogError) << "Badge slot '" << temp << "' is invalid."; - else if (std::find(mSlots.begin(), mSlots.end(), temp) != mSlots.end()) - mChildren.push_back(&mImageComponents.find(temp)->second); - } + // Save the visibility status to know whether any badges changed. + for (auto& image : mBadgeImages) { + prevVisibility[image.first] = image.second.isVisible(); + image.second.setVisible(false); } - onSizeChanged(); -} + for (auto& badge : badges) { + auto it = std::find_if( + mBadgeImages.begin(), mBadgeImages.end(), + [badge](std::pair image) { return image.first == badge; }); -std::string BadgesComponent::getValue() const -{ - std::stringstream ss; - for (auto& slot : mSlots) - ss << slot << ' '; - std::string r = ss.str(); - r.pop_back(); - return r; + if (it != mBadgeImages.cend()) + it->second.setVisible(true); + } + + // Only recalculate the flexbox if any badges changed. + for (auto& image : mBadgeImages) { + if (prevVisibility[image.first] != image.second.isVisible()) { + onSizeChanged(); + break; + } + } } void BadgesComponent::applyTheme(const std::shared_ptr& theme, @@ -82,39 +65,31 @@ void BadgesComponent::applyTheme(const std::shared_ptr& theme, { using namespace ThemeFlags; - const ThemeData::ThemeElement* elem = theme->getElement(view, element, "badges"); + const ThemeData::ThemeElement* elem{theme->getElement(view, element, "badges")}; if (!elem) return; - for (auto& slot : mSlots) { - if (properties & PATH && elem->has(slot)) { - mBadgeIcons[slot] = elem->get(slot); - mImageComponents.find(slot)->second.setImage(mBadgeIcons[slot]); - } - else { - mImageComponents.find(slot)->second.setImage(mBadgeIcons[slot]); - std::string teststring; - } - } - if (elem->has("slots")) { - auto value = elem->get("slots"); - mSlots = {}; - if (!value.empty()) { - std::string temp; - std::istringstream ss(value); - while (std::getline(ss, temp, ' ')) { - if (!(temp == SLOT_FAVORITE || temp == SLOT_COMPLETED || temp == SLOT_KIDS || - temp == SLOT_BROKEN || temp == SLOT_ALTERNATIVE_EMULATOR)) - LOG(LogError) << "Badge slot '" << temp << "' is invalid."; - else - mSlots.push_back(temp); + std::vector slots = Utils::String::delimitedStringToVector( + Utils::String::toLower(elem->get("slots")), " "); + + for (auto slot : slots) { + if (std::find(mBadgeTypes.cbegin(), mBadgeTypes.cend(), slot) != mBadgeTypes.end()) { + if (properties & PATH && elem->has(slot)) + mBadgeIcons[slot] = elem->get(slot); + + ImageComponent badgeImage{mWindow}; + + badgeImage.setImage(mBadgeIcons[slot]); + badgeImage.setVisible(false); + mBadgeImages.push_back(std::make_pair(slot, badgeImage)); + } + else { + LOG(LogError) << "Invalid badge slot \"" << slot << "\" defined"; } } + + // Apply theme on the flexbox component parent. + FlexboxComponent::applyTheme(theme, view, element, properties); } - - // Apply theme on the flexbox component parent. - FlexboxComponent::applyTheme(theme, view, element, properties); - - onSizeChanged(); } diff --git a/es-core/src/components/BadgesComponent.h b/es-core/src/components/BadgesComponent.h index e7412233a..3b140b742 100644 --- a/es-core/src/components/BadgesComponent.h +++ b/es-core/src/components/BadgesComponent.h @@ -11,30 +11,14 @@ #define ES_CORE_COMPONENTS_BADGES_COMPONENT_H #include "FlexboxComponent.h" -#include "GuiComponent.h" -#include "ImageComponent.h" -#include "renderers/Renderer.h" - -#define NUM_SLOTS 4 -#define SLOT_FAVORITE "favorite" -#define SLOT_COMPLETED "completed" -#define SLOT_KIDS "kidgame" -#define SLOT_BROKEN "broken" -#define SLOT_ALTERNATIVE_EMULATOR "altemulator" - -class TextureResource; class BadgesComponent : public FlexboxComponent { public: BadgesComponent(Window* window); - ~BadgesComponent(); - static std::shared_ptr& getInstance(); - - std::string getValue() const override; - // Should be a list of strings. - void setValue(const std::string& value) override; + std::vector getBadgeTypes() { return mBadgeTypes; } + void setBadges(const std::vector& badges); virtual void applyTheme(const std::shared_ptr& theme, const std::string& view, @@ -42,9 +26,9 @@ public: unsigned int properties) override; private: - static std::vector mSlots; + std::vector mBadgeTypes; std::map mBadgeIcons; - std::map mImageComponents; + std::vector> mBadgeImages; }; #endif // ES_CORE_COMPONENTS_BADGES_COMPONENT_H diff --git a/es-core/src/components/FlexboxComponent.cpp b/es-core/src/components/FlexboxComponent.cpp index df65694da..95d41920f 100644 --- a/es-core/src/components/FlexboxComponent.cpp +++ b/es-core/src/components/FlexboxComponent.cpp @@ -7,35 +7,41 @@ // Used by gamelist views. // -#include "components/FlexboxComponent.h" -#include "Settings.h" -#include "ThemeData.h" -#include "resources/TextureResource.h" +#define DEFAULT_DIRECTION Direction::row +#define DEFAULT_ALIGN Align::center +#define DEFAULT_ITEMS_PER_LINE 4 +#define DEFAULT_LINES 1 +#define DEFAULT_MARGIN_X 10.0f +#define DEFAULT_MARGIN_Y 10.0f -FlexboxComponent::FlexboxComponent(Window* window) - : GuiComponent(window) - , mDirection(DEFAULT_DIRECTION) - , mAlign(DEFAULT_ALIGN) - , mItemsPerLine(DEFAULT_ITEMS_PER_LINE) - , mLines(DEFAULT_LINES) - , mItemMargin({DEFAULT_MARGIN_X, DEFAULT_MARGIN_Y}) - , mLayoutValid(false) +#include "components/FlexboxComponent.h" + +#include "ThemeData.h" + +FlexboxComponent::FlexboxComponent(Window* window, + std::vector>& images) + : GuiComponent{window} + , mDirection{DEFAULT_DIRECTION} + , mAlign{DEFAULT_ALIGN} + , mImages(images) + , mItemsPerLine{DEFAULT_ITEMS_PER_LINE} + , mLines{DEFAULT_LINES} + , mItemMargin{glm::vec2{DEFAULT_MARGIN_X, DEFAULT_MARGIN_Y}} + , mLayoutValid{false} { } -void FlexboxComponent::onSizeChanged() { mLayoutValid = false; } - void FlexboxComponent::computeLayout() { // Start placing items in the top-left. - float anchorX = 0; - float anchorY = 0; - float anchorOriginX = 0; - float anchorOriginY = 0; + float anchorX{0.0f}; + float anchorY{0.0f}; + float anchorOriginX{0.0f}; + float anchorOriginY{0.0f}; // Translation directions when placing items. - glm::ivec2 directionLine = {1, 0}; - glm::ivec2 directionRow = {0, 1}; + glm::ivec2 directionLine{1, 0}; + glm::ivec2 directionRow{0, 1}; // Change direction. if (mDirection == Direction::column) { @@ -43,21 +49,23 @@ void FlexboxComponent::computeLayout() directionRow = {1, 0}; } - // Compute children maximal dimensions. + // Compute maximum image dimensions. glm::vec2 grid; if (mDirection == Direction::row) grid = {mItemsPerLine, mLines}; else grid = {mLines, mItemsPerLine}; - glm::vec2 maxItemSize = (mSize + mItemMargin - grid * mItemMargin) / grid; + glm::vec2 maxItemSize{(mSize + mItemMargin - grid * mItemMargin) / grid}; - // Set final children dimensions. - for (auto i : mChildren) { - auto oldSize = i->getSize(); + // Set final image dimensions. + for (auto& image : mImages) { + if (!image.second.isVisible()) + continue; + auto oldSize{image.second.getSize()}; if (oldSize.x == 0) oldSize.x = maxItemSize.x; - glm::vec2 sizeMaxX = {maxItemSize.x, oldSize.y * (maxItemSize.x / oldSize.x)}; - glm::vec2 sizeMaxY = {oldSize.x * (maxItemSize.y / oldSize.y), maxItemSize.y}; + glm::vec2 sizeMaxX{maxItemSize.x, oldSize.y * (maxItemSize.x / oldSize.x)}; + glm::vec2 sizeMaxY{oldSize.x * (maxItemSize.y / oldSize.y), maxItemSize.y}; glm::vec2 newSize; if (sizeMaxX.y > maxItemSize.y) newSize = sizeMaxY; @@ -65,23 +73,27 @@ void FlexboxComponent::computeLayout() newSize = sizeMaxX; else newSize = sizeMaxX.x * sizeMaxX.y >= sizeMaxY.x * sizeMaxY.y ? sizeMaxX : sizeMaxY; - i->setSize(newSize); + image.second.setResize(newSize.x, newSize.y); } // Pre-compute layout parameters. float lineWidth = (mDirection == Direction::row ? (maxItemSize.y + mItemMargin.y) : (maxItemSize.x + mItemMargin.x)); - float anchorXStart = anchorX; - float anchorYStart = anchorY; + float anchorXStart{anchorX}; + float anchorYStart{anchorY}; - // Iterate through the children. - for (int i = 0; i < static_cast(mChildren.size()); i++) { - GuiComponent* child = mChildren[i]; - auto size = child->getSize(); + int i = 0; + + // Iterate through the images. + for (auto& image : mImages) { + if (!image.second.isVisible()) + continue; + + auto size{image.second.getSize()}; // Top-left anchor position. - float x = anchorX - anchorOriginX * size.x; - float y = anchorY - anchorOriginY * size.y; + float x{anchorX - anchorOriginX * size.x}; + float y{anchorY - anchorOriginY * size.y}; // Apply alignment if (mAlign == Align::end) { @@ -93,7 +105,7 @@ void FlexboxComponent::computeLayout() y += directionLine.y == 0 ? (maxItemSize.y - size.y) / 2 : 0; } else if (mAlign == Align::stretch && mDirection == Direction::row) { - child->setSize(child->getSize().x, maxItemSize.y); + image.second.setSize(image.second.getSize().x, maxItemSize.y); } // Apply origin. @@ -103,10 +115,10 @@ void FlexboxComponent::computeLayout() y -= mOrigin.y * mSize.y; // Store final item position. - child->setPosition(getPosition().x + x, getPosition().y + y); + image.second.setPosition(getPosition().x + x, getPosition().y + y); // Translate anchor. - if ((i + 1) % std::max(1, static_cast(mItemsPerLine)) != 0) { + if ((i++ + 1) % std::max(1, static_cast(mItemsPerLine)) != 0) { // Translate on same line. anchorX += (size.x + mItemMargin.x) * static_cast(directionLine.x); anchorY += (size.y + mItemMargin.y) * static_cast(directionLine.y); @@ -135,7 +147,8 @@ void FlexboxComponent::render(const glm::mat4& parentTrans) if (!mLayoutValid) computeLayout(); - renderChildren(parentTrans); + for (auto& image : mImages) + image.second.render(parentTrans); } void FlexboxComponent::applyTheme(const std::shared_ptr& theme, @@ -149,7 +162,6 @@ void FlexboxComponent::applyTheme(const std::shared_ptr& theme, glm::vec2{static_cast(Renderer::getScreenWidth()), static_cast(Renderer::getScreenHeight())}}; - // TODO: How to do this without explicit 'badges' property? const ThemeData::ThemeElement* elem = theme->getElement(view, element, "badges"); if (!elem) return; @@ -179,9 +191,3 @@ void FlexboxComponent::applyTheme(const std::shared_ptr& theme, // Layout no longer valid. mLayoutValid = false; } - -std::vector FlexboxComponent::getHelpPrompts() -{ - std::vector prompts; - return prompts; -} diff --git a/es-core/src/components/FlexboxComponent.h b/es-core/src/components/FlexboxComponent.h index ad7ee90db..c278b1aed 100644 --- a/es-core/src/components/FlexboxComponent.h +++ b/es-core/src/components/FlexboxComponent.h @@ -11,67 +11,75 @@ #define ES_CORE_COMPONENTS_FLEXBOX_COMPONENT_H #include "GuiComponent.h" -#include "renderers/Renderer.h" - -// Default values. -#define DEFAULT_DIRECTION Direction::row -#define DEFAULT_ALIGN Align::center -#define DEFAULT_ITEMS_PER_LINE 4 -#define DEFAULT_LINES 1 -#define DEFAULT_MARGIN_X 10.0f -#define DEFAULT_MARGIN_Y 10.0f +#include "components/ImageComponent.h" class FlexboxComponent : public GuiComponent { public: - enum class Direction : char { row, column }; - enum class Align : char { start, end, center, stretch }; + enum class Direction : char { + row, // Replace with AllowShortEnumsOnASingleLine: false (clang-format >=11.0). + column + }; - explicit FlexboxComponent(Window* window); + enum class Align : char { + start, // Replace with AllowShortEnumsOnASingleLine: false (clang-format >=11.0). + end, + center, + stretch + }; + + explicit FlexboxComponent(Window* window, + std::vector>& images); // Getters/Setters for rendering options. - [[nodiscard]] Align getAlign() const { return mAlign; }; + Align getAlign() const { return mAlign; } void setAlign(Align value) { mAlign = value; mLayoutValid = false; - }; - [[nodiscard]] unsigned int getItemsPerLine() const { return mItemsPerLine; }; + } + + unsigned int getItemsPerLine() const { return mItemsPerLine; } void setItemsPerLine(unsigned int value) { mItemsPerLine = value; mLayoutValid = false; - }; - [[nodiscard]] unsigned int getLines() const { return mLines; }; + } + + unsigned int getLines() const { return mLines; } void setLines(unsigned int value) { mLines = value; mLayoutValid = false; - }; - [[nodiscard]] glm::vec2 getItemMargin() const { return mItemMargin; }; + } + + glm::vec2 getItemMargin() const { return mItemMargin; } void setItemMargin(glm::vec2 value) { mItemMargin = value; mLayoutValid = false; - }; + } - void onSizeChanged() override; + void onSizeChanged() override { mLayoutValid = false; } void render(const glm::mat4& parentTrans) override; void applyTheme(const std::shared_ptr& theme, const std::string& view, const std::string& element, unsigned int properties) override; - std::vector getHelpPrompts() override; private: // Calculate flexbox layout. void computeLayout(); - // Rendering options. + // Layout options. Direction mDirection; Align mAlign; + + std::vector>& mImages; + unsigned int mItemsPerLine; unsigned int mLines; + glm::vec2 mItemMargin; bool mLayoutValid; }; diff --git a/resources/graphics/badge_altemulator.svg b/resources/graphics/badge_altemulator.svg index 0a54263ac..0a07c9872 100644 --- a/resources/graphics/badge_altemulator.svg +++ b/resources/graphics/badge_altemulator.svg @@ -1,48 +1,48 @@ + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + width="80" + height="112" + viewBox="0 0 21.166666 29.633334" + version="1.1" + id="svg4842" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="badge_altemulator.svg"> + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="1.0" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="12.442154" + inkscape:cx="-18.41824" + inkscape:cy="59.681612" + inkscape:document-units="mm" + inkscape:current-layer="layer2" + showgrid="false" + inkscape:window-width="3840" + inkscape:window-height="2065" + inkscape:window-x="0" + inkscape:window-y="0" + inkscape:window-maximized="1" + fit-margin-top="0" + fit-margin-left="0" + fit-margin-right="0" + fit-margin-bottom="0" + units="px" + inkscape:snap-nodes="false" + inkscape:snap-others="false" + inkscape:snap-global="true" + inkscape:document-rotation="0" /> @@ -51,7 +51,7 @@ image/svg+xml - + @@ -61,47 +61,47 @@ id="layer1" transform="translate(-1.9829021e-4,-266.11715)"> + style="opacity:1;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.56896;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:0;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + id="rect5286" + width="21.166666" + height="29.633333" + x="0.0001982902" + y="266.11713" /> + x="3.0257001" + y="2.9029" + width="204.36" + height="288.81" + id="rect14" + style="fill:#d7d7d7;fill-opacity:1;stroke-width:0.26458" /> + x="7.7007999" + y="7.7174001" + width="194.89999" + height="279.22" + id="rect18" + style="stroke-width:0.26458" /> + style="fill:#e6e6e6;fill-opacity:1;stroke-width:0.0266453" + id="rect22" + height="17.395565" + width="17.540144" + y="271.47574" + x="1.8325089" /> + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.25971" + id="g56-4" + aria-label="CONTENT RATED BY" + transform="matrix(0.09632353,0,0,0.10097609,0.27971034,266.32293)"> + d="m 2.2271284,292.95117 c 0,0.40604 0.015331,0.79582 0.030663,1.17749 0,0.0243 0.030663,0.0406 0.076656,0.0406 0.2529687,0.008 1.364477,0.0203 1.625048,0.0203 0.2529687,0 1.073192,-0.004 1.3184891,-0.0122 v -0.29642 -0.35327 c -0.00767,-0.0203 -0.038327,-0.0406 -0.076656,-0.0406 -0.2606263,-0.004 -1.096179,-0.008 -1.3568192,-0.008 h -0.099653 v -0.21114 h 0.9965315 v -0.268 -0.30859 c -0.00767,-0.0203 -0.038327,-0.0406 -0.076656,-0.0406 -0.1993091,0 -0.6132565,-0.004 -0.919871,-0.004 v -0.21521 h 0.2989565 c 0.2529687,0 0.9735306,0 1.2188276,-0.008 v -0.29642 -0.35326 c -0.00767,-0.0203 -0.038327,-0.0406 -0.076656,-0.0406 -0.2606264,-0.004 -1.0808497,-0.008 -1.3414899,-0.008 -0.2529687,0 -1.3491477,0.004 -1.5867594,0.008 -0.022997,0.40604 -0.030663,0.81206 -0.030663,1.21812 z" + id="path78-4" + inkscape:connector-curvature="0" + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.036704" /> + d="m 5.6153964,294.14527 c 0.5289244,0.0325 1.0961791,0.0446 1.6174179,0.0446 1.0348618,0 1.8780861,-0.15023 1.8780861,-0.79582 0,-0.5644 -0.9505434,-0.71463 -1.5867594,-0.81618 -0.3142859,-0.0487 -0.5519252,-0.0853 -0.5519252,-0.15834 0,-0.0731 0.1533072,-0.1137 0.3909464,-0.1137 0.4752649,0 1.0195325,0.0812 1.3798065,0.16647 l 0.1763081,-0.67809 c -0.5135951,-0.0527 -1.0348617,-0.0894 -1.4795233,-0.0894 -1.0501911,0 -1.8167688,0.0487 -1.8167688,0.70652 0,0.62531 0.8508821,0.75525 1.4258361,0.84049 0.2989567,0.0446 0.5212666,0.0772 0.5212666,0.15836 0,0.065 -0.1226499,0.14617 -0.4139474,0.14617 -0.3449586,0 -0.8202234,-0.0528 -1.3568193,-0.14212 z" + id="path80-9" + inkscape:connector-curvature="0" + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.036704" /> + d="m 9.4307297,292.9475 c 0,0.10149 0.00613,0.19489 0.01226,0.29641 0,0.0243 0.024523,0.0406 0.061303,0.0406 0.2023048,0.008 0.9931183,0.0203 1.2015133,0.0203 0.202306,0 0.919554,-0.004 1.054426,-0.0122 0,-0.0853 0.0061,-0.17459 0.0061,-0.2558 0,-0.20302 -0.0061,-0.24769 -0.0061,-0.34514 -0.0061,-0.0203 -0.03065,-0.0406 -0.06131,-0.0406 -0.208428,-0.004 -0.692729,-0.008 -0.901169,-0.008 -0.202303,0 -1.1647903,0.004 -1.354836,0.008 -0.00613,0.13399 -0.01226,0.21926 -0.01226,0.29642 z" + id="path82-1" + inkscape:connector-curvature="0" + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.0328234" /> + d="m 13.651876,292.95117 c 0,-0.19489 0,-0.36544 0.0077,-0.53598 h 0.130314 c 0.206967,0 0.360288,0.0528 0.360288,0.53598 0,0.48319 -0.153307,0.54004 -0.360288,0.54004 h -0.130314 c -0.0077,-0.17054 -0.0077,-0.34108 -0.0077,-0.54004 z m -1.517812,0 c 0,0.40604 0.01533,0.75525 0.01533,1.13692 0,0.0243 0.03066,0.0406 0.07666,0.0406 0.528925,0.0284 1.011861,0.0487 1.433466,0.0487 1.28783,0 2.092697,-0.21115 2.092697,-1.22628 0,-0.95418 -0.812553,-1.24657 -2.108095,-1.24657 -0.429277,0 -0.98886,0.0284 -1.494784,0.0691 0,0.40604 -0.01533,0.7715 -0.01533,1.17749 z" + id="path84-7" + inkscape:connector-curvature="0" + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.036704" /> + d="m 15.999759,292.92458 c 0,0.3953 0.01492,0.77476 0.02985,1.14634 0,0.0237 0.02985,0.0395 0.07463,0.0395 0.246278,0.008 1.328384,0.0198 1.582062,0.0198 0.246277,0 1.044804,-0.004 1.283611,-0.0118 v -0.28858 -0.34391 c -0.0075,-0.0198 -0.03731,-0.0395 -0.07463,-0.0395 -0.253731,-0.004 -1.067182,-0.008 -1.320928,-0.008 h -0.09702 v -0.20557 h 0.970171 v -0.2609 -0.30043 c -0.0075,-0.0198 -0.03731,-0.0395 -0.07463,-0.0395 -0.194037,0 -0.597034,-0.004 -0.895539,-0.004 v -0.20951 h 0.291049 c 0.246277,0 0.947778,0 1.186587,-0.008 v -0.28857 -0.34391 c -0.0075,-0.0198 -0.03731,-0.0395 -0.07463,-0.0395 -0.253731,-0.004 -1.052258,-0.008 -1.306003,-0.008 -0.246277,0 -1.313459,0.004 -1.544785,0.008 -0.02239,0.39529 -0.02985,0.79057 -0.02985,1.18589 z" + id="path86-0" + inkscape:connector-curvature="0" + style="fill:#f0f0f0;fill-opacity:1;stroke-width:0.0357331" /> + id="g54" + aria-label="CONTENT RATED BY" + transform="matrix(0.09871346,0,0,0.10292059,-29.557342,270.26518)" + style="fill:#ffffff;stroke-width:0.25912"> + id="path26" + d="m 17.44,237.05 c 0,6.2189 2.6119,7.5125 6.7911,7.5125 1.0199,0 1.8408,-0.0746 2.8607,-0.27364 l -0.52239,-3.9304 -2.2886,0.17413 c -1.0199,0.0497 -1.6667,-0.52239 -1.6667,-3.4826 0,-2.9602 0.74627,-3.5075 1.6667,-3.4577 l 2.2886,0.14926 0.54726,-3.9055 c -1.0199,-0.22388 -1.8159,-0.42289 -2.8358,-0.42289 -4.204,0 -6.8408,1.791 -6.8408,7.6368 z" + inkscape:connector-curvature="0" /> + id="path28" + d="m 27.505,237.05 c 0,5.7712 2.1642,7.612 6.9154,7.612 3.5075,-0.17413 5.7214,-2.7114 5.7214,-7.612 0,-5.7463 -2.2388,-7.6368 -6.9652,-7.6368 -3.5075,0.17413 -5.6717,2.7612 -5.6717,7.6368 z m 5.1741,0 c 0,-2.9602 0.42289,-3.2836 1.0945,-3.2836 0.67161,0 1.1692,0.32339 1.1692,3.2836 0,2.9602 -0.42289,3.2836 -1.0945,3.2836 -0.67161,0 -1.1692,-0.32339 -1.1692,-3.2836 z" + inkscape:connector-curvature="0" /> + xml:space="preserve" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:10.5833px;line-height:1.25;font-family:Dyuthi;-inkscape-font-specification:Dyuthi;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583" + x="19.372959" + y="271.49698" + id="text5145" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 11.142864,276.8821 c 0,-0.13102 -0.08756,-0.2366 -0.19606,-0.2366 h -0.245083 v -0.8903 h -0.444919 v 0.8903 h -0.245074 c -0.1085141,0 -0.1960697,0.10558 -0.1960697,0.2366 v 0.80877 c 0,0.13102 0.087556,0.23659 0.1960697,0.23659 h 0.935076 c 0.108505,0 0.19606,-0.10557 0.19606,-0.23659 z m -0.437842,0.17863 v 0.45151 h -0.451513 v -0.45151 z" + id="rect5069-0-5-6-6" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 5.8349883,276.8821 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 5.3938449 v -0.8903 H 4.9489256 v 0.8903 H 4.703852 c -0.1085142,0 -0.1960698,0.10558 -0.1960698,0.2366 v 0.80877 c 0,0.13102 0.087556,0.23659 0.1960698,0.23659 h 0.9350756 c 0.1085051,0 0.1960607,-0.10557 0.1960607,-0.23659 z m -0.4378418,0.17863 v 0.45151 H 4.9456332 v -0.45151 z" + id="rect5069-0-5-1-0-8-8" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 7.605691,276.8821 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 7.1645475 v -0.8903 H 6.7196374 v 0.8903 H 6.4745547 c -0.1085143,0 -0.1960608,0.10558 -0.1960608,0.2366 v 0.80877 c 0,0.13102 0.087556,0.23659 0.1960608,0.23659 h 0.9350756 c 0.1085051,0 0.1960607,-0.10557 0.1960607,-0.23659 z m -0.4378419,0.17863 v 0.45151 H 6.7163358 v -0.45151 z" + id="rect5069-0-5-1-0-4" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 9.3740406,276.8821 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 8.9328972 v -0.8903 H 8.487987 v 0.8903 H 8.2429043 c -0.1085143,0 -0.1960607,0.10558 -0.1960607,0.2366 v 0.80877 c 0,0.13102 0.087556,0.23659 0.1960607,0.23659 h 0.9350756 c 0.1085051,0 0.1960607,-0.10557 0.1960607,-0.23659 z m -0.4378419,0.17863 v 0.45151 H 8.4846854 v -0.45151 z" + id="rect5069-0-5-1-7" + inkscape:connector-curvature="0" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 12.916869,276.8821 c 0,-0.13102 -0.08756,-0.2366 -0.196061,-0.2366 h -0.245083 v -0.8903 h -0.444919 v 0.8903 h -0.245074 c -0.108514,0 -0.19607,0.10558 -0.19607,0.2366 v 0.80877 c 0,0.13102 0.08756,0.23659 0.19607,0.23659 h 0.935076 c 0.108505,0 0.196061,-0.10557 0.196061,-0.23659 z m -0.437842,0.17863 v 0.45151 h -0.451514 v -0.45151 z" + id="rect5069-0-5-2" + inkscape:connector-curvature="0" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 14.686158,276.8821 c 0,-0.13102 -0.08756,-0.2366 -0.196061,-0.2366 h -0.245083 v -0.8903 h -0.44491 v 0.8903 h -0.245083 c -0.108514,0 -0.196061,0.10558 -0.196061,0.2366 v 0.80877 c 0,0.13102 0.08756,0.23659 0.196061,0.23659 h 0.935076 c 0.108505,0 0.196061,-0.10557 0.196061,-0.23659 z m -0.437842,0.17863 v 0.45151 h -0.451514 v -0.45151 z" + id="rect5069-0-4" + inkscape:connector-curvature="0" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 11.142864,282.65618 c 0,-0.13102 -0.08756,-0.2366 -0.19606,-0.2366 h -0.935076 c -0.1084776,0 -0.1960697,0.10558 -0.1960697,0.2366 v 0.80876 c 0,0.13102 0.087556,0.2366 0.1960697,0.2366 h 0.245074 v 0.8903 h 0.444919 v -0.8903 h 0.245083 c 0.108477,0 0.19606,-0.10558 0.19606,-0.2366 z m -0.437842,0.17862 v 0.45152 h -0.451513 v -0.45152 z" + id="rect5069-0-5-6" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 16.452628,282.65618 c 0,-0.13102 -0.08755,-0.2366 -0.19607,-0.2366 h -0.935075 c -0.108478,0 -0.196061,0.10558 -0.196061,0.2366 v 0.80876 c 0,0.13102 0.08756,0.2366 0.196061,0.2366 h 0.245083 v 0.8903 h 0.444919 v -0.8903 h 0.245073 c 0.108478,0 0.19607,-0.10558 0.19607,-0.2366 z m -0.437851,0.17862 v 0.45152 h -0.451513 v -0.45152 z" + id="rect5195" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 5.8349883,282.65618 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 4.703852 c -0.1084777,0 -0.1960698,0.10558 -0.1960698,0.2366 v 0.80876 c 0,0.13102 0.087556,0.2366 0.1960698,0.2366 h 0.2450736 v 0.8903 h 0.4449193 v -0.8903 h 0.2450827 c 0.1084778,0 0.1960607,-0.10558 0.1960607,-0.2366 z m -0.4378418,0.17862 v 0.45152 H 4.9456332 v -0.45152 z" + id="rect5069-0-5-1-0-8" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 7.605691,282.65618 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 6.4745547 c -0.1084778,0 -0.1960608,0.10558 -0.1960608,0.2366 v 0.80876 c 0,0.13102 0.087556,0.2366 0.1960608,0.2366 h 0.2450827 v 0.8903 h 0.4449101 v -0.8903 h 0.2450828 c 0.1084777,0 0.1960607,-0.10558 0.1960607,-0.2366 z m -0.4378419,0.17862 v 0.45152 H 6.7163358 v -0.45152 z" + id="rect5069-0-5-1-0" + inkscape:connector-curvature="0" /> + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" + d="m 9.3740406,282.65618 c 0,-0.13102 -0.087556,-0.2366 -0.1960607,-0.2366 H 8.2429043 c -0.1084778,0 -0.1960607,0.10558 -0.1960607,0.2366 v 0.80876 c 0,0.13102 0.087556,0.2366 0.1960607,0.2366 H 8.487987 v 0.8903 h 0.4449102 v -0.8903 h 0.2450827 c 0.1084777,0 0.1960607,-0.10558 0.1960607,-0.2366 z m -0.4378419,0.17862 v 0.45152 H 8.4846854 v -0.45152 z" + id="rect5069-0-5-1" + inkscape:connector-curvature="0" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 12.916869,282.65618 c 0,-0.13102 -0.08756,-0.2366 -0.196061,-0.2366 h -0.935076 c -0.108478,0 -0.19607,0.10558 -0.19607,0.2366 v 0.80876 c 0,0.13102 0.08756,0.2366 0.19607,0.2366 h 0.245074 v 0.8903 h 0.444919 v -0.8903 h 0.245083 c 0.108478,0 0.196061,-0.10558 0.196061,-0.2366 z m -0.437842,0.17862 v 0.45152 h -0.451514 v -0.45152 z" + id="rect5069-0-5" + inkscape:connector-curvature="0" /> + style="opacity:1;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.221985;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + d="m 14.686158,282.65618 c 0,-0.13102 -0.08756,-0.2366 -0.196061,-0.2366 h -0.935076 c -0.108478,0 -0.196061,0.10558 -0.196061,0.2366 v 0.80876 c 0,0.13102 0.08756,0.2366 0.196061,0.2366 h 0.245083 v 0.8903 h 0.44491 v -0.8903 h 0.245083 c 0.108478,0 0.196061,-0.10558 0.196061,-0.2366 z m -0.437842,0.17862 v 0.45152 h -0.451514 v -0.45152 z" + id="rect5069-0" + inkscape:connector-curvature="0" /> + id="rect5061" + d="m 4.7486749,277.07833 c -0.3682172,0 -0.664559,0.25094 -0.664559,0.56276 v 5.0648 c 0,0.31182 0.2963418,0.56276 0.664559,0.56276 H 16.456487 c 0.368217,0 0.664559,-0.25094 0.664559,-0.56276 v -1.64279 a 0.91714642,0.91714642 0 0 1 -0.698149,-0.88987 0.91714642,0.91714642 0 0 1 0.698149,-0.88935 v -1.64279 c 0,-0.31182 -0.296342,-0.56276 -0.664559,-0.56276 z" + style="opacity:1;fill:#fcfcfd;fill-opacity:1;stroke:#282828;stroke-width:0.274902;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" + inkscape:connector-curvature="0" /> + rx="0.42198506" + ry="0.42198506" + y="277.72012" + x="7.7069221" + height="4.9067254" + width="5.7913175" + id="rect5019" + style="opacity:1;vector-effect:none;fill:#ffd700;fill-opacity:1;stroke:#282828;stroke-width:0.213968;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke fill markers" /> + inkscape:groupmode="layer" + id="layer2" + inkscape:label="Layer 2"> + aria-label="ALT EMU" + transform="scale(1.0680187,0.93631321)" + id="text41" + style="font-size:4.97619px;line-height:1.25;font-family:'Bebas Neue';-inkscape-font-specification:'Bebas Neue';display:inline;stroke-width:0.0339285;fill:#f0f0f0;fill-opacity:1"> + d="m 1.7229501,4.7457954 c 0,0.024881 0.019905,0.03981 0.044786,0.03981 0.1642143,0.00995 0.3383809,0.014928 0.5075714,0.014928 0.1642142,0 0.2537857,-0.00498 0.4130238,-0.014928 0.034833,-0.1791429 0.06469,-0.3632619 0.094548,-0.547381 h 0.4627856 c 0.024881,0.1691905 0.054738,0.338381 0.089571,0.4976191 0.00498,0.029857 0.029857,0.049762 0.054738,0.049762 0.1741666,0.014928 0.3184761,0.014928 0.4876666,0.014928 0.1691904,0 0.2786666,-0.00498 0.4329285,-0.014928 C 4.1662594,3.8202241 3.9323785,2.8050813 3.7432833,1.8496528 3.7383071,1.8247719 3.7134261,1.7998909 3.6885452,1.7998909 3.449688,1.7949147 3.2158071,1.7899385 2.97695,1.7899385 c -0.233881,0 -0.4627857,0 -0.6867143,0.00995 -0.184119,0.9205952 -0.393119,1.8809999 -0.5424047,2.7916426 -0.00995,0.049762 -0.024881,0.1443096 -0.024881,0.1542619 z M 2.8674738,3.5913193 c 0.03981,-0.3732142 0.079619,-0.7464285 0.1244047,-1.1146665 0.049762,0.3732142 0.099524,0.7464285 0.1542619,1.1146665 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path975" /> + d="m 4.4946808,3.2927479 c 0,0.497619 0.00995,0.9753333 0.019905,1.4430952 0,0.029857 0.019905,0.049762 0.049762,0.049762 0.1642143,0.00995 0.8857619,0.024881 1.0549523,0.024881 0.1642143,0 0.5772381,-0.00498 0.7364762,-0.014929 0,-0.1244047 0,-0.2438333 0,-0.3632618 0,-0.1393334 0,-0.2786667 0,-0.4329286 C 6.3507997,3.974486 6.3308949,3.949605 6.306014,3.949605 6.1368235,3.9446288 5.7138474,3.9396526 5.5446569,3.9396526 h -0.019905 c 0,-0.2089999 0.00498,-0.4229761 0.00498,-0.6469047 0,-0.497619 -0.00995,-0.9753332 -0.019905,-1.4430951 0,-0.024881 -0.024881,-0.049762 -0.049762,-0.049762 -0.1691905,-0.00498 -0.3433572,-0.00995 -0.5125476,-0.00995 -0.1642143,0 -0.2786667,0.00498 -0.4329286,0.00995 -0.014928,0.497619 -0.019905,0.995238 -0.019905,1.492857 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path977" /> + d="m 6.1318408,2.1780813 c 0,0.1343572 0,0.2687143 0.00498,0.4080476 0,0.029857 0.019905,0.049762 0.049762,0.049762 0.084595,0.00498 0.3234523,0.00995 0.5473809,0.014929 0,0.209 0,0.4130238 0,0.6419285 0,0.497619 0.00995,0.9753333 0.019905,1.4430952 0,0.029857 0.019905,0.049762 0.049762,0.049762 0.1642143,0.00995 0.338381,0.014928 0.5075714,0.014928 0.1642143,0 0.2786667,-0.00498 0.4379048,-0.014928 0.00995,-0.4976191 0.019905,-0.9952381 0.019905,-1.4928571 0,-0.2289047 -0.00498,-0.4329285 -0.00995,-0.6369523 0.2587619,0 0.5225,-0.00498 0.6070952,-0.00995 0,-0.1244047 0,-0.2488095 0,-0.3682381 0,-0.1443095 0,-0.2836428 0,-0.4279523 -0.00498,-0.024881 -0.024881,-0.049762 -0.049762,-0.049762 -0.1691904,-0.00498 -0.8608809,-0.00995 -1.0300713,-0.00995 -0.1642143,0 -0.995238,0.00498 -1.1494999,0.00995 -0.00498,0.1343571 -0.00498,0.2587619 -0.00498,0.3781904 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path979" /> + d="m 10.067999,3.2927479 c 0,0.497619 0.01,0.9753333 0.0199,1.4430952 0,0.029857 0.0199,0.049762 0.04976,0.049762 0.164215,0.00995 0.885762,0.024881 1.054953,0.024881 0.164214,0 0.696666,-0.00498 0.855904,-0.014929 0,-0.1244047 0,-0.2438333 0,-0.3632618 0,-0.1393334 0,-0.2786667 0,-0.4329286 -0.005,-0.024881 -0.02488,-0.049762 -0.04976,-0.049762 -0.169191,-0.00498 -0.711596,-0.00995 -0.880786,-0.00995 h -0.06469 c 0,-0.084595 0,-0.1691904 0,-0.2587618 h 0.646905 c 0,-0.1194286 0,-0.2239286 0,-0.3284286 0,-0.1194286 0,-0.2388571 0,-0.3781904 -0.005,-0.024881 -0.02488,-0.049762 -0.04976,-0.049762 -0.129381,0 -0.398095,-0.00498 -0.597143,-0.00498 0,-0.089571 0,-0.1791429 0,-0.2637381 0.0846,0 0.154262,0 0.194072,0 0.164214,0 0.631976,0 0.791214,-0.00995 0,-0.1244047 0,-0.2438333 0,-0.3632619 0,-0.1393333 0,-0.2786666 0,-0.4329285 -0.005,-0.024881 -0.02488,-0.049762 -0.04976,-0.049762 -0.16919,-0.00498 -0.701643,-0.00995 -0.870833,-0.00995 -0.164214,0 -0.87581,0.00498 -1.030071,0.00995 -0.01493,0.497619 -0.0199,0.995238 -0.0199,1.492857 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path981" /> + d="m 12.327182,3.2927479 c 0,0.497619 0.01,0.9753333 0.0199,1.4430952 0,0.029857 0.01991,0.049762 0.04976,0.049762 0.164215,0.00995 0.363262,0.014928 0.482691,0.014928 0.164214,0 0.253786,-0.00498 0.413024,-0.014928 l -0.0199,-1.3485476 0.542405,1.099738 0.04976,0.00995 0.05474,-0.00995 0.567285,-1.1544761 c 0,0.4677619 0.0199,0.915619 0.02986,1.3535238 0,0.029857 0.0199,0.049762 0.04976,0.049762 0.164215,0.00995 0.338381,0.014928 0.45781,0.014928 0.164214,0 0.243833,-0.00498 0.388143,-0.014928 0.01,-0.4976191 0.0199,-0.9952381 0.0199,-1.4928571 0,-0.497619 -0.01,-0.9753332 -0.0199,-1.4430951 0,-0.024881 -0.02488,-0.044786 -0.04976,-0.049762 -0.139334,-0.00498 -0.293596,-0.00995 -0.462786,-0.00995 -0.139333,0 -0.258762,0.00498 -0.348333,0.014929 -0.02488,0 -0.04479,0.024881 -0.05972,0.044786 l -0.627,1.2788809 -0.622023,-1.2788809 c -0.01,-0.019905 -0.02986,-0.044786 -0.05474,-0.049762 -0.149286,-0.00498 -0.263738,-0.00995 -0.432929,-0.00995 -0.164214,0 -0.253786,0.00498 -0.408048,0.00995 -0.01493,0.497619 -0.0199,0.995238 -0.0199,1.492857 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path983" /> + d="m 15.696059,3.3126527 c 0,1.2539999 0.447857,1.5227142 1.348547,1.5227142 0.701643,-0.034833 1.109691,-0.442881 1.109691,-1.5227142 0,-0.497619 -0.01,-0.995238 -0.01991,-1.4629999 0,-0.024881 -0.02488,-0.049762 -0.04976,-0.049762 -0.16919,-0.00498 -0.343357,-0.00995 -0.512548,-0.00995 -0.164214,0 -0.278666,0.00498 -0.432928,0.00995 -0.01493,0.497619 -0.01991,1.1644285 -0.01991,1.6620475 0,0.4428809 -0.05474,0.5075714 -0.189095,0.5075714 -0.134357,0 -0.199048,-0.06469 -0.199048,-0.5075714 0,-0.497619 -0.01,-1.1445237 -0.0199,-1.6122856 0,-0.024881 -0.02488,-0.049762 -0.04976,-0.049762 -0.169191,-0.00498 -0.343357,-0.00995 -0.512548,-0.00995 -0.164214,0 -0.278667,0.00498 -0.432928,0.00995 -0.01493,0.497619 -0.0199,1.0151428 -0.0199,1.5127618 z" + style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:4.97619px;font-family:Digitalt;-inkscape-font-specification:Digitalt;fill:#f0f0f0;stroke-width:0.0339285;fill-opacity:1" + id="path985" />