Compare commits
No commits in common. "main" and "development" have entirely different histories.
main
...
developmen
9
.gitignore
vendored
@ -30,12 +30,3 @@ yarn-error.log*
|
||||
stats.html
|
||||
|
||||
test-results.xml
|
||||
|
||||
dist/*
|
||||
|
||||
# Generated FarmControl desktop bundle
|
||||
/public/desktop/bundle.json
|
||||
/public/desktop/models/
|
||||
|
||||
# Native macOS vibrancy (built by scripts/build-macos-effects.mjs)
|
||||
src/bun/libMacWindowEffects.dylib
|
||||
152
Jenkinsfile
vendored
@ -1,57 +1,3 @@
|
||||
properties([
|
||||
buildDiscarder(logRotator(numToKeepStr: '10'))
|
||||
])
|
||||
|
||||
def bunBinDir() {
|
||||
if (isUnix()) {
|
||||
return "${env.HOME}/.bun/bin"
|
||||
}
|
||||
return "${env.USERPROFILE}/.bun/bin"
|
||||
}
|
||||
|
||||
def withBun(Closure body) {
|
||||
def sep = isUnix() ? ':' : ';'
|
||||
withEnv(["PATH=${bunBinDir()}${sep}${env.PATH}"]) {
|
||||
body()
|
||||
}
|
||||
}
|
||||
|
||||
def checkBun() {
|
||||
if (isUnix()) {
|
||||
sh 'bun -v'
|
||||
} else {
|
||||
bat 'bun -v'
|
||||
}
|
||||
}
|
||||
|
||||
def writeBuildMetadata() {
|
||||
if (isUnix()) {
|
||||
sh '''
|
||||
bun --eval "await Bun.write('src/buildInfo.json', JSON.stringify({ buildNumber: process.env.BUILD_NUMBER || 'dev' }, null, 2) + '\\n')"
|
||||
'''
|
||||
} else {
|
||||
bat '''
|
||||
bun --eval "await Bun.write('src/buildInfo.json', JSON.stringify({ buildNumber: process.env.BUILD_NUMBER || 'dev' }, null, 2) + '\\n')"
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
def runBuild(buildCommand) {
|
||||
def releaseBaseUrl =
|
||||
"https://dist.farmcontrol.app/jenkins/farmcontrol/farmcontrol-ui"
|
||||
withEnv([
|
||||
"VITE_BUILD_NUMBER=${env.BUILD_NUMBER ?: 'dev'}",
|
||||
'NODE_ENV=production',
|
||||
"ELECTROBUN_RELEASE_BASE_URL=${releaseBaseUrl}",
|
||||
]) {
|
||||
if (isUnix()) {
|
||||
sh buildCommand
|
||||
} else {
|
||||
bat buildCommand
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def deploy() {
|
||||
node('ubuntu') {
|
||||
try {
|
||||
@ -80,6 +26,7 @@ def deploy() {
|
||||
|
||||
stage('Deploy (Ubuntu)') {
|
||||
nodejs(nodeJSInstallationName: 'Node23') {
|
||||
// Deploy to Cloudflare Pages using wrangler
|
||||
withCredentials([string(credentialsId: 'cloudflare-api-token', variable: 'CLOUDFLARE_API_TOKEN')]) {
|
||||
sh 'pnpm wrangler pages deploy build --branch main'
|
||||
}
|
||||
@ -91,101 +38,76 @@ def deploy() {
|
||||
}
|
||||
}
|
||||
|
||||
def prepareMacBuildWorkspace() {
|
||||
if (isUnix()) {
|
||||
sh '''
|
||||
df -h .
|
||||
for vol in /Volumes/Farm\\ Control*; do
|
||||
if [ -d "$vol" ]; then
|
||||
hdiutil detach "$vol" -force || true
|
||||
fi
|
||||
done
|
||||
rm -rf build/stable-macos-*/.dmg-staging build/stable-macos-*/.finalize-dmg-staging 2>/dev/null || true
|
||||
'''
|
||||
}
|
||||
}
|
||||
|
||||
def buildOnLabel(label, buildCommand, bundleCef = false) {
|
||||
def cefLabel = bundleCef ? 'cef' : 'native'
|
||||
def buildOnLabel(label, buildCommand) {
|
||||
return {
|
||||
node(label) {
|
||||
try {
|
||||
stage("Checkout (${label}/${cefLabel})") {
|
||||
stage("Checkout (${label})") {
|
||||
checkout scm
|
||||
}
|
||||
|
||||
withBun {
|
||||
stage("Check Bun (${label}/${cefLabel})") {
|
||||
checkBun()
|
||||
}
|
||||
|
||||
if (label.startsWith('macos')) {
|
||||
stage("Prepare macOS workspace (${label}/${cefLabel})") {
|
||||
prepareMacBuildWorkspace()
|
||||
}
|
||||
}
|
||||
|
||||
stage("Install Dependencies (${label}/${cefLabel})") {
|
||||
stage("Setup Node.js (${label})") {
|
||||
nodejs(nodeJSInstallationName: 'Node23') {
|
||||
if (isUnix()) {
|
||||
sh 'bun install --frozen-lockfile'
|
||||
sh 'node -v'
|
||||
sh 'pnpm -v'
|
||||
} else {
|
||||
bat 'bun install --frozen-lockfile'
|
||||
}
|
||||
}
|
||||
|
||||
stage("Write Build Metadata (${label}/${cefLabel})") {
|
||||
writeBuildMetadata()
|
||||
}
|
||||
|
||||
stage("Build (${label}/${cefLabel})") {
|
||||
withEnv(["ELECTROBUN_BUNDLE_CEF=${bundleCef ? 'true' : 'false'}"]) {
|
||||
runBuild(buildCommand)
|
||||
bat 'node -v'
|
||||
bat 'pnpm -v'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage("Archive Artifacts (${label}/${cefLabel})") {
|
||||
archiveArtifacts artifacts: 'app_dist/farmcontrol-*', fingerprint: true
|
||||
}
|
||||
} finally {
|
||||
cleanWs()
|
||||
}
|
||||
stage("Install Dependencies (${label})") {
|
||||
nodejs(nodeJSInstallationName: 'Node23') {
|
||||
if (isUnix()) {
|
||||
sh 'pnpm install --frozen-lockfile --production=false'
|
||||
} else {
|
||||
bat 'pnpm install --frozen-lockfile --production=false'
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def buildMacOnLabel(label, targetArch, bundleCef = false) {
|
||||
return buildOnLabel(label, "ELECTROBUN_TARGET_ARCH=${targetArch} bun run build:app:mac", bundleCef)
|
||||
stage("Build (${label})") {
|
||||
nodejs(nodeJSInstallationName: 'Node23') {
|
||||
if (isUnix()) {
|
||||
sh "VITE_BUILD_NUMBER=${env.BUILD_NUMBER} NODE_ENV=production ${buildCommand}"
|
||||
} else {
|
||||
bat "set VITE_BUILD_NUMBER=${env.BUILD_NUMBER} && set NODE_ENV=production && ${buildCommand}"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
stage("Archive Artifacts (${label})") {
|
||||
archiveArtifacts artifacts: 'app_dist/**/farmcontrol-*.dmg, app_dist/**/farmcontrol-*.exe, app_dist/**/farmcontrol-*.pkg, app_dist/**/farmcontrol-*.msi', fingerprint: true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
def setBuildNameFromPackageVersion() {
|
||||
node('ubuntu') {
|
||||
stage('Set Build Name') {
|
||||
checkout scm
|
||||
withBun {
|
||||
checkBun()
|
||||
def version = sh(
|
||||
script: "bun --eval \"console.log(JSON.parse(await Bun.file('package.json').text()).version)\"",
|
||||
def version
|
||||
nodejs(nodeJSInstallationName: 'Node23') {
|
||||
version = sh(
|
||||
script: "node -p \"require('./package.json').version\"",
|
||||
returnStdout: true
|
||||
).trim()
|
||||
}
|
||||
def buildName = "v${version}-b${env.BUILD_NUMBER}"
|
||||
currentBuild.displayName = buildName
|
||||
echo "Build name set to: ${buildName}"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
setBuildNameFromPackageVersion()
|
||||
|
||||
parallel(
|
||||
'Windows Build': buildOnLabel('windows', 'bun run build:app', false),
|
||||
'Windows CEF Build': buildOnLabel('windows', 'bun run build:app', true),
|
||||
'MacOS x64 Build': buildMacOnLabel('macos', 'x64', false),
|
||||
'MacOS x64 CEF Build': buildMacOnLabel('macos', 'x64', true),
|
||||
'MacOS arm64 Build': buildMacOnLabel('macos', 'arm64', false),
|
||||
'MacOS arm64 CEF Build': buildMacOnLabel('macos', 'arm64', true),
|
||||
'Windows Build': buildOnLabel('windows', 'pnpm build:electron'),
|
||||
'MacOS Build': buildOnLabel('macos', 'pnpm build:electron'),
|
||||
'Ubuntu Deploy': { deploy() }
|
||||
)
|
||||
|
||||
|
||||
|
Before Width: | Height: | Size: 12 KiB After Width: | Height: | Size: 13 KiB |
|
Before Width: | Height: | Size: 26 KiB After Width: | Height: | Size: 29 KiB |
BIN
assets/icon.ico
|
Before Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 613 B |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 130 KiB |
|
Before Width: | Height: | Size: 567 KiB |
BIN
assets/icon.png
|
Before Width: | Height: | Size: 30 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(-1.001515,0,0,1.001515,62.999788,3.331628)">
|
||||
<path d="M32.953,57.25C34.312,57.25 35.438,56.766 36.406,55.828L60.047,32.719C61.312,31.438 61.906,30.172 61.906,28.625C61.891,27.047 61.297,25.766 60.047,24.531L36.406,1.422C35.438,0.469 34.328,0 32.953,0C30.172,0 27.906,2.234 27.906,4.984C27.906,6.328 28.484,7.609 29.531,8.641L51.438,29.859L51.438,27.312L29.531,48.609C28.5,49.625 27.906,50.906 27.906,52.281C27.906,55.016 30.172,57.25 32.953,57.25Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M5.016,57.25C6.375,57.25 7.5,56.766 8.484,55.828L32.125,32.719C33.406,31.438 33.984,30.172 33.984,28.625C33.953,27.047 33.391,25.766 32.125,24.531L8.469,1.422C7.531,0.469 6.391,0 5.016,0C2.234,0 0,2.234 0,4.984C0,6.328 0.562,7.609 1.594,8.641L23.516,29.859L23.516,27.312L1.594,48.609C0.578,49.625 0,50.906 0,52.281C0,55.016 2.234,57.25 5.016,57.25Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.001515,0,0,1.001515,1,3.331628)">
|
||||
<path d="M32.953,57.25C34.312,57.25 35.438,56.766 36.406,55.828L60.047,32.719C61.312,31.438 61.906,30.172 61.906,28.625C61.891,27.047 61.297,25.766 60.047,24.531L36.406,1.422C35.438,0.469 34.328,0 32.953,0C30.172,0 27.906,2.234 27.906,4.984C27.906,6.328 28.484,7.609 29.531,8.641L51.438,29.859L51.438,27.312L29.531,48.609C28.5,49.625 27.906,50.906 27.906,52.281C27.906,55.016 30.172,57.25 32.953,57.25Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M5.016,57.25C6.375,57.25 7.5,56.766 8.484,55.828L32.125,32.719C33.406,31.438 33.984,30.172 33.984,28.625C33.953,27.047 33.391,25.766 32.125,24.531L8.469,1.422C7.531,0.469 6.391,0 5.016,0C2.234,0 0,2.234 0,4.984C0,6.328 0.562,7.609 1.594,8.641L23.516,29.859L23.516,27.312L1.594,48.609C0.578,49.625 0,50.906 0,52.281C0,55.016 2.234,57.25 5.016,57.25Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.768446,0,0,0.768446,3,15.307494)">
|
||||
<path d="M17.266,59.484L42.172,59.484C47.656,59.484 51.984,57.859 54.875,54.938C57.844,52.016 59.438,47.672 59.438,42.219L59.438,17.281C59.438,11.812 57.844,7.484 54.875,4.547C51.969,1.625 47.656,0 42.172,0L17.266,0C11.797,0 7.438,1.641 4.547,4.547C1.594,7.484 0,11.812 0,17.281L0,42.219C0,47.672 1.578,52.016 4.547,54.938C7.453,57.875 11.797,59.484 17.266,59.484ZM17.766,51.422C14.406,51.422 11.953,50.672 10.391,49.109C8.797,47.547 8.062,45.125 8.062,41.703L8.062,17.781C8.062,14.375 8.797,11.953 10.391,10.375C11.922,8.844 14.406,8.062 17.766,8.062L41.656,8.062C45.047,8.062 47.484,8.828 49.047,10.375C50.641,11.953 51.375,14.375 51.375,17.781L51.375,41.703C51.375,45.125 50.641,47.547 49.047,49.109C47.5,50.656 45.047,51.422 41.656,51.422L17.766,51.422Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M33.203,40.672L33.203,18.781C33.203,16.797 31.719,15.359 29.719,15.359C27.719,15.359 26.281,16.797 26.281,18.781L26.281,40.672C26.281,42.641 27.719,44.078 29.719,44.078C31.719,44.078 33.203,42.656 33.203,40.672ZM18.812,33.188L40.688,33.188C42.656,33.188 44.109,31.734 44.109,29.75C44.109,27.734 42.656,26.25 40.688,26.25L18.812,26.25C16.797,26.25 15.375,27.734 15.375,29.75C15.375,31.734 16.812,33.188 18.812,33.188Z" style="fill-rule:nonzero;"/>
|
||||
<g transform="matrix(1,0,0,1,16.03954,-16.03954)">
|
||||
<path d="M0.61,11.824C1.325,8.873 2.658,6.426 4.547,4.547C7.438,1.641 11.797,0 17.266,0L42.172,0C47.656,0 51.969,1.625 54.875,4.547C57.844,7.484 59.438,11.812 59.438,17.281L59.438,42.219C59.438,47.672 57.844,52.016 54.875,54.937C53.021,56.811 50.576,58.152 47.613,58.873C47.617,58.669 47.619,58.464 47.619,58.258L47.619,50.178C48.16,49.877 48.635,49.521 49.047,49.109C50.641,47.547 51.375,45.125 51.375,41.703L51.375,17.781C51.375,14.375 50.641,11.953 49.047,10.375C47.484,8.828 45.047,8.062 41.656,8.062L17.766,8.062C14.406,8.062 11.922,8.844 10.391,10.375C9.966,10.795 9.603,11.275 9.298,11.818L1.226,11.818C1.019,11.818 0.814,11.82 0.61,11.824Z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.5 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.881711,0,0,0.881711,3,-0.216913)">
|
||||
<path d="M0,36.625C0,57 14.062,69.844 34.156,69.844C39.234,69.844 43.125,69.328 45.578,68.453C47.531,67.75 48.266,66.672 48.266,65.156C48.266,63.531 47.203,62.391 45.266,62.391C44.688,62.391 44.109,62.453 43.438,62.547C40.844,63.094 38.5,63.484 35.219,63.484C18.266,63.484 7.078,53.359 7.078,36.797C7.078,20.641 17.812,9.578 33.641,9.578C48.109,9.578 58.953,18.625 58.953,33.953C58.953,41.922 56.359,47.25 52.203,47.25C49.438,47.25 47.891,45.422 47.891,42.266L47.891,24.203C47.891,21.688 46.516,20.25 44.062,20.25C41.656,20.25 40.266,21.688 40.266,24.203L40.266,26.188L39.703,26.188C38.125,22.453 34.5,20.25 30,20.25C22.062,20.25 16.625,26.891 16.625,36.703C16.625,46.75 22.188,53.609 30.469,53.609C35.172,53.609 38.516,51.266 40.234,47.062L40.766,47.062C41.719,51.156 45.438,53.578 50.5,53.578C59.984,53.578 65.781,45.391 65.781,33.203C65.781,15.172 52.547,3.234 33.672,3.234C13.828,3.234 0,16.672 0,36.625ZM32.375,46.75C27.922,46.75 25.156,43 25.156,36.891C25.156,30.828 27.953,27.047 32.391,27.047C36.906,27.047 39.734,30.781 39.734,36.828C39.734,42.938 36.875,46.75 32.375,46.75Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.245638,0,0,1.245638,3,12.546644)">
|
||||
<path d="M4.656,9.516L41.906,9.516C44.391,9.516 46.562,7.359 46.562,4.781C46.562,2.203 44.391,0.047 41.906,0.047L4.656,0.047C2.266,0.047 0,2.203 0,4.781C0,7.359 2.266,9.516 4.656,9.516ZM4.656,31.188L41.906,31.188C44.391,31.188 46.562,29.047 46.562,26.469C46.562,23.891 44.391,21.719 41.906,21.719L4.656,21.719C2.266,21.719 0,23.891 0,26.469C0,29.047 2.266,31.188 4.656,31.188Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 936 B |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 72 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.093797,0,0,1.093797,0.640357,-0.002979)">
|
||||
<path d="M39.703,63.992C33.273,63.965 32.923,63.847 31.428,63.333C28.308,62.274 25.677,60.059 24.093,57.166L23.605,56.273L22.819,56.189C21.521,56.058 19.247,55.63 17.735,55.249C11.032,53.558 6.21,50.355 4.507,46.45C4.352,46.116 4.138,45.39 4.031,44.83C3.459,41.997 4.555,39.068 7.079,36.734C7.626,36.222 7.876,35.877 8.031,35.424C8.138,35.091 8.341,34.638 8.46,34.436C8.686,34.067 8.686,34.055 8.341,33.305C7.4,31.269 7.388,29.197 8.329,27.244L8.686,26.506L8.4,25.947C7.698,24.577 7.436,22.732 7.757,21.386L7.9,20.767L7.103,20.041C4.519,17.636 3.4,14.6 4.066,11.718C4.781,8.539 7.198,5.896 11.389,3.681C15.104,1.728 19.473,0.585 25.236,0.073C26.51,-0.046 31.999,0.109 33.488,0.3C40.929,1.252 46.93,3.824 50.157,7.467C53.669,11.432 53.36,16.338 49.371,20.041L48.573,20.767L48.716,21.386C49.038,22.744 48.776,24.565 48.061,25.97C47.775,26.554 47.775,26.566 48.002,26.935C48.537,27.792 48.799,28.876 48.799,30.245C48.799,30.465 48.795,30.668 48.786,30.858C47.381,30.973 46.02,31.246 44.722,31.661C45.016,31.051 45.191,29.981 45.025,29.697C44.93,29.518 44.858,29.53 44.43,29.828C41.763,31.638 38.048,32.948 33.547,33.65C32.059,33.876 31.285,33.924 28.237,33.924C25.189,33.924 24.415,33.876 22.926,33.65C18.545,32.959 14.878,31.709 12.294,29.995C11.484,29.459 11.496,29.459 11.413,29.804C11.222,30.554 11.639,31.709 12.425,32.686C13.687,34.257 16.783,35.865 20.152,36.734C25.553,38.129 31.889,38.015 36.956,36.571C35.707,37.901 34.654,39.418 33.845,41.075C32.625,41.258 31.365,41.384 30.082,41.449L28.499,41.532L29.237,42.33C29.654,42.771 30.308,43.58 30.689,44.128C31.344,45.069 31.404,45.128 31.785,45.069C31.904,45.049 32.16,45.014 32.465,44.973C32.161,46.294 32,47.67 32,49.083C32,51.584 32.504,53.969 33.415,56.141C33.042,56.019 32.813,55.848 32.404,55.606C31.63,55.141 30.725,54.118 30.344,53.26C30.213,52.963 29.951,52.058 29.749,51.26C28.82,47.45 26.891,44.664 23.688,42.509C22.272,41.556 21.39,41.163 18.414,40.187C15.759,39.306 13.496,38.317 12.294,37.496C11.484,36.948 11.508,36.948 11.413,37.424C11.175,38.71 12.294,40.437 14.223,41.747C15.342,42.497 17.259,43.366 19.176,43.997C21.188,44.652 22.2,45.176 23.224,46.069C24.927,47.545 25.546,48.76 26.189,51.808C26.76,54.522 27.57,56.082 29.213,57.642C30.356,58.725 31.416,59.38 32.797,59.845L33.797,60.19L35.768,60.196C36.883,61.649 38.21,62.93 39.703,63.992ZM10.186,43.271C9.71,42.794 9.115,42.08 8.841,41.675L8.365,40.949L8.019,41.687C7.329,43.175 7.662,44.997 8.889,46.462C10.913,48.867 15.223,50.962 20.152,51.927C22.724,52.427 22.498,52.415 22.414,52.022C22.105,50.605 21.605,49.617 20.926,49.01C20.283,48.45 19.438,48.057 17.366,47.355C16.366,47.009 15.068,46.509 14.497,46.235C13.008,45.545 11.198,44.295 10.186,43.271ZM12.818,23.601C12.187,23.327 11.603,23.065 11.532,23.041C11.425,22.994 11.413,23.089 11.472,23.387C12.079,26.066 16.437,28.649 22.081,29.673C24.224,30.066 25.534,30.173 28.237,30.173C30.94,30.173 32.249,30.066 34.392,29.673C40.036,28.649 44.394,26.066 45.001,23.387C45.061,23.089 45.049,22.994 44.942,23.041C44.87,23.065 44.287,23.327 43.656,23.601C40.751,24.875 37.274,25.744 32.987,26.268C31.261,26.482 25.212,26.482 23.486,26.268C19.2,25.744 15.723,24.875 12.818,23.601ZM31.19,3.872C23.391,3.241 15.259,5.098 10.663,8.563C9.448,9.48 8.71,10.337 8.138,11.48C7.722,12.302 7.674,12.516 7.674,13.361C7.674,14.635 8.138,15.623 9.305,16.85C13.115,20.886 22.414,23.327 31.309,22.613C38.429,22.041 44.287,19.922 47.168,16.85C48.335,15.623 48.799,14.635 48.799,13.361C48.799,12.516 48.752,12.302 48.335,11.48C47.764,10.337 47.025,9.48 45.811,8.563C42.37,5.979 37.345,4.36 31.19,3.872ZM25.796,7.932C29.999,7.265 34.869,8.527 36.595,10.718C37.357,11.694 37.548,12.218 37.548,13.361C37.548,14.516 37.357,15.04 36.595,16.016C34.488,18.683 28.249,19.791 23.677,18.302C21.355,17.54 20.057,16.576 19.223,14.992C18.795,14.183 18.795,12.552 19.223,11.742C20.259,9.765 22.533,8.444 25.796,7.932ZM30.118,11.67C27.32,11.206 23.915,11.873 22.807,13.099C22.581,13.361 22.581,13.373 22.807,13.635C23.605,14.504 26.082,15.242 28.237,15.242C30.392,15.242 32.868,14.504 33.666,13.635C33.892,13.373 33.892,13.361 33.666,13.099C33.083,12.468 31.797,11.944 30.118,11.67Z"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,35.1075,-13.675)">
|
||||
<path d="M19.178,83.675L21.86,83.675C22.896,83.675 23.714,83.056 23.949,82.006L24.677,79.011C25.075,78.891 25.513,78.706 25.906,78.51L28.52,80.101C29.389,80.672 30.396,80.644 31.191,79.849L33.035,77.979C33.748,77.216 33.821,76.234 33.251,75.277L31.691,72.637C31.913,72.276 32.021,71.92 32.166,71.528L35.186,70.826C36.217,70.564 36.892,69.747 36.892,68.705L36.892,66.06C36.892,65.038 36.191,64.272 35.186,64.011L32.197,63.289C32.038,62.825 31.867,62.484 31.722,62.148L33.37,59.446C33.904,58.571 33.804,57.481 33.086,56.8L31.18,54.956C30.427,54.209 29.411,54.031 28.562,54.596L25.906,56.269C25.436,56.028 25.075,55.914 24.683,55.769L23.949,52.722C23.714,51.712 22.896,51.042 21.86,51.042L19.178,51.042C18.131,51.042 17.304,51.737 17.063,52.728L16.381,55.737C15.886,55.903 15.519,56.028 15.101,56.269L12.444,54.596C11.633,54.068 10.585,54.204 9.852,54.956L7.997,56.8C7.279,57.501 7.077,58.571 7.642,59.446L9.316,62.148C9.166,62.484 8.981,62.876 8.81,63.289L5.852,64.011C4.841,64.272 4.177,65.064 4.177,66.06L4.177,68.705C4.177,69.747 4.847,70.564 5.852,70.826L8.847,71.528C9.037,71.92 9.182,72.276 9.342,72.637L7.782,75.302C7.211,76.234 7.311,77.267 8.023,77.979L9.847,79.849C10.585,80.638 11.613,80.646 12.487,80.101L15.158,78.51C15.596,78.757 15.989,78.891 16.381,79.011L17.063,82.006C17.299,83.005 18.131,83.675 19.178,83.675ZM20.491,72.507C17.681,72.507 15.371,70.197 15.371,67.387C15.371,64.551 17.681,62.236 20.491,62.236C23.326,62.236 25.642,64.551 25.642,67.387C25.642,70.197 23.326,72.507 20.491,72.507Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 6.1 KiB |
@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.607884,0,0,0.607884,2,6.470704)">
|
||||
<path d="M50.153,64.047L37.296,64.047C35.825,69.222 31.078,73.031 25.453,73.031C19.816,73.031 15.034,69.222 13.552,64.047L10.547,64.047C3.781,64.047 0,60.266 0,53.516L0,11.688C0,4.938 3.781,1.141 10.547,1.141L57.859,1.141C64.609,1.141 68.391,4.938 68.391,11.688L68.391,18.422L76.766,18.422C79.761,18.422 81.953,19.046 83.846,20.626C83.618,20.616 83.389,20.612 83.159,20.611L83.154,20.611C78.507,20.611 74.687,22.221 70.737,26.132L70.727,26.142L60.359,36.468L60.359,12.328C60.359,10.141 59.281,9.141 57.172,9.141L11.203,9.141C9.078,9.141 8.031,10.141 8.031,12.328L8.031,52.859C8.031,55.062 9.078,56.031 11.203,56.031L13.984,56.031C15.828,51.524 20.28,48.344 25.453,48.344C30.614,48.344 35.037,51.524 36.867,56.031L47.85,56.031C47.915,58.873 48.681,61.577 50.153,64.047ZM25.453,66.422C28.609,66.422 31.156,63.828 31.156,60.656C31.156,57.5 28.609,54.906 25.453,54.906C22.281,54.906 19.688,57.5 19.688,60.656C19.688,63.828 22.281,66.422 25.453,66.422Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0.319305,0,0,0.319305,12.718629,15.454198)">
|
||||
<rect x="0" y="0" width="61.719" height="58.219" style="fill-opacity:0;"/>
|
||||
<path d="M24.594,58.219C27.5,58.219 29.781,57.156 31.312,54.875L59.969,12.312C61.062,10.719 61.531,9.062 61.531,7.625C61.531,3.5 58.25,0.375 54,0.375C51.125,0.375 49.281,1.406 47.5,4.156L24.469,40.125L13.062,27C11.562,25.281 9.812,24.469 7.438,24.469C3.156,24.469 0,27.594 0,31.75C0,33.625 0.5,35.125 2.125,36.969L18.188,55.406C19.906,57.344 21.969,58.219 24.594,58.219Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.515011,0,0,0.515011,34.08479,22)">
|
||||
<path d="M0.001,35.371C-0.038,39.202 1.473,42.727 4.441,45.671L16.349,57.61C11.913,60.839 9.844,64.493 9.844,69.059C9.844,76.236 15.431,81.432 22.42,81.549C26.022,81.612 29.343,80.305 31.751,77.938L53.883,55.695C59.804,49.751 59.453,42.361 52.939,35.83L41.879,24.794L44.775,21.89C47.234,19.407 48.675,16.156 48.692,12.936C48.785,5.665 43.16,0.007 35.85,0C31.88,0 28.667,1.489 25.293,4.83L3.649,26.387C1.324,28.753 0.032,31.925 0.001,35.371ZM18.613,24.255L31.665,11.203C33.369,9.474 34.298,9.018 35.85,9.018C37.991,9.018 39.664,10.692 39.664,12.825C39.664,13.85 39.304,14.61 38.379,15.518L24.077,29.836C23.14,27.191 21.326,25.315 18.613,24.255ZM9.135,35.594C9.135,33.425 10.709,31.799 12.756,31.799C14.857,31.799 16.468,33.464 16.468,35.669C16.468,36.68 16.444,37.157 16.216,37.941C15.03,43.335 21.775,44.881 24.421,42.268L35.475,31.174L46.542,42.227C49.615,45.227 49.817,47.01 47.511,49.299L33.566,63.268C32.715,61.558 31.327,59.892 29.126,57.643L11.994,40.417C9.701,38.148 9.135,37.157 9.135,35.594ZM18.887,69.149C18.887,67.295 20.04,65.793 22.846,64.06L23.303,64.516C25.504,66.773 26.164,67.845 26.172,69.173C26.22,71.078 24.636,72.476 22.444,72.476C20.445,72.476 18.887,71.13 18.887,69.149Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.989624,0,0,0.989624,3,3.012667)">
|
||||
<path d="M32.232,55.642C32.232,57.251 30.901,58.583 29.291,58.583C27.682,58.583 26.351,57.251 26.351,55.642C26.351,54.032 27.682,52.701 29.291,52.701C30.901,52.701 32.232,54.032 32.232,55.642ZM32.232,46.867C32.232,48.476 30.901,49.807 29.291,49.807C27.682,49.807 26.351,48.476 26.351,46.867C26.351,45.258 27.682,43.926 29.291,43.926C30.901,43.926 32.232,45.258 32.232,46.867ZM32.232,38.066C32.232,39.676 30.901,41.007 29.291,41.007C28.398,41.007 27.591,40.597 27.05,39.956C27.916,38.466 28.763,36.862 29.604,35.143C31.07,35.301 32.232,36.562 32.232,38.066ZM58.608,29.291C58.608,30.901 57.277,32.232 55.667,32.232C54.058,32.232 52.727,30.901 52.727,29.291C52.727,27.682 54.058,26.351 55.667,26.351C57.277,26.351 58.608,27.682 58.608,29.291ZM5.881,29.291C5.881,30.901 4.55,32.232 2.941,32.232C1.331,32.232 0,30.901 0,29.291C0,27.682 1.331,26.351 2.941,26.351C4.55,26.351 5.881,27.682 5.881,29.291ZM14.656,29.291C14.656,30.901 13.351,32.232 11.716,32.232C10.106,32.232 8.775,30.901 8.775,29.291C8.775,27.682 10.106,26.351 11.716,26.351C13.351,26.351 14.656,27.682 14.656,29.291ZM23.457,29.291C23.457,30.901 22.126,32.232 20.516,32.232C18.907,32.232 17.576,30.901 17.576,29.291C17.576,27.682 18.907,26.351 20.516,26.351C22.126,26.351 23.457,27.682 23.457,29.291ZM41.032,29.291C41.032,30.901 39.701,32.232 38.092,32.232C36.483,32.232 35.151,30.901 35.151,29.291C35.151,27.682 36.483,26.351 38.092,26.351C39.701,26.351 41.032,27.682 41.032,29.291ZM49.807,29.291C49.807,30.901 48.476,32.232 46.867,32.232C45.258,32.232 43.926,30.901 43.926,29.291C43.926,27.682 45.258,26.351 46.867,26.351C48.476,26.351 49.807,27.682 49.807,29.291ZM31.442,31.281C31.58,30.996 31.718,30.691 31.857,30.384C31.977,30.118 32.096,29.855 32.214,29.607C32.145,30.248 31.864,30.83 31.442,31.281ZM26.771,28.065L26.377,28.924C26.451,28.32 26.715,27.77 27.108,27.338L26.771,28.065ZM31.523,18.59C30.658,20.084 29.813,21.691 28.972,23.413C27.51,23.255 26.351,22.016 26.351,20.491C26.351,18.881 27.682,17.55 29.291,17.55C30.179,17.55 30.983,17.955 31.523,18.59ZM32.232,11.716C32.232,13.325 30.901,14.656 29.291,14.656C27.682,14.656 26.351,13.325 26.351,11.716C26.351,10.106 27.682,8.775 29.291,8.775C30.901,8.775 32.232,10.106 32.232,11.716ZM32.232,2.941C32.232,4.55 30.901,5.881 29.291,5.881C27.682,5.881 26.351,4.55 26.351,2.941C26.351,1.331 27.682,0 29.291,0C30.901,0 32.232,1.331 32.232,2.941Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M2.803,52.396C1.307,52.643 0.237,54.108 0.504,55.597C0.751,57.093 2.216,58.169 3.711,57.928C17.696,55.598 24.556,46.57 31.857,30.384C38.113,16.508 43.608,8.067 55.805,6.052C57.295,5.806 58.371,4.341 58.129,2.851C57.851,1.356 56.392,0.28 54.897,0.521C40.932,2.825 34.078,11.879 26.771,28.065C20.515,41.941 15,50.382 2.803,52.396Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.2 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(-1.243968,0,0,1.243968,61,3.835791)">
|
||||
<path d="M42.109,45.25C44.844,45.25 46.625,43.016 46.625,40.172C46.625,37.656 45.609,36.141 42.891,35.062L13.141,22.688L13.141,22.297L42.875,9.891C45.422,8.859 46.625,7.391 46.625,4.984C46.625,2.156 44.656,0.031 41.844,0.031C40.516,0.031 39.406,0.359 38.281,0.906L5.203,15.984C1.922,17.453 0,19.469 0,22.688C0,25.938 1.922,27.969 5.203,29.453L38.281,44.281C39.5,44.828 40.688,45.25 42.109,45.25Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 956 B |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.039523,0,0,1.039523,10.860319,2)">
|
||||
<path d="M0,52.969C0,55.75 1.984,57.719 4.734,57.719L35.953,57.719C38.688,57.719 40.672,55.75 40.672,52.969C40.672,50.219 38.688,48.25 35.953,48.25L4.734,48.25C1.984,48.25 0,50.219 0,52.969ZM4.531,40.031C1.766,40.031 0,37.797 0,34.953C0,32.453 1.094,30.984 3.734,29.906L26.438,19.969L26.438,19.625L3.75,9.844C1.266,8.828 0,7.359 0,4.953C0,2.125 1.969,0 4.797,0C6.109,0 7.297,0.328 8.344,0.859L34.375,13.328C37.609,14.891 39.578,16.766 39.578,19.984C39.578,23.25 37.625,25.125 34.375,26.703L8.344,39.094C7.188,39.672 5.938,40.031 4.531,40.031Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.824327,0,0,0.976141,2.488276,-2.712014)">
|
||||
<path d="M56.78,22.995C64.017,23.632 69.667,28.805 69.667,35.084L69.667,42.696C69.667,49.405 63.217,54.851 55.273,54.851L52.514,54.851L39.525,64.685C37.406,66.289 34.196,66.289 32.077,64.685L19.088,54.851L16.329,54.851C8.385,54.851 1.935,49.405 1.935,42.696L1.935,35.084C1.935,28.805 7.585,23.632 14.822,22.995L14.822,8.007C14.822,6.476 16.294,5.233 18.107,5.233C19.921,5.233 21.393,6.476 21.393,8.007L21.393,22.929L50.209,22.929L50.209,8.007C50.209,6.476 51.681,5.233 53.495,5.233C55.308,5.233 56.78,6.476 56.78,8.007L56.78,22.995ZM28.932,54.851L35.801,60.052L42.67,54.851L28.932,54.851ZM55.273,49.302C59.591,49.302 63.096,46.342 63.096,42.696L63.096,35.084C63.096,31.438 59.591,28.478 55.273,28.478L16.329,28.478C12.011,28.478 8.506,31.438 8.506,35.084L8.506,42.696C8.506,46.342 12.011,49.302 16.329,49.302L55.273,49.302Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.779032,0,0,0.779032,3.073021,9.025537)">
|
||||
<path d="M22.587,55.452L29.317,55.452L29.317,3.541L22.587,3.541L22.587,55.452ZM44.947,55.452L51.677,55.452L51.677,3.541L44.947,3.541L44.947,55.452ZM10.588,58.962L63.676,58.962C70.606,58.962 74.264,55.326 74.264,48.481L74.264,10.522C74.264,3.667 70.606,0.02 63.676,0.02L10.588,0.02C3.679,0.02 0,3.667 0,10.522L0,48.481C0,55.326 3.679,58.962 10.588,58.962ZM11.167,52.003C8.429,52.003 6.959,50.615 6.959,47.743L6.959,11.251C6.959,8.378 8.429,6.979 11.167,6.979L63.097,6.979C65.813,6.979 67.305,8.378 67.305,11.251L67.305,47.743C67.305,50.615 65.813,52.003 63.097,52.003L11.167,52.003Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.243968,0,0,1.243968,3,3.835791)">
|
||||
<path d="M42.109,45.25C44.844,45.25 46.625,43.016 46.625,40.172C46.625,37.656 45.609,36.141 42.891,35.062L13.141,22.688L13.141,22.297L42.875,9.891C45.422,8.859 46.625,7.391 46.625,4.984C46.625,2.156 44.656,0.031 41.844,0.031C40.516,0.031 39.406,0.359 38.281,0.906L5.203,15.984C1.922,17.453 0,19.469 0,22.688C0,25.938 1.922,27.969 5.203,29.453L38.281,44.281C39.5,44.828 40.688,45.25 42.109,45.25Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 954 B |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.039523,0,0,1.039523,10.860319,2)">
|
||||
<path d="M0,52.969C0,55.75 1.984,57.719 4.734,57.719L35.953,57.719C38.688,57.719 40.672,55.75 40.672,52.969C40.672,50.219 38.688,48.25 35.953,48.25L4.734,48.25C1.984,48.25 0,50.219 0,52.969ZM35.047,40.031C37.812,40.031 39.578,37.797 39.578,34.953C39.578,32.453 38.484,30.984 35.844,29.906L13.141,19.969L13.141,19.625L35.828,9.844C38.312,8.828 39.578,7.359 39.578,4.953C39.578,2.125 37.609,0 34.781,0C33.469,0 32.281,0.328 31.234,0.859L5.203,13.328C1.969,14.891 0,16.766 0,19.984C0,23.25 1.953,25.125 5.203,26.703L31.234,39.094C32.391,39.672 33.641,40.031 35.047,40.031Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,29 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no" ?>
|
||||
<svg
|
||||
width="100%"
|
||||
height="100%"
|
||||
viewBox="0 0 64 64"
|
||||
version="1.1"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||
xml:space="preserve"
|
||||
class="th-icon"
|
||||
style="fill-rule:evenodd;clip-rule:evenodd;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:1.5;"
|
||||
>
|
||||
|
||||
<g>
|
||||
<path
|
||||
d="M32,5.131C46.829,5.131 58.869,17.171 58.869,32"
|
||||
style="fill:none;"
|
||||
/>
|
||||
<animateTransform
|
||||
attributeName="transform"
|
||||
attributeType="XML"
|
||||
type="rotate"
|
||||
from="0 32 32"
|
||||
to="360 32 32"
|
||||
dur="1s"
|
||||
repeatCount="indefinite"
|
||||
/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 774 B |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.885551,0,0,0.885551,3,2.046843)">
|
||||
<path d="M50.547,29.572C51.295,29.572 51.877,29.045 51.995,28.338C53.37,19.038 54.594,17.459 64.024,16.253C64.81,16.143 65.361,15.53 65.361,14.782C65.361,14.043 64.81,13.453 64.024,13.367C54.904,12.161 53.559,10.64 51.995,1.321C51.829,0.503 51.295,0 50.547,0C49.808,0 49.226,0.503 49.132,1.314C47.805,10.551 46.39,12.113 37.086,13.367C36.316,13.453 35.765,14.043 35.765,14.782C35.765,15.53 36.316,16.112 37.086,16.253C46.127,17.794 47.513,18.895 49.132,28.33C49.242,29.045 49.817,29.572 50.547,29.572ZM9.329,55.436C9.964,55.436 10.42,54.98 10.507,54.376C11.325,48.334 11.42,48.159 17.652,47.278C18.28,47.168 18.712,46.696 18.712,46.108C18.712,45.496 18.304,45.023 17.652,44.937C11.349,43.794 11.349,43.667 10.507,37.815C10.42,37.187 9.941,36.731 9.329,36.731C8.724,36.731 8.268,37.187 8.158,37.839C7.364,43.714 7.292,43.937 1.108,44.937C0.384,45.023 0,45.448 0,46.108C0,46.696 0.384,47.144 1.013,47.278C7.34,48.398 7.388,48.501 8.158,54.376C8.268,54.98 8.724,55.436 9.329,55.436ZM20.339,65.06C20.762,65.06 21.06,64.755 21.13,64.332C21.788,60.84 21.727,60.803 25.481,60.013C25.903,59.919 26.177,59.661 26.177,59.246C26.177,58.831 25.927,58.518 25.505,58.432C21.734,57.665 21.802,57.643 21.13,54.081C21.06,53.665 20.731,53.36 20.339,53.36C19.916,53.36 19.595,53.665 19.525,54.096C18.87,57.643 18.968,57.688 15.205,58.432C14.727,58.542 14.453,58.823 14.453,59.246C14.453,59.661 14.727,59.919 15.15,60.013C18.968,60.803 18.87,60.84 19.525,64.309C19.595,64.755 19.916,65.06 20.339,65.06Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M55.838,66.006C57.977,68.2 61.69,68.193 63.862,66.006C66.042,63.788 66.042,60.206 63.855,57.981L20.002,13.818C17.839,11.624 14.149,11.624 11.954,13.818C9.774,16.06 9.774,19.641 11.961,21.859L55.838,66.006ZM28.346,32.791L15.017,19.432C14.341,18.732 14.317,17.622 15.017,16.922C15.71,16.205 16.851,16.198 17.575,16.922L30.815,30.241L28.346,32.791Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,13 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.550669,0,0,0.550669,3.539221,19.893693)">
|
||||
<path d="M12.25,59.219L69.375,59.219C77,59.219 81.531,54.688 81.531,46.969L81.531,12.281C81.531,4.562 77,0.031 69.25,0.031L12.156,0.031C4.531,0.031 0,4.562 0,12.281L0,46.969C0,54.688 4.531,59.219 12.25,59.219ZM13.031,49.094C11.156,49.094 10.125,48.062 10.125,46.156L10.125,13.094C10.125,11.188 11.156,10.156 13.031,10.156L68.469,10.156C70.344,10.156 71.406,11.188 71.406,13.094L71.406,46.156C71.406,48.062 70.344,49.094 68.469,49.094L13.031,49.094ZM40.75,39.594C43.531,39.594 45.562,38.719 48.031,36.5L76.344,11L70.406,5.031L42.75,30C42.094,30.562 41.469,30.906 40.75,30.906C40.062,30.906 39.438,30.562 38.781,30L11.125,5.031L5.156,11L33.5,36.5C35.938,38.719 38,39.594 40.75,39.594ZM11.875,52.531L33.656,30.75L27.531,24.906L5.906,46.531L11.875,52.531ZM69.656,52.531L75.625,46.531L54,24.906L47.875,30.75L69.656,52.531Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.712671,0,0,0.701139,14.732018,4.477477)">
|
||||
<path d="M60.461,23.664L63.969,20.107L63.969,20.931C63.969,22.899 62.397,24.496 60.461,24.496C58.525,24.496 56.953,22.899 56.953,20.931L56.953,20.107L60.461,23.664ZM60.461,23.664L56.953,20.099C56.953,19.993 56.948,19.889 56.938,19.787C56.744,17.829 58.15,16.079 60.077,15.882C62.003,15.685 63.724,17.115 63.918,19.073C63.952,19.41 63.969,19.752 63.969,20.099L60.461,23.664ZM60.461,49.46L56.953,45.886L56.953,45.063C56.953,43.095 58.525,41.497 60.461,41.497C62.397,41.497 63.969,43.095 63.969,45.063L63.969,45.886L60.461,49.46ZM60.461,49.46L63.969,45.895C63.969,46.241 63.952,46.583 63.918,46.921C63.724,48.879 62.003,50.308 60.077,50.111C58.15,49.914 56.744,48.164 56.938,46.206C56.948,46.104 56.953,46 56.953,45.895L60.461,49.46ZM53.959,56.069L53.043,56.069C51.107,56.069 49.535,54.472 49.535,52.504C49.535,50.536 51.107,48.938 53.043,48.938L53.949,48.938L53.959,56.069ZM53.959,56.069L53.959,48.938C54.063,48.938 54.165,48.933 54.266,48.922C56.192,48.725 57.913,50.155 58.107,52.113C58.301,54.071 56.895,55.821 54.968,56.018C54.636,56.052 54.3,56.069 53.959,56.069ZM4.873,23.664L1.365,20.099C1.365,19.752 1.382,19.41 1.415,19.073C1.609,17.115 3.33,15.685 5.257,15.882C7.183,16.079 8.59,17.829 8.396,19.787C8.386,19.889 8.38,19.993 8.38,20.099L4.873,23.664ZM4.873,23.664L8.38,20.107L8.38,20.931C8.38,22.899 6.809,24.496 4.873,24.496C2.936,24.496 1.365,22.899 1.365,20.931L1.365,20.107L4.873,23.664ZM11.374,17.055C11.271,17.055 11.169,17.061 11.068,17.071C9.142,17.268 7.42,15.838 7.226,13.88C7.032,11.922 8.439,10.173 10.365,9.976C10.697,9.942 11.034,9.924 11.374,9.924L11.374,17.055ZM11.374,17.055L11.384,9.924L12.29,9.924C14.226,9.924 15.798,11.522 15.798,13.49C15.798,15.458 14.226,17.055 12.29,17.055L11.374,17.055ZM53.959,17.055L53.043,17.055C51.107,17.055 49.535,15.458 49.535,13.49C49.535,11.522 51.107,9.924 53.043,9.924L53.949,9.924L53.959,17.055ZM53.959,17.055L53.959,9.924C54.3,9.924 54.636,9.942 54.968,9.976C56.895,10.173 58.301,11.922 58.107,13.88C57.913,15.838 56.192,17.268 54.266,17.071C54.165,17.061 54.063,17.055 53.959,17.055ZM56.953,32.165C56.953,30.197 58.525,28.599 60.461,28.599C62.397,28.599 63.969,30.197 63.969,32.165L63.969,33.829C63.969,35.797 62.397,37.394 60.461,37.394C58.525,37.394 56.953,35.797 56.953,33.829L56.953,32.165ZM24.654,17.055C22.717,17.055 21.146,15.458 21.146,13.49C21.146,11.522 22.717,9.924 24.654,9.924L26.485,9.924C28.421,9.924 29.993,11.522 29.993,13.49C29.993,15.458 28.421,17.055 26.485,17.055L24.654,17.055ZM38.848,17.055C36.912,17.055 35.341,15.458 35.341,13.49C35.341,11.522 36.912,9.924 38.848,9.924L40.68,9.924C42.616,9.924 44.188,11.522 44.188,13.49C44.188,15.458 42.616,17.055 40.68,17.055L38.848,17.055Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0.643125,0.667237,-0.65644,0.632719,30.88979,-37.900014)">
|
||||
<path d="M57.763,28.143C57.763,26.629 58.972,25.401 60.461,25.401C61.95,25.401 63.159,26.629 63.159,28.143L63.159,29.252C63.159,30.765 61.95,31.994 60.461,31.994C58.972,31.994 57.763,30.765 57.763,29.252L57.763,28.143Z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 4.4 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.881796,0,0,0.881796,2.413866,6)">
|
||||
<path d="M8.144,48.624L11.105,53.718L33.55,42.441L55.994,53.718L58.987,48.624L36.537,37.341L36.537,10.769L30.594,10.769L30.594,37.341L8.144,48.624ZM0.384,53.413C-0.592,55.654 0.33,57.211 2.725,57.489L15.69,58.924C18.959,59.318 20.849,57.171 19.138,54.231L11.408,40.828C9.765,37.956 6.931,38.488 5.654,41.467L0.384,53.413ZM66.721,53.413L61.477,41.467C60.174,38.488 57.366,37.956 55.717,40.828L47.962,54.231C46.256,57.171 48.172,59.318 51.415,58.924L64.38,57.489C66.77,57.211 67.697,55.654 66.721,53.413ZM31.172,1.489L23.477,11.964C21.527,14.591 22.46,17.332 25.814,17.332L41.248,17.332C44.665,17.332 45.558,14.639 43.592,11.97L35.87,1.484C34.395,-0.486 32.642,-0.506 31.172,1.489Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1.245638,0,0,1.245638,3,12.546644)">
|
||||
<path d="M4.656,9.516L41.906,9.516C44.391,9.516 46.562,7.359 46.562,4.781C46.562,2.203 44.391,0.047 41.906,0.047L4.656,0.047C2.266,0.047 0,2.203 0,4.781C0,7.359 2.266,9.516 4.656,9.516ZM4.656,31.188L41.906,31.188C44.391,31.188 46.562,29.047 46.562,26.469C46.562,23.891 44.391,21.719 41.906,21.719L4.656,21.719C2.266,21.719 0,23.891 0,26.469C0,29.047 2.266,31.188 4.656,31.188Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.245638,0,0,1.245638,3,-1.178629)">
|
||||
<path d="M7.547,51.55C9.859,52.878 12.578,52.097 13.875,49.769L40.688,8.027C41.984,5.73 41.281,3.121 38.969,1.824C36.641,0.496 34.094,1.152 32.656,3.636L6,45.206C4.641,47.612 5.188,50.237 7.547,51.55ZM4.656,20.579L41.906,20.579C44.391,20.579 46.562,18.423 46.562,15.845C46.562,13.266 44.391,11.11 41.906,11.11L4.656,11.11C2.266,11.11 0,13.266 0,15.845C0,18.423 2.266,20.579 4.656,20.579ZM4.656,42.251L41.906,42.251C44.391,42.251 46.562,40.11 46.562,37.532C46.562,34.954 44.391,32.782 41.906,32.782L4.656,32.782C2.266,32.782 0,34.954 0,37.532C0,40.11 2.266,42.251 4.656,42.251Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.935415,0,0,0.935415,2.292349,1.999999)">
|
||||
<path d="M23.559,56.897C33.746,67.068 47.027,66.068 56.324,56.787C62.652,50.459 64.606,43.662 62.965,35.615C62.027,29.131 57.996,21.49 55.684,17.1C54.012,13.865 51.918,9.693 50.762,8.178C49.465,6.443 47.402,6.068 45.73,7.318C43.809,8.709 43.543,10.803 44.496,13.521L48.309,23.537C48.621,24.365 48.574,24.818 48.262,25.131C47.934,25.443 47.48,25.521 46.84,24.881L23.199,1.209C21.559,-0.4 19.137,-0.4 17.527,1.193C15.934,2.803 15.934,5.256 17.543,6.865L35.215,24.537C34.512,24.896 33.809,25.271 33.09,25.74L12.824,5.475C11.199,3.834 8.777,3.834 7.168,5.475C5.559,7.084 5.559,9.521 7.168,11.131L27.199,31.162C26.684,31.787 26.152,32.443 25.684,33.084L7.246,14.631C5.637,13.037 3.199,13.021 1.574,14.615C-0.004,16.225 -0.004,18.678 1.59,20.287L21.574,40.256C21.23,41.131 20.996,41.975 20.762,42.803L6.84,28.881C5.246,27.24 2.809,27.24 1.184,28.834C-0.395,30.475 -0.395,32.912 1.184,34.537L23.559,56.897Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.4 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.89584,0,0,0.89584,2.323959,1.951688)">
|
||||
<path d="M58.333,59.078C67.13,50.281 68.599,39.468 62.739,27.046L55.505,11.796C54.911,10.546 54.208,9.531 53.38,8.734C50.583,5.921 46.38,5.843 43.489,8.718C41.864,10.343 41.536,12.781 42.083,15.265L43.192,17.953C43.224,18.062 43.224,18.156 43.177,18.234C43.067,18.343 42.942,18.281 42.864,18.203L27.052,2.39C23.927,-0.766 19.692,-0.704 16.552,2.453C15.802,3.171 15.333,4.078 15.099,5.046C12.271,3.484 9.239,3.953 6.817,6.359C4.521,8.64 4.083,11.765 5.521,14.546C4.63,14.718 3.817,15.171 3.161,15.828C0.239,18.734 0.224,22.812 3.192,25.765L4.536,27.125C3.692,27.265 2.833,27.687 2.146,28.359C-0.776,31.312 -0.714,35.593 2.333,38.593L22.224,58.515C33.458,69.765 47.614,69.781 58.333,59.078ZM53.302,54.328C45.224,62.406 35.177,62.281 26.411,53.484L7.505,34.562C6.833,33.89 6.802,32.984 7.458,32.343C8.099,31.703 9.036,31.687 9.724,32.359L21.239,43.874C22.395,45.031 24.192,44.968 25.302,43.859C26.427,42.734 26.505,40.937 25.349,39.765L8.005,22.406C7.317,21.734 7.286,20.843 7.958,20.218C8.567,19.546 9.505,19.562 10.192,20.218L26.349,36.39C27.505,37.546 29.317,37.468 30.442,36.359C31.536,35.234 31.614,33.406 30.474,32.265L11.411,13.218C10.724,12.546 10.724,11.624 11.364,10.968C11.989,10.343 12.927,10.328 13.599,10.999L31.974,29.39C33.114,30.5 34.911,30.468 36.036,29.343C37.177,28.25 37.224,26.39 36.083,25.265L20.599,9.781C19.942,9.109 19.927,8.234 20.567,7.578C21.208,6.921 22.13,6.921 22.786,7.593L45.27,30.031C46.802,31.593 48.755,31.39 49.974,30.109C50.989,29.078 51.474,27.562 50.77,25.75L46.802,15.374C46.38,14.343 46.817,13.531 47.567,13.187C48.411,12.828 49.208,13.187 49.677,14.187L56.864,29.843C61.536,40.093 60.067,47.546 53.302,54.328Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.81149,0,0,0.81149,2,10.044134)">
|
||||
<path d="M42.914,54.093L10.251,54.093C3.506,54.093 0,50.638 0,43.969L0,10.169C0,3.501 3.506,0.02 10.251,0.02L63.687,0.02C70.463,0.02 73.938,3.501 73.938,10.169L73.938,20.595C73.272,16.95 70.992,13.955 67.816,12.338L67.816,10.709C67.816,7.667 66.186,6.142 63.332,6.142L10.606,6.142C7.701,6.142 6.122,7.667 6.122,10.709L6.122,12.998L55.627,12.998C54.744,13.579 53.871,14.299 52.989,15.172L52.981,15.179L47.835,20.305L6.122,20.305L6.122,43.429C6.122,46.471 7.701,47.97 10.606,47.97L41.376,47.97L44.616,51.219C43.884,52.13 43.321,53.086 42.914,54.093ZM14.864,42.322C13.02,42.322 11.801,41.078 11.801,39.328L11.801,33.547C11.801,31.766 13.02,30.547 14.864,30.547L22.52,30.547C24.364,30.547 25.582,31.766 25.582,33.547L25.582,39.328C25.582,41.078 24.364,42.322 22.52,42.322L14.864,42.322Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0.515011,0,0,0.515011,34.08479,22)">
|
||||
<path d="M0.001,35.371C-0.038,39.202 1.473,42.727 4.441,45.671L16.349,57.61C11.913,60.839 9.844,64.493 9.844,69.059C9.844,76.236 15.431,81.432 22.42,81.549C26.022,81.612 29.343,80.305 31.751,77.938L53.883,55.695C59.804,49.751 59.453,42.361 52.939,35.83L41.879,24.794L44.775,21.89C47.234,19.407 48.675,16.156 48.692,12.936C48.785,5.665 43.16,0.007 35.85,0C31.88,0 28.667,1.489 25.293,4.83L3.649,26.387C1.324,28.753 0.032,31.925 0.001,35.371ZM18.613,24.255L31.665,11.203C33.369,9.474 34.298,9.018 35.85,9.018C37.991,9.018 39.664,10.692 39.664,12.825C39.664,13.85 39.304,14.61 38.379,15.518L24.077,29.836C23.14,27.191 21.326,25.315 18.613,24.255ZM9.135,35.594C9.135,33.425 10.709,31.799 12.756,31.799C14.857,31.799 16.468,33.464 16.468,35.669C16.468,36.68 16.444,37.157 16.216,37.941C15.03,43.335 21.775,44.881 24.421,42.268L35.475,31.174L46.542,42.227C49.615,45.227 49.817,47.01 47.511,49.299L33.566,63.268C32.715,61.558 31.327,59.892 29.126,57.643L11.994,40.417C9.701,38.148 9.135,37.157 9.135,35.594ZM18.887,69.149C18.887,67.295 20.04,65.793 22.846,64.06L23.303,64.516C25.504,66.773 26.164,67.845 26.172,69.173C26.22,71.078 24.636,72.476 22.444,72.476C20.445,72.476 18.887,71.13 18.887,69.149Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.6 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.841213,0,0,0.841213,4.798602,1)">
|
||||
<path d="M36.588,72.726C34.194,73.377 31.611,73.703 28.844,73.703C13.719,73.703 3.719,63.672 3.719,47.781L3.719,19.625C3.719,15.344 6.688,12.281 10.828,12.281C11.781,12.281 12.703,12.578 13.391,13.078L13.391,11.063C13.391,6.969 16.281,4.109 20.422,4.109C21.328,4.109 22.25,4.375 22.969,4.875C23.938,1.875 26.453,0 29.734,0C33.109,0 35.578,1.828 36.5,4.922C37.328,4.406 38.297,4.109 39.328,4.109C43.781,4.109 46.812,7.062 46.812,11.5L46.812,33.875C46.812,33.892 46.813,33.908 46.815,33.924C44.424,34.416 42.172,35.289 40.125,36.477L40.125,12.188C40.125,11.25 39.453,10.578 38.547,10.578C37.641,10.578 37.016,11.25 37.016,12.188L37.016,34.062C37.016,35.656 35.688,36.922 34.109,36.922C32.5,36.922 31.203,35.656 31.203,34.062L31.203,8.078C31.203,7.141 30.547,6.469 29.656,6.469C28.734,6.469 28.078,7.141 28.078,8.078L28.078,35.047C28.078,36.688 26.766,37.906 25.172,37.906C23.609,37.906 22.266,36.688 22.266,35.047L22.266,12.188C22.266,11.25 21.609,10.578 20.688,10.578C19.781,10.578 19.172,11.25 19.172,12.188L19.172,36.734C19.172,38.359 17.828,39.594 16.234,39.594C14.688,39.594 13.344,38.359 13.344,36.734L13.344,20.438C13.344,19.5 12.688,18.844 11.781,18.844C10.859,18.844 10.234,19.5 10.234,20.438L10.234,47.172C10.234,59.594 17.219,66.797 28.641,66.797C29.698,66.797 30.716,66.745 31.696,66.64C32.963,68.945 34.624,71.005 36.588,72.726ZM47.27,33.835L48.328,31.234C49.422,28.875 51.656,27.609 53.984,27.609C58.031,27.609 60.953,30.641 60.953,34.594C60.953,34.923 60.935,35.258 60.9,35.6C58.562,34.495 56.004,33.783 53.31,33.549C53.272,33.545 53.234,33.542 53.195,33.54C52.586,33.49 51.97,33.464 51.347,33.464C49.955,33.464 48.592,33.592 47.27,33.835Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0.468542,0,0,0.468542,31.985381,32)">
|
||||
<path d="M31.328,68.297L37,68.297C39.25,68.297 40.953,66.922 41.469,64.75L42.953,58.516C43.781,58.234 44.578,57.906 45.281,57.578L50.734,60.922C52.594,62.078 54.828,61.891 56.391,60.328L60.375,56.359C61.938,54.797 62.109,52.469 60.922,50.609L57.609,45.219C57.953,44.5 58.266,43.75 58.5,42.984L64.797,41.484C66.969,40.984 68.328,39.266 68.328,37.016L68.328,31.469C68.328,29.25 66.969,27.531 64.797,27.016L58.578,25.531C58.297,24.688 57.969,23.906 57.656,23.25L61,17.734C62.156,15.797 62,13.641 60.406,12.062L56.344,8.047C54.781,6.641 52.75,6.344 50.891,7.391L45.281,10.859C44.594,10.5 43.812,10.188 42.969,9.891L41.469,3.562C40.938,1.391 39.25,0 37,0L31.328,0C29.078,0 27.406,1.391 26.859,3.578L25.359,9.828C24.531,10.109 23.719,10.438 23,10.812L17.438,7.391C15.562,6.344 13.484,6.547 11.953,8.078L7.922,12.062C6.328,13.641 6.156,15.797 7.344,17.734L10.656,23.25C10.359,23.906 10.031,24.688 9.766,25.531L3.547,27.016C1.359,27.531 0,29.25 0,31.469L0,37.016C0,39.266 1.359,40.984 3.547,41.484L9.828,42.984C10.078,43.75 10.375,44.5 10.703,45.219L7.406,50.609C6.219,52.469 6.406,54.797 7.969,56.359L11.938,60.328C13.484,61.891 15.75,62.078 17.609,60.922L23.031,57.578C23.766,57.906 24.531,58.234 25.359,58.516L26.859,64.75C27.375,66.922 29.078,68.297 31.328,68.297ZM34.172,44.922C28.219,44.922 23.406,40.109 23.406,34.156C23.406,28.203 28.219,23.391 34.172,23.391C40.109,23.391 44.922,28.203 44.922,34.156C44.922,40.109 40.109,44.922 34.172,44.922Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.7 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.693368,0,0,0.693368,-2.677595,7.413107)">
|
||||
<path d="M42.242,41.686C40.097,43.436 38.293,45.407 36.884,47.522C34.764,46.735 32.364,46.281 29.811,46.281C20.785,46.281 13.661,51.971 13.661,57.382C13.661,57.696 13.806,57.946 14.24,57.946L33.222,57.946C33.166,58.257 33.157,58.571 33.157,58.884C33.157,61.225 33.721,63.516 34.996,65.46L13.183,65.46C7.906,65.46 5.304,62.977 5.304,58.498C5.304,48.147 16.263,38.838 29.811,38.838C34.357,38.838 38.611,39.886 42.242,41.686ZM42.301,22.95C42.301,30.45 36.757,36.469 29.818,36.469C22.879,36.469 17.311,30.505 17.311,22.965C17.311,15.724 22.975,9.655 29.818,9.655C36.652,9.655 42.301,15.654 42.301,22.95ZM24.809,22.965C24.809,26.414 27.104,28.996 29.818,28.996C32.563,28.996 34.835,26.414 34.835,22.95C34.835,19.737 32.49,17.128 29.818,17.128C27.144,17.128 24.809,19.752 24.809,22.965Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M66.701,35.926C74.64,35.926 80.918,29.117 80.918,20.577C80.918,12.267 74.528,5.46 66.701,5.46C58.889,5.46 52.461,12.296 52.461,20.592C52.461,29.124 58.77,35.926 66.701,35.926ZM66.701,28.318C63.142,28.318 60.166,25.025 60.166,20.568C60.166,16.396 63.198,13.068 66.701,13.068C70.212,13.068 73.212,16.374 73.212,20.577C73.212,24.962 70.3,28.318 66.701,28.318ZM47.673,65.412L85.706,65.412C91.705,65.412 94.723,63.301 94.723,58.884C94.723,49.169 82.875,38.829 66.701,38.829C50.496,38.829 38.649,49.169 38.649,58.884C38.649,63.301 41.666,65.412 47.673,65.412ZM48.131,57.805C47.629,57.805 47.476,57.562 47.476,57.216C47.476,53.516 54.602,46.461 66.701,46.461C78.793,46.461 85.895,53.516 85.895,57.216C85.895,57.562 85.75,57.805 85.272,57.805L48.131,57.805Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.1 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.783639,0,0,0.783639,3,9.136381)">
|
||||
<path d="M10.966,55.715L61.631,55.715C67.901,55.715 71.026,52.48 70.761,46.429L52.249,29.059C50.874,27.784 49.224,27.139 47.553,27.139C45.84,27.139 44.303,27.727 42.877,29.003L28.763,41.616L22.999,36.414C21.686,35.233 20.243,34.639 18.78,34.639C17.334,34.639 16.041,35.201 14.754,36.383L2.961,46.953C3.114,52.711 5.792,55.715 10.966,55.715ZM10.251,58.341L63.763,58.341C70.533,58.341 74.014,54.886 74.014,48.218L74.014,10.16C74.014,3.486 70.533,0.011 63.763,0.011L10.251,0.011C3.506,0.011 0,3.486 0,10.16L0,48.218C0,54.886 3.506,58.341 10.251,58.341ZM10.606,52.219C7.701,52.219 6.122,50.714 6.122,47.678L6.122,10.694C6.122,7.658 7.701,6.134 10.606,6.134L63.407,6.134C66.287,6.134 67.891,7.658 67.891,10.694L67.891,47.678C67.891,50.714 66.287,52.219 63.407,52.219L10.606,52.219Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M24.209,29.743C28.302,29.743 31.677,26.369 31.677,22.239C31.677,18.146 28.302,14.74 24.209,14.74C20.079,14.74 16.705,18.146 16.705,22.239C16.705,26.369 20.079,29.743 24.209,29.743Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.5 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 72 70" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M38.645,64.222L17.549,64.222C11.671,64.198 8.506,61.129 8.506,55.228L8.506,13.858C8.506,7.958 11.939,4.864 17.619,4.864L54.008,4.864C59.907,4.864 63.096,7.958 63.096,13.858L63.096,35.121C61.386,34.433 59.559,33.974 57.653,33.783L57.653,22.31L54.347,22.31L54.347,23.05C54.347,27.911 52.199,30.851 48.168,31.749L45.342,34.575C44.524,35.393 43.197,35.393 42.379,34.575L39.549,31.745C35.516,30.843 33.374,27.904 33.374,23.05L33.374,22.31L13.973,22.31L13.973,55.44C13.973,57.721 15.098,58.965 17.297,59.072C17.269,58.754 17.255,58.42 17.255,58.07L17.255,54.215C17.255,49.957 19.434,48.069 23.402,48.069L36.442,48.069C35.975,49.668 35.702,51.349 35.651,53.085L24.624,53.085C23.237,53.085 22.516,53.749 22.516,55.165L22.516,57.102C22.516,58.518 23.237,59.21 24.624,59.21L36.417,59.21C36.93,60.995 37.685,62.679 38.645,64.222ZM57.653,17.418L57.653,13.652C57.653,11.264 56.396,10.001 54.013,10.001L17.613,10.001C15.206,10.001 13.973,11.264 13.973,13.652L13.973,17.418L33.807,17.418C34.894,13.675 37.985,11.731 42.487,11.731L45.258,11.731C49.934,11.731 52.908,13.675 53.94,17.418L57.653,17.418ZM42.481,16.868C40.074,16.868 38.841,18.13 38.841,20.518L38.841,23.262C38.841,25.65 40.074,26.902 42.481,26.902L45.264,26.902C47.647,26.902 48.904,25.65 48.904,23.262L48.904,20.518C48.904,18.149 47.666,16.888 45.32,16.868L42.481,16.868Z"/>
|
||||
<g transform="matrix(1,0,0,1,35.1075,-13.675)">
|
||||
<path d="M19.178,83.675L21.86,83.675C22.896,83.675 23.714,83.056 23.949,82.006L24.677,79.011C25.075,78.891 25.513,78.706 25.906,78.51L28.52,80.101C29.389,80.672 30.396,80.644 31.191,79.849L33.035,77.979C33.748,77.216 33.821,76.234 33.251,75.277L31.691,72.637C31.913,72.276 32.021,71.92 32.166,71.528L35.186,70.826C36.217,70.564 36.892,69.747 36.892,68.705L36.892,66.06C36.892,65.038 36.191,64.272 35.186,64.011L32.197,63.289C32.038,62.825 31.867,62.484 31.722,62.148L33.37,59.446C33.904,58.571 33.804,57.481 33.086,56.8L31.18,54.956C30.427,54.209 29.411,54.031 28.562,54.596L25.906,56.269C25.436,56.028 25.075,55.914 24.683,55.769L23.949,52.722C23.714,51.712 22.896,51.042 21.86,51.042L19.178,51.042C18.131,51.042 17.304,51.737 17.063,52.728L16.381,55.737C15.886,55.903 15.519,56.028 15.101,56.269L12.444,54.596C11.633,54.068 10.585,54.204 9.852,54.956L7.997,56.8C7.279,57.501 7.077,58.571 7.642,59.446L9.316,62.148C9.166,62.484 8.981,62.876 8.81,63.289L5.852,64.011C4.841,64.272 4.177,65.064 4.177,66.06L4.177,68.705C4.177,69.747 4.847,70.564 5.852,70.826L8.847,71.528C9.037,71.92 9.182,72.276 9.342,72.637L7.782,75.302C7.211,76.234 7.311,77.267 8.023,77.979L9.847,79.849C10.585,80.638 11.613,80.646 12.487,80.101L15.158,78.51C15.596,78.757 15.989,78.891 16.381,79.011L17.063,82.006C17.299,83.005 18.131,83.675 19.178,83.675ZM20.491,72.507C17.681,72.507 15.371,70.197 15.371,67.387C15.371,64.551 17.681,62.236 20.491,62.236C23.326,62.236 25.642,64.551 25.642,67.387C25.642,70.197 23.326,72.507 20.491,72.507Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.3 KiB |
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.607884,0,0,0.607884,2,6.470704)">
|
||||
<path d="M50.153,64.047L37.296,64.047C35.825,69.222 31.078,73.031 25.453,73.031C19.816,73.031 15.034,69.222 13.552,64.047L10.547,64.047C3.781,64.047 0,60.266 0,53.516L0,11.688C0,4.938 3.781,1.141 10.547,1.141L57.859,1.141C64.609,1.141 68.391,4.938 68.391,11.688L68.391,18.422L76.766,18.422C79.761,18.422 81.953,19.046 83.846,20.626C83.618,20.616 83.389,20.612 83.159,20.611L83.154,20.611C78.507,20.611 74.687,22.221 70.737,26.132L70.727,26.142L60.359,36.468L60.359,12.328C60.359,10.141 59.281,9.141 57.172,9.141L11.203,9.141C9.078,9.141 8.031,10.141 8.031,12.328L8.031,52.859C8.031,55.062 9.078,56.031 11.203,56.031L13.984,56.031C15.828,51.524 20.28,48.344 25.453,48.344C30.614,48.344 35.037,51.524 36.867,56.031L47.85,56.031C47.915,58.873 48.681,61.577 50.153,64.047ZM25.453,66.422C28.609,66.422 31.156,63.828 31.156,60.656C31.156,57.5 28.609,54.906 25.453,54.906C22.281,54.906 19.688,57.5 19.688,60.656C19.688,63.828 22.281,66.422 25.453,66.422Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0.33037,0,0,0.33037,12.639581,15.454198)">
|
||||
<path d="M53.25,58.219C54.656,59.562 56.219,60.219 58.125,60.219C62.062,60.219 65.312,56.969 65.312,53.125C65.312,51.156 64.469,49.312 62.938,47.812L43.562,29.156L43.562,30.906L62.938,12.375C64.5,10.844 65.312,9.031 65.312,7.094C65.312,3.219 62.062,0 58.125,0C56.188,0 54.594,0.625 53.25,2L30.719,24C28.781,25.969 27.969,27.75 27.906,30.094C27.906,32.406 28.75,34.219 30.719,36.188L53.25,58.219Z" style="fill-rule:nonzero;"/>
|
||||
<g transform="matrix(1,0,0,1,-4.437961,0)">
|
||||
<path d="M22.23,55.204L2.781,36.187C0.844,34.219 0,32.406 0,30.094C0.031,27.75 0.875,25.969 2.781,24L25.313,2C26.688,0.625 28.25,0 30.188,0C34.125,0 37.406,3.219 37.406,7.094C37.406,9.031 36.594,10.844 35,12.375L16.537,30.034L35,47.812C36.562,49.313 37.406,51.156 37.406,53.125C37.406,55.669 35.969,57.953 33.855,59.207C30.383,57.109 26.443,55.71 22.23,55.204Z"/>
|
||||
</g>
|
||||
</g>
|
||||
<g transform="matrix(0.515011,0,0,0.515011,34.08479,22)">
|
||||
<path d="M0.001,35.371C-0.038,39.202 1.473,42.727 4.441,45.671L16.349,57.61C11.913,60.839 9.844,64.493 9.844,69.059C9.844,76.236 15.431,81.432 22.42,81.549C26.022,81.612 29.343,80.305 31.751,77.938L53.883,55.695C59.804,49.751 59.453,42.361 52.939,35.83L41.879,24.794L44.775,21.89C47.234,19.407 48.675,16.156 48.692,12.936C48.785,5.665 43.16,0.007 35.85,0C31.88,0 28.667,1.489 25.293,4.83L3.649,26.387C1.324,28.753 0.032,31.925 0.001,35.371ZM18.613,24.255L31.665,11.203C33.369,9.474 34.298,9.018 35.85,9.018C37.991,9.018 39.664,10.692 39.664,12.825C39.664,13.85 39.304,14.61 38.379,15.518L24.077,29.836C23.14,27.191 21.326,25.315 18.613,24.255ZM9.135,35.594C9.135,33.425 10.709,31.799 12.756,31.799C14.857,31.799 16.468,33.464 16.468,35.669C16.468,36.68 16.444,37.157 16.216,37.941C15.03,43.335 21.775,44.881 24.421,42.268L35.475,31.174L46.542,42.227C49.615,45.227 49.817,47.01 47.511,49.299L33.566,63.268C32.715,61.558 31.327,59.892 29.126,57.643L11.994,40.417C9.701,38.148 9.135,37.157 9.135,35.594ZM18.887,69.149C18.887,67.295 20.04,65.793 22.846,64.06L23.303,64.516C25.504,66.773 26.164,67.845 26.172,69.173C26.22,71.078 24.636,72.476 22.444,72.476C20.445,72.476 18.887,71.13 18.887,69.149Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.6 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.781552,0,0,0.781552,1,17.941979)">
|
||||
<path d="M79.329,9.044C79.329,3.244 76.045,0.021 70.183,0.021L9.093,0.021C3.221,0.021 0,3.244 0,9.044L0,26.911C0,32.701 3.263,35.953 9.125,35.953L70.225,35.953C76.077,35.953 79.329,32.701 79.329,26.911L79.329,9.044ZM72.826,10.089L72.826,25.876C72.826,28.201 71.564,29.461 69.323,29.461L9.964,29.461C7.775,29.461 6.482,28.201 6.482,25.876L6.482,10.089C6.482,7.763 7.785,6.503 9.995,6.503L69.354,6.503C71.564,6.503 72.826,7.763 72.826,10.089ZM13.04,4.664L10.112,4.664L10.112,20.338C10.112,21.156 10.774,21.776 11.602,21.776C12.461,21.776 13.04,21.134 13.04,20.297L13.04,4.664ZM18.661,4.664L15.732,4.664L15.732,15.295C15.732,16.144 16.404,16.744 17.211,16.744C18.092,16.744 18.661,16.123 18.661,15.264L18.661,4.664ZM24.27,4.664L21.32,4.664L21.32,15.295C21.32,16.144 22.014,16.744 22.81,16.744C23.67,16.744 24.27,16.123 24.27,15.264L24.27,4.664ZM29.849,4.664L26.92,4.664L26.92,15.295C26.92,16.144 27.592,16.744 28.42,16.744C29.279,16.744 29.849,16.123 29.849,15.264L29.849,4.664ZM35.479,4.664L32.55,4.664L32.55,15.295C32.55,16.144 33.222,16.744 34.019,16.744C34.9,16.744 35.479,16.123 35.479,15.264L35.479,4.664ZM41.11,4.664L38.181,4.664L38.181,20.338C38.181,21.156 38.843,21.776 39.65,21.776C40.53,21.776 41.11,21.134 41.11,20.297L41.11,4.664ZM46.709,4.664L43.781,4.664L43.781,15.295C43.781,16.144 44.452,16.744 45.259,16.744C46.118,16.744 46.709,16.123 46.709,15.264L46.709,4.664ZM52.319,4.664L49.39,4.664L49.39,15.295C49.39,16.144 50.062,16.744 50.88,16.744C51.739,16.744 52.319,16.123 52.319,15.264L52.319,4.664ZM57.918,4.664L54.999,4.664L54.999,15.295C54.999,16.144 55.661,16.744 56.468,16.744C57.348,16.744 57.918,16.123 57.918,15.264L57.918,4.664ZM63.548,4.664L60.62,4.664L60.62,15.295C60.62,16.144 61.292,16.744 62.088,16.744C62.948,16.744 63.548,16.123 63.548,15.264L63.548,4.664ZM69.158,4.664L66.229,4.664L66.229,20.338C66.229,21.156 66.891,21.776 67.719,21.776C68.578,21.776 69.158,21.134 69.158,20.297L69.158,4.664Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.4 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.800063,0,0,0.800063,1,5.597937)">
|
||||
<path d="M75.036,26.688L59.489,26.688C57.02,26.688 56.427,28.797 57.739,30.578L65.442,40.938C66.427,42.266 68.099,42.281 69.083,40.938L76.802,30.594C78.145,28.797 77.52,26.688 75.036,26.688ZM38.755,8.219C52.458,8.219 63.536,19.297 63.536,33.031C63.536,35.281 65.38,37.125 67.661,37.125C69.911,37.125 71.739,35.297 71.755,33.047C71.739,14.75 56.974,0 38.755,0C30.599,0 23.161,3.078 17.583,8.094C15.364,9.812 15.552,12.531 16.974,14.109C18.239,15.547 20.395,16.141 22.802,14.391C26.974,10.547 32.583,8.219 38.755,8.219ZM2.458,39.312L18.02,39.312C20.474,39.312 21.067,37.188 19.77,35.422L12.052,25.047C11.067,23.734 9.411,23.719 8.427,25.047L0.692,35.406C-0.651,37.188 -0.026,39.312 2.458,39.312ZM38.755,57.781C25.052,57.781 13.958,46.703 13.958,32.969C13.958,30.703 12.114,28.859 9.833,28.859C7.583,28.859 5.755,30.688 5.739,32.938C5.755,51.234 20.52,66 38.755,66C46.911,66 54.349,62.922 59.911,57.906C62.13,56.156 61.942,53.469 60.52,51.875C59.255,50.453 57.099,49.844 54.692,51.594C50.52,55.422 44.911,57.781 38.755,57.781Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M37.411,48.156L39.974,48.156C40.927,48.156 41.661,47.578 41.864,46.641L42.552,43.812C42.942,43.656 43.317,43.516 43.661,43.344L46.145,44.875C46.942,45.375 47.911,45.297 48.552,44.625L50.317,42.844C50.989,42.172 51.083,41.188 50.567,40.391L49.067,37.938C49.224,37.594 49.38,37.234 49.489,36.875L52.349,36.203C53.27,35.984 53.864,35.25 53.864,34.266L53.864,31.781C53.864,30.828 53.27,30.094 52.349,29.891L49.52,29.219C49.395,28.812 49.224,28.438 49.083,28.109L50.599,25.625C51.114,24.812 51.036,23.859 50.349,23.188L48.536,21.406C47.88,20.797 46.989,20.641 46.192,21.109L43.661,22.672C43.317,22.516 42.974,22.359 42.567,22.219L41.864,19.344C41.645,18.406 40.927,17.828 39.974,17.828L37.411,17.828C36.458,17.828 35.739,18.406 35.52,19.359L34.833,22.188C34.442,22.328 34.052,22.484 33.692,22.656L31.192,21.109C30.38,20.641 29.505,20.766 28.833,21.406L27.02,23.188C26.349,23.859 26.27,24.812 26.77,25.625L28.286,28.109C28.145,28.438 28.005,28.812 27.849,29.219L25.02,29.891C24.099,30.094 23.52,30.828 23.52,31.781L23.52,34.266C23.52,35.25 24.099,35.984 25.02,36.203L27.88,36.875C28.02,37.234 28.145,37.594 28.302,37.938L26.833,40.391C26.302,41.188 26.395,42.172 27.067,42.844L28.817,44.625C29.489,45.297 30.442,45.375 31.239,44.875L33.708,43.344C34.067,43.516 34.442,43.656 34.833,43.812L35.52,46.641C35.739,47.578 36.458,48.156 37.411,48.156ZM38.692,37.797C36.02,37.797 33.849,35.641 33.849,32.969C33.849,30.312 36.02,28.125 38.692,28.125C41.349,28.125 43.52,30.312 43.52,32.969C43.52,35.641 41.349,37.797 38.692,37.797Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 3.1 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.889696,0,0,0.887145,3,3.004404)">
|
||||
<path d="M65.191,32.59C65.191,50.56 50.592,65.181 32.59,65.181C14.621,65.181 0,50.56 0,32.59C0,14.599 14.621,0 32.59,0C50.592,0 65.191,14.599 65.191,32.59ZM21.127,17.509L13.242,25.633C12.808,26.079 12.495,26.691 12.495,27.302C12.495,28.65 13.45,29.624 14.829,29.624C15.43,29.624 16.052,29.406 16.465,28.928L20.404,24.868L20.501,24.753L20.475,26.04L20.475,46.139C20.475,47.465 21.491,48.481 22.828,48.481C24.175,48.481 25.191,47.465 25.191,46.139L25.191,26.019L25.16,24.683L25.324,24.868L29.274,28.928C29.72,29.406 30.279,29.624 30.921,29.624C32.259,29.624 33.191,28.65 33.191,27.302C33.191,26.713 32.954,26.079 32.528,25.633L24.631,17.509C23.69,16.537 22.049,16.547 21.127,17.509ZM39.936,19.053L39.936,39.173L39.958,40.423L39.866,40.315L35.937,36.243C35.534,35.808 34.912,35.579 34.258,35.579C32.932,35.579 31.967,36.532 31.967,37.89C31.967,38.501 32.268,39.113 32.714,39.571L40.579,47.673C41.511,48.636 43.13,48.646 44.093,47.673L52,39.571C52.414,39.113 52.663,38.48 52.663,37.89C52.663,36.532 51.751,35.579 50.372,35.579C49.751,35.579 49.18,35.808 48.724,36.243L44.786,40.315L44.629,40.493L44.651,39.195L44.651,19.053C44.651,17.727 43.626,16.733 42.299,16.733C40.942,16.733 39.936,17.727 39.936,19.053Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.887145,0,0,0.887145,3,3.004404)">
|
||||
<rect x="0" y="0" width="65.378" height="65.212" style="fill-opacity:0;"/>
|
||||
<path d="M32.59,65.181C50.592,65.181 65.191,50.582 65.191,32.59C65.191,14.599 50.592,0 32.59,0C14.599,0 0,14.599 0,32.59C0,50.582 14.599,65.181 32.59,65.181ZM32.59,58.02C18.529,58.02 7.161,46.652 7.161,32.59C7.161,18.529 18.529,7.161 32.59,7.161C46.652,7.161 58.03,18.529 58.03,32.59C58.03,46.652 46.652,58.02 32.59,58.02Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M23.228,47.784C24.494,47.784 25.468,46.819 25.468,45.554L25.468,26.266L25.404,22.761C25.383,21.569 24.42,20.585 23.228,20.585C22.046,20.585 21.083,21.569 21.062,22.761L20.988,26.288L20.988,45.554C20.988,46.819 21.953,47.784 23.228,47.784ZM33.14,27.518C33.14,26.97 32.893,26.346 32.498,25.941L24.94,18.166C24.039,17.234 22.491,17.244 21.61,18.166L14.063,25.941C13.639,26.346 13.357,26.948 13.357,27.518C13.357,28.815 14.271,29.738 15.577,29.738C16.148,29.738 16.739,29.519 17.133,29.073L20.878,25.194L23.207,22.452L25.65,25.194L29.417,29.073C29.822,29.519 30.362,29.738 30.962,29.738C32.249,29.738 33.14,28.815 33.14,27.518ZM41.856,17.43C40.581,17.43 39.616,18.363 39.616,19.629L39.616,38.916L39.69,42.422C39.712,43.623 40.675,44.608 41.856,44.608C43.048,44.608 44.011,43.623 44.032,42.422L44.096,38.938L44.096,19.629C44.096,18.363 43.122,17.43 41.856,17.43ZM51.748,37.674C51.748,36.378 50.878,35.466 49.581,35.466C48.99,35.466 48.45,35.694 48.014,36.109L44.269,39.998L41.835,42.74L39.496,39.998L35.751,36.109C35.367,35.694 34.787,35.466 34.174,35.466C32.899,35.466 31.976,36.378 31.976,37.674C31.976,38.244 32.277,38.836 32.692,39.272L40.229,47.027C41.109,47.938 42.636,47.958 43.558,47.027L51.126,39.272C51.541,38.836 51.748,38.223 51.748,37.674Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@ -1,16 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M32.468,59.712C32.725,59.914 32.837,60.249 32.754,60.565C32.671,60.881 32.408,61.117 32.085,61.166C31.147,61.264 30.216,61.073 29.3,60.555L8.262,48.803C5.729,47.378 4.441,45.879 4.441,42.127L4.441,20.65C4.441,17.814 5.489,16.02 7.877,14.692L26.541,4.215C29.828,2.367 33.176,2.367 36.463,4.215L55.149,14.692C57.515,16.02 58.563,17.814 58.563,20.65C58.563,21.207 58.294,21.73 57.84,22.053C57.386,22.376 56.804,22.46 56.278,22.277C53.589,21.35 50.911,20.452 49.823,20.095C49.813,20.092 49.803,20.089 49.793,20.086C49.564,20.017 49.398,19.817 49.372,19.579C49.346,19.341 49.464,19.11 49.673,18.993C49.673,18.992 49.674,18.992 49.674,18.992C49.978,18.821 50.166,18.499 50.166,18.15C50.167,17.801 49.979,17.479 49.674,17.307C45.559,14.986 34.365,8.675 34.365,8.675C32.407,7.556 30.587,7.587 28.656,8.675L24.257,11.165C24.257,11.165 34.347,16.813 39.002,19.419C39.405,19.645 39.637,20.087 39.595,20.547C39.553,21.007 39.244,21.399 38.807,21.548C37.999,21.826 37.152,22.12 36.313,22.416C35.556,22.682 34.72,22.61 34.021,22.217C30.425,20.197 19.274,13.934 19.274,13.934L11.856,18.15C11.856,18.15 22.923,24.355 26.284,26.24C26.797,26.528 27.006,27.16 26.765,27.696C26.444,28.447 26.307,29.369 26.307,30.532C26.307,30.829 26.149,31.104 25.892,31.254C25.635,31.404 25.318,31.406 25.06,31.26C21.115,29.032 9.169,22.284 9.169,22.284L9.169,41.664C9.169,43.059 9.681,43.919 11.137,44.722C11.137,44.722 22.059,50.89 26.083,53.162C27.034,53.7 27.832,54.471 28.402,55.402C29.329,56.93 30.681,58.316 32.468,59.712Z" style="fill-rule:nonzero;"/>
|
||||
<g transform="matrix(0.652268,0,0,0.652268,28.5941,21.1337)">
|
||||
<path d="M27.141,65.719C27.781,65.719 28.688,65.453 29.5,65.031C47.813,55.5 54.281,50.531 54.281,39.141L54.281,16.016C54.281,11.563 52.797,9.766 48.906,8.094C45.813,6.797 34.453,2.969 31.547,2.016C30.172,1.594 28.5,1.328 27.141,1.328C25.781,1.328 24.109,1.641 22.75,2.016C19.844,2.828 8.469,6.813 5.375,8.094C1.5,9.75 0,11.563 0,16.016L0,39.141C0,50.531 6.484,55.484 24.781,65.031C25.609,65.453 26.5,65.719 27.141,65.719ZM27.141,57.547C26.781,57.547 26.438,57.422 25.578,56.891C11.563,48.25 7.469,46.297 7.469,37.953L7.469,17.063C7.469,15.891 7.719,15.391 8.625,15.031C13.031,13.266 21.594,10.438 24.828,9.203C25.891,8.859 26.516,8.719 27.141,8.719C27.766,8.719 28.375,8.875 29.453,9.203C32.688,10.438 41.219,13.375 45.672,15.031C46.547,15.375 46.813,15.891 46.813,17.063L46.813,37.953C46.813,46.438 42.281,48.828 28.703,56.891C27.859,57.406 27.5,57.547 27.141,57.547Z" style="fill-rule:nonzero;"/>
|
||||
<g transform="matrix(0,-1.228947,0.741699,0,5.037355,87.672304)">
|
||||
<g transform="matrix(1.0066,0,0,1.0066,5.43531,-1.54828)">
|
||||
<path d="M26.391,65.119C26.941,65.119 27.788,64.903 28.58,64.471C46.553,54.66 52.781,50.171 52.781,38.771L52.781,15.146C52.781,11.443 51.347,10.136 48.246,8.814C44.773,7.367 33.063,3.249 29.657,2.086C28.622,1.754 27.44,1.538 26.391,1.538C25.341,1.538 24.159,1.811 23.15,2.086C19.744,3.058 8.009,7.393 4.535,8.814C1.46,10.11 0,11.443 0,15.146L0,38.771C0,50.171 6.254,54.634 24.201,64.471C25.019,64.903 25.84,65.119 26.391,65.119ZM26.391,58.557C25.941,58.557 25.498,58.392 24.588,57.841C10.303,49.13 5.869,46.787 5.869,37.603L5.869,16.142C5.869,15.041 6.079,14.601 6.965,14.251C11.591,12.416 20.574,9.417 24.758,7.773C25.461,7.509 25.946,7.419 26.391,7.419C26.836,7.419 27.315,7.535 28.023,7.773C32.208,9.417 41.139,12.595 45.842,14.251C46.697,14.575 46.913,15.041 46.913,16.142L46.913,37.603C46.913,46.838 42.321,49.318 28.193,57.841C27.309,58.386 26.84,58.557 26.391,58.557Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1,0,0,1,0,3.06619)">
|
||||
<g transform="matrix(6.59906e-17,-1.07771,0.650424,3.9827e-17,12.7469,98.4759)">
|
||||
<path d="M58.139,21.607C58.139,19.1 56.911,17.066 55.398,17.066C53.885,17.066 52.657,19.1 52.657,21.607L52.657,37.595C52.657,40.101 53.885,42.136 55.398,42.136C56.911,42.136 58.139,40.101 58.139,37.595L58.139,21.607Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0,-1.228947,0.741699,0,5.037355,112.47087)">
|
||||
<g transform="matrix(6.59906e-17,-1.07771,0.650424,3.9827e-17,12.7469,76.7291)">
|
||||
<path d="M58.139,21.607C58.139,19.1 56.911,17.066 55.398,17.066C53.885,17.066 52.657,19.1 52.657,21.607L52.657,37.595C52.657,40.101 53.885,42.136 55.398,42.136C56.911,42.136 58.139,40.101 58.139,37.595L58.139,21.607Z"/>
|
||||
</g>
|
||||
<g transform="matrix(0,-1.228947,1.207634,0,-8.754676,100.074894)">
|
||||
<g transform="matrix(6.59906e-17,-1.07771,1.05902,6.48461e-17,0.652146,87.6054)">
|
||||
<path d="M58.139,19.855C58.139,18.315 56.911,17.066 55.398,17.066C53.885,17.066 52.657,18.315 52.657,19.855L52.657,39.347C52.657,40.886 53.885,42.136 55.398,42.136C56.911,42.136 58.139,40.886 58.139,39.347L58.139,19.855Z"/>
|
||||
</g>
|
||||
</g>
|
||||
|
||||
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 2.4 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0,-0.777065,0.777065,0,9.038886,69.94022)">
|
||||
<path d="M75.315,48.595C75.315,55.44 71.658,59.097 64.728,59.097L21.503,59.097C14.606,59.097 10.906,55.461 10.906,48.595L10.906,36.765L17.865,36.765L17.865,48.26C17.865,50.888 19.229,52.138 21.722,52.138L64.499,52.138C66.981,52.138 68.356,50.888 68.356,48.26L68.356,36.765L75.315,36.765L75.315,48.595ZM75.315,10.657L75.315,22.436L68.356,22.436L68.356,10.982C68.356,8.354 66.981,7.114 64.499,7.114L21.722,7.114C19.229,7.114 17.865,8.354 17.865,10.982L17.865,22.436L10.906,22.436L10.906,10.657C10.906,3.781 14.606,0.155 21.503,0.155L64.728,0.155C71.658,0.155 75.315,3.802 75.315,10.657Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M88.562,55.043C88.562,57.276 86.765,59.094 84.532,59.094C82.3,59.094 80.481,57.276 80.481,55.043C80.481,52.81 82.3,51.013 84.532,51.013C86.765,51.013 88.562,52.81 88.562,55.043Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M88.562,42.32C88.562,44.553 86.765,46.34 84.532,46.34C82.3,46.34 80.481,44.553 80.481,42.32C80.481,40.066 82.3,38.269 84.532,38.269C86.765,38.269 88.562,40.066 88.562,42.32Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M88.562,16.774C88.562,19.007 86.765,20.825 84.532,20.825C82.3,20.825 80.481,19.007 80.481,16.774C80.481,14.541 82.3,12.744 84.532,12.744C86.765,12.744 88.562,14.541 88.562,16.774Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M88.562,4.02C88.562,6.284 86.765,8.071 84.532,8.071C82.3,8.071 80.481,6.284 80.481,4.02C80.481,1.787 82.3,0 84.532,0C86.765,0 88.562,1.787 88.562,4.02Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M84.582,34.107C87.085,34.107 89.11,32.082 89.11,29.579C89.11,27.076 87.085,25.041 84.582,25.041C82.961,25.041 81.507,25.903 80.707,27.224L10.916,27.224C9.558,27.224 8.54,28.242 8.54,29.6C8.54,30.958 9.558,31.998 10.916,31.998L80.75,31.998C81.55,33.276 82.961,34.107 84.582,34.107Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 279 KiB |
|
Before Width: | Height: | Size: 6.4 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 499 B |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 21 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 89 KiB |
|
Before Width: | Height: | Size: 371 KiB |
|
Before Width: | Height: | Size: 392 KiB |
|
Before Width: | Height: | Size: 357 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(241,0,27);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(255,92,96);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 804 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(202,2,24);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(212,76,80);"/>
|
||||
<g>
|
||||
<path d="M22.5,57.8L57.8,22.5C59.2,21.1 61.4,21.1 62.8,22.5L62.9,22.6C64.3,24 64.3,26.2 62.9,27.6L27.6,62.9C26.2,64.3 24,64.3 22.6,62.9L22.5,62.8C21.2,61.4 21.2,59.2 22.5,57.8Z" style="fill:rgb(128,47,49);stroke:rgb(128,47,49);stroke-width:2.5px;"/>
|
||||
<path d="M27.6,22.5L62.9,57.8C64.3,59.2 64.3,61.4 62.9,62.8L62.8,62.9C61.4,64.3 59.2,64.3 57.8,62.9L22.5,27.6C21.1,26.2 21.1,24 22.5,22.6L22.6,22.5C24,21.2 26.2,21.2 27.6,22.5Z" style="fill:rgb(128,47,49);stroke:rgb(128,47,49);stroke-width:2.5px;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(241,0,27);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(255,92,96);"/>
|
||||
<g>
|
||||
<path d="M22.5,57.8L57.8,22.5C59.2,21.1 61.4,21.1 62.8,22.5L62.9,22.6C64.3,24 64.3,26.2 62.9,27.6L27.6,62.9C26.2,64.3 24,64.3 22.6,62.9L22.5,62.8C21.2,61.4 21.2,59.2 22.5,57.8Z" style="fill:rgb(128,47,49);stroke:rgb(128,47,49);stroke-width:2.5px;"/>
|
||||
<path d="M27.6,22.5L62.9,57.8C64.3,59.2 64.3,61.4 62.9,62.8L62.8,62.9C61.4,64.3 59.2,64.3 57.8,62.9L22.5,27.6C21.1,26.2 21.1,24 22.5,22.6L22.6,22.5C24,21.2 26.2,21.2 27.6,22.5Z" style="fill:rgb(128,47,49);stroke:rgb(128,47,49);stroke-width:2.5px;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,16 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(66,130,52);"/>
|
||||
<g>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.2 21.1,81.8 42.7,81.8Z" style="fill:rgb(46,164,75);"/>
|
||||
<g transform="matrix(0,-0.842628,0.842628,0,6.811922,78.99493)">
|
||||
<g transform="matrix(-1,0,-0,-1,106.637317,63.746683)">
|
||||
<path d="M28.052,20.855L57.9,20.8C61.5,20.8 64.4,23.7 64.4,27.3L64.444,57.088L28.052,20.855Z" style="fill:rgb(17,49,7);"/>
|
||||
</g>
|
||||
<g transform="matrix(-1,0,-0,-1,63.293317,107.454683)">
|
||||
<path d="M56.994,64.5L27.6,64.5C24,64.5 21.1,61.6 21.1,58L21.1,28.154L56.994,64.5Z" style="fill:rgb(17,49,7);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,18 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(0,183,30);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.2 21.1,81.8 42.7,81.8Z" style="fill:rgb(54,198,89);"/>
|
||||
<g transform="matrix(0,-0.842628,0.842628,0,6.811922,78.99493)">
|
||||
<g>
|
||||
<g transform="matrix(-1,0,0,-1,106.637317,63.746683)">
|
||||
<path d="M28.052,20.855L57.9,20.8C61.5,20.8 64.4,23.7 64.4,27.3L64.444,57.088L28.052,20.855Z" style="fill:rgb(1,97,0);"/>
|
||||
</g>
|
||||
<g transform="matrix(-1,0,0,-1,63.293317,107.454683)">
|
||||
<path d="M56.994,64.5L27.6,64.5C24,64.5 21.1,61.6 21.1,58L21.1,28.154L56.994,64.5Z" style="fill:rgb(1,97,0);"/>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.3 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(0,183,30);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.2 21.1,81.8 42.7,81.8Z" style="fill:rgb(54,198,89);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 804 B |
@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(66,130,52);"/>
|
||||
<g>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.2 21.1,81.8 42.7,81.8Z" style="fill:rgb(46,164,75);"/>
|
||||
<g transform="matrix(0,-0.842628,0.842628,0,6.811922,78.99493)">
|
||||
<path d="M28.052,20.855L57.9,20.8C61.5,20.8 64.4,23.7 64.4,27.3L64.444,57.088L28.052,20.855ZM56.994,64.5L27.6,64.5C24,64.5 21.1,61.6 21.1,58L21.1,28.154L56.994,64.5Z" style="fill:rgb(17,49,7);"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(0,183,30);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.2 21.1,81.8 42.7,81.8Z" style="fill:rgb(54,198,89);"/>
|
||||
<g transform="matrix(0,-0.842628,0.842628,0,6.811922,78.99493)">
|
||||
<path d="M28.052,20.855L57.9,20.8C61.5,20.8 64.4,23.7 64.4,27.3L64.444,57.088L28.052,20.855ZM56.994,64.5L27.6,64.5C24,64.5 21.1,61.6 21.1,58L21.1,28.154L56.994,64.5Z" style="fill:rgb(17,49,7);"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(239,174,0);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(250,200,0);"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 805 B |
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(200,146,0);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(208,165,5);"/>
|
||||
<path d="M22.154,39.1L63.792,39.1C65.692,39.1 67.292,40.7 67.292,42.6L67.292,42.7C67.292,44.6 65.692,46.2 63.792,46.2L22.154,46.2C20.254,46.2 18.654,44.6 18.654,42.7L18.654,42.6C18.654,40.7 20.154,39.1 22.154,39.1Z" style="fill:rgb(126,100,12);stroke:rgb(126,100,12);stroke-width:3.5px;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(239,174,0);"/>
|
||||
<path d="M42.7,81.8C64.3,81.8 81.8,64.3 81.8,42.7C81.8,21.1 64.3,3.6 42.7,3.6C21.1,3.6 3.6,21.1 3.6,42.7C3.6,64.3 21.1,81.8 42.7,81.8Z" style="fill:rgb(250,200,0);"/>
|
||||
<path d="M22.154,39.1L63.792,39.1C65.692,39.1 67.292,40.7 67.292,42.6L67.292,42.7C67.292,44.6 65.692,46.2 63.792,46.2L22.154,46.2C20.254,46.2 18.654,44.6 18.654,42.7L18.654,42.6C18.654,40.7 20.154,39.1 22.154,39.1Z" style="fill:rgb(126,100,12);stroke:rgb(126,100,12);stroke-width:3.5px;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g>
|
||||
<path d="M42.7,85.4C66.3,85.4 85.4,66.3 85.4,42.7C85.4,19.1 66.3,0 42.7,0C19.1,0 0,19.1 0,42.7C0,66.3 19.1,85.4 42.7,85.4Z" style="fill:rgb(209,208,210);fill-opacity:0.3;"/>
|
||||
<path d="M42.7,81.7C64.3,81.7 81.8,64.2 81.8,42.6C81.8,21 64.3,3.5 42.7,3.5C21.1,3.5 3.6,21 3.6,42.6C3.6,64.2 21.1,81.7 42.7,81.7Z" style="fill:rgb(199,199,199);fill-opacity:0.3;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 839 B |
|
Before Width: | Height: | Size: 279 KiB |
@ -1,88 +0,0 @@
|
||||
import type { ElectrobunConfig } from "electrobun";
|
||||
import { readFileSync } from "node:fs";
|
||||
import path from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const rootDir = path.dirname(fileURLToPath(import.meta.url));
|
||||
const packageJson = JSON.parse(
|
||||
readFileSync(path.join(rootDir, "package.json"), "utf8"),
|
||||
);
|
||||
const buildEnv = process.env.ELECTROBUN_BUILD_ENV || "dev";
|
||||
const isStable = buildEnv === "stable";
|
||||
const canCodesign = Boolean(process.env.ELECTROBUN_DEVELOPER_ID);
|
||||
const bundleCEF = ["1", "true", "yes"].includes(
|
||||
String(process.env.ELECTROBUN_BUNDLE_CEF || "").toLowerCase(),
|
||||
);
|
||||
const defaultRenderer = bundleCEF ? "cef" : "native";
|
||||
const targetOs =
|
||||
process.env.ELECTROBUN_OS ||
|
||||
(process.platform === "darwin"
|
||||
? "macos"
|
||||
: process.platform === "win32"
|
||||
? "win"
|
||||
: "linux");
|
||||
|
||||
export default {
|
||||
app: {
|
||||
name: "Farm Control",
|
||||
identifier: "com.tombutcher.farmcontrol",
|
||||
version: packageJson.version,
|
||||
description: "3D Printer ERP and Control Software.",
|
||||
urlSchemes: ["farmcontrol"],
|
||||
},
|
||||
runtime: {
|
||||
exitOnLastWindowClosed: true,
|
||||
},
|
||||
build: {
|
||||
buildFolder: "build",
|
||||
artifactFolder: "app_dist",
|
||||
// macOS WebKit loads views:// assets reliably from a flat app folder;
|
||||
// ASAR-packed views can fail to load module scripts on first launch.
|
||||
useAsar: isStable && targetOs !== "macos",
|
||||
asarUnpack: [
|
||||
"*.node",
|
||||
"*.dll",
|
||||
"*.dylib",
|
||||
"*.so",
|
||||
"views/**",
|
||||
],
|
||||
bun: {
|
||||
entrypoint: "src/bun/index.js",
|
||||
},
|
||||
copy: {
|
||||
"dist/mainview": "views/mainview",
|
||||
"src/bun/libMacWindowEffects.dylib": "bun/libMacWindowEffects.dylib",
|
||||
},
|
||||
watch: ["scripts", "src"],
|
||||
watchIgnore: ["dist/**", "build/**", "app_dist/**"],
|
||||
mac: {
|
||||
bundleCEF,
|
||||
defaultRenderer,
|
||||
icons: "assets/icon.iconset",
|
||||
createDmg: false,
|
||||
codesign: isStable && canCodesign,
|
||||
notarize: isStable && canCodesign,
|
||||
},
|
||||
linux: {
|
||||
bundleCEF: false,
|
||||
defaultRenderer: "native",
|
||||
icon: "assets/icon.png",
|
||||
},
|
||||
win: {
|
||||
bundleCEF,
|
||||
defaultRenderer,
|
||||
icon: "assets/icon.iconset/icon_256x256.png",
|
||||
},
|
||||
},
|
||||
scripts: {
|
||||
preBuild: "scripts/pre-build.mjs",
|
||||
postWrap: "scripts/expand-macos-bundle.mjs",
|
||||
postPackage: "scripts/finalize-desktop-artifacts.mjs",
|
||||
},
|
||||
release: {
|
||||
baseUrl:
|
||||
process.env.ELECTROBUN_RELEASE_BASE_URL ||
|
||||
process.env.RELEASE_BASE_URL ||
|
||||
"",
|
||||
},
|
||||
} satisfies ElectrobunConfig;
|
||||
@ -1,515 +0,0 @@
|
||||
#import <Cocoa/Cocoa.h>
|
||||
#import <objc/runtime.h>
|
||||
|
||||
static NSString *const kElectrobunVibrancyViewIdentifier =
|
||||
@"ElectrobunVibrancyView";
|
||||
static NSString *const kElectrobunNativeDragViewIdentifier =
|
||||
@"ElectrobunNativeDragView";
|
||||
static NSString *const kElectrobunWindowBorderViewIdentifier =
|
||||
@"ElectrobunWindowBorderView";
|
||||
|
||||
static CGFloat gWindowCornerRadius = 15.0;
|
||||
static CGFloat gTrafficLightsX = 16.0;
|
||||
static CGFloat gTrafficLightsY = 12.0;
|
||||
|
||||
static const void *kElectrobunChromeObserverKey = &kElectrobunChromeObserverKey;
|
||||
|
||||
@interface ElectrobunWindowBorderView : NSView
|
||||
@property(nonatomic) CGFloat cornerRadius;
|
||||
@end
|
||||
|
||||
@implementation ElectrobunWindowBorderView
|
||||
@synthesize cornerRadius = _cornerRadius;
|
||||
|
||||
- (instancetype)initWithFrame:(NSRect)frameRect {
|
||||
self = [super initWithFrame:frameRect];
|
||||
if (self) {
|
||||
_cornerRadius = gWindowCornerRadius;
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (BOOL)isOpaque {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (BOOL)acceptsFirstMouse:(NSEvent *)event {
|
||||
(void)event;
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (NSView *)hitTest:(NSPoint)point {
|
||||
(void)point;
|
||||
return nil;
|
||||
}
|
||||
|
||||
- (void)setFrame:(NSRect)frame {
|
||||
[super setFrame:frame];
|
||||
[self setNeedsDisplay:YES];
|
||||
}
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect {
|
||||
(void)dirtyRect;
|
||||
|
||||
NSRect bounds = [self bounds];
|
||||
CGFloat radius = MAX(0.0, self.cornerRadius);
|
||||
NSBezierPath *borderPath = [NSBezierPath
|
||||
bezierPathWithRoundedRect:NSInsetRect(bounds, 0.5, 0.5)
|
||||
xRadius:radius
|
||||
yRadius:radius];
|
||||
|
||||
if (@available(macOS 10.14, *)) {
|
||||
NSAppearance *appearance = [self effectiveAppearance];
|
||||
BOOL isDark =
|
||||
[[appearance bestMatchFromAppearancesWithNames:@[
|
||||
NSAppearanceNameAqua, NSAppearanceNameDarkAqua
|
||||
]] isEqualToString:NSAppearanceNameDarkAqua];
|
||||
|
||||
if (isDark) {
|
||||
[[NSColor colorWithWhite:1.0 alpha:0.18] setStroke];
|
||||
} else {
|
||||
[[NSColor colorWithWhite:1.0 alpha:0.72] setStroke];
|
||||
}
|
||||
} else {
|
||||
[[NSColor colorWithWhite:1.0 alpha:0.72] setStroke];
|
||||
}
|
||||
|
||||
borderPath.lineWidth = 1.0;
|
||||
[borderPath stroke];
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ElectrobunNativeDragView : NSView
|
||||
@end
|
||||
|
||||
@implementation ElectrobunNativeDragView
|
||||
- (BOOL)isOpaque {
|
||||
return NO;
|
||||
}
|
||||
|
||||
- (void)drawRect:(NSRect)dirtyRect {
|
||||
(void)dirtyRect;
|
||||
}
|
||||
|
||||
- (void)mouseDown:(NSEvent *)event {
|
||||
NSWindow *window = [self window];
|
||||
if (window != nil && event != nil) {
|
||||
[window performWindowDragWithEvent:event];
|
||||
}
|
||||
}
|
||||
@end
|
||||
|
||||
@interface ElectrobunWindowChromeObserver : NSObject
|
||||
@property(nonatomic, weak) NSWindow *window;
|
||||
@end
|
||||
|
||||
static bool applyTrafficLightsPosition(NSWindow *window, CGFloat x,
|
||||
CGFloat yFromTop);
|
||||
static void refreshWindowChrome(NSWindow *window);
|
||||
static BOOL isWindowFullScreen(NSWindow *window);
|
||||
|
||||
@implementation ElectrobunWindowChromeObserver
|
||||
|
||||
- (instancetype)initWithWindow:(NSWindow *)window {
|
||||
self = [super init];
|
||||
if (self) {
|
||||
_window = window;
|
||||
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowDidResizeNotification
|
||||
object:window];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowDidEndLiveResizeNotification
|
||||
object:window];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowDidEnterFullScreenNotification
|
||||
object:window];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowDidExitFullScreenNotification
|
||||
object:window];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowDidBecomeKeyNotification
|
||||
object:window];
|
||||
[center addObserver:self
|
||||
selector:@selector(refreshChrome)
|
||||
name:NSWindowWillEnterFullScreenNotification
|
||||
object:window];
|
||||
}
|
||||
return self;
|
||||
}
|
||||
|
||||
- (void)refreshChrome {
|
||||
if (self.window != nil) {
|
||||
refreshWindowChrome(self.window);
|
||||
applyTrafficLightsPosition(self.window, gTrafficLightsX, gTrafficLightsY);
|
||||
}
|
||||
}
|
||||
|
||||
- (void)dealloc {
|
||||
[[NSNotificationCenter defaultCenter] removeObserver:self];
|
||||
}
|
||||
|
||||
@end
|
||||
|
||||
static NSVisualEffectView *findVibrancyView(NSView *contentView) {
|
||||
for (NSView *subview in [contentView subviews]) {
|
||||
if ([subview isKindOfClass:[NSVisualEffectView class]] &&
|
||||
[[subview identifier]
|
||||
isEqualToString:kElectrobunVibrancyViewIdentifier]) {
|
||||
return (NSVisualEffectView *)subview;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static ElectrobunNativeDragView *findNativeDragView(NSView *contentView) {
|
||||
for (NSView *subview in [contentView subviews]) {
|
||||
if ([subview isKindOfClass:[ElectrobunNativeDragView class]] &&
|
||||
[[subview identifier]
|
||||
isEqualToString:kElectrobunNativeDragViewIdentifier]) {
|
||||
return (ElectrobunNativeDragView *)subview;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static ElectrobunWindowBorderView *findWindowBorderView(NSView *contentView) {
|
||||
for (NSView *subview in [contentView subviews]) {
|
||||
if ([subview isKindOfClass:[ElectrobunWindowBorderView class]] &&
|
||||
[[subview identifier]
|
||||
isEqualToString:kElectrobunWindowBorderViewIdentifier]) {
|
||||
return (ElectrobunWindowBorderView *)subview;
|
||||
}
|
||||
}
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
static BOOL isWindowFullScreen(NSWindow *window) {
|
||||
return (window.styleMask & NSWindowStyleMaskFullScreen) != 0;
|
||||
}
|
||||
|
||||
static void refreshWindowChrome(NSWindow *window) {
|
||||
BOOL fullScreen = isWindowFullScreen(window);
|
||||
CGFloat radius = fullScreen ? 0.0 : gWindowCornerRadius;
|
||||
|
||||
NSView *contentView = [window contentView];
|
||||
if (contentView == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
contentView.wantsLayer = YES;
|
||||
contentView.layer.cornerRadius = radius;
|
||||
contentView.layer.masksToBounds = YES;
|
||||
|
||||
NSVisualEffectView *effectView = findVibrancyView(contentView);
|
||||
if (effectView != nil) {
|
||||
effectView.wantsLayer = YES;
|
||||
effectView.layer.cornerRadius = radius;
|
||||
effectView.layer.masksToBounds = YES;
|
||||
}
|
||||
|
||||
ElectrobunWindowBorderView *borderView = findWindowBorderView(contentView);
|
||||
if (borderView != nil) {
|
||||
borderView.hidden = fullScreen;
|
||||
if (!fullScreen) {
|
||||
borderView.cornerRadius = gWindowCornerRadius;
|
||||
[borderView setNeedsDisplay:YES];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void applyWindowCornerRadius(NSWindow *window, CGFloat radius) {
|
||||
gWindowCornerRadius = MAX(0.0, radius);
|
||||
refreshWindowChrome(window);
|
||||
}
|
||||
|
||||
static void ensureWindowBorder(NSWindow *window) {
|
||||
NSView *contentView = [window contentView];
|
||||
if (contentView == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
ElectrobunWindowBorderView *borderView = findWindowBorderView(contentView);
|
||||
if (borderView == nil) {
|
||||
borderView = [[ElectrobunWindowBorderView alloc]
|
||||
initWithFrame:[contentView bounds]];
|
||||
[borderView setIdentifier:kElectrobunWindowBorderViewIdentifier];
|
||||
[borderView
|
||||
setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
||||
}
|
||||
|
||||
[borderView setFrame:[contentView bounds]];
|
||||
|
||||
if ([borderView superview] == nil) {
|
||||
[contentView addSubview:borderView
|
||||
positioned:NSWindowAbove
|
||||
relativeTo:nil];
|
||||
} else {
|
||||
[borderView removeFromSuperview];
|
||||
[contentView addSubview:borderView
|
||||
positioned:NSWindowAbove
|
||||
relativeTo:nil];
|
||||
}
|
||||
|
||||
refreshWindowChrome(window);
|
||||
}
|
||||
|
||||
static bool applyTrafficLightsPosition(NSWindow *window, CGFloat x,
|
||||
CGFloat yFromTop) {
|
||||
NSButton *closeButton = [window standardWindowButton:NSWindowCloseButton];
|
||||
NSButton *minimizeButton =
|
||||
[window standardWindowButton:NSWindowMiniaturizeButton];
|
||||
NSButton *zoomButton = [window standardWindowButton:NSWindowZoomButton];
|
||||
|
||||
if (closeButton == nil || minimizeButton == nil || zoomButton == nil) {
|
||||
return false;
|
||||
}
|
||||
|
||||
NSView *buttonContainer = [closeButton superview];
|
||||
if (buttonContainer == nil) {
|
||||
return false;
|
||||
}
|
||||
|
||||
CGFloat spacing = NSMinX(minimizeButton.frame) - NSMinX(closeButton.frame);
|
||||
if (spacing <= 0) {
|
||||
spacing = closeButton.frame.size.width + 6.0;
|
||||
}
|
||||
|
||||
BOOL flipped = [buttonContainer isFlipped];
|
||||
CGFloat targetY = yFromTop;
|
||||
if (!flipped) {
|
||||
targetY = buttonContainer.frame.size.height - yFromTop -
|
||||
closeButton.frame.size.height;
|
||||
}
|
||||
targetY = MAX(0.0, targetY);
|
||||
|
||||
CGFloat currentX = x;
|
||||
NSArray *buttons = @[ closeButton, minimizeButton, zoomButton ];
|
||||
for (NSButton *button in buttons) {
|
||||
[button setAutoresizingMask:NSViewNotSizable];
|
||||
[button setFrameOrigin:NSMakePoint(currentX, targetY)];
|
||||
currentX += spacing;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void ensureTrafficLightsObserver(NSWindow *window) {
|
||||
ElectrobunWindowChromeObserver *existingObserver =
|
||||
objc_getAssociatedObject(window, kElectrobunChromeObserverKey);
|
||||
if (existingObserver != nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
ElectrobunWindowChromeObserver *observer =
|
||||
[[ElectrobunWindowChromeObserver alloc] initWithWindow:window];
|
||||
objc_setAssociatedObject(window, kElectrobunChromeObserverKey, observer,
|
||||
OBJC_ASSOCIATION_RETAIN_NONATOMIC);
|
||||
}
|
||||
|
||||
static void scheduleTrafficLightsPosition(NSWindow *window, NSInteger attempt) {
|
||||
if (applyTrafficLightsPosition(window, gTrafficLightsX, gTrafficLightsY)) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (attempt >= 10) {
|
||||
return;
|
||||
}
|
||||
|
||||
dispatch_after(
|
||||
dispatch_time(DISPATCH_TIME_NOW, (int64_t)(50 * NSEC_PER_MSEC)),
|
||||
dispatch_get_main_queue(), ^{
|
||||
scheduleTrafficLightsPosition(window, attempt + 1);
|
||||
});
|
||||
}
|
||||
|
||||
extern "C" bool enableWindowVibrancy(void *windowPtr, double cornerRadius) {
|
||||
if (windowPtr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
__block BOOL success = NO;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
NSWindow *window = (__bridge NSWindow *)windowPtr;
|
||||
if (![window isKindOfClass:[NSWindow class]]) {
|
||||
return;
|
||||
}
|
||||
|
||||
applyWindowCornerRadius(window, (CGFloat)cornerRadius);
|
||||
|
||||
[window setOpaque:NO];
|
||||
[window setBackgroundColor:[NSColor clearColor]];
|
||||
[window setTitlebarAppearsTransparent:YES];
|
||||
[window setHasShadow:YES];
|
||||
|
||||
NSView *contentView = [window contentView];
|
||||
if (contentView == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSVisualEffectView *effectView = findVibrancyView(contentView);
|
||||
|
||||
if (effectView == nil) {
|
||||
effectView = [[NSVisualEffectView alloc]
|
||||
initWithFrame:[contentView bounds]];
|
||||
[effectView setIdentifier:kElectrobunVibrancyViewIdentifier];
|
||||
[effectView
|
||||
setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)];
|
||||
}
|
||||
|
||||
if (@available(macOS 10.14, *)) {
|
||||
[effectView setMaterial:NSVisualEffectMaterialHUDWindow];
|
||||
} else {
|
||||
[effectView setMaterial:NSVisualEffectMaterialSidebar];
|
||||
}
|
||||
[effectView setBlendingMode:NSVisualEffectBlendingModeBehindWindow];
|
||||
[effectView setState:NSVisualEffectStateActive];
|
||||
|
||||
if ([effectView superview] == nil) {
|
||||
NSView *relativeView = [[contentView subviews] firstObject];
|
||||
if (relativeView != nil) {
|
||||
[contentView addSubview:effectView
|
||||
positioned:NSWindowBelow
|
||||
relativeTo:relativeView];
|
||||
} else {
|
||||
[contentView addSubview:effectView];
|
||||
}
|
||||
}
|
||||
|
||||
ensureWindowBorder(window);
|
||||
applyWindowCornerRadius(window, gWindowCornerRadius);
|
||||
ensureTrafficLightsObserver(window);
|
||||
scheduleTrafficLightsPosition(window, 0);
|
||||
|
||||
[window invalidateShadow];
|
||||
success = YES;
|
||||
});
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
extern "C" bool setWindowCornerRadius(void *windowPtr, double cornerRadius) {
|
||||
if (windowPtr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
__block BOOL success = NO;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
NSWindow *window = (__bridge NSWindow *)windowPtr;
|
||||
if (![window isKindOfClass:[NSWindow class]]) {
|
||||
return;
|
||||
}
|
||||
|
||||
applyWindowCornerRadius(window, (CGFloat)cornerRadius);
|
||||
ensureWindowBorder(window);
|
||||
[window invalidateShadow];
|
||||
success = YES;
|
||||
});
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
extern "C" bool ensureWindowShadow(void *windowPtr) {
|
||||
if (windowPtr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
__block BOOL success = NO;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
NSWindow *window = (__bridge NSWindow *)windowPtr;
|
||||
if (![window isKindOfClass:[NSWindow class]]) {
|
||||
return;
|
||||
}
|
||||
|
||||
[window setHasShadow:YES];
|
||||
[window invalidateShadow];
|
||||
ensureWindowBorder(window);
|
||||
applyWindowCornerRadius(window, gWindowCornerRadius);
|
||||
success = YES;
|
||||
});
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
extern "C" bool setWindowTrafficLightsPosition(void *windowPtr, double x,
|
||||
double yFromTop) {
|
||||
if (windowPtr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
__block BOOL success = NO;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
NSWindow *window = (__bridge NSWindow *)windowPtr;
|
||||
if (![window isKindOfClass:[NSWindow class]]) {
|
||||
return;
|
||||
}
|
||||
|
||||
gTrafficLightsX = (CGFloat)x;
|
||||
gTrafficLightsY = (CGFloat)yFromTop;
|
||||
ensureTrafficLightsObserver(window);
|
||||
success = applyTrafficLightsPosition(window, gTrafficLightsX, gTrafficLightsY);
|
||||
if (success) {
|
||||
[window invalidateShadow];
|
||||
}
|
||||
});
|
||||
|
||||
return success;
|
||||
}
|
||||
|
||||
extern "C" bool setNativeWindowDragRegion(void *windowPtr, double x,
|
||||
double height) {
|
||||
if (windowPtr == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
__block BOOL success = NO;
|
||||
dispatch_sync(dispatch_get_main_queue(), ^{
|
||||
NSWindow *window = (__bridge NSWindow *)windowPtr;
|
||||
if (![window isKindOfClass:[NSWindow class]]) {
|
||||
return;
|
||||
}
|
||||
|
||||
NSView *contentView = [window contentView];
|
||||
if (contentView == nil) {
|
||||
return;
|
||||
}
|
||||
|
||||
CGFloat dragX = MAX(0.0, x);
|
||||
CGFloat dragHeight = MAX(0.0, height);
|
||||
CGFloat dragWidth = MAX(0.0, contentView.bounds.size.width - dragX);
|
||||
if (dragHeight <= 0.0 || dragWidth <= 0.0) {
|
||||
return;
|
||||
}
|
||||
|
||||
BOOL flipped = [contentView isFlipped];
|
||||
CGFloat dragY = flipped ? 0.0 : contentView.bounds.size.height - dragHeight;
|
||||
dragY = MAX(0.0, dragY);
|
||||
|
||||
ElectrobunNativeDragView *dragView = findNativeDragView(contentView);
|
||||
if (dragView == nil) {
|
||||
dragView = [[ElectrobunNativeDragView alloc] initWithFrame:NSZeroRect];
|
||||
[dragView setIdentifier:kElectrobunNativeDragViewIdentifier];
|
||||
}
|
||||
|
||||
[dragView setFrame:NSMakeRect(dragX, dragY, dragWidth, dragHeight)];
|
||||
[dragView setAutoresizingMask:NSViewWidthSizable];
|
||||
|
||||
if ([dragView superview] == nil) {
|
||||
[contentView addSubview:dragView
|
||||
positioned:NSWindowAbove
|
||||
relativeTo:nil];
|
||||
}
|
||||
|
||||
success = YES;
|
||||
});
|
||||
|
||||
return success;
|
||||
}
|
||||
49
package.json
@ -4,14 +4,13 @@
|
||||
"name": "Tom Butcher",
|
||||
"email": "tom@tombutcher.work"
|
||||
},
|
||||
"version": "0.1.1",
|
||||
"version": "0.1.0",
|
||||
"type": "module",
|
||||
"private": true,
|
||||
"homepage": "./",
|
||||
"dependencies": {
|
||||
"@ant-design/icons": "^6.1.0",
|
||||
"@babel/plugin-transform-private-property-in-object": "^7.27.1",
|
||||
"@codemirror/commands": "6.10.4",
|
||||
"@codemirror/lang-cpp": "^6.0.3",
|
||||
"@codemirror/lang-css": "^6.3.1",
|
||||
"@codemirror/lang-go": "^6.0.1",
|
||||
@ -26,14 +25,7 @@
|
||||
"@codemirror/lang-sql": "^6.9.1",
|
||||
"@codemirror/lang-xml": "^6.1.0",
|
||||
"@codemirror/lang-yaml": "^6.1.2",
|
||||
"@codemirror/language": "6.12.1",
|
||||
"@codemirror/merge": "^6.12.2",
|
||||
"@codemirror/state": "6.7.1",
|
||||
"@codemirror/theme-one-dark": "^6.1.3",
|
||||
"@codemirror/view": "6.39.12",
|
||||
"@lezer/common": "1.5.0",
|
||||
"@lezer/highlight": "^1.2.3",
|
||||
"@lezer/lr": "^1.4.8",
|
||||
"@simplewebauthn/browser": "^13.1.2",
|
||||
"@tanstack/react-query": "^5.90.10",
|
||||
"@tiptap/extension-link": "^3.20.1",
|
||||
@ -50,36 +42,33 @@
|
||||
"antd": "^5.27.1",
|
||||
"antd-style": "^3.7.1",
|
||||
"axios": "^1.11.0",
|
||||
"blurhash": "^2.0.5",
|
||||
"classnames": "^2.5.1",
|
||||
"codemirror": "^6.0.2",
|
||||
"country-list": "^2.4.1",
|
||||
"cross-env": "^10.0.0",
|
||||
"dayjs": "^1.11.18",
|
||||
"dotenv": "^17.2.1",
|
||||
"echarts": "^6.1.0",
|
||||
"echarts-for-react": "^3.0.6",
|
||||
"electron-store": "^11.0.2",
|
||||
"gcode-preview": "3.0.0-alpha.6",
|
||||
"gcode-preview": "^2.18.0",
|
||||
"json-schema-traverse": "^1.0.0",
|
||||
"keycloak-js": "^26.2.0",
|
||||
"lodash": "^4.17.23",
|
||||
"loglevel": "^1.9.2",
|
||||
"nanoid": "^5.1.14",
|
||||
"online-3d-viewer": "^0.16.0",
|
||||
"pdfjs-dist": "5.4.296",
|
||||
"prop-types": "^15.8.1",
|
||||
"react": "^19.1.1",
|
||||
"react-country-flag": "^3.1.0",
|
||||
"react-dom": "^19.1.1",
|
||||
"react-markdown": "^10.1.0",
|
||||
"react-pdf": "^10.5.0",
|
||||
"react-responsive": "^10.0.1",
|
||||
"react-router-dom": "^7.8.2",
|
||||
"recharts": "^3.8.1",
|
||||
"remark-gfm": "^4.0.1",
|
||||
"simplebar-react": "^3.3.2",
|
||||
"socket.io-client": "*",
|
||||
"standard": "^17.1.2",
|
||||
"styled-components": "^6.1.19",
|
||||
"svgo": "^4.0.0",
|
||||
"svgo-loader": "^4.0.0",
|
||||
"three": "^0.179.1",
|
||||
"tsparticles": "^3.9.1",
|
||||
"web-vitals": "^5.1.0"
|
||||
@ -88,21 +77,13 @@
|
||||
"description": "3D Printer ERP and Control Software.",
|
||||
"scripts": {
|
||||
"dev": "cross-env NODE_ENV=development vite",
|
||||
"dev:app": "concurrently \"cross-env NODE_ENV=development bun run dev:renderer\" \"cross-env NODE_ENV=development electrobun dev\"",
|
||||
"dev:renderer": "vite --port 5780 --no-open",
|
||||
"electron": "cross-env ELECTRON_START_URL=http://0.0.0.0:5780 && cross-env NODE_ENV=development && electron .",
|
||||
"start": "serve -s build",
|
||||
"build": "vite build",
|
||||
"build:app": "electrobun build --env=stable",
|
||||
"build:app:mac": "bun scripts/build-macos.mjs",
|
||||
"dev:electron": "concurrently \"cross-env NODE_ENV=development vite --port 5780 --no-open\" \"cross-env ELECTRON_START_URL=http://localhost:5780 NODE_ENV=development electron public/electron.js\"",
|
||||
"dev:electron": "concurrently \"cross-env NODE_ENV=development vite --port 5780 --no-open\" \"cross-env ELECTRON_START_URL=http://localhost:5780 cross-env NODE_ENV=development electron public/electron.js\"",
|
||||
"build:electron": "vite build && electron-builder",
|
||||
"build:cloudflare": "cross-env VITE_DEPLOY_TARGET=cloudflare vite build",
|
||||
"deploy": "npm run build:cloudflare && wrangler pages deploy --branch main",
|
||||
"postinstall": "bun scripts/patch-electrobun-src.mjs && bun scripts/build-macos-effects.mjs",
|
||||
"generate-app-icons": "bun scripts/generate-app-icons.mjs",
|
||||
"build:macos-effects": "bun scripts/build-macos-effects.mjs",
|
||||
"clean": "bun scripts/clean-build.mjs"
|
||||
"deploy": "npm run build:cloudflare && wrangler pages deploy --branch main"
|
||||
},
|
||||
"eslintConfig": {
|
||||
"extends": [
|
||||
@ -126,7 +107,6 @@
|
||||
"@eslint/js": "^9.39.2",
|
||||
"@vitejs/plugin-react": "^5.0.2",
|
||||
"concurrently": "^9.2.1",
|
||||
"electrobun": "1.18.1",
|
||||
"electron": "^38.7.1",
|
||||
"electron-builder": "^26.0.12",
|
||||
"electron-packager": "^17.1.2",
|
||||
@ -138,11 +118,8 @@
|
||||
"eslint-plugin-react-refresh": "^0.4.20",
|
||||
"express": "^5.1.0",
|
||||
"globals": "^15.12.0",
|
||||
"jimp": "^1.6.1",
|
||||
"png-to-ico": "^2.1.8",
|
||||
"prettier": "^3.6.2",
|
||||
"prettier-eslint": "^16.4.2",
|
||||
"rcedit": "^4.0.1",
|
||||
"rollup-plugin-visualizer": "^6.0.5",
|
||||
"serve": "^14.2.4",
|
||||
"standard": "^17.1.2",
|
||||
@ -236,7 +213,7 @@
|
||||
"win": {
|
||||
"target": [
|
||||
"nsis",
|
||||
"msiWrapped"
|
||||
"msi"
|
||||
],
|
||||
"protocols": [
|
||||
{
|
||||
@ -254,13 +231,7 @@
|
||||
"oneClick": false,
|
||||
"allowToChangeInstallationDirectory": true,
|
||||
"include": "scripts/installer.nsh",
|
||||
"perMachine": false
|
||||
},
|
||||
"msiWrapped": {
|
||||
"upgradeCode": "{735812DB-E33B-57A0-8FBC-5FC3155925AA}",
|
||||
"perMachine": false,
|
||||
"impersonate": true,
|
||||
"wrappedInstallerArgs": "/S /UPDATE /RESTARTFC"
|
||||
"perMachine": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -1,148 +0,0 @@
|
||||
!include "MUI2.nsh"
|
||||
!include "LogicLib.nsh"
|
||||
!include "installer.nsh"
|
||||
|
||||
!ifndef OUTFILE
|
||||
!define OUTFILE "farmcontrol-installer.exe"
|
||||
!endif
|
||||
|
||||
!ifndef VERSION
|
||||
!define VERSION "0.1.0"
|
||||
!endif
|
||||
|
||||
!ifndef BUILD_NUMBER
|
||||
!define BUILD_NUMBER "dev"
|
||||
!endif
|
||||
|
||||
!ifndef APP_SOURCE_DIR
|
||||
!define APP_SOURCE_DIR "app"
|
||||
!endif
|
||||
|
||||
!ifndef APP_FILE_LIST_GENERATOR
|
||||
!define APP_FILE_LIST_GENERATOR "..\..\scripts\generate-nsis-file-list.ps1"
|
||||
!endif
|
||||
|
||||
; Enumerate APP_SOURCE_DIR now, while compiling, so the generated installer
|
||||
; knows the exact unpacked byte total and can log each extracted file.
|
||||
!insertmacro compileProgressFileCopy "${APP_SOURCE_DIR}" "${APP_FILE_LIST_GENERATOR}"
|
||||
|
||||
Name "Farm Control"
|
||||
OutFile "${OUTFILE}"
|
||||
InstallDir "$LOCALAPPDATA\Programs\Farm Control"
|
||||
InstallDirRegKey HKCU "Software\Tom Butcher\Farm Control" "InstallDir"
|
||||
RequestExecutionLevel user
|
||||
SilentInstall normal
|
||||
|
||||
!define MUI_ABORTWARNING
|
||||
|
||||
!ifndef INSTALLER_ICON
|
||||
!define INSTALLER_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
|
||||
!endif
|
||||
|
||||
!ifndef UNINSTALLER_ICON
|
||||
!define UNINSTALLER_ICON "${INSTALLER_ICON}"
|
||||
!endif
|
||||
|
||||
!define MUI_ICON "${INSTALLER_ICON}"
|
||||
!define MUI_UNICON "${UNINSTALLER_ICON}"
|
||||
|
||||
Icon "${INSTALLER_ICON}"
|
||||
UninstallIcon "${UNINSTALLER_ICON}"
|
||||
|
||||
BrandingText "Farm Control v${VERSION}-b${BUILD_NUMBER} Installer"
|
||||
|
||||
!insertmacro MUI_PAGE_DIRECTORY
|
||||
!insertmacro MUI_PAGE_INSTFILES
|
||||
!insertmacro MUI_UNPAGE_CONFIRM
|
||||
!insertmacro MUI_UNPAGE_INSTFILES
|
||||
!insertmacro MUI_LANGUAGE "English"
|
||||
|
||||
Function .onInit
|
||||
!insertmacro initProgressLog
|
||||
|
||||
${If} ${Silent}
|
||||
SetAutoClose true
|
||||
${EndIf}
|
||||
|
||||
!insertmacro progressPhase "Starting installation"
|
||||
!insertmacro progressStatus "Starting Farm Control installation..."
|
||||
!insertmacro progressCopyTotal "${APP_COPY_TOTAL_BYTES}"
|
||||
!insertmacro progressStart
|
||||
|
||||
; In-app updates install into Farm Control.new while the running process
|
||||
; keeps using Farm Control; the folders are swapped after exit (/RESTARTFC).
|
||||
; Interactive / silent fresh installs still remove the previous version first.
|
||||
${If} $IsInAppUpdate == "1"
|
||||
!insertmacro prepareSideBySideUpdate
|
||||
${Else}
|
||||
StrCpy $FinalInstDir $INSTDIR
|
||||
!insertmacro uninstallPreviousFarmControl
|
||||
${EndIf}
|
||||
|
||||
!insertmacro progressPrepare
|
||||
FunctionEnd
|
||||
|
||||
Function .onInstFailed
|
||||
!insertmacro progressFailure "Installation failed."
|
||||
FunctionEnd
|
||||
|
||||
Function .onInstSuccess
|
||||
Call restartFarmControlAfterUpdate
|
||||
FunctionEnd
|
||||
|
||||
Section "Farm Control" SecMain
|
||||
SectionIn RO
|
||||
|
||||
!insertmacro progressPhase "Copying application files"
|
||||
!insertmacro progressStatus "Copying application files..."
|
||||
!insertmacro progressCopyStart
|
||||
|
||||
SetOverwrite try
|
||||
!insertmacro copyApplicationFilesWithProgress
|
||||
|
||||
!insertmacro progressCopyComplete
|
||||
!insertmacro customInstall
|
||||
|
||||
!insertmacro progressFinalizeInstall
|
||||
!insertmacro progressPhase "Finalizing installation"
|
||||
!insertmacro progressStatus "Writing installation registry entries..."
|
||||
|
||||
WriteRegStr HKCU "Software\Tom Butcher\Farm Control" "InstallDir" $FinalInstDir
|
||||
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"DisplayName" "Farm Control"
|
||||
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"DisplayVersion" "${VERSION}"
|
||||
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"Publisher" "Tom Butcher"
|
||||
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"UninstallString" "$FinalInstDir\Uninstall.exe"
|
||||
WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"NoModify" 1
|
||||
WriteRegDWORD HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" \
|
||||
"NoRepair" 1
|
||||
|
||||
!insertmacro progressWriteUninstaller
|
||||
!insertmacro progressStatus "Writing uninstall information..."
|
||||
|
||||
WriteUninstaller "$INSTDIR\Uninstall.exe"
|
||||
|
||||
!insertmacro progressFinalize
|
||||
|
||||
|
||||
; For in-app updates (/RESTARTFC) the success signal is emitted from
|
||||
; restartFarmControlAfterUpdate, right before the install directory swap,
|
||||
; so the running app quits while this installer stays alive.
|
||||
${If} $RestartAfterInstall != "1"
|
||||
!insertmacro progressSuccess
|
||||
${EndIf}
|
||||
SectionEnd
|
||||
|
||||
Section "Uninstall"
|
||||
!insertmacro customUnInstall
|
||||
|
||||
Delete "$INSTDIR\Uninstall.exe"
|
||||
RMDir /r "$INSTDIR"
|
||||
|
||||
DeleteRegKey HKCU "Software\Tom Butcher\Farm Control"
|
||||
DeleteRegKey HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control"
|
||||
SectionEnd
|
||||
@ -1,460 +0,0 @@
|
||||
!include "FileFunc.nsh"
|
||||
!insertmacro GetParameters
|
||||
!insertmacro GetOptions
|
||||
|
||||
Var ProgressLogFile
|
||||
Var IsInAppUpdate
|
||||
Var RestartAfterInstall
|
||||
Var FinalInstDir
|
||||
Var UpdateParentPid
|
||||
|
||||
; Generate an include at compile time that defines APP_COPY_TOTAL_BYTES and
|
||||
; copyApplicationFilesWithProgress. The generated macro contains one File
|
||||
; command and one byte-progress log entry for every file in the source tree.
|
||||
!macro compileProgressFileCopy sourceDir generator
|
||||
!tempfile GENERATED_FILE_COPY_INCLUDE
|
||||
!system 'powershell.exe -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -File "${generator}" -SourceDir "${sourceDir}" -OutputPath "${GENERATED_FILE_COPY_INCLUDE}"' = 0
|
||||
!include "${GENERATED_FILE_COPY_INCLUDE}"
|
||||
!delfile "${GENERATED_FILE_COPY_INCLUDE}"
|
||||
!undef GENERATED_FILE_COPY_INCLUDE
|
||||
!macroend
|
||||
|
||||
!macro initProgressLog
|
||||
StrCpy $ProgressLogFile ""
|
||||
StrCpy $IsInAppUpdate "0"
|
||||
StrCpy $RestartAfterInstall "0"
|
||||
StrCpy $FinalInstDir ""
|
||||
StrCpy $UpdateParentPid "0"
|
||||
|
||||
${GetParameters} $R9
|
||||
|
||||
ClearErrors
|
||||
${GetOptions} $R9 "/UPDATE" $R8
|
||||
${IfNot} ${Errors}
|
||||
StrCpy $IsInAppUpdate "1"
|
||||
${EndIf}
|
||||
|
||||
ClearErrors
|
||||
${GetOptions} $R9 "/RESTARTFC" $R8
|
||||
${IfNot} ${Errors}
|
||||
StrCpy $RestartAfterInstall "1"
|
||||
${EndIf}
|
||||
|
||||
ClearErrors
|
||||
${GetOptions} $R9 "/PARENTPID=" $R8
|
||||
${IfNot} ${Errors}
|
||||
; Convert to an integer before it is used in Win32 calls or taskkill.
|
||||
IntOp $UpdateParentPid $R8 + 0
|
||||
${EndIf}
|
||||
|
||||
; Prefer env var so paths with spaces are reliable; /LOG= remains supported.
|
||||
ReadEnvStr $ProgressLogFile "FARMCONTROL_INSTALL_LOG"
|
||||
${If} $ProgressLogFile == ""
|
||||
ClearErrors
|
||||
${GetOptions} $R9 "/LOG=" $ProgressLogFile
|
||||
${If} ${Errors}
|
||||
StrCpy $ProgressLogFile ""
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
${If} $ProgressLogFile != ""
|
||||
; Strip surrounding quotes from /LOG="C:\path with spaces\log.log"
|
||||
StrCpy $R8 $ProgressLogFile 1
|
||||
${If} $R8 == '"'
|
||||
StrCpy $ProgressLogFile $ProgressLogFile "" 1
|
||||
StrLen $R8 $ProgressLogFile
|
||||
IntOp $R8 $R8 - 1
|
||||
${If} $R8 > 0
|
||||
StrCpy $ProgressLogFile $ProgressLogFile $R8
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
; Truncate any previous log so progress starts clean.
|
||||
Push $0
|
||||
FileOpen $0 "$ProgressLogFile" w
|
||||
${If} $0 != ""
|
||||
FileClose $0
|
||||
${EndIf}
|
||||
Pop $0
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
; Open/append/close each line so the updater can read the log concurrently
|
||||
; (avoids an exclusive lock for the whole install; LogEx SHARE_READ is an alternative).
|
||||
!macro progressLog line
|
||||
DetailPrint "${line}"
|
||||
${If} $ProgressLogFile != ""
|
||||
Push $0
|
||||
FileOpen $0 "$ProgressLogFile" a
|
||||
${If} $0 != ""
|
||||
FileSeek $0 0 END
|
||||
FileWrite $0 "${line}$\r$\n"
|
||||
FileClose $0
|
||||
${EndIf}
|
||||
Pop $0
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
!define PROGRESS_START 1
|
||||
!define PREPARE_PROGRESS 3
|
||||
!define COPY_PROGRESS_START 5
|
||||
!define COPY_PROGRESS_END 90
|
||||
!define CONFIGURE_PROGRESS 91
|
||||
!define SHORTCUTS_PROGRESS 93
|
||||
!define FINALIZE_PROGRESS 95
|
||||
!define UNINSTALLER_PROGRESS 97
|
||||
!define COMPLETE_PROGRESS 99
|
||||
|
||||
!macro progressPercent percent
|
||||
!insertmacro progressLog "installer:%${percent}"
|
||||
!macroend
|
||||
|
||||
!macro progressStart
|
||||
!insertmacro progressPercent "${PROGRESS_START}"
|
||||
!macroend
|
||||
|
||||
!macro progressPrepare
|
||||
!insertmacro progressPercent "${PREPARE_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressCopyStart
|
||||
!insertmacro progressPercent "${COPY_PROGRESS_START}"
|
||||
!macroend
|
||||
|
||||
!macro progressCopyComplete
|
||||
!insertmacro progressPercent "${COPY_PROGRESS_END}"
|
||||
!macroend
|
||||
|
||||
!macro progressConfigure
|
||||
!insertmacro progressPercent "${CONFIGURE_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressShortcuts
|
||||
!insertmacro progressPercent "${SHORTCUTS_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressFinalizeInstall
|
||||
!insertmacro progressPercent "${FINALIZE_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressWriteUninstaller
|
||||
!insertmacro progressPercent "${UNINSTALLER_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressFinalize
|
||||
!insertmacro progressPercent "${COMPLETE_PROGRESS}"
|
||||
!macroend
|
||||
|
||||
!macro progressPhase phase
|
||||
!insertmacro progressLog "installer:PHASE:${phase}"
|
||||
!macroend
|
||||
|
||||
!macro progressStatus status
|
||||
!insertmacro progressLog "installer:STATUS:${status}"
|
||||
!macroend
|
||||
|
||||
!macro progressCopyTotal bytes
|
||||
!insertmacro progressLog "installer:COPY_TOTAL:${bytes}"
|
||||
!macroend
|
||||
|
||||
!macro progressCopyFile bytes relativePath
|
||||
!insertmacro progressLog "installer:COPY_FILE:${bytes}:${relativePath}"
|
||||
!macroend
|
||||
|
||||
!macro progressSuccess
|
||||
!insertmacro progressPercent 100
|
||||
!insertmacro progressStatus "Installation complete. Restarting Farm Control..."
|
||||
!insertmacro progressLog "installer: The install was successful."
|
||||
!macroend
|
||||
|
||||
!macro progressFailure message
|
||||
!insertmacro progressLog "installer:STATUS:${message}"
|
||||
!insertmacro progressLog "installer: The install failed."
|
||||
!macroend
|
||||
|
||||
!macro quitFarmControl
|
||||
!insertmacro progressPhase "Stopping Farm Control"
|
||||
!insertmacro progressStatus "Stopping running Farm Control processes..."
|
||||
DetailPrint "Stopping running Farm Control processes..."
|
||||
ExecWait 'taskkill /F /IM FarmControl.exe /T' $R0
|
||||
ExecWait 'taskkill /F /IM launcher.exe /T' $R0
|
||||
!macroend
|
||||
|
||||
; Side-by-side update: install into Farm Control.new while the running app
|
||||
; keeps using Farm Control, then swap folders after the process exits.
|
||||
!macro prepareSideBySideUpdate
|
||||
!insertmacro progressPhase "Preparing update"
|
||||
!insertmacro progressStatus "Preparing staging folder for update..."
|
||||
|
||||
StrCpy $FinalInstDir $INSTDIR
|
||||
StrCpy $INSTDIR "$FinalInstDir.new"
|
||||
|
||||
${If} ${FileExists} "$INSTDIR"
|
||||
DetailPrint "Removing leftover staging folder..."
|
||||
RMDir /r "$INSTDIR"
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
; Swap order: Farm Control -> .old, Farm Control.new -> Farm Control, delete .old.
|
||||
!macro swapUpdateStaging
|
||||
!insertmacro progressPhase "Applying update"
|
||||
!insertmacro progressStatus "Replacing Farm Control with the new version..."
|
||||
DetailPrint "Replacing Farm Control with staged update..."
|
||||
|
||||
; The install section ran SetOutPath into the install tree; a directory that
|
||||
; is any process's working directory cannot be renamed, so move out first.
|
||||
SetOutPath "$TEMP"
|
||||
|
||||
Sleep 3000
|
||||
|
||||
; Clear a leftover .old from a previous interrupted update.
|
||||
${If} ${FileExists} "$FinalInstDir.old"
|
||||
DetailPrint "Removing leftover Farm Control.old..."
|
||||
RMDir /r "$FinalInstDir.old"
|
||||
${EndIf}
|
||||
|
||||
${If} ${FileExists} "$FinalInstDir"
|
||||
!insertmacro progressStatus "Waiting for Farm Control to release install files..."
|
||||
DetailPrint "Waiting to rename install directory to Farm Control.old..."
|
||||
|
||||
; Retry every 500ms; success is verified on disk rather than via the
|
||||
; error flag, which Rename does not set reliably.
|
||||
StrCpy $R7 0
|
||||
swap_rename_old_retry:
|
||||
Rename "$FinalInstDir" "$FinalInstDir.old"
|
||||
${IfNot} ${FileExists} "$FinalInstDir"
|
||||
Goto swap_rename_old_done
|
||||
${EndIf}
|
||||
IntOp $R7 $R7 + 1
|
||||
${If} $R7 < 120
|
||||
Sleep 500
|
||||
Goto swap_rename_old_retry
|
||||
${EndIf}
|
||||
!insertmacro progressFailure "Could not move the previous Farm Control installation aside."
|
||||
Abort
|
||||
swap_rename_old_done:
|
||||
DetailPrint "Install directory renamed to Farm Control.old"
|
||||
${EndIf}
|
||||
|
||||
!insertmacro progressStatus "Activating new Farm Control installation..."
|
||||
DetailPrint "Renaming Farm Control.new to Farm Control..."
|
||||
|
||||
StrCpy $R7 0
|
||||
swap_rename_new_retry:
|
||||
Rename "$INSTDIR" "$FinalInstDir"
|
||||
${If} ${FileExists} "$FinalInstDir"
|
||||
Goto swap_rename_new_done
|
||||
${EndIf}
|
||||
IntOp $R7 $R7 + 1
|
||||
${If} $R7 < 20
|
||||
Sleep 500
|
||||
Goto swap_rename_new_retry
|
||||
${EndIf}
|
||||
; Best-effort rollback so the previous install is usable again.
|
||||
${If} ${FileExists} "$FinalInstDir.old"
|
||||
Rename "$FinalInstDir.old" "$FinalInstDir"
|
||||
${EndIf}
|
||||
!insertmacro progressFailure "Could not activate the new Farm Control installation."
|
||||
Abort
|
||||
swap_rename_new_done:
|
||||
|
||||
StrCpy $INSTDIR $FinalInstDir
|
||||
!insertmacro progressLog "installer:STATUS:Update files activated"
|
||||
|
||||
${If} ${FileExists} "$FinalInstDir.old"
|
||||
!insertmacro progressStatus "Removing previous Farm Control installation..."
|
||||
DetailPrint "Removing Farm Control.old..."
|
||||
|
||||
StrCpy $R7 0
|
||||
swap_delete_old_retry:
|
||||
RMDir /r "$FinalInstDir.old"
|
||||
${If} ${FileExists} "$FinalInstDir.old"
|
||||
IntOp $R7 $R7 + 1
|
||||
${If} $R7 < 20
|
||||
Sleep 500
|
||||
Goto swap_delete_old_retry
|
||||
${EndIf}
|
||||
; New version is already active; leftover .old is non-fatal.
|
||||
DetailPrint "Warning: could not fully remove Farm Control.old"
|
||||
!insertmacro progressLog "installer:STATUS:Warning: could not fully remove previous installation"
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
!macro uninstallPreviousFarmControl
|
||||
ClearErrors
|
||||
ReadRegStr $R0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" "UninstallString"
|
||||
StrCmp $R0 "" check_install_dir run_uninstall
|
||||
|
||||
check_install_dir:
|
||||
ReadRegStr $R0 HKCU "Software\Tom Butcher\Farm Control" "InstallDir"
|
||||
StrCmp $R0 "" check_legacy_uninstall
|
||||
StrCpy $R0 "$R0\Uninstall.exe"
|
||||
Goto run_uninstall
|
||||
|
||||
check_legacy_uninstall:
|
||||
ReadRegStr $R0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Farm Control" "UninstallString"
|
||||
StrCmp $R0 "" check_legacy_install_dir run_uninstall
|
||||
|
||||
check_legacy_install_dir:
|
||||
ReadRegStr $R0 HKLM "Software\Tom Butcher\Farm Control" "InstallDir"
|
||||
StrCmp $R0 "" check_default_dir
|
||||
StrCpy $R0 "$R0\Uninstall.exe"
|
||||
Goto run_uninstall
|
||||
|
||||
check_default_dir:
|
||||
StrCpy $R0 "$LOCALAPPDATA\Programs\Farm Control\Uninstall.exe"
|
||||
IfFileExists $R0 run_uninstall check_legacy_default_dir
|
||||
|
||||
check_legacy_default_dir:
|
||||
StrCpy $R0 "$PROGRAMFILES64\Farm Control\Uninstall.exe"
|
||||
IfFileExists $R0 run_uninstall done_uninstall
|
||||
|
||||
run_uninstall:
|
||||
IfFileExists $R0 0 done_uninstall
|
||||
!insertmacro progressPhase "Removing previous version"
|
||||
!insertmacro progressStatus "Removing previous Farm Control installation..."
|
||||
DetailPrint "Removing previous Farm Control installation..."
|
||||
!insertmacro quitFarmControl
|
||||
ExecWait '"$R0" /S' $R1
|
||||
DetailPrint "Previous installation removed (exit code: $R1)"
|
||||
!insertmacro progressLog "installer:STATUS:Previous installation removed"
|
||||
|
||||
done_uninstall:
|
||||
!macroend
|
||||
|
||||
!macro createDesktopShortcut
|
||||
SetShellVarContext current
|
||||
SetOutPath "$FinalInstDir\bin"
|
||||
CreateShortCut "$DESKTOP\Farm Control.lnk" "$FinalInstDir\bin\FarmControl.exe" "" "$FinalInstDir\bin\FarmControl.exe" 0 SW_SHOWNORMAL "" "Farm Control"
|
||||
!macroend
|
||||
|
||||
!macro createStartMenuShortcut
|
||||
SetShellVarContext current
|
||||
CreateDirectory "$SMPROGRAMS\Farm Control"
|
||||
SetOutPath "$FinalInstDir\bin"
|
||||
CreateShortCut "$SMPROGRAMS\Farm Control\Farm Control.lnk" "$FinalInstDir\bin\FarmControl.exe" "" "$FinalInstDir\bin\FarmControl.exe" 0 SW_SHOWNORMAL "" "Farm Control"
|
||||
!macroend
|
||||
|
||||
!macro removeDesktopShortcut
|
||||
SetShellVarContext current
|
||||
Delete "$DESKTOP\Farm Control.lnk"
|
||||
!macroend
|
||||
|
||||
!macro removeStartMenuShortcut
|
||||
SetShellVarContext current
|
||||
Delete "$SMPROGRAMS\Farm Control\Farm Control.lnk"
|
||||
RMDir "$SMPROGRAMS\Farm Control"
|
||||
!macroend
|
||||
|
||||
!macro customInstall
|
||||
!insertmacro progressConfigure
|
||||
!insertmacro progressPhase "Configuring Farm Control"
|
||||
!insertmacro progressStatus "Registering farmcontrol URI handler..."
|
||||
DetailPrint "Register farmcontrol URI Handler"
|
||||
DeleteRegKey HKCU "Software\Classes\farmcontrol"
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol" "" "URL:farmcontrol"
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol" "URL Protocol" ""
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol\DefaultIcon" "" "$FinalInstDir\bin\FarmControl.exe"
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol\shell" "" ""
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol\shell\Open" "" ""
|
||||
WriteRegStr HKCU "Software\Classes\farmcontrol\shell\Open\command" "" '"$FinalInstDir\bin\bun.exe" "$FinalInstDir\bin\deeplink.js" "%1"'
|
||||
|
||||
!insertmacro progressShortcuts
|
||||
!insertmacro progressStatus "Creating shortcuts..."
|
||||
DetailPrint "Creating shortcuts"
|
||||
!insertmacro createDesktopShortcut
|
||||
!insertmacro createStartMenuShortcut
|
||||
!macroend
|
||||
|
||||
!macro customUnInstall
|
||||
!insertmacro removeDesktopShortcut
|
||||
!insertmacro removeStartMenuShortcut
|
||||
DeleteRegKey HKCU "Software\Classes\farmcontrol"
|
||||
!macroend
|
||||
|
||||
; Wait for the running app to exit, swap staged update into place, then relaunch.
|
||||
; Only used when /RESTARTFC is passed.
|
||||
Function restartFarmControlAfterUpdate
|
||||
${If} $RestartAfterInstall != "1"
|
||||
Return
|
||||
${EndIf}
|
||||
|
||||
; All files are copied and we are about to rename the install directory.
|
||||
; Emit the success line (matched by isWindowsInstallSuccessful in
|
||||
; winappupdate.js) so the app knows to quit and restart; this installer
|
||||
; stays alive to swap the folders and relaunch Farm Control.
|
||||
!insertmacro progressSuccess
|
||||
|
||||
!insertmacro progressStatus "Waiting for Farm Control to close..."
|
||||
|
||||
${If} $UpdateParentPid > 0
|
||||
; Wait for the exact updater process rather than an executable name. CEF
|
||||
; builds can keep bun/renderer processes alive after the launcher exits.
|
||||
System::Call 'kernel32::OpenProcess(i 0x00100000, i 0, i $UpdateParentPid) p .r0'
|
||||
${If} $0 != 0
|
||||
; Allow two seconds for a graceful exit, then terminate the process.
|
||||
System::Call 'kernel32::WaitForSingleObject(p r0, i 2000) i .r1'
|
||||
${If} $1 == 258
|
||||
!insertmacro progressStatus "Stopping Farm Control..."
|
||||
DetailPrint "Farm Control process $UpdateParentPid did not exit; terminating it..."
|
||||
; Never use taskkill /T here: this installer is a direct child of the
|
||||
; updater process, so a tree kill would terminate the installer itself
|
||||
; before the folder swap (CEF builds hung at "Stopping Farm Control...").
|
||||
ExecWait 'taskkill /F /PID $UpdateParentPid' $R0
|
||||
|
||||
; Verify that taskkill actually terminated the process before swapping.
|
||||
System::Call 'kernel32::WaitForSingleObject(p r0, i 10000) i .r1'
|
||||
${EndIf}
|
||||
|
||||
System::Call 'kernel32::CloseHandle(p r0)'
|
||||
${If} $1 != 0
|
||||
!insertmacro progressFailure "Could not stop the running Farm Control process."
|
||||
Abort
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
${Else}
|
||||
; Compatibility fallback for manually launched older installers.
|
||||
Sleep 2000
|
||||
!insertmacro quitFarmControl
|
||||
|
||||
; Confirm both known launcher names have stopped before continuing.
|
||||
StrCpy $R7 0
|
||||
restart_verify_loop:
|
||||
ExecWait 'cmd.exe /c tasklist /FI "IMAGENAME eq FarmControl.exe" 2>nul | find /I "FarmControl.exe"' $R0
|
||||
${If} $R0 != 0
|
||||
ExecWait 'cmd.exe /c tasklist /FI "IMAGENAME eq launcher.exe" 2>nul | find /I "launcher.exe"' $R0
|
||||
${EndIf}
|
||||
${If} $R0 != 0
|
||||
Goto restart_wait_done
|
||||
${EndIf}
|
||||
|
||||
IntOp $R7 $R7 + 1
|
||||
${If} $R7 < 20
|
||||
Sleep 500
|
||||
Goto restart_verify_loop
|
||||
${EndIf}
|
||||
|
||||
!insertmacro progressFailure "Could not stop the running Farm Control process."
|
||||
Abort
|
||||
${EndIf}
|
||||
|
||||
restart_wait_done:
|
||||
; CEF helper processes normally exit on their own once the main process is
|
||||
; gone, but sweep up any stragglers still running from the install
|
||||
; directory so the rename cannot be blocked. Matching on executable path
|
||||
; (not a tree kill) guarantees this installer, which runs from the Updates
|
||||
; folder, is never terminated.
|
||||
ExecWait `powershell.exe -NoLogo -NoProfile -NonInteractive -ExecutionPolicy Bypass -Command "Get-CimInstance Win32_Process | Where-Object { $$_.ExecutablePath -like '$FinalInstDir\*' } | ForEach-Object { Stop-Process -Id $$_.ProcessId -Force -ErrorAction SilentlyContinue }"` $R0
|
||||
|
||||
; Give CEF descendants a moment to release DLLs before renaming the tree.
|
||||
Sleep 3000
|
||||
|
||||
${If} $IsInAppUpdate == "1"
|
||||
!insertmacro swapUpdateStaging
|
||||
${EndIf}
|
||||
|
||||
!insertmacro progressStatus "Starting Farm Control..."
|
||||
SetOutPath "$FinalInstDir\bin"
|
||||
Exec "$FinalInstDir\bin\FarmControl.exe"
|
||||
FunctionEnd
|
||||
@ -1,94 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
|
||||
<!--
|
||||
MSI wrapper around the compiled NSIS setup.exe.
|
||||
Runs the bundled installer with the same silent in-app update flags used by
|
||||
src/desktop/winappupdate.js: /S /UPDATE /RESTARTFC /LOG=...
|
||||
|
||||
ALLUSERS=2 + MSIINSTALLPERUSER=1 defaults to per-user (matching NSIS) and is
|
||||
not blocked by DisableMsi=1 / error 1625 the way a pure InstallScope=perUser
|
||||
package is.
|
||||
-->
|
||||
<Product
|
||||
Id="*"
|
||||
Name="Farm Control"
|
||||
Language="1033"
|
||||
Version="__VERSION__"
|
||||
Manufacturer="Tom Butcher"
|
||||
UpgradeCode="__UPGRADE_CODE__">
|
||||
<Package
|
||||
InstallerVersion="500"
|
||||
Compressed="yes"
|
||||
InstallPrivileges="limited"
|
||||
Platform="x64" />
|
||||
|
||||
<Condition Message="Windows 7 and above is required"><![CDATA[Installed OR VersionNT >= 601]]></Condition>
|
||||
|
||||
<MajorUpgrade
|
||||
AllowSameVersionUpgrades="yes"
|
||||
DowngradeErrorMessage="A newer version of [ProductName] is already installed." />
|
||||
<MediaTemplate EmbedCab="yes" CompressionLevel="high" />
|
||||
|
||||
<Icon Id="InstallerIcon" SourceFile="__INSTALLER_ICON__" />
|
||||
<Property Id="ARPPRODUCTICON" Value="InstallerIcon" />
|
||||
|
||||
<Property Id="DISABLEADVTSHORTCUTS" Value="1" />
|
||||
<Property Id="ALLUSERS" Secure="yes" Value="2" />
|
||||
<Property Id="MSIINSTALLPERUSER" Secure="yes" Value="1" />
|
||||
<Property Id="REBOOT" Value="ReallySuppress" />
|
||||
|
||||
<Binary Id="WrappedExe" SourceFile="__SETUP_EXE__" />
|
||||
|
||||
<!-- ExeCommand is a Formatted field, so [FarmControlUpdatesDir] resolves to the
|
||||
real per-user path here. An intermediate Property would not resolve it
|
||||
(property values are not recursively formatted). -->
|
||||
<CustomAction
|
||||
Id="RunInstaller"
|
||||
BinaryKey="WrappedExe"
|
||||
ExeCommand="/S /UPDATE /RESTARTFC /LOG="[FarmControlUpdatesDir]install.log""
|
||||
Execute="immediate"
|
||||
Impersonate="yes"
|
||||
Return="check" />
|
||||
|
||||
<Directory Id="TARGETDIR" Name="SourceDir">
|
||||
<Directory Id="LocalAppDataFolder">
|
||||
<Directory Id="FarmControlAppDataDir" Name="FarmControl">
|
||||
<Directory Id="FarmControlUpdatesDir" Name="Updates">
|
||||
<Component Id="UpdatesFolderComponent" Guid="A1B2C3D4-E5F6-7890-ABCD-EF1234567890">
|
||||
<CreateFolder />
|
||||
<!-- ICE64: per-user directories must be scheduled for removal on uninstall. -->
|
||||
<RemoveFile Id="RemoveUpdatesFiles" Directory="FarmControlUpdatesDir" Name="*" On="uninstall" />
|
||||
<RemoveFolder Id="RemoveFarmControlUpdatesDir" Directory="FarmControlUpdatesDir" On="uninstall" />
|
||||
<RemoveFolder Id="RemoveFarmControlAppDataDir" Directory="FarmControlAppDataDir" On="uninstall" />
|
||||
<RegistryValue
|
||||
Root="HKCU"
|
||||
Key="Software\Tom Butcher\Farm Control"
|
||||
Name="UpdatesDir"
|
||||
Type="string"
|
||||
Value="[FarmControlUpdatesDir]"
|
||||
KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
</Directory>
|
||||
</Directory>
|
||||
<Component Id="PerUserMarker" Guid="8A3F2E1D-9C4B-4A7E-B6D5-1F0E3C2B4A59">
|
||||
<RegistryValue
|
||||
Root="HKCU"
|
||||
Key="Software\Tom Butcher\Farm Control"
|
||||
Name="MsiWrapper"
|
||||
Type="integer"
|
||||
Value="1"
|
||||
KeyPath="yes" />
|
||||
</Component>
|
||||
</Directory>
|
||||
|
||||
<Feature Id="MainFeature" Title="Farm Control" Level="1">
|
||||
<ComponentRef Id="UpdatesFolderComponent" />
|
||||
<ComponentRef Id="PerUserMarker" />
|
||||
</Feature>
|
||||
|
||||
<InstallExecuteSequence>
|
||||
<Custom Action="RunInstaller" After="InstallFiles">NOT Installed</Custom>
|
||||
</InstallExecuteSequence>
|
||||
</Product>
|
||||
</Wix>
|
||||
1564
pnpm-lock.yaml
generated
@ -6,11 +6,3 @@ allowBuilds:
|
||||
core-js: true
|
||||
electron-winstaller: true
|
||||
'@tsparticles/engine': true
|
||||
|
||||
overrides:
|
||||
baseline-browser-mapping: 2.11.4
|
||||
'@codemirror/state': 6.7.1
|
||||
'@codemirror/view': 6.39.12
|
||||
'@codemirror/language': 6.12.1
|
||||
'@codemirror/commands': 6.10.4
|
||||
'@codemirror/autocomplete': 6.20.0
|
||||
@ -1,260 +1,263 @@
|
||||
import { createWriteStream, promises as fs } from "node:fs";
|
||||
import http from "node:http";
|
||||
import https from "node:https";
|
||||
import os from "node:os";
|
||||
import path from "node:path";
|
||||
import process from "node:process";
|
||||
import { Utils } from "electrobun/bun";
|
||||
import { launchMacInstaller } from "./macappupdate.js";
|
||||
import { launchWindowsInstaller } from "./winappupdate.js";
|
||||
import { scheduleAppRestart } from "./updater-runner.js";
|
||||
import { ipcMain } from 'electron'
|
||||
import { createWriteStream, promises as fs } from 'fs'
|
||||
import http from 'http'
|
||||
import https from 'https'
|
||||
import os from 'os'
|
||||
import path from 'path'
|
||||
import process from 'process'
|
||||
import { launchMacInstaller } from './macappupdate.js'
|
||||
import { launchWindowsInstaller } from './winappupdate.js'
|
||||
|
||||
const UPDATE_PROGRESS_CHANNEL = 'app-update-progress'
|
||||
const SUPPORTED_TARGETS = {
|
||||
darwin: {
|
||||
extension: ".pkg",
|
||||
osMatchers: ["darwin", "mac", "macos", "osx"],
|
||||
extension: '.pkg',
|
||||
osMatchers: ['darwin', 'mac', 'macos', 'osx']
|
||||
},
|
||||
win32: {
|
||||
extension: ".msi",
|
||||
osMatchers: ["win32", "win", "windows"],
|
||||
},
|
||||
};
|
||||
extension: '.msi',
|
||||
osMatchers: ['win32', 'win', 'windows']
|
||||
}
|
||||
}
|
||||
|
||||
let runningUpdate = null;
|
||||
let runningUpdate = null
|
||||
|
||||
const getArtifactName = (artifact) =>
|
||||
String(artifact?.fileName || artifact?.relativePath || artifact?.url || "");
|
||||
String(artifact?.fileName || artifact?.relativePath || artifact?.url || '')
|
||||
|
||||
const normalizeArch = (arch) => {
|
||||
if (arch === "x64" || arch === "amd64") return "x64";
|
||||
if (arch === "arm64" || arch === "aarch64") return "arm64";
|
||||
return arch;
|
||||
};
|
||||
if (arch === 'x64' || arch === 'amd64') return 'x64'
|
||||
if (arch === 'arm64' || arch === 'aarch64') return 'arm64'
|
||||
return arch
|
||||
}
|
||||
|
||||
const artifactMatchesPlatform = (artifact, target, platform, arch) => {
|
||||
const name = getArtifactName(artifact).toLowerCase();
|
||||
const normalizedArch = normalizeArch(arch);
|
||||
const artifactArch = normalizeArch(String(artifact?.arch || "").toLowerCase());
|
||||
const name = getArtifactName(artifact).toLowerCase()
|
||||
const normalizedArch = normalizeArch(arch)
|
||||
const artifactArch = normalizeArch(String(artifact?.arch || '').toLowerCase())
|
||||
const artifactPlatform = String(
|
||||
artifact?.platform || artifact?.os || artifact?.target || "",
|
||||
).toLowerCase();
|
||||
artifact?.platform || artifact?.os || artifact?.target || ''
|
||||
).toLowerCase()
|
||||
|
||||
if (!name.endsWith(target.extension)) return false;
|
||||
if (!artifact?.url) return false;
|
||||
if (!name.endsWith(target.extension)) return false
|
||||
if (!artifact?.url) return false
|
||||
|
||||
const matchesArch =
|
||||
artifactArch === normalizedArch ||
|
||||
name.includes(`-${normalizedArch}`) ||
|
||||
name.includes(`_${normalizedArch}`) ||
|
||||
name.includes(`.${normalizedArch}.`) ||
|
||||
name.includes(normalizedArch);
|
||||
name.includes(normalizedArch)
|
||||
|
||||
const matchesOs =
|
||||
!artifactPlatform ||
|
||||
target.osMatchers.includes(artifactPlatform) ||
|
||||
target.osMatchers.some((matcher) => name.includes(matcher)) ||
|
||||
(platform === "darwin" && name.includes("mac")) ||
|
||||
(platform === "win32" && name.includes("win"));
|
||||
(platform === 'darwin' && name.includes('mac')) ||
|
||||
(platform === 'win32' && name.includes('win'))
|
||||
|
||||
return matchesArch && matchesOs;
|
||||
};
|
||||
return matchesArch && matchesOs
|
||||
}
|
||||
|
||||
const selectUpdateArtifact = (
|
||||
update,
|
||||
platform = process.platform,
|
||||
arch = process.arch,
|
||||
arch = process.arch
|
||||
) => {
|
||||
const target = SUPPORTED_TARGETS[platform];
|
||||
const target = SUPPORTED_TARGETS[platform]
|
||||
if (!target) {
|
||||
throw new Error(`App updates are not supported on ${platform}.`);
|
||||
throw new Error(`App updates are not supported on ${platform}.`)
|
||||
}
|
||||
|
||||
const artifacts = Array.isArray(update?.artifacts) ? update.artifacts : [];
|
||||
const artifacts = Array.isArray(update?.artifacts) ? update.artifacts : []
|
||||
const matchingArtifact = artifacts.find((artifact) =>
|
||||
artifactMatchesPlatform(artifact, target, platform, arch),
|
||||
);
|
||||
artifactMatchesPlatform(artifact, target, platform, arch)
|
||||
)
|
||||
const fallbackArtifact = artifacts.find((artifact) => {
|
||||
const name = getArtifactName(artifact).toLowerCase();
|
||||
return artifact?.url && name.endsWith(target.extension);
|
||||
});
|
||||
const name = getArtifactName(artifact).toLowerCase()
|
||||
return artifact?.url && name.endsWith(target.extension)
|
||||
})
|
||||
|
||||
if (!matchingArtifact && !fallbackArtifact) {
|
||||
throw new Error(
|
||||
`No ${target.extension} update artifact found for ${platform}/${arch}.`,
|
||||
);
|
||||
`No ${target.extension} update artifact found for ${platform}/${arch}.`
|
||||
)
|
||||
}
|
||||
|
||||
return matchingArtifact || fallbackArtifact;
|
||||
};
|
||||
return matchingArtifact || fallbackArtifact
|
||||
}
|
||||
|
||||
const getInstallErrorMessage = (error, output = "") => {
|
||||
const combined = `${output}\n${error?.message || ""}`.trim();
|
||||
const sendProgress = (webContents, payload) => {
|
||||
if (!webContents || webContents.isDestroyed()) return
|
||||
webContents.send(UPDATE_PROGRESS_CHANNEL, {
|
||||
timestamp: new Date().toISOString(),
|
||||
...payload
|
||||
})
|
||||
}
|
||||
|
||||
const getInstallErrorMessage = (error, output = '') => {
|
||||
const combined = `${output}\n${error?.message || ''}`.trim()
|
||||
|
||||
if (
|
||||
/cancel/i.test(combined) ||
|
||||
/did not grant permission/i.test(combined) ||
|
||||
/user canceled/i.test(combined)
|
||||
) {
|
||||
return "Update installation was cancelled.";
|
||||
return 'Update installation was cancelled.'
|
||||
}
|
||||
|
||||
if (/incorrect/i.test(combined)) {
|
||||
return "The administrator password was incorrect.";
|
||||
return 'The administrator password was incorrect.'
|
||||
}
|
||||
|
||||
if (
|
||||
/1625/.test(combined) ||
|
||||
/forbidden by system policy/i.test(combined) ||
|
||||
/Non-assigned apps are disabled/i.test(combined)
|
||||
) {
|
||||
return "Update installation was blocked by Windows Installer policy.";
|
||||
return combined || 'Failed to install update.'
|
||||
}
|
||||
|
||||
return combined || "Failed to install update.";
|
||||
};
|
||||
const installerHelpers = { sendProgress, getInstallErrorMessage }
|
||||
|
||||
const getDownloadUrl = (url, redirectCount = 0) =>
|
||||
new Promise((resolve, reject) => {
|
||||
if (redirectCount > 5) {
|
||||
reject(new Error("Too many redirects while downloading update."));
|
||||
return;
|
||||
reject(new Error('Too many redirects while downloading update.'))
|
||||
return
|
||||
}
|
||||
|
||||
const parsedUrl = new URL(url);
|
||||
const client = parsedUrl.protocol === "https:" ? https : http;
|
||||
const parsedUrl = new URL(url)
|
||||
const client = parsedUrl.protocol === 'https:' ? https : http
|
||||
const request = client.get(parsedUrl, (response) => {
|
||||
const location = response.headers.location;
|
||||
const location = response.headers.location
|
||||
|
||||
if (response.statusCode >= 300 && response.statusCode < 400 && location) {
|
||||
response.resume();
|
||||
response.resume()
|
||||
resolve(
|
||||
getDownloadUrl(
|
||||
new URL(location, parsedUrl).toString(),
|
||||
redirectCount + 1,
|
||||
),
|
||||
);
|
||||
return;
|
||||
redirectCount + 1
|
||||
)
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
resolve({ response, url: parsedUrl.toString() });
|
||||
});
|
||||
resolve({ response, url: parsedUrl.toString() })
|
||||
})
|
||||
|
||||
request.on("error", reject);
|
||||
});
|
||||
request.on('error', reject)
|
||||
})
|
||||
|
||||
const downloadArtifact = async (artifact, destinationPath, sendProgress) => {
|
||||
const { response } = await getDownloadUrl(artifact.url);
|
||||
const downloadArtifact = async (artifact, destinationPath, webContents) => {
|
||||
const { response } = await getDownloadUrl(artifact.url)
|
||||
|
||||
if (response.statusCode < 200 || response.statusCode >= 300) {
|
||||
response.resume();
|
||||
throw new Error(`Update download failed with HTTP ${response.statusCode}.`);
|
||||
response.resume()
|
||||
throw new Error(`Update download failed with HTTP ${response.statusCode}.`)
|
||||
}
|
||||
|
||||
const totalBytes =
|
||||
Number.parseInt(response.headers["content-length"], 10) || 0;
|
||||
let downloadedBytes = 0;
|
||||
Number.parseInt(response.headers['content-length'], 10) || 0
|
||||
let downloadedBytes = 0
|
||||
|
||||
await new Promise((resolve, reject) => {
|
||||
const output = createWriteStream(destinationPath);
|
||||
const output = createWriteStream(destinationPath)
|
||||
|
||||
response.on("data", (chunk) => {
|
||||
downloadedBytes += chunk.length;
|
||||
response.on('data', (chunk) => {
|
||||
downloadedBytes += chunk.length
|
||||
const percent = totalBytes
|
||||
? Math.round((downloadedBytes / totalBytes) * 100)
|
||||
: null;
|
||||
: null
|
||||
|
||||
sendProgress({
|
||||
phase: "downloading",
|
||||
sendProgress(webContents, {
|
||||
phase: 'downloading',
|
||||
percent,
|
||||
downloadedBytes,
|
||||
totalBytes,
|
||||
message: totalBytes
|
||||
? `Downloading update (${percent}%)`
|
||||
: "Downloading update",
|
||||
});
|
||||
});
|
||||
: 'Downloading update'
|
||||
})
|
||||
})
|
||||
|
||||
response.on("error", reject);
|
||||
output.on("error", reject);
|
||||
output.on("finish", resolve);
|
||||
response.pipe(output);
|
||||
});
|
||||
};
|
||||
|
||||
const launchInstallerAndRestart = async (
|
||||
mainWindow,
|
||||
installerPath,
|
||||
sendProgress,
|
||||
) => {
|
||||
const installerHelpers = { sendProgress, getInstallErrorMessage };
|
||||
|
||||
if (process.platform === "darwin") {
|
||||
await launchMacInstaller(
|
||||
mainWindow,
|
||||
installerPath,
|
||||
sendProgress,
|
||||
installerHelpers,
|
||||
);
|
||||
} else if (process.platform === "win32") {
|
||||
await launchWindowsInstaller(
|
||||
mainWindow,
|
||||
installerPath,
|
||||
sendProgress,
|
||||
installerHelpers,
|
||||
);
|
||||
} else {
|
||||
throw new Error(`App updates are not supported on ${process.platform}.`);
|
||||
response.on('error', reject)
|
||||
output.on('error', reject)
|
||||
output.on('finish', resolve)
|
||||
response.pipe(output)
|
||||
})
|
||||
}
|
||||
|
||||
scheduleAppRestart();
|
||||
Utils.quit();
|
||||
};
|
||||
const restartApp = (app) => {
|
||||
console.log('[app-update] restarting app')
|
||||
app.relaunch()
|
||||
app.exit(0)
|
||||
}
|
||||
|
||||
const runAppUpdate = async (mainWindow, update, sendProgress) => {
|
||||
const artifact = selectUpdateArtifact(update);
|
||||
const launchInstallerAndQuit = async (app, installerPath, webContents) => {
|
||||
if (process.platform === 'darwin') {
|
||||
await launchMacInstaller(app, installerPath, webContents, installerHelpers)
|
||||
restartApp(app)
|
||||
return
|
||||
}
|
||||
|
||||
if (process.platform === 'win32') {
|
||||
await launchWindowsInstaller(
|
||||
app,
|
||||
installerPath,
|
||||
webContents,
|
||||
installerHelpers
|
||||
)
|
||||
restartApp(app)
|
||||
return
|
||||
}
|
||||
|
||||
throw new Error(`App updates are not supported on ${process.platform}.`)
|
||||
}
|
||||
|
||||
const runAppUpdate = async (app, update, webContents) => {
|
||||
const artifact = selectUpdateArtifact(update)
|
||||
const tempDirectory = await fs.mkdtemp(
|
||||
path.join(os.tmpdir(), "farmcontrol-update-"),
|
||||
);
|
||||
const artifactName = path.basename(getArtifactName(artifact));
|
||||
const installerPath = path.join(tempDirectory, artifactName);
|
||||
path.join(os.tmpdir(), 'farmcontrol-update-')
|
||||
)
|
||||
const artifactName = path.basename(getArtifactName(artifact))
|
||||
const installerPath = path.join(tempDirectory, artifactName)
|
||||
|
||||
sendProgress({
|
||||
phase: "preparing",
|
||||
sendProgress(webContents, {
|
||||
phase: 'preparing',
|
||||
percent: 0,
|
||||
artifact,
|
||||
message: "Preparing update download",
|
||||
});
|
||||
message: 'Preparing update download'
|
||||
})
|
||||
|
||||
await downloadArtifact(artifact, installerPath, sendProgress);
|
||||
await downloadArtifact(artifact, installerPath, webContents)
|
||||
|
||||
sendProgress({
|
||||
phase: "downloaded",
|
||||
sendProgress(webContents, {
|
||||
phase: 'downloaded',
|
||||
percent: 100,
|
||||
downloadedBytes: null,
|
||||
totalBytes: null,
|
||||
artifact,
|
||||
message: "Update downloaded",
|
||||
});
|
||||
message: 'Update downloaded'
|
||||
})
|
||||
|
||||
await launchInstallerAndRestart(mainWindow, installerPath, sendProgress);
|
||||
};
|
||||
await launchInstallerAndQuit(app, installerPath, webContents)
|
||||
}
|
||||
|
||||
export function startAppUpdate(mainWindow, update, sendProgress) {
|
||||
if (runningUpdate) return runningUpdate;
|
||||
export function setupAppUpdateIPC(app) {
|
||||
ipcMain.handle('app-update-start', async (event, update) => {
|
||||
if (runningUpdate) return runningUpdate
|
||||
|
||||
runningUpdate = runAppUpdate(mainWindow, update, sendProgress)
|
||||
const webContents = event.sender
|
||||
runningUpdate = runAppUpdate(app, update, webContents)
|
||||
.then(() => ({ ok: true }))
|
||||
.catch((error) => {
|
||||
sendProgress({
|
||||
phase: "error",
|
||||
sendProgress(webContents, {
|
||||
phase: 'error',
|
||||
percent: null,
|
||||
message: error?.message || "Failed to update app.",
|
||||
});
|
||||
throw error;
|
||||
message: error?.message || 'Failed to update app.'
|
||||
})
|
||||
throw error
|
||||
})
|
||||
.finally(() => {
|
||||
runningUpdate = null;
|
||||
});
|
||||
runningUpdate = null
|
||||
})
|
||||
|
||||
return runningUpdate;
|
||||
return runningUpdate
|
||||
})
|
||||
}
|
||||
|
||||
@ -1 +0,0 @@
|
||||
|
||||
@ -1,9 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.889695,0,0,0.889695,3,2.383378)">
|
||||
<path d="M0,33.052C0,45.309 6.996,56.09 16.234,61.178C20.659,63.638 24.162,57.594 19.732,55.013C12.395,50.857 7.182,42.577 7.182,33.052C7.182,18.948 18.465,7.622 32.569,7.622C46.673,7.622 58.03,18.948 58.03,33.052C58.03,35.325 59.805,36.728 61.717,36.728C63.565,36.728 65.191,35.303 65.191,33.052C65.191,15.177 50.444,0.462 32.569,0.462C14.726,0.462 0,15.177 0,33.052Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M13.589,33.042C13.589,39.892 17.302,45.715 21.556,48.454C25.359,50.937 28.902,45.774 25.59,43.286C22.321,41.043 20.176,37.305 20.176,33.042C20.176,26.121 25.701,20.596 32.579,20.596C39.458,20.596 44.753,26.1 45.025,32.804C45.127,34.798 46.618,36.042 48.354,36.042C50.099,36.042 51.612,34.718 51.612,32.764C51.612,22.599 43.022,14.009 32.579,14.009C22.178,14.009 13.589,22.599 13.589,33.042Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M47.066,65.874C48.64,65.243 49.395,63.472 48.712,61.887L44.195,51.408L50.357,51.285C51.793,51.304 52.485,49.84 51.462,48.796L34.618,31.611C33.647,30.639 32.221,31.207 32.19,32.582L31.859,56.934C31.817,58.42 33.513,58.935 34.483,57.946L38.738,53.572L43.036,64.259C43.647,65.781 45.481,66.537 47.066,65.874Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB |
@ -1,8 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.913777,0,0,0.913777,-11.957695,-8.458487)">
|
||||
<path d="M56.866,48.187C56.775,48.817 56.734,49.463 56.734,50.118C56.734,52.243 57.143,54.279 57.906,56.141C54.515,53.972 49.815,52.352 44,52.352C31.125,52.352 23.734,60.274 23.734,64.477C23.734,64.93 23.953,65.165 24.547,65.165L63.031,65.165L63.031,71.774L24.766,71.774C19.047,71.774 16.219,69.852 16.219,65.774C16.219,56.587 27.547,45.727 44,45.727C48.778,45.727 53.123,46.643 56.866,48.187ZM57.984,27.368C57.984,35.743 51.766,42.477 44,42.477C36.25,42.477 30.031,35.758 30.031,27.399C30.031,19.227 36.328,12.54 44,12.54C51.719,12.54 57.984,19.165 57.984,27.368ZM36.812,27.384C36.812,32.352 40.109,35.868 44,35.868C47.938,35.868 51.203,32.321 51.203,27.368C51.203,22.587 47.922,19.149 44,19.149C40.125,19.149 36.812,22.634 36.812,27.384Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M72.469,39.508C66.531,39.508 61.812,44.29 61.812,50.118C61.812,54.462 64.266,58.212 68.109,59.899L68.109,74.743C68.109,75.29 68.359,75.821 68.766,76.243L71.609,78.915C72.141,79.399 72.969,79.462 73.562,78.868L78.5,73.946C79.125,73.305 79.062,72.383 78.484,71.774L76.031,69.258L79.641,65.649C80.234,65.055 80.25,64.118 79.609,63.43L76.234,60.087C80.641,57.962 83.125,54.399 83.125,50.118C83.125,44.29 78.375,39.508 72.469,39.508ZM72.453,43.696C74.094,43.696 75.422,45.055 75.422,46.696C75.422,48.321 74.094,49.696 72.453,49.696C70.844,49.696 69.469,48.321 69.469,46.696C69.469,45.055 70.797,43.696 72.453,43.696Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.9 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.977687,0,0,0.977687,8.25722,3)">
|
||||
<rect x="0" y="0" width="48.569" height="59.324" style="fill-opacity:0;"/>
|
||||
<g transform="matrix(1,0,0,1,0.09375,0)">
|
||||
<path d="M24.188,0C22.175,0 20.777,1.401 20.777,3.453L20.777,42.275L21.151,52.459L23.205,51.435L12.777,39.806L5.691,32.806C5.099,32.188 4.236,31.82 3.267,31.82C1.384,31.82 0,33.227 0,35.129C0,36.042 0.354,36.862 1.066,37.599L21.644,58.234C22.323,58.944 23.244,59.324 24.188,59.324C25.133,59.324 26.048,58.944 26.732,58.234L47.336,37.599C48.053,36.862 48.382,36.042 48.382,35.129C48.382,33.227 46.998,31.82 45.115,31.82C44.146,31.82 43.303,32.188 42.691,32.806L35.594,39.806L25.146,51.435L27.219,52.459L27.594,42.275L27.594,3.453C27.594,1.401 26.201,0 24.188,0Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.982323,0,0,0.982323,3,8.23672)">
|
||||
<path d="M0,24.194C0,25.138 0.411,26.054 1.121,26.738L21.73,47.31C22.468,48.028 23.287,48.382 24.166,48.382C26.103,48.382 27.535,46.998 27.535,45.115C27.535,44.146 27.141,43.278 26.523,42.691L19.523,35.605L7.879,24.971L6.767,26.969L17.578,27.605L55.596,27.605C57.649,27.605 59.044,26.207 59.044,24.194C59.044,22.181 57.649,20.783 55.596,20.783L17.578,20.783L6.767,21.419L7.879,23.448L19.523,12.783L26.523,5.691C27.141,5.073 27.535,4.236 27.535,3.267C27.535,1.384 26.103,0 24.166,0C23.287,0 22.468,0.329 21.679,1.123L1.121,21.65C0.411,22.334 0,23.249 0,24.194Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(-0.982323,0,0,0.982323,61,8.23672)">
|
||||
<path d="M0,24.194C0,25.138 0.411,26.054 1.121,26.738L21.73,47.31C22.468,48.028 23.287,48.382 24.166,48.382C26.103,48.382 27.535,46.998 27.535,45.115C27.535,44.146 27.141,43.278 26.523,42.691L19.523,35.605L7.879,24.971L6.767,26.969L17.578,27.605L55.596,27.605C57.649,27.605 59.044,26.207 59.044,24.194C59.044,22.181 57.649,20.783 55.596,20.783L17.578,20.783L6.767,21.419L7.879,23.448L19.523,12.783L26.523,5.691C27.141,5.073 27.535,4.236 27.535,3.267C27.535,1.384 26.103,0 24.166,0C23.287,0 22.468,0.329 21.679,1.123L1.121,21.65C0.411,22.334 0,23.249 0,24.194Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,10 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.977687,0,0,0.977687,8.25722,3)">
|
||||
<rect x="0" y="0" width="48.569" height="59.324" style="fill-opacity:0;"/>
|
||||
<g transform="matrix(1,0,0,-1,0.09375,59.3237)">
|
||||
<path d="M24.188,0C22.175,0 20.777,1.401 20.777,3.453L20.777,42.275L21.151,52.459L23.205,51.435L12.777,39.806L5.691,32.806C5.099,32.188 4.236,31.82 3.267,31.82C1.384,31.82 0,33.227 0,35.129C0,36.042 0.354,36.862 1.066,37.599L21.644,58.234C22.323,58.944 23.244,59.324 24.188,59.324C25.133,59.324 26.048,58.944 26.732,58.234L47.336,37.599C48.053,36.862 48.382,36.042 48.382,35.129C48.382,33.227 46.998,31.82 45.115,31.82C44.146,31.82 43.303,32.188 42.691,32.806L35.594,39.806L25.146,51.435L27.219,52.459L27.594,42.275L27.594,3.453C27.594,1.401 26.201,0 24.188,0Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,0,-0.603074)">
|
||||
<g transform="matrix(0.55961,0,0,0.55961,30.6237,24.378)">
|
||||
<path d="M27.141,65.719C27.781,65.719 28.688,65.453 29.5,65.031C47.813,55.5 54.281,50.531 54.281,39.141L54.281,16.016C54.281,11.563 52.797,9.766 48.906,8.094C45.813,6.797 34.453,2.969 31.547,2.016C30.172,1.594 28.5,1.328 27.141,1.328C25.781,1.328 24.109,1.641 22.75,2.016C19.844,2.828 8.469,6.813 5.375,8.094C1.5,9.75 0,11.563 0,16.016L0,39.141C0,50.531 6.484,55.484 24.781,65.031C25.609,65.453 26.5,65.719 27.141,65.719ZM27.141,57.547C26.781,57.547 26.438,57.422 25.578,56.891C11.563,48.25 7.469,46.297 7.469,37.953L7.469,17.063C7.469,15.891 7.719,15.391 8.625,15.031C13.031,13.266 21.594,10.438 24.828,9.203C25.891,8.859 26.516,8.719 27.141,8.719C27.766,8.719 28.375,8.875 29.453,9.203C32.688,10.438 41.219,13.375 45.672,15.031C46.547,15.375 46.813,15.891 46.813,17.063L46.813,37.953C46.813,46.438 42.281,48.828 28.703,56.891C27.859,57.406 27.5,57.547 27.141,57.547Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.952541,0,0,0.952541,0.142378,0.192271)">
|
||||
<path d="M10.65,56.399C10.65,54.429 9.1,52.819 7.081,52.819C5.148,52.819 3.561,54.45 3.561,56.399C3.561,58.34 5.148,59.949 7.081,59.949C9.057,59.949 10.65,58.34 10.65,56.399ZM31.147,53.788L17.05,53.788C15.433,53.788 14.226,54.904 14.226,56.399C14.226,57.888 15.433,59.035 17.05,59.035L35.425,59.035C33.338,57.368 31.955,55.709 31.147,53.788ZM10.65,44.582C10.65,42.617 9.1,41.032 7.081,41.032C5.148,41.032 3.561,42.633 3.561,44.582C3.561,46.523 5.148,48.107 7.081,48.107C9.057,48.107 10.65,46.523 10.65,44.582ZM30.242,41.97L17.05,41.97C15.433,41.97 14.226,43.087 14.226,44.582C14.226,46.076 15.433,47.218 17.05,47.218L30.242,47.218L30.242,41.97ZM30.242,35.341L11.704,35.341C5.368,35.341 3,32.505 3,26.425L3,12.967C3,6.882 5.368,4.051 11.704,4.051L52.296,4.051C58.632,4.051 61,6.882 61,12.967L61,26.425C61,26.988 60.98,27.522 60.938,28.03C59.436,27.47 57.18,26.685 55.137,25.987L55.137,12.807C55.137,10.413 54.318,9.337 51.948,9.337L12.052,9.337C9.682,9.337 8.863,10.413 8.863,12.807L8.863,26.585C8.863,28.98 9.682,30.055 12.052,30.055L31.321,30.055C30.566,30.894 30.242,31.995 30.242,33.666L30.242,35.341Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.7 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.946457,0,0,0.946457,3.76922,1)">
|
||||
<path d="M0,49.649C0,52.296 1.975,54.043 5.225,54.043L18.086,54.043C18.336,60.052 23.218,65.507 30.301,65.507C37.416,65.507 42.297,60.078 42.547,54.043L55.409,54.043C58.633,54.043 60.634,52.296 60.634,49.649C60.634,46.327 57.57,43.481 54.764,40.75C52.561,38.599 52.027,34.291 51.625,29.989C51.215,18.149 47.786,10.251 39.614,7.307C38.422,3.14 34.971,0 30.301,0C25.663,0 22.186,3.14 21.02,7.307C12.848,10.251 9.419,18.149 9.009,29.989C8.607,34.291 8.072,38.599 5.869,40.75C3.038,43.481 0,46.327 0,49.649ZM7.457,48.329L7.457,47.965C8.256,47.076 10.075,45.401 11.61,43.644C13.764,41.178 14.776,36.68 15.102,30.749C15.454,18.055 19.353,13.835 24.388,12.456C25.146,12.274 25.584,11.916 25.643,11.048C25.788,7.876 27.567,5.736 30.301,5.736C33.067,5.736 34.821,7.876 34.991,11.048C35.05,11.916 35.462,12.274 36.221,12.456C41.281,13.835 45.18,18.055 45.531,30.749C45.858,36.68 46.886,41.178 48.998,43.644C50.553,45.401 52.284,47.076 53.089,47.965L53.089,48.329L7.457,48.329ZM23.979,54.043L36.654,54.043C36.416,57.984 33.863,60.494 30.301,60.494C26.771,60.494 24.193,57.984 23.979,54.043Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.6 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.870499,0,0,0.870499,4.81535,1)">
|
||||
<path d="M22.063,60.247C23.479,60.247 24.38,59.348 24.349,58.015L23.4,25.77C23.359,24.458 22.438,23.58 21.075,23.58C19.679,23.58 18.788,24.479 18.819,25.802L19.747,58.045C19.788,59.379 20.718,60.247 22.063,60.247ZM31.234,60.247C32.61,60.247 33.573,59.368 33.573,58.055L33.573,25.782C33.573,24.469 32.61,23.58 31.234,23.58C29.848,23.58 28.906,24.469 28.906,25.782L28.906,58.055C28.906,59.368 29.848,60.247 31.234,60.247ZM40.416,60.247C41.749,60.247 42.67,59.379 42.711,58.045L43.639,25.802C43.67,24.479 42.779,23.58 41.383,23.58C40.02,23.58 39.099,24.458 39.058,25.792L38.13,58.015C38.099,59.348 39,60.247 40.416,60.247ZM16.67,14.45L23.05,14.45L23.05,8.11C23.05,6.617 24.092,5.67 25.728,5.67L36.687,5.67C38.324,5.67 39.365,6.617 39.365,8.11L39.365,14.45L45.745,14.45L45.745,7.838C45.745,2.869 42.608,0 37.15,0L25.265,0C19.807,0 16.67,2.869 16.67,7.838L16.67,14.45ZM3.089,18.54L59.39,18.54C61.128,18.54 62.458,17.218 62.458,15.48C62.458,13.761 61.128,12.46 59.39,12.46L3.089,12.46C1.372,12.46 0,13.761 0,15.48C0,17.239 1.372,18.54 3.089,18.54ZM16.852,71.224L45.627,71.224C50.653,71.224 53.841,68.278 54.07,63.242L56.188,17.937L49.805,17.937L47.781,62.006C47.719,63.881 46.564,65.074 44.829,65.074L17.607,65.074C15.915,65.074 14.761,63.849 14.677,62.006L12.567,17.937L6.27,17.937L8.409,63.264C8.648,68.299 11.784,71.224 16.852,71.224Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |
@ -1,11 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.865066,0,0,0.865066,3,7.501025)">
|
||||
<path d="M3.656,56.641L63.359,56.641C65.406,56.641 67.047,54.906 67.047,52.891C67.047,50.813 65.422,49.125 63.359,49.125L3.656,49.125C1.609,49.125 0,50.859 0,52.891C0,54.875 1.625,56.641 3.656,56.641Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M3.656,40.297L63.359,40.297C65.406,40.297 67.047,38.563 67.047,36.547C67.047,34.453 65.422,32.781 63.359,32.781L3.656,32.781C1.609,32.781 0,34.484 0,36.547C0,38.516 1.625,40.297 3.656,40.297Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M46.469,23.891L63.359,23.938C65.406,23.953 67.047,22.188 67.047,20.172C67.047,18.11 65.422,16.438 63.359,16.422L46.469,16.375C44.422,16.36 42.812,18.094 42.812,20.125C42.812,22.094 44.438,23.891 46.469,23.891Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M46.469,7.516L63.359,7.578C65.406,7.594 67.047,5.844 67.047,3.828C67.047,1.75 65.422,0.078 63.359,0.063L46.469,0C44.422,-0.016 42.812,1.734 42.812,3.766C42.812,5.75 44.438,7.516 46.469,7.516Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M9.047,24.594C13.453,24.594 16.984,21.5 16.984,17.063C16.984,12.828 14.078,9.906 10.219,9.906C7.75,9.906 5.719,11 4.703,13.61L5.406,14.063C5.594,9.063 9.016,5.547 14.219,5.203C15.516,5.109 16.5,4.063 16.5,2.781C16.5,1.25 15.172,0.266 13.453,0.266C6.359,0.266 0.047,6.188 0.047,14.406C0.047,20.594 3.797,24.594 9.047,24.594ZM29.297,24.594C33.672,24.594 37.219,21.5 37.219,17.063C37.219,12.828 34.312,9.906 30.453,9.906C27.984,9.906 25.953,11 24.922,13.61L25.641,14.063C25.812,9.063 29.234,5.531 34.422,5.203C35.734,5.109 36.75,4.063 36.75,2.781C36.75,1.25 35.453,0.266 33.688,0.266C26.609,0.266 20.266,6.188 20.266,14.406C20.266,20.594 24.047,24.594 29.297,24.594Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 2.2 KiB |
@ -1,7 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,12.2656,8.9375)">
|
||||
<path d="M6.125,46.125L23.078,46.125C33.078,46.125 39.469,40.859 39.469,32.844C39.469,26.656 34.562,22.031 28.062,21.766L28.062,21.516C33.484,20.797 37.344,16.781 37.344,11.578C37.344,4.391 31.75,0.016 22.484,0.016L6.125,0.016C2.344,0.016 0,2.234 0,6.109L0,40.047C0,43.922 2.344,46.125 6.125,46.125ZM12.953,37.828L12.953,26.062L18.5,26.062C23.469,26.062 26.312,28.125 26.312,31.844C26.312,35.734 23.922,37.828 18.938,37.828L12.953,37.828ZM12.953,18.844L12.953,8.391L18.219,8.391C22.25,8.391 24.672,10.297 24.672,13.531C24.672,16.828 22.047,18.844 17.672,18.844L12.953,18.844Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 64 64" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.865066,0,0,0.865066,3,10.731571)">
|
||||
<path d="M21.156,48.391L63.359,48.391C65.406,48.391 67.047,46.656 67.047,44.625C67.047,42.547 65.422,40.875 63.359,40.875L21.156,40.875C19.078,40.875 17.484,42.594 17.484,44.625C17.484,46.609 19.109,48.391 21.156,48.391Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M5.203,49.828C8.078,49.828 10.422,47.484 10.422,44.625C10.422,41.766 8.078,39.422 5.203,39.422C2.344,39.422 0,41.766 0,44.625C0,47.484 2.344,49.828 5.203,49.828Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M21.156,28.672L63.359,28.672C65.406,28.672 67.047,26.938 67.047,24.922C67.047,22.844 65.422,21.156 63.359,21.156L21.156,21.156C19.078,21.156 17.484,22.891 17.484,24.922C17.484,26.906 19.109,28.672 21.156,28.672Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M5.203,30.125C8.078,30.125 10.422,27.797 10.422,24.922C10.422,22.047 8.078,19.719 5.203,19.719C2.344,19.719 0,22.047 0,24.922C0,27.797 2.344,30.125 5.203,30.125Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M21.156,8.969L63.359,8.969C65.406,8.969 67.047,7.234 67.047,5.203C67.047,3.141 65.422,1.453 63.359,1.453L21.156,1.453C19.078,1.453 17.484,3.172 17.484,5.203C17.484,7.203 19.109,8.969 21.156,8.969Z" style="fill-rule:nonzero;"/>
|
||||
<path d="M5.203,10.422C8.078,10.422 10.422,8.078 10.422,5.203C10.422,2.344 8.078,0 5.203,0C2.344,0 0,2.344 0,5.203C0,8.078 2.344,10.422 5.203,10.422Z" style="fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1.8 KiB |