NOISSUE embed branding again

Doing the whole 'secrets' thing by trying to hide MSA client ID was honestly crazy.

To everyone who tried to work on the code and couldn't use their own development build, I am sorry.
This commit is contained in:
Petr Mrázek 2024-12-16 03:50:46 +01:00
parent 40d918e5a4
commit 80c3eb7d99
19 changed files with 36 additions and 518 deletions

View File

@ -88,33 +88,6 @@ set(Launcher_UPDATER_BASE "" CACHE STRING "Base URL for the updater.")
# Notification URL
set(Launcher_NOTIFICATION_URL "" CACHE STRING "URL for checking for notifications.")
# The metadata server
set(Launcher_META_URL "https://meta.multimc.org/v1/" CACHE STRING "URL to fetch Launcher's meta files from.")
# paste.ee API key
set(Launcher_PASTE_EE_API_KEY "utLvciUouSURFzfjPxLBf5W4ISsUX4pwBDF7N1AfZ" CACHE STRING "API key you can get from paste.ee when you register an account")
# Imgur API Client ID
set(Launcher_IMGUR_CLIENT_ID "5b97b0713fba4a3" CACHE STRING "Client ID you can get from Imgur when you register an application")
# Google analytics ID
set(Launcher_ANALYTICS_ID "UA-87731965-2" CACHE STRING "ID you can get from Google analytics")
# Bug tracker URL
set(Launcher_BUG_TRACKER_URL "https://github.com/MultiMC/Launcher/issues" CACHE STRING "URL for the bug tracker.")
# Discord URL
set(Launcher_DISCORD_URL "https://discord.gg/multimc" CACHE STRING "URL for the Discord guild.")
# Subreddit URL
set(Launcher_SUBREDDIT_URL "https://www.reddit.com/r/MultiMC/" CACHE STRING "URL for the subreddit.")
# Patreon URL
set(Launcher_PATREON_URL "https://www.patreon.com/multimc" CACHE STRING "URL for the patreon.")
# Use the secrets library or a public stub?
option(Launcher_EMBED_SECRETS "Determines whether to embed secrets. Secrets are separate and non-public." OFF)
#### Check the current Git commit and branch
include(GetGitRevisionDescription)
get_git_head_revision(Launcher_GIT_REFSPEC Launcher_GIT_COMMIT)
@ -151,13 +124,31 @@ if (Qt5_POSITION_INDEPENDENT_CODE)
SET(CMAKE_POSITION_INDEPENDENT_CODE ON)
endif()
####################################### Secrets #######################################
####################################### Branding #######################################
if(Launcher_EMBED_SECRETS)
add_subdirectory(secrets)
else()
add_subdirectory(notsecrets)
endif()
set(Launcher_CommonName "MultiMC")
set(Launcher_Copyright "MultiMC Contributors")
set(Launcher_Domain "multimc.org")
set(Launcher_Name "${Launcher_CommonName}")
set(Launcher_DisplayName "${Launcher_CommonName} 5")
set(Launcher_UserAgent "${Launcher_CommonName}/5.0")
set(Launcher_ConfigFile "multimc.cfg")
set(Launcher_Git "https://github.com/MultiMC/Launcher")
set(Launcher_Branding_ICNS "${PROJECT_SOURCE_DIR}/branding/${Launcher_CommonName}.icns")
set(Launcher_Branding_WindowsRC "${PROJECT_SOURCE_DIR}/branding/multimc.rc")
set(Launcher_Branding_LogoQRC "${PROJECT_SOURCE_DIR}/branding/logo.qrc")
set(Launcher_META_URL "https://meta.multimc.org/v1/")
set(Launcher_PASTE_EE_API_KEY "utLvciUouSURFzfjPxLBf5W4ISsUX4pwBDF7N1AfZ")
set(Launcher_MSA_CLIENT_ID "499546d9-bbfe-4b9b-a086-eb3d75afb78f")
set(Launcher_IMGUR_CLIENT_ID "5b97b0713fba4a3")
set(Launcher_ANALYTICS_ID "UA-87731965-2")
set(Launcher_BUG_TRACKER_URL "https://github.com/MultiMC/Launcher/issues")
set(Launcher_DISCORD_URL "https://discord.gg/multimc")
set(Launcher_SUBREDDIT_URL "https://www.reddit.com/r/MultiMC/")
set(Launcher_PATREON_URL "https://www.patreon.com/multimc")
####################################### Install layout #######################################
@ -199,7 +190,7 @@ if(Launcher_LAYOUT_REAL STREQUAL "mac-bundle")
set(MACOSX_BUNDLE_SHORT_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}")
set(MACOSX_BUNDLE_LONG_VERSION_STRING "${Launcher_VERSION_MAJOR}.${Launcher_VERSION_MINOR}.${Launcher_VERSION_HOTFIX}.${Launcher_VERSION_BUILD}")
set(MACOSX_BUNDLE_ICON_FILE ${Launcher_Name}.icns)
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2015-2023 ${Launcher_Copyright}")
set(MACOSX_BUNDLE_COPYRIGHT "Copyright 2015-2024 ${Launcher_Copyright}")
# directories to look for dependencies
set(DIRS ${QT_LIBS_DIR} ${QT_LIBEXECS_DIR} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY} ${CMAKE_RUNTIME_OUTPUT_DIRECTORY})

