feat: Add a large collection of emoji and other frontend assets, including a sound file, and a backend package.json.

This commit is contained in:
Bryan1029384756
2026-01-06 17:58:56 -06:00
parent f531301863
commit abedd78893
3795 changed files with 10981 additions and 229 deletions

View File

@@ -0,0 +1,240 @@
{
"categories": [
{
"name": "excited",
"src": "https://media.tenor.com/nb9yRj8rHo4AAAPs/excited-ah.webm"
},
{
"name": "bye",
"src": "https://media.tenor.com/63TUZpfzGHQAAAPs/peach-and-goma.webm"
},
{
"name": "sorry",
"src": "https://media.tenor.com/MXhgLF7-FwAAAAPs/sorry.webm"
},
{
"name": "congratulations",
"src": "https://media.tenor.com/Twpbh1jgXD4AAAPs/congratulations-congrats.webm"
},
{
"name": "sleepy",
"src": "https://media.tenor.com/Clvc7JcH7z4AAAPs/sleepy-bed-time.webm"
},
{
"name": "hello",
"src": "https://media.tenor.com/Y6Qq56KBIjUAAAPs/hello-cute.webm"
},
{
"name": "hugs",
"src": "https://media.tenor.com/oZtU0xcJCdMAAAPs/i-love-you-love-you.webm"
},
{
"name": "ok",
"src": "https://media.tenor.com/UrIakXGExfUAAAPs/mr-bean.webm"
},
{
"name": "please",
"src": "https://media.tenor.com/heEyHbV8iaUAAAPs/puss-in-boots-shrek.webm"
},
{
"name": "thank you",
"src": "https://media.tenor.com/L30xqxi-6L4AAAPs/gitapro3-gitagita.webm"
},
{
"name": "miss you",
"src": "https://media.tenor.com/rzG9YBjxW-0AAAPs/peach-sad.webm"
},
{
"name": "wink",
"src": "https://media.tenor.com/KfRIf22QpTQAAAPs/wink-eye-wink.webm"
},
{
"name": "whatever",
"src": "https://media.tenor.com/5AdGWfejMcoAAAPs/whatever-you-say.webm"
},
{
"name": "hungry",
"src": "https://media.tenor.com/7tTScpb6gt0AAAPs/spearhyunho.webm"
},
{
"name": "dance",
"src": "https://media.tenor.com/HCyNMWQv868AAAPs/good-night.webm"
},
{
"name": "annoyed",
"src": "https://media.tenor.com/6DRQNAOEavcAAAPs/cat-annoyed.webm"
},
{
"name": "omg",
"src": "https://media.tenor.com/FtUKdJxBRH0AAAPs/cat-cat-memes.webm"
},
{
"name": "crazy",
"src": "https://media.tenor.com/o2yRyjihS1wAAAPs/balthazar-crazy.webm"
},
{
"name": "shrug",
"src": "https://media.tenor.com/Zc-ZTPzlEHoAAAPs/i-don%27t-know-idk.webm"
},
{
"name": "smile",
"src": "https://media.tenor.com/NrEEi7ZDo8cAAAPs/as.webm"
},
{
"name": "awkward",
"src": "https://media.tenor.com/6Ug_C4RjC4kAAAPs/%D9%84%D9%8A%D9%8A%D9%88%D9%88.webm"
},
{
"name": "ew",
"src": "https://media.tenor.com/oj4p9mRXeoIAAAPs/dol-huh.webm"
},
{
"name": "angry",
"src": "https://media.tenor.com/RZzU2_IbHDEAAAPs/cat-side-eye.webm"
},
{
"name": "surprised",
"src": "https://media.tenor.com/CNI1fSM1XSoAAAPs/shocked-surprised.webm"
},
{
"name": "why",
"src": "https://media.tenor.com/HewFmNRxtT4AAAPs/why-persian-room-cat-guardian.webm"
},
{
"name": "thumbs up",
"src": "https://media.tenor.com/LpEzkHFtdgUAAAPs/gif-emoji.webm"
},
{
"name": "wow",
"src": "https://media.tenor.com/VdsC5bF7CMAAAAPs/smu.webm"
},
{
"name": "ouch",
"src": "https://media.tenor.com/qG2Qj0vvLwMAAAPs/ouch.webm"
},
{
"name": "oops",
"src": "https://media.tenor.com/izYQUXHzhxoAAAPs/oops.webm"
},
{
"name": "youre welcome",
"src": "https://media.tenor.com/CXZLJK_6sa0AAAPs/you%27re-welcome.webm"
},
{
"name": "lazy",
"src": "https://media.tenor.com/Xt7ns1EZUEIAAAPs/panda-animated.webm"
},
{
"name": "stressed",
"src": "https://media.tenor.com/Yc-62-d3QCAAAAPs/stressed.webm"
},
{
"name": "embarrassed",
"src": "https://media.tenor.com/EIlaqgHLePUAAAPs/look-away-simpson.webm"
},
{
"name": "clapping",
"src": "https://media.tenor.com/3yPBPC_dwe8AAAPs/leonardo-dicaprio-clapping.webm"
},
{
"name": "awesome",
"src": "https://media.tenor.com/WFhElAbsdqcAAAPs/awesome-minions.webm"
},
{
"name": "jk",
"src": "https://media.tenor.com/Fy0hkZaMgakAAAPs/nah-im-just-kidding-jk.webm"
},
{
"name": "good luck",
"src": "https://media.tenor.com/VK6Wv4nxX10AAAPs/good-luck.webm"
},
{
"name": "high five",
"src": "https://media.tenor.com/HozyHCAac-kAAAPs/high-five-patrick-star.webm"
},
{
"name": "nervous",
"src": "https://media.tenor.com/tDfXlJnVctgAAAPs/sweating-nervous.webm"
},
{
"name": "duh",
"src": "https://media.tenor.com/DCScm2moJ7EAAAPs/duh-sarcastic.webm"
},
{
"name": "aww",
"src": "https://media.tenor.com/XwxrDV7VKuEAAAPs/love-languages.webm"
},
{
"name": "scared",
"src": "https://media.tenor.com/Io0g8LOf8nMAAAPs/dog-awkward.webm"
},
{
"name": "bored",
"src": "https://media.tenor.com/f4d9ExQT1voAAAPs/h2di-cat-dead.webm"
},
{
"name": "sigh",
"src": "https://media.tenor.com/ZFc20z8DItkAAAPs/facepalm-really.webm"
},
{
"name": "kiss",
"src": "https://media.tenor.com/RPq56gVYswUAAAPs/twitter-kiwi.webm"
},
{
"name": "sad",
"src": "https://media.tenor.com/lV1EF4I83MkAAAPs/bubu-dudu-twitter.webm"
},
{
"name": "good night",
"src": "https://media.tenor.com/95lulIY57IwAAAPs/sweet-dreams-sleep-good.webm"
},
{
"name": "good morning",
"src": "https://media.tenor.com/25Y5C_HeRckAAAPs/good-morning.webm"
},
{
"name": "confused",
"src": "https://media.tenor.com/ASAsHQNVvacAAAPs/midnight-the-cat-stopped-working-midnight-the-cat.webm"
},
{
"name": "chill out",
"src": "https://media.tenor.com/65BBEN4WDcUAAAPs/chillin-chilling.webm"
},
{
"name": "love",
"src": "https://media.tenor.com/1nIDXbABxgsAAAPs/gif-gifkk.webm"
},
{
"name": "happy",
"src": "https://media.tenor.com/gotOLnyvy4YAAAPs/bubu-dancing-dance.webm"
},
{
"name": "cry",
"src": "https://media.tenor.com/rokauCI9nPYAAAPs/crying-sad.webm"
},
{
"name": "yes",
"src": "https://media.tenor.com/7iq8qyXvKHsAAAPs/yes-monkey.webm"
},
{
"name": "no",
"src": "https://media.tenor.com/vLK4Mq3jiKIAAAPs/cat-no.webm"
},
{
"name": "lol",
"src": "https://media.tenor.com/JgCg0MPmMWQAAAPs/shirley-temple-lol.webm"
}
],
"gifs": [
{
"id": "13011029513751011075",
"title": "",
"url": "https://tenor.com/view/feliz-dia-de-reyes-happy-three-kings-day-epiphany-3kings-day-magos-or-el-d%C3%ADa-de-reyes-gif-19847132",
"src": "https://media.tenor.com/tJB2aElAnwMAAAPs/feliz-dia-de-reyes-happy-three-kings-day.webm",
"gif_src": "https://media.tenor.com/tJB2aElAnwMAAAAC/feliz-dia-de-reyes-happy-three-kings-day.gif",
"width": 640,
"height": 640,
"preview": "https://media.tenor.com/tJB2aElAnwMAAAAD/feliz-dia-de-reyes-happy-three-kings-day.png"
}
]
}

View File

@@ -9,14 +9,32 @@
"version": "1.0.0",
"license": "ISC",
"dependencies": {
"axios": "^1.13.2",
"cors": "^2.8.5",
"dotenv": "^17.2.3",
"express": "^5.2.1",
"livekit-server-sdk": "^2.15.0",
"multer": "^2.0.2",
"pg": "^8.16.3",
"redis": "^5.10.0",
"socket.io": "^4.8.3"
}
},
"node_modules/@bufbuild/protobuf": {
"version": "1.10.1",
"resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-1.10.1.tgz",
"integrity": "sha512-wJ8ReQbHxsAfXhrf9ixl0aYbZorRuOWpBNzm8pL8ftmSxQx/wnJD5Eg861NwJU/czy2VXFIebCeZnZrI9rktIQ==",
"license": "(Apache-2.0 AND BSD-3-Clause)"
},
"node_modules/@livekit/protocol": {
"version": "1.43.4",
"resolved": "https://registry.npmjs.org/@livekit/protocol/-/protocol-1.43.4.tgz",
"integrity": "sha512-mJDFt/p+G2OKmIGizYiACK7Jb06wd42m9Pe7Y9cAOfdYpvwCqHlw4yul5Z7iRU3VKPsYJ27WL3oeHEoiu+HuAA==",
"license": "Apache-2.0",
"dependencies": {
"@bufbuild/protobuf": "^1.10.0"
}
},
"node_modules/@redis/bloom": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.10.0.tgz",
@@ -114,6 +132,29 @@
"node": ">= 0.6"
}
},
"node_modules/append-field": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz",
"integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==",
"license": "MIT"
},
"node_modules/asynckit": {
"version": "0.4.0",
"resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
"integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
"license": "MIT"
},
"node_modules/axios": {
"version": "1.13.2",
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
"integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==",
"license": "MIT",
"dependencies": {
"follow-redirects": "^1.15.6",
"form-data": "^4.0.4",
"proxy-from-env": "^1.1.0"
}
},
"node_modules/base64id": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
@@ -147,6 +188,23 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/buffer-from": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
"integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
"license": "MIT"
},
"node_modules/busboy": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz",
"integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==",
"dependencies": {
"streamsearch": "^1.1.0"
},
"engines": {
"node": ">=10.16.0"
}
},
"node_modules/bytes": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
@@ -185,6 +243,36 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/camelcase": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-8.0.0.tgz",
"integrity": "sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==",
"license": "MIT",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/camelcase-keys": {
"version": "9.1.3",
"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-9.1.3.tgz",
"integrity": "sha512-Rircqi9ch8AnZscQcsA1C47NFdaO3wukpmIRzYcDOrmvgt78hM/sj5pZhZNec2NM12uk5vTwRHZ4anGcrC4ZTg==",
"license": "MIT",
"dependencies": {
"camelcase": "^8.0.0",
"map-obj": "5.0.0",
"quick-lru": "^6.1.1",
"type-fest": "^4.3.2"
},
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/cluster-key-slot": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz",
@@ -194,6 +282,33 @@
"node": ">=0.10.0"
}
},
"node_modules/combined-stream": {
"version": "1.0.8",
"resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
"integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
"license": "MIT",
"dependencies": {
"delayed-stream": "~1.0.0"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/concat-stream": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz",
"integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==",
"engines": [
"node >= 6.0"
],
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
"inherits": "^2.0.3",
"readable-stream": "^3.0.2",
"typedarray": "^0.0.6"
}
},
"node_modules/content-disposition": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz",
@@ -264,6 +379,15 @@
}
}
},
"node_modules/delayed-stream": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
"integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
"license": "MIT",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/depd": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
@@ -416,6 +540,21 @@
"node": ">= 0.4"
}
},
"node_modules/es-set-tostringtag": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
"integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
"license": "MIT",
"dependencies": {
"es-errors": "^1.3.0",
"get-intrinsic": "^1.2.6",
"has-tostringtag": "^1.0.2",
"hasown": "^2.0.2"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/escape-html": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
@@ -495,6 +634,63 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/follow-redirects": {
"version": "1.15.11",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz",
"integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"license": "MIT",
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/form-data": {
"version": "4.0.5",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz",
"integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==",
"license": "MIT",
"dependencies": {
"asynckit": "^0.4.0",
"combined-stream": "^1.0.8",
"es-set-tostringtag": "^2.1.0",
"hasown": "^2.0.2",
"mime-types": "^2.1.12"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/form-data/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/form-data/node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/forwarded": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
@@ -583,6 +779,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-tostringtag": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
"integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
"license": "MIT",
"dependencies": {
"has-symbols": "^1.0.3"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/hasown": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
@@ -652,6 +863,42 @@
"integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==",
"license": "MIT"
},
"node_modules/jose": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/jose/-/jose-5.10.0.tgz",
"integrity": "sha512-s+3Al/p9g32Iq+oqXxkW//7jk2Vig6FF1CFqzVXoTUXt2qz89YWbL+OwS17NFYEvxC35n0FKeGO2LGYSxeM2Gg==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/panva"
}
},
"node_modules/livekit-server-sdk": {
"version": "2.15.0",
"resolved": "https://registry.npmjs.org/livekit-server-sdk/-/livekit-server-sdk-2.15.0.tgz",
"integrity": "sha512-HmzjWnwEwwShu8yUf7VGFXdc+BuMJR5pnIY4qsdlhqI9d9wDgq+4cdTEHg0NEBaiGnc6PCOBiaTYgmIyVJ0S9w==",
"license": "Apache-2.0",
"dependencies": {
"@bufbuild/protobuf": "^1.10.1",
"@livekit/protocol": "^1.43.1",
"camelcase-keys": "^9.0.0",
"jose": "^5.1.2"
},
"engines": {
"node": ">=18"
}
},
"node_modules/map-obj": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/map-obj/-/map-obj-5.0.0.tgz",
"integrity": "sha512-2L3MIgJynYrZ3TYMriLDLWocz15okFakV6J12HXvMXDHui2x/zgChzg1u9mFFGbbGWE+GsLpQByt4POb9Or+uA==",
"license": "MIT",
"engines": {
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/math-intrinsics": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
@@ -707,12 +954,94 @@
"url": "https://opencollective.com/express"
}
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"license": "MIT",
"dependencies": {
"minimist": "^1.2.6"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/multer": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz",
"integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==",
"license": "MIT",
"dependencies": {
"append-field": "^1.0.0",
"busboy": "^1.6.0",
"concat-stream": "^2.0.0",
"mkdirp": "^0.5.6",
"object-assign": "^4.1.1",
"type-is": "^1.6.18",
"xtend": "^4.0.2"
},
"engines": {
"node": ">= 10.16.0"
}
},
"node_modules/multer/node_modules/media-typer": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
"integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/multer/node_modules/mime-db": {
"version": "1.52.0",
"resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
"integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/multer/node_modules/mime-types": {
"version": "2.1.35",
"resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
"integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/multer/node_modules/type-is": {
"version": "1.6.18",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
"integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"license": "MIT",
"dependencies": {
"media-typer": "0.3.0",
"mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
"node_modules/negotiator": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
@@ -924,6 +1253,12 @@
"node": ">= 0.10"
}
},
"node_modules/proxy-from-env": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"license": "MIT"
},
"node_modules/qs": {
"version": "6.14.1",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz",
@@ -939,6 +1274,18 @@
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/quick-lru": {
"version": "6.1.2",
"resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-6.1.2.tgz",
"integrity": "sha512-AAFUA5O1d83pIHEhJwWCq/RQcRukCkn/NSm2QsTEMle5f2hP0ChI2+3Xb051PZCkLryI/Ir1MVKviT2FIloaTQ==",
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/range-parser": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
@@ -963,6 +1310,20 @@
"node": ">= 0.10"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/redis": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/redis/-/redis-5.10.0.tgz",
@@ -995,6 +1356,26 @@
"node": ">= 18"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
@@ -1226,6 +1607,23 @@
"node": ">= 0.8"
}
},
"node_modules/streamsearch": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz",
"integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==",
"engines": {
"node": ">=10.0.0"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/toidentifier": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
@@ -1235,6 +1633,18 @@
"node": ">=0.6"
}
},
"node_modules/type-fest": {
"version": "4.41.0",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz",
"integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==",
"license": "(MIT OR CC0-1.0)",
"engines": {
"node": ">=16"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/type-is": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz",
@@ -1249,6 +1659,12 @@
"node": ">= 0.6"
}
},
"node_modules/typedarray": {
"version": "0.0.6",
"resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
"integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
"license": "MIT"
},
"node_modules/undici-types": {
"version": "7.16.0",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
@@ -1264,6 +1680,12 @@
"node": ">= 0.8"
}
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/vary": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",

View File

@@ -10,9 +10,12 @@
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^1.13.2",
"cors": "^2.8.5",
"dotenv": "^17.2.3",
"express": "^5.2.1",
"livekit-server-sdk": "^2.15.0",
"multer": "^2.0.2",
"pg": "^8.16.3",
"redis": "^5.10.0",
"socket.io": "^4.8.3"

View File