View File

@ -45,6 +45,7 @@ Config::Config()
NEWS_URL = "@Launcher_NEWS_URL@";
NEWS_RSS_URL = "@Launcher_NEWS_RSS_URL@";
PASTE_EE_KEY = "@Launcher_PASTE_EE_API_KEY@";
MSA_CLIENT_ID = "@Launcher_MSA_CLIENT_ID@";
IMGUR_CLIENT_ID = "@Launcher_IMGUR_CLIENT_ID@";
META_URL = "@Launcher_META_URL@";

View File

@ -81,6 +81,12 @@ public:
*/
QString PASTE_EE_KEY;
/**
* API key from registering an application in Microsoft Azure
* See: https://portal.azure.com/#view/Microsoft_AAD_RegisteredApps/ApplicationsListBlade
*/
QString MSA_CLIENT_ID;
/**
* Client ID you can get from Imgur when you register an application
*/

View File

@ -76,9 +76,6 @@
#include <ganalytics.h>
#include <sys.h>
#include <Secrets.h>
#if defined Q_OS_WIN32
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
@ -1648,7 +1645,7 @@ void Application::on_windowClose()
}
QString Application::msaClientId() const {
return Secrets::getMSAClientID('-');
return BuildConfig.MSA_CLIENT_ID;
}
void Application::updateProxySettings(QString proxyTypeStr, QString addr, int port, QString user, QString password)

View File

@ -598,7 +598,7 @@ SET(LAUNCHER_SOURCES
resources/iOS/iOS.qrc
resources/flat/flat.qrc
resources/documents/documents.qrc
../${Launcher_Branding_LogoQRC}
${Launcher_Branding_LogoQRC}
# Icons
icons/MMCIcon.h
@ -902,7 +902,7 @@ qt5_add_resources(LAUNCHER_RESOURCES
resources/iOS/iOS.qrc
resources/flat/flat.qrc
resources/documents/documents.qrc
../${Launcher_Branding_LogoQRC}
${Launcher_Branding_LogoQRC}
)
######## Windows resource files ########
@ -939,8 +939,6 @@ target_link_libraries(Launcher_logic
ganalytics
)
target_link_libraries(Launcher_logic secrets)
add_executable(${Launcher_Name} MACOSX_BUNDLE WIN32 main.cpp ${LAUNCHER_RCS})
target_link_libraries(${Launcher_Name} Launcher_logic)

View File

@ -37,8 +37,6 @@
#include "BuildConfig.h"
#include "Secrets.h"
AccountListPage::AccountListPage(QWidget *parent)
: QMainWindow(parent), ui(new Ui::AccountListPage)
{
@ -74,7 +72,7 @@ AccountListPage::AccountListPage(QWidget *parent)
updateButtonStates();
// Xbox authentication won't work without a client identifier, so disable the button if it is missing
ui->actionAddMicrosoft->setVisible(Secrets::hasMSAClientID());
ui->actionAddMicrosoft->setVisible(!BuildConfig.MSA_CLIENT_ID.isEmpty());
}
AccountListPage::~AccountListPage()
@ -111,22 +109,6 @@ void AccountListPage::listChanged()
updateButtonStates();
}
void AccountListPage::on_actionAddMojang_triggered()
{
MinecraftAccountPtr account = LoginDialog::newAccount(
this,
tr("Please enter your Mojang account email and password to add your account.")
);
if (account)
{
m_accounts->addAccount(account);
if (m_accounts->count() == 1) {
m_accounts->setDefaultAccount(account);
}
}
}
void AccountListPage::on_actionAddMicrosoft_triggered()
{
if(BuildConfig.BUILD_PLATFORM == "osx64") {

View File

@ -60,7 +60,6 @@ public:
}
public slots:
void on_actionAddMojang_triggered();
void on_actionAddMicrosoft_triggered();
void on_actionRemove_triggered();
void on_actionRefresh_triggered();

View File

@ -53,7 +53,6 @@
<bool>false</bool>
</attribute>
<addaction name="actionAddMicrosoft"/>
<addaction name="actionAddMojang"/>
<addaction name="actionRefresh"/>
<addaction name="actionRemove"/>
<addaction name="actionSetDefault"/>
@ -62,11 +61,6 @@
<addaction name="actionUploadSkin"/>
<addaction name="actionDeleteSkin"/>
</widget>
<action name="actionAddMojang">
<property name="text">
<string>Add Mojang</string>
</property>
</action>
<action name="actionRemove">
<property name="text">
<string>Remove</string>

View File

@ -1,18 +0,0 @@
add_library(secrets STATIC Secrets.cpp Secrets.h)
target_link_libraries(secrets Qt5::Core)
target_compile_definitions(secrets PUBLIC -DEMBED_SECRETS)
target_include_directories(secrets PUBLIC .)
set(Launcher_CommonName "DevLauncher")
set(Launcher_Copyright "MultiMC Contributors" PARENT_SCOPE)
set(Launcher_Domain "multimc.org" PARENT_SCOPE)
set(Launcher_Name "${Launcher_CommonName}" PARENT_SCOPE)
set(Launcher_DisplayName "${Launcher_CommonName} 5" PARENT_SCOPE)
set(Launcher_UserAgent "${Launcher_CommonName}/5.0" PARENT_SCOPE)
set(Launcher_ConfigFile "devlauncher.cfg" PARENT_SCOPE)
set(Launcher_Git "https://github.com/MultiMC/Launcher" PARENT_SCOPE)
set(Launcher_Branding_ICNS "notsecrets/Launcher.icns" PARENT_SCOPE)
set(Launcher_Branding_WindowsRC "notsecrets/launcher.rc" PARENT_SCOPE)
set(Launcher_Branding_LogoQRC "notsecrets/logo.qrc" PARENT_SCOPE)

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 100 KiB

View File

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0" xmlns:asmv3="urn:schemas-microsoft-com:asm.v3">
<assemblyIdentity name="MultiMC.Application.5" type="win32" version="5.0.0.0" />
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
<security>
<requestedPrivileges>
<requestedExecutionLevel level="asInvoker" uiAccess="false"/>
</requestedPrivileges>
</security>
</trustInfo>
<dependency>
<dependentAssembly>
<assemblyIdentity type="win32" name="Microsoft.Windows.Common-Controls" version="6.0.0.0" processorArchitecture="x86" publicKeyToken="6595b64144ccf1df" language="*"/>
</dependentAssembly>
</dependency>
<description>Custom Minecraft launcher for managing multiple installs.</description>
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
<application>
<!--The ID below indicates app support for Windows Vista -->
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
<!--The ID below indicates app support for Windows 7 -->
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
<!--The ID below indicates app support for Windows 8 -->
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
<!--The ID below indicates app support for Windows 8.1 -->
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
<!--The ID below indicates app support for Windows 10 -->
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
</application>
</compatibility>
</assembly>

View File

@ -1,25 +0,0 @@
# DevLauncher (Not) Secrets
This is a dummy implementation of MultiMC's _Secrets_ library, used to store private information needed for:
- Application name and logo (and branding in general)
- Various URLs and API endpoints
- Your Microsoft Identity Platform client ID. **This is required to use Microsoft accounts to play!**
- If omitted, adding Microsoft accounts will be completely disabled.
## MultiMC development
In its current state, the `notsecrets` library is suitable for MultiMC code contributions (the code builds as `DevLauncher`).
All you have to do is add the Microsoft client ID. See `Secrets.cpp` for details.
## Forking
Forks of this project that intend to distribute binaries to users should use their own implementation of this library that does not impersonate MultiMC in any way (see the Apache 2.0 license, common sense and trademark law).
A fork is a serious business, especially if you intend to distribute binaries to users. This is because you need to agree to the Microsoft identity platform Terms of Use:
https://docs.microsoft.com/en-us/legal/microsoft-identity-platform/terms-of-use
If you truly want to accept such an agreement, a starting point is to copy `notsecrets` to `secrets`, enable the `Launcher_EMBED_SECRETS` CMake option and customize the files.
We do not want confused users asking for help with your fork in MultiMC Discord or similar locations.

View File

@ -1,42 +0,0 @@
#include "Secrets.h"
#include <array>
#include <cstdio>
namespace {
/*
* This is the MSA client ID. It is confidential and should not be reused.
* You can obtain one for yourself by using azure app registration:
* https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app
*
* The app registration should:
* - Be only for personal accounts.
* - Not have any redirect URI.
* - Not have any platform.
* - Have no credentials.
* - No certificates.
* - No client secrets.
* - Enable 'Live SDK support' for access to XBox APIs.
* - Enable 'public client flows' for OAuth2 device flow.
*
* By putting one in here, you accept the terms and conditions for using the MS Identity Plaform and assume all responsibilities associated with it.
* See: https://docs.microsoft.com/en-us/legal/microsoft-identity-platform/terms-of-use
*
* Above all else, do not impersonate other applications! This includes the Mojang Launcher and MultiMC - your builds are *NOT* MultiMC.
*
* If you intend to base your own launcher on this code, take care and customize this to obfuscate the client ID, so it cannot be trivially found by casual attackers.
*/
QString MSAClientID = "";
}
namespace Secrets {
bool hasMSAClientID() {
return !MSAClientID.isEmpty();
}
QString getMSAClientID(uint8_t separator) {
return MSAClientID;
}
}

View File

@ -1,8 +0,0 @@
#pragma once
#include <QString>
#include <cstdint>
namespace Secrets {
bool hasMSAClientID();
QString getMSAClientID(uint8_t separator);
}

View File

@ -1,18 +0,0 @@
#/bin/bash
inkscape -w 16 -h 16 -o logo_16.png logo.svg
inkscape -w 24 -h 24 -o logo_24.png logo.svg
inkscape -w 32 -h 32 -o logo_32.png logo.svg
inkscape -w 48 -h 48 -o logo_48.png logo.svg
inkscape -w 64 -h 64 -o logo_64.png logo.svg
inkscape -w 128 -h 128 -o logo_128.png logo.svg
convert logo_128.png logo_64.png logo_48.png logo_32.png logo_24.png logo_16.png Launcher.ico
inkscape -w 256 -h 256 -o logo_256.png logo.svg
inkscape -w 512 -h 512 -o logo_512.png logo.svg
inkscape -w 1024 -h 1024 -o logo_1024.png logo.svg
png2icns Launcher.icns logo_1024.png logo_512.png logo_256.png logo_128.png logo_32.png logo_16.png
rm -f logo_*.png

View File

@ -1,29 +0,0 @@
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <windows.h>
IDI_ICON1 ICON DISCARDABLE "Launcher.ico"
1 RT_MANIFEST "Launcher.manifest"
VS_VERSION_INFO VERSIONINFO
FILEVERSION 1,0,0,0
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_APP
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "000004b0"
BEGIN
VALUE "CompanyName", "MultiMC Contributors"
VALUE "FileDescription", "A Minecraft Launcher"
VALUE "FileVersion", "1.0.0.0"
VALUE "ProductName", "Launcher"
VALUE "ProductVersion", "5"
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x0000, 0x04b0 // Unicode
END
END

View File

@ -1,8 +0,0 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/">
<file>logo.svg</file>
</qresource>
</RCC>

View File

@ -1,271 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
width="68.26667"
height="68.26667"
id="svg4427"
version="1.1"
inkscape:version="1.1.1 (3bf5ae0d25, 2021-09-20)"
sodipodi:docname="logo.svg"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<defs
id="defs4429">
<linearGradient
id="linearGradient5668"
inkscape:collect="always">
<stop
id="stop5670"
offset="0"
style="stop-color:#75b54b;stop-opacity:1;" />
<stop
id="stop5672"
offset="1"
style="stop-color:#75b54b;stop-opacity:0.6" />
</linearGradient>
<linearGradient
id="linearGradient5084"
inkscape:collect="always">
<stop
id="stop5086"
offset="0"
style="stop-color:#000000;stop-opacity:0.8" />
<stop
id="stop5088"
offset="1"
style="stop-color:#000000;stop-opacity:0.35" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5668"
id="linearGradient5072"
x1="6.7342591"
y1="28.510933"
x2="50.506943"
y2="61.773685"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-0.01532073,-0.00938002)" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5084"
id="linearGradient5082"
x1="14.312115"
y1="9.7948904"
x2="44.097023"
y2="82.973114"
gradientUnits="userSpaceOnUse" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5668"
id="linearGradient3281"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-0.01532073,-0.00938002)"
x1="6.7342591"
y1="28.510933"
x2="50.506943"
y2="61.773685" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5668"
id="linearGradient3283"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-0.01532073,-0.00938002)"
x1="6.7342591"
y1="28.510933"
x2="50.506943"
y2="61.773685" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5084"
id="linearGradient3288"
gradientUnits="userSpaceOnUse"
x1="14.312115"
y1="9.7948904"
x2="44.097023"
y2="82.973114" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5084"
id="linearGradient3290"
gradientUnits="userSpaceOnUse"
x1="14.312115"
y1="9.7948904"
x2="44.097023"
y2="82.973114" />
<linearGradient
inkscape:collect="always"
id="linearGradient5580">
<stop
style="stop-color:#000000;stop-opacity:0.0627451"
offset="0"
id="stop5576" />
<stop
style="stop-color:#252424;stop-opacity:0.58823532"
offset="1"
id="stop5578" />
</linearGradient>
<linearGradient
id="linearGradient3999"
inkscape:collect="always">
<stop
id="stop3995"
offset="0"
style="stop-color:#777777;stop-opacity:1" />
<stop
id="stop3997"
offset="1"
style="stop-color:#4f4e4e;stop-opacity:1" />
</linearGradient>
<linearGradient
id="linearGradient2727"
inkscape:collect="always">
<stop
id="stop2723"
offset="0"
style="stop-color:#7f8080;stop-opacity:1" />
<stop
id="stop2725"
offset="1"
style="stop-color:#404040;stop-opacity:1" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient2727"
id="linearGradient2050"
gradientUnits="userSpaceOnUse"
x1="36.546478"
y1="33.80484"
x2="86.415741"
y2="97.065842"
gradientTransform="translate(-0.0016031,-4.5764148e-4)" />
<radialGradient
inkscape:collect="always"
xlink:href="#linearGradient3999"
id="radialGradient2052"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-0.00142193,-4.5702768e-4)"
cx="34.133331"
cy="34.133335"
fx="34.133331"
fy="34.133335"
r="29.866665" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient5580"
id="linearGradient2140"
gradientUnits="userSpaceOnUse"
gradientTransform="translate(-0.0010513,-9.083059e-4)"
x1="29.866674"
y1="29.867579"
x2="38.400005"
y2="38.400913" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="8.0000001"
inkscape:cx="-15.9375"
inkscape:cy="15.75"
inkscape:current-layer="layer1"
showgrid="false"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="3840"
inkscape:window-height="2129"
inkscape:window-x="1200"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-bbox-edge-midpoints="true"
inkscape:bbox-nodes="true"
inkscape:snap-bbox-midpoints="true"
inkscape:snap-smooth-nodes="true"
inkscape:snap-midpoints="false"
inkscape:snap-intersection-paths="true"
inkscape:object-paths="true"
inkscape:snap-object-midpoints="true"
inkscape:snap-text-baseline="true"
inkscape:snap-center="true"
inkscape:pagecheckerboard="0">
<inkscape:grid
type="xygrid"
id="grid4446"
empspacing="16"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true"
spacingx="4.2666667"
spacingy="4.2666667"
originx="0"
originy="0" />
</sodipodi:namedview>
<metadata
id="metadata4432">
<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>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer">
<g
id="g2048"
transform="translate(9.113e-4,0.00104183)">
<rect
rx="8.5333338"
ry="8.5333338"
style="fill:url(#linearGradient2050);fill-opacity:1;stroke:none;stroke-width:17.0667"
id="rect2026"
width="68.266998"
height="68.26667"
x="-0.0016037956"
y="-0.00045376646" />
<rect
rx="4.2666626"
y="4.2662144"
x="4.2652307"
height="59.733334"
width="59.73333"
id="rect2028"
style="opacity:0.5;fill:url(#radialGradient2052);fill-opacity:1;stroke:none;stroke-width:14.9333"
ry="4.2666669" />
<path
style="opacity:1;fill:url(#linearGradient2140);fill-opacity:1;stroke:none;stroke-width:17.06666756"
d="m 8.5322887,-9.083059e-4 c -4.72747,0 -8.5332,3.8057359059 -8.5332,8.5332029059 V 59.731515 c 0,4.727467 3.80573,8.535156 8.5332,8.535156 H 59.731502 c 4.72747,0 8.5332,-3.807689 8.5332,-8.535156 V 8.5322946 c 0,-4.727467 -3.80573,-8.5332029059 -8.5332,-8.5332029059 z m 0,4.2675779059 H 59.731502 c 2.36373,0 4.26758,1.901892 4.26758,4.265625 V 59.731515 c 0,2.363733 -1.90385,4.267578 -4.26758,4.267578 H 8.5322887 c -2.36373,0 -4.26758,-1.903845 -4.26758,-4.267578 V 8.5322946 c 0,-2.363733 1.90385,-4.265625 4.26758,-4.265625 z"
id="path2046"
inkscape:connector-curvature="0" />
</g>
<path
style="fill:#000000;fill-opacity:0.494118;fill-rule:evenodd;stroke:none;stroke-width:0.999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 17.343575,15.030602 -1e-6,43.517002 38.229105,-21.758501 z"
id="path1382"
sodipodi:nodetypes="cccc" />
<path
style="fill:#00ff66;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 16.888808,11.986385 -1e-6,43.517003 38.229104,-21.758501 z"
id="path1059"
sodipodi:nodetypes="cccc" />
<path
id="path13539"
style="fill:#ff00ff;fill-opacity:0.992157;fill-rule:evenodd;stroke:none;stroke-width:0.999996px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="M 19.576616,50.882478 C 29.612077,45.170295 39.647539,39.458112 49.682999,33.745928 39.647539,28.032869 29.612077,22.319811 19.576616,16.606753 c 0,11.425241 0,22.850484 0,34.275725 z" />
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.9 KiB