@@ -11,14 +11,81 @@ function generateFakeSalt(username) {
}
router.post('/register', async (req, res) => {
const { username, salt, encryptedMK, hak, publicKey, signingKey, encryptedPrivateKeys } = req.body;
const { username, salt, encryptedMK, hak, publicKey, signingKey, encryptedPrivateKeys, inviteCode } = req.body;
try {
const result = await db.query(
`INSERT INTO users (username, client_salt, encrypted_master_key, hashed_auth_key, public_identity_key, public_signing_key, encrypted_private_keys)
VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id`,
[username, salt, encryptedMK, hak, publicKey, signingKey, encryptedPrivateKeys]
);
res.json({ success: true, userId: result.rows[0].id });
// Step 1: Enforce Invite (unless first user)
const userCountRes = await db.query('SELECT count(*) FROM users');
const userCount = parseInt(userCountRes.rows[0].count);
if (userCount > 0) {
if (!inviteCode) {
return res.status(403).json({ error: 'Invite code required' });
}
// Check Invite validity
const inviteRes = await db.query('SELECT * FROM invites WHERE code = $1', [inviteCode]);
if (inviteRes.rows.length === 0) {
return res.status(403).json({ error: 'Invalid invite code' });
}
var invite = inviteRes.rows[0];
// Check Expiration
if (invite.expires_at && new Date() > new Date(invite.expires_at)) {
return res.status(410).json({ error: 'Invite expired' });
}
// Check Usage Limits
if (invite.max_uses !== null && invite.uses >= invite.max_uses) {
return res.status(410).json({ error: 'Invite max uses reached' });
}
}
// START TRANSACTION - To ensure invite usage and user creation are atomic
await db.query('BEGIN');
try {
// Update Invite Usage (only if enforced)
if (userCount > 0) {
await db.query('UPDATE invites SET uses = uses + 1 WHERE code = $1', [inviteCode]);
}
// Create User
// Create User
const result = await db.query(
`INSERT INTO users (username, client_salt, encrypted_master_key, hashed_auth_key, public_identity_key, public_signing_key, encrypted_private_keys)
VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING id`,
[username, salt, encryptedMK, hak, publicKey, signingKey, encryptedPrivateKeys]
);
const newUserId = result.rows[0].id;
// Assign Roles
// 1. @everyone (Always)
await db.query(`
INSERT INTO user_roles (user_id, role_id)
SELECT $1, id FROM roles WHERE name = '@everyone'
`, [newUserId]);
// 2. Owner (If first user or if admin logic allows)
if (userCount === 0) {
await db.query(`
INSERT INTO user_roles (user_id, role_id)
SELECT $1, id FROM roles WHERE name = 'Owner'
`, [newUserId]);
// Also set is_admin = true for legacy support
await db.query('UPDATE users SET is_admin = TRUE WHERE id = $1', [newUserId]);
}
await db.query('COMMIT');
res.json({ success: true, userId: result.rows[0].id });
} catch (txErr) {
await db.query('ROLLBACK');
throw txErr;
}
} catch (err) {
console.error(err);
if (err.code === '23505') { // Unique violation
@@ -50,7 +117,7 @@ router.post('/login/verify', async (req, res) => {
try {
const result = await db.query(
'SELECT id, hashed_auth_key, encrypted_master_key, encrypted_private_keys FROM users WHERE username = $1',
'SELECT id, hashed_auth_key, encrypted_master_key, encrypted_private_keys, public_identity_key FROM users WHERE username = $1',
[username]
);
@@ -66,7 +133,8 @@ router.post('/login/verify', async (req, res) => {
success: true,
userId: user.id,
encryptedMK: user.encrypted_master_key,
encryptedPrivateKeys: user.encrypted_private_keys
encryptedPrivateKeys: user.encrypted_private_keys,
publicKey: user.public_identity_key // Return Public Key
});
} else {
res.status(401).json({ error: 'Invalid credentials' });
@@ -77,4 +145,14 @@ router.post('/login/verify', async (req, res) => {
}
});
router.get('/users/public-keys', async (req, res) => {
try {
const result = await db.query('SELECT id, public_identity_key FROM users');
res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
module.exports = router;

View File

@@ -12,4 +12,149 @@ router.get('/', async (req, res) => {
}
});
// Create New Channel
router.post('/create', async (req, res) => {
console.log('Creates Channel Body:', req.body);
const { name, type } = req.body;
if (!name) return res.status(400).json({ error: 'Channel name required' });
try {
const result = await db.query(
'INSERT INTO channels (name, type) VALUES ($1, $2) RETURNING *',
[name, type || 'text']
);
const newChannel = result.rows[0];
// DO NOT emit 'new_channel' here. Wait until keys are uploaded.
res.json({ id: newChannel.id });
} catch (err) {
console.error('Error creating channel:', err);
if (err.code === '23505') {
res.status(400).json({ error: 'Channel already exists' });
} else {
res.status(500).json({ error: 'Server error' });
}
}
});
// Notify Channel Creation (Called AFTER keys are uploaded)
router.post('/:id/notify', async (req, res) => {
const { id } = req.params;
try {
const result = await db.query('SELECT * FROM channels WHERE id = $1', [id]);
if (result.rows.length === 0) return res.status(404).json({ error: 'Channel not found' });
const channel = result.rows[0];
if (req.io) req.io.emit('new_channel', channel); // Emit NOW
res.json({ success: true });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// Upload Channel Keys (for self or others)
// Upload Channel Keys (for self or others) - Supports Batch
router.post('/keys', async (req, res) => {
// Check if body is array
const keysToUpload = Array.isArray(req.body) ? req.body : [req.body];
if (keysToUpload.length === 0) return res.json({ success: true });
try {
await db.query('BEGIN');
for (const keyData of keysToUpload) {
const { channelId, userId, encryptedKeyBundle, keyVersion } = keyData;
if (!channelId || !userId || !encryptedKeyBundle) {
continue;
}
await db.query(
`INSERT INTO channel_keys (channel_id, user_id, encrypted_key_bundle, key_version)
VALUES ($1, $2, $3, $4)
ON CONFLICT (channel_id, user_id) DO UPDATE
SET encrypted_key_bundle = EXCLUDED.encrypted_key_bundle,
key_version = EXCLUDED.key_version`,
[channelId, userId, encryptedKeyBundle, keyVersion || 1]
);
}
await db.query('COMMIT');
res.json({ success: true, count: keysToUpload.length });
} catch (err) {
await db.query('ROLLBACK');
console.error('Error uploading channel keys:', err);
res.status(500).json({ error: 'Server error' });
}
});
// Get User's Channel Keys
router.get('/keys/:userId', async (req, res) => {
const { userId } = req.params;
try {
const result = await db.query(
'SELECT channel_id, encrypted_key_bundle, key_version FROM channel_keys WHERE user_id = $1',
[userId]
);
res.json(result.rows);
} catch (err) {
console.error('Error fetching channel keys:', err);
res.status(500).json({ error: 'Server error' });
}
});
// Update Channel Name
router.put('/:id', async (req, res) => {
const { id } = req.params;
const { name } = req.body;
if (!name) return res.status(400).json({ error: 'Name required' });
try {
const result = await db.query(
'UPDATE channels SET name = $1 WHERE id = $2 RETURNING *',
[name, id]
);
if (result.rows.length === 0) return res.status(404).json({ error: 'Channel not found' });
const updatedChannel = result.rows[0];
if (req.io) req.io.emit('channel_renamed', updatedChannel);
res.json(updatedChannel);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// Delete Channel
router.delete('/:id', async (req, res) => {
const { id } = req.params;
try {
await db.query('BEGIN');
// Manual Cascade (since we didn't set FK CASCADE in schema for these yet)
await db.query('DELETE FROM messages WHERE channel_id = $1', [id]);
await db.query('DELETE FROM channel_keys WHERE channel_id = $1', [id]);
const result = await db.query('DELETE FROM channels WHERE id = $1 RETURNING *', [id]);
if (result.rows.length === 0) {
await db.query('ROLLBACK');
return res.status(404).json({ error: 'Channel not found' });
}
await db.query('COMMIT');
if (req.io) req.io.emit('channel_deleted', id);
res.json({ success: true, deletedId: id });
} catch (err) {
await db.query('ROLLBACK');
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
module.exports = router;

75
Backend/routes/invites.js Normal file
View File

@@ -0,0 +1,75 @@
const express = require('express');
const router = express.Router();
const db = require('../db');
// Create a new invite
router.post('/create', async (req, res) => {
const { code, encryptedPayload, createdBy, maxUses, expiresAt, keyVersion } = req.body;
if (!code || !encryptedPayload || !createdBy || !keyVersion) {
return res.status(400).json({ error: 'Missing required fields' });
}
try {
await db.query(
`INSERT INTO invites (code, encrypted_payload, created_by, max_uses, expires_at, key_version)
VALUES ($1, $2, $3, $4, $5, $6)`,
[code, encryptedPayload, createdBy, maxUses || null, expiresAt || null, keyVersion]
);
res.json({ success: true });
} catch (err) {
console.error('Error creating invite:', err);
res.status(500).json({ error: 'Server error' });
}
});
// Fetch an invite (and validate it)
router.get('/:code', async (req, res) => {
const { code } = req.params;
try {
const result = await db.query('SELECT * FROM invites WHERE code = $1', [code]);
if (result.rows.length === 0) {
return res.status(404).json({ error: 'Invite not found' });
}
const invite = result.rows[0];
// Check Expiration
if (invite.expires_at && new Date() > new Date(invite.expires_at)) {
return res.status(410).json({ error: 'Invite expired' });
}
// Check Usage Limits
if (invite.max_uses !== null && invite.uses >= invite.max_uses) {
return res.status(410).json({ error: 'Invite max uses reached' });
}
// Increment Uses
await db.query('UPDATE invites SET uses = uses + 1 WHERE code = $1', [code]);
res.json({
encryptedPayload: invite.encrypted_payload,
keyVersion: invite.key_version
});
} catch (err) {
console.error('Error fetching invite:', err);
res.status(500).json({ error: 'Server error' });
}
});
// Delete an invite (Revoke) -> Triggers client-side key rotation policy warning?
// The client should call this, then rotate keys.
router.delete('/:code', async (req, res) => {
const { code } = req.params;
try {
await db.query('DELETE FROM invites WHERE code = $1', [code]);
res.json({ success: true });
} catch (err) {
console.error('Error deleting invite:', err);
res.status(500).json({ error: 'Server error' });
}
});
module.exports = router;

213
Backend/routes/roles.js Normal file
View File

@@ -0,0 +1,213 @@
const express = require('express');
const router = express.Router();
const db = require('../db');
// Middleware to check for permissions (simplified for now)
// In a real app, you'd check if req.user has the permission
// Middleware to check for permissions
const checkPermission = (requiredPerm) => {
return async (req, res, next) => {
const userId = req.headers['x-user-id'];
if (!userId) {
return res.status(401).json({ error: 'Unauthorized: No User ID' });
}
try {
// Fetch all roles for user and aggregate permissions
const result = await db.query(`
SELECT r.permissions
FROM user_roles ur
JOIN roles r ON ur.role_id = r.id
WHERE ur.user_id = $1
`, [userId]);
let hasPermission = false;
// Check if ANY of the user's roles has the permission
for (const row of result.rows) {
const perms = row.permissions || {};
// If Manage Roles is true, or if checking for something else and they have it
if (perms[requiredPerm] === true) {
hasPermission = true;
break;
}
// Implicit Admin/Owner check: if they have 'manage_roles' and we are checking something lower?
// For "Owner" role, we seeded it with specific true values.
// But let's check for 'administrator' equivalent if we had it.
// For now, implicit check: if we need 'manage_roles', look for it.
}
if (!hasPermission) {
return res.status(403).json({ error: `Forbidden: Missing ${requiredPerm}` });
}
next();
} catch (err) {
console.error('Permission check failed:', err);
return res.status(500).json({ error: 'Internal Server Error' });
}
};
};
// GET /api/roles/permissions - Get current user's permissions
router.get('/permissions', async (req, res) => {
const userId = req.headers['x-user-id'];
if (!userId) return res.json({}); // No perms if no ID
try {
const result = await db.query(`
SELECT r.permissions
FROM user_roles ur
JOIN roles r ON ur.role_id = r.id
WHERE ur.user_id = $1
`, [userId]);
const finalPerms = {
manage_channels: false,
manage_roles: false,
create_invite: false,
embed_links: false,
attach_files: false
};
for (const row of result.rows) {
const p = row.permissions || {};
if (p.manage_channels) finalPerms.manage_channels = true;
if (p.manage_roles) finalPerms.manage_roles = true;
if (p.create_invite) finalPerms.create_invite = true;
if (p.embed_links) finalPerms.embed_links = true;
if (p.attach_files) finalPerms.attach_files = true;
}
res.json(finalPerms);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// GET /api/roles - List all roles
router.get('/', async (req, res) => {
try {
const result = await db.query('SELECT * FROM roles ORDER BY position DESC, id ASC');
res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// POST /api/roles - Create new role
router.post('/', checkPermission('manage_roles'), async (req, res) => {
const { name, color, permissions, position, is_hoist } = req.body;
try {
const result = await db.query(
'INSERT INTO roles (name, color, permissions, position, is_hoist) VALUES ($1, $2, $3, $4, $5) RETURNING *',
[name || 'new role', color || '#99aab5', permissions || {}, position || 0, is_hoist || false]
);
res.json(result.rows[0]);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// PUT /api/roles/:id - Update role
router.put('/:id', checkPermission('manage_roles'), async (req, res) => {
const { id } = req.params;
const { name, color, permissions, position, is_hoist } = req.body;
// Dynamic update query
const fields = [];
const values = [];
let idx = 1;
if (name !== undefined) { fields.push(`name = $${idx++}`); values.push(name); }
if (color !== undefined) { fields.push(`color = $${idx++}`); values.push(color); }
if (permissions !== undefined) { fields.push(`permissions = $${idx++}`); values.push(permissions); }
if (position !== undefined) { fields.push(`position = $${idx++}`); values.push(position); }
if (is_hoist !== undefined) { fields.push(`is_hoist = $${idx++}`); values.push(is_hoist); }
if (fields.length === 0) return res.json({ success: true }); // Nothing to update
values.push(id);
const query = `UPDATE roles SET ${fields.join(', ')} WHERE id = $${idx} RETURNING *`;
try {
const result = await db.query(query, values);
if (result.rows.length === 0) return res.status(404).json({ error: 'Role not found' });
res.json(result.rows[0]);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// DELETE /api/roles/:id - Delete role
router.delete('/:id', checkPermission('manage_roles'), async (req, res) => {
const { id } = req.params;
try {
// user_roles cascade handled by DB
const result = await db.query('DELETE FROM roles WHERE id = $1 RETURNING *', [id]);
if (result.rows.length === 0) return res.status(404).json({ error: 'Role not found' });
res.json({ success: true, deletedId: id });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// GET /api/roles/members - List members with roles
// (This is effectively GET /api/users but enriched with roles)
router.get('/members', async (req, res) => {
try {
const result = await db.query(`
SELECT u.id, u.username, u.public_identity_key,
json_agg(r.*) FILTER (WHERE r.id IS NOT NULL) as roles
FROM users u
LEFT JOIN user_roles ur ON u.id = ur.user_id
LEFT JOIN roles r ON ur.role_id = r.id
GROUP BY u.id
`);
res.json(result.rows);
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// POST /api/roles/:id/assign - Assign role to user
router.post('/:id/assign', checkPermission('manage_roles'), async (req, res) => {
const { id } = req.params; // role id
const { userId } = req.body;
try {
await db.query(
'INSERT INTO user_roles (user_id, role_id) VALUES ($1, $2) ON CONFLICT DO NOTHING',
[userId, id]
);
res.json({ success: true });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
// POST /api/roles/:id/remove - Remove role from user
router.post('/:id/remove', checkPermission('manage_roles'), async (req, res) => {
const { id } = req.params; // role id
const { userId } = req.body;
try {
await db.query(
'DELETE FROM user_roles WHERE user_id = $1 AND role_id = $2',
[userId, id]
);
res.json({ success: true });
} catch (err) {
console.error(err);
res.status(500).json({ error: 'Server error' });
}
});
module.exports = router;

41
Backend/routes/upload.js Normal file
View File

@@ -0,0 +1,41 @@
const express = require('express');
const multer = require('multer');
const path = require('path');
const fs = require('fs');
const router = express.Router();
// Ensure uploads directory exists
const uploadDir = path.join(__dirname, '../uploads');
if (!fs.existsSync(uploadDir)) {
fs.mkdirSync(uploadDir);
}
// Configure Multer Storage
const storage = multer.diskStorage({
destination: (req, file, cb) => {
cb(null, uploadDir);
},
filename: (req, file, cb) => {
// Generate unique filename: timestamp-random.ext
const uniqueSuffix = Date.now() + '-' + Math.round(Math.random() * 1E9);
const ext = path.extname(file.originalname);
cb(null, uniqueSuffix + ext);
}
});
const upload = multer({ storage: storage });
// POST /api/upload
router.post('/', upload.single('file'), (req, res) => {
if (!req.file) {
return res.status(400).json({ error: 'No file uploaded' });
}
// Return the URL to access the file
// Assumes server serves 'uploads' folder at '/uploads'
const fileUrl = `/uploads/${req.file.filename}`;
res.json({ url: fileUrl, filename: req.file.filename });
});
module.exports = router;

64
Backend/routes/voice.js Normal file
View File

@@ -0,0 +1,64 @@
const express = require('express');
const router = express.Router();
const { AccessToken } = require('livekit-server-sdk');
const db = require('../db');
// Middleware to check permissions?
// For now, simpler: assuming user is logged in (via x-user-id header check in frontend)
// Real implementation should use the checkPermission middleware or verify session
router.post('/token', async (req, res) => {
const { channelId } = req.body;
const userId = req.headers['x-user-id']; // Sent by frontend
// Default fallback if no user (should rely on auth middleware ideally)
if (!userId) {
return res.status(401).json({ error: 'Unauthorized' });
}
try {
// 1. Get Username (for display)
const userRes = await db.query('SELECT username FROM users WHERE id = $1', [userId]);
if (userRes.rows.length === 0) {
return res.status(404).json({ error: 'User not found' });
}
const username = userRes.rows[0].username;
// 2. Get Channel Name (Optional, for room name check)
// Ensure channel exists and is of type 'voice'
const channelRes = await db.query('SELECT id, type FROM channels WHERE id = $1', [channelId]);
if (channelRes.rows.length === 0) {
return res.status(404).json({ error: 'Channel not found' });
}
if (channelRes.rows[0].type !== 'voice') {
return res.status(400).json({ error: 'Not a voice channel' });
}
// 3. Generate Token
// API Key/Secret from env
const apiKey = process.env.LIVEKIT_API_KEY || 'devkey';
const apiSecret = process.env.LIVEKIT_API_SECRET || 'secret';
const at = new AccessToken(apiKey, apiSecret, {
identity: userId,
name: username,
});
at.addGrant({
roomJoin: true,
room: channelId,
canPublish: true,
canSubscribe: true,
});
const token = await at.toJwt();
res.json({ token });
} catch (err) {
console.error('Error creating voice token:', err);
res.status(500).json({ error: 'Server error' });
}
});
module.exports = router;

View File

@@ -8,22 +8,32 @@ CREATE TABLE IF NOT EXISTS users (
hashed_auth_key TEXT NOT NULL,
public_identity_key TEXT NOT NULL,
public_signing_key TEXT NOT NULL,
encrypted_private_keys TEXT NOT NULL, -- Added this column
encrypted_private_keys TEXT NOT NULL,
is_admin BOOLEAN DEFAULT FALSE,
created_at TIMESTAMP DEFAULT NOW()
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS channels (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
name TEXT UNIQUE NOT NULL,
type TEXT DEFAULT 'text',
created_at TIMESTAMP DEFAULT NOW()
type TEXT DEFAULT 'text' CHECK (type IN ('text', 'voice')),
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS roles (
id SERIAL PRIMARY KEY,
name TEXT NOT NULL,
permissions JSONB
color TEXT DEFAULT '#99aab5',
position INTEGER DEFAULT 0,
permissions JSONB DEFAULT '{}',
is_hoist BOOLEAN DEFAULT FALSE,
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS user_roles (
user_id UUID REFERENCES users(id) ON DELETE CASCADE,
role_id INTEGER REFERENCES roles(id) ON DELETE CASCADE,
PRIMARY KEY (user_id, role_id)
);
CREATE TABLE IF NOT EXISTS channel_keys (
@@ -42,5 +52,16 @@ CREATE TABLE IF NOT EXISTS messages (
nonce TEXT NOT NULL,
signature TEXT NOT NULL,
key_version INTEGER NOT NULL,
created_at TIMESTAMP DEFAULT NOW()
created_at TIMESTAMPTZ DEFAULT NOW()
);
CREATE TABLE IF NOT EXISTS invites (
code TEXT PRIMARY KEY, -- e.g. "8f1a4c..." (The ID of the invite)
encrypted_payload TEXT NOT NULL, -- The AES-Encrypted Key Bundle (Server can't read this)
created_by UUID REFERENCES users(id) ON DELETE CASCADE,
max_uses INTEGER DEFAULT NULL, -- NULL = Infinite
uses INTEGER DEFAULT 0,
expires_at TIMESTAMPTZ DEFAULT NULL, -- NULL = Never
key_version INTEGER NOT NULL, -- Which key version is inside? (So we can invalidate leaks)
created_at TIMESTAMPTZ DEFAULT NOW()
);

View File

@@ -1,5 +1,6 @@
const fs = require('fs');
const path = require('path');
require('dotenv').config({ path: path.join(__dirname, '../.env') });
const db = require('../db');
async function initDb() {
@@ -7,18 +8,33 @@ async function initDb() {
const schemaPath = path.join(__dirname, '../schema.sql');
const schemaSql = fs.readFileSync(schemaPath, 'utf8');
console.log('Dropping existing tables...');
await db.query(`
DROP TABLE IF EXISTS invites CASCADE;
DROP TABLE IF EXISTS messages CASCADE;
DROP TABLE IF EXISTS channel_keys CASCADE;
DROP TABLE IF EXISTS roles CASCADE;
DROP TABLE IF EXISTS channels CASCADE;
DROP TABLE IF EXISTS users CASCADE;
`);
console.log('Applying schema...');
await db.query(schemaSql);
// Seed Channels
const channels = ['general', 'random'];
for (const name of channels) {
await db.query(
`INSERT INTO channels (name) VALUES ($1) ON CONFLICT (name) DO NOTHING`,
[name]
);
}
console.log('Channels seeded.');
console.log('Schema applied successfully.');
console.log('Seeding Default Roles...');
// 1. @everyone (Limited)
await db.query(`
INSERT INTO roles (name, color, position, is_hoist, permissions)
VALUES ('@everyone', '#99aab5', 0, false, '{"manage_channels": false, "manage_roles": false, "create_invite": false, "embed_links": true, "attach_files": true}')
`);
// 2. Owner (All Permissions)
await db.query(`
INSERT INTO roles (name, color, position, is_hoist, permissions)
VALUES ('Owner', '#ED4245', 100, true, '{"manage_channels": true, "manage_roles": true, "create_invite": true, "embed_links": true, "attach_files": true}')
`);
console.log('Schema applied successfully.');
process.exit(0);

View File

@@ -0,0 +1,17 @@
const path = require('path');
require('dotenv').config({ path: path.join(__dirname, '../.env') });
const db = require('../db');
async function migrate() {
try {
console.log('Running migration...');
await db.query("ALTER TABLE channels ADD COLUMN IF NOT EXISTS type TEXT DEFAULT 'text' CHECK (type IN ('text', 'voice'))");
console.log('Migration complete: Added type column to channels.');
process.exit(0);
} catch (err) {
console.error('Migration failed:', err);
process.exit(1);
}
}
migrate();

View File

@@ -2,6 +2,7 @@ const express = require('express');
const http = require('http');
const { Server } = require('socket.io');
const cors = require('cors');
const axios = require('axios');
require('dotenv').config();
const app = express();
@@ -15,36 +16,104 @@ const io = new Server(server, {
const authRoutes = require('./routes/auth');
const channelRoutes = require('./routes/channels');
const uploadRoutes = require('./routes/upload');
const inviteRoutes = require('./routes/invites');
const rolesRoutes = require('./routes/roles');
app.use(cors());
app.use(express.json());
// Attach IO to request
app.use((req, res, next) => {
req.io = io;
next();
});
// Serve uploads folder based on relative path from server.js
const path = require('path');
app.use('/uploads', express.static(path.join(__dirname, 'uploads')));
app.use('/api/auth', authRoutes);
app.use('/api/channels', channelRoutes);
app.use('/api/upload', uploadRoutes);
app.use('/api/invites', inviteRoutes);
app.use('/api/invites', inviteRoutes);
app.use('/api/roles', rolesRoutes);
app.use('/api/voice', require('./routes/voice'));
app.get('/', (req, res) => {
res.send('Secure Chat Backend Running');
});
// GIF Routes
const gifCategories = require('./data/gif_categories.json');
app.get('/api/gifs/categories', (req, res) => {
res.json(gifCategories);
});
app.get('/api/gifs/search', async (req, res) => {
const { q, limit = 8 } = req.query;
const apiKey = process.env.TENOR_API_KEY;
if (!apiKey) {
// Return mock data or error if no key
console.warn('TENOR_API_KEY missing in .env');
// Return dummy response to prevent crash
return res.json({ results: [] });
}
try {
const response = await axios.get(`https://tenor.googleapis.com/v2/search`, {
params: {
q,
key: apiKey,
limit
}
});
res.json(response.data);
} catch (err) {
console.error('Tenor API Error:', err.message);
res.status(500).json({ error: 'Failed to fetch GIFs' });
}
});
const redisClient = require('./redis');
const db = require('./db');
io.on('connection', (socket) => {
console.log('User connected:', socket.id);
socket.on('join_channel', async (channelId) => {
socket.on('join_channel', async (data) => {
// Handle both simple string (legacy) and object payload
const channelId = typeof data === 'object' ? data.channelId : data;
const userId = typeof data === 'object' ? data.userId : null;
socket.join(channelId);
console.log(`User ${socket.id} joined channel ${channelId}`);
// Load recent messages
console.log(`User ${socket.id} (ID: ${userId}) joined channel ${channelId}`);
// Load recent messages with reactions
try {
const result = await db.query(
`SELECT m.*, u.username, u.public_signing_key
FROM messages m
JOIN users u ON m.sender_id = u.id
WHERE m.channel_id = $1
ORDER BY m.created_at DESC LIMIT 50`,
[channelId]
);
const query = `
SELECT m.*, u.username, u.public_signing_key,
(
SELECT json_object_agg(res.emoji, res.data)
FROM (
SELECT r.emoji, json_build_object(
'count', COUNT(*)::int,
'me', BOOL_OR(r.user_id = $2)
) as data
FROM message_reactions r
WHERE r.message_id = m.id
GROUP BY r.emoji
) res
) as reactions
FROM messages m
JOIN users u ON m.sender_id = u.id
WHERE m.channel_id = $1
ORDER BY m.created_at DESC LIMIT 50
`;
const result = await db.query(query, [channelId, userId]);
socket.emit('recent_messages', result.rows.reverse());
} catch (err) {
console.error('Error fetching messages:', err);
@@ -83,12 +152,114 @@ io.on('connection', (socket) => {
}
});
socket.on('typing', (data) => {
socket.to(data.channelId).emit('user_typing', { username: data.username });
socket.on('typing_start', (data) => {
io.to(data.channelId).emit('typing_start', data);
});
socket.on('typing_stop', (data) => {
io.to(data.channelId).emit('typing_stop', data);
});
// ... Message handling ...
// Voice State Handling
// Stores: channelId -> Set(serializedUser: {userId, username})
// For simplicity: channelId -> [{userId, username}]
// We need a global variable outside the connection loop, but for this file structure 'socket.on' is inside io.on
// So we need to define it outside.
// See defining it at top of file logic.
// Reactions
socket.on('add_reaction', async ({ channelId, messageId, userId, emoji }) => {
try {
if (!messageId || !userId || !emoji) return;
const result = await db.query(
`INSERT INTO message_reactions (message_id, user_id, emoji)
VALUES ($1, $2, $3)
ON CONFLICT (message_id, user_id, emoji) DO NOTHING`,
[messageId, userId, emoji]
);
if (result.rowCount > 0) {
io.to(channelId).emit('reaction_added', { messageId, userId, emoji });
}
} catch (err) {
console.error('Error adding reaction:', err);
}
});
socket.on('remove_reaction', async ({ channelId, messageId, userId, emoji }) => {
try {
if (!messageId || !userId || !emoji) return;
const result = await db.query(
`DELETE FROM message_reactions
WHERE message_id = $1 AND user_id = $2 AND emoji = $3`,
[messageId, userId, emoji]
);
if (result.rowCount > 0) {
io.to(channelId).emit('reaction_removed', { messageId, userId, emoji });
}
} catch (err) {
console.error('Error removing reaction:', err);
}
});
socket.on('join_voice', (channelId) => { }); // Deprecated/Unused placeholder
socket.on('voice_state_change', (data) => {
// data: { channelId, userId, username, action: 'joined' | 'left' | 'state_update', isMuted, isDeafened }
console.log(`Voice State Update: ${data.username} (${data.userId}) ${data.action} ${data.channelId}`);
// Update Server State
if (!global.voiceStates) global.voiceStates = {};
const currentUsers = global.voiceStates[data.channelId] || [];
if (data.action === 'joined') {
const existingUser = currentUsers.find(u => u.userId === data.userId);
if (!existingUser) {
currentUsers.push({
userId: data.userId,
username: data.username,
isMuted: data.isMuted || false,
isDeafened: data.isDeafened || false
});
} else {
// Update existing on re-join (or just state sync)
existingUser.isMuted = data.isMuted || false;
existingUser.isDeafened = data.isDeafened || false;
}
global.voiceStates[data.channelId] = currentUsers;
} else if (data.action === 'left') {
const index = currentUsers.findIndex(u => u.userId === data.userId);
if (index !== -1) {
currentUsers.splice(index, 1);
global.voiceStates[data.channelId] = currentUsers;
}
} else if (data.action === 'state_update') {
const user = currentUsers.find(u => u.userId === data.userId);
if (user) {
if (data.isMuted !== undefined) user.isMuted = data.isMuted;
if (data.isDeafened !== undefined) user.isDeafened = data.isDeafened;
global.voiceStates[data.channelId] = currentUsers;
}
}
io.emit('voice_state_update', data);
});
socket.on('request_voice_state', () => {
socket.emit('full_voice_state', global.voiceStates || {});
});
socket.on('disconnect', () => {
console.log('User disconnected:', socket.id);
// TODO: Auto-leave logic would require mapping socketId -> userId/channelId
});
});

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#8899A6" d="M6 10l3 23c0 1.657 4.029 3 9 3s9-1.343 9-3l3-23H6z"/><path fill="#D3A471" d="M7 10l3 22.644c0 1.243 3.582 2.25 8 2.25s8-1.007 8-2.25L29 10H7z"/><path fill="#CCD6DD" d="M27.756 19.538L29 10H7l1.244 9.538z"/><path fill="#E1E8ED" d="M25.982 19.538L27 10H9l1.018 9.538z"/><ellipse fill="#ECD2A7" cx="18" cy="19.455" rx="9.764" ry="2.355"/><path fill="#AA8DD8" d="M21.836 19.144l1.627-18.067-2.988-.27-1.651 18.337z"/><path fill="#55ACEE" d="M5.696 10.003c-.179 1.05-.162 2.363.413 2.527.46.132 1.104-.09 1.639.177.535.267.963.965 1.506 1.151 1.04.356 1.678-.299 2.303-.221 1.188.148 1.721 1.284 2.702 1.373.98.089 1.781-.738 2.701-.709.984.032.936.767 2.48.797 1.516.029 1.766-.959 2.657-1.019.891-.059 1.471.547 2.303.399.832-.149 1.177-1.017 1.86-1.196.683-.178 1.045.326 1.639.177.594-.148.907-1.17 1.264-1.438.356-.267 1.571 1.26 1.277-1.663-.536-5.328-19.13-.563-20.882-.681-1.753-.119-3.491-1.845-3.862.326z"/><ellipse fill="#88C9F9" cx="18" cy="10.011" rx="12.35" ry="3.8"/><path fill="#9266CC" d="M23.463 1.077L20.475.808l-.853 9.474c-.001.007-.006.013-.006.019 0 .276.672.5 1.5.5s1.5-.224 1.5-.5V10.3h.017l.83-9.223z"/><path fill="#553788" d="M23.463 1.077c-.025.275-.714.438-1.539.363-.825-.074-1.474-.358-1.449-.633.025-.275.714-.438 1.539-.363s1.474.358 1.449.633z"/><ellipse fill="#AA8DD8" cx="20.314" cy="19.19" rx="1.5" ry=".5"/><g fill="#292F33"><path d="M11.295 29.554c-.327.327-.911.275-1.303-.117-.392-.392-.445-.976-.117-1.303.327-.327.911-.275 1.303.117.392.392.444.975.117 1.303zm2.938 4.348c-.089.351-.5.549-.917.444-.417-.106-.684-.476-.595-.827.089-.351.5-.55.917-.444.418.106.684.476.595.827zm3.551-6.591c-.094.37-.508.583-.926.478-.417-.106-.68-.491-.586-.861.094-.37.508-.583.926-.478.417.106.68.492.586.861z"/><ellipse cx="17.217" cy="33.802" rx="1.071" ry=".905"/><path d="M25.148 26.582c.102.45-.206.904-.688 1.013-.482.11-.956-.166-1.059-.616-.102-.45.206-.903.688-1.013.482-.11.956.166 1.059.616zm-2.993 4.497c-.184.561-.75.879-1.265.71-.514-.169-.782-.76-.598-1.322s.75-.879 1.265-.71c.514.169.782.76.598 1.322zm-5.126-.479c.166.531-.114 1.091-.626 1.251-.512.16-1.061-.141-1.227-.672-.166-.531.114-1.091.626-1.251.511-.16 1.061.141 1.227.672zm2.381-.292c-.455.238-1.01.076-1.239-.361-.229-.438-.046-.986.41-1.224.455-.238 1.01-.077 1.239.361.229.438.045.986-.41 1.224zm1.699 2.608c.082.501-.334.986-.929 1.083-.595.097-1.144-.23-1.225-.731-.082-.501.334-.986.929-1.083.595-.097 1.143.23 1.225.731zm-6.762-3.885c-.351.289-.946.145-1.329-.321-.383-.466-.408-1.077-.057-1.366.351-.289.946-.145 1.329.32.382.467.408 1.079.057 1.367zm9.457 3.687c.251.394.066.961-.412 1.266-.479.305-1.07.232-1.321-.163-.251-.394-.066-.961.412-1.266.478-.304 1.07-.232 1.321.163zm1.778-.814c.304.208.32.714.036 1.13-.284.417-.761.586-1.066.378-.304-.208-.32-.714-.036-1.13.285-.416.762-.586 1.066-.378zm-15.854-6.47c.278-.015.522.335.547.783.024.448-.181.823-.458.838-.278.015-.522-.335-.547-.783s.181-.823.458-.838zM23.845 28.9c.19.326.044.764-.326.98-.37.216-.824.127-1.014-.199-.19-.326-.044-.764.326-.98.37-.216.824-.127 1.014.199zm-5.291 2.468c.27.184.319.581.11.887-.209.306-.596.404-.866.22-.27-.184-.319-.581-.11-.887.209-.305.597-.404.866-.22zm7.324-2.306c.295.078.441.493.327.928-.115.435-.446.725-.741.647-.295-.078-.441-.493-.327-.928.115-.435.446-.725.741-.647zM26 27.13c.231.061.341.405.245.769-.096.364-.361.61-.592.549s-.341-.405-.245-.769c.096-.364.361-.609.592-.549zm-1.272 3.396c.3.274.254.812-.102 1.203-.357.391-.889.486-1.189.212-.3-.274-.254-.812.102-1.203.357-.391.889-.486 1.189-.212zm-11.456.686c-.242.356-.801.399-1.249.095-.448-.304-.615-.839-.373-1.196s.801-.399 1.249-.095c.448.304.615.84.373 1.196zm8.985-3.5c.034.457-.375.86-.915.901-.54.041-1.005-.297-1.04-.753-.034-.457.375-.86.915-.901.54-.041 1.005.296 1.04.753zm-7.088 5.02c-.267.338-.828.34-1.253.004-.425-.335-.553-.881-.286-1.219.267-.338.828-.34 1.252-.004.425.335.554.881.287 1.219zm-3.382-.593c.341.451.332 1.034-.022 1.301-.353.267-.916.118-1.258-.334s-.332-1.034.022-1.301c.353-.267.916-.118 1.258.334z"/></g></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 4.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#FFAC33" d="M11 0C9.736 0 8.565.393 7.598 1.061 7.401 1.031 7.205 1 7 1 4.791 1 3 2.791 3 5v6c0 3.866 3.134 7 7 7s7-3.134 7-7V6.001C17 2.687 14.314 0 11 0z"/><path fill="#FFDC5D" d="M11.213 34.309c-.052.682 1.849.953 2.129.791.299-.173-.698-.623-.702-.977-.019-1.797.53-1.648.311-3.492.443-1.625.672-2.592.672-3.131 0-1.25-3.312-.766-3.312 0 0 .344.365 1.681.417 3.131-.313 1.659.641 1.615.485 3.678zm-2.448 0c.052.682-1.849.953-2.129.791-.299-.173.698-.623.702-.977.019-1.797-.53-1.648-.311-3.492-.443-1.625-.672-2.592-.672-3.131 0-1.25 3.313-.766 3.313 0 0 .344-.365 1.681-.417 3.131.311 1.659-.642 1.615-.486 3.678z"/><path fill="#F9CA55" d="M13.623 27.5c0-1.25-3.312-.766-3.312 0 0 .151.071.499.154.961h3.029c.084-.411.129-.729.129-.961zm-3.956 0c0-.766-3.312-1.25-3.312 0 0 .232.045.55.13.961h3.029c.082-.462.153-.81.153-.961z"/><path fill="#FFDC5D" d="M3.258 26.96c-.258.124-.503-.097-.619-.227-.328-.367-.583-1.246-.282-2.209.303-.973.6-2.384 1.199-4.002.081-.22.499-3.764.805-4.445.197-.437 1.28-.896 1.81-.807.529.089.246.651.105 1.13 0 0-.916 3.953-1.016 4.296-.316 1.079-1.624 2.918-1.565 4.237.031.692.06 1.255-.339 1.246-.049.362-.003.735-.098.781zm14.984-.2c.271.091.487-.159.586-.302.279-.405.422-1.309.004-2.227-.423-.927-.894-2.29-1.69-3.821-.108-.208-.966-3.672-1.355-4.309-.25-.409-1.382-.729-1.897-.574-.513.154-.162.676.037 1.134 0 0 1.403 3.807 1.546 4.135.449 1.031 1.977 2.691 2.082 4.008.056.69.097 1.253.492 1.194.094.353.095.729.195.762z"/><path fill="#292F33" d="M13.945 36c.305 0 .372-.418.089-.629-.379-.285-.88-1.371-1.561-1.371h-1.245c-.229 0-.49 1.209-.41 1.48.102.345.433.52.812.52h2.315zm-7.913 0c-.305 0-.372-.418-.089-.629.379-.285.88-1.371 1.561-1.371h1.245c.229 0 .49 1.209.41 1.48-.102.345-.433.52-.811.52H6.032z"/><path fill="#E75A70" d="M14.354 17.771L16 16c-1.438-1.792-4-2-4-2H8s-2.562.208-4 2l1.646 1.771S6.25 20.688 6.25 21 5 25.75 5 28h10c0-2.25-1.25-6.688-1.25-7s.604-3.229.604-3.229z"/><path fill="#DA2F47" d="M13.75 21c0-.106.07-.512.161-1H6.089c.092.488.161.894.161 1 0 .083-.122.509-.223 1h7.942c-.108-.558-.219-.917-.219-1z"/><path fill="#FFDC5D" d="M8 11v4c0 1.104.896 2 2 2s2-.896 2-2v-4H8z"/><path fill="#F9CA55" d="M8 13.56c.608.687 1.178.859 1.998.859.819 0 1.394-.173 2.002-.859v-.812H8v.812z"/><path fill="#FFDC5D" d="M15 3H5v6c0 2.762 2.238 5 5 5s5-2.237 5-5V3z"/><path fill="#FFAC33" d="M15 2H5L4 7c4 0 4-4 4-4s0 4 8 4l-1-5z"/><path fill="#DF1F32" d="M12 12H8s0 1 2 1 2-1 2-1z"/><circle fill="#662113" cx="7.5" cy="8.5" r=".5"/><circle fill="#662113" cx="12.5" cy="8.5" r=".5"/><path fill="#C1694F" d="M9 10h2s0 1-1 1-1-1-1-1z"/><path fill="#FFAC33" d="M26.5 0c-1.187 0-2.282.379-3.181 1.018C21.473 1.114 20 2.629 20 4.5c0 1.542.007 3.484 2.038 4.208C23.036 10.094 24.66 11 26.5 11c3.037 0 5.5-2.462 5.5-5.499C32 2.463 29.537 0 26.5 0z"/><path fill="#FFDC5D" d="M18.117 26.76c-.271.091-.487-.159-.586-.302-.279-.405-.422-1.309-.004-2.227.423-.927.702-2.072 1.69-3.821.115-.204.494-2.746 1.242-4.354.202-.435 1.495-.684 2.009-.529.513.154-.005.98-.037 1.134-.344 1.651-1.305 4.077-1.45 4.404-.8 1.806-1.965 2.389-2.071 3.706-.055.69-.205 1.286-.6 1.228-.092.352-.094.728-.193.761zm14.595.204c.257.126.504-.094.62-.222.33-.365.591-1.242.296-2.208-.297-.975-.424-2.146-1.174-4.01-.087-.217-.129-2.787-.66-4.479-.143-.457-1.392-.875-1.922-.789-.529.086-.124.972-.112 1.129.124 1.682.758 4.213.859 4.556.556 1.895 1.634 2.627 1.566 3.946-.036.692.034 1.302.433 1.296.048.363 0 .735.094.781z"/><path fill="#AAB8C2" d="M29.555 29.5c.5-2.734.422-6.5.422-6.5h-7.963s-.078 3.766.422 6.5c.063.344.188 3.344-.109 5.5-.066.479 2.886.937 2.844-.125-.078-1.969.264-3.513.328-4.5.035-.547.25-1.875.344-3.208.011-.018.295-.018.306 0 .094 1.333.308 2.661.344 3.208.064.987.406 2.531.328 4.5-.042 1.062 2.91.604 2.844.125-.297-2.156-.172-5.156-.11-5.5z"/><path fill="#292F33" d="M30.54 36c.499-.406-.041-1.161-1.42-1.402-1.163-.203-2.2-.032-2.363.35-.212.493-.05 1.052-.05 1.052h3.833zm-9.117 0c-.499-.406.041-1.161 1.42-1.402 1.163-.203 2.2-.032 2.363.35.212.494.05 1.053.05 1.053L21.423 36z"/><path fill="#4289C1" d="M30.797 14.766C29.578 14 28 14 28 14h-4s-1.578 0-2.797.766c-1.201.754-1.656 3-1.656 3l2.203.688.109 5.546h8.281l.109-5.547 2.203-.688c.001.001-.454-2.245-1.655-2.999z"/><path fill="#FFDC5D" d="M24 10.042v4c0 .682.896 1.305 2 1.305s2-.668 2-1.305v-4h-4z"/><path fill="#F9CA55" d="M24 13.561c.608.687 1.178.859 1.998.859.819 0 1.394-.173 2.002-.859v-.812h-4v.812z"/><path fill="#FFDC5D" d="M31 3H21v6c0 2.762 2.238 5 5 5s5-2.237 5-5V3z"/><path fill="#FFAC33" d="M21 2.5L20.5 5l.5 2c2.333 0 2.85-2.412 2.965-3.488C24.004 4.588 24.779 7 31 7l.5-2-.5-2.5H21z"/><path fill="#C1694F" d="M28 12h-4s0 1 2 1 2-1 2-1z"/><circle fill="#662113" cx="23.5" cy="8.5" r=".5"/><circle fill="#662113" cx="28.5" cy="8.5" r=".5"/><path fill="#C1694F" d="M25 10h2s0 1-1 1-1-1-1-1z"/></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#A0041E" d="M6.96 20.637c.068.639-.543 1.228-1.368 1.315-.824.089-1.547-.357-1.615-.995-.068-.639.544-1.227 1.368-1.314.824-.089 1.547.356 1.615.994zm2.087 2.717c.125.818-1.756 2.544-2.576 2.669-.819.125-1.584-.438-1.708-1.257-.125-.818.58-1.14 1.398-1.265.819-.124 2.761-.965 2.886-.147zm1.783 2.104c.173.81-1.628 3.927-2.438 4.1-.811.173-1.645.146-1.817-.665-.173-.81.306-1.688 1.116-1.861.81-.174 2.966-2.384 3.139-1.574zm3.853.858c.165.811-1.338 4.354-2.15 4.519-.812.165-1.439.451-1.604-.36-.165-.812.261-1.975 1.006-2.58.644-.523 2.584-2.39 2.748-1.579z"/><path fill="#A0041E" d="M3.925 18.869c.607.715 1.18 1.23.464 1.835-.716.606-1.747.162-2.354-.554-.605-.715-2.239-3.42-1.524-4.025.717-.606 2.809 2.029 3.414 2.744zm.33 4.88c.892.295 1.857.801 1.563 1.691-.294.891-1.328.991-2.219.698-.889-.295-3.772-1.691-3.478-2.581.295-.89 3.244-.102 4.134.192zm1.214 4.532c.905-.253 1.907-.283 2.159.619.252.903-.282 1.535-1.186 1.787-.902.251-4.342.727-4.594-.176-.251-.905 2.718-1.98 3.621-2.23zm4.348 3.188c.084-.937.644-1.669 1.577-1.585.934.085 1.258 1.025 1.173 1.96-.085.934.147 3.562-1.715 4.016-.912.221-1.121-3.46-1.035-4.391zM29.04 20.637c-.068.639.543 1.228 1.367 1.315.824.089 1.547-.357 1.615-.995.068-.639-.544-1.227-1.367-1.314-.824-.089-1.547.356-1.615.994zm-2.087 2.717c-.125.818 1.757 2.544 2.575 2.669.819.125 1.584-.438 1.709-1.257s-.58-1.14-1.398-1.265c-.819-.124-2.761-.965-2.886-.147zm-1.783 2.104c-.173.81 1.628 3.927 2.438 4.1.81.173 1.644.146 1.816-.665.174-.81-.305-1.688-1.115-1.861-.81-.174-2.966-2.384-3.139-1.574zm-3.853.858c-.166.811 1.338 4.354 2.149 4.519.812.165 1.438.451 1.604-.36.164-.812-.262-1.975-1.007-2.58-.642-.523-2.582-2.39-2.746-1.579z"/><path fill="#A0041E" d="M32.075 18.869c-.607.715-1.18 1.23-.465 1.835.716.606 1.747.162 2.354-.554.605-.715 2.239-3.42 1.523-4.025-.715-.606-2.807 2.029-3.412 2.744zm-.33 4.88c-.892.295-1.857.801-1.562 1.691.293.891 1.328.991 2.219.698.889-.295 3.771-1.691 3.477-2.581-.294-.89-3.244-.102-4.134.192zm-1.215 4.532c-.904-.253-1.906-.283-2.158.619-.252.903.282 1.535 1.185 1.787.902.251 4.343.727 4.594-.177.252-.904-2.717-1.979-3.621-2.229zm-4.347 3.188c-.084-.937-.645-1.669-1.577-1.585-.935.085-1.258 1.025-1.173 1.96.084.934-.147 3.562 1.715 4.016.912.221 1.121-3.46 1.035-4.391zM3.148 13.878c-.383-.856.001-1.86.857-2.242.856-.383 1.86.002 2.243.858.381.855 2.651 5.612 1.795 5.994-.855.382-4.513-3.755-4.895-4.61z"/><path fill="#A0041E" d="M3.994 12.034c1.221 2.956 8.341-3.341 8.803-6.281.462-2.939-.308-4.201-.694-4.5-.386-.299.144 1.435-1.187 3.306-1.053 1.482-7.766 5.434-6.922 7.475zm28.858 1.844c.384-.856-.001-1.86-.857-2.242-.857-.383-1.861.002-2.244.858-.381.855-2.65 5.612-1.794 5.994.855.382 4.513-3.755 4.895-4.61z"/><path fill="#A0041E" d="M32.007 12.034c-1.222 2.956-8.341-3.341-8.804-6.281-.461-2.939.309-4.201.694-4.5.386-.299-.144 1.435 1.187 3.306 1.054 1.482 7.766 5.434 6.923 7.475z"/><path fill="#BE1931" d="M6 22c0-2 2-10 12-10s12 8 12 10c-5 3-5.373 7-12 7s-6-4-12-7zm-1.677-9.777c-3.153.543-.358-8.141 1.883-10.099C8.446.166 10.863.207 11.321.374s-1.174 2.595-1.75 4.178c-.293.803-3.072 7.296-5.248 7.671zm27.354 0c3.152.543.358-8.141-1.882-10.099C27.555.166 25.139.207 24.68.374c-.459.167 1.174 2.595 1.75 4.178.293.803 3.071 7.296 5.247 7.671z"/><path fill="#A0041E" d="M17.032 12.136c.335 1.339-.045 1.588-.849 1.789-.804.201-1.727.278-2.061-1.061-.335-1.339.045-2.588.849-2.789.803-.201 1.726.721 2.061 2.061zm4.846.728c-.335 1.34-1.258 1.262-2.061 1.061-.804-.201-1.184-.45-.849-1.789.335-1.34 1.258-2.262 2.062-2.061.803.2 1.183 1.449.848 2.789z"/><circle fill="#292F33" cx="14.5" cy="9.5" r="1.5"/><circle fill="#292F33" cx="21.5" cy="9.5" r="1.5"/><path fill="#DD2E44" d="M9.053 21.529c-.14.236-3.053.732-2.303-.731s2.443.497 2.303.731z"/><path fill="#DD2E44" d="M9.891 20.124c-.218.225-3.188.391-1.922-1.404 1.265-1.793 2.234 1.082 1.922 1.404z"/><path fill="#DD2E44" d="M11.657 18.66c-.378.231-3.471-.501-1.407-1.932 1.872-1.296 1.906 1.626 1.407 1.932z"/><path fill="#DD2E44" d="M14.102 17.427c-1.008.299-3.378-1.302-.881-2.141 2.498-.839 1.889 1.842.881 2.141zm12.754 4.102c.141.235 3.053.731 2.303-.731-.75-1.463-2.443.497-2.303.731z"/><path fill="#DD2E44" d="M26.019 20.124c.218.225 3.188.391 1.922-1.404-1.266-1.793-2.235 1.082-1.922 1.404z"/><path fill="#DD2E44" d="M24.253 18.66c.378.231 3.471-.501 1.406-1.932-1.872-1.296-1.906 1.626-1.406 1.932z"/><path fill="#DD2E44" d="M21.808 17.427c1.008.299 3.378-1.302.881-2.141-2.499-.839-1.89 1.842-.881 2.141z"/><path fill="#A0041E" d="M26.849 16.25c0 .414-2.189-2.25-8.849-2.25-6.661 0-8.848 2.664-8.848 2.25 0-.414 2.754-3.75 8.848-3.75 6.094 0 8.849 3.336 8.849 3.75z"/><path fill="#DD2E44" d="M10.793 24.433c0-.414 1.782 2.25 7.207 2.25s7.208-2.664 7.208-2.25c0 .414-2.244 3.75-7.208 3.75s-7.207-3.336-7.207-3.75z"/></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#CCD6DD" d="M30.806 15.347H19.201l8.205-8.205-.707-.707-8.205 8.205V3.036h-1V14.64L9.288 6.435l-.707.707 8.206 8.205H5.182v1h11.605l-8.206 8.206.707.707 8.206-8.206v11.605h1V17.055l8.205 8.205.707-.707-8.205-8.206h11.605z"/><path fill="#AAB8C2" d="M17.994 1.394c-7.982 0-14.453 6.471-14.453 14.453 0 7.982 6.471 14.453 14.453 14.453 7.983 0 14.454-6.471 14.454-14.453-.001-7.982-6.472-14.453-14.454-14.453zm0 26.683c-6.755 0-12.23-5.475-12.23-12.23s5.475-12.23 12.23-12.23c6.754 0 12.23 5.475 12.23 12.23s-5.475 12.23-12.23 12.23z"/><path fill="#AAB8C2" d="M17.993 23.374c-4.15 0-7.526-3.377-7.526-7.527s3.376-7.526 7.526-7.526c4.151 0 7.528 3.376 7.528 7.526s-3.376 7.527-7.528 7.527zm0-13.553c-3.323 0-6.026 2.704-6.026 6.026s2.704 6.027 6.026 6.027c3.324 0 6.028-2.704 6.028-6.027s-2.704-6.026-6.028-6.026z"/><path fill="#8899A6" d="M27.279 34.429l-8.376-18.344c-.021-.046-.058-.076-.085-.117-.038-.059-.072-.118-.123-.169-.051-.051-.11-.085-.17-.123-.041-.027-.071-.064-.117-.085-.012-.005-.024-.003-.035-.008-.064-.027-.132-.034-.201-.047-.061-.011-.121-.03-.182-.03-.054 0-.106.018-.161.027-.075.013-.149.022-.219.051-.011.005-.023.003-.034.008-.044.02-.074.057-.114.082-.061.039-.121.074-.173.125-.051.051-.086.111-.124.171-.026.04-.063.07-.083.115L8.709 34.429c-.229.502-.008 1.096.494 1.325.135.061.276.09.415.09.379 0 .742-.217.91-.585l7.465-16.351 7.465 16.351c.168.368.531.585.911.585.139 0 .279-.029.414-.091.504-.229.725-.822.496-1.324z"/><path d="M12.9 36H7.079c-.552 0-1-.447-1-1s.448-1 1-1H12.9c.552 0 1 .447 1 1s-.448 1-1 1zm15.999 0h-5.82c-.553 0-1-.447-1-1s.447-1 1-1h5.82c.553 0 1 .447 1 1s-.447 1-1 1z" fill="#553788"/><path fill="#744EAA" d="M21.284 29.819c0 1.535-1.244 2.779-2.779 2.779h-1.112c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.534 0 2.779 1.244 2.779 2.779z"/><path fill="#CBB7EA" d="M21.227 29.263c-.257-1.269-1.378-2.224-2.723-2.224h-1.112c-1.345 0-2.466.954-2.724 2.224h6.559z"/><path fill="#5C913B" d="M11.017 26.527c0 1.535-1.244 2.779-2.779 2.779H7.126c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535 0 2.779 1.244 2.779 2.779z"/><path fill="#C6E5B3" d="M10.96 25.971c-.257-1.269-1.378-2.224-2.723-2.224H7.126c-1.345 0-2.466.954-2.724 2.224h6.558z"/><path fill="#3B94D9" d="M34.977 17.633c0 1.535-1.244 2.779-2.779 2.779h-1.112c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535-.001 2.779 1.243 2.779 2.779z"/><path fill="#BBDDF5" d="M34.921 17.077c-.257-1.269-1.378-2.224-2.723-2.224h-1.112c-1.344 0-2.466.954-2.723 2.224h6.558z"/><path fill="#5C913B" d="M31.644 7.887c0 1.535-1.244 2.779-2.779 2.779h-1.112c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535 0 2.779 1.244 2.779 2.779z"/><path fill="#C6E5B3" d="M31.588 7.331c-.257-1.269-1.378-2.224-2.723-2.224h-1.112c-1.344 0-2.466.954-2.723 2.224h6.558z"/><path fill="#BE1931" d="M31.644 26.527c0 1.535-1.244 2.779-2.779 2.779h-1.112c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535 0 2.779 1.244 2.779 2.779z"/><path fill="#F4ABBA" d="M31.588 25.971c-.257-1.269-1.378-2.224-2.723-2.224h-1.112c-1.344 0-2.466.954-2.723 2.224h6.558z"/><path fill="#BE1931" d="M11.017 7.887c0 1.535-1.244 2.779-2.779 2.779H7.126c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535 0 2.779 1.244 2.779 2.779z"/><path fill="#F4ABBA" d="M10.96 7.331c-.257-1.269-1.378-2.224-2.723-2.224H7.126c-1.345 0-2.466.954-2.724 2.224h6.558z"/><path fill="#744EAA" d="M21.284 2.876c0 1.535-1.244 2.779-2.779 2.779h-1.112c-1.535 0-2.779-1.244-2.779-2.779S15.858.097 17.393.097h1.112c1.534-.001 2.779 1.243 2.779 2.779z"/><path fill="#CBB7EA" d="M21.227 2.32C20.97 1.051 19.849.096 18.504.096h-1.112c-1.345 0-2.466.954-2.724 2.224h6.559z"/><path fill="#3B94D9" d="M7.682 17.633c0 1.535-1.244 2.779-2.779 2.779H3.79c-1.535 0-2.779-1.244-2.779-2.779s1.244-2.779 2.779-2.779h1.112c1.535-.001 2.78 1.243 2.78 2.779z"/><path fill="#BBDDF5" d="M7.625 17.077c-.257-1.269-1.378-2.224-2.723-2.224H3.79c-1.345 0-2.466.954-2.724 2.224h6.559z"/><path fill="#553788" d="M14.952 15.847c0-1.68 1.362-3.041 3.041-3.041 1.68 0 3.042 1.362 3.042 3.041s-1.362 3.041-3.042 3.041c-1.679.001-3.041-1.361-3.041-3.041z"/></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D01C3A" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#0020A8" d="M4 5C1.791 5 0 6.791 0 9v18c0 2.209 1.791 4 4 4h8V5H4z"/><path fill="#FEDF00" d="M12 5h12v26H12z"/><path fill="#C7B37F" d="M23.035 19.641c-.159-.472-.563-.382-.563-.225 0 0-.539-.39-.135-1.104 0 0 .786.093.337-.514 0 0 .674-.382.696-1.168.022-.787-.876-1.281-1.258-.967 0 0-.023-.314-.18-.314s-.247.202-.247.202.023-.517.359-.809c.337-.292 1.033-1.079-.428-1.528-1.46-.449-1.527.473-1.303.675 0 0-.359.201-.764.179-.404-.021-.113-.493-.023-.696.09-.202.023-.921-.473-.898-.494.022-.517.225-.696.292-.177.066-.357.021-.357.021s-.18.045-.36-.023c-.179-.067-.202-.269-.696-.292-.495-.023-.562.696-.472.898.09.203.382.675-.023.696-.404.022-.764-.179-.764-.179.225-.202.157-1.124-1.303-.675-1.46.449-.764 1.236-.427 1.528.337.292.36.809.36.809s-.09-.202-.248-.202c-.157 0-.179.314-.179.314-.382-.314-1.281.18-1.259.967.023.786.697 1.168.697 1.168-.45.606.337.514.337.514.404.715-.135 1.104-.135 1.104 0-.157-.404-.247-.564.225-.159.472.316.629.316.629-.629.81-.225 1.573.382 2.022.607.449 1.775.383 2.359.427.584.045.697.337.697.337-.449.428.225.765.225.765.135.449.674-.045.674-.045l.383.338.382-.337s.54.494.674.045c0 0 .675-.337.225-.765 0 0 .113-.292.697-.337.584-.044 1.753.022 2.359-.427.606-.449 1.011-1.213.382-2.022 0 .001.475-.157.316-.628z"/><path fill="#D01C3A" d="M17.82 17.641v-2.966h-2.966v2.966h2.966z"/><path fill="#FEDF00" d="M15.933 16.506l-.882.91.138.157.744-.82zm1.449-1.157s.391.102.391-.247-.234-.349-.312-.349c-.079 0-.438.057-.45.202-.011.146.141.236.059.315-.081.078-.302.273-.302.273l.131.156s.188-.156.337-.373c.076-.11.018-.378.09-.394.213-.044.292.057.281.136-.011.078-.146.157-.146.157l-.079.124z"/><path fill="#FFF" d="M16.652 16.91s.056.416.258.438c.202.022.27-.646.601-.646.332 0 .365.579 0 .669l-.05-.168s.236-.236.067-.271c-.168-.033-.247.18-.269.271-.023.09-.158.325-.36.325-.337 0-.382-.309-.433-.547-.05-.239.186-.071.186-.071zm-.6 0s-.056.416-.259.438c-.202.022-.27-.646-.601-.646-.332 0-.366.579 0 .669l.05-.168s-.236-.236-.067-.271c.168-.033.247.18.269.271.023.09.157.325.359.325.337 0 .382-.309.433-.547.052-.239-.184-.071-.184-.071z"/><path fill="#FFF" d="M16.394 14.798l.865 1.101-.433 1.18s-.174-.102-.433-.102-.461.102-.461.102l-.46-1.191.922-1.09z"/><path fill="#FEDF00" d="M16.466 15.18l.604.725-.306.927-.292-.09zm-.199 0l-.604.725.306.927.292-.09zm-1.413 2.73v1.843c0 1.214.886 1.381 1.648 1.214.614-.136 1.318 0 1.318 0V17.91h-2.966z"/><path d="M16.502 20.967l.06-.012V17.91h-.45v3.108c.131-.005.262-.024.39-.051zm.959-.046V17.91h-.45v2.998c.165-.005.32.002.45.013zm-1.798.058V17.91h-.449v2.841c.127.115.282.189.449.228z" fill="#D01C3A"/><path fill="#FEDF00" d="M18.18 17.641v-2.966h2.966v2.966H18.18z"/><path fill="#D01C3A" d="M18.539 14.675h.45v2.966h-.45zm.899 0h.45v2.966h-.45zm.899 0h.449v2.966h-.449z"/><path fill="#FEDF00" d="M21.146 17.91v1.843c0 1.214-.886 1.381-1.648 1.214-.614-.136-1.318 0-1.318 0V17.91h2.966z"/><path fill="#D01C3A" d="M18.629 18.404l.281-.225h.348v.181s.495-.008.899-.049c.404-.042.528.262.404.34-.123.079.022.383 0 .528-.022.146-.292.359-.225.236.067-.124 0-.461 0-.461s-.078.259-.146.337c-.068.079-.304.09-.214.023s.18-.213.101-.292c-.078-.078-.431-.09-.446-.056-.014.033-.081.426-.126.449-.046.022-.102-.034-.068-.157.034-.124 0-.337 0-.337s-.235-.012-.225.09c.012.101.113.146.091.225-.023.078-.169.18-.18.045-.012-.135-.236-.225-.135-.292.101-.067.203-.173.203-.173s-.127-.029-.216-.153c-.09-.123-.166-.112-.346-.112-.09 0 0-.147 0-.147zm0 1.349l.281-.225h.348v.18s.495-.007.899-.049c.404-.041.528.262.404.341-.123.079.022.382 0 .528-.022.146-.292.358-.225.236.067-.124 0-.461 0-.461s-.078.258-.146.337c-.068.079-.304.09-.214.022.09-.067.18-.214.101-.292-.078-.078-.431-.09-.446-.057-.014.034-.081.427-.126.45-.046.021-.102-.034-.068-.158.034-.123 0-.337 0-.337s-.235-.011-.225.09c.012.101.113.146.091.225-.023.079-.169.181-.18.045-.012-.134-.236-.225-.135-.292.101-.067.203-.173.203-.173s-.127-.029-.216-.152c-.09-.124-.166-.112-.346-.112-.09 0 0-.146 0-.146z"/><path fill="#AF9167" d="M14.629 21.191c0 .033 1.652.482 1.837.517.186.033.118.415-.129.393-.247-.021-1.472-.291-1.629-.37-.157-.08-.079-.54-.079-.54zm2.27.556s.495.067.921.085c.427.017.719-.02.719-.02l.304.412s-.528.057-.888.057c-.359 0-.944-.057-.944-.057l-.112-.477zm2.157 0s.708-.129 1.136-.231c.427-.101.988-.303 1.135-.325.146-.023.247.241.291.277l.045.037s-.741.348-1.101.449c-.359.102-1.506.259-1.506.259s-.164-.436 0-.466z"/></svg>

After

Width:  |  Height:  |  Size: 4.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 11 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E32118" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#EEE" d="M0 13h36v10H0z"/><path fill="#3E9A00" d="M32 5H4C1.791 5 0 6.791 0 9v4h36V9c0-2.209-1.791-4-4-4z"/><path fill="#0173CE" d="M7.333 13L1.91 5.604C.768 6.308 0 7.56 0 9v18c0 1.44.768 2.692 1.91 3.396L7.333 23 11 18l-3.667-5z"/><path d="M18.443 15h-2.396v4.75c0 .969.547 1.125.828 1.125h.922c.578 0 .646.479.646.479s.068-.479.646-.479h.922c.281 0 .828-.156.828-1.125V15h-2.396z"/><path fill="#FFF" d="M18.443 20.93c-.133-.141-.339-.255-.646-.255h-.922c-.188 0-.628-.09-.628-.925V15.2h4.392v4.55c0 .835-.439.925-.628.925h-.921c-.308 0-.514.114-.647.255z"/><path d="M14.922 18.703s.249.438.562.734c.578.547-.352.984-.352.984s-.289-.188-.383-.406c-.093-.218.235-.874.173-1.312z"/><path fill="#FFF" d="M15.148 20.185c-.085-.069-.179-.164-.215-.248-.015-.056.04-.273.077-.418.021-.078.041-.16.06-.243.082.104.176.213.276.308.143.135.129.22.125.248-.02.131-.189.27-.323.353z"/><path d="M15.202 19.73s.001.776.767 1.081c.943.376 1.594.22 1.672.251.078.031 0 .797 0 .797s-1.043.172-1.967-.266c-.924-.438-.877-.782-.829-.876.048-.094.11-.161.155-.405.042-.227.202-.582.202-.582z"/><path fill="#FFF" d="M17.134 21.692c-.357 0-.887-.048-1.374-.279-.668-.316-.75-.56-.735-.608.066-.115.122-.212.164-.414.128.229.343.462.706.607.452.181.913.271 1.37.271.082 0 .153-.002.211-.005.001.105-.007.262-.019.416-.082.007-.192.012-.323.012z"/><path d="M21.965 18.703s-.249.438-.562.734c-.578.547.352.984.352.984s.289-.188.383-.406c.092-.218-.236-.874-.173-1.312z"/><path fill="#FFF" d="M21.738 20.185c.085-.069.179-.164.215-.248.015-.056-.04-.273-.077-.418-.021-.078-.041-.16-.06-.243-.082.104-.176.213-.276.308-.143.135-.129.22-.125.248.02.131.189.27.323.353z"/><path d="M21.685 19.73s-.001.776-.767 1.081c-.943.376-1.594.22-1.672.251-.078.031 0 .797 0 .797s1.043.172 1.967-.266.877-.782.829-.876c-.049-.094-.11-.161-.155-.405-.042-.227-.202-.582-.202-.582z"/><path fill="#FFF" d="M19.753 21.692c.358 0 .887-.048 1.374-.279.668-.316.75-.56.735-.608-.066-.115-.122-.212-.164-.414-.128.229-.343.462-.706.607-.452.181-.913.271-1.37.271-.082 0-.153-.002-.211-.005-.001.105.007.262.02.416.081.007.191.012.322.012z"/><path d="M19.715 21.354s-.012.338-1.271.338c-1.26 0-1.271-.338-1.271-.338s-.047.538 0 .755.375.344 1.271.344c.896 0 1.225-.127 1.271-.344.047-.216 0-.755 0-.755z"/><path fill="#FFF" d="M18.443 22.253c-1.007 0-1.072-.167-1.076-.185-.015-.067-.018-.19-.016-.319.219.083.56.145 1.092.145.531 0 .873-.061 1.092-.145.002.13-.001.252-.016.319-.003.018-.069.185-1.076.185z"/><path fill="#FFD701" d="M17.854 13.476l.169.293h.339l-.17.293.17.294h-.339l-.169.293-.169-.293h-.339l.169-.294-.169-.293h.339zm-1.339.155l.23.248.33-.076-.099.324.231.248-.33.076-.099.324-.231-.248-.33.076.098-.324-.23-.248.33-.076zm-1.259.431l.273.201.31-.138-.037.338.274.199-.309.137-.036.337-.274-.2-.309.137.035-.336-.274-.2.31-.137zm3.862-.586l-.169.293h-.339l.17.293-.17.294h.339l.169.293.17-.293h.339l-.169-.294.169-.293h-.339zm1.34.155l-.23.248-.331-.076.1.324-.231.248.33.076.098.324.232-.248.33.076-.099-.324.231-.248-.33-.076zm1.259.431l-.274.201-.309-.138.037.338-.275.199.31.137.036.337.274-.2.309.137-.035-.336.273-.2-.309-.137z"/><path fill="#A36629" d="M18.443 20.625c-.6 0-.693-.219-.49-.688.203-.469.312-1.104.312-1.873 0-.768-.273-.94-.59-1.237-.316-.297.162-.188.384 0s.303.359.303.359v-.719l.248.078v.547s.36-.312.602-.344c.241-.031.382.156.069.25-.312.094-.671.255-.671 1.065 0 .81.124 1.654.28 1.951.157.298.153.611-.447.611z"/><path fill="#009A3B" d="M17.75 17.547c-.318.167-.543-.203-.543-.203s-.289.203-.561.062c-.271-.141-.229-.266 0-.391s.505-.156.505-.156.071-.344.194-.578c.123-.234.33-.328.33-.328s.252-.547.687-.578c.435-.031.435.422.435.422s.27 0 .322.156c.24-.25.662-.219.756-.109.094.109 0 .344 0 .344s.371-.109.451.016c.08.125 0 .286 0 .286s.299.058.158.386-.578.234-.578.234-.178.188-.37.172c-.192-.016-.255-.282-.255-.282s-.298.078-.484-.188c-.187.281-.531.125-.578.016-.047.36-.141.547-.469.719z"/></svg>

After

Width:  |  Height:  |  Size: 4.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#D21C33" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#00209F" d="M32 5H4C1.791 5 0 6.791 0 9v9h36V9c0-2.209-1.791-4-4-4z"/><path fill="#FFF" d="M12 13.041h11.906V23H12z"/><path fill="#006A16" d="M23.906 21.622c-1.499-.761-3.529-1.237-5.901-1.237-2.37 0-4.506.476-6.005 1.237V23h11.906v-1.378z"/><path fill="#00209F" d="M15.523 16.72l1.165 1.311-.146.822-.252-.143-.227.858h-.059l-.107.453-1.979-.167.048-1.412.477.137.058-1.318.693.471.035-.798z"/><path fill="#D21C33" d="M18.005 19.282v2.002l-1.5-.441-.382-.56-.262-.191.143-.506.226-.876h.346l.085-.739zm-4.313-.906c.179-.214.513-.071.524 0 .012.072-.131.059-.262.179-.131.119-.095.488-.322.441-.226-.048.06-.62.06-.62zm.809-1.115c.231-.156.513.074.504.146-.009.072-.143.021-.301.099-.159.078-.227.443-.432.334-.204-.109.229-.579.229-.579zm.954-.682c.249-.125.499.14.481.21-.018.07-.193-.054-.36.003-.168.057-.234.466-.423.331-.189-.134.302-.544.302-.544z"/><path fill="#F1B517" d="M14.945 16.023l.773.471-.085.226 2.087 2.311v.179l-2.169-2.431-.283-.047zm-1.11.697s.775.298.775.334c0 .036.142.274.142.274l2.824 2.288-.083.108-2.801-2.288-.405-.179-.452-.537zm-.822 1.174s.894.125.906.161c.012.036.072.239.072.239l3.276 1.787-.143.084-3.193-1.765-.369-.024-.549-.482z"/><path fill="#F1B517" d="M13.788 19.592l3.367.411-.319.384-.499.05.373.501-.18.203-.501-.548s-.155.798-.834.798-.895-.679-.895-.906c0-.227.06-.345.06-.345h-.644l.072-.548z"/><path fill="#00209F" d="M20.445 16.648l-1.217 1.443.05.833.313-.214.226.858h.06l.107.453 1.978-.167-.048-1.412-.476.137-.059-1.318-.692.471-.037-.798z"/><path fill="#D21C33" d="M18.005 19.282v2.002l1.436-.441.349-.56.246-.191-.151-.506-.235-.876-.266.198-.092-.817zm4.183-.906c-.18-.214-.514-.071-.525 0-.012.072.132.059.263.179.131.119.096.488.322.441.226-.048-.06-.62-.06-.62zm-.809-1.115c-.231-.156-.512.074-.504.146.009.072.143.021.302.099s.226.443.432.334c.203-.109-.23-.579-.23-.579zm-.953-.682c-.25-.125-.498.14-.481.21.018.07.192-.054.359.003.168.057.235.466.424.331.189-.134-.302-.544-.302-.544z"/><path fill="#F1B517" d="M20.935 16.023l-.772.471.149.226-2.02 2.311v.179l2.103-2.431.251-.047zm1.11.697s-.774.298-.774.334c0 .036-.143.274-.143.274l-2.824 2.288.084.108 2.8-2.288.404-.179.453-.537zm.822 1.174s-.894.125-.905.161c-.013.036-.071.239-.071.239l-3.277 1.787.143.084 3.193-1.764.37-.024.547-.483z"/><path fill="#F1B517" d="M22.093 19.592l-3.366.411.319.384.498.05-.373.501.181.203.501-.548s.155.798.834.798c.68 0 .894-.679.894-.905 0-.227-.059-.345-.059-.345h.643l-.072-.549z"/><path fill="#FFF" d="M22.86 22.142s-.59.021-1.209-.113c-.619-.135-.726-.377-.995-.323-.269.054-.893.285-1.404.351-.512.064-1.247.086-1.247.086s-.676-.021-1.188-.086c-.512-.066-1.077-.297-1.347-.351-.269-.054-.377.189-.997.323-.619.135-1.212.113-1.212.113l.162.286-.162.14c1.401.026 2.048-.426 2.048-.426.7.464 2.696.477 2.696.477s2.056-.013 2.756-.477c0 0 .676.452 2.076.426l-.148-.14.171-.286z"/><path fill="#F1B517" d="M18.292 17.894c0 1.49-.13 2.699-.292 2.699-.161 0-.292-1.209-.292-2.699 0-1.491.131-2.699.292-2.699.162 0 .292 1.208.292 2.699z"/><path fill="#D21C33" d="M17.434 20.426h1.144v1.145h-1.144z"/><path fill="#FFF" d="M18.649 20.354c0 .132-.274.238-.614.238-.339 0-.614-.107-.614-.238s.275-.238.614-.238c.34 0 .614.107.614.238z"/><path fill="#D21C33" d="M18.649 21.498c0 .132-.274.238-.614.238-.339 0-.614-.106-.614-.238s.275-.238.614-.238c.34 0 .614.106.614.238z"/><path fill="#006A16" d="M20.514 14.694c-.229-.274-.818-.262-1.218-.274-.399-.012-.601.131-.422-.059s.455-.142.746-.155c.292-.012.343-.047.164-.142-.179-.095-.493-.213-.91-.106-.409.105-.667.36-.885.404-.218-.043-.491-.299-.9-.404-.417-.107-.74.01-.918.106-.179.095-.131.13.161.142.292.012.565-.036.744.155.179.191-.024.047-.423.059-.399.012-.989 0-1.218.274-.229.274.199.095.426.059.226-.036.56-.047.56-.047s-.56.166-.715.381c-.155.214.047.405.334.238.286-.167.727-.393.965-.417 0 0-.62.258-.894.481-.274.223.013.199.221.199s.422-.083.601-.215c.179-.131-.118.262-.167.513-.047.25.322.191.388 0 .065-.191.279-.572.279-.572s-.094.548-.082.918c.012.37.134.393.229.226s.425.099.425.099.3-.266.395-.099c.096.167.186.143.198-.226.012-.369-.083-.918-.083-.918s.214.381.28.572c.065.191.435.25.387 0-.047-.25-.345-.644-.166-.513.179.131.393.215.601.215.209 0 .495.024.222-.199-.274-.223-.894-.481-.894-.481.239.024.679.25.965.417.286.167.488-.024.333-.238-.155-.215-.715-.381-.715-.381s.334.012.561.047c.226.037.654.215.425-.059z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#E8112D" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#FFCC4D" d="M18.473 11.986c.014-1.045.94-1.764.979-3.156.663.834-.433 2.397-.044 3.304.178-1.029 1.203-1.595 1.461-2.963.525.928-.803 2.3-.561 3.256.336-.99 1.438-1.387 1.906-2.699.373.999-1.152 2.146-1.062 3.128.486-.924 1.637-1.144 2.305-2.367.213 1.045-1.475 1.939-1.539 2.924.625-.837 1.797-.875 2.647-1.978.047 1.066-1.76 1.684-1.977 2.647.748-.729 1.91-.583 2.922-1.54-.119 1.06-2 1.389-2.367 2.306.854-.603 1.98-.277 3.129-1.063-.283 1.028-2.193 1.059-2.697 1.907.936-.462 1.996.036 3.256-.561-.441.97-2.334.702-2.965 1.461.998-.31 1.969.349 3.305-.044-.59.89-2.414.328-3.156.979 1.033-.15 1.889.651 3.269.473-.719.787-2.435-.053-3.269.473 1.045.014 1.764.941 3.154.978-.834.666-2.396-.434-3.303-.043 1.031.178 1.596 1.203 2.965 1.461-.928.525-2.301-.803-3.258-.561.99.336 1.389 1.438 2.699 1.906-.998.375-2.144-1.152-3.129-1.062.926.486 1.147 1.637 2.367 2.305-1.045.213-1.938-1.475-2.924-1.539.838.625.875 1.797 1.979 2.647-1.065.047-1.686-1.76-2.647-1.977.729.748.582 1.91 1.539 2.922-1.061-.119-1.389-2-2.305-2.367.602.854.275 1.98 1.062 3.129-1.029-.283-1.059-2.193-1.906-2.697.463.936-.037 1.996.561 3.256-.971-.441-.703-2.334-1.461-2.965.309.998-.348 1.969.044 3.305-.89-.59-.328-2.414-.979-3.156.15 1.033-.651 1.889-.473 3.269-.787-.719.053-2.435-.473-3.269-.014 1.045-.94 1.764-.979 3.154-.665-.832.433-2.396.043-3.303-.177 1.031-1.203 1.596-1.46 2.965-.525-.928.803-2.301.56-3.256-.336.988-1.438 1.387-1.906 2.697-.374-.998 1.153-2.144 1.063-3.129-.487.926-1.638 1.147-2.305 2.367-.213-1.045 1.475-1.938 1.539-2.922-.625.836-1.796.873-2.646 1.977-.048-1.065 1.76-1.686 1.977-2.647-.748.729-1.911.582-2.923 1.539.12-1.061 2.002-1.389 2.367-2.305-.853.602-1.979.275-3.128 1.062.284-1.029 2.194-1.059 2.698-1.906-.937.463-1.997-.035-3.256.561.442-.971 2.333-.703 2.964-1.461-.998.309-1.967-.348-3.304.043.588-.888 2.414-.328 3.155-.978-1.034.15-1.888-.652-3.269-.473.72-.786 2.435.053 3.269-.473-1.044-.014-1.763-.94-3.155-.979.834-.665 2.397.433 3.304.043-1.03-.177-1.595-1.203-2.963-1.46.928-.526 2.3.803 3.256.56-.99-.336-1.387-1.438-2.699-1.906.999-.374 2.146 1.153 3.128 1.063-.925-.487-1.144-1.638-2.367-2.305 1.045-.213 1.939 1.475 2.924 1.539-.837-.625-.875-1.796-1.978-2.646 1.065-.047 1.684 1.76 2.647 1.977-.729-.748-.583-1.911-1.54-2.923 1.059.12 1.389 2.002 2.306 2.367-.604-.853-.277-1.978-1.063-3.128 1.028.284 1.059 2.194 1.907 2.698-.462-.937.036-1.997-.561-3.255.97.441.702 2.332 1.461 2.963-.31-.998.349-1.967-.044-3.304.89.588.328 2.414.979 3.155-.151-1.034.651-1.888.473-3.269.786.719-.054 2.435.472 3.269z"/><path fill="#E8112D" d="M18.001 22.906c2.709 0 4.905-2.197 4.905-4.906 0-2.71-2.195-4.905-4.905-4.905-2.709 0-4.905 2.196-4.905 4.905s2.196 4.906 4.905 4.906z"/><g fill="#FFCC4D"><path d="M18 13.451c1.252 0 2.377.536 3.16 1.393-1.229.124-2.271.414-3.16.855-.889-.441-1.932-.731-3.159-.855.783-.857 1.908-1.393 3.159-1.393zm-.323 2.422c-.099.055-.195.112-.29.171-.797-.423-1.752-.696-2.887-.777.052-.073.106-.145.163-.214 1.179.105 2.174.387 3.014.82zm.649 0c.099.055.195.112.289.171.798-.423 1.752-.696 2.887-.777-.051-.073-.106-.145-.162-.214-1.18.105-2.174.387-3.014.82zm-3.969-.386c-.045.073-.088.148-.129.225 1.056.024 1.942.268 2.67.67.076-.058.154-.113.232-.167-.76-.415-1.679-.674-2.773-.728zm-.13 4.258c-.368-.633-.504-1.232-.504-2.016 0-.64.138-1.244.388-1.787 1.022-.007 1.877.216 2.575.604-1.033.847-1.872 1.839-2.459 3.199zm2.03 1.888c-.192-.074-.401-.283-.579-.383.101-1.607.853-2.929 1.901-4.041.078.076.153.152.225.233-.974 1.139-1.6 2.617-1.547 4.191zm5.389-6.146c.045.073.088.148.129.225-1.057.024-1.943.268-2.67.67-.076-.058-.154-.113-.233-.167.761-.415 1.679-.674 2.774-.728z"/><path d="M21.775 19.746c.367-.633.504-1.233.504-2.017 0-.64-.139-1.244-.389-1.787-1.021-.007-1.877.216-2.575.604 1.035.847 1.875 1.84 2.46 3.2zm-3.774-1.938c.767 1.234.914 2.584.872 4.109-.333.082-.513.09-.872.09s-.539-.008-.872-.09c-.042-1.447.105-2.828.872-4.109zm1.739 3.825c.191-.074.406-.221.584-.32-.101-1.607-.854-2.992-1.902-4.103-.077.076-.152.152-.224.233.976 1.138 1.595 2.616 1.542 4.19zm-2.416-4.652c-.091-.075-.194-.154-.293-.222-1.085.962-1.891 2.08-2.343 3.595.167.191.164.332.362.49.28-1.593 1.187-2.812 2.274-3.863zm1.355 0c.091-.075.194-.154.293-.222 1.085.962 1.888 2.1 2.341 3.616-.168.191-.192.312-.392.47-.279-1.594-1.155-2.813-2.242-3.864zm-.678-.927c.054.032.239.148.286.179-.073.045-.24.158-.286.189-.045-.032-.213-.145-.286-.189.047-.031.232-.148.286-.179zm-.541.357c-.073.055-.184.14-.226.176.105.069.246.176.291.211.055-.047.163-.143.224-.187-.074-.055-.232-.169-.289-.2zm1.082 0c.073.055.184.14.226.176-.105.069-.246.176-.291.211-.054-.047-.163-.143-.224-.187.075-.055.233-.169.289-.2zm-.541.399c.047.04.186.163.223.2-.066.058-.168.155-.223.216-.054-.061-.156-.158-.222-.216.036-.037.176-.159.222-.2z"/></g></svg>

After

Width:  |  Height:  |  Size: 4.9 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#EEE" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#CE1126" d="M32 5H4C1.791 5 0 6.791 0 9v9h35.926L36 9c0-2.209-1.791-4-4-4z"/><path fill="#FFAC33" d="M20.878 17.737c.277-.377.663-.375 1.124-.135-.064-.611-.793-.997-1.122-1.049.134-.45.565-.675 1.078-.608-.266-.553-1.146-.571-1.475-.504-.025-.471.306-.832.808-.948-.434-.427-1.267-.137-1.555.038-.18-.433.007-.887.442-1.171-.552-.251-1.239.311-1.449.576-.317-.344-.292-.836.021-1.253-.604-.045-1.059.725-1.167 1.046-.414-.212-.557-.681-.406-1.182-.58.169-.749 1.049-.741 1.388-.459-.055-.753-.447-.78-.971-.488.361-.351 1.246-.229 1.562-.451.109-.859-.159-1.06-.641-.337.509.09 1.293.311 1.547-.388.258-.86.15-1.212-.235-.146.596.52 1.185.814 1.347-.277.377-.444.654-.904.417.063.611.575.715.905.766l6.597.01z"/><path fill="#FFF100" d="M19.922 17.142l2.266-.823-2.404.012 1.85-1.563-2.257.848 1.213-2.112-1.836 1.581.429-2.406-1.193 2.123-.407-2.409-.407 2.409-1.192-2.123.429 2.406-1.835-1.581 1.212 2.112-2.257-.848 1.851 1.563-2.407-.012 2.268.823z"/><path fill="#FFF100" d="M17.583 19.521c1.292 0 2.339-1.064 2.339-2.377 0-1.313-1.047-2.377-2.339-2.377s-2.339 1.063-2.339 2.377c0 1.312 1.047 2.377 2.339 2.377z"/><path fill="#F15A29" d="M17.583 19.551c-1.307 0-2.369-1.08-2.369-2.407s1.062-2.406 2.369-2.406c1.306 0 2.369 1.079 2.369 2.406s-1.063 2.407-2.369 2.407zm0-4.754c-1.273 0-2.31 1.053-2.31 2.347s1.036 2.347 2.31 2.347c1.273 0 2.309-1.053 2.309-2.347s-1.036-2.347-2.309-2.347z"/><path fill="#FFAC33" d="M17.438 9.504c-.188-.253-.421-.522-.702-.649-.281-.126-.783-.205-1.325-.063-.607.158-1.331.403-1.901.237-.109-.031-.187.08.031.206.218.127.772.159 1.324.087.39-.05.905-.032 1.107.047.242.095.678.42.865.752l.601-.617zm1.231 1.378c.169-.067.553-.099.708-.073.204.034.486-.067.579-.109.168-.075-.011-.203-.663-.166-.429.023-.595.212-.624.348z"/><path fill="#FCD116" d="M21.094 8.491c-1.349-.063-1.692.214-2.346.269-.598.05-.974.232-1.278.586-.273.317-.544.605-.694.705-.018.012-.029.025-.044.038-.222-.016-.445-.105-.572-.228-.211-.205-.494-.229-.701-.02-.039.04-.086.104-.215.104-.222 0-.576.004-.581.376.117-.147.199-.171.577-.171.058 0 .129.028.187.127.086.146.276.261.468.265.19.004.271.133.397.269.367.396 1.185.657 1.949.364.395-.151.765-.666 1.435-.649.639.016.973-.19.421-.333-.554-.142-.976-.087-1.349-.015-.132.025-.265.006-.404-.026.054-.014.094-.045.107-.097.097.036.245-.023.277-.127.096.04.24-.016.277-.11.128.047.26.012.318-.103.085.051.233-.004.257-.123.086.056.219.048.25-.079.109.075.241.016.234-.111.05.024.154 0 .163-.079.202.008.459 0 .459-.15.172.008.413-.07.408-.256.12-.008.273-.102.309-.234.034-.111-.091-.182-.309-.192z"/><path fill="#EEE" d="M15 18h5v2h-5z"/><path fill="#00247D" d="M35.926 27.733c-.384.211-.818.313-1.562.313-1.817 0-1.817-.984-3.636-.984-1.818 0-1.818 1-3.693 1-1.762 0-1.762-1-3.608-1-1.789 0-1.789 1-3.607 1-1.818 0-1.818-1-3.637-1-1.818 0-1.818 1-3.636 1s-1.818-1-3.636-1-1.818 1-3.636 1-1.818-1-3.637-1c-.762 0-1.201.178-1.591.383C.269 29.441 1.943 31 4 31h28c1.958 0 3.581-1.408 3.926-3.267zm.074-2.35v-1.944c-.402.228-.846.374-1.637.374-1.817 0-1.817-1.007-3.636-1.007-1.818 0-1.818 1-3.693 1-1.762 0-1.762-1-3.608-1-1.789 0-1.789 1-3.607 1-1.818 0-1.818-1-3.637-1-1.818 0-1.818 1-3.636 1s-1.818-1-3.636-1-1.818 1-3.636 1-1.818-1-3.637-1c-.791 0-1.234.19-1.636.404v2c.402-.214.846-.404 1.636-.404 1.818 0 1.818 1 3.637 1 1.818 0 1.818-1 3.636-1s1.818 1 3.636 1 1.818-1 3.636-1 1.818 1 3.637 1c1.818 0 1.818-1 3.629-1 1.825 0 1.825 1 3.64 1 1.822 0 1.822-1 3.639-1 2.378 0 2.323.991 3.638.991.789 0 1.233-.207 1.635-.414zm0-4.257v-1.944c-.402.228-.846.365-1.637.365-1.817 0-1.817-.999-3.636-.999-1.818 0-1.818 1-3.693 1-1.762 0-1.762-1-3.608-1-1.789 0-1.789 1-3.607 1-1.818 0-1.818-1-3.637-1-1.818 0-1.818 1-3.636 1s-1.818-1-3.636-1-1.818 1-3.636 1-1.818-1-3.637-1c-.791 0-1.234.191-1.636.404v2c.402-.214.846-.404 1.636-.404 1.818 0 1.818 1 3.637 1 1.818 0 1.818-1 3.636-1s1.818 1 3.636 1 1.818-1 3.636-1 1.818 1 3.637 1c1.818 0 1.818-1 3.629-1 1.825 0 1.825 1 3.64 1 1.822 0 1.822-1 3.639-1 1.82 0 1.82.969 3.638.969.789.001 1.233-.184 1.635-.391z"/><path fill="#EEE" d="M36 19.125v-1.979c-.402.228-.846.43-1.637.43-1.817 0-1.817-1.063-3.636-1.063-1.818 0-1.818 1-3.693 1-1.762 0-1.762-1-3.608-1-1.789 0-1.789 1-3.607 1-1.818 0-1.818-1-3.637-1-1.818 0-1.818 1-3.636 1s-1.818-1-3.636-1-1.818 1-3.636 1-1.818-1-3.637-1c-.791 0-1.234.19-1.636.404v2c.402-.213.846-.404 1.636-.404 1.818 0 1.818 1 3.637 1 1.818 0 1.818-1 3.636-1s1.818 1 3.636 1 1.818-1 3.636-1 1.818 1 3.637 1c1.818 0 1.818-1 3.629-1 1.825 0 1.825 1 3.64 1 1.822 0 1.822-1 3.639-1 1.82 0 1.82.987 3.638.987.789 0 1.233-.168 1.635-.375z"/></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.8 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 26 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#00785E" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><g fill-rule="evenodd" clip-rule="evenodd"><path fill="#FBD116" d="M17.976 8.567c.181.347.279.775.407 1.174h1.272c-.328.256-.678.489-1.008.743.094.41.248.759.36 1.15-.068.027-.164-.064-.24-.119-.22-.163-.513-.383-.742-.552-.373.186-.713.533-1.031.695.101-.402.257-.749.36-1.151-.307-.277-.657-.51-1.007-.743.367-.056.839-.008 1.246-.023.143-.375.278-.76.383-1.174zm-5.441 3.404c.246-.147.466-.317.695-.479-.104-.247-.149-.554-.264-.791.221.075.458.341.695.479.247-.144.469-.314.695-.479-.019.229-.18.523-.239.791.184.214.439.358.67.527-.241.058-.589.014-.838 0-.124.243-.21.525-.288.815-.126-.233-.192-.527-.264-.815h-.647c-.017-.07-.196.021-.215-.048zm10.714.048h-.623c-.103.257-.168.551-.264.815-.109-.259-.193-.543-.289-.815-.27.024-.561.029-.862.024.208-.192.464-.335.671-.527-.066-.293-.178-.541-.264-.815.243.149.465.319.695.479.271-.138.46-.356.719-.503-.104.246-.148.554-.264.79.202.198.454.346.695.504-.018.069-.196-.022-.214.048zM11.266 13.48c.117.226.118.568.191.839.301.019.569.069.862.096-.241.142-.48.286-.742.407.016.304.095.545.144.815-.07.016-.21-.121-.312-.216-.112-.104-.213-.236-.311-.311-.27.122-.498.284-.767.407.12-.248.219-.516.359-.743-.169-.239-.4-.414-.623-.599.251-.043.571.051.839.072.138-.237.254-.496.36-.767zm13.804.767c.288-.031.559-.081.863-.096-.204.206-.435.381-.625.6.129.24.229.507.361.743-.229-.052-.505-.263-.744-.383-.232.15-.441.453-.646.551.042-.277.122-.517.144-.814-.236-.148-.476-.292-.743-.408.243-.077.558-.081.839-.119.105-.237.107-.58.192-.839.133.241.248.501.359.765z"/><path fill="#FFF" d="M21.427 23.211c-1.558-.08-2.548-.728-3.451-1.463-.844.776-1.874 1.368-3.402 1.463h-4.506c.005.019 0 .047.023.047.104.16.209.318.336.455 1.401.096 3.067.049 4.481.025 1.357-.082 2.26-.617 3.092-1.223.829.608 1.735 1.14 3.091 1.223 1.441.023 3.107.07 4.482-.025.121-.145.232-.295.336-.455.007.003.019-.004.025 0-.176-.107-.718-.047-1.008-.047h-3.499zm3.594 1.149c.042.007.084-.093 0-.071-4.689.031-9.494-.064-14.092.048.024 0 .028.019.048.023.062.07.145.189.24.216.189.052.532 0 .838 0h12.774c.051-.087.143-.129.192-.216zm-.862.839c.024.001.028-.018.048-.024.002-.029.03-.032.023-.071-3.994.078-8.175-.106-12.15 0-.068.002-.271-.068-.288.071.024 0 .029.02.048.024.147.109.29.223.432.335 3.764.041 7.693.041 11.456 0 .142-.112.286-.225.431-.335zm-1.101.79c.063-.046.056-.033 0-.047-.332-.078-.844 0-1.271 0h-8.34c-.155 0-.605-.032-.503.047.281.175.572.339.887.48 2.724.039 5.616.039 8.339 0 .314-.141.606-.304.888-.48zm-1.582.793h.047c-.001-.041-.009-.044-.047-.049-.526-.077-1.158 0-1.75 0-1.762 0-3.616-.039-5.249.049h.049c.861.318 1.788.575 2.924.622.096.056.295.009.431.024h.24c.136-.016.335.031.431-.024 1.13-.051 2.062-.3 2.924-.622z"/><path fill="#FFF" d="M15.915 16.644c.046 1.144.355 2.025.839 2.732-.385-.855-.726-1.797-.623-3.02.133-1.597.953-2.864 1.894-3.618.887.799 1.696 2.014 1.845 3.595.123 1.316-.277 2.358-.743 3.211.521-.669.916-1.671.959-2.9.04-.041.04-.247 0-.288-.031-.839-.218-1.525-.503-2.109.151-.303.396-.515.478-.886.38.602.625 1.34.695 2.253v.743c-.067 1.131-.45 1.947-.91 2.684-.021.003-.074.079-.024.072.049-.087.142-.129.192-.216 1.035-.881 2.253-1.581 4.098-1.653h.432c.045.072-.116.163-.192.264-.082.108-.141.252-.216.336-2.006.039-3.316.774-4.361 1.772.789-.543 1.871-1.156 3.14-1.269 1.213-.108 2.265.079 3.163.455-.255.688-.616 1.269-1.078 1.75-.114.095-.218.198-.312.311-.826.748-1.83 1.316-3.307 1.414h-.575c0 .023.029.018.048.023.1.062.272.048.431.049.113.039.392.039.504 0 1.606-.062 2.612-.727 3.522-1.486.126.09.692.066.576.192-.13.109-.249.229-.359.359-.848.742-1.877 1.302-3.38 1.39h-.504c-1.517-.088-2.552-.658-3.402-1.414-.081-.086-.142-.192-.264-.239-.058.094-.157.146-.215.239-.851.756-1.887 1.325-3.403 1.414h-.503c-1.517-.091-2.558-.654-3.403-1.414-.103-.122-.214-.233-.336-.335.013-.034-.094-.06-.024-.072.21-.022.408-.056.576-.12.937.74 1.925 1.43 3.547 1.486.111.039.391.039.503 0 .158-.001.333.013.431-.049h.048c-.144-.055-.391-.008-.574-.023-1.479-.096-2.481-.667-3.308-1.414-.094-.113-.198-.217-.312-.311-.46-.482-.827-1.059-1.078-1.75.893-.377 1.936-.556 3.139-.455 1.26.107 2.345.702 3.116 1.246.046.058.112.096.168.145-.009-.08-.072-.104-.12-.145-1.071-.956-2.345-1.713-4.339-1.748-.155-.179-.345-.454-.455-.599h.455c1.814.08 3.045.742 4.051 1.629.098.102.175.225.311.287.018-.104-.047.019-.048-.047-.025-.055-.055-.106-.096-.144-.435-.723-.799-1.518-.863-2.612v-.743c.061-.916.331-1.619.672-2.253.126.328.316.595.503.863-.24.526-.42 1.113-.479 1.821-.055.034-.009.168-.024.24v.071c-.043.039-.043.245-.003.286zm.839 2.732c.019.085.061.146.12.191-.019-.085-.062-.145-.12-.191z"/></g></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 24 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 14 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 12 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#00247D" d="M32 5H4c-.205 0-.407.015-.604.045l-.004 1.754-2.73-.004C.244 7.427 0 8.185 0 9v18c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4V9c0-2.209-1.791-4-4-4z"/><path fill="#EEE" d="M27.47 23.513c-4.601-1.797-4.426-5.971-4.239-10.389l.011-.25.206-.141c.379-.26 2.206-.765 4.204-.765 1.999 0 3.825.505 4.204.765l.206.142.011.249c.187 4.418.363 8.592-4.239 10.389l-.182.071-.182-.071z"/><path fill="#FF0" d="M31.572 13.146c-.274-.188-1.982-.677-3.921-.677-1.939 0-3.647.489-3.921.677-.189 4.479-.279 8.261 3.921 9.901 4.202-1.641 4.111-5.422 3.921-9.901z"/><path fill="#8FC5FF" d="M23.668 16c.047 3.191.713 5.77 3.983 7.047 3.271-1.277 3.938-3.855 3.983-7.047h-7.966z"/><path fill="#366CC9" d="M27.651 23.047c1.724-.673 2.72-1.711 3.287-3.006h-6.574c.568 1.295 1.564 2.333 3.287 3.006z"/><path fill="#00D860" d="M27.614 20.793c-.098 0-.177.079-.177.177s.079.177.177.177h2.672c.087-.115.17-.233.246-.353h-2.918zm-.322.906c0 .098.079.177.177.177h2.143c.128-.114.247-.232.359-.353h-2.503c-.097 0-.176.079-.176.176zm-.459.73c0 .098.079.177.177.177h1.566c.199-.112.387-.229.562-.354H27.01c-.098 0-.177.079-.177.177z"/><path fill="#5D3100" d="M24.562 17.886c.168-.449.541-1.084.688-1.104.146-.021 1.746 3.113 1.621 3.26s-1.912.24-2.267.178-.042-2.334-.042-2.334z"/><path fill="#CF6200" d="M26.438 20.562c-.125-.396-2.104-4.084-2.229-4.084-.088 0-.319.34-.493.644.112 1.519.44 2.864 1.232 3.948.667-.056 1.578-.227 1.49-.508z"/><path d="M27.099 16.271h.131v3.792h-.131zm1.333-.105h.131v3.897h-.131zm1.229.105h.131v3.792h-.131z" fill="#FF0"/><path d="M25.312 19.098c.198.055 1.039.521 1.559.677.625.188 1.546.163 1.796.163s.728-.729.937-.729h1.251c.188 0 .124 1.25-.354 1.25h-3.375c-.313 0-1.375-.979-1.583-1.083s-.407-.327-.231-.278z"/><path d="M27.651 16.677c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.088.198.198zm1.325-.198c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109-.001.198.088.198.198zm1.361.396c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm0 1.094c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.088.198.198zm0 .725c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm-1.361-1.486c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm0 .761c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.088.198.198zm0 .725c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm-1.325-1.288c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm0 .761c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109 0 .198.089.198.198zm0 .726c0 .109-.089.198-.198.198h-.692c-.109 0-.198-.089-.198-.198 0-.109.089-.198.198-.198h.692c.109-.001.198.088.198.198z" fill="#EEE"/><path fill="#AC5F1A" d="M25.867 13.241c.023-.165.446-.032.612-.178.166-.146.617-.498.984-.042.205.255.153.43.382.639.229.209 1.446.736 1.842.611-.021.25-.375.375-.375.375s.335.249.377.541c.042.292-.502-.453-1.273-.249-.308.082-.651.403-1.276.249s-.642-1.093-.658-1.487c-.005-.143-.63-.349-.615-.459z"/><path fill="#EEE" d="M26.18 13.156c.03-.134.364.004.51-.104.144-.106.537-.363.805.033.148.221.095.36.268.546.171.185 1.126.697 1.457.623-.033.201-.331.279-.331.279s.255.226.27.467c.015.239-.377-.404-1.018-.29-.256.046-.558.284-1.055.115-.499-.167-.449-.933-.436-1.255.003-.116-.491-.327-.47-.414z"/><path d="M27.375 15.66c0 .041-.033.074-.074.074-.041 0-.075-.033-.075-.074v-.47c0-.041.034-.074.075-.074.041 0 .074.033.074.074v.47zm.554 0c0 .041-.033.074-.074.074-.041 0-.075-.033-.075-.074v-.47c0-.041.034-.074.075-.074.041 0 .074.033.074.074v.47zm-.659-2.394c0 .078-.063.141-.141.141-.078 0-.141-.062-.141-.141 0-.078.062-.141.141-.141.077 0 .141.063.141.141z"/><path fill="#00247D" d="M19 18V5H4c-.32 0-.604.045-.604.045l-.004 1.754-2.73-.004S.62 6.854.535 7C.195 7.589 0 8.272 0 9v9h19z"/><path fill="#EEE" d="M19 5h-2.331L12 8.269V5H7v2.569L3.396 5.045c-.614.094-1.19.325-1.672.665L6.426 9H4.69L.967 6.391c-.11.129-.211.262-.305.404L3.813 9H0v5h3.885L0 16.766V18h3.332L7 15.432V18h5v-3.269L16.668 18H19v-2.029L16.185 14H19V9h-2.814L19 7.029V5z"/><path fill="#CF1B2B" d="M11 5H8v5H0v3h8v5h3v-5h8v-3h-8z"/><path fill="#CF1B2B" d="M19 5h-1.461L12 8.879V9h1.571L19 5.198zm-17.276.71c-.281.195-.534.423-.757.681L4.69 9h1.735L1.724 5.71zM6.437 14L.734 18h1.727L7 14.822V14zM19 17.802v-1.22L15.313 14H13.57z"/></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#3E5EB9" d="M36 27c0 2.209-1.791 4-4 4H4c-2.209 0-4-1.791-4-4V9c0-2.209 1.791-4 4-4h28c2.209 0 4 1.791 4 4v18z"/><path fill="#FFD900" d="M0 10h36v16H0z"/><path fill="#B10D0D" d="M0 11h36v14H0z"/><path fill="#FFF" d="M27.513 16.779l1.562.594 1.531-.594-1.531-.5z"/><path fill="#FFD900" d="M28.531 16.8c0 .155-.126.281-.281.281H5.781c-.155 0-.281-.126-.281-.281 0-.155.126-.281.281-.281H28.25c.155 0 .281.126.281.281z"/><path fill="#FFF" d="M28.513 15.779l1.562.594 1.531-.594-1.531-.5z"/><path fill="#FFD900" d="M29.531 15.8c0 .155-.126.281-.281.281H6.781c-.155 0-.281-.126-.281-.281 0-.155.126-.281.281-.281H29.25c.155 0 .281.125.281.281zm4.196 2.192c0 .233-.188.422-.422.422H3.148c-.233 0-.422-.189-.422-.422 0-.233.189-.422.422-.422h30.156c.234 0 .423.189.423.422z"/><path fill="#FFF" d="M27.229 18.031s-4.058 5.49-9.062 5.49-9.063-5.49-9.063-5.49 4.058-5.49 9.063-5.49 9.062 5.49 9.062 5.49z"/><path d="M18.979 22.354c-.438-.208-1.188-.458-1.167-.646s.583-.25 1.104-.312c.521-.062.5-.312.354-.438s-.75-.292-1.104-.5-.021-.396.297-.646.328-.541.328-.75.25-.646.667-.917.021-.312-.312-.479-.313-.729-.25-1.146.042-.646-.104-.667-.229-.146-.312-.261c-.083-.115 0-.323-.312-.364s-.292-.146-.375-.333-.354-.479-.479-.833c-.105-.298.149-.863.828-1.519-4.993.019-9.036 5.488-9.036 5.488s4.058 5.49 9.063 5.49c.641 0 1.266-.092 1.868-.249-.143-.587-.705-.75-1.058-.918z"/><path fill="#FFF" d="M12.479 16.042h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.855-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438z"/><path d="M19.229 16.042h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.855-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.853-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.855-2.458h.438v1.479h-.438zm0 2.458h.438v1.479h-.438zm.854-2.458h.438v1.479H23.5zm0 2.458h.438v1.479H23.5z"/><path fill="#3D5DA7" d="M15.156 13.594c-.4.265-1.219 1.078-1.266 1.672.172-.156.375-.188.375-.188s-.234.328-.203.734c.141-.156.281-.219.281-.219s.083.375.391.766c.156-.094.203-.25.203-.25s.094.328.422.578c.12-.031.12-.172.12-.172s.193.406.99.578c-.141-.266.312-.635.141-1.052.14.083.281.286.281.286s.14-.203-.141-.578c.172.156.266.292.266.292s.108-.651-.266-1.058c.235.094.438.203.438.203s-.039-.787-.625-1.141c-.751-.451-1.407-.123-1.407-.451zm-11 4.312s.359.328-.141.375c-.5.047-.906.641-.891 1.234l.266-.125s-.078.406.047.672c.109-.266.266-.25.266-.25s.031.391.094.688c.125-.156.109-.328.109-.328s.188.062.281.328.141.469.359.594c.094-.047.141-.172.141-.172s.188.156.484.281c-.062-.422.344-.375.516-.672.062.078.078.234.078.234s.125-.234.125-.469.141-.422.141-.422.016.109 0 .281c.141-.078.172-.969.109-1.25.094.078.172.25.172.25s.109-.453 0-.742-.422-.524-.812-.383c-.391.141-.969-.234-.969-.234s.094.234-.031.312-.016-.124-.344-.202zm27.391-.156s-.312.109-.812.578-.656 1.266-.656 1.266.281-.234.391-.266c-.266.609.25.891.172 1.375.203-.031.391-.391.391-.391s.375.672.906 1.047c.125-.359.484-.656.484-.656l.078.203.219-.547.156.266s.141-.307 0-.646c.021.061.234.224.234.224v-.75s.125.234.219.297c0-.328-.188-.562-.109-.703l.109.193s.094-.521-.453-.928c-.547-.406-1.057-.375-1.169-.32-.113.055-.16-.242-.16-.242z"/><path fill="#A70000" d="M14.859 14.578c.29-.088.188.844-.156 1.219.188-.641-.203-1.109.156-1.219zm.68-.266c.069-.24.569.391 1.21.422-.561.094-1.296-.125-1.21-.422zm-.195.969c.17-.079.219.859 0 1.125.031-.468-.235-1.015 0-1.125zm.625-.234c-.217.059.421.578.781.547-.338-.064-.438-.641-.781-.547zm-.125.995c-.226 0 0 .599.406.739-.141-.219-.042-.739-.406-.739zm-11.61 2.567c.206 0-.062.703-.5.984.235-.343.204-.984.5-.984zm.672-.109c-.167.128.297.699.828.74-.343-.24-.625-.895-.828-.74zm-.5.906c.124-.021.148.653-.203.828.188-.437.016-.796.203-.828zm.594 0c.207-.127.31.402.609.573-.5-.12-.812-.448-.609-.573zm-.257.5c.207-.091.319.659 0 .875.116-.484-.18-.797 0-.875zm26.413-.666c.216-.006-.172.635-.5.807.313-.469.266-.801.5-.807zm.782-.334c-.161.111.297.422.516.422-.271-.084-.313-.562-.516-.422zm-.563 1.073c.165-.126.234.286 0 .583.143-.302-.219-.416 0-.583zm.672-.424c-.171.069.156.555.406.586-.273-.168-.156-.688-.406-.586zm-.235.492c.142-.107.432.594.091.953.162-.521-.359-.75-.091-.953z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#00247D" d="M32 5H4c-.205 0-.407.015-.604.045l-.004 1.754-2.73-.004C.244 7.427 0 8.185 0 9v18c0 2.209 1.791 4 4 4h28c2.209 0 4-1.791 4-4V9c0-2.209-1.791-4-4-4z"/><path fill="#FFF" d="M23 12v3.726c0 5.18 2.887 7.072 5.156 8.305 2.27-1.233 4.802-3.125 4.802-8.305V12H23z"/><path fill="#FEC400" d="M28.156 23.43c-2.202-1.231-4.739-3.008-4.739-7.704v-3.059h9.196v3.059c0 4.696-2.255 6.473-4.457 7.704z"/><path fill="#00A728" d="M29.953 20.984c-.062-.547-.516-2.266-1.047-2.781-.531-.516-.75-.117-.75-.117s-.219-.398-.75.117c-.531.516-.984 2.234-1.047 2.781s.062.672.344.672c.125.266.609.312.609.312s.547.359.844 0c.297.359.844 0 .844 0s.484-.047.609-.312c.282 0 .407-.125.344-.672z"/><path fill="#F0082D" d="M28.953 17.576c0 .476.126.861-.781.861s-.781-.386-.781-.861c0-.476.35-.862.781-.862.432 0 .781.386.781.862z"/><path fill="#FF9F3E" d="M26.484 16.953c-.25.422-.641.125-.812-.375s-.859-.641-1.109-.781-.312-.375 0-.547.125-.391.344-.453c-.281-.062-.533.094-.556 0-.022-.094.196-.354.556-.396-.297-.37-.125-1.151 0-1.167s.381.219.511.453.505.188.474.516c.078.078.344.031.594.438.248.406-.002 2.312-.002 2.312z"/><path fill="#FF927F" d="M26.596 16.891c-.354.027-.486-.281-.549-.734-.062-.453-.703-.284-.406-.962.297-.678.408-.267.438-.793s.202-.963.358-.963c.156 0 .359.484.438.688s.379.156.51.859-.025 1.219-.197 1.375c-.172.156-.25.179-.281.355-.032.175-.079.157-.311.175z"/><path fill="#FE9DE0" d="M26.596 13.906c.107.078.111.188 0 .375-.111.188.072.375.082.688.01.312-.152.422-.118.578.034.156.284.453.253.812-.031.359-.105.469-.217.531-.111.062-.064-.188-.041-.422.023-.234-.133-.5-.211-.734-.078-.234.105-.406.154-.641.049-.234-.076-.448-.092-.693-.015-.244.19-.494.19-.494z"/><path fill="#BA5B1F" d="M30.219 14.5c.047-.344.031-.875-.078-1.062-.109-.188-.281-.297-.172-.328.109-.031.625.516.344 1.625-.282 1.109-.094-.235-.094-.235z"/><path fill="#BA5B1F" d="M30.164 14.404c-.211-.123-.484-.436-.457-.607.027-.172.23-.484.262-.422.031.062-.094.256 0 .511s.14.269.267.439c.126.171-.072.079-.072.079zm-.115.237c-.126-.152-1.517-1.047-1.377-1.109s1.338.688 1.528 1.109c.191.421-.151 0-.151 0z"/><path fill="#BA5B1F" d="M29.969 14.906c-.509-.505-1.766-.594-1.703-.672s1.674.07 1.899.535c.226.465-.196.137-.196.137z"/><path fill="#BA5B1F" d="M29.934 15.173c-.574-.298-1.578-.361-1.67-.345-.092.016.969-.298 1.727.171.759.47-.057.174-.057.174zm.035.421c-.594-.266-1.469-.188-1.625-.094-.156.094.453-.354.875-.31.422.044.83.132.946.213.116.081.011.283-.196.191z"/><path fill="#BA5B1F" d="M30.315 14.401c-.072-.384-.073-.708-.588-.669-.515.039-.608 1.002-.479 2.346.128 1.344-.028 1.784-.052 1.861-.023.077.287-.267.265-.861-.022-.594-.153-1.899-.111-2.379.042-.48.275-.84.585-.746.31.095.24.336.231.629-.01.293.149-.181.149-.181z"/><path fill="#BA5B1F" d="M30.656 16.9s.156-.088.359-1.15c.203-1.062-.234-1.516-.625-1.516s-.828.453-.625 1.516c.203 1.062.359 1.15.359 1.15s-.479.455-.411.676c.067.221.677.226.677.226s.609-.005.677-.226c.068-.221-.411-.676-.411-.676z"/><path fill="#BA5B1F" d="M30.567 14.5c-.047-.344-.031-.875.078-1.062s.281-.297.172-.328c-.109-.031-.625.516-.344 1.625.282 1.109.094-.235.094-.235z"/><path fill="#BA5B1F" d="M30.622 14.404c.211-.123.484-.436.457-.607s-.23-.484-.262-.422c-.031.062.094.256 0 .511s-.14.269-.267.439c-.126.171.072.079.072.079zm.115.237c.126-.152 1.518-1.047 1.377-1.109-.141-.062-1.338.688-1.528 1.109-.19.421.151 0 .151 0z"/><path fill="#BA5B1F" d="M30.817 14.906c.509-.505 1.766-.594 1.703-.672s-1.674.07-1.899.535c-.225.465.196.137.196.137z"/><path fill="#BA5B1F" d="M30.853 15.173c.574-.298 1.578-.361 1.67-.345.092.016-.969-.298-1.728.171-.759.47.058.174.058.174zm-.036.421c.594-.266 1.469-.188 1.625-.094.156.094-.453-.354-.875-.31-.422.044-.83.132-.946.213-.116.081-.011.283.196.191z"/><path fill="#BA5B1F" d="M30.472 14.401c.072-.384.073-.708.588-.669.515.039.607 1.002.479 2.346s.028 1.784.052 1.861c.024.077-.287-.267-.265-.861.022-.594.153-1.899.111-2.379-.042-.48-.275-.84-.585-.746-.31.095-.24.336-.231.629.009.293-.149-.181-.149-.181z"/><path fill="#00247D" d="M19 18V5H4c-.32 0-.604.045-.604.045l-.004 1.754-2.73-.004S.62 6.854.535 7C.195 7.589 0 8.272 0 9v9h19z"/><path fill="#EEE" d="M19 5h-2.331L12 8.269V5H7v2.569L3.396 5.045c-.614.094-1.19.325-1.672.665L6.426 9H4.69L.967 6.391c-.11.129-.211.262-.305.404L3.813 9H0v5h3.885L0 16.766V18h3.332L7 15.432V18h5v-3.269L16.668 18H19v-2.029L16.185 14H19V9h-2.814L19 7.029V5z"/><path fill="#CF1B2B" d="M11 5H8v5H0v3h8v5h3v-5h8v-3h-8z"/><path fill="#CF1B2B" d="M19 5h-1.461L12 8.879V9h1.571L19 5.198zm-17.276.71c-.281.195-.534.423-.757.681L4.69 9h1.735L1.724 5.71zM6.437 14L.734 18h1.727L7 14.822V14zM19 17.802v-1.22L15.313 14H13.57z"/></svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 7.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.0 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 8.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#292F33" d="M33.334 27.096c-.588-1.143-1.532-4.627-1.246-5.976.286-1.349 1.015-3.975.402-6.053L30.216 7.36s-.108-1.503-1.519-1.122c-1.949.526-1.501 2.043-1.501 2.043l.715 3.092 1.157 2.42s-.701.206-1.551-2.674l-2.872-9.731S24.578-.1 23.16.255c-1.85.463-1.521 2.102-1.521 2.102l2.662 9.02c-.402.05-.456.203-.46.191l-2.905-9.846S21.015.261 19.582.543c-1.92.377-1.695 2.08-1.695 2.08l2.939 9.851c.003.012-.479.156-.473.176l-2.506-8.494s.059-1.547-1.355-1.179c-2.018.525-1.659 2.142-1.659 2.142l2.676 9.05c.024.083-.45.226-.419.33l-1.92-6.507s.079-1.461-1.355-1.178c-1.837.363-1.448 2.006-1.448 2.006l3.101 10.51.037-.011c-.02.005.074.474.17.711.604 1.49 1.395 2.726 2.324 3.706.029.094.078.186.163.277.969 1.036 3.396 4.267 4.325 7.59.581 2.078 4.215.914 5.026.556 1.078-.477-.641-3.61-.753-4.311-.112-.701.618-1.482 1.096-.51.479.972.646 4.026 1.657 3.835 1.012-.191 2.888-1.17 3.558-1.855.44-.452.851-1.079.263-2.222z"/><path fill="#66757F" d="M33.794 26.905c-.588-1.143-1.532-4.627-1.246-5.976.286-1.349 1.015-3.975.402-6.053L30.676 7.17s-.413-1.401-1.816-.988c-1.4.414-.987 1.815-.987 1.815L28.759 11l.768 2.602s-.701.206-1.551-2.675l-2.872-9.731S24.69-.205 23.289.208c-1.401.414-.988 1.815-.988 1.815l2.715 9.203c-.006-.02-.713.162-.717.15L21.394 1.53S20.981.128 19.579.542c-1.401.414-.988 1.815-.988 1.815l2.905 9.847c.003.012-.692.235-.686.255l-2.506-8.494s-.414-1.401-1.815-.988c-1.401.414-.988 1.815-.988 1.815l2.665 9.03c.024.083-.649.383-.618.486l-1.92-6.507s-.414-1.401-1.815-.987c-1.401.414-.988 1.815-.988 1.815l3.102 10.51.037-.011c-.02.005.074.474.17.711.604 1.49 1.395 2.726 2.324 3.705.029.094.078.187.163.277.969 1.036 3.396 4.267 4.325 7.59.581 2.078 4.215.914 5.026.556 1.078-.477-.641-3.61-.753-4.311-.112-.7.618-1.482 1.096-.51.479.972.646 4.026 1.657 3.835 1.012-.191 2.888-1.17 3.558-1.855.441-.451.853-1.078.264-2.221z"/><path fill="#66757F" d="M29.743 26.025c-1.09-.681-3.683-3.193-4.127-4.498-.444-1.305-1.16-3.935-2.75-5.407l-5.895-5.461s-.861-1.236-1.879-.188c-1.406 1.448-.245 2.523-.245 2.523l2.196 2.291 2.231 1.488s-.497.536-2.701-1.505L9.129 8.373s-.819-1.244-1.855-.214c-1.353 1.344-.233 2.584-.233 2.584l6.899 6.391c-.32.248-.288.408-.298.399l-7.531-6.976s-.679-1.296-1.767-.321c-1.457 1.306-.393 2.654-.393 2.654l7.563 6.964c.009.008-.332.379-.317.393l-6.496-6.018s-.74-1.359-1.767-.32c-1.466 1.483-.33 2.689-.33 2.689l6.928 6.409c.063.058-.271.424-.192.498l-4.977-4.611s-.679-1.296-1.767-.32c-1.393 1.252-.219 2.464-.219 2.464s7.866 7.274 8.039 7.447c.173.172.536.496.536.496 1.319 1.112 2.401 1.536 3.798 2.031.156.056.257.086.376.12 1.363.395 5.1 1.931 7.597 4.311 1.562 1.488 4.09-1.37 4.603-2.092.683-.961-2.397-2.775-2.851-3.32-.454-.545-.227-1.589.681-.999s2.613 3.13 3.385 2.448c.772-.681 1.884-2.482 2.11-3.413.148-.612.181-1.361-.908-2.042z"/><path fill="#99AAB5" d="M30.041 25.625c-1.09-.681-3.682-3.193-4.127-4.498-.444-1.305-1.16-3.935-2.75-5.407l-5.895-5.461s-1.072-.993-2.065.079c-.992 1.072.08 2.064.08 2.064l2.297 2.128 1.991 1.844s-.497.536-2.701-1.505L9.427 7.974s-1.072-.993-2.065.079c-.992 1.072.079 2.065.079 2.065l7.039 6.52c-.015-.014-.53.504-.54.495l-7.531-6.976s-1.072-.993-2.065.079c-.993 1.072.079 2.064.079 2.064l7.532 6.977c.009.008-.475.556-.46.57L4.999 13.83s-1.072-.993-2.065.079c-.993 1.072.079 2.065.079 2.065l6.907 6.398c.063.059-.362.661-.283.734l-4.977-4.61s-1.072-.993-2.065.08c-.993 1.072.079 2.065.079 2.065l8.039 7.447s.332.341.536.496c1.28.972 2.444 1.603 3.741 2.01.127.042.314.107.433.141 1.363.395 5.1 1.931 7.597 4.311 1.562 1.489 4.09-1.37 4.603-2.092.683-.961-2.397-2.775-2.851-3.32-.454-.545-.227-1.589.681-.999s2.613 3.13 3.385 2.448c.772-.681 1.884-2.482 2.11-3.413.149-.614.182-1.364-.907-2.045z"/><path fill="#66757F" d="M19.097 27.624c-.067 0-.136-.014-.202-.043l-6.529-2.883c-.252-.111-.367-.406-.255-.659.112-.252.406-.366.66-.255l6.529 2.883c.252.111.367.406.255.659-.083.187-.267.298-.458.298zm2.497-2.997c-.127 0-.253-.048-.351-.144l-5.253-5.167c-.197-.193-.2-.51-.006-.707.193-.197.51-.2.707-.006l5.252 5.167c.197.193.199.51.006.707-.096.1-.226.15-.355.15zm-1.226 1.453c-.098 0-.195-.028-.281-.087l-6.235-4.241c-.229-.155-.288-.466-.132-.694.155-.229.467-.286.695-.132l6.235 4.241c.228.155.287.466.132.694-.097.143-.255.219-.414.219z"/></svg>

After

Width:  |  Height:  |  Size: 4.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#6D6E71" d="M28.688 20.312C28.688 26.217 23.904 31 18 31c-5.903 0-10.688-4.783-10.688-10.688 0-5.903 4.786-10.689 10.688-10.689 5.904.001 10.688 4.786 10.688 10.689z"/><path fill="#662113" d="M26 33.5H10c-1.665 0-2.479-1.339-2.763-2.31l-2.664-.056c-.153-.003-.297-.077-.389-.2-.092-.122-.123-.281-.083-.43l.594-2.216-2.446-.651c-.152-.041-.276-.15-.335-.296s-.046-.311.035-.445l1.199-1.993-2.156-1.192c-.139-.077-.233-.216-.254-.374-.02-.157.036-.315.151-.426l1.729-1.647-1.729-1.646c-.115-.11-.171-.268-.151-.426.021-.158.115-.297.254-.374l2.156-1.194-1.2-1.994c-.081-.135-.094-.3-.035-.445.059-.146.183-.255.335-.296l2.446-.65-.594-2.218c-.04-.148-.009-.307.083-.43s.236-.196.39-.2l2.575-.053.058-2.302c.004-.149.074-.289.192-.381.118-.092.271-.127.416-.094l2.521.561.717-2.234c.045-.139.148-.251.282-.308.136-.056.288-.051.417.014l2.284 1.139 1.341-2.009c.08-.119.208-.199.35-.218.145-.019.287.024.394.119L18 7.258l1.88-1.636c.109-.094.251-.137.395-.118.143.019.269.099.35.218l1.34 2.009 2.286-1.139c.13-.065.283-.069.417-.014.135.057.237.169.282.308l.716 2.234 2.521-.561c.146-.032.298.002.416.094s.188.232.192.381l.058 2.302 2.574.053c.153.003.297.077.389.2.093.123.123.282.083.43l-.595 2.217 2.449.65c.152.04.276.15.336.296.059.146.046.311-.035.445l-1.201 1.994 2.155 1.194c.14.077.233.216.254.374s-.036.316-.151.426l-1.729 1.646 1.729 1.647c.115.11.172.269.151.426-.021.158-.114.297-.254.374L32.854 24.9l1.2 1.993c.081.135.094.3.035.445-.06.146-.184.255-.335.296l-2.45.651.595 2.216c.04.148.01.307-.082.43-.093.123-.236.197-.39.2l-2.663.056c-.285.974-1.099 2.313-2.764 2.313z"/><path fill="#8A4B38" d="M16.188 28.824c-.022 0-.044-.001-.066-.004-.143-.019-.27-.099-.35-.219l-1.058-1.585-1.805.899c-.131.064-.283.07-.418.014-.134-.057-.237-.169-.282-.309l-.564-1.757-1.99.442c-.148.031-.299-.003-.417-.095s-.188-.231-.192-.381l-.045-1.804-2.029-.043c-.153-.003-.297-.077-.389-.2-.092-.122-.123-.281-.083-.43l.464-1.732-1.92-.51c-.152-.041-.276-.15-.335-.296s-.046-.311.035-.445l.937-1.557-1.688-.934c-.14-.077-.234-.216-.254-.374-.02-.158.036-.316.151-.426l1.352-1.289-1.352-1.287c-.115-.11-.171-.268-.151-.426.021-.158.115-.297.254-.374l1.689-.935-.937-1.558c-.081-.135-.094-.3-.035-.445.059-.146.183-.255.335-.296l1.922-.511-.466-1.732c-.04-.148-.009-.307.083-.43s.236-.196.39-.2l2.029-.042.045-1.805c.004-.149.074-.289.192-.381.117-.092.27-.127.416-.094l1.99.442.564-1.756c.045-.139.148-.251.282-.308.136-.055.287-.051.418.014l1.805.899 1.058-1.584c.08-.119.207-.199.35-.218.144-.021.287.024.395.119L18 4.172l1.484-1.291c.109-.095.253-.138.395-.119.143.019.269.099.35.218l1.057 1.583 1.807-.9c.13-.064.283-.069.417-.013.135.057.237.169.282.308l.562 1.756 1.991-.442c.146-.033.3.002.416.094.118.092.188.232.192.382l.045 1.804 2.028.042c.153.003.297.077.389.2.093.123.123.282.083.43l-.465 1.734 1.924.511c.152.041.276.15.336.296.059.146.046.311-.035.445l-.938 1.558 1.689.935c.14.077.233.216.254.374.021.158-.036.316-.151.426l-1.353 1.287 1.353 1.289c.115.11.172.268.151.426-.021.158-.115.296-.254.374l-1.688.934.938 1.557c.081.135.094.3.035.445-.06.145-.184.255-.335.296l-1.925.512.465 1.732c.04.148.01.307-.082.43-.093.123-.236.197-.39.2l-2.028.043-.045 1.804c-.004.149-.074.289-.192.381-.117.092-.271.126-.416.095l-1.991-.442-.562 1.757c-.045.139-.147.252-.282.309-.134.058-.284.053-.417-.014l-1.806-.899-1.058 1.585c-.08.12-.207.199-.35.219-.142.018-.286-.024-.395-.119L18 27.407l-1.483 1.294c-.092.08-.209.123-.329.123z"/><path fill="#8A4B38" d="M13.5 27.052h9c3.521 0 6.5 2.575 6.5 4.5 0 1.65-1.35 2-3 2H10c-1.65 0-3-.35-3-2 0-1.925 2.99-4.5 6.5-4.5z"/><path fill="#D99E82" d="M26.222 22.779c0 4.088-3.68 7.398-8.222 7.398s-8.222-3.31-8.222-7.398c0-4.087 3.68-7.4 8.222-7.4s8.222 3.313 8.222 7.4z"/><path fill="#E6E7E8" d="M21.289 26.479c0 2.043-1.473 3.699-3.289 3.699s-3.289-1.656-3.289-3.699S16.183 22.78 18 22.78s3.289 1.655 3.289 3.699z"/><path fill="#231F20" d="M19.645 27.711c0 .908-.736 1.645-1.645 1.645s-1.645-.736-1.645-1.645c0-.908.736-1.642 1.645-1.642s1.645.734 1.645 1.642zm-4.934-6.166c0 .682-.552 1.234-1.233 1.234s-1.233-.553-1.233-1.234c0-.68.552-1.232 1.233-1.232.681-.001 1.233.552 1.233 1.232zm9.044 0c0 .682-.552 1.234-1.232 1.234-.682 0-1.233-.553-1.233-1.234 0-.68.552-1.232 1.233-1.232.68-.001 1.232.552 1.232 1.232z"/><path fill="#C1694F" d="M11.422 17.846s4.111-1.644 4.933 0C17.178 19.49 18 19.49 18 19.49v-4.934c0 .001-6.578.001-6.578 3.29zm13.155 0s-4.11-1.644-4.933 0C18.822 19.49 18 19.49 18 19.49v-4.934c0 .001 6.577.001 6.577 3.29z"/><path fill="#D99E82" d="M12.245 18.256c0 1.136-.92 2.056-2.055 2.056-1.136 0-2.056-.92-2.056-2.056 0-1.135.92-2.055 2.056-2.055 1.135 0 2.055.92 2.055 2.055zm15.621 0c0 1.136-.92 2.056-2.056 2.056-1.135 0-2.056-.92-2.056-2.056 0-1.135.921-2.055 2.056-2.055 1.136 0 2.056.92 2.056 2.055zM11 35c-2 0-2-4 2-4s4.062 4 2 4h-4zm10 0c-2 0-2-4 2-4s4.062 4 2 4h-4z"/></svg>

After

Width:  |  Height:  |  Size: 4.8 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 36 36"><path fill="#C1694F" d="M34.469 28.156c-.59-.885-2.458-2.365-4.5-2.656-2.112-.302-3.877.18-6.571-1.394-.086-.066-.171-.131-.273-.19-2.153-1.247-5.917-5.417-6-9.542-.047-2.336-3-2.625-5.375-2.333-2.375.292-10.083 2.083-9.792 3.25.248.991.224 5.316-.018 8.205-.366 2.27-.636 5.435-.636 7.44C1.303 31.599 2.333 32 2.333 32l14.198.5 17.688-.477s.933-.084.906-.711c-.042-.958-.156-2.406-.656-3.156z"/><path fill="#662113" d="M23.208 32.458c.75-1.333 2.375-2.417 4.75-2.583s5.792-2.531 5.792-2.531.969 0 1.531 2.031c.463 1.67-.406 2.094-.406 2.094s-3.542 1.99-5.875 1.615-5.792-.626-5.792-.626zM1.906 24.156s-1.125 3.656-.86 5.661c.181 1.369.573 2.351 1.376 2.58.803.229 9.5.066 9.328.009-.172-.057-1.097-4.124-4.594-5.156-3.497-1.032-5.25-3.094-5.25-3.094z"/><path fill="#292F33" d="M1.906 35.562c-.55 0-1.031-.438-1.156-1.938l-.031-.562c.156-2 .638.625 1.188.625.55 0 1 .45 1 1-.001.55-.451.875-1.001.875zm3.032.25c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zM8 36c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm3.062-.156c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.449 1-1 1zM20 36c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm3 0c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2.938-.125c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.451 1-1 1zm3.031-.187c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1c0 .549-.45 1-1 1zm3-.188c-.55 0-1-.45-1-1s.45-1 1-1 1 .45 1 1-.45 1-1 1zm2.962-.481h-.281c-.55 0-1-.606-1-1.156 0-.55.45-1 1-1s1.219-.675 1.219-.125l-.063 1.062c0 .55-.325 1.219-.875 1.219z"/><path fill="#662113" d="M2.167 16.042c-.713.366-.75-1.25-.083-2s6.25-1.75 7.625-2 4.042-.75 4.875-.083c.833.667 1 2.833.958 3.625-.042.791-3.084-.417-5.542-.667-2.323-.237-6.208.291-7.833 1.125z"/><circle fill="#292F33" cx="14.604" cy="18.583" r="1.5"/><circle fill="#292F33" cx="15.948" cy="21.781" r="1.5"/><circle fill="#292F33" cx="18.292" cy="24.458" r="1.5"/><circle fill="#292F33" cx="21.562" cy="25.938" r="1.5"/><circle fill="#292F33" cx="25" cy="26.823" r="1.5"/><path fill="#BE1931" d="M14.5 19.425c-.362 0-.69-.247-.777-.614-.103-.43.162-.861.592-.964l3.833-.917c.428-.105.861.162.964.592.103.43-.162.861-.592.964l-3.833.917c-.063.015-.126.022-.187.022zm1.5 3.187c-.288 0-.566-.155-.709-.429-.205-.392-.054-.875.337-1.08l3.542-1.854c.392-.203.874-.054 1.08.338.205.392.054.875-.338 1.08l-3.542 1.854c-.118.062-.245.091-.37.091zm2.25 2.688c-.225 0-.449-.095-.607-.278-.288-.335-.25-.84.085-1.128l2.958-2.542c.336-.288.84-.249 1.128.085.288.335.25.84-.085 1.128l-2.958 2.542c-.15.129-.336.193-.521.193zm3.332 1.5c-.125 0-.252-.029-.37-.091-.392-.205-.543-.688-.338-1.08l1.417-2.708c.205-.391.69-.541 1.08-.338.392.205.543.688.338 1.08l-1.417 2.708c-.143.273-.422.429-.71.429zm3.45.906c-.037 0-.074-.002-.112-.008-.438-.062-.742-.466-.681-.903l.386-2.739c.061-.438.462-.75.903-.681.438.062.742.466.681.903l-.386 2.739c-.055.401-.398.689-.791.689z"/><path fill="#292F33" d="M1.334 31.216c.787.175 2.201.662 4.591.7 2.755.044 5.187-.525 8.308-.525 2.991 0 6.9.848 10.319.7 3.487-.152 7.35-.652 8.192-.799 1.667-.292 2.438-.479 2.438-.479s.365-.021.531.688c.167.708.304 2.083-.841 2.427-2.186.656-7.554 1.113-12.724 1.049-2.626-.032-5.549-.81-6.966-.976-1.417-.167-2.667-.287-3.062 0-.396.287.089.792-.946.933-2.58.35-8.614.044-9.928-.516-.672-.286-1.051-3.455.088-3.202zm12.102-10.613c-.219 0-.421-.146-.482-.368l-.61-2.224c-.073-.266.084-.542.35-.615.264-.073.541.083.615.35l.61 2.225c.073.266-.084.541-.35.614-.045.012-.09.018-.133.018zm1.505 3.28c-.201 0-.39-.122-.467-.32l-.827-2.153c-.099-.258.03-.548.288-.646.257-.1.547.03.646.287l.827 2.153c.099.258-.03.548-.288.646-.059.022-.12.033-.179.033zm2.992 2.861c-.127 0-.254-.048-.352-.145l-1.639-1.622c-.196-.194-.198-.511-.004-.707s.511-.198.707-.004l1.639 1.622c.196.194.198.511.004.707-.098.099-.226.149-.355.149zm3.998 1.563c-.077 0-.155-.018-.228-.055l-2.053-1.051c-.246-.126-.344-.428-.218-.673.127-.246.431-.343.673-.218l2.053 1.051c.246.126.344.428.218.673-.089.173-.264.273-.445.273zm3.993.755c-.032 0-.065-.003-.098-.01l-2.263-.448c-.271-.054-.447-.316-.394-.587.054-.271.32-.45.587-.394l2.263.448c.271.054.447.316.394.587-.047.239-.256.404-.489.404z"/></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 6.3 KiB

Some files were not shown because too many files have changed in this diff Show More