16
Dockerfile
Normal file
@@ -0,0 +1,16 @@
|
||||
FROM mcr.microsoft.com/dotnet/sdk:7.0 AS build-env
|
||||
WORKDIR /App
|
||||
EXPOSE 80
|
||||
|
||||
# Copy everything
|
||||
COPY . ./
|
||||
# Restore as distinct layers
|
||||
RUN dotnet restore "gaseous-server/gaseous-server.csproj"
|
||||
# Build and publish a release
|
||||
RUN dotnet publish "gaseous-server/gaseous-server.csproj" -c Release -o out
|
||||
|
||||
# Build runtime image
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:7.0
|
||||
WORKDIR /App
|
||||
COPY --from=build-env /App/out .
|
||||
ENTRYPOINT ["dotnet", "gaseous-server.dll"]
|
@@ -15,7 +15,13 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-tools", "gaseous-to
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "gaseous-server", "gaseous-server\gaseous-server.csproj", "{A01D2EFF-C82E-473B-84D7-7C25E736F5D2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Test", "Test\Test.csproj", "{B07A4655-A003-416B-A790-ADAA5B548E1A}"
|
||||
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{17FA6F12-8532-420C-9489-CB8FDE42137C}"
|
||||
ProjectSection(SolutionItems) = preProject
|
||||
docker-compose.yml = docker-compose.yml
|
||||
Dockerfile = Dockerfile
|
||||
README.MD = README.MD
|
||||
LICENSE = LICENSE
|
||||
EndProjectSection
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
|
97
README.MD
Normal file
@@ -0,0 +1,97 @@
|
||||
# Gaseous Server
|
||||
|
||||
This is the server for the Gaseous system. All your games and metadata are stored within.
|
||||
|
||||
## Requirements
|
||||
* MySQL Server 8+
|
||||
* Internet Game Database API Key. See: https://api-docs.igdb.com/#account-creation
|
||||
|
||||
## Third Party Projects
|
||||
The following projects are used by Gaseous
|
||||
* https://dotnet.microsoft.com/en-us/apps/aspnet
|
||||
* https://github.com/JamesNK/Newtonsoft.Json
|
||||
* https://www.nuget.org/packages/MySql.Data/8.0.32.1
|
||||
* https://github.com/kamranayub/igdb-dotnet
|
||||
|
||||
## Configuration File
|
||||
When Gaseous-Server is started for the first time, it creates a configuration file at ~/.gaseous-server/config.json if it doesn't exist. Some values can be filled in using environment variables (such as in the case of using docker).
|
||||
|
||||
### DatabaseConfiguration
|
||||
| Attribute | Environment Variable |
|
||||
| --------- | -------------------- |
|
||||
| HostName | dbhost |
|
||||
| UserName | dbuser |
|
||||
| Password | dbpass |
|
||||
|
||||
### IGDBConfiguration
|
||||
| Attribute | Environment Variable |
|
||||
| --------- | -------------------- |
|
||||
| ClientId | igdbclientid |
|
||||
| Secret. | igdbclientsecret |
|
||||
|
||||
### config.json
|
||||
```json
|
||||
{
|
||||
"DatabaseConfiguration": {
|
||||
"HostName": "localhost",
|
||||
"UserName": "gaseous",
|
||||
"Password": "gaseous",
|
||||
"DatabaseName": "gaseous",
|
||||
"Port": 3306
|
||||
},
|
||||
"IGDBConfiguration": {
|
||||
"ClientId": "<clientid>",
|
||||
"Secret": "<secret>"
|
||||
},
|
||||
"LoggingConfiguration": {
|
||||
"DebugLogging": false,
|
||||
"LogFormat": "text"
|
||||
}
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
## Deploy with Docker
|
||||
Dockerfile and docker-compose.yml files have been provided to make deployment of the server as easy as possible.
|
||||
1. Clone the repo with "git clone https://github.com/gaseous-project/gaseous-server.git"
|
||||
2. Change into the gaseous-server directory
|
||||
3. Open the docker-compose.yml file and edit the igdbclientid and igdbclientsecret to the values retrieved from your IGDB account
|
||||
4. Run the command "docker-compose up -d"
|
||||
5. Connect to the host on port 5198
|
||||
|
||||
## Adding Content
|
||||
While games can be added to the server without them, it is recommended adding some signature DAT files beforehand to allow for better matching of ROM to game.
|
||||
|
||||
These signature DAT files contain a list of titles with hashes for many of the ROM images that have been found by the community.
|
||||
|
||||
Currently only TOSEC is supported, though more will be added.
|
||||
|
||||
### Adding signature DAT files
|
||||
1. Download the DAT files from the source website. For example; from https://www.tosecdev.org/downloads/category/56-2023-01-23
|
||||
2. Extract the archive
|
||||
3. Copy the DAT files to ~/.gaseous-server/Data/Signatures/TOSEC/
|
||||
|
||||
### Adding game image files
|
||||
1. Ensure your game image file is unzipped, and clearly named. Attempting a search for the game name on https://www.igdb.com can help with file naming. If a hash search is unsuccessful, Gaseous will fall back to attempting to search by the file name.
|
||||
2. Copy the file to ~/.gaseous-server/Data/Import
|
||||
|
||||
Image to game matching follows the following order of operations, stopping the process at the first match:
|
||||
### Get the file signature
|
||||
1. Attempt a hash search
|
||||
2. Attempt to search the signature database for a rom matching the file name - sometimes the hash can not be matched as a highscore table for example was saved to the image
|
||||
3. Attempt to parse the file name - clues such as the extension being used to define which platform the file belongs to are used to create a search criteria
|
||||
|
||||
### Create a list of search candidates
|
||||
Before beginning, remove any version numbers.
|
||||
1. Add the full name of the image
|
||||
2. Add the name of the image with any " - " replaced by ": "
|
||||
3. Add the name of the image with text after a " - " removed
|
||||
4. Add the name of the image with text after a ": " removed
|
||||
|
||||
### Search IGDB for a game match
|
||||
Loop through each of the search candidates searching using:
|
||||
1. "where" - exact match as the search candidate
|
||||
2. "wherefuzzy" - partial match using wildcards
|
||||
3. "search" - uses a more flexible search method
|
||||
|
||||
Note: that if more than one result is found, the image will be set as "Unknown" as there is no way for Gaseous to know which title is the correct one.
|
39
docker-compose.yml
Normal file
@@ -0,0 +1,39 @@
|
||||
version: '2'
|
||||
services:
|
||||
gaseous-server:
|
||||
container_name: gaseous-server
|
||||
build:
|
||||
context: ./
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- gaseous
|
||||
depends_on:
|
||||
- gsdb
|
||||
ports:
|
||||
- 5198:80
|
||||
volumes:
|
||||
- gs:/root/.gaseous-server
|
||||
environment:
|
||||
- dbhost=gsdb
|
||||
- dbuser=root
|
||||
- dbpass=gaseous
|
||||
- igdbclientid=<clientid>
|
||||
- igdbclientsecret=<clientsecret>
|
||||
gsdb:
|
||||
container_name: gsdb
|
||||
image: mysql:8
|
||||
restart: unless-stopped
|
||||
networks:
|
||||
- gaseous
|
||||
volumes:
|
||||
- gsdb:/var/lib/mysql
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=gaseous
|
||||
- MYSQL_USER=gaseous
|
||||
- MYSQL_PASSWORD=gaseous
|
||||
networks:
|
||||
gaseous:
|
||||
driver: bridge
|
||||
volumes:
|
||||
gs:
|
||||
gsdb:
|
@@ -72,6 +72,14 @@ namespace gaseous_romsignatureobject
|
||||
public string? RomTypeMedia { get; set; }
|
||||
public string? MediaLabel { get; set; }
|
||||
|
||||
public SignatureSourceType SignatureSource { get; set; }
|
||||
|
||||
public enum SignatureSourceType
|
||||
{
|
||||
None = 0,
|
||||
TOSEC = 1
|
||||
}
|
||||
|
||||
public enum RomTypes
|
||||
{
|
||||
/// <summary>
|
||||
|
BIN
gaseous-server/.DS_Store
vendored
Normal file
BIN
gaseous-server/Assets/.DS_Store
vendored
Normal file
BIN
gaseous-server/Assets/Ratings/.DS_Store
vendored
Normal file
7
gaseous-server/Assets/Ratings/ACB/ACB_G.svg
Normal file
@@ -0,0 +1,7 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200">
|
||||
<path d="M 191.70234,175.91171 C 191.70234,184.38715 184.75204,190.93635 176.2572,190.93635 L 24.122669,190.93635 C 16.013959,190.93635 9.0636492,184.38715 9.0636492,175.91171 L 9.0636492,24.124519 C 9.0636492,16.034357 16.013959,9.0999218 24.122669,9.0999218 L 176.2572,9.0999218 C 184.75204,9.0999218 191.70234,16.034357 191.70234,24.124519 L 191.70234,175.91171 z" fill="none" stroke="#fff" stroke-width="18.1273"/>
|
||||
<path d="M 190.98805,175.92545 C 190.98805,184.40244 184.0643,190.95282 175.60192,190.95282 L 24.048621,190.95282 C 15.970885,190.95282 9.0471341,184.40244 9.0471341,175.92545 L 9.0471341,24.110631 C 9.0471341,16.018998 15.970885,9.0832994 24.048621,9.0832994 L 175.60192,9.0832994 C 184.0643,9.0832994 190.98805,16.018998 190.98805,24.110631 L 190.98805,175.92545 z" fill="#33a02c" stroke-width="18.0943"/>
|
||||
<path d="M 115.9807,132.38466 C 111.36484,137.3938 105.97972,138.93505 99.82527,138.93505 C 93.286167,138.93505 88.285658,137.00844 84.054486,132.76997 C 78.28468,126.99021 78.28468,119.6692 78.28468,109.65096 C 78.28468,99.632729 78.28468,92.311719 84.054486,86.531956 C 88.285658,82.293484 93.286167,79.98157 99.82527,79.98157 C 113.28812,79.98157 119.82722,88.84387 121.36586,98.862105 L 110.2109,98.862105 C 108.6723,93.082343 105.59508,90.385117 99.82527,90.385117 C 96.748043,90.385117 94.055464,91.541095 92.516871,93.467654 C 90.20894,95.779568 89.824292,98.476793 89.824292,109.65096 C 89.824292,120.82514 90.20894,123.52236 92.516871,125.83427 C 94.055464,127.76088 96.748043,128.91681 99.82527,128.91681 C 102.9025,128.91681 105.97972,127.76088 107.90296,125.83427 C 109.4416,123.52236 110.2109,121.21049 110.2109,118.12795 L 110.2109,115.81604 L 99.82527,115.81604 L 99.82527,106.56843 L 121.36586,106.56843 L 121.36586,115.04541 C 121.36586,123.13705 120.21187,128.14619 115.9807,132.38466 z" fill="#fff"/>
|
||||
<path d="M 99.82527,48.770929 C 102.9025,53.780025 153.29203,138.93505 156.36926,144.3295 C 150.21481,144.3295 49.820382,144.3295 43.665928,144.3295 C 46.743155,138.93505 97.132691,53.780025 99.82527,48.770929 z M 98.286677,44.147102 L 37.126826,148.18266 L 162.90836,148.18266 L 99.82527,41.449877 L 98.286677,44.147102 z" fill="#fff"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
12
gaseous-server/Assets/Ratings/ACB/ACB_M.svg
Normal file
@@ -0,0 +1,12 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200" id="svg2">
|
||||
<defs id="defs4"/>
|
||||
<g id="g2613">
|
||||
<path d="M 191.70254,175.91169 C 191.70254,184.38714 184.75223,190.93633 176.25738,190.93633 L 24.122712,190.93633 C 16.013988,190.93633 9.0636773,184.38714 9.0636773,175.91169 L 9.0636773,24.124507 C 9.0636773,16.034343 16.013988,9.0999058 24.122712,9.0999058 L 176.25738,9.0999058 C 184.75223,9.0999058 191.70254,16.034343 191.70254,24.124507 L 191.70254,175.91169 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1273;" id="path3596"/>
|
||||
<path d="M 191.50948,175.91169 C 191.50948,184.0019 184.94529,190.93633 176.45044,190.93633 L 24.315773,190.93633 C 16.207092,190.93633 9.2567391,184.0019 9.2567391,175.91169 L 9.2567391,24.124465 C 9.2567391,15.64906 16.207092,9.0998638 24.315773,9.0998638 L 176.45044,9.0998638 C 184.94529,9.0998638 191.50948,15.64906 191.50948,24.124465 L 191.50948,175.91169 z " style="fill: rgb(0, 160, 198); fill-opacity: 1; stroke: none; stroke-width: 4.314; stroke-miterlimit: 4; stroke-dasharray: none;" id="path4000"/>
|
||||
<path d="M 191.50948,175.91169 C 191.50948,184.0019 184.94529,190.93633 176.45044,190.93633 L 24.315773,190.93633 C 16.207092,190.93633 9.2567391,184.0019 9.2567391,175.91169 L 9.2567391,24.124465 C 9.2567391,15.64906 16.207092,9.0998638 24.315773,9.0998638 L 176.45044,9.0998638 C 184.94529,9.0998638 191.50948,15.64906 191.50948,24.124465 L 191.50948,175.91169 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path5000"/>
|
||||
<path d="M 116.98664,132.37881 L 116.98664,95.009892 L 104.63051,119.28042 L 96.135706,119.28042 L 83.779579,95.009892 L 83.779579,132.37881 L 71.423453,132.37881 L 71.423453,68.427867 L 83.779579,68.427867 L 100.38311,103.10006 L 116.98664,68.427867 L 129.34276,68.427867 L 129.34276,132.37881 L 116.98664,132.37881 z " style="fill: rgb(255, 255, 255);" id="path6000"/>
|
||||
<path d="M 51.730892,100.01808 C 51.730892,73.050812 73.740237,51.476973 100.38311,51.476973 C 127.4121,51.476973 149.03532,73.050812 149.03532,100.01808 C 149.03532,126.6001 127.4121,148.55918 100.38311,148.55918 C 73.740237,148.55918 51.730892,126.6001 51.730892,100.01808 z M 47.483489,100.01808 C 47.483489,128.9116 71.423453,152.79689 100.38311,152.79689 C 129.72889,152.79689 153.28273,128.9116 153.28273,100.01808 C 153.28273,70.739318 129.72889,47.239271 100.38311,47.239271 C 71.423453,47.239271 47.483489,70.739318 47.483489,100.01808 z " style="fill: rgb(255, 255, 255);" id="path7000"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
27
gaseous-server/Assets/Ratings/ACB/ACB_MA15.svg
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" width="200" height="200" id="svg2">
|
||||
<defs id="defs4"/>
|
||||
<g id="g2844">
|
||||
<path d="M 191.70229,175.91125 C 191.70229,184.38669 184.75199,190.93589 176.25715,190.93589 L 24.122622,190.93589 C 16.013906,190.93589 9.0636022,184.38669 9.0636022,175.91125 L 9.0636022,24.124059 C 9.0636022,16.033897 16.013906,9.0994615 24.122622,9.0994615 L 176.25715,9.0994615 C 184.75199,9.0994615 191.70229,16.033897 191.70229,24.124059 L 191.70229,175.91125 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1273;" id="path3606"/>
|
||||
<path d="M 191.70225,176.10391 C 191.70225,184.19407 184.75194,191.12851 176.25715,191.12851 L 24.508746,191.12851 C 16.013906,191.12851 9.0636022,184.19407 9.0636022,176.10391 L 9.0636022,24.316722 C 9.0636022,15.841277 16.013906,8.9068406 24.508746,8.9068406 L 176.25715,8.9068406 C 184.75194,8.9068406 191.70225,15.841277 191.70225,24.316722 L 191.70225,176.10391 z " style="fill: rgb(255, 0, 0); fill-opacity: 1; stroke: none; stroke-width: 4.31371;" id="path3607"/>
|
||||
<path d="M 191.70225,176.10391 C 191.70225,184.19407 184.75194,191.12851 176.25715,191.12851 L 24.508746,191.12851 C 16.013906,191.12851 9.0636022,184.19407 9.0636022,176.10391 L 9.0636022,24.316722 C 9.0636022,15.841277 16.013906,8.9068406 24.508746,8.9068406 L 176.25715,8.9068406 C 184.75194,8.9068406 191.70225,15.841277 191.70225,24.316722 L 191.70225,176.10391 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path3608"/>
|
||||
<path d="M 9.0636022,150.67762 L 9.0636022,176.10391 C 9.0636022,184.19407 16.013906,191.12851 24.122622,191.12851 L 176.25715,191.12851 C 184.75194,191.12851 191.31613,184.19407 191.31613,176.10391 L 191.31613,150.67762 L 9.0636022,150.67762 z " style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0); stroke-width: 1.15706;" id="path3609"/>
|
||||
<path d="M 30.300638,161.46452 L 25.667116,161.46452 L 25.667116,168.01371 L 30.300638,168.01371 C 32.61742,168.01371 33.775789,166.85798 33.775789,164.93173 C 33.775789,162.62028 32.61742,161.46452 30.300638,161.46452 z M 34.161955,179.57113 L 29.528391,170.71044 L 25.667116,170.71044 L 25.667116,179.57113 L 22.578087,179.57113 L 22.578087,158.76778 L 30.686803,158.76778 C 34.548078,158.76778 37.250941,161.07927 37.250941,164.93173 C 37.250941,168.01371 35.320325,169.55472 33.003543,170.3252 L 37.637107,179.57113 L 34.161955,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3621"/>
|
||||
<path d="M 41.112259,179.57113 L 41.112259,158.76778 L 54.626744,158.76778 L 54.626744,161.46452 L 44.201288,161.46452 L 44.201288,167.62847 L 53.082208,167.62847 L 53.082208,170.3252 L 44.201288,170.3252 L 44.201288,176.8744 L 54.626744,176.8744 L 54.626744,179.57113 L 41.112259,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3610"/>
|
||||
<path d="M 63.507664,179.95637 C 60.418678,179.95637 58.101895,179.18589 56.171237,177.25964 L 58.488019,174.94815 C 60.032512,176.48915 61.577047,176.8744 63.893829,176.8744 C 66.596693,176.8744 68.141228,175.71867 68.141228,173.79242 C 68.141228,173.02194 67.755105,172.25145 67.368981,171.48093 C 66.596693,171.09569 66.210569,170.71044 65.052199,170.71044 L 62.349294,170.3252 C 60.804801,170.3252 59.260265,169.55472 58.488019,168.78423 C 57.329649,167.62847 56.943483,166.47274 56.943483,164.54649 C 56.943483,161.07927 59.646389,158.38254 63.893829,158.38254 C 66.596693,158.38254 68.527351,159.15306 70.45801,161.07927 L 68.527351,163.00552 C 66.982858,161.84976 65.824446,161.46452 63.893829,161.46452 C 61.577047,161.46452 60.032512,162.62028 60.032512,164.54649 C 60.032512,165.31698 60.418678,166.0875 60.804801,166.47274 C 61.190924,166.85798 62.349294,167.24323 63.121541,167.62847 L 65.438323,168.01371 C 67.368981,168.01371 68.527351,168.78423 69.685721,169.55472 C 70.45801,170.3252 71.230257,171.86617 71.230257,173.79242 C 71.230257,177.64488 68.141228,179.95637 63.507664,179.95637 z " style="fill: rgb(255, 255, 255);" id="path3611"/>
|
||||
<path d="M 82.041836,161.46452 L 82.041836,179.57113 L 78.566684,179.57113 L 78.566684,161.46452 L 72.77475,161.46452 L 72.77475,158.76778 L 87.447647,158.76778 L 87.447647,161.46452 L 82.041836,161.46452 z " style="fill: rgb(255, 255, 255);" id="path3612"/>
|
||||
<path d="M 98.259226,161.46452 L 93.625704,161.46452 L 93.625704,168.01371 L 98.259226,168.01371 C 100.57601,168.01371 102.1205,166.85798 102.1205,164.93173 C 102.1205,162.62028 100.57601,161.46452 98.259226,161.46452 z M 102.1205,179.57113 L 97.873103,170.71044 L 93.625704,170.71044 L 93.625704,179.57113 L 90.536675,179.57113 L 90.536675,158.76778 L 98.645349,158.76778 C 102.50662,158.76778 105.20953,161.07927 105.20953,164.93173 C 105.20953,168.01371 103.27887,169.55472 100.96213,170.3252 L 105.98178,179.57113 L 102.1205,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3640"/>
|
||||
<path d="M 109.07081,179.57113 L 112.15983,179.57113 L 112.15983,158.76778 L 109.07081,158.76778 L 109.07081,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3613"/>
|
||||
<path d="M 123.7437,179.95637 C 121.81304,179.95637 119.88243,179.18589 118.33789,177.64488 C 116.40723,175.71867 116.40723,173.40718 116.40723,169.16948 C 116.40723,165.31698 116.40723,163.00552 118.33789,160.69403 C 119.88243,159.15306 121.81304,158.38254 123.7437,158.38254 C 127.60498,158.38254 130.69401,160.69403 131.46625,164.93173 L 127.9911,164.93173 C 127.60498,163.00552 126.06044,161.46452 123.7437,161.46452 C 122.58529,161.46452 121.42692,161.84976 120.65467,162.62028 C 119.88243,163.77601 119.49626,164.93173 119.49626,169.16948 C 119.49626,173.40718 119.88243,174.5629 120.65467,175.71867 C 121.42692,176.48915 122.58529,176.8744 123.7437,176.8744 C 126.06044,176.8744 127.60498,175.33343 127.9911,173.40718 L 131.46625,173.40718 C 130.69401,177.64488 127.60498,179.95637 123.7437,179.95637 z " style="fill: rgb(255, 255, 255);" id="path3614"/>
|
||||
<path d="M 141.50559,161.46452 L 141.50559,179.57113 L 138.03043,179.57113 L 138.03043,161.46452 L 132.2385,161.46452 L 132.2385,158.76778 L 147.29752,158.76778 L 147.29752,161.46452 L 141.50559,161.46452 z " style="fill: rgb(255, 255, 255);" id="path3615"/>
|
||||
<path d="M 150.00042,179.57113 L 150.00042,158.76778 L 163.51491,158.76778 L 163.51491,161.46452 L 153.08945,161.46452 L 153.08945,167.62847 L 161.97037,167.62847 L 161.97037,170.3252 L 153.08945,170.3252 L 153.08945,176.8744 L 163.51491,176.8744 L 163.51491,179.57113 L 150.00042,179.57113 z " style="fill: rgb(255, 255, 255);" id="path3616"/>
|
||||
<path d="M 177.80164,163.00552 C 176.64327,161.84976 175.48486,161.46452 173.94037,161.46452 L 170.07909,161.46452 L 170.07909,176.8744 L 173.94037,176.8744 C 175.48486,176.8744 176.64327,176.48915 177.80164,175.33343 C 178.96001,174.17766 178.96001,171.86617 178.96001,169.16948 C 178.96001,166.0875 178.96001,164.16125 177.80164,163.00552 z M 179.7323,177.64488 C 178.57389,179.18589 176.64327,179.57113 174.32649,179.57113 L 166.99006,179.57113 L 166.99006,158.76778 L 174.32649,158.76778 C 176.64327,158.76778 178.57389,159.53831 179.7323,160.69403 C 182.04904,163.00552 182.04904,166.0875 182.04904,169.16948 C 182.04904,172.25145 182.04904,175.33343 179.7323,177.64488 z " style="fill: rgb(255, 255, 255);" id="path3617"/>
|
||||
<path d="M 136.87206,93.661123 L 136.87206,67.079105 L 131.08013,72.08729 L 131.08013,68.620072 L 136.87206,63.611887 L 139.96109,63.611887 L 139.96109,93.661123 L 136.87206,93.661123 z " style="fill: rgb(255, 255, 255);" id="path3618"/>
|
||||
<path d="M 159.26747,91.734872 C 157.72298,92.890597 155.79232,94.046365 153.08945,94.046365 C 150.38655,94.046365 148.45589,92.890597 146.9114,91.734872 C 145.75298,90.579147 144.98074,88.652896 144.98074,86.341403 L 148.06977,86.341403 C 148.45589,89.423379 150.00042,91.34963 153.08945,91.34963 C 154.63395,91.34963 155.79232,90.579147 156.95073,89.808663 C 158.49522,88.267654 158.49522,85.956161 158.49522,83.644711 C 158.49522,80.177493 157.72298,76.324991 153.47558,76.324991 C 150.77267,76.324991 148.84201,77.480758 148.45589,79.406967 L 145.75298,79.406967 L 145.75298,63.611887 L 160.812,63.611887 L 160.812,66.308579 L 148.45589,66.308579 L 148.45589,75.939749 C 149.6143,74.398782 151.54492,73.628299 153.8617,73.628299 C 156.17848,73.628299 157.72298,74.398782 158.88135,75.554508 C 161.19813,77.866 161.58425,80.947976 161.58425,83.644711 C 161.58425,86.726687 161.19813,89.423379 159.26747,91.734872 z " style="fill: rgb(255, 255, 255);" id="path3619"/>
|
||||
<path d="M 175.87098,83.644711 L 175.87098,91.34963 L 172.782,91.34963 L 172.782,83.644711 L 165.44553,83.644711 L 165.44553,80.947976 L 172.782,80.947976 L 172.782,73.628299 L 175.87098,73.628299 L 175.87098,80.947976 L 183.20745,80.947976 L 183.20745,83.644711 L 175.87098,83.644711 z " style="fill: rgb(255, 255, 255);" id="path3645"/>
|
||||
<path d="M 65.052199,99.825075 L 65.052199,76.710275 L 57.715772,91.734872 L 52.309961,91.734872 L 44.587411,76.710275 L 44.587411,99.825075 L 36.864818,99.825075 L 36.864818,60.52991 L 44.587411,60.52991 L 55.012867,81.71846 L 65.438323,60.52991 L 72.77475,60.52991 L 72.77475,99.825075 L 65.052199,99.825075 z " style="fill: rgb(255, 255, 255);" id="path3620"/>
|
||||
<path d="M 92.853415,72.08729 L 87.83377,86.341403 L 97.873103,86.341403 L 92.853415,72.08729 z M 102.1205,99.825075 L 99.803719,92.890597 L 85.903111,92.890597 L 83.200206,99.825075 L 75.091532,99.825075 L 89.764387,60.52991 L 95.942444,60.52991 L 110.22922,99.825075 L 102.1205,99.825075 z " style="fill: rgb(255, 255, 255);" id="path3671"/>
|
||||
<path d="M 100.18988,41.26757 C 100.96213,42.423295 123.35758,78.636484 124.12983,79.792251 C 123.35758,80.947976 100.96213,117.16117 100.18988,118.31689 C 99.031473,118.31689 46.518027,118.31689 44.973534,118.31689 C 44.587411,117.16117 22.191964,80.947976 21.033594,79.792251 C 22.191964,78.636484 44.587411,42.423295 44.973534,41.26757 C 46.518027,41.26757 99.031473,41.26757 100.18988,41.26757 z M 100.96213,38.956077 L 43.815122,38.956077 L 18.330688,79.792251 L 43.815122,120.62838 L 101.73438,120.62838 L 127.21885,79.792251 L 101.73438,38.956077 L 100.96213,38.956077 z " style="fill: rgb(255, 255, 255);" id="path3622"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
13
gaseous-server/Assets/Ratings/ACB/ACB_PG.svg
Normal file
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="200" height="200" id="svg2">
|
||||
<defs id="defs4"/>
|
||||
<g id="g2419">
|
||||
<path d="M 191.30964,175.90856 C 191.30964,184.38568 184.37363,190.93617 175.89627,190.93617 L 24.074649,190.93617 C 15.98261,190.93617 9.0466018,184.38568 9.0466018,175.90856 L 9.0466018,24.09143 C 9.0466018,15.999673 15.98261,9.0638694 24.074649,9.0638694 L 175.89627,9.0638694 C 184.37363,9.0638694 191.30964,15.999673 191.30964,24.09143 L 191.30964,175.90856 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 18.1104;" id="path3490"/>
|
||||
<path d="M 191.11694,175.90861 C 191.11694,184.00036 184.56626,190.93617 176.08893,190.93617 L 24.267313,190.93617 C 16.175275,190.93617 9.2392663,184.00036 9.2392663,175.90861 L 9.2392663,24.091472 C 9.2392663,15.614356 16.175275,9.0638694 24.267313,9.0638694 L 176.08893,9.0638694 C 184.56626,9.0638694 191.11694,15.614356 191.11694,24.091472 L 191.11694,175.90861 z " style="fill: rgb(255, 255, 0); fill-opacity: 1; stroke: none; stroke-width: 4.31371;" id="61587352"/>
|
||||
<path d="M 191.11694,175.90861 C 191.11694,184.00036 184.56626,190.93617 176.08893,190.93617 L 24.267313,190.93617 C 16.175275,190.93617 9.2392663,184.00036 9.2392663,175.90861 L 9.2392663,24.091472 C 9.2392663,15.614356 16.175275,9.0638694 24.267313,9.0638694 L 176.08893,9.0638694 C 184.56626,9.0638694 191.11694,15.614356 191.11694,24.091472 L 191.11694,175.90861 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 1.15599;" id="61587264"/>
|
||||
<path d="M 73.975404,78.42195 L 61.644703,78.42195 L 61.644703,96.917455 L 73.975404,96.917455 C 79.755383,96.917455 83.608758,93.064235 83.608758,87.669702 C 83.608758,82.27517 79.755383,78.42195 73.975404,78.42195 z M 74.746062,108.86243 L 61.644703,108.86243 L 61.644703,134.29374 L 48.543344,134.29374 L 48.543344,66.862291 L 74.746062,66.862291 C 88.618079,66.862291 96.710117,76.495361 96.710117,87.669702 C 96.710117,99.229361 88.618079,108.86243 74.746062,108.86243 z " style="fill: rgb(0, 0, 0);" id="61587176"/>
|
||||
<path d="M 145.64751,126.97262 C 140.25286,132.75247 133.70218,134.67906 126.76617,134.67906 C 119.05946,134.67906 113.27948,131.98179 108.27012,127.35794 C 101.71944,120.42213 101.71944,111.94502 101.71944,100.38536 C 101.71944,88.825656 101.71944,80.348581 108.27012,73.412777 C 113.27948,68.78888 119.05946,66.091613 126.76617,66.091613 C 142.1795,66.091613 150.27154,76.495361 151.81286,87.669702 L 138.7115,87.669702 C 137.17018,81.504534 133.31685,78.036632 126.76617,78.036632 C 122.91279,78.036632 120.21549,79.192585 118.2888,81.504534 C 115.59146,84.2018 114.8208,87.669702 114.8208,100.38536 C 114.8208,113.48633 115.59146,116.56891 118.2888,119.26618 C 120.21549,121.57809 122.91279,122.73408 126.76617,122.73408 C 130.6195,122.73408 133.70218,121.57809 136.01415,119.26618 C 138.32617,116.56891 139.09683,113.48633 139.09683,110.01843 L 139.09683,107.70648 L 126.76617,107.70648 L 126.76617,96.532137 L 152.19819,96.532137 L 152.19819,106.55053 C 152.19819,116.1836 150.27154,121.9634 145.64751,126.97262 z " style="fill: rgb(0, 0, 0);" id="61587088"/>
|
||||
<path d="M 165.29955,53.376001 C 165.29955,57.614538 165.29955,142.38554 165.29955,146.23876 C 161.06088,146.23876 39.680647,146.23876 35.441985,146.23876 C 35.441985,142.38554 35.441985,57.614538 35.441985,53.376001 C 39.680647,53.376001 161.06088,53.376001 165.29955,53.376001 z M 167.22623,49.137421 L 31.203322,49.137421 L 31.203322,150.86261 L 169.53825,150.86261 L 169.53825,49.137421 L 167.22623,49.137421 z " style="fill: rgb(0, 0, 0);" id="61587000"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.7 KiB |
27
gaseous-server/Assets/Ratings/ACB/ACB_R18.svg
Normal file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" version="1.0" width="200" height="200" id="svg2">
|
||||
<defs id="defs4"/>
|
||||
<g transform="matrix(4.20705, 0, 0, 4.19748, -880.123, -1468.19)" id="g3683">
|
||||
<path d="M 254.77082,391.6872 C 254.77082,393.70639 253.11876,395.26667 251.09957,395.26667 L 214.93779,395.26667 C 213.01038,395.26667 211.35832,393.70639 211.35832,391.6872 L 211.35832,355.52542 C 211.35832,353.59802 213.01038,351.94596 214.93779,351.94596 L 251.09957,351.94596 C 253.11876,351.94596 254.77082,353.59802 254.77082,355.52542 L 254.77082,391.6872 z " style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 4.31371;" id="path3608"/>
|
||||
<path d="M 254.77081,391.64131 C 254.77081,393.6605 253.11875,395.31256 251.19135,395.31256 L 215.02957,395.31256 C 213.01038,395.31256 211.4501,393.6605 211.4501,391.64131 L 211.4501,355.47953 C 211.4501,353.55213 213.01038,351.90007 215.02957,351.90007 L 251.19135,351.90007 C 253.11875,351.90007 254.77081,353.55213 254.77081,355.47953 L 254.77081,391.64131 z " style="fill: rgb(0, 0, 0); stroke: none; stroke-width: 4.31371;" id="61575584"/>
|
||||
<path d="M 254.77081,391.64131 C 254.77081,393.6605 253.11875,395.31256 251.19135,395.31256 L 215.02957,395.31256 C 213.01038,395.31256 211.4501,393.6605 211.4501,391.64131 L 211.4501,355.47953 C 211.4501,353.55213 213.01038,351.90007 215.02957,351.90007 L 251.19135,351.90007 C 253.11875,351.90007 254.77081,353.55213 254.77081,355.47953 L 254.77081,391.64131 z " style="fill: none; stroke: rgb(0, 0, 0); stroke-width: 0.275344;" id="61575496"/>
|
||||
<path d="M 211.35832,385.58376 L 211.35832,391.64131 C 211.35832,393.6605 213.01038,395.31256 215.02957,395.31256 L 251.09957,395.31256 C 253.11875,395.31256 254.77081,393.6605 254.77081,391.64131 L 254.77081,385.58376 L 211.35832,385.58376 z " style="fill: rgb(0, 0, 0); stroke: rgb(0, 0, 0); stroke-width: 0.275344;" id="61575408"/>
|
||||
<path d="M 216.40628,388.24541 L 215.30491,388.24541 L 215.30491,389.80569 L 216.40628,389.80569 C 216.95697,389.80569 217.3241,389.53035 217.3241,388.97966 C 217.3241,388.52075 216.95697,388.24541 216.40628,388.24541 z M 217.3241,392.55913 L 216.22272,390.44816 L 215.30491,390.44816 L 215.30491,392.55913 L 214.57066,392.55913 L 214.57066,387.51116 L 216.49807,387.51116 C 217.41588,387.51116 218.05835,388.15363 218.05835,388.97966 C 218.05835,389.71391 217.59944,390.17282 217.04875,390.35638 L 218.24191,392.55913 L 217.3241,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575320"/>
|
||||
<path d="M 218.97616,392.55913 L 218.97616,387.51116 L 222.1885,387.51116 L 222.1885,388.24541 L 219.71041,388.24541 L 219.71041,389.71391 L 221.82137,389.71391 L 221.82137,390.35638 L 219.71041,390.35638 L 219.71041,391.82488 L 222.1885,391.82488 L 222.1885,392.55913 L 218.97616,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575232"/>
|
||||
<path d="M 224.39125,392.55913 C 223.56522,392.55913 223.10631,392.37556 222.55562,391.91666 L 223.10631,391.45775 C 223.47343,391.82488 223.84056,391.91666 224.39125,391.91666 C 225.03371,391.91666 225.40084,391.64131 225.40084,391.18241 C 225.40084,390.90706 225.30906,390.7235 225.21728,390.63172 C 225.1255,390.53994 224.94193,390.44816 224.66659,390.44816 L 224.1159,390.35638 C 223.657,390.2646 223.38165,390.17282 223.10631,389.89747 C 222.92275,389.71391 222.73919,389.34678 222.73919,388.97966 C 222.73919,388.06185 223.38165,387.51116 224.39125,387.51116 C 225.1255,387.51116 225.5844,387.69472 225.95153,388.06185 L 225.49262,388.52075 C 225.21728,388.24541 224.85015,388.15363 224.39125,388.15363 C 223.84056,388.15363 223.47343,388.52075 223.47343,388.97966 C 223.47343,389.16322 223.56522,389.255 223.657,389.43857 C 223.84056,389.53035 224.02412,389.62213 224.20768,389.62213 L 224.85015,389.71391 C 225.30906,389.80569 225.49262,389.89747 225.76796,390.08103 C 226.04331,390.35638 226.13509,390.7235 226.13509,391.09063 C 226.13509,392.00844 225.40084,392.55913 224.39125,392.55913 z " style="fill: rgb(255, 255, 255);" id="61575144"/>
|
||||
<path d="M 228.70496,388.24541 L 228.70496,392.55913 L 227.97071,392.55913 L 227.97071,388.24541 L 226.59399,388.24541 L 226.59399,387.51116 L 230.08168,387.51116 L 230.08168,388.24541 L 228.70496,388.24541 z " style="fill: rgb(255, 255, 255);" id="61575056"/>
|
||||
<path d="M 232.65155,388.24541 L 231.4584,388.24541 L 231.4584,389.80569 L 232.65155,389.80569 C 233.11046,389.80569 233.47758,389.53035 233.47758,388.97966 C 233.47758,388.52075 233.11046,388.24541 232.65155,388.24541 z M 233.47758,392.55913 L 232.46799,390.44816 L 231.4584,390.44816 L 231.4584,392.55913 L 230.72415,392.55913 L 230.72415,387.51116 L 232.65155,387.51116 C 233.66114,387.51116 234.21183,388.15363 234.21183,388.97966 C 234.21183,389.71391 233.75293,390.17282 233.20224,390.35638 L 234.39539,392.55913 L 233.47758,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574968"/>
|
||||
<path d="M 235.12964,392.55913 L 235.95567,392.55913 L 235.95567,387.51116 L 235.12964,387.51116 L 235.12964,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574880"/>
|
||||
<path d="M 238.61733,392.55913 C 238.15842,392.55913 237.69952,392.37556 237.33239,392.00844 C 236.87349,391.54953 236.87349,390.99885 236.87349,390.08103 C 236.87349,389.07144 236.87349,388.52075 237.33239,388.06185 C 237.69952,387.69472 238.15842,387.51116 238.61733,387.51116 C 239.53514,387.51116 240.26939,388.06185 240.45295,389.07144 L 239.62692,389.07144 C 239.53514,388.52075 239.16801,388.15363 238.61733,388.15363 C 238.34198,388.15363 238.06664,388.33719 237.88308,388.52075 C 237.69952,388.7961 237.60773,389.07144 237.60773,390.08103 C 237.60773,391.09063 237.69952,391.36597 237.88308,391.64131 C 238.06664,391.82488 238.34198,391.91666 238.61733,391.91666 C 239.16801,391.91666 239.53514,391.54953 239.7187,391.09063 L 240.45295,391.09063 C 240.26939,392.00844 239.53514,392.55913 238.61733,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574792"/>
|
||||
<path d="M 242.83926,388.24541 L 242.83926,392.55913 L 242.10501,392.55913 L 242.10501,388.24541 L 240.72829,388.24541 L 240.72829,387.51116 L 244.21598,387.51116 L 244.21598,388.24541 L 242.83926,388.24541 z " style="fill: rgb(255, 255, 255);" id="61574704"/>
|
||||
<path d="M 244.85845,392.55913 L 244.85845,387.51116 L 248.07079,387.51116 L 248.07079,388.24541 L 245.68448,388.24541 L 245.68448,389.71391 L 247.70366,389.71391 L 247.70366,390.35638 L 245.68448,390.35638 L 245.68448,391.82488 L 248.07079,391.82488 L 248.07079,392.55913 L 244.85845,392.55913 z " style="fill: rgb(255, 255, 255);" id="61574616"/>
|
||||
<path d="M 251.46669,388.61254 C 251.28313,388.33719 251.00779,388.24541 250.64066,388.24541 L 249.72285,388.24541 L 249.72285,391.82488 L 250.64066,391.82488 C 251.00779,391.82488 251.28313,391.73309 251.46669,391.54953 C 251.74203,391.27419 251.74203,390.7235 251.74203,389.98925 C 251.74203,389.34678 251.74203,388.88788 251.46669,388.61254 z M 252.01738,392.10022 C 251.65025,392.37556 251.19135,392.55913 250.73244,392.55913 L 248.89682,392.55913 L 248.89682,387.51116 L 250.73244,387.51116 C 251.19135,387.51116 251.65025,387.69472 252.01738,388.06185 C 252.47628,388.52075 252.47628,389.255 252.47628,389.98925 C 252.47628,390.7235 252.47628,391.54953 252.01738,392.10022 z " style="fill: rgb(255, 255, 255);" id="61574528"/>
|
||||
<path d="M 211.35832,385.58376 L 254.77081,385.58376" style="fill: none; stroke: rgb(255, 255, 255); stroke-width: 0.550687;" id="61574440"/>
|
||||
<path d="M 239.44336,373.74399 L 239.44336,366.30971 L 237.88308,367.68643 L 237.88308,366.67684 L 239.44336,365.30012 L 240.36117,365.30012 L 240.36117,373.74399 L 239.44336,373.74399 z " style="fill: rgb(255, 255, 255);" id="61574176"/>
|
||||
<path d="M 244.03242,366.03437 C 243.20639,366.03437 242.56392,366.67684 242.56392,367.50287 C 242.56392,368.42068 243.20639,369.06315 244.03242,369.06315 C 244.95023,369.06315 245.50092,368.42068 245.50092,367.50287 C 245.50092,366.67684 244.95023,366.03437 244.03242,366.03437 z M 244.03242,369.7974 C 243.1146,369.7974 242.38036,370.53164 242.38036,371.44946 C 242.38036,372.36727 243.1146,373.10152 244.03242,373.10152 C 244.95023,373.10152 245.68448,372.36727 245.68448,371.44946 C 245.68448,370.53164 244.95023,369.7974 244.03242,369.7974 z M 244.03242,373.83577 C 242.6557,373.83577 241.55432,372.91796 241.55432,371.44946 C 241.55432,370.43986 242.10501,369.7974 242.83926,369.43027 C 242.19679,368.97136 241.73789,368.42068 241.73789,367.50287 C 241.73789,366.21793 242.74748,365.20834 244.03242,365.20834 C 245.40913,365.20834 246.41873,366.21793 246.41873,367.50287 C 246.41873,368.42068 245.95982,368.97136 245.31735,369.43027 C 246.0516,369.7974 246.60229,370.43986 246.60229,371.44946 C 246.60229,372.91796 245.50092,373.83577 244.03242,373.83577 z " style="fill: rgb(255, 255, 255);" id="61574088"/>
|
||||
<path d="M 250.64066,370.99055 L 250.64066,373.10152 L 249.90641,373.10152 L 249.90641,370.99055 L 247.79544,370.99055 L 247.79544,370.16452 L 249.90641,370.16452 L 249.90641,368.14533 L 250.64066,368.14533 L 250.64066,370.16452 L 252.75163,370.16452 L 252.75163,370.99055 L 250.64066,370.99055 z " style="fill: rgb(255, 255, 255);" id="61574000"/>
|
||||
<path d="M 225.49262,366.40149 L 223.38165,366.40149 L 223.38165,369.43027 L 225.49262,369.43027 C 226.50221,369.43027 227.14468,368.7878 227.14468,367.86999 C 227.14468,367.04396 226.50221,366.40149 225.49262,366.40149 z M 227.23646,375.85495 L 225.03371,371.26589 L 223.38165,371.26589 L 223.38165,375.85495 L 221.17891,375.85495 L 221.17891,364.38231 L 225.67618,364.38231 C 227.97071,364.38231 229.43921,365.94259 229.43921,367.86999 C 229.43921,369.52205 228.42962,370.53164 227.32824,370.89877 L 229.89812,375.85495 L 227.23646,375.85495 z " style="fill: rgb(255, 255, 255);" id="61573912"/>
|
||||
<path d="M 225.30906,359.15078 C 225.76796,359.70147 235.68033,369.52205 236.13924,370.07274 C 235.68033,370.53164 225.76796,380.44401 225.30906,380.90292 C 224.85015,380.44401 214.93779,370.53164 214.3871,370.07274 C 214.93779,369.52205 224.85015,359.70147 225.30906,359.15078 z M 225.03371,358.41653 L 213.37751,370.07274 L 225.30906,382.00429 L 237.24061,370.07274 L 225.30906,358.14119 L 225.03371,358.41653 z " style="fill: rgb(255, 255, 255);" id="62507824"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 10 KiB |
141
gaseous-server/Assets/Ratings/ACB/ACB_RC.svg
Normal file
@@ -0,0 +1,141 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 16.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="svg2" xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="200px" height="200px"
|
||||
viewBox="0 0 200 200" enable-background="new 0 0 200 200" xml:space="preserve">
|
||||
<g id="g3724" transform="matrix(4.19056, 0, 0, 4.19056, -873.402, -1803.31)">
|
||||
<path id="path3610" fill="none" stroke="#FFFFFF" stroke-width="4.3137" d="M253.991,472.317c0,2.019-1.652,3.579-3.671,3.579
|
||||
h-36.162c-1.927,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.652-3.579,3.579-3.579h36.162c2.019,0,3.671,1.652,3.671,3.579
|
||||
V472.317z"/>
|
||||
<path id="_x36_2499816" fill="#FFFFFF" d="M254.037,472.317c0,2.019-1.652,3.579-3.579,3.579h-36.162
|
||||
c-2.019,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.56-3.579,3.579-3.579h36.162c1.927,0,3.579,1.652,3.579,3.579V472.317z"/>
|
||||
<path id="_x36_2499728" fill="none" stroke="#000000" stroke-width="0.2753" d="M254.037,472.317c0,2.019-1.652,3.579-3.579,3.579
|
||||
h-36.162c-2.019,0-3.579-1.56-3.579-3.579v-36.162c0-1.927,1.56-3.579,3.579-3.579h36.162c1.927,0,3.579,1.652,3.579,3.579V472.317
|
||||
z"/>
|
||||
<path id="_x36_2636256" fill="none" stroke="#000000" stroke-width="0.5507" d="M210.716,466.259h43.321"/>
|
||||
<g>
|
||||
<path d="M212.86,469.748h0.333v2.374h-0.333V469.748z M213.005,470.802h0.809c0.063,0,0.119-0.015,0.168-0.046
|
||||
c0.049-0.031,0.087-0.074,0.113-0.13c0.027-0.056,0.04-0.12,0.04-0.193s-0.013-0.137-0.04-0.193
|
||||
c-0.027-0.056-0.064-0.099-0.113-0.13c-0.048-0.031-0.105-0.046-0.169-0.046h-0.809v-0.316h0.796c0.137,0,0.258,0.028,0.361,0.085
|
||||
c0.104,0.057,0.184,0.137,0.241,0.241c0.057,0.104,0.086,0.224,0.086,0.36s-0.029,0.256-0.086,0.36
|
||||
c-0.058,0.104-0.138,0.184-0.242,0.241c-0.104,0.057-0.224,0.085-0.36,0.085h-0.796V470.802z M213.651,471.045l0.331-0.075
|
||||
l0.607,1.152h-0.395L213.651,471.045z"/>
|
||||
<path d="M215.004,469.75h0.333v2.372h-0.333V469.75z M215.166,469.75h1.362v0.316h-1.362V469.75z M215.166,470.786h1.183v0.316
|
||||
h-1.183V470.786z M215.166,471.805h1.362v0.316h-1.362V471.805z"/>
|
||||
<path d="M216.967,469.75h0.333v2.372h-0.333V469.75z M217.131,469.75h1.329v0.316h-1.329V469.75z M217.131,470.807h1.15v0.316
|
||||
h-1.15V470.807z"/>
|
||||
<path d="M219.152,472.042c-0.125-0.069-0.219-0.17-0.285-0.302c-0.065-0.132-0.098-0.291-0.098-0.477v-1.514h0.333v1.525
|
||||
c0,0.173,0.043,0.307,0.13,0.401s0.21,0.142,0.369,0.142c0.16,0,0.284-0.047,0.371-0.142c0.087-0.095,0.131-0.228,0.131-0.401
|
||||
v-1.525h0.333v1.514c0,0.186-0.033,0.345-0.098,0.477c-0.065,0.132-0.16,0.233-0.285,0.302c-0.125,0.069-0.276,0.104-0.452,0.104
|
||||
C219.426,472.146,219.276,472.112,219.152,472.042z"/>
|
||||
<path d="M221.434,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098s-0.172-0.098-0.249-0.163
|
||||
l0.207-0.254c0.09,0.078,0.19,0.137,0.299,0.176c0.109,0.039,0.227,0.059,0.354,0.059c0.172,0,0.305-0.032,0.4-0.095
|
||||
c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.064-0.197c-0.043-0.048-0.098-0.084-0.166-0.108
|
||||
c-0.068-0.023-0.156-0.045-0.263-0.064c-0.003-0.001-0.007-0.002-0.011-0.002s-0.007,0-0.011-0.002l-0.024-0.005
|
||||
c-0.159-0.027-0.288-0.058-0.387-0.092c-0.1-0.034-0.185-0.097-0.255-0.188c-0.071-0.091-0.106-0.22-0.106-0.387v-0.002
|
||||
c0-0.147,0.033-0.272,0.099-0.376c0.066-0.104,0.162-0.183,0.288-0.237s0.278-0.082,0.455-0.082c0.085,0,0.168,0.009,0.25,0.028
|
||||
c0.082,0.018,0.163,0.046,0.243,0.083c0.08,0.036,0.158,0.082,0.236,0.138l-0.189,0.264c-0.09-0.066-0.18-0.116-0.27-0.149
|
||||
c-0.09-0.033-0.18-0.05-0.27-0.05c-0.162,0-0.288,0.032-0.378,0.097c-0.09,0.065-0.135,0.156-0.135,0.275v0.002
|
||||
c0,0.082,0.023,0.146,0.069,0.193c0.046,0.047,0.104,0.081,0.173,0.103c0.069,0.022,0.165,0.045,0.288,0.069
|
||||
c0.004,0.001,0.008,0.002,0.012,0.002c0.004,0.001,0.008,0.001,0.012,0.003c0.005,0.001,0.011,0.002,0.018,0.003
|
||||
c0.007,0.001,0.012,0.002,0.018,0.003c0.144,0.029,0.263,0.064,0.36,0.104c0.096,0.04,0.177,0.105,0.241,0.195
|
||||
c0.065,0.089,0.097,0.212,0.097,0.368v0.003c0,0.145-0.034,0.268-0.103,0.371c-0.069,0.103-0.168,0.181-0.298,0.235
|
||||
c-0.13,0.054-0.287,0.081-0.471,0.081C221.491,472.146,221.434,472.146,221.434,472.146z"/>
|
||||
<path d="M222.883,469.75h0.333v2.372h-0.333V469.75z M223.045,469.75h1.362v0.316h-1.362V469.75z M223.045,470.786h1.183v0.316
|
||||
h-1.183V470.786z M223.045,471.805h1.362v0.316h-1.362V471.805z"/>
|
||||
<path d="M224.847,469.75h0.333v2.372h-0.333V469.75z M225.072,471.805h0.537c0.175,0,0.311-0.045,0.407-0.136
|
||||
c0.096-0.091,0.144-0.219,0.144-0.384v-0.698c0-0.165-0.048-0.293-0.144-0.384c-0.096-0.091-0.232-0.136-0.407-0.136h-0.537
|
||||
v-0.316h0.527c0.19,0,0.353,0.033,0.488,0.1c0.135,0.066,0.238,0.163,0.308,0.29c0.071,0.127,0.106,0.281,0.106,0.46v0.672
|
||||
c0,0.179-0.035,0.333-0.106,0.46c-0.071,0.127-0.174,0.224-0.309,0.29s-0.298,0.1-0.489,0.1h-0.525V471.805z"/>
|
||||
<path d="M228.399,472.146c0,0-0.062-0.036-0.187-0.109c-0.125-0.073-0.221-0.176-0.29-0.31s-0.103-0.289-0.103-0.465v-0.651
|
||||
c0-0.176,0.034-0.331,0.103-0.465c0.069-0.134,0.165-0.237,0.29-0.311c0.125-0.074,0.269-0.11,0.433-0.11
|
||||
c0.136,0,0.261,0.029,0.375,0.087c0.114,0.058,0.21,0.141,0.286,0.247c0.077,0.106,0.129,0.23,0.156,0.37h-0.341
|
||||
c-0.021-0.074-0.055-0.14-0.104-0.198c-0.048-0.058-0.105-0.103-0.17-0.134s-0.133-0.047-0.202-0.047
|
||||
c-0.097,0-0.182,0.023-0.254,0.07c-0.073,0.047-0.129,0.112-0.17,0.196c-0.04,0.084-0.06,0.182-0.06,0.295v0.651
|
||||
c0,0.111,0.02,0.209,0.06,0.294c0.04,0.085,0.097,0.15,0.17,0.196c0.073,0.046,0.158,0.069,0.254,0.069
|
||||
c0.071,0,0.138-0.015,0.203-0.044s0.121-0.073,0.17-0.13c0.048-0.058,0.083-0.126,0.104-0.206h0.341
|
||||
c-0.027,0.14-0.079,0.264-0.157,0.37c-0.077,0.106-0.173,0.189-0.287,0.247c-0.114,0.058-0.239,0.087-0.374,0.087
|
||||
C228.482,472.146,228.399,472.146,228.399,472.146z"/>
|
||||
<path d="M229.87,469.75h0.333v2.372h-0.333V469.75z M230.037,471.805h1.357v0.316h-1.357V471.805z"/>
|
||||
<path d="M232.43,469.75h0.284l0.874,2.372h-0.359l-0.657-1.913l-0.658,1.913h-0.359L232.43,469.75z M231.959,471.285h1.248v0.316
|
||||
h-1.248V471.285z"/>
|
||||
<path d="M234.325,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098
|
||||
c-0.089-0.044-0.172-0.098-0.249-0.163l0.207-0.254c0.09,0.078,0.19,0.137,0.298,0.176c0.109,0.039,0.227,0.059,0.354,0.059
|
||||
c0.172,0,0.305-0.032,0.399-0.095c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.064-0.197
|
||||
c-0.043-0.048-0.099-0.084-0.166-0.108c-0.068-0.023-0.156-0.045-0.264-0.064c-0.003-0.001-0.007-0.002-0.01-0.002
|
||||
c-0.004,0-0.007,0-0.011-0.002l-0.025-0.005c-0.158-0.027-0.288-0.058-0.387-0.092c-0.099-0.034-0.185-0.097-0.255-0.188
|
||||
c-0.07-0.091-0.106-0.22-0.106-0.387v-0.002c0-0.147,0.033-0.272,0.099-0.376c0.066-0.104,0.162-0.183,0.288-0.237
|
||||
c0.126-0.054,0.278-0.082,0.455-0.082c0.085,0,0.168,0.009,0.25,0.028c0.082,0.018,0.163,0.046,0.243,0.083
|
||||
c0.08,0.036,0.158,0.082,0.235,0.138l-0.189,0.264c-0.09-0.066-0.18-0.116-0.27-0.149c-0.089-0.033-0.179-0.05-0.27-0.05
|
||||
c-0.162,0-0.288,0.032-0.378,0.097c-0.09,0.065-0.135,0.156-0.135,0.275v0.002c0,0.082,0.023,0.146,0.069,0.193
|
||||
c0.046,0.047,0.103,0.081,0.173,0.103c0.069,0.022,0.165,0.045,0.288,0.069c0.005,0.001,0.008,0.002,0.013,0.002
|
||||
c0.004,0.001,0.008,0.001,0.012,0.003c0.006,0.001,0.011,0.002,0.018,0.003c0.007,0.001,0.013,0.002,0.018,0.003
|
||||
c0.144,0.029,0.263,0.064,0.36,0.104c0.096,0.04,0.177,0.105,0.241,0.195c0.064,0.089,0.097,0.212,0.097,0.368v0.003
|
||||
c0,0.145-0.034,0.268-0.103,0.371c-0.069,0.103-0.168,0.181-0.297,0.235c-0.13,0.054-0.287,0.081-0.471,0.081
|
||||
C234.382,472.146,234.325,472.146,234.325,472.146z"/>
|
||||
<path d="M236.283,472.146c0,0-0.051-0.011-0.153-0.033c-0.102-0.022-0.198-0.054-0.286-0.098s-0.172-0.098-0.249-0.163
|
||||
l0.207-0.254c0.09,0.078,0.19,0.137,0.298,0.176s0.227,0.059,0.354,0.059c0.172,0,0.305-0.032,0.399-0.095
|
||||
c0.095-0.064,0.142-0.154,0.142-0.27v-0.002c0-0.083-0.021-0.148-0.065-0.197c-0.043-0.048-0.098-0.084-0.166-0.108
|
||||
c-0.068-0.023-0.156-0.045-0.263-0.064c-0.003-0.001-0.007-0.002-0.011-0.002c-0.004,0-0.007,0-0.01-0.002l-0.025-0.005
|
||||
c-0.159-0.027-0.288-0.058-0.387-0.092c-0.1-0.034-0.185-0.097-0.255-0.188c-0.071-0.091-0.106-0.22-0.106-0.387v-0.002
|
||||
c0-0.147,0.033-0.272,0.098-0.376c0.066-0.104,0.162-0.183,0.288-0.237c0.126-0.054,0.278-0.082,0.455-0.082
|
||||
c0.085,0,0.168,0.009,0.25,0.028c0.082,0.018,0.163,0.046,0.243,0.083c0.08,0.036,0.158,0.082,0.236,0.138l-0.189,0.264
|
||||
c-0.09-0.066-0.18-0.116-0.27-0.149c-0.09-0.033-0.18-0.05-0.27-0.05c-0.162,0-0.288,0.032-0.378,0.097
|
||||
c-0.089,0.065-0.134,0.156-0.134,0.275v0.002c0,0.082,0.023,0.146,0.069,0.193c0.047,0.047,0.104,0.081,0.173,0.103
|
||||
c0.069,0.022,0.165,0.045,0.288,0.069c0.004,0.001,0.008,0.002,0.012,0.002c0.004,0.001,0.008,0.001,0.013,0.003
|
||||
c0.005,0.001,0.011,0.002,0.018,0.003c0.007,0.001,0.013,0.002,0.018,0.003c0.144,0.029,0.263,0.064,0.359,0.104
|
||||
c0.096,0.04,0.177,0.105,0.241,0.195c0.065,0.089,0.097,0.212,0.097,0.368v0.003c0,0.145-0.034,0.268-0.103,0.371
|
||||
c-0.069,0.103-0.168,0.181-0.298,0.235c-0.13,0.054-0.287,0.081-0.47,0.081C236.341,472.146,236.283,472.146,236.283,472.146z"/>
|
||||
<path d="M238.066,472.122h-0.333v-2.372h0.333V472.122z"/>
|
||||
<path d="M238.619,469.75h0.333v2.372h-0.333V469.75z M238.783,469.75h1.33v0.316h-1.33V469.75z M238.783,470.807h1.15v0.316h-1.15
|
||||
V470.807z"/>
|
||||
<path d="M240.819,472.122h-0.333v-2.372h0.333V472.122z"/>
|
||||
<path d="M241.903,472.146c0,0-0.062-0.036-0.187-0.109s-0.221-0.176-0.289-0.31c-0.069-0.134-0.103-0.289-0.103-0.465v-0.651
|
||||
c0-0.176,0.034-0.331,0.103-0.465c0.069-0.134,0.165-0.237,0.289-0.311c0.124-0.074,0.269-0.11,0.433-0.11
|
||||
c0.136,0,0.261,0.029,0.375,0.087c0.114,0.058,0.21,0.141,0.287,0.247c0.076,0.106,0.129,0.23,0.156,0.37h-0.341
|
||||
c-0.021-0.074-0.055-0.14-0.103-0.198c-0.048-0.058-0.105-0.103-0.171-0.134c-0.065-0.031-0.132-0.047-0.202-0.047
|
||||
c-0.096,0-0.181,0.023-0.254,0.07c-0.073,0.047-0.129,0.112-0.17,0.196c-0.04,0.084-0.06,0.182-0.06,0.295v0.651
|
||||
c0,0.111,0.02,0.209,0.06,0.294c0.041,0.085,0.097,0.15,0.17,0.196c0.073,0.046,0.158,0.069,0.254,0.069
|
||||
c0.071,0,0.138-0.015,0.203-0.044c0.065-0.029,0.121-0.073,0.17-0.13s0.083-0.126,0.103-0.206h0.341
|
||||
c-0.027,0.14-0.079,0.264-0.157,0.37c-0.077,0.106-0.173,0.189-0.287,0.247c-0.114,0.058-0.239,0.087-0.374,0.087
|
||||
C241.985,472.146,241.903,472.146,241.903,472.146z"/>
|
||||
<path d="M243.955,469.75h0.284l0.874,2.372h-0.359l-0.657-1.913l-0.658,1.913h-0.359L243.955,469.75z M243.483,471.285h1.248
|
||||
v0.316h-1.248V471.285z"/>
|
||||
<path d="M245.047,469.75h1.674v0.316h-1.674V469.75z M245.717,469.944h0.333v2.178h-0.333V469.944z"/>
|
||||
<path d="M247.346,472.122h-0.333v-2.372h0.333V472.122z"/>
|
||||
<path d="M248.248,472.038c-0.126-0.072-0.224-0.175-0.293-0.307c-0.069-0.132-0.104-0.285-0.104-0.459V470.6
|
||||
c0-0.174,0.034-0.327,0.104-0.459c0.069-0.132,0.166-0.234,0.293-0.307c0.126-0.072,0.272-0.108,0.437-0.108
|
||||
s0.311,0.036,0.437,0.108c0.126,0.072,0.224,0.175,0.293,0.307c0.069,0.132,0.103,0.285,0.103,0.459v0.672
|
||||
c0,0.174-0.034,0.327-0.103,0.459c-0.069,0.132-0.166,0.234-0.293,0.307c-0.126,0.072-0.272,0.108-0.437,0.108
|
||||
S248.374,472.11,248.248,472.038z M248.943,471.752c0.074-0.044,0.132-0.107,0.173-0.187c0.041-0.081,0.061-0.175,0.061-0.281
|
||||
v-0.695c0-0.106-0.021-0.2-0.061-0.281c-0.041-0.081-0.099-0.144-0.173-0.187c-0.075-0.044-0.161-0.066-0.259-0.066
|
||||
c-0.098,0-0.184,0.022-0.259,0.066c-0.075,0.044-0.132,0.107-0.173,0.187c-0.041,0.081-0.061,0.175-0.061,0.281v0.695
|
||||
c0,0.106,0.021,0.2,0.061,0.281c0.041,0.081,0.098,0.144,0.173,0.187c0.075,0.044,0.161,0.066,0.259,0.066
|
||||
C248.783,471.818,248.869,471.796,248.943,471.752z"/>
|
||||
<path d="M249.991,469.75h0.302l1.16,1.834l-0.039,0.042v-1.876h0.33v2.37h-0.305l-1.156-1.806l0.039-0.042v1.848h-0.33V469.75z"/>
|
||||
</g>
|
||||
<path fill="#EC1F25" d="M232.284,437.05c-7.009,0-12.711,5.702-12.711,12.711c0,7.009,5.702,12.712,12.711,12.712
|
||||
s12.711-5.702,12.711-12.712C244.995,442.753,239.293,437.05,232.284,437.05z M232.284,439.215c2.303,0,4.434,0.744,6.171,2.002
|
||||
l-14.716,14.716c-1.258-1.736-2.002-3.868-2.002-6.171C221.738,443.946,226.469,439.215,232.284,439.215z M232.284,460.309
|
||||
c-2.739,0-5.238-1.051-7.115-2.769l14.893-14.893c1.718,1.877,2.769,4.375,2.769,7.114
|
||||
C242.831,455.577,238.1,460.309,232.284,460.309z"/>
|
||||
<g>
|
||||
<path d="M230.347,450.011c0.471-0.256,0.843-0.625,1.104-1.097c0.259-0.466,0.39-1.007,0.39-1.609c0-0.602-0.13-1.143-0.386-1.608
|
||||
c-0.259-0.472-0.63-0.841-1.102-1.098c-0.465-0.253-1.008-0.382-1.614-0.382h-4.131v10.261h1.952v-4.085h1.535l2.061,4.085h2.286
|
||||
l-2.3-4.365C230.212,450.081,230.28,450.048,230.347,450.011z M229.669,446.646c0.089,0.187,0.134,0.409,0.134,0.659
|
||||
s-0.045,0.472-0.134,0.659c-0.084,0.177-0.199,0.309-0.35,0.403c-0.152,0.095-0.325,0.141-0.527,0.141h-2.232v-2.406h2.232
|
||||
c0.206,0,0.379,0.046,0.529,0.14C229.471,446.336,229.584,446.468,229.669,446.646z"/>
|
||||
<path d="M238.56,451.335c-0.073,0.278-0.194,0.521-0.362,0.72c-0.167,0.199-0.364,0.351-0.586,0.452
|
||||
c-0.223,0.101-0.46,0.153-0.703,0.153c-0.34,0-0.626-0.077-0.877-0.236c-0.25-0.159-0.44-0.38-0.581-0.676
|
||||
c-0.144-0.303-0.217-0.663-0.217-1.068v-2.65c0-0.409,0.073-0.77,0.217-1.071c0.141-0.295,0.331-0.516,0.583-0.678
|
||||
c0.25-0.16,0.536-0.238,0.875-0.238c0.237,0,0.47,0.055,0.694,0.163c0.226,0.11,0.426,0.268,0.595,0.47
|
||||
c0.169,0.203,0.292,0.438,0.364,0.697l0.061,0.218h1.976l-0.069-0.355c-0.118-0.611-0.349-1.158-0.685-1.625
|
||||
c-0.339-0.471-0.767-0.84-1.272-1.098c-0.505-0.257-1.065-0.388-1.663-0.388c-0.72,0-1.364,0.165-1.915,0.49
|
||||
c-0.554,0.327-0.989,0.793-1.293,1.386c-0.3,0.585-0.452,1.267-0.452,2.029v2.65c0,0.762,0.152,1.444,0.452,2.029
|
||||
c0.304,0.594,0.739,1.059,1.294,1.383c0,0,0.485,0.27,0.813,0.363c0.261,0.074,0.511,0.123,1.101,0.123
|
||||
c0.594,0,1.151-0.131,1.656-0.388c0.505-0.257,0.934-0.626,1.275-1.097c0.338-0.467,0.57-1.014,0.689-1.626l0.069-0.355h-1.98
|
||||
L238.56,451.335z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 14 KiB |
496
gaseous-server/Assets/Ratings/CERO/CERO_A.svg
Normal file
@@ -0,0 +1,496 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="200"
|
||||
height="246"
|
||||
id="svg6913">
|
||||
<defs
|
||||
id="defs6915">
|
||||
<clipPath
|
||||
id="clipPath3136">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3138" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3142">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3144" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3154">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3156" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3160">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3162" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3172">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3174" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3178">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3180" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3190">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3192" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3196">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3198" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3208">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3210" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3214">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3216" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3226">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3228" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3232">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3234" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3244">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3246" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3250">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3252" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3262">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3264" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3268">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3270" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3280">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3282" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3286">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3288" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3298">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3300" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3304">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3306" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3316">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3318" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3322">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3324" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3334">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3336" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3340">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3342" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3352">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3354" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3358">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3360" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3370">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3372" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3376">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3378" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3388">
|
||||
<path
|
||||
d="m 14.478,623.106 26.066,0 0,32.015 -26.066,0 0,-32.015 z"
|
||||
id="path3390" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3394">
|
||||
<path
|
||||
d="m 14.478,655.121 26.066,0 0,-32.015 -26.066,0 0,32.015 z"
|
||||
id="path3396" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="matrix(1,0,0,0.99937161,0,-805.70088)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(6.9323129,0,0,-6.9323129,-90.094419,5359.8196)"
|
||||
id="g6536">
|
||||
<g
|
||||
transform="matrix(0.78291452,0,0,0.78291452,428.50626,507.41319)"
|
||||
id="g4664-4"
|
||||
style="stroke:none">
|
||||
<path
|
||||
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
|
||||
id="path4666-0"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(1.4756001e-7,4.72536e-6)"
|
||||
id="g4863">
|
||||
<g
|
||||
id="g3132">
|
||||
<g
|
||||
clip-path="url(#clipPath3136)"
|
||||
id="g3134">
|
||||
<g
|
||||
clip-path="url(#clipPath3142)"
|
||||
id="g3140">
|
||||
<g
|
||||
transform="translate(395.365,294.87)"
|
||||
id="g3146">
|
||||
<path
|
||||
d="m -356.25,357 c 0,1.174 -0.953,2.126 -2.125,2.126 l -19.136,0 c -1.173,0 -2.126,-0.952 -2.126,-2.126 l 0,-22.645 23.387,0 0,22.645 z"
|
||||
id="path3148"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3150">
|
||||
<g
|
||||
clip-path="url(#clipPath3154)"
|
||||
id="g3152">
|
||||
<g
|
||||
clip-path="url(#clipPath3160)"
|
||||
id="g3158">
|
||||
<g
|
||||
transform="translate(395.365,269.358)"
|
||||
id="g3164">
|
||||
<path
|
||||
d="m -356.25,357 c 0,-1.174 -0.953,-2.127 -2.125,-2.127 l -19.136,0 c -1.173,0 -2.126,0.953 -2.126,2.127 l 0,25.512 c 0,1.174 0.953,2.126 2.126,2.126 l 19.136,0 c 1.172,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
|
||||
id="path3166"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3168">
|
||||
<g
|
||||
clip-path="url(#clipPath3172)"
|
||||
id="g3170">
|
||||
<g
|
||||
clip-path="url(#clipPath3178)"
|
||||
id="g3176">
|
||||
<g
|
||||
transform="translate(377.81,294.901)"
|
||||
id="g3182">
|
||||
<path
|
||||
d="m -356.25,357 c -0.424,0.285 -0.926,0.449 -1.445,0.449 -1.186,0 -1.525,-0.951 -1.525,-1.998 0,-1.197 0.581,-2.166 1.871,-2.166 0.675,0 1.289,0.252 1.869,0.563 l -0.433,-1.264 c -0.562,-0.155 -1.141,-0.208 -1.722,-0.208 -0.882,0 -1.628,0.15 -2.32,0.744 -0.668,0.564 -1.022,1.378 -1.022,2.261 0,0.797 0.338,1.636 0.944,2.175 0.658,0.561 1.567,0.768 2.415,0.768 l 1.308,-0.112 0.06,-1.212 z"
|
||||
id="path3184"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3186">
|
||||
<g
|
||||
clip-path="url(#clipPath3190)"
|
||||
id="g3188">
|
||||
<g
|
||||
clip-path="url(#clipPath3196)"
|
||||
id="g3194">
|
||||
<g
|
||||
transform="translate(380.711,291.352)"
|
||||
id="g3200">
|
||||
<path
|
||||
d="m -356.25,357 c 0.286,-0.115 0.606,-0.131 0.909,-0.131 0.484,0 0.935,0.079 1.264,0.477 l 0.044,0 -0.348,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.45 0.06,0.943 -0.363,1.201 l 0,0.027 3.03,0 c 0.13,0 0.269,0 0.363,0.045 l 0.026,0 0,-1.256 -0.026,0 c -0.233,0.408 -0.727,0.363 -1.151,0.363 l -0.277,0 0,-1.402 0.804,0 c 0.123,0 0.243,0.007 0.321,0.043 l 0.045,0 0,-1.212 -0.045,0 c -0.122,0.346 -0.519,0.311 -0.839,0.311 l -0.286,0 0,-1.627 z"
|
||||
id="path3202"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3204">
|
||||
<g
|
||||
clip-path="url(#clipPath3208)"
|
||||
id="g3206">
|
||||
<g
|
||||
clip-path="url(#clipPath3214)"
|
||||
id="g3212">
|
||||
<g
|
||||
transform="translate(385.126,295.247)"
|
||||
id="g3218">
|
||||
<path
|
||||
d="m -356.25,357 c 0.172,0 0.356,-0.016 0.502,-0.119 0.235,-0.166 0.348,-0.459 0.348,-0.739 0,-0.545 -0.4,-1.002 -0.936,-1.097 l 0,1.955 0.086,0 m -0.086,-2.416 1.004,-1.886 c 0.301,-0.536 0.58,-0.615 1.16,-0.583 l 1.196,0.079 c -0.348,0.286 -0.599,0.651 -0.832,1.04 l -1.031,1.723 c 0.573,0.244 1.031,0.718 1.031,1.368 0,0.581 -0.26,1.038 -0.772,1.317 -0.388,0.207 -0.734,0.198 -1.158,0.198 l -2.563,0 0,-0.027 c 0.423,-0.266 0.364,-0.758 0.364,-1.21 l 0,-3.22 c 0,-0.452 0.059,-0.946 -0.364,-1.212 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.364,0.76 -0.364,1.212 l 0,1.201 z"
|
||||
id="path3220"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3222">
|
||||
<g
|
||||
clip-path="url(#clipPath3226)"
|
||||
id="g3224">
|
||||
<g
|
||||
clip-path="url(#clipPath3232)"
|
||||
id="g3230">
|
||||
<g
|
||||
transform="translate(389.616,293.491)"
|
||||
id="g3236">
|
||||
<path
|
||||
d="m -356.25,357 c 0,0.891 0.45,1.869 1.471,1.869 1.187,0 1.574,-1.41 1.574,-2.399 0,-0.423 -0.059,-0.865 -0.32,-1.212 -0.277,-0.371 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.407,1.1 -0.407,1.602 m -1.682,-0.234 c 0,-1.829 1.378,-2.98 3.153,-2.98 1.758,0 3.255,1.101 3.255,2.987 0,1.905 -1.333,2.961 -3.151,2.961 -1.758,0 -3.257,-1.126 -3.257,-2.968"
|
||||
id="path3238"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3240">
|
||||
<g
|
||||
clip-path="url(#clipPath3244)"
|
||||
id="g3242">
|
||||
<g
|
||||
clip-path="url(#clipPath3250)"
|
||||
id="g3248">
|
||||
<g
|
||||
transform="translate(386.23,276.558)"
|
||||
id="g3254">
|
||||
<path
|
||||
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
|
||||
id="path3256"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3258">
|
||||
<g
|
||||
clip-path="url(#clipPath3262)"
|
||||
id="g3260">
|
||||
<g
|
||||
clip-path="url(#clipPath3268)"
|
||||
id="g3266">
|
||||
<g
|
||||
transform="translate(386.23,276.558)"
|
||||
id="g3272">
|
||||
<path
|
||||
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
|
||||
id="path3274"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3276">
|
||||
<g
|
||||
clip-path="url(#clipPath3280)"
|
||||
id="g3278">
|
||||
<g
|
||||
clip-path="url(#clipPath3286)"
|
||||
id="g3284">
|
||||
<g
|
||||
transform="translate(386.23,276.558)"
|
||||
id="g3290">
|
||||
<path
|
||||
d="m -356.25,357 0.557,-1.712 3.909,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
|
||||
id="path3292"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3294">
|
||||
<g
|
||||
clip-path="url(#clipPath3298)"
|
||||
id="g3296">
|
||||
<g
|
||||
clip-path="url(#clipPath3304)"
|
||||
id="g3302">
|
||||
<g
|
||||
transform="translate(385.976,276.558)"
|
||||
id="g3308">
|
||||
<path
|
||||
d="m -356.25,357 0.558,-1.712 3.908,0 -4.886,12.86 -4.099,0 -4.885,-12.86 3.908,0 0.541,1.712 4.955,0 m -4.153,2.465 1.675,5.244 1.693,-5.244 -3.368,0 z"
|
||||
id="path3310"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3312">
|
||||
<g
|
||||
clip-path="url(#clipPath3316)"
|
||||
id="g3314">
|
||||
<g
|
||||
clip-path="url(#clipPath3322)"
|
||||
id="g3320">
|
||||
<g
|
||||
transform="translate(376.708,270.369)"
|
||||
id="g3326">
|
||||
<path
|
||||
d="m -356.25,357 0,0.009 c -0.41,0.255 -0.785,0.569 -1.104,0.94 -0.402,-0.474 -0.717,-0.718 -1.076,-0.94 l 0,-0.009 2.18,0 m -2.332,-0.091 c -0.191,-0.112 -0.335,-0.18 -0.486,-0.248 l -0.203,0.407 c 0.621,0.219 1.311,0.718 1.698,1.232 l 0.446,0 c 0.391,-0.502 0.953,-0.969 1.722,-1.224 l -0.223,-0.406 c -0.124,0.052 -0.243,0.099 -0.479,0.239 l 0,-0.304 -1.032,0 0,-0.538 1.26,0 0,-0.362 -1.26,0 0,-0.649 1.614,0 0,-0.412 -3.659,0 0,0.412 1.619,0 0,0.649 -1.252,0 0,0.362 1.252,0 0,0.538 -1.017,0 0,0.304 z"
|
||||
id="path3328"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3330">
|
||||
<g
|
||||
clip-path="url(#clipPath3334)"
|
||||
id="g3332">
|
||||
<g
|
||||
clip-path="url(#clipPath3340)"
|
||||
id="g3338">
|
||||
<g
|
||||
transform="translate(379.615,270.847)"
|
||||
id="g3344">
|
||||
<path
|
||||
d="m -356.25,357 0,-0.542 -1.311,0 0,-1.112 -0.602,0 0,-0.402 1.913,0 0,-0.897 0.423,0 0,0.897 1.455,0 0,0.402 -1.455,0 0,0.722 1.172,0 0,0.39 -1.172,0 0,0.542 1.299,0 0,0.404 -2.443,0 c 0.056,0.115 0.087,0.207 0.12,0.299 l -0.463,0.111 c -0.156,-0.542 -0.466,-0.953 -0.897,-1.276 l 0.283,-0.355 c 0.16,0.128 0.434,0.348 0.742,0.817 l 0.936,0 m 0,-1.654 -0.881,0 0,0.722 0.881,0 0,-0.722 z"
|
||||
id="path3346"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3348">
|
||||
<g
|
||||
clip-path="url(#clipPath3352)"
|
||||
id="g3350">
|
||||
<g
|
||||
clip-path="url(#clipPath3358)"
|
||||
id="g3356">
|
||||
<g
|
||||
transform="translate(383.156,270.298)"
|
||||
id="g3362">
|
||||
<path
|
||||
d="m -356.25,357 c -0.032,-0.215 -0.036,-0.236 -0.083,-0.471 l 0.227,-0.052 c 0.04,0.168 0.064,0.319 0.088,0.479 L -356.25,357 m -0.901,-0.044 c 0.012,-0.052 0.068,-0.267 0.076,-0.479 l 0.251,0.048 c -0.024,0.207 -0.036,0.275 -0.08,0.475 l -0.247,-0.044 m 1.643,-0.479 0,-0.37 0.251,0 0,-1.511 0.378,0 0,1.511 0.431,0 0,-0.742 c 0,-0.068 -0.045,-0.068 -0.099,-0.068 l -0.224,0 0.056,-0.41 0.331,0 c 0.175,0 0.315,0.056 0.315,0.334 l 0,1.256 -1.439,0 m 0.33,0.71 c 0.037,0.048 0.212,0.315 0.367,0.705 0.136,-0.318 0.295,-0.546 0.423,-0.705 l -0.79,0 m -1.634,-1.097 c -0.111,-0.182 -0.275,-0.362 -0.438,-0.509 l 0,0.509 0.438,0 m 0.849,0 0,-0.469 c -0.187,0.167 -0.326,0.366 -0.394,0.469 l 0.394,0 m 0.534,0.774 c 0.064,0.068 0.084,0.088 0.116,0.14 l 0.008,0 0,-0.192 1.072,0 0,0.195 c 0.052,-0.051 0.08,-0.075 0.164,-0.143 l 0.203,0.419 c -0.336,0.266 -0.618,0.622 -0.773,1.06 l -0.395,0 c -0.116,-0.455 -0.347,-0.809 -0.53,-1.005 l 0,0.144 -0.793,0 0,0.263 0.749,0 0,0.335 -0.749,0 0,0.263 -0.371,0 0,-0.861 -0.399,0 0,0.689 -0.37,0 0,-0.689 -0.212,0 0,-0.359 2.109,0 0.171,-0.259 m -1.821,-0.458 0,0.55 -0.347,0 0,-2.36 0.347,0 0,0.163 1.287,0 0,-0.163 0.355,0 0,2.36 -0.355,0 0,-0.55 -0.478,0 0,0.594 -0.311,0 0,-0.594 -0.498,0 m 0.809,-0.59 0.008,0 c 0.04,-0.088 0.151,-0.295 0.339,-0.534 l 0.123,0.235 0.008,0 0,-0.407 -1.287,0 0,0.471 0.007,0 0.14,-0.284 c 0.084,0.088 0.211,0.215 0.343,0.475 l 0.008,0 0,-0.522 0.311,0 0,0.566 z"
|
||||
id="path3364"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3366">
|
||||
<g
|
||||
clip-path="url(#clipPath3370)"
|
||||
id="g3368">
|
||||
<g
|
||||
clip-path="url(#clipPath3376)"
|
||||
id="g3374">
|
||||
<g
|
||||
transform="translate(387.546,269.939)"
|
||||
id="g3380">
|
||||
<path
|
||||
d="m -356.25,357 c 0.199,-0.311 0.383,-0.71 0.502,-1.056 l 0.406,0.199 c -0.238,0.61 -0.41,0.885 -0.529,1.06 L -356.25,357 m -1.761,0.112 c 0.142,-0.112 0.406,-0.311 0.749,-0.694 -0.316,-0.582 -0.726,-0.889 -0.893,-1.016 l 0.286,-0.368 c 0.279,0.228 0.635,0.546 0.901,1.037 0.224,-0.283 0.351,-0.495 0.435,-0.633 l 0.335,0.266 c -0.147,0.284 -0.391,0.575 -0.574,0.782 0.204,0.522 0.283,0.964 0.323,1.2 l 0.23,0 0,0.406 -0.693,0 0,0.605 -0.422,0 0,-0.605 -0.75,0 0,-0.406 1.208,0 c -0.024,-0.196 -0.063,-0.487 -0.203,-0.873 -0.319,0.322 -0.518,0.486 -0.63,0.578 l -0.302,-0.279 m 2.877,1.585 0,-0.737 -0.964,0 0,-0.426 0.964,0 0,-2.069 c 0,-0.084 -0.008,-0.096 -0.135,-0.096 l -0.617,0 0.103,-0.41 0.605,0 c 0.307,0 0.471,0.056 0.471,0.362 l 0,2.213 0.33,0 0,0.426 -0.33,0 0,0.737 -0.427,0 z"
|
||||
id="path3382"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3384">
|
||||
<g
|
||||
clip-path="url(#clipPath3388)"
|
||||
id="g3386">
|
||||
<g
|
||||
clip-path="url(#clipPath3394)"
|
||||
id="g3392">
|
||||
<path
|
||||
d="m 36.538,627.162 -1.043,0 0,0.371 1.043,0 0,-0.371 z m -2.382,0.685 c 0.175,0.1 0.298,0.184 0.382,0.251 l 1.153,0 c -0.076,-0.087 -0.156,-0.163 -0.26,-0.251 l -1.275,0 m -0.551,-2.328 c 0.785,0.164 1.26,0.375 1.527,0.531 0.024,-0.052 0.035,-0.087 0.052,-0.139 -0.247,-0.144 -0.817,-0.407 -1.758,-0.574 l 0.132,-0.351 c 0.873,0.203 1.41,0.442 1.685,0.602 0.008,-0.236 -0.011,-0.299 -0.243,-0.299 l -0.35,0 0.092,-0.395 0.362,0 c 0.216,0 0.534,0 0.534,0.582 0,0.076 -0.012,0.59 -0.287,0.925 -0.075,0.087 -0.131,0.143 -0.167,0.175 0.171,0.076 0.311,0.164 0.477,0.268 0.201,-1.224 0.774,-1.584 1.325,-1.85 l 0.255,0.362 c -0.136,0.069 -0.491,0.243 -0.769,0.519 0.254,0.143 0.441,0.291 0.637,0.458 l -0.326,0.283 c -0.157,-0.167 -0.352,-0.299 -0.543,-0.427 -0.055,0.104 -0.143,0.339 -0.2,0.655 l 0.894,0 0,1.003 -0.921,0 c 0.168,0.161 0.191,0.184 0.247,0.251 l 0,0.32 -1.384,0 c 0.045,0.051 0.065,0.075 0.12,0.151 l -0.426,0.088 c -0.443,-0.538 -0.996,-0.686 -1.192,-0.737 l 0.168,-0.351 c 0.1,0.035 0.123,0.047 0.179,0.071 l 0,-0.796 1.319,0 c -0.474,-0.224 -0.996,-0.324 -1.51,-0.412 l 0.135,-0.326 c 0.223,0.039 0.658,0.119 1.172,0.319 0.056,-0.048 0.088,-0.081 0.115,-0.112 -0.458,-0.243 -0.961,-0.379 -1.474,-0.442 l 0.123,-0.352 m 1.508,1.643 -1.001,0 0,0.371 1.001,0 0,-0.371 z"
|
||||
id="path3398"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 21 KiB |
557
gaseous-server/Assets/Ratings/CERO/CERO_B.svg
Normal file
@@ -0,0 +1,557 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="200"
|
||||
height="246"
|
||||
id="svg8030">
|
||||
<defs
|
||||
id="defs8032">
|
||||
<clipPath
|
||||
id="clipPath3404">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3406" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3410">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3412" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3422">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3424" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3428">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3430" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3440">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3442" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3446">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3448" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3458">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3460" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3464">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3466" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3476">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3478" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3482">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3484" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3494">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3496" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3500">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3502" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3512">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3514" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3518">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3520" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3530">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3532" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3536">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3538" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3548">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3550" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3554">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3556" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3566">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3568" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3572">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3574" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3584">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3586" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3590">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3592" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3602">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3604" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3608">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3610" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3620">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3622" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3626">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3628" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3638">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3640" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3644">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3646" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3656">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3658" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3662">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3664" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3674">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3676" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3680">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3682" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3692">
|
||||
<path
|
||||
d="m 52.912,623.106 25.733,0 0,32.015 -25.733,0 0,-32.015 z"
|
||||
id="path3694" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3698">
|
||||
<path
|
||||
d="m 52.912,655.121 25.733,0 0,-32.015 -25.733,0 0,32.015 z"
|
||||
id="path3700" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="translate(0,-806.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(6.9323129,0,0,-6.9279567,-355.65746,5357.1129)"
|
||||
id="g6447">
|
||||
<g
|
||||
transform="matrix(0.78291452,0,0,0.78291452,466.81426,507.41319)"
|
||||
id="g4664-48"
|
||||
style="stroke:none">
|
||||
<path
|
||||
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
|
||||
id="path4666-8"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
<g
|
||||
id="g4939">
|
||||
<g
|
||||
id="g3400">
|
||||
<g
|
||||
clip-path="url(#clipPath3404)"
|
||||
id="g3402">
|
||||
<g
|
||||
clip-path="url(#clipPath3410)"
|
||||
id="g3408">
|
||||
<g
|
||||
transform="translate(433.672,294.87)"
|
||||
id="g3414">
|
||||
<path
|
||||
d="m -356.25,357 c 0,1.174 -0.951,2.126 -2.125,2.126 l -19.135,0 c -1.174,0 -2.125,-0.952 -2.125,-2.126 l 0,-22.645 23.385,0 0,22.645 z"
|
||||
id="path3416"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3418">
|
||||
<g
|
||||
clip-path="url(#clipPath3422)"
|
||||
id="g3420">
|
||||
<g
|
||||
clip-path="url(#clipPath3428)"
|
||||
id="g3426">
|
||||
<g
|
||||
transform="translate(433.672,269.358)"
|
||||
id="g3432">
|
||||
<path
|
||||
d="m -356.25,357 c 0,-1.174 -0.951,-2.127 -2.125,-2.127 l -19.135,0 c -1.174,0 -2.125,0.953 -2.125,2.127 l 0,25.512 c 0,1.174 0.951,2.126 2.125,2.126 l 19.135,0 c 1.174,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
|
||||
id="path3434"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3436">
|
||||
<g
|
||||
clip-path="url(#clipPath3440)"
|
||||
id="g3438">
|
||||
<g
|
||||
clip-path="url(#clipPath3446)"
|
||||
id="g3444">
|
||||
<g
|
||||
transform="translate(416.118,294.901)"
|
||||
id="g3450">
|
||||
<path
|
||||
d="m -356.25,357 c -0.425,0.285 -0.927,0.448 -1.445,0.448 -1.187,0 -1.525,-0.95 -1.525,-1.998 0,-1.196 0.581,-2.165 1.872,-2.165 0.673,0 1.288,0.252 1.869,0.563 l -0.434,-1.264 c -0.562,-0.155 -1.142,-0.208 -1.723,-0.208 -0.881,0 -1.627,0.15 -2.319,0.744 -0.667,0.564 -1.022,1.378 -1.022,2.26 0,0.798 0.338,1.637 0.944,2.176 0.658,0.56 1.567,0.768 2.415,0.768 l 1.309,-0.112 0.059,-1.212 z"
|
||||
id="path3452"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3454">
|
||||
<g
|
||||
clip-path="url(#clipPath3458)"
|
||||
id="g3456">
|
||||
<g
|
||||
clip-path="url(#clipPath3464)"
|
||||
id="g3462">
|
||||
<g
|
||||
transform="translate(419.019,291.352)"
|
||||
id="g3468">
|
||||
<path
|
||||
d="m -356.25,357 c 0.286,-0.116 0.606,-0.131 0.909,-0.131 0.484,0 0.935,0.079 1.263,0.477 l 0.044,0 -0.346,-1.307 -3.834,0 0,0.027 c 0.422,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.449 0.059,0.943 -0.363,1.201 l 0,0.027 3.029,0 c 0.129,0 0.27,0 0.363,0.045 l 0.026,0 0,-1.257 -0.026,0 c -0.234,0.408 -0.726,0.363 -1.151,0.363 l -0.277,0 0,-1.401 0.804,0 c 0.122,0 0.243,0.007 0.322,0.042 l 0.043,0 0,-1.211 -0.043,0 c -0.124,0.346 -0.52,0.311 -0.84,0.311 l -0.286,0 0,-1.627 z"
|
||||
id="path3470"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3472">
|
||||
<g
|
||||
clip-path="url(#clipPath3476)"
|
||||
id="g3474">
|
||||
<g
|
||||
clip-path="url(#clipPath3482)"
|
||||
id="g3480">
|
||||
<g
|
||||
transform="translate(423.434,295.247)"
|
||||
id="g3486">
|
||||
<path
|
||||
d="m -356.25,357 c 0.171,0 0.355,-0.017 0.503,-0.12 0.233,-0.165 0.346,-0.458 0.346,-0.739 0,-0.544 -0.4,-1.002 -0.933,-1.096 l 0,1.955 0.084,0 m -0.084,-2.416 1.002,-1.886 c 0.301,-0.536 0.58,-0.615 1.16,-0.583 l 1.195,0.079 c -0.347,0.285 -0.598,0.651 -0.832,1.04 l -1.029,1.723 c 0.572,0.244 1.029,0.718 1.029,1.368 0,0.581 -0.26,1.038 -0.77,1.317 -0.39,0.207 -0.736,0.198 -1.16,0.198 l -2.562,0 0,-0.027 c 0.424,-0.267 0.364,-0.759 0.364,-1.21 l 0,-3.221 c 0,-0.452 0.06,-0.945 -0.364,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.362,0.759 -0.362,1.211 l 0,1.202 z"
|
||||
id="path3488"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3490">
|
||||
<g
|
||||
clip-path="url(#clipPath3494)"
|
||||
id="g3492">
|
||||
<g
|
||||
clip-path="url(#clipPath3500)"
|
||||
id="g3498">
|
||||
<g
|
||||
transform="translate(427.924,293.49)"
|
||||
id="g3504">
|
||||
<path
|
||||
d="m -356.25,357 c 0,0.892 0.449,1.87 1.471,1.87 1.187,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.06,-0.865 -0.322,-1.212 -0.276,-0.372 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.406,1.099 -0.406,1.601 m -1.682,-0.233 c 0,-1.829 1.377,-2.98 3.153,-2.98 1.757,0 3.255,1.1 3.255,2.986 0,1.906 -1.334,2.962 -3.152,2.962 -1.757,0 -3.256,-1.126 -3.256,-2.968"
|
||||
id="path3506"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3508">
|
||||
<g
|
||||
clip-path="url(#clipPath3512)"
|
||||
id="g3510">
|
||||
<g
|
||||
clip-path="url(#clipPath3518)"
|
||||
id="g3516">
|
||||
<g
|
||||
transform="translate(420.109,280.326)"
|
||||
id="g3522">
|
||||
<path
|
||||
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
|
||||
id="path3524"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3526">
|
||||
<g
|
||||
clip-path="url(#clipPath3530)"
|
||||
id="g3528">
|
||||
<g
|
||||
clip-path="url(#clipPath3536)"
|
||||
id="g3534">
|
||||
<g
|
||||
transform="translate(420.109,280.326)"
|
||||
id="g3540">
|
||||
<path
|
||||
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
|
||||
id="path3542"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3544">
|
||||
<g
|
||||
clip-path="url(#clipPath3548)"
|
||||
id="g3546">
|
||||
<g
|
||||
clip-path="url(#clipPath3554)"
|
||||
id="g3552">
|
||||
<g
|
||||
transform="translate(420.109,280.326)"
|
||||
id="g3558">
|
||||
<path
|
||||
d="m -356.25,357 2.948,0 c 0.925,0 1.693,-0.299 1.693,-1.304 0,-1.036 -0.838,-1.46 -1.693,-1.46 l -2.948,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.291,1.382 4.291,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.68,0.392 -1.274,0.534 0.454,0.141 0.733,0.251 1.082,0.533 0.471,0.377 0.959,1.053 0.959,2.073 0,1.979 -1.639,3.313 -4.099,3.313 l -8.026,0 0,-12.875 8.358,0 m -4.397,10.143 3.106,0 c 0.889,0 1.063,-0.754 1.063,-1.115 0,-0.801 -0.47,-1.35 -1.063,-1.35 l -3.106,0 0,2.465 z"
|
||||
id="path3560"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3562">
|
||||
<g
|
||||
clip-path="url(#clipPath3566)"
|
||||
id="g3564">
|
||||
<g
|
||||
clip-path="url(#clipPath3572)"
|
||||
id="g3570">
|
||||
<g
|
||||
transform="translate(419.855,280.326)"
|
||||
id="g3576">
|
||||
<path
|
||||
d="m -356.25,357 2.95,0 c 0.924,0 1.691,-0.299 1.691,-1.304 0,-1.036 -0.837,-1.46 -1.691,-1.46 l -2.95,0 0,2.764 m 4.397,-5.496 c 2.285,0 4.292,1.382 4.292,3.784 0,0.848 -0.262,1.899 -1.291,2.638 -0.384,0.283 -0.681,0.392 -1.274,0.534 0.455,0.141 0.734,0.251 1.082,0.533 0.471,0.377 0.96,1.053 0.96,2.073 0,1.979 -1.64,3.313 -4.1,3.313 l -8.025,0 0,-12.875 8.356,0 m -4.397,10.143 3.106,0 c 0.891,0 1.064,-0.754 1.064,-1.115 0,-0.801 -0.47,-1.35 -1.064,-1.35 l -3.106,0 0,2.465 z"
|
||||
id="path3578"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3580">
|
||||
<g
|
||||
clip-path="url(#clipPath3584)"
|
||||
id="g3582">
|
||||
<g
|
||||
clip-path="url(#clipPath3590)"
|
||||
id="g3588">
|
||||
<g
|
||||
transform="translate(411.528,271.394)"
|
||||
id="g3594">
|
||||
<path
|
||||
d="m -356.25,357 0,-0.429 0.507,0 0,-2.711 0.397,0 0,3.14 -0.904,0 z"
|
||||
id="path3596"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3598">
|
||||
<g
|
||||
clip-path="url(#clipPath3602)"
|
||||
id="g3600">
|
||||
<g
|
||||
clip-path="url(#clipPath3608)"
|
||||
id="g3606">
|
||||
<g
|
||||
transform="translate(414.34,269.374)"
|
||||
id="g3612">
|
||||
<path
|
||||
d="m -356.25,357 c -0.166,-0.032 -0.301,-0.08 -0.363,-0.255 -0.031,-0.084 -0.047,-0.268 -0.047,-0.347 l 0,-0.088 1.736,0 0,-0.43 -2.13,0 0,0.346 c 0,0.494 0.032,1.069 0.668,1.184 l 0.649,0.12 c 0.292,0.056 0.433,0.148 0.433,0.538 0,0.391 -0.155,0.554 -0.641,0.554 -0.553,0 -0.672,-0.159 -0.676,-0.653 l -0.39,0 c 0.007,0.677 0.169,1.084 1.042,1.084 0.5,0 1.056,-0.076 1.056,-0.985 0,-0.398 -0.1,-0.61 -0.288,-0.758 -0.063,-0.048 -0.205,-0.155 -0.42,-0.195 L -356.25,357 z"
|
||||
id="path3614"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3616">
|
||||
<g
|
||||
clip-path="url(#clipPath3620)"
|
||||
id="g3618">
|
||||
<g
|
||||
clip-path="url(#clipPath3626)"
|
||||
id="g3624">
|
||||
<g
|
||||
transform="translate(416.123,268.6)"
|
||||
id="g3630">
|
||||
<path
|
||||
d="m -356.25,357 c 0.294,0.08 0.82,0.232 1.462,0.582 l 0,-0.749 c 0,-0.088 -0.003,-0.124 -0.109,-0.124 l -0.542,0 0.052,-0.414 0.655,0 c 0.192,0 0.304,0.119 0.304,0.315 l 0,1.187 c 0.441,0.291 0.668,0.595 0.801,0.766 l -0.287,0.267 c -0.08,-0.116 -0.203,-0.295 -0.514,-0.546 l 0,0.681 1.125,0 0,0.407 -1.125,0 0,0.662 -0.36,0 0,-0.662 -1.591,0 0,-0.407 1.591,0 0,-0.936 c -0.291,-0.171 -0.751,-0.443 -1.591,-0.622 L -356.25,357 z"
|
||||
id="path3632"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3634">
|
||||
<g
|
||||
clip-path="url(#clipPath3638)"
|
||||
id="g3636">
|
||||
<g
|
||||
clip-path="url(#clipPath3644)"
|
||||
id="g3642">
|
||||
<g
|
||||
transform="translate(420.309,271.168)"
|
||||
id="g3648">
|
||||
<path
|
||||
d="m -356.25,357 c 0.297,-0.408 0.417,-0.603 0.632,-1.08 l 0.317,0.266 c -0.238,0.471 -0.387,0.718 -0.682,1.057 L -356.25,357 m -0.95,-2.95 c 0.44,0.164 1.182,0.514 1.565,0.733 l -0.07,0.379 c -0.356,-0.188 -0.885,-0.419 -0.885,-0.419 l 0,2.651 -0.362,0 0,-2.799 c -0.166,-0.067 -0.221,-0.083 -0.31,-0.115 l 0.062,-0.43 m 2.77,3.316 -0.371,0 0,-0.686 c 0,-0.988 -0.096,-2.156 -1.443,-2.543 l 0.186,-0.41 c 0.225,0.079 0.737,0.267 1.138,0.873 0.212,-0.303 0.377,-0.55 0.506,-0.861 l 0.294,0.362 c -0.171,0.299 -0.31,0.479 -0.609,0.85 0.195,0.45 0.299,1.124 0.299,1.702 l 0,0.713 z"
|
||||
id="path3650"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3652">
|
||||
<g
|
||||
clip-path="url(#clipPath3656)"
|
||||
id="g3654">
|
||||
<g
|
||||
clip-path="url(#clipPath3662)"
|
||||
id="g3660">
|
||||
<g
|
||||
transform="translate(424.26,271.634)"
|
||||
id="g3666">
|
||||
<path
|
||||
d="m -356.25,357 0,-1.204 1.241,0 0,-0.426 -1.241,0 0,-1.555 1.453,0 0,-0.419 -3.13,0 0,0.419 1.313,0 0,3.185 0.364,0 z"
|
||||
id="path3668"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3670">
|
||||
<g
|
||||
clip-path="url(#clipPath3674)"
|
||||
id="g3672">
|
||||
<g
|
||||
clip-path="url(#clipPath3680)"
|
||||
id="g3678">
|
||||
<g
|
||||
transform="translate(427.758,270.143)"
|
||||
id="g3684">
|
||||
<path
|
||||
d="m -356.25,357 c 0.099,-0.175 0.242,-0.45 0.44,-1.06 l -0.337,-0.199 c -0.099,0.346 -0.252,0.745 -0.418,1.056 l 0.315,0.203 m 0.967,1.494 0,-0.737 0.274,0 0,-0.426 -0.274,0 0,-2.213 c 0,-0.306 -0.136,-0.362 -0.391,-0.362 l -0.503,0 -0.086,0.41 0.513,0 c 0.105,0 0.113,0.012 0.113,0.096 l 0,2.069 -0.801,0 0,0.426 0.801,0 0,0.737 0.354,0 m -2.493,-1.306 c 0.094,-0.092 0.259,-0.256 0.524,-0.578 0.115,0.386 0.148,0.677 0.168,0.873 l -1.002,0 0,0.406 0.622,0 0,0.605 0.351,0 0,-0.605 0.576,0 0,-0.406 -0.193,0 c -0.032,-0.236 -0.098,-0.678 -0.267,-1.2 0.151,-0.207 0.354,-0.499 0.475,-0.782 l -0.277,-0.266 c -0.069,0.138 -0.176,0.35 -0.36,0.633 -0.222,-0.491 -0.517,-0.809 -0.748,-1.037 l -0.239,0.368 c 0.14,0.127 0.48,0.434 0.742,1.016 -0.286,0.383 -0.503,0.582 -0.623,0.694 l 0.251,0.279 z"
|
||||
id="path3686"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3688">
|
||||
<g
|
||||
clip-path="url(#clipPath3692)"
|
||||
id="g3690">
|
||||
<g
|
||||
clip-path="url(#clipPath3698)"
|
||||
id="g3696">
|
||||
<path
|
||||
d="m 75.546,627.163 -0.867,0 0,0.371 0.867,0 0,-0.371 z m -1.979,0.685 c 0.146,0.1 0.248,0.184 0.318,0.251 l 0.956,0 c -0.063,-0.087 -0.129,-0.163 -0.215,-0.251 l -1.059,0 M 73.11,625.52 c 0.652,0.164 1.046,0.375 1.268,0.531 0.019,-0.052 0.03,-0.087 0.043,-0.14 -0.205,-0.143 -0.679,-0.406 -1.459,-0.573 l 0.108,-0.351 c 0.725,0.203 1.172,0.442 1.401,0.602 0.006,-0.236 -0.01,-0.299 -0.202,-0.299 l -0.291,0 0.076,-0.395 0.3,0 c 0.179,0 0.444,0 0.444,0.582 0,0.075 -0.01,0.59 -0.238,0.925 -0.063,0.087 -0.109,0.144 -0.139,0.175 0.142,0.076 0.258,0.164 0.397,0.267 0.165,-1.223 0.641,-1.583 1.098,-1.849 l 0.212,0.362 c -0.112,0.069 -0.407,0.243 -0.639,0.519 0.212,0.143 0.367,0.291 0.53,0.458 l -0.271,0.283 c -0.129,-0.167 -0.291,-0.299 -0.451,-0.427 -0.046,0.104 -0.119,0.339 -0.164,0.654 l 0.74,0 0,1.004 -0.764,0 c 0.139,0.161 0.159,0.184 0.205,0.251 l 0,0.32 -1.148,0 c 0.037,0.051 0.053,0.076 0.1,0.151 l -0.355,0.088 c -0.367,-0.538 -0.827,-0.686 -0.989,-0.737 l 0.139,-0.351 c 0.083,0.035 0.103,0.048 0.149,0.071 l 0,-0.797 1.095,0 c -0.394,-0.223 -0.826,-0.323 -1.254,-0.411 l 0.113,-0.326 c 0.185,0.039 0.545,0.119 0.973,0.319 0.046,-0.048 0.072,-0.081 0.095,-0.112 -0.38,-0.243 -0.797,-0.379 -1.224,-0.442 l 0.102,-0.352 m 1.251,1.643 -0.83,0 0,0.371 0.83,0 0,-0.371 z"
|
||||
id="path3702"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
558
gaseous-server/Assets/Ratings/CERO/CERO_C.svg
Normal file
@@ -0,0 +1,558 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="200"
|
||||
height="246"
|
||||
id="svg9038">
|
||||
<defs
|
||||
id="defs9040">
|
||||
<clipPath
|
||||
id="clipPath3708">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3710" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3714">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3716" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3726">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3728" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3732">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3734" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3744">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3746" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3750">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3752" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3762">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3764" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3768">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3770" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3780">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3782" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3786">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3788" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3798">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3800" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3804">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3806" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3816">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3818" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3822">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3824" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3834">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3836" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3840">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3842" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3852">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3854" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3858">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3860" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3870">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3872" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3876">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3878" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3888">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3890" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3894">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3896" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3906">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3908" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3912">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3914" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3924">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3926" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3930">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3932" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3942">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3944" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3948">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3950" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3960">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3962" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3966">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3968" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3978">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3980" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3984">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path3986" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath3996">
|
||||
<path
|
||||
d="m 91.228,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path3998" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4002">
|
||||
<path
|
||||
d="m 91.228,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4004" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="translate(0,-806.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(6.9323129,0,0,-6.9279567,-621.27943,5357.1129)"
|
||||
id="g6358">
|
||||
<g
|
||||
transform="matrix(0.78291452,0,0,0.78291452,505.13076,507.41319)"
|
||||
id="g4664-45"
|
||||
style="stroke:none">
|
||||
<path
|
||||
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
|
||||
id="path4666-5"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
<g
|
||||
transform="translate(1.4756004e-7,4.72536e-6)"
|
||||
id="g5025">
|
||||
<g
|
||||
id="g3704">
|
||||
<g
|
||||
clip-path="url(#clipPath3708)"
|
||||
id="g3706">
|
||||
<g
|
||||
clip-path="url(#clipPath3714)"
|
||||
id="g3712">
|
||||
<g
|
||||
transform="translate(471.989,294.87)"
|
||||
id="g3718">
|
||||
<path
|
||||
d="m -356.25,357 c 0,1.174 -0.952,2.126 -2.126,2.126 l -19.135,0 c -1.173,0 -2.125,-0.952 -2.125,-2.126 l 0,-22.645 23.386,0 0,22.645 z"
|
||||
id="path3720"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3722">
|
||||
<g
|
||||
clip-path="url(#clipPath3726)"
|
||||
id="g3724">
|
||||
<g
|
||||
clip-path="url(#clipPath3732)"
|
||||
id="g3730">
|
||||
<g
|
||||
transform="translate(471.989,269.358)"
|
||||
id="g3736">
|
||||
<path
|
||||
d="m -356.25,357 c 0,-1.174 -0.952,-2.127 -2.126,-2.127 l -19.135,0 c -1.173,0 -2.125,0.953 -2.125,2.127 l 0,25.512 c 0,1.174 0.952,2.126 2.125,2.126 l 19.135,0 c 1.174,0 2.126,-0.952 2.126,-2.126 l 0,-25.512 z"
|
||||
id="path3738"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3740">
|
||||
<g
|
||||
clip-path="url(#clipPath3744)"
|
||||
id="g3742">
|
||||
<g
|
||||
clip-path="url(#clipPath3750)"
|
||||
id="g3748">
|
||||
<g
|
||||
transform="translate(454.434,294.901)"
|
||||
id="g3754">
|
||||
<path
|
||||
d="m -356.25,357 c -0.424,0.285 -0.926,0.448 -1.445,0.448 -1.185,0 -1.524,-0.95 -1.524,-1.998 0,-1.196 0.58,-2.165 1.871,-2.165 0.674,0 1.288,0.252 1.869,0.563 l -0.434,-1.264 c -0.562,-0.155 -1.14,-0.208 -1.722,-0.208 -0.882,0 -1.627,0.15 -2.319,0.744 -0.668,0.564 -1.023,1.378 -1.023,2.26 0,0.798 0.338,1.637 0.944,2.176 0.659,0.56 1.568,0.768 2.415,0.768 l 1.309,-0.112 0.059,-1.212 z"
|
||||
id="path3756"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3758">
|
||||
<g
|
||||
clip-path="url(#clipPath3762)"
|
||||
id="g3760">
|
||||
<g
|
||||
clip-path="url(#clipPath3768)"
|
||||
id="g3766">
|
||||
<g
|
||||
transform="translate(457.335,291.352)"
|
||||
id="g3772">
|
||||
<path
|
||||
d="m -356.25,357 c 0.286,-0.116 0.606,-0.131 0.909,-0.131 0.484,0 0.936,0.079 1.264,0.477 l 0.044,0 -0.347,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.363,0.753 0.363,1.201 l 0,3.24 c 0,0.449 0.06,0.943 -0.363,1.201 l 0,0.027 3.029,0 c 0.13,0 0.27,0 0.364,0.045 l 0.025,0 0,-1.257 -0.025,0 c -0.234,0.408 -0.727,0.363 -1.152,0.363 l -0.277,0 0,-1.401 0.805,0 c 0.122,0 0.243,0.007 0.321,0.042 l 0.045,0 0,-1.211 -0.045,0 c -0.123,0.346 -0.52,0.311 -0.84,0.311 l -0.286,0 0,-1.627 z"
|
||||
id="path3774"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3776">
|
||||
<g
|
||||
clip-path="url(#clipPath3780)"
|
||||
id="g3778">
|
||||
<g
|
||||
clip-path="url(#clipPath3786)"
|
||||
id="g3784">
|
||||
<g
|
||||
transform="translate(461.75,295.247)"
|
||||
id="g3790">
|
||||
<path
|
||||
d="m -356.25,357 c 0.173,0 0.355,-0.017 0.503,-0.12 0.233,-0.165 0.346,-0.458 0.346,-0.739 0,-0.544 -0.4,-1.002 -0.934,-1.096 l 0,1.955 0.085,0 m -0.085,-2.416 1.003,-1.886 c 0.303,-0.536 0.58,-0.615 1.16,-0.583 l 1.195,0.079 c -0.346,0.285 -0.597,0.651 -0.832,1.04 l -1.029,1.723 c 0.572,0.244 1.029,0.718 1.029,1.368 0,0.581 -0.259,1.038 -0.769,1.317 -0.391,0.207 -0.737,0.198 -1.159,0.198 l -2.564,0 0,-0.027 c 0.424,-0.267 0.365,-0.759 0.365,-1.21 l 0,-3.221 c 0,-0.452 0.059,-0.945 -0.365,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.426,0.266 -0.363,0.759 -0.363,1.211 l 0,1.202 z"
|
||||
id="path3792"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3794">
|
||||
<g
|
||||
clip-path="url(#clipPath3798)"
|
||||
id="g3796">
|
||||
<g
|
||||
clip-path="url(#clipPath3804)"
|
||||
id="g3802">
|
||||
<g
|
||||
transform="translate(466.24,293.49)"
|
||||
id="g3808">
|
||||
<path
|
||||
d="m -356.25,357 c 0,0.892 0.449,1.87 1.472,1.87 1.186,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.061,-0.865 -0.321,-1.212 -0.277,-0.372 -0.692,-0.606 -1.152,-0.606 -0.492,0 -0.927,0.33 -1.168,0.746 -0.243,0.433 -0.406,1.099 -0.406,1.601 m -1.682,-0.233 c 0,-1.829 1.378,-2.98 3.154,-2.98 1.758,0 3.255,1.1 3.255,2.986 0,1.906 -1.333,2.962 -3.153,2.962 -1.756,0 -3.256,-1.126 -3.256,-2.968"
|
||||
id="path3810"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3812">
|
||||
<g
|
||||
clip-path="url(#clipPath3816)"
|
||||
id="g3814">
|
||||
<g
|
||||
clip-path="url(#clipPath3822)"
|
||||
id="g3820">
|
||||
<g
|
||||
transform="translate(462.975,282.838)"
|
||||
id="g3826">
|
||||
<path
|
||||
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
|
||||
id="path3828"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3830">
|
||||
<g
|
||||
clip-path="url(#clipPath3834)"
|
||||
id="g3832">
|
||||
<g
|
||||
clip-path="url(#clipPath3840)"
|
||||
id="g3838">
|
||||
<g
|
||||
transform="translate(462.975,282.838)"
|
||||
id="g3844">
|
||||
<path
|
||||
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
|
||||
id="path3846"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3848">
|
||||
<g
|
||||
clip-path="url(#clipPath3852)"
|
||||
id="g3850">
|
||||
<g
|
||||
clip-path="url(#clipPath3858)"
|
||||
id="g3856">
|
||||
<g
|
||||
transform="translate(462.975,282.838)"
|
||||
id="g3862">
|
||||
<path
|
||||
d="m -356.25,357 c -0.157,1.963 -1.343,2.167 -2.459,2.167 -0.873,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.576,-2.497 0.523,-0.737 1.099,-1.005 2.075,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.366,1.413 l 3.926,0 c -0.052,-0.707 -0.175,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.64,-1.68 1.308,-1.273 1.536,-2.937 1.605,-3.533 l -3.856,0 z"
|
||||
id="path3864"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3866">
|
||||
<g
|
||||
clip-path="url(#clipPath3870)"
|
||||
id="g3868">
|
||||
<g
|
||||
clip-path="url(#clipPath3876)"
|
||||
id="g3874">
|
||||
<g
|
||||
transform="translate(462.723,282.838)"
|
||||
id="g3880">
|
||||
<path
|
||||
d="m -356.25,357 c -0.158,1.963 -1.344,2.167 -2.46,2.167 -0.872,0 -1.5,-0.299 -1.972,-0.99 -0.506,-0.707 -0.593,-2.433 -0.593,-2.999 0,-1.005 0.262,-2.025 0.575,-2.497 0.524,-0.737 1.1,-1.005 2.076,-1.005 0.629,0 1.431,0.095 2.007,0.896 0.262,0.377 0.297,0.738 0.367,1.413 l 3.925,0 c -0.052,-0.707 -0.174,-2.245 -1.727,-3.689 -1.03,-0.958 -2.495,-1.65 -4.572,-1.65 -3.767,0 -6.733,2.34 -6.733,6.658 0,4.114 2.651,6.909 6.717,6.909 1.43,0 3.332,-0.409 4.641,-1.68 1.307,-1.273 1.535,-2.937 1.604,-3.533 l -3.855,0 z"
|
||||
id="path3882"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3884">
|
||||
<g
|
||||
clip-path="url(#clipPath3888)"
|
||||
id="g3886">
|
||||
<g
|
||||
clip-path="url(#clipPath3894)"
|
||||
id="g3892">
|
||||
<g
|
||||
transform="translate(450.748,271.394)"
|
||||
id="g3898">
|
||||
<path
|
||||
d="m -356.25,357 0,-3.14 -0.397,0 0,2.711 -0.505,0 0,0.429 0.902,0 z"
|
||||
id="path3900"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3902">
|
||||
<g
|
||||
clip-path="url(#clipPath3906)"
|
||||
id="g3904">
|
||||
<g
|
||||
clip-path="url(#clipPath3912)"
|
||||
id="g3910">
|
||||
<g
|
||||
transform="translate(451.969,271.394)"
|
||||
id="g3916">
|
||||
<path
|
||||
d="m -356.25,357 -0.031,-1.761 0.362,0 c 0.049,0.139 0.132,0.307 0.668,0.307 0.619,0 0.641,-0.311 0.641,-0.685 0,-0.487 -0.191,-0.603 -0.694,-0.603 -0.655,0 -0.658,0.295 -0.658,0.578 l -0.394,0 c 0.013,-0.765 0.314,-1.009 1.069,-1.009 0.85,0 1.068,0.36 1.068,1.097 0,0.869 -0.424,1.044 -0.949,1.044 -0.496,0 -0.639,-0.143 -0.739,-0.243 l 0.021,0.846 1.564,0 0,0.429 -1.928,0 z"
|
||||
id="path3918"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3920">
|
||||
<g
|
||||
clip-path="url(#clipPath3924)"
|
||||
id="g3922">
|
||||
<g
|
||||
clip-path="url(#clipPath3930)"
|
||||
id="g3928">
|
||||
<g
|
||||
transform="translate(454.439,268.6)"
|
||||
id="g3934">
|
||||
<path
|
||||
d="m -356.25,357 c 0.295,0.08 0.821,0.232 1.462,0.582 l 0,-0.749 c 0,-0.088 -0.003,-0.124 -0.108,-0.124 l -0.543,0 0.053,-0.414 0.655,0 c 0.192,0 0.305,0.119 0.305,0.315 l 0,1.187 c 0.439,0.291 0.668,0.595 0.8,0.766 l -0.288,0.267 c -0.079,-0.116 -0.202,-0.295 -0.512,-0.546 l 0,0.681 1.125,0 0,0.407 -1.125,0 0,0.662 -0.362,0 0,-0.662 -1.591,0 0,-0.407 1.591,0 0,-0.936 c -0.291,-0.171 -0.751,-0.443 -1.591,-0.622 L -356.25,357 z"
|
||||
id="path3936"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3938">
|
||||
<g
|
||||
clip-path="url(#clipPath3942)"
|
||||
id="g3940">
|
||||
<g
|
||||
clip-path="url(#clipPath3948)"
|
||||
id="g3946">
|
||||
<g
|
||||
transform="translate(458.626,271.168)"
|
||||
id="g3952">
|
||||
<path
|
||||
d="m -356.25,357 c 0.298,-0.408 0.417,-0.603 0.632,-1.08 l 0.317,0.266 c -0.238,0.471 -0.387,0.718 -0.682,1.057 L -356.25,357 m 1.819,0.366 -0.37,0 0,-0.686 c 0,-0.988 -0.097,-2.156 -1.442,-2.543 l 0.184,-0.41 c 0.226,0.079 0.739,0.267 1.139,0.873 0.212,-0.303 0.377,-0.55 0.506,-0.861 l 0.295,0.362 c -0.173,0.299 -0.312,0.479 -0.61,0.85 0.196,0.45 0.298,1.124 0.298,1.702 l 0,0.713 m -2.769,-3.316 c 0.44,0.164 1.181,0.514 1.565,0.733 l -0.069,0.379 c -0.358,-0.188 -0.887,-0.419 -0.887,-0.419 l 0,2.651 -0.361,0 0,-2.799 c -0.165,-0.067 -0.221,-0.083 -0.311,-0.115 l 0.063,-0.43 z"
|
||||
id="path3954"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3956">
|
||||
<g
|
||||
clip-path="url(#clipPath3960)"
|
||||
id="g3958">
|
||||
<g
|
||||
clip-path="url(#clipPath3966)"
|
||||
id="g3964">
|
||||
<g
|
||||
transform="translate(462.213,271.634)"
|
||||
id="g3970">
|
||||
<path
|
||||
d="m -356.25,357 0,-3.185 -1.314,0 0,-0.419 3.13,0 0,0.419 -1.452,0 0,1.555 1.24,0 0,0.426 -1.24,0 0,1.204 -0.364,0 z"
|
||||
id="path3972"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3974">
|
||||
<g
|
||||
clip-path="url(#clipPath3978)"
|
||||
id="g3976">
|
||||
<g
|
||||
clip-path="url(#clipPath3984)"
|
||||
id="g3982">
|
||||
<g
|
||||
transform="translate(466.075,270.143)"
|
||||
id="g3988">
|
||||
<path
|
||||
d="m -356.25,357 c 0.1,-0.175 0.241,-0.45 0.441,-1.06 l -0.338,-0.199 c -0.1,0.346 -0.251,0.745 -0.417,1.056 l 0.314,0.203 m 0.966,1.494 0,-0.737 0.274,0 0,-0.426 -0.274,0 0,-2.213 c 0,-0.306 -0.136,-0.362 -0.391,-0.362 l -0.502,0 -0.087,0.41 0.514,0 c 0.106,0 0.112,0.012 0.112,0.096 l 0,2.069 -0.8,0 0,0.426 0.8,0 0,0.737 0.354,0 m -2.491,-1.306 c 0.092,-0.092 0.257,-0.256 0.522,-0.578 0.116,0.386 0.15,0.677 0.169,0.873 l -1.002,0 0,0.406 0.622,0 0,0.605 0.351,0 0,-0.605 0.575,0 0,-0.406 -0.191,0 c -0.034,-0.236 -0.1,-0.678 -0.269,-1.2 0.152,-0.207 0.355,-0.499 0.477,-0.782 l -0.278,-0.266 c -0.07,0.138 -0.176,0.35 -0.361,0.633 -0.222,-0.491 -0.516,-0.809 -0.747,-1.037 l -0.238,0.368 c 0.138,0.127 0.479,0.434 0.741,1.016 -0.285,0.383 -0.503,0.582 -0.622,0.694 l 0.251,0.279 z"
|
||||
id="path3990"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g3992">
|
||||
<g
|
||||
clip-path="url(#clipPath3996)"
|
||||
id="g3994">
|
||||
<g
|
||||
clip-path="url(#clipPath4002)"
|
||||
id="g4000">
|
||||
<path
|
||||
d="m 113.862,627.163 -0.866,0 0,0.371 0.866,0 0,-0.371 z m -1.184,0 -0.83,0 0,0.371 0.83,0 0,-0.371 z m -1.25,-1.643 c 0.651,0.164 1.045,0.375 1.266,0.531 0.021,-0.052 0.03,-0.087 0.043,-0.14 -0.205,-0.143 -0.678,-0.406 -1.459,-0.573 l 0.11,-0.351 c 0.724,0.203 1.17,0.442 1.399,0.602 0.007,-0.236 -0.01,-0.299 -0.201,-0.299 l -0.292,0 0.076,-0.395 0.302,0 c 0.178,0 0.443,0 0.443,0.582 0,0.075 -0.011,0.59 -0.238,0.925 -0.064,0.087 -0.11,0.144 -0.14,0.175 0.143,0.076 0.259,0.164 0.398,0.267 0.165,-1.223 0.641,-1.583 1.098,-1.849 l 0.212,0.362 c -0.113,0.069 -0.407,0.243 -0.638,0.519 0.21,0.143 0.367,0.291 0.529,0.458 l -0.272,0.283 c -0.129,-0.167 -0.291,-0.299 -0.45,-0.427 -0.046,0.104 -0.119,0.339 -0.165,0.654 l 0.741,0 0,1.004 -0.764,0 c 0.138,0.161 0.159,0.184 0.205,0.251 l 0,0.32 -1.149,0 c 0.037,0.051 0.054,0.076 0.1,0.151 l -0.354,0.088 c -0.367,-0.538 -0.827,-0.686 -0.989,-0.737 l 0.139,-0.351 c 0.083,0.035 0.102,0.048 0.148,0.071 l 0,-0.797 1.096,0 c -0.394,-0.223 -0.827,-0.323 -1.254,-0.411 l 0.112,-0.326 c 0.186,0.039 0.546,0.119 0.973,0.319 0.046,-0.048 0.073,-0.081 0.096,-0.112 -0.38,-0.243 -0.797,-0.379 -1.224,-0.442 l 0.103,-0.352 m 0.456,2.328 c 0.145,0.1 0.248,0.184 0.318,0.251 l 0.956,0 c -0.063,-0.087 -0.129,-0.163 -0.216,-0.251 l -1.058,0 z"
|
||||
id="path4006"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 23 KiB |
290
gaseous-server/Assets/Ratings/CERO/CERO_D.svg
Normal file
@@ -0,0 +1,290 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="200"
|
||||
height="246.15468"
|
||||
id="svg3911">
|
||||
<defs
|
||||
id="defs3913">
|
||||
<clipPath
|
||||
id="clipPath4012">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4014" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4018">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4020" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4030">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4032" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4036">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4038" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4048">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4050" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4054">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4056" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4066">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4068" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4072">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4074" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4084">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4086" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4090">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4092" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4102">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4104" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4108">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4110" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4120">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4122" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4126">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4128" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4138">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4140" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4144">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4146" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4156">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4158" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4162">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4164" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4174">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4176" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4180">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4182" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4192">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4194" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4198">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4200" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4210">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4212" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4216">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4218" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4228">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4230" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4234">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4236" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4246">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4248" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4252">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4254" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4264">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4266" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4270">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4272" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4282">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4284" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4288">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4290" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4300">
|
||||
<path
|
||||
d="m 129.495,623.106 25.637,0 0,32.015 -25.637,0 0,-32.015 z"
|
||||
id="path4302" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4306">
|
||||
<path
|
||||
d="m 129.495,655.121 25.637,0 0,-32.015 -25.637,0 0,32.015 z"
|
||||
id="path4308" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<path
|
||||
d="m 200,232.30934 c 0,7.64185 -6.19272,13.84533 -13.84527,13.84533 l -172.30935,0 C 6.19272,246.15467 0,239.95119 0,232.30934 L 0,13.845326 C 0,6.192663 6.19272,0 13.84538,0 L 186.15473,0 C 193.80728,0 200,6.192663 200,13.845326 l 0,218.464014"
|
||||
id="path4666-1"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 181.05953,34.645315 c 0,-8.138535 -6.59956,-14.738097 -14.73116,-14.738097 l -132.64981,0 c -8.1316,0 -14.73809,6.599562 -14.73809,14.738097 l 0,156.982225 162.11906,0 0,-156.982225 z"
|
||||
id="path4024"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 181.05953,211.50248 c 0,8.13853 -6.59956,14.74503 -14.73116,14.74503 l -132.64981,0 c -8.1316,0 -14.73809,-6.6065 -14.73809,-14.74503 l 0,-176.857165 c 0,-8.138535 6.60649,-14.738097 14.73809,-14.738097 l 132.64981,0 c 8.1316,0 14.73116,6.599562 14.73116,14.738097 l 0,176.857165 z"
|
||||
id="path4042"
|
||||
style="fill:none;stroke:#000000;stroke-width:3.90289235;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
d="m 59.36971,34.430414 c -2.94623,-1.975709 -6.42625,-3.105677 -10.02412,-3.105677 -8.21479,0 -10.56485,6.585698 -10.56485,13.850762 0,8.291046 4.02768,15.008457 12.97036,15.008457 4.67238,0 8.92882,-1.746943 12.9565,-3.902892 l -3.0017,8.762443 c -3.90289,1.074509 -7.9167,1.441922 -11.94437,1.441922 -6.1143,0 -11.28581,-1.039847 -16.07604,-5.157641 -4.63078,-3.909825 -7.08482,-9.552727 -7.08482,-15.667027 0,-5.531986 2.33619,-11.348197 6.53717,-15.084713 4.5684,-3.882096 10.86294,-5.324017 16.74847,-5.324017 l 9.06053,0.776419 0.42315,8.401964 z"
|
||||
id="path4060"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 79.47342,59.033192 c 1.98264,0.804148 4.20792,0.908133 6.30841,0.908133 3.35524,0 6.47478,-0.54793 8.75551,-3.306713 l 0.30502,0 -2.40551,9.060533 -26.58542,0 0,-0.186895 c 2.9393,-1.843996 2.51643,-5.220032 2.51643,-8.325708 l 0,-22.460694 c 0,-3.112608 0.42314,-6.537171 -2.51643,-8.325708 l 0,-0.186895 21.0049,0 c 0.90121,0 1.8648,0 2.52337,-0.312231 l 0.18024,0 0,8.713917 -0.18024,0 c -1.62216,-2.828384 -5.04673,-2.516429 -7.98603,-2.516429 l -1.92025,0 0,9.71217 5.58051,0 c 0.85268,0 1.67762,-0.04991 2.22528,-0.291157 l 0.30502,0 0,8.395031 -0.30502,0 c -0.84575,-2.398581 -3.59787,-2.15595 -5.82315,-2.15595 l -1.98264,0 0,11.278873 z"
|
||||
id="path4078"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 110.07958,32.031833 c 1.19929,0 2.47484,0.117572 3.48696,0.831878 1.62216,1.143832 2.40551,3.174999 2.40551,5.122979 0,3.771178 -2.77293,6.946178 -6.48171,7.597815 l 0,-13.552672 0.58924,0 m -0.58924,16.748468 6.96004,13.074342 c 2.08662,3.71572 4.02074,4.263373 8.04148,4.041539 l 8.29105,-0.547376 c -2.41245,-1.975709 -4.15246,-4.512935 -5.77462,-7.209605 l -7.14028,-11.944375 c 3.96528,-1.691484 7.14028,-4.977401 7.14028,-9.483404 0,-4.027674 -1.8024,-7.195741 -5.34481,-9.129856 -2.69667,-1.434989 -5.08832,-1.372598 -8.02762,-1.372598 l -17.77445,0 0,0.186895 c 2.93237,1.850928 2.53029,5.261626 2.53029,8.388099 l 0,22.328979 c 0,3.133406 0.40208,6.551036 -2.53029,8.395031 l 0,0.186896 16.14536,0 0,-0.186896 c -2.94624,-1.843995 -2.51643,-5.261625 -2.51643,-8.395031 l 0,-8.33264 z"
|
||||
id="path4096"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 141.19874,44.211907 c 0,-6.183623 3.12647,-12.963425 10.21129,-12.963425 8.22866,0 10.91146,9.781494 10.91146,16.630619 0,2.9393 -0.40928,5.99645 -2.21834,8.401963 -1.92025,2.57882 -4.79023,4.200982 -7.97909,4.200982 -3.41763,0 -6.42625,-2.287664 -8.09001,-5.171506 -1.69842,-3.001691 -2.83531,-7.618612 -2.83531,-11.098633 m -11.65322,1.615229 c 0,12.6792 9.55966,20.658293 21.86451,20.658293 12.18701,0 22.56468,-7.625545 22.56468,-20.699887 0,-13.212988 -9.24077,-20.533511 -21.85065,-20.533511 -12.18007,0 -22.57854,7.805785 -22.57854,20.575105"
|
||||
id="path4114"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 58.10803,173.56886 c 12.89876,0 17.11111,0 38.69617,0 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
|
||||
id="path4132"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:21.13662148;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
d="m 58.10803,173.56886 38.69617,0 c 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
|
||||
id="path4150"
|
||||
style="fill:none;stroke:#000000;stroke-width:10.56484509;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
<path
|
||||
d="m 58.10803,173.56886 38.69617,0 c 7.50077,0 26.61315,-0.76255 37.1364,-10.88373 10.14891,-9.69137 11.84733,-23.40349 11.84733,-32.76904 0,-5.76769 -0.96359,-25.1435 -12.45044,-34.169366 -6.90458,-5.4488 -15.8542,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45196,-68.79627 14.39148,0 c 12.21474,0 17.53182,10.99465 17.53182,23.72931 0,10.02412 -3.38297,24.60277 -17.53182,24.60277 l -14.39148,0 0,-48.33208 z"
|
||||
id="path4168"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 56.34723,173.56886 38.69617,0 c 7.50076,0 26.61315,-0.76255 37.1364,-10.88373 10.1489,-9.69137 11.85425,-23.40349 11.85425,-32.76904 0,-5.76769 -0.97052,-25.1435 -12.45736,-34.169366 -6.89766,-5.4488 -15.84727,-11.43139 -36.53329,-11.43139 l -38.69617,0 0,89.253526 z m 27.45195,-68.79627 14.39149,0 c 12.21473,0 17.53875,10.99465 17.53875,23.72931 0,10.02412 -3.3899,24.60277 -17.53875,24.60277 l -14.39149,0 0,-48.33208 z"
|
||||
id="path4186"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 27.55733,197.38829 0,2.97396 3.50775,0 0,18.7935 2.7452,0 0,-21.76746 -6.25295,0 z"
|
||||
id="path4204"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 56.4928,197.38829 0,3.06408 -8.83176,18.70338 -3.29978,0 9.2685,-18.7935 -12.13155,0 0,-2.97396 14.99459,0 z"
|
||||
id="path4222"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 58.51011,213.93572 c 5.81621,-1.24088 9.00507,-3.12647 11.02237,-4.3119 l 0,-6.48864 -11.02237,0 0,-2.82146 11.02237,0 0,-4.58919 2.5095,0 0,4.58919 7.79885,0 0,2.82146 -7.79885,0 0,4.7209 c 2.14902,-1.74001 3.00169,-2.98089 3.54935,-3.78504 l 2.00343,1.85093 c -0.92199,1.18542 -2.50949,3.29284 -5.55278,5.31015 l 0,8.22865 c 0,1.35874 -0.78335,2.18368 -2.11435,2.18368 l -4.54067,0 -0.36713,-2.86998 3.76424,0 c 0.73483,0 0.74869,-0.24956 0.74869,-0.8596 l 0,-5.1923 c -4.44361,2.4263 -8.09001,3.48002 -10.12811,4.0346 l -0.89427,-2.82145 z"
|
||||
id="path4240"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 90.2809,197.27044 c 2.04503,2.35005 3.07101,4.06233 4.7209,7.32745 l -2.19754,1.844 c -1.49045,-3.30671 -2.31539,-4.65851 -4.38122,-7.4869 l 1.85786,-1.68455 m -8.8803,19.15398 c 0.62391,-0.22183 1.01212,-0.33275 2.15595,-0.79722 l 0,-19.40354 2.50257,0 0,18.37756 c 0,0 3.67412,-1.60136 6.14896,-2.90464 l 0.47805,2.62735 c -2.65507,1.51818 -7.79885,3.94449 -10.84907,5.08138 l -0.43701,-2.98089 m 19.63231,-15.06392 c 0,4.00688 -0.7071,8.67926 -2.0589,11.7988 2.0589,2.57189 3.02249,3.81971 4.22178,5.89247 l -2.04503,2.50949 c -0.89427,-2.15595 -2.0381,-3.86823 -3.50775,-5.96872 -2.77293,4.20098 -6.3292,5.50426 -7.89591,6.05191 l -1.27554,-2.84225 c 9.33089,-2.6828 9.99639,-10.77974 9.99639,-17.62887 l 0,-4.75556 2.56496,0 0,4.94273 z"
|
||||
id="path4258"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 115.81261,195.72453 0,8.34651 8.59606,0 0,2.95316 -8.59606,0 0,10.77975 10.06571,0 0,2.90464 -21.6912,0 0,-2.90464 9.10212,0 0,-22.07942 2.52337,0 z"
|
||||
id="path4276"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 144.31134,195.70374 0,5.10911 -5.55278,0 0,2.95317 5.55278,0 0,14.34295 c 0,0.58232 -0.0499,0.6655 -0.78335,0.6655 l -3.55627,0 0.60311,2.84225 3.47309,0 c 1.76774,0 2.71053,-0.38821 2.71053,-2.50949 l 0,-15.34121 1.90639,0 0,-2.95317 -1.90639,0 0,-5.10911 -2.44711,0 m -16.56129,10.98771 c 0.82494,0.77642 2.33619,2.15595 4.3119,4.81103 -1.81627,4.0346 -4.18019,6.16282 -5.13685,7.04323 l 1.64989,2.55109 c 1.6083,-1.58057 3.63947,-3.78504 5.17844,-7.18881 1.28941,1.96185 2.0173,3.4315 2.50257,4.38815 l 1.92718,-1.84399 c -0.84574,-1.96185 -2.24607,-3.98608 -3.30671,-5.42107 1.17156,-3.61867 1.63602,-6.68275 1.86479,-8.31877 l 1.32407,0 0,-2.81452 -3.98608,0 0,-4.19405 -2.43324,0 0,4.19405 -4.3119,0 0,2.81452 6.94618,0 c -0.13144,1.35873 -0.36048,3.37603 -1.17156,6.0519 -1.83013,-2.2322 -2.97397,-3.3691 -3.61867,-4.00687 l -1.74001,1.93411 m 10.13504,0.77642 c 1.15076,2.15595 2.19754,4.92194 2.89077,7.32052 l 2.34313,-1.37953 c -1.37953,-4.22871 -2.36392,-6.13509 -3.05715,-7.34825 l -2.17675,1.40726 z"
|
||||
id="path4294"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
<path
|
||||
d="m 168.04758,205.92197 -6.00338,0 0,-2.57189 6.00338,0 0,2.57189 z m -13.71211,-4.74864 c 1.00518,-0.69323 1.71921,-1.27554 2.20447,-1.74001 l 6.6273,0 c -0.43702,0.60311 -0.89427,1.12997 -1.49738,1.74001 l -7.33439,0 m -3.16114,16.13843 c 4.51294,-1.1369 7.24427,-2.59962 8.77631,-3.68106 0.14586,0.36048 0.21463,0.60311 0.29781,0.97052 -1.42112,0.99132 -4.69317,2.81452 -10.11424,3.97222 l 0.76255,2.43324 c 5.019,-1.40726 8.11774,-3.06408 9.69831,-4.17325 0.0499,1.63602 -0.0693,2.07276 -1.3934,2.07276 l -2.02423,0 0.52686,2.73826 2.09355,0 c 1.24089,0 3.07107,0 3.07107,-4.0346 0,-0.51965 -0.0693,-4.09007 -1.64994,-6.41239 -0.43702,-0.60311 -0.75562,-0.99826 -0.97047,-1.21316 0.99132,-0.52685 1.79547,-1.1369 2.75906,-1.85093 1.14378,8.47822 4.44356,10.97386 7.61168,12.81785 l 1.46965,-2.5095 c -0.78335,-0.4786 -2.82145,-1.68455 -4.42282,-3.59787 1.46272,-0.99132 2.54416,-2.0173 3.6672,-3.175 l -1.87866,-1.96184 c -0.89427,1.1577 -2.0173,2.07276 -3.12647,2.9601 -0.31889,-0.72096 -0.82495,-2.35006 -1.14383,-4.53374 l 5.14377,0 0,-6.96004 -5.30322,0 c 0.96359,-1.1161 1.10224,-1.27554 1.42113,-1.74001 l 0,-2.21834 -7.9583,0 c 0.25622,-0.35382 0.36714,-0.52685 0.6863,-1.04678 l -2.44711,-0.61004 c -2.55109,3.72958 -5.73995,4.75556 -6.86299,5.10911 l 0.9636,2.43324 c 0.57538,-0.24235 0.71402,-0.33275 1.02598,-0.49247 l 0,5.52506 7.59781,0 c -2.7244,1.5459 -5.73302,2.23913 -8.69312,2.84918 l 0.78335,2.25993 c 1.28248,-0.27008 3.77812,-0.82494 6.73821,-2.21141 0.31889,0.33275 0.50634,0.56152 0.6655,0.77642 -2.63427,1.68455 -5.52505,2.62735 -8.48515,3.06408 l 0.71403,2.44018 m 8.66539,-11.38979 -5.75382,0 0,-2.57189 5.75382,0 0,2.57189 z"
|
||||
id="path4310"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</svg>
|
After Width: | Height: | Size: 17 KiB |
619
gaseous-server/Assets/Ratings/CERO/CERO_Z.svg
Normal file
@@ -0,0 +1,619 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="200"
|
||||
height="246"
|
||||
id="svg9739">
|
||||
<defs
|
||||
id="defs9741">
|
||||
<clipPath
|
||||
id="clipPath4316">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4318" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4322">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4324" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4334">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4336" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4340">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4342" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4352">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4354" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4358">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4360" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4370">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4372" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4376">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4378" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4388">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4390" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4394">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4396" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4406">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4408" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4412">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4414" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4424">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4426" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4430">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4432" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4442">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4444" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4448">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4450" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4460">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4462" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4466">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4468" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4478">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4480" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4484">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4486" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4496">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4498" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4502">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4504" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4514">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4516" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4520">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4522" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4532">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4534" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4538">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4540" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4550">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4552" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4556">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4558" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4568">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4570" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4574">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4576" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4586">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4588" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4592">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4594" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4604">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4606" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4610">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4612" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4622">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4624" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4628">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4630" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4640">
|
||||
<path
|
||||
d="m 167.764,623.106 25.636,0 0,32.015 -25.636,0 0,-32.015 z"
|
||||
id="path4642" />
|
||||
</clipPath>
|
||||
<clipPath
|
||||
id="clipPath4646">
|
||||
<path
|
||||
d="m 167.764,655.121 25.636,0 0,-32.015 -25.636,0 0,32.015 z"
|
||||
id="path4648" />
|
||||
</clipPath>
|
||||
</defs>
|
||||
<g
|
||||
transform="translate(0,-806.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(6.9323129,0,0,-6.9279567,-1151.8509,5357.1129)"
|
||||
id="g6170">
|
||||
<g
|
||||
transform="matrix(0.78291452,0,0,0.78291452,581.66676,507.41319)"
|
||||
id="g4664-2"
|
||||
style="stroke:none">
|
||||
<path
|
||||
d="m -493.872,148.092 c 0,-1.408 -1.141,-2.551 -2.551,-2.551 l -31.748,0 c -1.41,0 -2.551,1.143 -2.551,2.551 l 0,40.252 c 0,1.41 1.141,2.551 2.551,2.551 l 31.748,0 c 1.41,0 2.551,-1.141 2.551,-2.551 l 0,-40.252"
|
||||
id="path4666-7"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
<g
|
||||
id="g5197">
|
||||
<g
|
||||
id="g4312">
|
||||
<g
|
||||
clip-path="url(#clipPath4316)"
|
||||
id="g4314">
|
||||
<g
|
||||
clip-path="url(#clipPath4322)"
|
||||
id="g4320">
|
||||
<g
|
||||
transform="translate(548.525,294.87)"
|
||||
id="g4326">
|
||||
<path
|
||||
d="m -356.25,357 c 0,1.174 -0.952,2.126 -2.125,2.126 l -19.135,0 c -1.174,0 -2.126,-0.952 -2.126,-2.126 l 0,-22.645 23.386,0 0,22.645 z"
|
||||
id="path4328"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4330">
|
||||
<g
|
||||
clip-path="url(#clipPath4334)"
|
||||
id="g4332">
|
||||
<g
|
||||
clip-path="url(#clipPath4340)"
|
||||
id="g4338">
|
||||
<g
|
||||
transform="translate(548.525,269.358)"
|
||||
id="g4344">
|
||||
<path
|
||||
d="m -356.25,357 c 0,-1.174 -0.952,-2.127 -2.125,-2.127 l -19.135,0 c -1.174,0 -2.126,0.953 -2.126,2.127 l 0,25.512 c 0,1.174 0.952,2.126 2.126,2.126 l 19.135,0 c 1.173,0 2.125,-0.952 2.125,-2.126 l 0,-25.512 z"
|
||||
id="path4346"
|
||||
style="fill:none;stroke:#000000;stroke-width:0.56300002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4348">
|
||||
<g
|
||||
clip-path="url(#clipPath4352)"
|
||||
id="g4350">
|
||||
<g
|
||||
clip-path="url(#clipPath4358)"
|
||||
id="g4356">
|
||||
<g
|
||||
transform="translate(530.97,294.901)"
|
||||
id="g4362">
|
||||
<path
|
||||
d="m -356.25,357 c -0.424,0.285 -0.926,0.448 -1.444,0.448 -1.187,0 -1.526,-0.95 -1.526,-1.998 0,-1.196 0.581,-2.165 1.872,-2.165 0.674,0 1.288,0.252 1.869,0.563 l -0.433,-1.264 c -0.563,-0.155 -1.142,-0.208 -1.723,-0.208 -0.883,0 -1.628,0.15 -2.319,0.744 -0.668,0.564 -1.023,1.378 -1.023,2.26 0,0.798 0.338,1.637 0.945,2.176 0.658,0.56 1.566,0.768 2.415,0.768 l 1.307,-0.112 0.06,-1.212 z"
|
||||
id="path4364"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4366">
|
||||
<g
|
||||
clip-path="url(#clipPath4370)"
|
||||
id="g4368">
|
||||
<g
|
||||
clip-path="url(#clipPath4376)"
|
||||
id="g4374">
|
||||
<g
|
||||
transform="translate(533.87,291.352)"
|
||||
id="g4380">
|
||||
<path
|
||||
d="m -356.25,357 c 0.287,-0.116 0.608,-0.131 0.91,-0.131 0.485,0 0.935,0.079 1.264,0.477 l 0.044,0 -0.348,-1.307 -3.834,0 0,0.027 c 0.423,0.266 0.364,0.753 0.364,1.201 l 0,3.24 c 0,0.449 0.059,0.943 -0.364,1.201 l 0,0.027 3.031,0 c 0.129,0 0.268,0 0.363,0.045 l 0.025,0 0,-1.257 -0.025,0 c -0.234,0.408 -0.728,0.363 -1.151,0.363 l -0.279,0 0,-1.401 0.806,0 c 0.122,0 0.242,0.007 0.32,0.042 l 0.045,0 0,-1.211 -0.045,0 c -0.122,0.346 -0.518,0.311 -0.839,0.311 l -0.287,0 0,-1.627 z"
|
||||
id="path4382"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4384">
|
||||
<g
|
||||
clip-path="url(#clipPath4388)"
|
||||
id="g4386">
|
||||
<g
|
||||
clip-path="url(#clipPath4394)"
|
||||
id="g4392">
|
||||
<g
|
||||
transform="translate(538.286,295.247)"
|
||||
id="g4398">
|
||||
<path
|
||||
d="m -356.25,357 c 0.172,0 0.356,-0.017 0.503,-0.12 0.234,-0.165 0.347,-0.458 0.347,-0.739 0,-0.544 -0.401,-1.002 -0.936,-1.096 l 0,1.955 0.086,0 m -0.086,-2.416 1.004,-1.886 c 0.302,-0.536 0.58,-0.615 1.16,-0.583 l 1.196,0.079 c -0.348,0.285 -0.599,0.651 -0.832,1.04 l -1.03,1.723 c 0.572,0.244 1.03,0.718 1.03,1.368 0,0.581 -0.26,1.038 -0.771,1.317 -0.389,0.207 -0.735,0.198 -1.159,0.198 l -2.563,0 0,-0.027 c 0.423,-0.267 0.365,-0.759 0.365,-1.21 l 0,-3.221 c 0,-0.452 0.058,-0.945 -0.365,-1.211 l 0,-0.027 2.329,0 0,0.027 c -0.425,0.266 -0.364,0.759 -0.364,1.211 l 0,1.202 z"
|
||||
id="path4400"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4402">
|
||||
<g
|
||||
clip-path="url(#clipPath4406)"
|
||||
id="g4404">
|
||||
<g
|
||||
clip-path="url(#clipPath4412)"
|
||||
id="g4410">
|
||||
<g
|
||||
transform="translate(542.776,293.49)"
|
||||
id="g4416">
|
||||
<path
|
||||
d="m -356.25,357 c 0,0.892 0.45,1.87 1.471,1.87 1.188,0 1.575,-1.411 1.575,-2.399 0,-0.424 -0.059,-0.865 -0.321,-1.212 -0.276,-0.372 -0.691,-0.606 -1.15,-0.606 -0.492,0 -0.928,0.33 -1.168,0.746 -0.244,0.433 -0.407,1.099 -0.407,1.601 m -1.682,-0.233 c 0,-1.829 1.378,-2.98 3.153,-2.98 1.758,0 3.256,1.1 3.256,2.986 0,1.906 -1.334,2.962 -3.152,2.962 -1.757,0 -3.257,-1.126 -3.257,-2.968"
|
||||
id="path4418"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4420">
|
||||
<g
|
||||
clip-path="url(#clipPath4424)"
|
||||
id="g4422">
|
||||
<g
|
||||
clip-path="url(#clipPath4430)"
|
||||
id="g4428">
|
||||
<g
|
||||
transform="translate(536.084,277.782)"
|
||||
id="g4434">
|
||||
<path
|
||||
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
|
||||
id="path4436"
|
||||
style="fill:none;stroke:#ffffff;stroke-width:3.04900002;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4438">
|
||||
<g
|
||||
clip-path="url(#clipPath4442)"
|
||||
id="g4440">
|
||||
<g
|
||||
clip-path="url(#clipPath4448)"
|
||||
id="g4446">
|
||||
<g
|
||||
transform="translate(536.084,277.782)"
|
||||
id="g4452">
|
||||
<path
|
||||
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
|
||||
id="path4454"
|
||||
style="fill:none;stroke:#000000;stroke-width:1.52400005;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4456">
|
||||
<g
|
||||
clip-path="url(#clipPath4460)"
|
||||
id="g4458">
|
||||
<g
|
||||
clip-path="url(#clipPath4466)"
|
||||
id="g4464">
|
||||
<g
|
||||
transform="translate(536.084,277.782)"
|
||||
id="g4470">
|
||||
<path
|
||||
d="m -356.25,357 6.943,0 0,-2.952 -12.229,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
|
||||
id="path4472"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4474">
|
||||
<g
|
||||
clip-path="url(#clipPath4478)"
|
||||
id="g4476">
|
||||
<g
|
||||
clip-path="url(#clipPath4484)"
|
||||
id="g4482">
|
||||
<g
|
||||
transform="translate(535.83,277.782)"
|
||||
id="g4488">
|
||||
<path
|
||||
d="m -356.25,357 6.944,0 0,-2.952 -12.23,0 0,2.952 6.699,6.972 -6.437,0 0,2.951 11.706,0 0,-2.951 -6.682,-6.972 z"
|
||||
id="path4490"
|
||||
style="fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4492">
|
||||
<g
|
||||
clip-path="url(#clipPath4496)"
|
||||
id="g4494">
|
||||
<g
|
||||
clip-path="url(#clipPath4502)"
|
||||
id="g4500">
|
||||
<g
|
||||
transform="translate(527.119,271.394)"
|
||||
id="g4506">
|
||||
<path
|
||||
d="m -356.25,357 0,-3.14 -0.301,0 0,2.711 -0.384,0 0,0.429 0.685,0 z"
|
||||
id="path4508"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4510">
|
||||
<g
|
||||
clip-path="url(#clipPath4514)"
|
||||
id="g4512">
|
||||
<g
|
||||
clip-path="url(#clipPath4520)"
|
||||
id="g4518">
|
||||
<g
|
||||
transform="translate(528.776,269.688)"
|
||||
id="g4524">
|
||||
<path
|
||||
d="m -356.25,357 c 0.307,0 0.538,-0.059 0.538,-0.51 0,-0.39 -0.098,-0.534 -0.538,-0.534 -0.439,0 -0.532,0.156 -0.532,0.515 0,0.387 0.118,0.529 0.532,0.529 m -0.509,0.204 c -0.061,-0.028 -0.141,-0.064 -0.211,-0.223 -0.088,-0.203 -0.103,-0.431 -0.103,-0.562 0,-0.773 0.422,-0.886 0.826,-0.886 0.467,0 0.827,0.157 0.827,0.898 0,0.159 -0.021,0.362 -0.104,0.55 -0.072,0.163 -0.155,0.199 -0.208,0.223 0.238,0.135 0.269,0.535 0.269,0.682 0,0.829 -0.523,0.853 -0.784,0.853 -0.289,0 -0.781,-0.044 -0.781,-0.849 0,-0.148 0.028,-0.551 0.269,-0.686 m 0.512,1.12 c 0.336,0 0.49,-0.104 0.49,-0.438 0,-0.355 -0.093,-0.503 -0.475,-0.503 -0.281,0 -0.505,0.04 -0.505,0.471 0,0.306 0.075,0.47 0.49,0.47"
|
||||
id="path4526"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4528">
|
||||
<g
|
||||
clip-path="url(#clipPath4532)"
|
||||
id="g4530">
|
||||
<g
|
||||
clip-path="url(#clipPath4538)"
|
||||
id="g4536">
|
||||
<g
|
||||
transform="translate(529.823,269.007)"
|
||||
id="g4542">
|
||||
<path
|
||||
d="m -356.25,357 c 0.638,0.179 0.987,0.451 1.208,0.622 l 0,0.936 -1.208,0 0,0.407 1.208,0 0,0.662 0.274,0 0,-0.662 0.853,0 0,-0.407 -0.853,0 0,-0.681 c 0.236,0.251 0.329,0.43 0.389,0.546 l 0.218,-0.267 c -0.1,-0.171 -0.273,-0.475 -0.607,-0.766 l 0,-1.187 c 0,-0.196 -0.085,-0.315 -0.232,-0.315 l -0.497,0 -0.04,0.414 0.412,0 c 0.08,0 0.083,0.036 0.083,0.124 l 0,0.749 c -0.487,-0.35 -0.886,-0.502 -1.11,-0.582 L -356.25,357 z"
|
||||
id="path4544"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4546">
|
||||
<g
|
||||
clip-path="url(#clipPath4550)"
|
||||
id="g4548">
|
||||
<g
|
||||
clip-path="url(#clipPath4556)"
|
||||
id="g4554">
|
||||
<g
|
||||
transform="translate(533.099,271.168)"
|
||||
id="g4560">
|
||||
<path
|
||||
d="m -356.25,357 c 0.225,-0.408 0.316,-0.603 0.479,-1.08 l 0.241,0.266 c -0.18,0.471 -0.293,0.718 -0.517,1.057 L -356.25,357 m -0.721,-2.95 c 0.334,0.164 0.897,0.514 1.188,0.733 l -0.053,0.379 c -0.272,-0.188 -0.673,-0.419 -0.673,-0.419 l 0,2.651 -0.273,0 0,-2.799 c -0.126,-0.067 -0.169,-0.083 -0.237,-0.115 l 0.048,-0.43 m 2.102,3.316 -0.282,0 0,-0.686 c 0,-0.988 -0.072,-2.156 -1.094,-2.543 l 0.14,-0.41 c 0.171,0.079 0.561,0.267 0.865,0.873 0.16,-0.303 0.286,-0.55 0.383,-0.861 l 0.224,0.362 c -0.131,0.299 -0.236,0.479 -0.462,0.85 0.148,0.45 0.226,1.124 0.226,1.702 l 0,0.713 z"
|
||||
id="path4562"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4564">
|
||||
<g
|
||||
clip-path="url(#clipPath4568)"
|
||||
id="g4566">
|
||||
<g
|
||||
clip-path="url(#clipPath4574)"
|
||||
id="g4572">
|
||||
<g
|
||||
transform="translate(535.821,271.634)"
|
||||
id="g4578">
|
||||
<path
|
||||
d="m -356.25,357 0,-3.185 -0.997,0 0,-0.419 2.376,0 0,0.419 -1.102,0 0,1.555 0.941,0 0,0.426 -0.941,0 0,1.204 -0.277,0 z"
|
||||
id="path4580"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4582">
|
||||
<g
|
||||
clip-path="url(#clipPath4586)"
|
||||
id="g4584">
|
||||
<g
|
||||
clip-path="url(#clipPath4592)"
|
||||
id="g4590">
|
||||
<g
|
||||
transform="translate(538.522,268.082)"
|
||||
id="g4596">
|
||||
<path
|
||||
d="m -356.25,357 c 0.261,0.02 1.153,0.095 1.153,1.678 0,0.658 -0.222,1.563 -1.053,1.563 -0.745,0 -1.173,-0.81 -1.173,-1.77 0,-0.558 0.166,-1.156 0.495,-1.156 0.608,0 0.711,1.758 0.756,2.507 0.531,-0.052 0.66,-0.634 0.66,-1.1 0,-1.236 -0.61,-1.279 -0.911,-1.299 L -356.25,357 m -0.108,2.803 c -0.02,-0.447 -0.065,-1.176 -0.209,-1.683 -0.027,-0.095 -0.105,-0.366 -0.251,-0.366 -0.128,0 -0.23,0.235 -0.23,0.657 0,0.351 0.09,1.225 0.69,1.392"
|
||||
id="path4598"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4600">
|
||||
<g
|
||||
clip-path="url(#clipPath4604)"
|
||||
id="g4602">
|
||||
<g
|
||||
clip-path="url(#clipPath4610)"
|
||||
id="g4608">
|
||||
<g
|
||||
transform="translate(540.795,269.741)"
|
||||
id="g4614">
|
||||
<path
|
||||
d="m -356.25,357 c -0.042,-0.275 -0.155,-1.009 -0.394,-1.009 -0.083,0 -0.153,0.092 -0.153,0.295 0,0.136 0.048,0.661 0.547,0.714 m 0.915,1.04 c -0.006,-0.203 -0.016,-0.463 -0.06,-0.854 -0.242,0.113 -0.373,0.148 -0.533,0.176 0.018,0.152 0.045,0.403 0.06,0.638 0.035,0.534 0.038,0.594 0.043,0.658 l -1.075,0 0,-0.415 0.763,0 c -0.017,-0.371 -0.025,-0.55 -0.062,-0.869 -0.545,-0.027 -0.86,-0.546 -0.86,-1.068 0,-0.291 0.109,-0.722 0.411,-0.722 0.421,0 0.597,0.877 0.67,1.376 0.233,-0.044 0.457,-0.155 0.525,-0.188 -0.073,-0.434 -0.153,-0.861 -0.618,-1.096 l 0.168,-0.347 c 0.463,0.268 0.615,0.754 0.714,1.28 0.123,-0.088 0.188,-0.143 0.288,-0.227 l 0.095,0.442 c -0.075,0.068 -0.102,0.092 -0.318,0.223 0.04,0.344 0.06,0.591 0.082,0.945 l -0.293,0.048 z"
|
||||
id="path4616"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4618">
|
||||
<g
|
||||
clip-path="url(#clipPath4622)"
|
||||
id="g4620">
|
||||
<g
|
||||
clip-path="url(#clipPath4628)"
|
||||
id="g4626">
|
||||
<g
|
||||
transform="translate(544.292,271.637)"
|
||||
id="g4632">
|
||||
<path
|
||||
d="m -356.25,357 0,-0.737 -0.607,0 0,-0.426 0.607,0 0,-2.069 c 0,-0.084 -0.005,-0.096 -0.086,-0.096 l -0.388,0 0.065,-0.41 0.382,0 c 0.193,0 0.296,0.056 0.296,0.362 l 0,2.213 0.208,0 0,0.426 -0.208,0 0,0.737 -0.269,0 m -1.813,-1.585 c 0.09,-0.112 0.256,-0.311 0.472,-0.694 -0.198,-0.582 -0.457,-0.889 -0.562,-1.016 l 0.18,-0.368 c 0.176,0.228 0.4,0.546 0.568,1.037 0.14,-0.283 0.221,-0.495 0.273,-0.633 l 0.211,0.266 c -0.093,0.283 -0.246,0.575 -0.361,0.782 0.128,0.522 0.179,0.964 0.203,1.2 l 0.146,0 0,0.406 -0.437,0 0,0.605 -0.267,0 0,-0.605 -0.471,0 0,-0.406 0.76,0 c -0.014,-0.196 -0.04,-0.487 -0.127,-0.873 -0.202,0.322 -0.327,0.486 -0.397,0.578 l -0.191,-0.279 m 1.11,-0.112 c 0.125,-0.311 0.241,-0.71 0.316,-1.056 l 0.256,0.199 c -0.15,0.61 -0.259,0.885 -0.334,1.06 l -0.238,-0.203 z"
|
||||
id="path4634"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
<g
|
||||
id="g4636">
|
||||
<g
|
||||
clip-path="url(#clipPath4640)"
|
||||
id="g4638">
|
||||
<g
|
||||
clip-path="url(#clipPath4646)"
|
||||
id="g4644">
|
||||
<path
|
||||
d="m 190.642,627.163 -0.658,0 0,0.371 0.658,0 0,-0.371 z m -0.899,0 -0.631,0 0,0.371 0.631,0 0,-0.371 z m -0.949,-1.643 c 0.494,0.164 0.793,0.375 0.961,0.531 0.016,-0.052 0.023,-0.087 0.033,-0.14 -0.156,-0.143 -0.514,-0.406 -1.107,-0.573 l 0.083,-0.351 c 0.55,0.203 0.888,0.442 1.061,0.602 0.006,-0.236 -0.007,-0.299 -0.152,-0.299 l -0.222,0 0.058,-0.395 0.228,0 c 0.136,0 0.337,0 0.337,0.582 0,0.075 -0.007,0.59 -0.18,0.925 -0.048,0.087 -0.083,0.144 -0.106,0.175 0.108,0.076 0.196,0.164 0.301,0.267 0.126,-1.223 0.487,-1.583 0.834,-1.849 l 0.161,0.362 c -0.086,0.069 -0.309,0.243 -0.485,0.519 0.161,0.143 0.279,0.291 0.402,0.458 l -0.206,0.283 c -0.098,-0.167 -0.221,-0.299 -0.342,-0.427 -0.035,0.104 -0.09,0.339 -0.125,0.654 l 0.563,0 0,1.004 -0.58,0 c 0.105,0.161 0.12,0.184 0.155,0.251 l 0,0.32 -0.871,0 c 0.027,0.051 0.04,0.076 0.075,0.151 l -0.269,0.088 c -0.279,-0.538 -0.627,-0.686 -0.75,-0.737 l 0.105,-0.351 c 0.062,0.035 0.078,0.048 0.113,0.071 l 0,-0.797 0.831,0 c -0.299,-0.223 -0.628,-0.323 -0.952,-0.411 l 0.086,-0.326 c 0.141,0.039 0.414,0.119 0.738,0.319 0.036,-0.048 0.055,-0.081 0.073,-0.112 -0.288,-0.243 -0.605,-0.379 -0.929,-0.442 l 0.078,-0.352 m 0.346,2.328 c 0.111,0.1 0.188,0.184 0.241,0.251 l 0.726,0 c -0.047,-0.087 -0.098,-0.163 -0.164,-0.251 l -0.803,0 z"
|
||||
id="path4650"
|
||||
style="fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 25 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="400"
|
||||
height="400"
|
||||
id="svg3220">
|
||||
<defs
|
||||
id="defs3222" />
|
||||
<g
|
||||
transform="translate(0,-652.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.2951006,0,0,0.2951006,-4086.5531,-2336.2691)"
|
||||
id="g3176"
|
||||
style="fill-rule:evenodd">
|
||||
<rect
|
||||
width="1355.47"
|
||||
height="1355.47"
|
||||
rx="116.97"
|
||||
ry="116.97"
|
||||
x="13848"
|
||||
y="10127.5"
|
||||
id="rect62"
|
||||
style="fill:#000000;fill-opacity:1" />
|
||||
<g
|
||||
id="text82"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 14296.49,10455.472 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.642 -23.596,21.709 -36.809,30.203 -13.214,8.495 -27.686,15.574 -43.417,21.237 l 0,-120.812 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.494 37.045,-57.574 z"
|
||||
id="path2904"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
<g
|
||||
id="text84"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 14651.326,10909.458 0,64.653 c -10e-4,34.293 2.674,56.709 8.022,67.248 5.348,10.54 14.944,15.81 28.787,15.81 13.528,0 22.967,-5.899 28.315,-17.697 5.349,-11.798 8.023,-33.585 8.023,-65.361 l 0,-64.653 c 0,-33.978 -2.596,-56.158 -7.787,-66.54 -5.191,-10.382 -14.708,-15.574 -28.551,-15.574 -13.843,0 -23.439,5.585 -28.787,16.753 -5.348,11.169 -8.023,32.956 -8.022,65.361 z m 2.831,-299.668 0,33.978 c 0,34.922 2.438,57.496 7.315,67.72 4.876,10.225 13.764,15.338 26.663,15.337 12.27,10e-4 20.764,-5.584 25.484,-16.753 4.719,-11.168 7.078,-33.27 7.079,-66.304 l 0,-33.978 c 0,-33.663 -2.439,-55.922 -7.315,-66.777 -4.877,-10.854 -13.607,-16.281 -26.192,-16.281 -12.27,0 -20.843,5.663 -25.719,16.989 -4.877,11.327 -7.315,33.349 -7.315,66.069 z m -42.473,164.227 c -28.315,-8.179 -50.574,-23.359 -66.776,-45.54 -16.203,-22.18 -24.304,-48.843 -24.304,-79.99 l 0,-38.697 c 0,-58.203 13.135,-100.283 39.405,-126.239 26.27,-25.955 68.979,-38.932 128.126,-38.933 58.833,0 101.227,12.9 127.182,38.697 25.956,25.799 38.933,67.957 38.934,126.475 l 0,38.697 c 0,31.147 -7.945,57.889 -23.832,80.226 -15.888,22.338 -37.99,37.439 -66.305,45.304 30.517,8.81 53.799,25.012 69.844,48.608 16.045,23.596 24.068,53.484 24.068,89.665 l 0,62.765 c 0,58.203 -13.529,100.361 -40.585,126.474 -27.057,26.113 -70.473,39.169 -130.25,39.169 -60.091,0 -103.35,-12.899 -129.777,-38.697 -26.428,-25.798 -39.642,-68.114 -39.641,-126.946 l 0,-62.765 c -10e-4,-36.495 7.943,-66.462 23.831,-89.901 15.888,-23.438 39.248,-39.562 70.08,-48.372 z"
|
||||
id="path2901"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 3.0 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="400"
|
||||
height="400"
|
||||
id="svg3105">
|
||||
<defs
|
||||
id="defs3107" />
|
||||
<g
|
||||
transform="translate(0,-652.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.2951006,0,0,0.2951006,-3138.8375,-2336.2691)"
|
||||
id="g3115"
|
||||
style="fill-rule:evenodd">
|
||||
<rect
|
||||
width="1355.47"
|
||||
height="1355.47"
|
||||
rx="116.97"
|
||||
ry="116.97"
|
||||
x="10636.5"
|
||||
y="10127.5"
|
||||
id="rect58"
|
||||
style="fill:#ff6600;fill-opacity:1" />
|
||||
<g
|
||||
id="text70"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 11074.291,10448.072 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.641 -23.596,21.709 -36.81,30.203 -13.214,8.495 -27.686,15.574 -43.416,21.236 l 0,-120.811 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.495 37.045,-57.574 z"
|
||||
id="path2892"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
<g
|
||||
id="text72"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 11464.892,10546.231 -86.362,327.04 87.305,0 7.551,-327.04 z m -59.934,-98.159 184.52,0 0,425.199 81.17,0 0,100.518 -81.17,0 0,147.711 -127.89,0 0,-147.711 -182.632,0 0,-115.148 z"
|
||||
id="path2889"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
119
gaseous-server/Assets/Ratings/CLASS_IND/CLASS_IND_L.svg
Normal file
@@ -0,0 +1,119 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="354pt"
|
||||
height="354pt"
|
||||
viewBox="0 0 354 354"
|
||||
version="1.1"
|
||||
id="svg2"
|
||||
inkscape:version="0.47 r22583"
|
||||
sodipodi:docname="simbolo_L.svg">
|
||||
<metadata
|
||||
id="metadata14">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs12">
|
||||
<inkscape:perspective
|
||||
sodipodi:type="inkscape:persp3d"
|
||||
inkscape:vp_x="0 : 221.25 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_z="442.5 : 221.25 : 1"
|
||||
inkscape:persp3d-origin="221.25 : 147.5 : 1"
|
||||
id="perspective16" />
|
||||
<inkscape:perspective
|
||||
id="perspective5685"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2830"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
<inkscape:perspective
|
||||
id="perspective2837"
|
||||
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
|
||||
inkscape:vp_z="1 : 0.5 : 1"
|
||||
inkscape:vp_y="0 : 1000 : 0"
|
||||
inkscape:vp_x="0 : 0.5 : 1"
|
||||
sodipodi:type="inkscape:persp3d" />
|
||||
</defs>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1366"
|
||||
inkscape:window-height="706"
|
||||
id="namedview10"
|
||||
showgrid="false"
|
||||
inkscape:zoom="1.4142136"
|
||||
inkscape:cx="42.076033"
|
||||
inkscape:cy="175.40561"
|
||||
inkscape:window-x="-8"
|
||||
inkscape:window-y="-8"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg2" />
|
||||
<path
|
||||
fill="#ffffff"
|
||||
d=" M 0.00 0.00 L 354.00 0.00 L 354.00 354.00 L 0.00 354.00 L 0.00 0.00 Z"
|
||||
id="path4"
|
||||
style="fill:none" />
|
||||
<path
|
||||
fill="#00ff01"
|
||||
d=" M 24.04 1.33 C 28.26 0.34 32.63 0.68 36.92 0.69 C 129.93 0.64 222.94 0.69 315.94 0.67 C 321.14 0.81 326.48 0.10 331.53 1.71 C 341.18 4.45 349.38 12.30 352.10 22.02 C 353.96 27.50 353.27 33.37 353.33 39.05 C 353.31 133.68 353.36 228.32 353.33 322.96 C 353.99 336.73 343.41 349.64 330.16 352.70 C 324.85 353.91 319.38 353.10 314.00 353.34 C 219.03 353.29 124.07 353.37 29.10 353.30 C 13.52 353.01 -0.07 338.60 0.63 323.03 C 0.73 225.05 0.62 127.07 0.66 29.09 C 1.12 16.00 11.23 4.03 24.04 1.33 Z"
|
||||
id="path6"
|
||||
style="font-size:115.20000000000000000;fill:#00af51;fill-opacity:1" />
|
||||
<path
|
||||
sodipodi:type="star"
|
||||
style="fill:#000000;fill-opacity:0;stroke:#e5a795;stroke-width:0.30704767;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
id="path2833"
|
||||
sodipodi:sides="6"
|
||||
sodipodi:cx="-235.3125"
|
||||
sodipodi:cy="199.6875"
|
||||
sodipodi:r1="248.7345"
|
||||
sodipodi:r2="121.61405"
|
||||
sodipodi:arg1="0.31817488"
|
||||
sodipodi:arg2="0.84177366"
|
||||
inkscape:flatsided="true"
|
||||
inkscape:rounded="0.21"
|
||||
inkscape:randomized="0.047"
|
||||
d="M -5.1364516,281.44995 C -24.575715,330.89015 -128.92949,424.60631 -179.55867,439.06353 c -50.62919,14.45723 -205.46046,-30.38142 -237.64156,-71.34481 -32.1811,-40.96339 -62.82664,-195.89571 -47.08516,-245.29738 15.74147,-49.401666 132.44989,-160.73297 182.11886,-172.794056 49.66898,-12.061087 208.235183,35.98315 242.799921,73.898616 34.5647381,37.915467 53.669421,208.48385 34.2301574,257.92405 z"
|
||||
transform="scale(0.8,0.8)" />
|
||||
<path
|
||||
style="fill:none;stroke:#e5a795;stroke-width:0.03838096;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m -80.129648,421.69337 0,-47.875 40.433378,0 40.4333757,0 0.0392813,17.53125 c 0.0390425,17.42523 0.0409388,17.54032 0.3135874,19.03125 1.18576,6.4841 3.47284,11.61964 7.4934638,16.82628 1.3294087,1.72156 4.6348698,5.07131 6.3470728,6.43211 2.921248,2.32172 7.064167,4.69583 10.230696,5.86273 2.936586,1.08216 6.151469,1.80702 9.122204,2.0568 1.118575,0.0941 22.847278,0.13458 72.156249,0.13458 l 70.55569,0 0,13.9375 0,13.9375 -128.562498,0 -128.5625,0 0,-47.875 z"
|
||||
id="path2841"
|
||||
transform="scale(0.8,0.8)" />
|
||||
<path
|
||||
style="fill:none;stroke:#e5a795;stroke-width:0.03838096;stroke-miterlimit:60;stroke-opacity:0.11372549;stroke-dasharray:none;stroke-dashoffset:0"
|
||||
d="m 329.99196,455.62441 0,-13.94395 38.71875,0.016 c 41.80885,0.0173 39.7712,0.0463 43.21875,-0.61555 4.69148,-0.90068 9.86536,-3.21683 14.125,-6.32324 7.50298,-5.47166 12.92846,-13.58455 14.86809,-22.23274 0.77966,-3.47628 0.74042,-2.40988 0.78602,-21.36282 l 0.0417,-17.34375 72.68333,0 72.68334,0 0,47.875 0,47.875 -128.5625,0 -128.5625,0 0,-13.94396 z"
|
||||
id="path2843"
|
||||
transform="scale(0.8,0.8)" />
|
||||
<path
|
||||
style="fill:#ffffff"
|
||||
d="m 128.92667,98.96268 c 14.42,-0.25 28.86,-0.04 43.29,-0.09 0.38,42.24 0.11,84.49999 0.13,126.73999 23.22,0.12 46.44001,-0.18 69.65001,0.15 0.29,10.04 0.12,20.1 0.08,30.15 -37.72001,0.14 -75.44001,0.03 -113.16001,0.04 -0.07,-52.33 -0.09,-104.65999 0.01,-156.98999 z"
|
||||
id="path8" />
|
||||
</svg>
|
After Width: | Height: | Size: 5.7 KiB |
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="400"
|
||||
height="400"
|
||||
id="svg3166">
|
||||
<defs
|
||||
id="defs3168" />
|
||||
<g
|
||||
transform="translate(0,-652.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.2951006,0,0,0.2951006,-3612.71,-2336.2691)"
|
||||
id="g3159"
|
||||
style="fill-rule:evenodd">
|
||||
<rect
|
||||
width="1355.47"
|
||||
height="1355.47"
|
||||
rx="116.97"
|
||||
ry="116.97"
|
||||
x="12242.3"
|
||||
y="10127.5"
|
||||
id="rect60"
|
||||
style="fill:#fe0000;fill-opacity:1" />
|
||||
<g
|
||||
id="text78"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 12688.49,10448.072 114.205,0 0,673.428 -130.25,0 0,-500.706 c -11.326,11.641 -23.596,21.709 -36.809,30.203 -13.214,8.495 -27.686,15.574 -43.417,21.236 l 0,-120.811 c 23.281,-13.213 43.023,-28.472 59.226,-45.776 16.202,-17.303 28.551,-36.495 37.045,-57.574 z"
|
||||
id="path2898"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
<g
|
||||
id="text80"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 13111.542,10873.271 c 0,-34.607 -2.281,-57.102 -6.843,-67.485 -4.562,-10.382 -12.821,-15.573 -24.776,-15.573 -11.955,0 -20.292,5.899 -25.011,17.697 -4.72,11.798 -7.079,33.585 -7.079,65.361 l 0,93.44 c 0,34.607 2.281,57.102 6.843,67.484 4.561,10.382 12.977,15.573 25.247,15.573 11.641,0 19.821,-5.663 24.54,-16.989 4.719,-11.326 7.079,-33.349 7.079,-66.068 z m 136.384,-270.882 0,7.079 -136.384,0 0,-7.079 c 0,-34.607 -2.281,-57.101 -6.843,-67.484 -4.562,-10.382 -12.821,-15.573 -24.776,-15.574 -11.955,0 -20.292,5.979 -25.011,17.933 -4.72,11.956 -7.079,33.664 -7.079,65.125 l 0,136.385 c 11.955,-15.73 25.405,-27.371 40.349,-34.922 14.944,-7.551 32.169,-11.326 51.675,-11.326 37.753,0 65.36,12.034 82.822,36.101 17.46,24.069 26.191,62.53 26.191,115.385 l 0,72.675 c 0,82.114 -12.349,138.744 -37.045,169.891 -24.698,31.147 -68.35,46.72 -130.958,46.72 -62.923,0 -106.732,-15.495 -131.429,-46.484 -24.697,-30.989 -37.046,-87.698 -37.046,-170.127 l 0,-263.803 c 0,-82.113 12.349,-138.586 37.046,-169.418 24.697,-30.832 68.506,-46.248 131.429,-46.248 63.237,0 106.889,11.72 130.958,35.157 24.067,23.44 36.101,66.778 36.101,130.014 z"
|
||||
id="path2895"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.7 KiB |
47
gaseous-server/Assets/Ratings/CLASS_IND/CLASS_IND_Ten.svg
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="400"
|
||||
height="400"
|
||||
id="svg2997">
|
||||
<defs
|
||||
id="defs2999" />
|
||||
<g
|
||||
transform="translate(0,-652.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.2951006,0,0,0.2951006,-2143.7583,-2336.2691)"
|
||||
id="g3007"
|
||||
style="fill-rule:evenodd">
|
||||
<rect
|
||||
width="1355.47"
|
||||
height="1355.47"
|
||||
rx="116.97"
|
||||
ry="116.97"
|
||||
x="7264.5"
|
||||
y="10127.5"
|
||||
id="rect54"
|
||||
style="fill:#00ccff;fill-opacity:1" />
|
||||
<g
|
||||
id="text66"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 7731.4606,10475.171 114.2044,0 0,673.429 -130.2496,0 0,-500.706 c -11.3262,11.641 -23.5961,21.708 -36.8097,30.202 -13.2138,8.495 -27.686,15.574 -43.4165,21.237 l 0,-120.811 c 23.2812,-13.214 43.0231,-28.472 59.2258,-45.777 16.2024,-17.303 28.5509,-36.494 37.0456,-57.574 z"
|
||||
id="path2871"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
<g
|
||||
id="text68"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 8292.9562,10679.984 0,263.803 c -3e-4,81.799 -12.5062,138.351 -37.5175,169.655 -25.012,31.304 -69.1364,46.956 -132.3733,46.956 -63.8665,0 -108.2268,-15.574 -133.0811,-46.72 -24.8545,-31.147 -37.2817,-87.777 -37.2816,-169.891 l 0,-263.803 c -1e-4,-82.113 12.4271,-138.586 37.2816,-169.419 24.8543,-30.831 69.2146,-46.247 133.0811,-46.248 63.5515,0 107.7545,15.417 132.6092,46.248 24.8541,30.833 37.2813,87.306 37.2816,169.419 z m -136.3845,-50.495 c -3e-4,-33.663 -2.4385,-55.922 -7.3148,-66.777 -4.8767,-10.853 -13.6072,-16.28 -26.1915,-16.281 -12.5847,0 -21.3938,5.9 -26.4274,17.697 -5.034,11.799 -7.5509,33.585 -7.5507,65.361 l 0,364.321 c -2e-4,34.922 2.438,57.496 7.3147,67.721 4.8763,10.225 13.7641,15.337 26.6634,15.337 12.2697,0 20.9215,-5.742 25.9556,-17.225 5.0335,-11.483 7.5504,-33.428 7.5507,-65.833 z"
|
||||
id="path2868"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.4 KiB |
47
gaseous-server/Assets/Ratings/CLASS_IND/CLASS_IND_Twelve.svg
Normal file
@@ -0,0 +1,47 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
version="1.1"
|
||||
width="400"
|
||||
height="400"
|
||||
id="svg3051">
|
||||
<defs
|
||||
id="defs3053" />
|
||||
<g
|
||||
transform="translate(0,-652.36218)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="matrix(0.2951006,0,0,0.2951006,-2641.3037,-2336.2691)"
|
||||
id="g3061"
|
||||
style="fill-rule:evenodd">
|
||||
<rect
|
||||
width="1355.47"
|
||||
height="1355.47"
|
||||
rx="116.97"
|
||||
ry="116.97"
|
||||
x="8950.5195"
|
||||
y="10127.5"
|
||||
id="rect56"
|
||||
style="fill:#ffcc00;fill-opacity:1" />
|
||||
<g
|
||||
id="text74"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 9402.1311,10473.972 114.2043,0 0,673.428 -130.2496,0 0,-500.706 c -11.3262,11.642 -23.5961,21.709 -36.8097,30.203 -13.2138,8.495 -27.686,15.574 -43.4165,21.237 l 0,-120.812 c 23.2812,-13.213 43.0231,-28.472 59.2258,-45.776 16.2024,-17.303 28.551,-36.494 37.0457,-57.574 z"
|
||||
id="path2886"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
<g
|
||||
id="text76"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT">
|
||||
<path
|
||||
d="m 9961.739,10645.751 0,9.91 c -4e-4,31.147 -4.5623,60.17 -13.6857,87.069 -9.1241,26.9 -24.5401,55.765 -46.248,86.597 l -151.9579,215.667 223.2176,0 0,102.406 -361.018,0 0,-125.53 157.149,-229.353 c 18.2474,-26.112 32.169,-50.888 41.7649,-74.327 9.5954,-23.438 14.3933,-44.281 14.3935,-62.529 l 0,-27.371 c -2e-4,-33.663 -2.4385,-55.922 -7.3147,-66.777 -4.8768,-10.854 -13.7646,-16.281 -26.6635,-16.281 -11.9554,0 -20.3713,5.663 -25.2476,16.989 -4.8767,11.327 -7.3149,33.349 -7.3148,66.069 l 0,27.371 -136.3845,0 0,-9.91 c -10e-5,-68.9 12.4271,-116.564 37.2816,-142.992 24.8542,-26.427 69.2146,-39.64 133.0811,-39.641 63.5515,0 107.5972,13.057 132.1373,39.169 24.5394,26.114 36.8093,73.935 36.8097,143.464 z"
|
||||
id="path2883"
|
||||
style="font-size:966.48999023px;font-weight:normal;fill:#ffffff;font-family:Zurich BdXCn BT" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 2.3 KiB |
1
gaseous-server/Assets/Ratings/ESRB/AO.svg
Normal file
After Width: | Height: | Size: 9.7 KiB |
1
gaseous-server/Assets/Ratings/ESRB/E.svg
Normal file
After Width: | Height: | Size: 5.6 KiB |
1
gaseous-server/Assets/Ratings/ESRB/E10.svg
Normal file
After Width: | Height: | Size: 7.7 KiB |
1
gaseous-server/Assets/Ratings/ESRB/M.svg
Normal file
After Width: | Height: | Size: 5.5 KiB |
1
gaseous-server/Assets/Ratings/ESRB/RP-LM17-English.svg
Normal file
After Width: | Height: | Size: 8.5 KiB |
1
gaseous-server/Assets/Ratings/ESRB/RP.svg
Normal file
After Width: | Height: | Size: 9.1 KiB |
1
gaseous-server/Assets/Ratings/ESRB/T.svg
Normal file
@@ -0,0 +1 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?> <svg xmlns="http://www.w3.org/2000/svg" width="60.42" height="90.628" viewBox="0 0 60.42 90.628"><g id="Group_404" data-name="Group 404" transform="translate(-960 -867)"><g id="Group_275" data-name="Group 275" transform="translate(960 867)"><path id="Path_243" data-name="Path 243" d="M217.98,513.479H157.561v90.628H217.98V513.479Z" transform="translate(-157.561 -513.479)" fill="#fff"></path><g id="Group_257" data-name="Group 257" transform="translate(0.878 0.972)"><g id="Group_254" data-name="Group 254"><path id="Path_244" data-name="Path 244" d="M216.8,514.118V602.8H158.138V514.118H216.8" transform="translate(-158.138 -514.118)" fill="#1a1818"></path></g><rect id="Rectangle_182" data-name="Rectangle 182" width="52.336" height="14.704" transform="translate(2.952 3.152)" fill="#fff"></rect><rect id="Rectangle_183" data-name="Rectangle 183" width="52.366" height="54.062" transform="translate(2.928 21.065)" fill="#fff"></rect><g id="Group_255" data-name="Group 255" transform="translate(2.939 78.13)"><path id="Path_245" data-name="Path 245" d="M160.068,572.732v-7.178h10.513v1.68h-6.29v1.026h5.323v1.674h-5.323v1.124h6.534v1.674Z" transform="translate(-160.068 -565.375)" fill="#fff"></path><path id="Path_246" data-name="Path 246" d="M175.532,567.706a.794.794,0,0,0-.609-.486,3.842,3.842,0,0,0-1.092-.132c-.929,0-1.344.151-1.344.419,0,1.061,7.414.4,7.414,3.007,0,1.661-2.494,2.474-6.034,2.474-3.4,0-5.621-1.107-5.711-2.4H172.2a1.033,1.033,0,0,0,.7.566,3.823,3.823,0,0,0,1.2.181c1.055,0,1.758-.187,1.758-.527,0-1.088-7.419-.342-7.419-3.078,0-1.524,2.364-2.29,5.589-2.29,3.576,0,5.208,1.015,5.516,2.27Z" transform="translate(-155.842 -565.436)" fill="#fff"></path><path id="Path_247" data-name="Path 247" d="M181.473,568.667h1.661c1.308,0,2.01-.19,2.01-.685s-.716-.749-1.7-.749h-1.969Zm0,1.564v2.5H177.25v-7.178h6.088c4.29,0,5.708.656,5.708,2.051,0,.83-.661,1.519-2.165,1.761,1.36.273,2.185.443,2.185,1.891,0,.933-.055,1.258.446,1.258v.218h-4.283a2.793,2.793,0,0,1-.212-1.256c0-.942-.286-1.245-2.255-1.245Z" transform="translate(-151.092 -565.374)" fill="#fff"></path><path id="Path_248" data-name="Path 248" d="M190.925,567.233v1.2h1.76c.842,0,1.452-.216,1.452-.627,0-.562-.833-.574-1.72-.574Zm0,2.5v1.323h1.842c1.047,0,1.833-.122,1.833-.658,0-.627-.982-.665-2.332-.665Zm-4.222,3v-7.178h6.161c2.9,0,5.211.39,5.211,1.81,0,.74-.863,1.279-1.684,1.559,1.395.2,2.144.874,2.144,1.644,0,1.6-2.2,2.165-5.551,2.165Z" transform="translate(-146.153 -565.374)" fill="#fff"></path></g><path id="Path_249" data-name="Path 249" d="M162.932,540.039l40.512-10.1,3.116,10.8-13.017,3.244,8.729,30.336-14.484,3.613-8.735-30.336-13.01,3.247Z" transform="translate(-155.634 -505.854)" fill="#1a1818"></path><g id="Group_256" data-name="Group 256" transform="translate(4.406 6.337)"><path id="Path_250" data-name="Path 250" d="M186.381,518.28h3.44l3.991,4.544-.138-1.9V518.28h3.518v8.32h-3.436l-4-4.532.067,1.964.074,2.568h-3.518Z" transform="translate(-147.788 -518.28)" fill="#1a1818"></path><path id="Path_251" data-name="Path 251" d="M178.241,518.28h9.123v1.933h-5.458v1.2h4.618v1.942h-4.618v1.3h5.675V526.6h-9.34Z" transform="translate(-152.04 -518.28)" fill="#1a1818"></path><path id="Path_252" data-name="Path 252" d="M169.818,518.28h9.125v1.933h-5.458v1.2H178.1v1.942h-4.616v1.3h5.679V526.6h-9.346Z" transform="translate(-156.441 -518.28)" fill="#1a1818"></path><path id="Path_253" data-name="Path 253" d="M161.032,518.28h10.26v2.183H168V526.6h-3.675v-6.137h-3.294Z" transform="translate(-161.032 -518.28)" fill="#1a1818"></path></g></g></g></g></svg>
|
After Width: | Height: | Size: 3.5 KiB |
53
gaseous-server/Assets/Ratings/GRAC/GRAC_All.svg
Normal file
@@ -0,0 +1,53 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
|
||||
<g>
|
||||
<rect x="21.597" y="23.875" fill="#44A342" width="660.169" height="695.359"/>
|
||||
<path fill="#FFFFFF" d="M556.866,674.714L477.189,82.148H212.076l-75.761,592.965l177.216-1.126v-43.874h63.717v44.602H556.866z
|
||||
M318.292,515.422l26.333-249.205l26.349,249.205H318.292z"/>
|
||||
<polygon fill="#9CA3AB" points="491.938,553.652 491.938,407.103 409.107,407.103 409.107,557.535 409.107,617.369
|
||||
494.723,617.369 536.54,617.369 536.54,553.652 "/>
|
||||
<polygon fill="#FFFFFF" points="638.487,553.652 638.487,407.103 549.284,407.103 549.284,557.535 549.284,617.369
|
||||
636.736,617.369 683.089,617.369 683.089,553.652 "/>
|
||||
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.532,0,51.365v731.96c0,24.821,26.333,51.365,50.973,51.365h618.053
|
||||
c24.631,0,50.973-26.544,50.973-51.365V51.365C720,26.532,693.658,0,669.027,0 M675.314,627.412
|
||||
c0,21.267-17.121,38.528-38.23,38.528H82.913c-21.116,0-38.236-17.261-38.236-38.528V81.65c0-21.274,17.121-38.523,38.236-38.523
|
||||
h554.171c21.109,0,38.23,17.248,38.23,38.523V627.412z"/>
|
||||
<path fill="#FFFFFF" d="M142.401,708.177v9.769h-21.485c0,8.544,2.893,15.967,8.677,22.245c4.607,4.928,10.833,9.01,18.707,12.196
|
||||
l-7.461,7.784c-5.784-2.29-11.138-4.934-16.032-7.958c-5.339-3.311-9.389-6.627-12.13-9.95c-2.601,3.261-6.568,6.577-11.916,9.95
|
||||
c-4.894,3.024-10.162,5.668-15.808,7.958l-6.676-7.784c7.715-3.067,13.77-7.131,18.147-12.196
|
||||
c5.345-6.147,8.014-13.57,8.014-22.245H84.07v-9.769H142.401z M105.88,782.69h66.909v9.769h-68.794
|
||||
c-5.271,0-9.057-0.753-11.356-2.272c-2.153-1.487-3.23-3.938-3.23-7.311v-18.456h16.471V782.69z M172.011,769.86h-16.477v-32.842
|
||||
h-18.148v-9.844h18.148v-20.802h16.477V769.86z"/>
|
||||
<path fill="#FFFFFF" d="M212.997,714.412v-8.506h16.471v8.506h15.584v9.682h-15.584v14c0,10.441,1.929,19.501,5.784,27.236
|
||||
c3.204,6.446,7.576,11.617,13.145,15.462l-10.13,6.241c-4.231-2.949-7.684-6.322-10.354-10.124c-3.338-4.592-5.6-9.918-6.792-16.01
|
||||
c-1.409,6.142-3.824,11.512-7.233,16.091c-2.969,3.864-6.714,7.199-11.244,10.043l-9.016-6.241
|
||||
c5.784-3.802,10.307-8.917,13.583-15.376c3.855-7.535,5.787-16.638,5.787-27.322v-14h-15.363v-9.682H212.997z M237.049,749.494
|
||||
v-9.483h13.462v-33.638h16.471v86.995h-16.471v-43.874H237.049z M292.036,793.368H275.56v-86.995h16.477V793.368z"/>
|
||||
<path fill="#FFFFFF" d="M371.098,717.847c5.046,7.292,7.57,16.589,7.57,27.851c0,11.935-2.523,21.66-7.57,29.121
|
||||
c-5.348,8.133-12.84,12.214-22.488,12.214c-9.723,0-17.292-4.082-22.714-12.214c-4.969-7.461-7.455-17.186-7.455-29.121
|
||||
c0-11.263,2.486-20.559,7.455-27.851c5.491-7.952,13.066-11.94,22.714-11.94C358.18,705.906,365.681,709.895,371.098,717.847
|
||||
M338.256,724.362c-2.153,5.482-3.229,12.569-3.229,21.255c0,9.408,1.076,16.968,3.229,22.687
|
||||
c2.371,6.147,5.787,9.234,10.239,9.234c4.377,0,7.756-3.086,10.134-9.234c2.221-5.719,3.338-13.279,3.338-22.687
|
||||
c0-8.687-1.117-15.774-3.338-21.255c-2.455-5.973-5.831-8.948-10.134-8.948C344.117,715.414,340.705,718.389,338.256,724.362
|
||||
M408.721,793.368h-16.477v-86.995h16.477V793.368z"/>
|
||||
<path fill="#FFFFFF" d="M443.582,731.231c-2.153-2.29-3.223-4.741-3.223-7.312c0-5.021,3.562-9.196,10.684-12.594
|
||||
c7.862-3.609,18.664-5.42,32.394-5.42c13.655,0,24.456,1.811,32.393,5.42c7.202,3.397,10.802,7.573,10.802,12.594
|
||||
c0,2.57-1.117,5.022-3.339,7.312c-2.377,2.352-5.718,4.399-10.024,6.147v9.321h18.375v9.85h-96.409v-9.85h18.148v-9.321
|
||||
C449.073,735.63,445.813,733.583,443.582,731.231 M514.492,766.96c6.978,3.186,10.469,7.131,10.469,11.841
|
||||
c0,4.58-3.49,8.462-10.469,11.673c-7.722,3.547-18.101,5.327-31.165,5.327c-13.138,0-23.568-1.78-31.283-5.327
|
||||
c-6.901-3.211-10.348-7.093-10.348-11.673c0-4.71,3.447-8.655,10.348-11.841c7.715-3.566,18.145-5.345,31.283-5.345
|
||||
C496.391,761.615,506.77,763.394,514.492,766.96 M463.845,718.301c-4.309,1.45-6.456,3.304-6.456,5.619
|
||||
c0,2.215,2.147,4.051,6.456,5.501c4.676,1.581,11.131,2.352,19.37,2.352s14.731-0.772,19.482-2.352
|
||||
c4.296-1.45,6.449-3.285,6.449-5.501c0-2.314-2.153-4.169-6.449-5.619c-4.751-1.506-11.244-2.265-19.482-2.265
|
||||
S468.521,716.796,463.845,718.301 M464.399,773.836c-4.157,1.307-6.226,2.943-6.226,4.878c0,1.929,2.069,3.554,6.226,4.891
|
||||
c4.676,1.493,11.022,2.24,19.037,2.24c7.793,0,13.988-0.747,18.592-2.24c4.225-1.337,6.34-2.962,6.34-4.891
|
||||
c0-1.935-2.115-3.571-6.34-4.878c-4.604-1.45-10.799-2.178-18.592-2.178C475.421,771.658,469.075,772.386,464.399,773.836
|
||||
M496.798,746.7v-5.6c-1.938,0.231-4.054,0.442-6.353,0.616c-2.078,0.137-4.409,0.187-7.009,0.187c-2.67,0-5.053-0.05-7.122-0.187
|
||||
c-2.377-0.174-4.533-0.385-6.462-0.616v5.6H496.798z"/>
|
||||
<path fill="#FFFFFF" d="M606.915,708.177v26.949c0,12.893-4.16,23.726-12.47,32.456c-7.715,8.026-19.183,14.492-34.4,19.451
|
||||
l-6.562-7.411c11.132-3.87,19.771-8.786,25.931-14.753c7.424-7.174,11.138-15.817,11.138-25.941v-20.901h-34.4v-9.85H606.915z
|
||||
M643.872,706.373v35.262h11.247v9.962h-11.247v41.771h-16.477v-86.995H643.872z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.1 KiB |
68
gaseous-server/Assets/Ratings/GRAC/GRAC_Eighteen.svg
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
|
||||
<g>
|
||||
<rect x="21.604" y="23.875" fill="#A31639" width="660.165" height="695.353"/>
|
||||
<path fill="#9CA3AB" d="M322.006,88.519c-69.814,89.204-161.395,95.183-174.138,95.42v81.295c0,0,7.977,0.131,65.011,0.298
|
||||
c37.446,0.1,36.936,37.285,36.936,37.285v371.897h127.06h312.586V612.31V448.04V158.676V88.519H322.006z"/>
|
||||
<path fill="#FFFFFF" d="M567.727,121.815c-104.262,0-181.381,38.665-181.381,150.848c0,75.981,18.922,97.168,47.134,117.229
|
||||
c-24.342,18.573-58.384,53.313-58.384,159.33c0,112.189,19.519,119.12,60.17,138.236h172.042c26.022,0,69.411,7.367,82.154,1.947
|
||||
v-281.99V149.249C663.974,132.779,628.395,121.815,567.727,121.815 M593.886,610.879c0,19.812-10.927,35.853-25.487,35.853
|
||||
c-14.561,0-25.487-16.041-25.487-35.853V494.241c0-19.806,10.926-35.853,25.487-35.853c14.56,0,25.487,16.048,25.487,35.853
|
||||
V610.879z M593.886,321.95c0,19.806-10.927,35.853-25.487,35.853c-14.561,0-25.487-16.048-25.487-35.853v-71.694
|
||||
c0-19.806,10.926-35.853,25.487-35.853c14.56,0,25.487,16.048,25.487,35.853V321.95z"/>
|
||||
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.538,0,51.365v731.96c0,24.815,26.333,51.365,50.973,51.365h618.053
|
||||
c24.634,0,50.973-26.551,50.973-51.365V51.365C720,26.538,693.661,0,669.027,0 M675.317,627.412
|
||||
c0,21.267-17.13,38.523-38.236,38.523H82.913c-21.113,0-38.236-17.255-38.236-38.523V81.65c0-21.274,17.124-38.523,38.236-38.523
|
||||
h554.169c21.106,0,38.236,17.248,38.236,38.523V627.412z"/>
|
||||
<path fill="#FFFFFF" d="M71.321,708.955v-7.467h13.428v7.467h18.132v10.161H84.748c0,6.011,2.016,11.543,6.061,16.589
|
||||
c3.746,4.698,8.917,8.569,15.512,11.624l-5.992,7.834c-4.828-1.936-9.358-4.605-13.596-8.027
|
||||
c-4.231-3.491-7.224-6.938-8.978-10.379c-1.867,3.441-4.96,6.888-9.247,10.379c-4.349,3.541-8.979,6.253-13.876,8.139l-4.984-7.759
|
||||
c6.223-3.099,11.269-7.006,15.139-11.73c4.349-5.232,6.534-10.783,6.534-16.67H53.183v-10.161H71.321z M119.282,764.191
|
||||
c5.818,3.721,8.711,8.326,8.711,13.752c-0.062,5.357-3.006,9.881-8.792,13.565c-6.471,4.131-15.3,6.203-26.482,6.203
|
||||
c-11.132,0-19.924-2.072-26.389-6.203c-5.737-3.684-8.612-8.207-8.612-13.565c0-5.426,2.875-10.031,8.612-13.752
|
||||
c6.527-4.143,15.326-6.203,26.389-6.203C103.963,757.987,112.811,760.047,119.282,764.191 M76.585,771.353
|
||||
c-3.516,1.742-5.264,3.908-5.264,6.484c0,2.52,1.748,4.648,5.264,6.397c3.913,2.01,9.29,3.018,16.134,3.018
|
||||
c6.944,0,12.426-1.008,16.408-3.018c3.559-1.749,5.357-3.877,5.357-6.397c0-2.576-1.798-4.742-5.357-6.484
|
||||
c-3.982-1.941-9.464-2.906-16.408-2.906C85.875,768.447,80.499,769.412,76.585,771.353 M126.724,755.163h-13.421v-18.3H97.971
|
||||
v-10.18h15.332V701.98h13.421V755.163z"/>
|
||||
<path fill="#FFFFFF" d="M198.076,733.073c5.37,6.203,13.266,11.119,23.67,14.722l-5.992,8.257
|
||||
c-8.463-3.049-15.413-6.471-20.858-10.273c-5.675-4.026-10.186-8.724-13.502-14.137c-3.093,5.413-7.473,10.111-13.154,14.137
|
||||
c-5.438,3.802-12.457,7.224-21.032,10.273l-5.357-8.257c9.919-3.603,17.56-8.562,22.955-14.815
|
||||
c6.695-7.809,10.049-17.889,10.049-30.228h13.341C188.195,715.284,191.493,725.389,198.076,733.073 M174.854,778.229v-25.866
|
||||
h13.341v25.866h32.723v10.174h-78.514v-10.174H174.854z"/>
|
||||
<path fill="#FFFFFF" d="M294.28,736.95h-24.665v-10.553h24.665v-7.286h-24.211v-10.46h24.211v-6.671h13.421v67.432H294.28v-14.137
|
||||
h-48.796c-3.261,0-5.675-1.014-7.249-3.018c-1.45-1.792-2.171-4.393-2.171-7.753v-41.752h13.415v42.15h44.801V736.95z
|
||||
M253.822,783.76h54.514v10.46h-56.045c-4.3,0-7.367-0.815-9.246-2.433c-1.761-1.605-2.639-4.231-2.639-7.834v-19.762h13.416
|
||||
V783.76z"/>
|
||||
<path fill="#FFFFFF" d="M367.542,714.276c4.094,7.821,6.16,17.777,6.16,29.842c0,12.793-2.066,23.203-6.16,31.198
|
||||
c-4.362,8.724-10.472,13.086-18.319,13.086c-7.933,0-14.1-4.362-18.512-13.086c-4.038-7.995-6.066-18.405-6.066-31.198
|
||||
c0-12.065,2.029-22.021,6.066-29.842c4.468-8.525,10.641-12.787,18.512-12.787C357.007,701.488,363.111,705.751,367.542,714.276
|
||||
M340.786,721.244c-1.767,5.893-2.632,13.477-2.632,22.786c0,10.074,0.865,18.182,2.632,24.31c1.929,6.59,4.716,9.888,8.338,9.888
|
||||
c3.566,0,6.322-3.298,8.251-9.888c1.817-6.129,2.726-14.237,2.726-24.31c0-9.309-0.909-16.894-2.726-22.786
|
||||
c-2.003-6.384-4.748-9.576-8.251-9.576C345.552,711.668,342.777,714.861,340.786,721.244 M398.187,795.191h-13.416V701.98h13.416
|
||||
V795.191z"/>
|
||||
<path fill="#FFFFFF" d="M420.656,728.624c-1.743-2.458-2.62-5.078-2.62-7.846c0-5.37,2.9-9.85,8.705-13.472
|
||||
c6.409-3.877,15.195-5.818,26.383-5.818c11.131,0,19.93,1.941,26.395,5.818c5.862,3.622,8.786,8.102,8.786,13.472
|
||||
c0,2.768-0.902,5.389-2.712,7.846c-1.948,2.514-4.661,4.717-8.164,6.583v9.987h14.959v10.553h-78.526v-10.553h14.778v-9.987
|
||||
C425.129,733.341,422.472,731.138,420.656,728.624 M478.424,766.892c5.687,3.422,8.525,7.653,8.525,12.687
|
||||
c0,4.916-2.838,9.078-8.525,12.507c-6.285,3.808-14.747,5.712-25.387,5.712c-10.696,0-19.19-1.904-25.487-5.712
|
||||
c-5.606-3.429-8.432-7.591-8.432-12.507c0-5.034,2.825-9.265,8.432-12.687c6.297-3.815,14.791-5.719,25.487-5.719
|
||||
C463.677,761.173,472.139,763.077,478.424,766.892 M437.164,714.767c-3.498,1.556-5.246,3.547-5.246,6.011
|
||||
c0,2.37,1.748,4.349,5.246,5.905c3.814,1.693,9.072,2.52,15.779,2.52c6.714,0,12.009-0.827,15.874-2.52
|
||||
c3.497-1.555,5.257-3.534,5.257-5.905c0-2.464-1.76-4.455-5.257-6.011c-3.864-1.618-9.159-2.426-15.874-2.426
|
||||
C446.236,712.341,440.978,713.149,437.164,714.767 M437.624,774.259c-3.391,1.413-5.083,3.155-5.083,5.227
|
||||
c0,2.066,1.692,3.815,5.083,5.246c3.808,1.599,8.973,2.414,15.5,2.414c6.347,0,11.393-0.815,15.138-2.414
|
||||
c3.441-1.431,5.171-3.18,5.171-5.246c0-2.072-1.73-3.814-5.171-5.227c-3.746-1.549-8.792-2.327-15.138-2.327
|
||||
C446.596,771.932,441.432,772.71,437.624,774.259 M464,745.194v-6.005c-1.562,0.243-3.292,0.473-5.152,0.672
|
||||
c-1.705,0.131-3.609,0.193-5.724,0.193c-2.166,0-4.101-0.062-5.799-0.193c-1.929-0.199-3.683-0.43-5.264-0.672v6.005H464z"/>
|
||||
<path fill="#FFFFFF" d="M582.878,748.106h-32.475v6.59h28.032v24.69H522.21v4.268h56.941v10.566h-58.111
|
||||
c-4.001,0-7.05-0.933-9.172-2.818c-2.047-1.799-3.074-4.387-3.074-7.747V768.92h56.225v-3.764h-56.225v-10.46h28.199v-6.59h-32.649
|
||||
v-10.385h78.532V748.106z M522.21,702.752v4.467h42.81v-4.467h13.416v31.591h-57.395c-4.3,0-7.442-0.877-9.445-2.626
|
||||
c-1.867-1.736-2.8-4.424-2.8-8.033v-20.932H522.21z M522.21,723.877h42.816v-6.304H522.21V723.877z"/>
|
||||
<path fill="#FFFFFF" d="M638.282,703.922v28.871c0,13.814-3.391,25.419-10.167,34.783c-6.291,8.587-15.637,15.531-28.025,20.826
|
||||
l-5.332-7.94c9.066-4.144,16.103-9.402,21.125-15.799c6.042-7.685,9.066-16.956,9.066-27.802v-22.388h-28.032v-10.553H638.282z
|
||||
M668.373,701.98v37.788h9.153v10.666h-9.153v44.757h-13.428V701.98H668.373z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.7 KiB |
56
gaseous-server/Assets/Ratings/GRAC/GRAC_Fifteen.svg
Normal file
@@ -0,0 +1,56 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 720 834.694" enable-background="new 0 0 720 834.694" xml:space="preserve">
|
||||
<g>
|
||||
<rect x="21.604" y="23.875" fill="#F9B846" width="660.172" height="695.356"/>
|
||||
<path fill="#9CA3AB" d="M322.011,88.52c-69.815,89.204-161.396,95.184-174.139,95.42v81.295c0,0,7.971,0.131,65.012,0.298
|
||||
c37.44,0.1,36.936,37.285,36.936,37.285v371.899H376.88h312.587v-62.404v-164.27V158.677V88.52H322.011z"/>
|
||||
<path fill="#FFFFFF" d="M702.21,235.069V126.75H389.996v318.585h146.549v-31.89c0-17.734,13.453-32.101,28.673-32.101
|
||||
c15.22,0,28.673,14.368,28.673,32.101v199.041c0,17.734-13.453,32.107-28.673,32.107c-15.22,0-28.673-14.373-28.673-32.107V600.49
|
||||
v-91.438H389.996v30.433c0,136.606,5.14,162.242,130.819,161.95c0,0,168.72,16.085,168.72-98.817l2.47-172.379
|
||||
c1.73-119.525-4.306-146.393-66.144-146.393c-47.302,0-70.201,18.306-89.316,39.717v-88.495H702.21z"/>
|
||||
<path fill="#231F20" d="M669.026,0H50.974C26.339,0,0,26.538,0,51.366v731.963c0,24.815,26.339,51.366,50.974,51.366h618.053
|
||||
c24.641,0,50.974-26.551,50.974-51.366V51.366C720,26.538,693.667,0,669.026,0 M675.317,627.414
|
||||
c0,21.268-17.124,38.523-38.23,38.523H82.913c-21.109,0-38.23-17.255-38.23-38.523V81.65c0-21.274,17.121-38.523,38.23-38.523
|
||||
h554.174c21.106,0,38.23,17.248,38.23,38.523V627.414z"/>
|
||||
<path fill="#FFFFFF" d="M105.432,708.099v78.67H89.739v-48.926c0-2.408-0.127-4.212-0.395-5.426
|
||||
c-0.261-1.207-0.79-2.109-1.611-2.719c-1.046-0.772-2.43-1.313-4.182-1.624c-1.739-0.292-4.461-0.442-8.176-0.442h-2.343v-7.057
|
||||
c5.582-0.902,10.289-2.383,14.131-4.436c3.873-2.042,7.314-4.735,10.367-8.04H105.432z"/>
|
||||
<path fill="#FFFFFF" d="M175.362,708v9.676h-37.179v21.436c3.631-4.349,9.461-6.514,17.485-6.514
|
||||
c16.252,0,24.37,6.969,24.37,20.895v8.941c0,8.456-2.001,14.89-6.002,19.302c-4.014,4.437-11.061,6.633-21.162,6.565
|
||||
c-19.292-0.181-28.94-7.237-28.94-21.162v-3.261h15.248v3.901c0,3.006,1.008,5.495,3.008,7.449
|
||||
c2.013,1.973,5.339,2.949,10.025,2.949c4.53,0,7.747-1.12,9.682-3.336c1.92-2.24,2.893-5.861,2.893-10.864v-9.944
|
||||
c0-4.156-1.095-7.199-3.273-9.091c-2.2-1.904-5.526-2.844-9.968-2.844c-3.345,0-6.229,0.939-8.696,2.794
|
||||
c-2.439,1.879-3.671,3.764-3.671,5.706h-14.8V708H175.362z"/>
|
||||
<path fill="#FFFFFF" d="M228.377,705.381v29.121c0,10.179,2.047,19.582,6.117,28.218c3.64,7.641,8.03,13.054,13.142,16.178
|
||||
l-10.248,6.421c-3.855-2.776-7.308-6.353-10.354-10.765c-3.255-4.754-5.631-9.85-7.115-15.282
|
||||
c-1.416,5.432-3.793,10.528-7.125,15.282c-3.115,4.412-6.683,7.99-10.693,10.765l-9.461-6.421
|
||||
c4.754-3.379,8.948-8.761,12.578-16.178c4.461-8.861,6.677-18.269,6.677-28.218v-29.121H228.377z M267.677,704.659v86.995h-16.253
|
||||
v-44.309h-11.813v-10.23h11.813v-32.456H267.677z M292.044,791.654h-16.247v-86.995h16.247V791.654z"/>
|
||||
<path fill="#FFFFFF" d="M371.106,716.139c5.04,7.299,7.573,16.589,7.573,27.851c0,11.934-2.533,21.654-7.573,29.114
|
||||
c-5.348,8.139-12.834,12.215-22.481,12.215c-9.722,0-17.292-4.076-22.721-12.215c-4.956-7.461-7.448-17.18-7.448-29.114
|
||||
c0-11.263,2.492-20.553,7.448-27.851c5.507-7.959,13.07-11.941,22.721-11.941C358.194,704.198,365.689,708.18,371.106,716.139
|
||||
M338.276,722.647c-2.159,5.489-3.229,12.576-3.229,21.262c0,9.401,1.07,16.962,3.229,22.68c2.365,6.154,5.781,9.234,10.227,9.234
|
||||
c4.39,0,7.756-3.08,10.139-9.234c2.222-5.718,3.332-13.279,3.332-22.68c0-8.687-1.111-15.774-3.332-21.262
|
||||
c-2.448-5.967-5.824-8.941-10.139-8.941C344.132,713.706,340.718,716.68,338.276,722.647 M408.726,791.654h-16.477v-86.995h16.477
|
||||
V791.654z"/>
|
||||
<path fill="#FFFFFF" d="M443.596,729.523c-2.152-2.289-3.216-4.741-3.216-7.317c0-5.015,3.559-9.191,10.677-12.575
|
||||
c7.865-3.622,18.661-5.432,32.394-5.432c13.652,0,24.46,1.811,32.4,5.432c7.199,3.385,10.795,7.56,10.795,12.575
|
||||
c0,2.576-1.114,5.028-3.348,7.317c-2.365,2.352-5.712,4.4-10.012,6.148v9.321h18.375v9.85h-96.409v-9.85h18.144v-9.321
|
||||
C449.09,733.923,445.824,731.875,443.596,729.523 M514.512,765.246c6.981,3.192,10.466,7.143,10.466,11.841
|
||||
c0,4.586-3.485,8.469-10.466,11.673c-7.716,3.553-18.101,5.327-31.162,5.327c-13.135,0-23.577-1.774-31.298-5.327
|
||||
c-6.894-3.204-10.348-7.087-10.348-11.673c0-4.698,3.453-8.649,10.348-11.841c7.722-3.566,18.163-5.345,31.298-5.345
|
||||
C496.412,759.901,506.797,761.68,514.512,765.246 M463.862,716.593c-4.306,1.457-6.465,3.311-6.465,5.613
|
||||
c0,2.215,2.159,4.057,6.465,5.507c4.673,1.58,11.132,2.352,19.37,2.352c8.239,0,14.735-0.772,19.488-2.352
|
||||
c4.288-1.45,6.434-3.292,6.434-5.507c0-2.302-2.147-4.156-6.434-5.613c-4.754-1.512-11.25-2.258-19.488-2.258
|
||||
C474.994,714.335,468.535,715.081,463.862,716.593 M464.422,772.122c-4.156,1.313-6.228,2.943-6.228,4.878
|
||||
c0,1.929,2.072,3.559,6.228,4.891c4.679,1.494,11.02,2.252,19.028,2.252c7.797,0,14-0.759,18.599-2.252
|
||||
c4.225-1.332,6.34-2.962,6.34-4.891c0-1.935-2.115-3.566-6.34-4.878c-4.599-1.45-10.802-2.172-18.599-2.172
|
||||
C475.442,769.95,469.102,770.672,464.422,772.122 M496.816,744.992v-5.607c-1.935,0.23-4.051,0.448-6.347,0.628
|
||||
c-2.078,0.125-4.418,0.18-7.019,0.18c-2.669,0-5.046-0.055-7.119-0.18c-2.377-0.18-4.523-0.398-6.465-0.628v5.607H496.816z"/>
|
||||
<path fill="#FFFFFF" d="M606.933,706.47v26.949c0,12.893-4.163,23.726-12.469,32.462c-7.722,8.014-19.19,14.492-34.403,19.439
|
||||
l-6.571-7.411c11.132-3.864,19.781-8.774,25.948-14.747c7.423-7.174,11.138-15.817,11.138-25.947V716.32h-34.416v-9.85H606.933z
|
||||
M643.894,704.659v35.269h11.231v9.949h-11.231v41.777h-16.483v-86.995H643.894z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.5 KiB |
49
gaseous-server/Assets/Ratings/GRAC/GRAC_Testing.svg
Normal file
@@ -0,0 +1,49 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
|
||||
<g>
|
||||
<rect x="21.592" y="23.875" fill="#F68120" width="660.178" height="695.353"/>
|
||||
<polygon fill="#FFFFFF" points="542.912,94.891 96.895,94.891 96.895,247.811 211.585,247.811 211.585,674.714 428.222,674.714
|
||||
428.222,247.811 542.912,247.811 "/>
|
||||
<path fill="#FFFFFF" d="M510.749,506.013c-12.669-10.105-28.019-17.833-28.019-34.758c0-6.508,1.892-11.356,7.66-11.356
|
||||
c6.577,0,8.425,8.444,8.425,15.767l-0.081,1.525h50.55v-13.963c0-15.706-2.987-28.268-14.779-37.322
|
||||
c-11.592-8.942-19.924-13.447-48.105-13.447c-23.048,0-53.313,19.806-55.734,52.1c-1.53,20.328,0.809,43.332,19.115,61.8
|
||||
c11.039,11.157,51.216,29.332,49.088,57.588c-0.84,11.001-1.083,16.582-6.894,16.582c-6.484,0-7.815-13.801-7.815-28.473
|
||||
l0.112-18.406h-54.414l-0.958,19.837c0,24.391,1.288,37.745,13.185,48.621c10.491,9.607,22.874,16.271,48.802,16.271
|
||||
c35.897,0,61.296-12.114,61.296-60.574C552.183,540.585,531.538,522.572,510.749,506.013"/>
|
||||
<polygon fill="#FFFFFF" points="562.028,413.475 562.028,451.705 593.886,451.705 593.886,630.112 657.603,630.112
|
||||
657.603,451.705 683.089,451.705 683.089,413.475 "/>
|
||||
<polygon fill="#9CA3AB" points="370.877,585.51 370.877,540.909 402.736,540.909 402.736,496.307 370.877,496.307 370.877,451.705
|
||||
415.479,451.705 415.479,413.475 319.904,413.475 319.904,630.112 415.479,630.112 415.479,585.51 "/>
|
||||
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.538,0,51.365v731.96c0,24.815,26.333,51.365,50.973,51.365h618.053
|
||||
c24.634,0,50.973-26.551,50.973-51.365V51.365C720,26.538,693.661,0,669.027,0 M675.317,627.412
|
||||
c0,21.267-17.13,38.523-38.236,38.523H82.913c-21.113,0-38.236-17.255-38.236-38.523V81.65c0-21.274,17.124-38.523,38.236-38.523
|
||||
h554.169c21.106,0,38.236,17.248,38.236,38.523V627.412z"/>
|
||||
<path fill="#FFFFFF" d="M136.998,705.421v9.85h-6.888v25.424h15.245v9.77H75.44v-9.77h9.122v-25.424h-9.01v-9.85H136.998z
|
||||
M158.925,762.119c7.062,3.428,10.59,7.653,10.59,12.662c-0.081,4.946-3.683,9.103-10.808,12.476
|
||||
c-7.859,3.796-18.449,5.706-31.721,5.706c-13.652,0-24.46-1.91-32.394-5.706c-7.124-3.373-10.696-7.529-10.696-12.476
|
||||
c0-5.009,3.572-9.234,10.696-12.662c7.933-3.802,18.742-5.694,32.394-5.694C140.42,756.426,151.066,758.317,158.925,762.119
|
||||
M107.161,768.901c-4.306,1.568-6.446,3.528-6.446,5.88c0,2.233,2.14,4.125,6.446,5.699c4.822,1.811,11.437,2.719,19.824,2.719
|
||||
c8.164,0,14.654-0.908,19.476-2.719c4.386-1.574,6.57-3.466,6.57-5.699c0-2.352-2.184-4.312-6.57-5.88
|
||||
c-4.823-1.755-11.312-2.626-19.476-2.626C118.598,766.276,111.984,767.147,107.161,768.901 M101.038,740.695h12.694v-25.424
|
||||
h-12.694V740.695z M152.149,736.8h-13.484v-9.769h13.484v-5.513h-13.378v-9.863h13.378v-8.039h16.464v49.636h-16.464V736.8z"/>
|
||||
<path fill="#FFFFFF" d="M361.437,705.421v26.949c0,12.892-4.156,23.732-12.476,32.462c-7.71,8.021-19.171,14.498-34.385,19.445
|
||||
l-6.565-7.411c11.12-3.87,19.769-8.78,25.935-14.747c7.417-7.175,11.131-15.818,11.131-25.947v-20.901h-34.403v-9.85H361.437z
|
||||
M398.405,703.617v35.262h11.231v9.956h-11.231v41.777h-16.483v-86.994H398.405z"/>
|
||||
<path fill="#FFFFFF" d="M560.708,728.481c-2.147-2.29-3.217-4.742-3.217-7.318c0-5.015,3.566-9.196,10.684-12.581
|
||||
c7.871-3.615,18.661-5.426,32.381-5.426c13.677,0,24.473,1.811,32.412,5.426c7.181,3.385,10.803,7.566,10.803,12.581
|
||||
c0,2.576-1.12,5.028-3.342,7.318c-2.383,2.352-5.712,4.399-10.03,6.141v9.327h18.375v9.85H552.37v-9.85h18.138v-9.327
|
||||
C566.209,732.88,562.942,730.833,560.708,728.481 M631.637,764.204c6.962,3.186,10.465,7.137,10.465,11.841
|
||||
c0,4.586-3.503,8.462-10.465,11.667c-7.741,3.559-18.12,5.332-31.181,5.332c-13.142,0-23.564-1.774-31.28-5.332
|
||||
c-6.901-3.205-10.354-7.081-10.354-11.667c0-4.704,3.453-8.655,10.354-11.841c7.716-3.566,18.138-5.345,31.28-5.345
|
||||
C613.517,758.858,623.896,760.638,631.637,764.204 M580.968,715.551c-4.306,1.456-6.453,3.31-6.453,5.612
|
||||
c0,2.215,2.147,4.057,6.453,5.501c4.691,1.58,11.144,2.352,19.376,2.352c8.239,0,14.734-0.772,19.482-2.352
|
||||
c4.306-1.444,6.453-3.285,6.453-5.501c0-2.302-2.147-4.156-6.453-5.612c-4.748-1.512-11.243-2.259-19.482-2.259
|
||||
C592.112,713.293,585.659,714.039,580.968,715.551 M581.528,771.079c-4.151,1.313-6.223,2.943-6.223,4.878
|
||||
c0,1.923,2.072,3.553,6.223,4.891c4.667,1.494,11.02,2.259,19.028,2.259c7.809,0,13.994-0.765,18.611-2.259
|
||||
c4.225-1.338,6.341-2.968,6.341-4.891c0-1.935-2.115-3.565-6.341-4.878c-4.617-1.45-10.802-2.178-18.611-2.178
|
||||
C592.548,768.901,586.195,769.63,581.528,771.079 M613.934,743.95v-5.606c-1.929,0.23-4.05,0.442-6.347,0.628
|
||||
c-2.084,0.125-4.411,0.181-7.031,0.181c-2.651,0-5.034-0.056-7.112-0.181c-2.37-0.187-4.523-0.398-6.459-0.628v5.606H613.934z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.8 KiB |
57
gaseous-server/Assets/Ratings/GRAC/GRAC_Twelve.svg
Normal file
@@ -0,0 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 27.2.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="레이어_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
|
||||
y="0px" viewBox="0 0 720 834.69" enable-background="new 0 0 720 834.69" xml:space="preserve">
|
||||
<g>
|
||||
<rect x="21.598" y="23.875" fill="#4369B1" width="660.169" height="695.359"/>
|
||||
<path fill="#9CA3AB" d="M315.551,82.148c-69.815,95.575-161.311,101.555-174.055,101.785v81.301c0,0,7.971,0.124,65.008,0.298
|
||||
c37.443,0.1,36.939,37.291,36.939,37.291v378.262h126.973h312.673v-68.77V448.04V158.67V82.148H315.551z"/>
|
||||
<path fill="#FFFFFF" d="M683.089,158.67c-38.23-30.24-69.98-37.651-127.624-37.651c-71.448,0-130.501,26.787-151.246,66.212
|
||||
c-22.643,43.021-26.971,68.259-26.971,138.236v17.92h152.92v-53.4c0-22.936,4.402-65.26,36.152-65.26
|
||||
c32.963,0,34.745,29.09,29.79,66.729c-3.021,22.873-24.824,66.324-38.557,88.762c-16.561,27.011-122.959,198.679-173.933,273.092
|
||||
v27.777h296.442l-8.864-42.206L569.5,636.11c31.165-48.957,100.846-157.612,113.589-188.07V158.67z"/>
|
||||
<path fill="#231F20" d="M669.027,0H50.973C26.333,0,0,26.532,0,51.365v731.96c0,24.821,26.333,51.365,50.973,51.365h618.053
|
||||
c24.631,0,50.973-26.544,50.973-51.365V51.365C720,26.532,693.658,0,669.027,0 M675.314,627.412
|
||||
c0,21.267-17.121,38.528-38.23,38.528H82.913c-21.116,0-38.236-17.261-38.236-38.528V81.65c0-21.274,17.121-38.523,38.236-38.523
|
||||
h554.171c21.109,0,38.23,17.248,38.23,38.523V627.412z"/>
|
||||
<path fill="#FFFFFF" d="M105.916,709.808v78.675H90.224v-48.932c0-2.408-0.134-4.207-0.389-5.426
|
||||
c-0.268-1.201-0.803-2.103-1.618-2.719c-1.039-0.765-2.436-1.313-4.182-1.624c-1.745-0.292-4.467-0.442-8.183-0.442h-2.337v-7.056
|
||||
c5.569-0.896,10.283-2.383,14.137-4.437c3.861-2.034,7.314-4.735,10.354-8.039H105.916z"/>
|
||||
<path fill="#FFFFFF" d="M178.41,778.359v10.123H125.2v-11.312c4.309-5.613,9.131-11.132,14.47-16.595
|
||||
c5.339-5.445,9.725-9.682,13.138-12.657c3.416-2.993,6.359-6.135,8.845-9.457c2.492-3.304,3.733-6.378,3.733-9.222
|
||||
c0-4.026-0.98-6.901-2.949-8.587c-1.97-1.686-5.326-2.52-10.074-2.52c-4.231,0-7.296,0.915-9.187,2.732
|
||||
c-1.889,1.848-2.837,4.58-2.837,8.195v7.517H125.2v-3.074c0-8.145,1.994-14.386,6.007-18.723c4.01-4.344,10.759-6.521,20.263-6.521
|
||||
c9.278,0,16.452,1.892,21.542,5.656c5.087,3.771,7.623,8.736,7.623,14.884c0,4.032-1.039,7.828-3.118,11.399
|
||||
c-2.069,3.541-4.561,6.652-7.461,9.296c-2.893,2.663-7.271,6.745-13.132,12.258c-5.861,5.513-11.284,11.045-16.246,16.608H178.41z"
|
||||
/>
|
||||
<path fill="#FFFFFF" d="M228.854,707.095v29.12c0,10.174,2.041,19.576,6.123,28.218c3.64,7.635,8.017,13.049,13.138,16.172
|
||||
l-10.245,6.428c-3.861-2.781-7.308-6.359-10.354-10.771c-3.26-4.754-5.638-9.844-7.115-15.276
|
||||
c-1.416,5.432-3.787,10.522-7.131,15.276c-3.117,4.412-6.676,7.989-10.687,10.771l-9.461-6.428
|
||||
c4.748-3.373,8.939-8.761,12.579-16.172c4.452-8.867,6.676-18.275,6.676-28.218v-29.12H228.854z M268.155,706.373v86.995h-16.259
|
||||
v-44.316h-11.801v-10.223h11.801v-32.456H268.155z M292.534,793.368h-16.253v-86.995h16.253V793.368z"/>
|
||||
<path fill="#FFFFFF" d="M371.589,717.847c5.046,7.292,7.576,16.589,7.576,27.851c0,11.935-2.53,21.66-7.576,29.121
|
||||
c-5.342,8.139-12.833,12.214-22.481,12.214c-9.722,0-17.298-4.075-22.715-12.214c-4.968-7.461-7.46-17.186-7.46-29.121
|
||||
c0-11.263,2.492-20.559,7.46-27.851c5.492-7.952,13.064-11.94,22.715-11.94C358.672,705.906,366.172,709.895,371.589,717.847
|
||||
M338.754,724.356c-2.153,5.488-3.236,12.575-3.236,21.262c0,9.408,1.083,16.968,3.236,22.687
|
||||
c2.371,6.147,5.787,9.234,10.232,9.234c4.384,0,7.763-3.086,10.134-9.234c2.228-5.719,3.338-13.279,3.338-22.687
|
||||
c0-8.687-1.111-15.774-3.338-21.262c-2.449-5.967-5.824-8.941-10.134-8.941C344.615,715.414,341.202,718.389,338.754,724.356
|
||||
M409.212,793.368h-16.477v-86.995h16.477V793.368z"/>
|
||||
<path fill="#FFFFFF" d="M444.083,731.231c-2.153-2.29-3.223-4.741-3.223-7.312c0-5.021,3.562-9.196,10.684-12.582
|
||||
c7.861-3.615,18.664-5.432,32.393-5.432c13.655,0,24.457,1.817,32.394,5.432c7.203,3.385,10.802,7.561,10.802,12.582
|
||||
c0,2.57-1.123,5.022-3.345,7.312c-2.37,2.352-5.712,4.399-10.018,6.147v9.321h18.368v9.85h-96.403v-9.85h18.147v-9.321
|
||||
C449.567,735.63,446.313,733.583,444.083,731.231 M514.992,766.954c6.978,3.192,10.469,7.143,10.469,11.848
|
||||
c0,4.58-3.49,8.462-10.469,11.667c-7.716,3.553-18.101,5.332-31.165,5.332c-13.135,0-23.567-1.78-31.282-5.332
|
||||
c-6.901-3.205-10.348-7.087-10.348-11.667c0-4.704,3.447-8.655,10.348-11.848c7.715-3.559,18.147-5.338,31.282-5.338
|
||||
C496.891,761.615,507.276,763.394,514.992,766.954 M464.339,718.301c-4.303,1.45-6.45,3.31-6.45,5.619
|
||||
c0,2.203,2.147,4.051,6.45,5.501c4.682,1.581,11.138,2.352,19.376,2.352c8.238,0,14.731-0.772,19.476-2.352
|
||||
c4.303-1.45,6.456-3.298,6.456-5.501c0-2.308-2.153-4.169-6.456-5.619c-4.744-1.506-11.238-2.265-19.476-2.265
|
||||
C475.477,716.036,469.021,716.796,464.339,718.301 M464.899,773.836c-4.153,1.307-6.232,2.937-6.232,4.872
|
||||
c0,1.929,2.078,3.559,6.232,4.897c4.676,1.493,11.023,2.247,19.037,2.247c7.794,0,13.988-0.753,18.593-2.247
|
||||
c4.225-1.337,6.34-2.968,6.34-4.897c0-1.935-2.115-3.566-6.34-4.872c-4.605-1.45-10.799-2.178-18.593-2.178
|
||||
C475.922,771.658,469.575,772.386,464.899,773.836 M497.299,746.7v-5.6c-1.938,0.231-4.054,0.442-6.347,0.622
|
||||
c-2.084,0.124-4.415,0.18-7.016,0.18c-2.675,0-5.052-0.056-7.121-0.18c-2.377-0.18-4.53-0.392-6.462-0.622v5.6H497.299z"/>
|
||||
<path fill="#FFFFFF" d="M607.407,708.177v26.949c0,12.893-4.154,23.726-12.461,32.462c-7.725,8.02-19.193,14.492-34.403,19.444
|
||||
l-6.568-7.411c11.138-3.87,19.778-8.78,25.938-14.753c7.424-7.174,11.132-15.817,11.132-25.941v-20.901h-34.4v-9.85H607.407z
|
||||
M644.37,706.373v35.262h11.241v9.956H644.37v41.777h-16.477v-86.995H644.37z"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.6 KiB |
68
gaseous-server/Assets/Ratings/PEGI/Eighteen.svg
Normal file
@@ -0,0 +1,68 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="425.292px" height="519.372px" viewBox="0 0 425.292 519.372" enable-background="new 0 0 425.292 519.372"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.12"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<rect clip-path="url(#SVGID_2_)" fill="#E2011A" width="425.717" height="425.712"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.866,365.25H83.451V134.503H40.028V95.337
|
||||
c29.805,0.422,49.39-11.93,60.031-40.876h49.807V365.25z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M211.162,276.699c0-30.657,6.812-52.361,31.923-71.524
|
||||
c-20.86-20.86-28.52-39.17-28.52-67.264c0-48.963,31.079-83.45,82.166-83.45c51.086,0,82.166,34.487,82.166,83.45
|
||||
c0,28.093-7.66,46.403-28.521,67.264c25.126,19.164,31.923,40.867,31.923,71.524c0,55.765-17.438,93.67-85.568,93.67
|
||||
C228.619,370.369,211.162,332.464,211.162,276.699 M296.731,233.273c-15.329,0-19.164,10.641-19.164,39.597
|
||||
c0,29.368,3.835,39.587,19.164,39.587c15.319,0,19.163-10.219,19.163-39.587C315.894,243.914,312.05,233.273,296.731,233.273
|
||||
M296.731,110.662c-14.045,0-17.457,6.811-17.457,36.194c0,29.368,3.412,36.184,17.457,36.184c14.044,0,17.457-6.816,17.457-36.184
|
||||
C314.188,117.473,310.775,110.662,296.731,110.662"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M0,519.372h425.717V0H0 M417.205,417.189H8.522V8.508h408.682V417.189z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M381.254,17.03v3.159h-6.739v21.33h-3.959v-21.33h-6.729V17.03H381.254z M408.691,41.519
|
||||
h-3.959V22.231h-0.115l-6.787,19.288h-3.23l-6.451-19.288h-0.115v19.288h-3.96V17.03h6.289l6.106,18.219h0.115l5.935-18.219h6.173
|
||||
V41.519z"/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.449 34.262,487.449 40.901,455.162 41.049,455.162
|
||||
47.976,487.449 54.763,487.449 64.114,447.924 57.639,447.924 51.522,480.24 51.364,480.24 44.807,447.924 37.512,447.924
|
||||
30.796,480.24 30.653,480.24 24.312,447.924 17.821,447.924 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.837,487.449 82.061,487.449 88.694,455.162 88.853,455.162
|
||||
95.784,487.449 102.547,487.449 111.922,447.924 105.432,447.924 99.316,480.24 99.163,480.24 92.596,447.924 85.301,447.924
|
||||
78.595,480.24 78.446,480.24 72.105,447.924 65.62,447.924 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.625,487.449 129.854,487.449 136.488,455.162 136.636,455.162
|
||||
143.577,487.449 150.35,487.449 159.716,447.924 153.235,447.924 147.109,480.24 146.961,480.24 140.394,447.924 133.104,447.924
|
||||
126.388,480.24 126.24,480.24 119.898,447.924 113.398,447.924 "/>
|
||||
<rect x="163.21" y="479.646" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.321,467.701
|
||||
c0-9.012,1.112-15.492,7.971-15.492c5.752,0,7.228,6.059,7.228,14.744c0,10.181-1.476,16.221-7.228,16.221
|
||||
C186.659,483.174,185.321,475.36,185.321,467.701 M179.502,500.429h6.183v-17.466h0.158c1.404,3.384,4.721,5.521,8.254,5.521
|
||||
c10.248,0,12.908-12.539,12.908-21.531c0-11.715-3.542-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905h-0.144v-4.88h-5.9
|
||||
V500.429z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.032,463.56v-1.477
|
||||
c0-2.339,0.738-10.314,7.229-10.314c5.455,0,6.864,5.225,6.864,9.653v2.138H219.032z M239.605,468.43v-2.502
|
||||
c0-8.484-1.112-19.029-13.201-19.029c-12.16,0-14.087,11.427-14.087,21.32c0,13.564,4.055,20.266,13.723,20.266
|
||||
c10.766,0,13.259-9.807,13.259-14.006h-6.174c0,2.943-0.824,9.146-6.721,9.146c-7.587,0-7.587-9.146-7.587-15.194H239.605z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.625,452.209
|
||||
c6.634,0,7.957,7.813,7.957,15.492c0,8.091-1.323,14.446-8.034,14.446c-6.174,0-7.151-8.043-7.151-14.446
|
||||
C251.396,458.268,252.873,452.209,258.625,452.209 M272.41,447.924h-5.886v5.033h-0.163c-0.806-3.106-4.267-6.059-8.552-6.059
|
||||
c-10.018,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.748,12.232,19.748c3.911,0,7.593-1.994,8.935-5.302h0.153v5.167
|
||||
c0,2.723,0.288,8.839-7.688,8.839c-3.24,0-6.049-1.399-6.327-5.004h-6.192c1.016,9.874,10.535,9.874,12.951,9.874
|
||||
c7.967,0,13.431-4.275,13.431-16.076V447.924z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.913,487.449h6.184v-39.516
|
||||
h-6.184V487.449z M280.913,441.895h6.184V434.8h-6.184V441.895z"/>
|
||||
<rect x="296.97" y="479.646" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.641,487.449h6.203v-39.516
|
||||
h-6.203V487.449z M313.641,441.895h6.203V434.8h-6.203V441.895z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.318,487.449h6.174v-27.273c0-5.752,4.516-7.967,7.832-7.967
|
||||
c5.599,0,5.819,4.946,5.819,7.967v27.273h6.193v-28.021c0-4.63,0-12.529-10.401-12.529c-3.815,0-7.947,2.07-9.567,5.694h-0.163
|
||||
v-4.669h-5.887V487.449z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.306,487.449h6.212v-34.646h6.768v-4.88h-6.768v-4.63
|
||||
c0-2.732,1.313-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.982,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.449z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.701
|
||||
c0,11.12,2.819,20.783,14.236,20.783c11.36,0,14.227-9.663,14.227-20.783c0-11.149-2.8-20.803-14.227-20.803
|
||||
C382.53,446.898,379.634,456.552,379.634,467.701 M393.717,483.634c-6.337,0-7.573-7.401-7.573-15.933
|
||||
c0-8.57,1.323-15.933,7.573-15.933c6.644,0,7.909,7.362,7.909,15.933C401.626,476.232,400.284,483.634,393.717,483.634"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 6.0 KiB |
61
gaseous-server/Assets/Ratings/PEGI/Seven.svg
Normal file
@@ -0,0 +1,61 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="425.623px" height="519.375px" viewBox="0 0 425.623 519.375" enable-background="new 0 0 425.623 519.375"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" y="-3.621" width="426.082" height="536.12"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<rect y="0.003" clip-path="url(#SVGID_2_)" fill="#A5C400" width="425.717" height="425.712"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M126.872,59.573h167.75c-18.741,96.225-48.536,196.696-50.243,305.68h-68.975
|
||||
c4.261-83.44,22.571-166.038,42.578-246.929h-91.11V59.573z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M0.009,519.375h425.708V0.003H0.009 M417.204,417.192H8.522V8.511h408.681V417.192z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M381.254,17.033v3.159h-6.739v21.33h-3.949v-21.33h-6.729v-3.159H381.254z M408.691,41.522
|
||||
h-3.959V22.234h-0.115l-6.787,19.288h-3.221l-6.452-19.288h-0.124v19.288h-3.95V17.033h6.279l6.106,18.219h0.115l5.943-18.219
|
||||
h6.164V41.522z"/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.043,487.452 34.267,487.452 40.905,455.165 41.049,455.165
|
||||
47.98,487.452 54.763,487.452 64.119,447.927 57.639,447.927 51.522,480.243 51.369,480.243 44.812,447.927 37.517,447.927
|
||||
30.801,480.243 30.653,480.243 24.311,447.927 17.826,447.927 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.842,487.452 82.065,487.452 88.699,455.165 88.857,455.165
|
||||
95.788,487.452 102.551,487.452 111.927,447.927 105.437,447.927 99.321,480.243 99.163,480.243 92.596,447.927 85.305,447.927
|
||||
78.6,480.243 78.451,480.243 72.109,447.927 65.62,447.927 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.63,487.452 129.858,487.452 136.492,455.165 136.641,455.165
|
||||
143.582,487.452 150.354,487.452 159.72,447.927 153.24,447.927 147.114,480.243 146.966,480.243 140.399,447.927 133.104,447.927
|
||||
126.393,480.243 126.245,480.243 119.903,447.927 113.403,447.927 "/>
|
||||
<rect x="163.21" y="479.648" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.778" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.326,467.704
|
||||
c0-9.012,1.107-15.492,7.972-15.492c5.751,0,7.223,6.059,7.223,14.744c0,10.181-1.472,16.221-7.223,16.221
|
||||
C186.659,483.177,185.326,475.363,185.326,467.704 M179.502,500.432h6.188v-17.466h0.153c1.404,3.384,4.726,5.521,8.259,5.521
|
||||
c10.248,0,12.908-12.539,12.908-21.531c0-11.715-3.533-20.055-12.908-20.055c-4.281,0-7.736,2.962-8.551,5.905h-0.148v-4.88h-5.901
|
||||
V500.432z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.042,463.563v-1.477
|
||||
c0-2.339,0.729-10.314,7.219-10.314c5.455,0,6.864,5.225,6.864,9.653v2.138H219.042z M239.605,468.433v-2.502
|
||||
c0-8.484-1.112-19.029-13.201-19.029c-12.155,0-14.083,11.427-14.083,21.32c0,13.564,4.055,20.266,13.718,20.266
|
||||
c10.766,0,13.268-9.807,13.268-14.006h-6.183c0,2.943-0.825,9.146-6.721,9.146c-7.583,0-7.583-9.146-7.583-15.194H239.605z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.634,452.212
|
||||
c6.634,0,7.956,7.813,7.956,15.492c0,8.091-1.322,14.446-8.033,14.446c-6.174,0-7.151-8.043-7.151-14.446
|
||||
C251.406,458.271,252.882,452.212,258.634,452.212 M272.419,447.927h-5.896v5.033h-0.163c-0.806-3.106-4.267-6.059-8.552-6.059
|
||||
c-10.018,0-12.884,10.104-12.884,20.803c0,5.234,0.729,19.748,12.232,19.748c3.911,0,7.593-1.994,8.925-5.302h0.153v5.167
|
||||
c0,2.723,0.288,8.839-7.679,8.839c-3.24,0-6.059-1.399-6.337-5.004h-6.192c1.016,9.874,10.535,9.874,12.951,9.874
|
||||
c7.976,0,13.44-4.275,13.44-16.076V447.927z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.922,487.452h6.184v-39.516
|
||||
h-6.184V487.452z M280.922,441.897h6.184v-7.095h-6.184V441.897z"/>
|
||||
<rect x="296.97" y="479.648" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.641,487.452h6.202v-39.516
|
||||
h-6.202V487.452z M313.641,441.897h6.202v-7.095h-6.202V441.897z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.328,487.452h6.174v-27.273c0-5.752,4.506-7.967,7.822-7.967
|
||||
c5.599,0,5.829,4.946,5.829,7.967v27.273h6.192v-28.021c0-4.63,0-12.529-10.411-12.529c-3.815,0-7.947,2.07-9.567,5.694h-0.153
|
||||
v-4.669h-5.886V487.452z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.306,487.452h6.222v-34.646h6.758v-4.88h-6.758v-4.63
|
||||
c0-2.732,1.304-3.758,3.969-3.758h2.866v-5.312h-4.496c-5.982,0-8.561,3.097-8.561,9.069v4.63h-5.743v4.88h5.743V487.452z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.704
|
||||
c0,11.12,2.818,20.783,14.236,20.783c11.36,0,14.227-9.663,14.227-20.783c0-11.149-2.8-20.803-14.227-20.803
|
||||
C382.53,446.901,379.634,456.555,379.634,467.704 M393.727,483.637c-6.347,0-7.583-7.401-7.583-15.933
|
||||
c0-8.57,1.332-15.933,7.583-15.933c6.634,0,7.899,7.362,7.899,15.933C401.626,476.235,400.293,483.637,393.727,483.637"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.3 KiB |
67
gaseous-server/Assets/Ratings/PEGI/Sixteen.svg
Normal file
@@ -0,0 +1,67 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="426.082px" height="519.378px" viewBox="0 0 426.082 519.378" enable-background="new 0 0 426.082 519.378"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.125"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<rect clip-path="url(#SVGID_2_)" fill="#F5A200" width="425.727" height="425.717"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.868,365.254H83.447V134.505H40.029V95.339
|
||||
c29.8,0.422,49.386-11.931,60.027-40.877h49.812V365.254z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M280.125,189c12.77-11.926,22.145-20.439,43.427-20.439
|
||||
c39.593,0,60.453,33.635,60.453,96.226c0,58.756-15.328,105.586-85.569,105.586c-49.391,0-74.507-25.126-83.446-72.81
|
||||
c-3.83-20.86-4.262-46.414-4.262-81.314c0.432-42.583,0.853-68.127,4.692-88.987c8.939-47.679,34.047-72.801,83.438-72.801
|
||||
c44.692,0,80.892,27.677,80.892,74.512v15.756h-62.16v-7.248c0-21.282-8.091-26.818-18.731-26.818
|
||||
c-12.77,1.706-18.311,13.627-18.732,30.648V189z M299.28,229.868c-13.191,0-19.154,13.206-19.154,41.299
|
||||
c0,28.524,5.963,41.294,19.154,41.294c14.054,0,20.017-12.77,20.017-41.294C319.296,243.073,313.333,229.868,299.28,229.868"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M0,519.378h425.727V0H0 M417.195,417.194H8.513V8.508h408.682V417.194z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M381.245,17.031v3.159h-6.729v21.33h-3.95v-21.33h-6.739v-3.159H381.245z M408.691,41.52
|
||||
h-3.959V22.231h-0.115L397.83,41.52h-3.221l-6.462-19.288h-0.115V41.52h-3.949V17.031h6.279l6.106,18.219h0.115l5.943-18.219h6.164
|
||||
V41.52z"/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.034,487.455 34.258,487.455 40.896,455.167 41.045,455.167
|
||||
47.976,487.455 54.759,487.455 64.11,447.929 57.635,447.929 51.519,480.245 51.36,480.245 44.803,447.929 37.508,447.929
|
||||
30.797,480.245 30.648,480.245 24.307,447.929 17.817,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.833,487.455 82.057,487.455 88.695,455.167 88.854,455.167
|
||||
95.785,487.455 102.548,487.455 111.919,447.929 105.434,447.929 99.317,480.245 99.159,480.245 92.592,447.929 85.297,447.929
|
||||
78.591,480.245 78.447,480.245 72.106,447.929 65.616,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.627,487.455 129.851,487.455 136.489,455.167 136.633,455.167
|
||||
143.574,487.455 150.347,487.455 159.713,447.929 153.232,447.929 147.106,480.245 146.963,480.245 140.396,447.929
|
||||
133.101,447.929 126.385,480.245 126.236,480.245 119.895,447.929 113.4,447.929 "/>
|
||||
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.324,467.706
|
||||
c0-9.012,1.107-15.492,7.966-15.492c5.757,0,7.228,6.06,7.228,14.744c0,10.182-1.471,16.221-7.228,16.221
|
||||
C186.656,483.179,185.324,475.366,185.324,467.706 M179.5,500.435h6.184v-17.467h0.158c1.404,3.385,4.721,5.522,8.254,5.522
|
||||
c10.248,0,12.913-12.539,12.913-21.532c0-11.715-3.547-20.055-12.913-20.055c-4.275,0-7.731,2.962-8.546,5.905H185.4v-4.88H179.5
|
||||
V500.435z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.035,463.564v-1.476
|
||||
c0-2.34,0.733-10.315,7.224-10.315c5.455,0,6.854,5.225,6.854,9.653v2.138H219.035z M239.593,468.435v-2.502
|
||||
c0-8.484-1.103-19.029-13.191-19.029c-12.16,0-14.083,11.428-14.083,21.32c0,13.565,4.055,20.267,13.723,20.267
|
||||
c10.752,0,13.264-9.808,13.264-14.006h-6.193c0,2.942-0.824,9.146-6.711,9.146c-7.583,0-7.583-9.146-7.583-15.195H239.593z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.632,452.214
|
||||
c6.634,0,7.957,7.813,7.957,15.492c0,8.092-1.323,14.447-8.043,14.447c-6.174,0-7.143-8.043-7.143-14.447
|
||||
C251.404,458.273,252.88,452.214,258.632,452.214 M272.408,447.929h-5.896v5.033h-0.153c-0.805-3.105-4.266-6.059-8.551-6.059
|
||||
c-10.019,0-12.885,10.104-12.885,20.803c0,5.234,0.729,19.749,12.232,19.749c3.911,0,7.593-1.994,8.916-5.302h0.163v5.167
|
||||
c0,2.723,0.277,8.839-7.688,8.839c-3.231,0-6.05-1.399-6.337-5.004h-6.193c1.026,9.874,10.546,9.874,12.961,9.874
|
||||
c7.977,0,13.431-4.275,13.431-16.077V447.929z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.912,487.455h6.192v-39.517
|
||||
h-6.192V487.455z M280.912,441.899h6.192v-7.095h-6.192V441.899z"/>
|
||||
<rect x="296.979" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.777" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.64,487.455h6.212v-39.517h-6.212
|
||||
V487.455z M313.64,441.899h6.212v-7.095h-6.212V441.899z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.317,487.455h6.174v-27.274c0-5.752,4.516-7.967,7.833-7.967
|
||||
c5.598,0,5.828,4.947,5.828,7.967v27.274h6.193v-28.022c0-4.63,0-12.529-10.411-12.529c-3.815,0-7.957,2.07-9.567,5.694h-0.153
|
||||
v-4.669h-5.896V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.305,487.455h6.212v-34.646h6.759v-4.88h-6.759v-4.63
|
||||
c0-2.732,1.313-3.758,3.979-3.758h2.867v-5.312h-4.497c-5.981,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.634,467.706
|
||||
c0,11.121,2.818,20.784,14.236,20.784c11.36,0,14.217-9.663,14.217-20.784c0-11.149-2.79-20.803-14.217-20.803
|
||||
C382.53,446.903,379.634,456.557,379.634,467.706 M393.727,483.64c-6.347,0-7.583-7.401-7.583-15.934
|
||||
c0-8.57,1.322-15.933,7.583-15.933c6.634,0,7.899,7.362,7.899,15.933C401.626,476.238,400.284,483.64,393.727,483.64"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.9 KiB |
64
gaseous-server/Assets/Ratings/PEGI/Three.svg
Normal file
@@ -0,0 +1,64 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="426.082px" height="519.378px" viewBox="0 0 426.082 519.378" enable-background="new 0 0 426.082 519.378"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" y="-3.624" width="426.082" height="536.125"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<rect clip-path="url(#SVGID_2_)" fill="#A5C400" width="425.717" height="425.717"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M183.924,178.78h14.471c22.993,0,27.25-11.916,27.25-32.776
|
||||
c0-25.975-5.101-34.488-17.889-34.488c-10.642,0-16.6,8.935-16.6,29.795v11.926h-62.581c0-63.435,20.007-98.775,83.873-98.775
|
||||
c48.954,0,79.612,28.098,79.612,86.006c0,38.313-11.926,54.49-30.658,61.728c22.145,12.348,34.914,25.539,34.914,71.099
|
||||
c0,60.448-22.566,97.078-87.271,97.078c-75.365,0-85.153-48.968-84.731-113.687h65.567v28.108c0,17.025,6.812,24.264,16.599,24.264
|
||||
c12.774,0,20.86-8.944,20.86-37.47c0-31.492-6.797-42.564-30.648-42.564h-12.77V178.78z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M0,519.378h425.717V0H0 M417.205,417.194H8.522V8.508h408.682V417.194z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M381.254,17.031v3.159h-6.729v21.33h-3.96v-21.33h-6.739v-3.159H381.254z M408.691,41.52
|
||||
h-3.949V22.231h-0.125l-6.777,19.288h-3.24l-6.442-19.288h-0.115V41.52h-3.959V17.031h6.279l6.106,18.219h0.125l5.934-18.219h6.164
|
||||
V41.52z"/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.455 34.263,487.455 40.901,455.167 41.045,455.167
|
||||
47.976,487.455 54.759,487.455 64.115,447.929 57.64,447.929 51.523,480.245 51.365,480.245 44.808,447.929 37.512,447.929
|
||||
30.797,480.245 30.653,480.245 24.312,447.929 17.822,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.838,487.455 82.062,487.455 88.7,455.167 88.854,455.167
|
||||
95.785,487.455 102.548,487.455 111.924,447.929 105.434,447.929 99.322,480.245 99.164,480.245 92.597,447.929 85.302,447.929
|
||||
78.596,480.245 78.447,480.245 72.105,447.929 65.621,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.627,487.455 129.855,487.455 136.489,455.167 136.638,455.167
|
||||
143.579,487.455 150.352,487.455 159.718,447.929 153.237,447.929 147.111,480.245 146.963,480.245 140.396,447.929
|
||||
133.105,447.929 126.39,480.245 126.241,480.245 119.9,447.929 113.4,447.929 "/>
|
||||
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.323,467.706
|
||||
c0-9.012,1.107-15.492,7.972-15.492c5.752,0,7.223,6.06,7.223,14.744c0,10.182-1.471,16.221-7.223,16.221
|
||||
C186.661,483.179,185.323,475.366,185.323,467.706 M179.504,500.435h6.184v-17.467h0.158c1.4,3.385,4.722,5.522,8.254,5.522
|
||||
c10.248,0,12.908-12.539,12.908-21.532c0-11.715-3.533-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905H185.4v-4.88h-5.896
|
||||
V500.435z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.035,463.564v-1.476
|
||||
c0-2.34,0.738-10.315,7.224-10.315c5.464,0,6.864,5.225,6.864,9.653v2.138H219.035z M239.603,468.435v-2.502
|
||||
c0-8.484-1.112-19.029-13.191-19.029c-12.165,0-14.092,11.428-14.092,21.32c0,13.565,4.055,20.267,13.728,20.267
|
||||
c10.756,0,13.258-9.808,13.258-14.006h-6.183c0,2.942-0.825,9.146-6.711,9.146c-7.593,0-7.593-9.146-7.593-15.195H239.603z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.623,452.214
|
||||
c6.644,0,7.967,7.813,7.967,15.492c0,8.092-1.323,14.447-8.044,14.447c-6.173,0-7.142-8.043-7.142-14.447
|
||||
C251.404,458.273,252.871,452.214,258.623,452.214 M272.408,447.929h-5.886v5.033h-0.153c-0.806-3.105-4.275-6.059-8.552-6.059
|
||||
c-10.027,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.749,12.232,19.749c3.901,0,7.583-1.994,8.925-5.302h0.154v5.167
|
||||
c0,2.723,0.287,8.839-7.689,8.839c-3.24,0-6.039-1.399-6.326-5.004h-6.193c1.016,9.874,10.545,9.874,12.961,9.874
|
||||
c7.967,0,13.421-4.275,13.421-16.077V447.929z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.921,487.455h6.174v-39.517
|
||||
h-6.174V487.455z M280.921,441.899h6.174v-7.095h-6.174V441.899z"/>
|
||||
<rect x="296.969" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.65,487.455h6.192v-39.517h-6.192
|
||||
V487.455z M313.65,441.899h6.192v-7.095h-6.192V441.899z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.317,487.455h6.174v-27.274c0-5.752,4.525-7.967,7.842-7.967
|
||||
c5.589,0,5.819,4.947,5.819,7.967v27.274h6.193v-28.022c0-4.63,0-12.529-10.401-12.529c-3.825,0-7.957,2.07-9.577,5.694h-0.163
|
||||
v-4.669h-5.887V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.305,487.455h6.212v-34.646h6.769v-4.88h-6.769v-4.63
|
||||
c0-2.732,1.323-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.972,0-8.561,3.097-8.561,9.069v4.63h-5.742v4.88h5.742V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.644,467.706
|
||||
c0,11.121,2.818,20.784,14.227,20.784c11.36,0,14.227-9.663,14.227-20.784c0-11.149-2.8-20.803-14.227-20.803
|
||||
C382.539,446.903,379.644,456.557,379.644,467.706 M393.727,483.64c-6.337,0-7.584-7.401-7.584-15.934
|
||||
c0-8.57,1.323-15.933,7.584-15.933c6.634,0,7.898,7.362,7.898,15.933C401.625,476.238,400.293,483.64,393.727,483.64"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.7 KiB |
65
gaseous-server/Assets/Ratings/PEGI/Twelve.svg
Normal file
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 15.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
width="426.086px" height="519.378px" viewBox="0 0 426.086 519.378" enable-background="new 0 0 426.086 519.378"
|
||||
xml:space="preserve">
|
||||
<g>
|
||||
<defs>
|
||||
<rect id="SVGID_1_" y="-3.624" width="426.086" height="536.125"/>
|
||||
</defs>
|
||||
<clipPath id="SVGID_2_">
|
||||
<use xlink:href="#SVGID_1_" overflow="visible"/>
|
||||
</clipPath>
|
||||
<rect clip-path="url(#SVGID_2_)" fill="#F5A200" width="425.722" height="425.717"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M149.873,365.254H83.461V134.505H40.034V95.339
|
||||
c29.805,0.422,49.386-11.931,60.027-40.877h49.812V365.254z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M376.351,302.241v63.022H213.719V299.26
|
||||
c74.071-100.894,97.922-117.924,97.922-156.664c0-15.755-5.973-25.117-17.457-25.117c-15.751,0-19.164,12.338-19.164,26.396v18.296
|
||||
h-62.159v-20.429c0-48.11,23.41-87.276,81.323-87.276c55.343,0,85.569,34.905,85.569,90.685c0,66.411-56.196,109.838-94.514,157.09
|
||||
H376.351z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M0.01,519.378h425.712V0H0.01 M417.209,417.194H8.518V8.508h408.691V417.194z"/>
|
||||
<path clip-path="url(#SVGID_2_)" d="M381.26,17.031v3.159h-6.73v21.33h-3.969v-21.33h-6.729v-3.159H381.26z M408.696,41.52h-3.959
|
||||
V22.231h-0.115l-6.778,19.288h-3.24l-6.441-19.288h-0.115V41.52h-3.969V17.031h6.288l6.107,18.219h0.114l5.935-18.219h6.174V41.52z
|
||||
"/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="27.039,487.455 34.268,487.455 40.901,455.167 41.05,455.167
|
||||
47.981,487.455 54.764,487.455 64.12,447.929 57.64,447.929 51.523,480.245 51.365,480.245 44.808,447.929 37.518,447.929
|
||||
30.802,480.245 30.653,480.245 24.312,447.929 17.822,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="74.838,487.455 82.062,487.455 88.7,455.167 88.858,455.167
|
||||
95.79,487.455 102.553,487.455 111.929,447.929 105.438,447.929 99.322,480.245 99.164,480.245 92.597,447.929 85.302,447.929
|
||||
78.601,480.245 78.452,480.245 72.111,447.929 65.621,447.929 "/>
|
||||
<polygon clip-path="url(#SVGID_2_)" fill="#FFFFFF" points="122.632,487.455 129.855,487.455 136.494,455.167 136.643,455.167
|
||||
143.579,487.455 150.356,487.455 159.718,447.929 153.242,447.929 147.116,480.245 146.968,480.245 140.401,447.929
|
||||
133.105,447.929 126.39,480.245 126.246,480.245 119.905,447.929 113.405,447.929 "/>
|
||||
<rect x="163.212" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.773" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M185.328,467.706
|
||||
c0-9.012,1.107-15.492,7.972-15.492c5.752,0,7.223,6.06,7.223,14.744c0,10.182-1.471,16.221-7.223,16.221
|
||||
C186.661,483.179,185.328,475.366,185.328,467.706 M179.504,500.435h6.184v-17.467h0.158c1.404,3.385,4.721,5.522,8.259,5.522
|
||||
c10.248,0,12.908-12.539,12.908-21.532c0-11.715-3.538-20.055-12.908-20.055c-4.28,0-7.736,2.962-8.551,5.905h-0.148v-4.88h-5.901
|
||||
V500.435z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M219.04,463.564v-1.476
|
||||
c0-2.34,0.733-10.315,7.223-10.315c5.465,0,6.864,5.225,6.864,9.653v2.138H219.04z M239.607,468.435v-2.502
|
||||
c0-8.484-1.111-19.029-13.195-19.029c-12.166,0-14.088,11.428-14.088,21.32c0,13.565,4.055,20.267,13.724,20.267
|
||||
c10.761,0,13.263-9.808,13.263-14.006h-6.184c0,2.942-0.824,9.146-6.715,9.146c-7.588,0-7.588-9.146-7.588-15.195H239.607z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M258.628,452.214
|
||||
c6.644,0,7.966,7.813,7.966,15.492c0,8.092-1.322,14.447-8.043,14.447c-6.174,0-7.142-8.043-7.142-14.447
|
||||
C251.409,458.273,252.876,452.214,258.628,452.214 M272.413,447.929h-5.886v5.033h-0.154c-0.805-3.105-4.275-6.059-8.551-6.059
|
||||
c-10.027,0-12.894,10.104-12.894,20.803c0,5.234,0.729,19.749,12.232,19.749c3.901,0,7.583-1.994,8.925-5.302h0.153v5.167
|
||||
c0,2.723,0.288,8.839-7.688,8.839c-3.24,0-6.039-1.399-6.327-5.004h-6.193c1.017,9.874,10.546,9.874,12.962,9.874
|
||||
c7.966,0,13.421-4.275,13.421-16.077V447.929z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M280.926,487.455h6.184v-39.517
|
||||
h-6.184V487.455z M280.926,441.899h6.184v-7.095h-6.184V441.899z"/>
|
||||
<rect x="296.974" y="479.651" clip-path="url(#SVGID_2_)" fill="#FFFFFF" width="6.787" height="7.804"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M313.654,487.455h6.203v-39.517
|
||||
h-6.203V487.455z M313.654,441.899h6.203v-7.095h-6.203V441.899z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M328.322,487.455h6.174v-27.274c0-5.752,4.515-7.967,7.842-7.967
|
||||
c5.589,0,5.81,4.947,5.81,7.967v27.274h6.192v-28.022c0-4.63,0-12.529-10.392-12.529c-3.825,0-7.957,2.07-9.577,5.694h-0.163
|
||||
v-4.669h-5.886V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill="#FFFFFF" d="M364.311,487.455h6.212v-34.646h6.768v-4.88h-6.768v-4.63
|
||||
c0-2.732,1.323-3.758,3.979-3.758h2.866v-5.312h-4.496c-5.973,0-8.561,3.097-8.561,9.069v4.63h-5.743v4.88h5.743V487.455z"/>
|
||||
<path clip-path="url(#SVGID_2_)" fill-rule="evenodd" clip-rule="evenodd" fill="#FFFFFF" d="M379.64,467.706
|
||||
c0,11.121,2.818,20.784,14.235,20.784c11.36,0,14.227-9.663,14.227-20.784c0-11.149-2.799-20.803-14.227-20.803
|
||||
C382.534,446.903,379.64,456.557,379.64,467.706 M393.722,483.64c-6.337,0-7.573-7.401-7.573-15.934
|
||||
c0-8.57,1.323-15.933,7.573-15.933c6.644,0,7.909,7.362,7.909,15.933C401.631,476.238,400.298,483.64,393.722,483.64"/>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.6 KiB |
59
gaseous-server/Assets/Ratings/USK/USK_0.svg
Normal file
After Width: | Height: | Size: 16 KiB |
59
gaseous-server/Assets/Ratings/USK/USK_12.svg
Normal file
After Width: | Height: | Size: 16 KiB |
59
gaseous-server/Assets/Ratings/USK/USK_16.svg
Normal file
After Width: | Height: | Size: 16 KiB |
55
gaseous-server/Assets/Ratings/USK/USK_18.svg
Normal file
@@ -0,0 +1,55 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
version="1.0"
|
||||
width="1875"
|
||||
height="1875"
|
||||
id="svg2">
|
||||
<defs
|
||||
id="defs4" />
|
||||
<g
|
||||
transform="matrix(15.293834,0,0,15.293834,18363.696,2924.4945)"
|
||||
id="layer1">
|
||||
<g
|
||||
transform="translate(-27.695315,1.6811913)"
|
||||
id="g4398">
|
||||
<rect
|
||||
width="120.41093"
|
||||
height="120.41093"
|
||||
rx="10.629922"
|
||||
ry="10.629921"
|
||||
x="-1171.9364"
|
||||
y="-191.80794"
|
||||
id="rect3315"
|
||||
style="fill:#e30613;fill-opacity:0.701961;stroke:#e30613;stroke-width:2.1875;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<rect
|
||||
width="77.257874"
|
||||
height="77.257874"
|
||||
rx="6.8203545"
|
||||
ry="6.820354"
|
||||
x="-917.79828"
|
||||
y="654.4267"
|
||||
transform="rotate(45)"
|
||||
id="rect3317"
|
||||
style="fill:#e30613;fill-opacity:1;stroke:#000000;stroke-width:1.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
||||
<path
|
||||
d="m -1125.6244,-168.82932 h 1.9696 v 5.28322 c 0,0.8384 0.024,1.38181 0.073,1.63022 0.084,0.39924 0.285,0.71973 0.6022,0.96149 0.3171,0.24176 0.7508,0.36264 1.3008,0.36264 0.5589,0 0.9804,-0.11422 1.2643,-0.34268 0.2839,-0.22845 0.4546,-0.50902 0.5123,-0.84172 0.058,-0.33269 0.087,-0.88497 0.087,-1.65683 v -5.39634 h 1.9696 v 5.12353 c 0,1.17109 -0.053,1.9984 -0.1597,2.48192 -0.1065,0.48352 -0.3028,0.89162 -0.5889,1.22432 -0.2861,0.3327 -0.6687,0.59775 -1.1478,0.79514 -0.4791,0.1974 -1.1045,0.2961 -1.8764,0.2961 -0.9316,0 -1.638,-0.10757 -2.1193,-0.32271 -0.4813,-0.21514 -0.8617,-0.49461 -1.1411,-0.8384 -0.2795,-0.34378 -0.4636,-0.7042 -0.5523,-1.08126 -0.1286,-0.55893 -0.193,-1.38402 -0.193,-2.47526 z m 9.3621,6.58074 1.9164,-0.18631 c 0.1153,0.64322 0.3493,1.11565 0.7019,1.41729 0.3527,0.30164 0.8285,0.45247 1.4273,0.45247 0.6343,0 1.1123,-0.13419 1.4339,-0.40257 0.3216,-0.26837 0.4824,-0.58221 0.4824,-0.94153 0,-0.23067 -0.068,-0.42696 -0.2029,-0.58887 -0.1353,-0.16191 -0.3715,-0.30275 -0.7086,-0.42253 -0.2307,-0.0798 -0.7564,-0.22179 -1.577,-0.42585 -1.0558,-0.26172 -1.7966,-0.58332 -2.2224,-0.96482 -0.5989,-0.53674 -0.8983,-1.19105 -0.8983,-1.96291 0,-0.49682 0.1408,-0.96149 0.4225,-1.394 0.2817,-0.4325 0.6876,-0.76187 1.2177,-0.98811 0.5301,-0.22622 1.17,-0.33934 1.9196,-0.33935 1.2244,1e-5 2.1459,0.26839 2.7647,0.80513 0.6189,0.53676 0.9438,1.25316 0.9748,2.14922 l -1.9695,0.0865 c -0.084,-0.50126 -0.2651,-0.86168 -0.5423,-1.08127 -0.2773,-0.21957 -0.6931,-0.32936 -1.2476,-0.32937 -0.5723,1e-5 -1.0203,0.11757 -1.3441,0.35266 -0.2085,0.15083 -0.3128,0.35267 -0.3128,0.60551 0,0.23068 0.098,0.42808 0.2928,0.5922 0.2484,0.2085 0.8517,0.42586 1.8099,0.65209 0.9581,0.22624 1.6668,0.46023 2.1259,0.70199 0.4591,0.24176 0.8184,0.57224 1.078,0.99143 0.2594,0.4192 0.3892,0.9371 0.3892,1.5537 0,0.55893 -0.1553,1.08237 -0.4658,1.57033 -0.3105,0.48795 -0.7497,0.85059 -1.3174,1.08791 -0.5679,0.23733 -1.2754,0.35599 -2.1227,0.35599 -1.2331,0 -2.1802,-0.28501 -2.8412,-0.85503 -0.6609,-0.57002 -1.0557,-1.40065 -1.1844,-2.4919 z m 9.6283,3.17393 v -9.75467 h 1.9695 v 4.33171 l 3.9791,-4.33171 h 2.6482 l -3.6729,3.7994 3.8726,5.95527 h -2.5485 l -2.6815,-4.57791 -1.597,1.63021 v 2.9477 z"
|
||||
id="text3321"
|
||||
style="font-style:normal;font-weight:normal;font-size:14.8661px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
d="m -1115.5632,-153.11667 -1.1696,-0.21099 c 0.1315,-0.47091 0.3578,-0.8195 0.6789,-1.04579 0.321,-0.22627 0.798,-0.33941 1.431,-0.33942 0.5749,1e-5 1.003,0.068 1.2843,0.20411 0.2813,0.13608 0.4793,0.30885 0.594,0.51831 0.1147,0.20947 0.172,0.59399 0.172,1.15357 l -0.014,1.50446 c 0,0.4281 0.021,0.74382 0.062,0.94717 0.041,0.20335 0.1185,0.42122 0.2316,0.65361 h -1.2751 c -0.034,-0.0856 -0.075,-0.21252 -0.1239,-0.3807 -0.021,-0.0764 -0.037,-0.1269 -0.046,-0.15136 -0.2202,0.21405 -0.4557,0.37459 -0.7064,0.48161 -0.2507,0.10702 -0.5183,0.16054 -0.8027,0.16054 -0.5015,0 -0.8967,-0.13608 -1.1857,-0.40823 -0.2889,-0.27214 -0.4334,-0.61615 -0.4334,-1.03202 0,-0.2752 0.066,-0.5206 0.1972,-0.73618 0.1315,-0.21557 0.3157,-0.38069 0.5527,-0.49537 0.237,-0.11466 0.5787,-0.21481 1.0252,-0.30043 0.6024,-0.11314 1.0198,-0.21863 1.2522,-0.31649 v -0.12843 c 0,-0.24768 -0.061,-0.42427 -0.1835,-0.52977 -0.1223,-0.10549 -0.3532,-0.15824 -0.6926,-0.15824 -0.2294,0 -0.4082,0.0451 -0.5367,0.13531 -0.1284,0.0902 -0.2324,0.24845 -0.3119,0.47473 z m 1.7247,1.04578 c -0.1652,0.055 -0.4266,0.12079 -0.7844,0.19723 -0.3577,0.0764 -0.5917,0.15137 -0.7018,0.22475 -0.1681,0.11926 -0.2522,0.27063 -0.2522,0.45409 0,0.18042 0.067,0.33637 0.2018,0.46786 0.1345,0.13148 0.3058,0.19723 0.5137,0.19723 0.2324,0 0.4541,-0.0764 0.6651,-0.22934 0.1559,-0.1162 0.2584,-0.25839 0.3073,-0.42657 0.034,-0.11008 0.05,-0.31954 0.05,-0.62839 z m 2.486,2.33925 v -6.7242 h 1.2889 v 2.42182 c 0.3975,-0.45256 0.8684,-0.67884 1.4127,-0.67885 0.5932,1e-5 1.084,0.21482 1.4724,0.64444 0.3883,0.42964 0.5825,1.04656 0.5825,1.85077 0,0.83173 -0.198,1.47235 -0.594,1.92185 -0.396,0.44951 -0.8769,0.67426 -1.4426,0.67426 -0.2782,0 -0.5527,-0.0696 -0.8233,-0.2087 -0.2706,-0.13913 -0.5038,-0.34477 -0.6995,-0.61692 v 0.71553 z m 1.2797,-2.54107 c 0,0.50455 0.079,0.87761 0.2385,1.11918 0.2232,0.34248 0.5198,0.51371 0.8898,0.51371 0.2844,0 0.5268,-0.12154 0.727,-0.36464 0.2003,-0.2431 0.3005,-0.6261 0.3005,-1.14899 0,-0.55652 -0.1009,-0.95787 -0.3027,-1.20403 -0.2019,-0.24615 -0.4603,-0.36923 -0.7752,-0.36923 -0.3089,0 -0.5657,0.12002 -0.7706,0.36006 -0.2049,0.24004 -0.3073,0.60469 -0.3073,1.09394 z"
|
||||
id="text3325"
|
||||
style="font-style:normal;font-weight:normal;font-size:15.1574px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
<path
|
||||
d="m -1120.5986,-107.43128 h -6.762 v -25.48391 c -2.4706,2.31018 -5.3823,4.01873 -8.7353,5.12566 v -6.13635 c 1.7647,-0.57752 3.6818,-1.67243 5.7514,-3.28476 2.0695,-1.61226 3.4892,-3.49327 4.2593,-5.64303 h 5.4866 z m 15.9305,-19.03473 c -1.7487,-0.73794 -3.0201,-1.75264 -3.8142,-3.04411 -0.7941,-1.29141 -1.1912,-2.70719 -1.1912,-4.24732 0,-2.63098 0.9185,-4.80477 2.7554,-6.52137 1.8369,-1.71654 4.4478,-2.57483 7.8329,-2.57486 3.3529,3e-5 5.9558,0.85832 7.8088,2.57486 1.8529,1.7166 2.7794,3.89039 2.7794,6.52137 0,1.63639 -0.4252,3.09227 -1.2754,4.36764 -0.8503,1.27542 -2.0455,2.25002 -3.5856,2.92379 1.9572,0.78612 3.4452,1.93317 4.4639,3.44117 1.0187,1.50804 1.5281,3.24867 1.5281,5.22192 0,3.25669 -1.0388,5.90374 -3.1163,7.94116 -2.0776,2.03743 -4.8409,3.05614 -8.2901,3.05615 -3.2086,-1e-5 -5.8797,-0.84225 -8.0134,-2.52674 -2.5187,-1.98929 -3.778,-4.71656 -3.778,-8.1818 0,-1.90908 0.4732,-3.66174 1.4198,-5.25801 0.9465,-1.59624 2.4385,-2.82752 4.4759,-3.69385 z m 1.3957,-6.81014 c 0,1.34761 0.381,2.39841 1.1431,3.1524 0.762,0.75403 1.7767,1.13103 3.0441,1.13101 1.2834,2e-5 2.3101,-0.38099 3.0802,-1.14304 0.77,-0.76201 1.155,-1.81682 1.1551,-3.16444 -10e-5,-1.26735 -0.3811,-2.28205 -1.1431,-3.04411 -0.762,-0.762 -1.7687,-1.14301 -3.02,-1.14304 -1.2995,3e-5 -2.3343,0.38505 -3.1043,1.15507 -0.7701,0.77008 -1.1551,1.7888 -1.1551,3.05615 z m -0.6257,15.11227 c 0,1.86097 0.4773,3.31283 1.4319,4.3556 0.9545,1.04279 2.1457,1.56418 3.5735,1.56417 1.3957,1e-5 2.5508,-0.50133 3.4652,-1.504 0.9144,-1.00267 1.3716,-2.45053 1.3717,-4.34358 -10e-5,-1.65239 -0.4653,-2.97993 -1.3958,-3.98261 -0.9304,-1.00266 -2.1096,-1.50399 -3.5374,-1.50401 -1.6524,2e-5 -2.8837,0.56953 -3.6938,1.70855 -0.8102,1.13905 -1.2153,2.37434 -1.2153,3.70588 z"
|
||||
id="text3329"
|
||||
style="font-style:normal;font-weight:normal;font-size:14.785px;font-family:'Bitstream Vera Sans';fill:#000000;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 8.2 KiB |
59
gaseous-server/Assets/Ratings/USK/USK_6.svg
Normal file
After Width: | Height: | Size: 16 KiB |
619
gaseous-server/Classes/ImportGames.cs
Normal file
@@ -0,0 +1,619 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Security.Policy;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_tools;
|
||||
using MySqlX.XDevAPI;
|
||||
using Org.BouncyCastle.Utilities.IO.Pem;
|
||||
using static gaseous_server.Classes.Metadata.Games;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
public class ImportGames
|
||||
{
|
||||
public ImportGames(string ImportPath)
|
||||
{
|
||||
if (Directory.Exists(ImportPath))
|
||||
{
|
||||
string[] importContents_Files = Directory.GetFiles(ImportPath);
|
||||
string[] importContents_Directories = Directory.GetDirectories(ImportPath);
|
||||
|
||||
// import files first
|
||||
foreach (string importContent in importContents_Files) {
|
||||
ImportGame.ImportGameFile(importContent);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Critical, "Import Games", "The import directory " + ImportPath + " does not exist.");
|
||||
throw new DirectoryNotFoundException("Invalid path: " + ImportPath);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
public class ImportGame
|
||||
{
|
||||
public static void ImportGameFile(string GameFileImportPath, bool IsDirectory = false, bool ForceImport = false)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
|
||||
string[] SkippableFiles = {
|
||||
".DS_STORE",
|
||||
"desktop.ini"
|
||||
};
|
||||
if (SkippableFiles.Contains<string>(Path.GetFileName(GameFileImportPath), StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Debug, "Import Game", "Skipping item " + GameFileImportPath);
|
||||
}
|
||||
else
|
||||
{
|
||||
//Logging.Log(Logging.LogType.Information, "Import Game", "Processing item " + GameFileImportPath);
|
||||
if (IsDirectory == false)
|
||||
{
|
||||
FileInfo fi = new FileInfo(GameFileImportPath);
|
||||
Common.hashObject hash = new Common.hashObject(GameFileImportPath);
|
||||
|
||||
// check to make sure we don't already have this file imported
|
||||
sql = "SELECT COUNT(Id) AS count FROM Games_Roms WHERE MD5=@md5 AND SHA1=@sha1";
|
||||
dbDict.Add("md5", hash.md5hash);
|
||||
dbDict.Add("sha1", hash.sha1hash);
|
||||
DataTable importDB = db.ExecuteCMD(sql, dbDict);
|
||||
if ((Int64)importDB.Rows[0]["count"] > 0)
|
||||
{
|
||||
if (!GameFileImportPath.StartsWith(Config.LibraryConfiguration.LibraryImportDirectory))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Import Game", " " + GameFileImportPath + " already in database - skipping");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " " + GameFileImportPath + " not in database - processing");
|
||||
|
||||
// process as a single file
|
||||
Models.Signatures_Games discoveredSignature = GetFileSignature(hash, fi, GameFileImportPath);
|
||||
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(discoveredSignature.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
}
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(discoveredSignature.Game.Name, discoveredSignature.Flags.IGDBPlatformId);
|
||||
|
||||
// add to database
|
||||
StoreROM(hash, determinedGame, determinedPlatform, discoveredSignature, GameFileImportPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static Models.Signatures_Games GetFileSignature(Common.hashObject hash, FileInfo fi, string GameFileImportPath)
|
||||
{
|
||||
// check 1: do we have a signature for it?
|
||||
gaseous_server.Controllers.SignaturesController sc = new Controllers.SignaturesController();
|
||||
List<Models.Signatures_Games> signatures = sc.GetSignature(hash.md5hash);
|
||||
if (signatures.Count == 0)
|
||||
{
|
||||
// no md5 signature found - try sha1
|
||||
signatures = sc.GetSignature("", hash.sha1hash);
|
||||
}
|
||||
|
||||
Models.Signatures_Games discoveredSignature = new Models.Signatures_Games();
|
||||
if (signatures.Count == 1)
|
||||
{
|
||||
// only 1 signature found!
|
||||
discoveredSignature = signatures.ElementAt(0);
|
||||
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
|
||||
}
|
||||
else if (signatures.Count > 1)
|
||||
{
|
||||
// more than one signature found - find one with highest score
|
||||
foreach (Models.Signatures_Games Sig in signatures)
|
||||
{
|
||||
if (Sig.Score > discoveredSignature.Score)
|
||||
{
|
||||
discoveredSignature = Sig;
|
||||
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// no signature match found - try name search
|
||||
signatures = sc.GetByTosecName(fi.Name);
|
||||
|
||||
if (signatures.Count == 1)
|
||||
{
|
||||
// only 1 signature found!
|
||||
discoveredSignature = signatures.ElementAt(0);
|
||||
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
|
||||
}
|
||||
else if (signatures.Count > 1)
|
||||
{
|
||||
// more than one signature found - find one with highest score
|
||||
foreach (Models.Signatures_Games Sig in signatures)
|
||||
{
|
||||
if (Sig.Score > discoveredSignature.Score)
|
||||
{
|
||||
discoveredSignature = Sig;
|
||||
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// still no search - try alternate method
|
||||
Models.Signatures_Games.GameItem gi = new Models.Signatures_Games.GameItem();
|
||||
Models.Signatures_Games.RomItem ri = new Models.Signatures_Games.RomItem();
|
||||
|
||||
discoveredSignature.Game = gi;
|
||||
discoveredSignature.Rom = ri;
|
||||
|
||||
// game title is the file name without the extension or path
|
||||
gi.Name = Path.GetFileNameWithoutExtension(GameFileImportPath);
|
||||
|
||||
// remove everything after brackets - leaving (hopefully) only the name
|
||||
if (gi.Name.Contains("("))
|
||||
{
|
||||
gi.Name = gi.Name.Substring(0, gi.Name.IndexOf("("));
|
||||
}
|
||||
|
||||
// remove special characters like dashes
|
||||
gi.Name = gi.Name.Replace("-", "");
|
||||
|
||||
// guess platform
|
||||
gaseous_server.Models.PlatformMapping.GetIGDBPlatformMapping(ref discoveredSignature, fi, true);
|
||||
|
||||
// get rom data
|
||||
ri.Name = Path.GetFileName(GameFileImportPath);
|
||||
ri.Md5 = hash.md5hash;
|
||||
ri.Sha1 = hash.sha1hash;
|
||||
ri.Size = fi.Length;
|
||||
ri.SignatureSource = Models.Signatures_Games.RomItem.SignatureSourceType.None;
|
||||
}
|
||||
}
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Determined import file as: " + discoveredSignature.Game.Name + " (" + discoveredSignature.Game.Year + ") " + discoveredSignature.Game.System);
|
||||
|
||||
return discoveredSignature;
|
||||
}
|
||||
|
||||
public static IGDB.Models.Game SearchForGame(string GameName, long PlatformId)
|
||||
{
|
||||
// search discovered game - case insensitive exact match first
|
||||
IGDB.Models.Game determinedGame = new IGDB.Models.Game();
|
||||
|
||||
List<string> SearchCandidates = GetSearchCandidates(GameName);
|
||||
|
||||
foreach (string SearchCandidate in SearchCandidates)
|
||||
{
|
||||
bool GameFound = false;
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Searching for title: " + SearchCandidate);
|
||||
|
||||
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Search type: " + searchType.ToString());
|
||||
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
if (games.Length == 1)
|
||||
{
|
||||
// exact match!
|
||||
determinedGame = Metadata.Games.GetGame((long)games[0].Id, false, false);
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " IGDB game: " + determinedGame.Name);
|
||||
GameFound = true;
|
||||
break;
|
||||
}
|
||||
else if (games.Length > 0)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " " + games.Length + " search results found");
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " No search results found");
|
||||
}
|
||||
}
|
||||
if (GameFound == true) { break; }
|
||||
}
|
||||
if (determinedGame == null)
|
||||
{
|
||||
determinedGame = new IGDB.Models.Game();
|
||||
}
|
||||
|
||||
string destSlug = "";
|
||||
if (determinedGame.Id == null)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Unable to determine game");
|
||||
}
|
||||
|
||||
return determinedGame;
|
||||
}
|
||||
|
||||
public static List<IGDB.Models.Game> SearchForGame_GetAll(string GameName, long PlatformId)
|
||||
{
|
||||
List<IGDB.Models.Game> searchResults = new List<IGDB.Models.Game>();
|
||||
|
||||
List<string> SearchCandidates = GetSearchCandidates(GameName);
|
||||
|
||||
foreach (string SearchCandidate in SearchCandidates)
|
||||
{
|
||||
foreach (Metadata.Games.SearchType searchType in Enum.GetValues(typeof(Metadata.Games.SearchType)))
|
||||
{
|
||||
if ((PlatformId == 0 && searchType == SearchType.searchNoPlatform) || (PlatformId != 0 && searchType != SearchType.searchNoPlatform))
|
||||
{
|
||||
IGDB.Models.Game[] games = Metadata.Games.SearchForGame(SearchCandidate, PlatformId, searchType);
|
||||
foreach (IGDB.Models.Game foundGame in games)
|
||||
{
|
||||
bool gameInResults = false;
|
||||
foreach (IGDB.Models.Game searchResult in searchResults)
|
||||
{
|
||||
if (searchResult.Id == foundGame.Id)
|
||||
{
|
||||
gameInResults = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (gameInResults == false)
|
||||
{
|
||||
searchResults.Add(foundGame);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return searchResults;
|
||||
|
||||
}
|
||||
|
||||
private static List<string> GetSearchCandidates(string GameName)
|
||||
{
|
||||
// remove version numbers from name
|
||||
GameName = Regex.Replace(GameName, @"v(\d+\.)?(\d+\.)?(\*|\d+)$", "").Trim();
|
||||
GameName = Regex.Replace(GameName, @"Rev (\d+\.)?(\d+\.)?(\*|\d+)$", "").Trim();
|
||||
|
||||
List<string> SearchCandidates = new List<string>();
|
||||
SearchCandidates.Add(GameName);
|
||||
if (GameName.Contains(" - "))
|
||||
{
|
||||
SearchCandidates.Add(GameName.Replace(" - ", ": "));
|
||||
SearchCandidates.Add(GameName.Substring(0, GameName.IndexOf(" - ")).Trim());
|
||||
}
|
||||
if (GameName.Contains(": "))
|
||||
{
|
||||
SearchCandidates.Add(GameName.Substring(0, GameName.IndexOf(": ")).Trim());
|
||||
}
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Import Game", " Search candidates: " + String.Join(", ", SearchCandidates));
|
||||
|
||||
return SearchCandidates;
|
||||
}
|
||||
|
||||
public static long StoreROM(Common.hashObject hash, IGDB.Models.Game determinedGame, IGDB.Models.Platform determinedPlatform, Models.Signatures_Games discoveredSignature, string GameFileImportPath, long UpdateId = 0)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "";
|
||||
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
|
||||
if (UpdateId == 0)
|
||||
{
|
||||
sql = "INSERT INTO Games_Roms (PlatformId, GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, Path, MetadataSource) VALUES (@platformid, @gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @path, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||
} else
|
||||
{
|
||||
sql = "UPDATE Games_Roms SET PlatformId=platformid, GameId=@gameid, Name=@name, Size=@size, DevelopmentStatus=@developmentstatus, Flags=@flags, RomType=@romtype, RomTypeMedia=@romtypemedia, MediaLabel=@medialabel, MetadataSource=@metadatasource WHERE Id=@id;";
|
||||
dbDict.Add("id", UpdateId);
|
||||
}
|
||||
dbDict.Add("platformid", Common.ReturnValueIfNull(determinedPlatform.Id, 0));
|
||||
dbDict.Add("gameid", Common.ReturnValueIfNull(determinedGame.Id, 0));
|
||||
dbDict.Add("name", Common.ReturnValueIfNull(discoveredSignature.Rom.Name, ""));
|
||||
dbDict.Add("size", Common.ReturnValueIfNull(discoveredSignature.Rom.Size, 0));
|
||||
dbDict.Add("md5", hash.md5hash);
|
||||
dbDict.Add("sha1", hash.sha1hash);
|
||||
dbDict.Add("crc", Common.ReturnValueIfNull(discoveredSignature.Rom.Crc, ""));
|
||||
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(discoveredSignature.Rom.DevelopmentStatus, ""));
|
||||
dbDict.Add("metadatasource", discoveredSignature.Rom.SignatureSource);
|
||||
|
||||
if (discoveredSignature.Rom.flags != null)
|
||||
{
|
||||
if (discoveredSignature.Rom.flags.Count > 0)
|
||||
{
|
||||
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(discoveredSignature.Rom.flags));
|
||||
}
|
||||
else
|
||||
{
|
||||
dbDict.Add("flags", "[ ]");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dbDict.Add("flags", "[ ]");
|
||||
}
|
||||
dbDict.Add("romtype", (int)discoveredSignature.Rom.RomType);
|
||||
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(discoveredSignature.Rom.RomTypeMedia, ""));
|
||||
dbDict.Add("medialabel", Common.ReturnValueIfNull(discoveredSignature.Rom.MediaLabel, ""));
|
||||
dbDict.Add("path", GameFileImportPath);
|
||||
|
||||
DataTable romInsert = db.ExecuteCMD(sql, dbDict);
|
||||
long romId = 0;
|
||||
if (UpdateId == 0)
|
||||
{
|
||||
romId = (long)romInsert.Rows[0][0];
|
||||
} else
|
||||
{
|
||||
romId = UpdateId;
|
||||
}
|
||||
|
||||
// move to destination
|
||||
MoveGameFile(romId);
|
||||
|
||||
return romId;
|
||||
}
|
||||
|
||||
public static string ComputeROMPath(long RomId)
|
||||
{
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
|
||||
// get metadata
|
||||
IGDB.Models.Platform platform = gaseous_server.Classes.Metadata.Platforms.GetPlatform(rom.PlatformId);
|
||||
IGDB.Models.Game game = gaseous_server.Classes.Metadata.Games.GetGame(rom.GameId, false, false);
|
||||
|
||||
// build path
|
||||
string platformSlug = "Unknown Platform";
|
||||
if (platform != null)
|
||||
{
|
||||
platformSlug = platform.Slug;
|
||||
}
|
||||
string gameSlug = "Unknown Title";
|
||||
if (game != null)
|
||||
{
|
||||
gameSlug = game.Slug;
|
||||
}
|
||||
string DestinationPath = Path.Combine(Config.LibraryConfiguration.LibraryDataDirectory, gameSlug, platformSlug);
|
||||
if (!Directory.Exists(DestinationPath))
|
||||
{
|
||||
Directory.CreateDirectory(DestinationPath);
|
||||
}
|
||||
|
||||
string DestinationPathName = Path.Combine(DestinationPath, rom.Name);
|
||||
|
||||
return DestinationPathName;
|
||||
}
|
||||
|
||||
public static bool MoveGameFile(long RomId)
|
||||
{
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
string romPath = rom.Path;
|
||||
|
||||
if (File.Exists(romPath))
|
||||
{
|
||||
string DestinationPath = ComputeROMPath(RomId);
|
||||
|
||||
if (romPath == DestinationPath)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Debug, "Move Game ROM", "Destination path is the same as the current path - aborting");
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Move Game ROM", "Moving " + romPath + " to " + DestinationPath);
|
||||
if (File.Exists(DestinationPath))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Move Game ROM", "A file with the same name exists at the destination - aborting");
|
||||
return false;
|
||||
}
|
||||
else
|
||||
{
|
||||
File.Move(romPath, DestinationPath);
|
||||
|
||||
// update the db
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "UPDATE Games_Roms SET Path=@path WHERE Id=@id";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("id", RomId);
|
||||
dbDict.Add("path", DestinationPath);
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Move Game ROM", "File " + romPath + " appears to be missing!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
public static void OrganiseLibrary()
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Organise Library", "Starting library organisation");
|
||||
|
||||
// move rom files to their new location
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM Games_Roms";
|
||||
DataTable romDT = db.ExecuteCMD(sql);
|
||||
|
||||
if (romDT.Rows.Count > 0)
|
||||
{
|
||||
foreach (DataRow dr in romDT.Rows)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Organise Library", "Processing ROM " + dr["name"]);
|
||||
long RomId = (long)dr["id"];
|
||||
MoveGameFile(RomId);
|
||||
}
|
||||
}
|
||||
|
||||
// clean up empty directories
|
||||
DeleteOrphanedDirectories(Config.LibraryConfiguration.LibraryDataDirectory);
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Organise Library", "Finsihed library organisation");
|
||||
}
|
||||
|
||||
private static void DeleteOrphanedDirectories(string startLocation)
|
||||
{
|
||||
foreach (var directory in Directory.GetDirectories(startLocation))
|
||||
{
|
||||
DeleteOrphanedDirectories(directory);
|
||||
if (Directory.GetFiles(directory).Length == 0 &&
|
||||
Directory.GetDirectories(directory).Length == 0)
|
||||
{
|
||||
Directory.Delete(directory, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void LibraryScan()
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", "Starting library scan");
|
||||
|
||||
Database db = new Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for duplicate library files to clean up");
|
||||
string duplicateSql = "DELETE r1 FROM Games_Roms r1 INNER JOIN Games_Roms r2 WHERE r1.Id > r2.Id AND r1.MD5 = r2.MD5;";
|
||||
db.ExecuteCMD(duplicateSql);
|
||||
|
||||
string sql = "SELECT * FROM Games_Roms ORDER BY `name`";
|
||||
DataTable dtRoms = db.ExecuteCMD(sql);
|
||||
|
||||
// clean out database entries in the import folder
|
||||
if (dtRoms.Rows.Count > 0)
|
||||
{
|
||||
for (var i = 0; i < dtRoms.Rows.Count; i++)
|
||||
{
|
||||
long romId = (long)dtRoms.Rows[i]["Id"];
|
||||
string romPath = (string)dtRoms.Rows[i]["Path"];
|
||||
|
||||
if (!romPath.StartsWith(Config.LibraryConfiguration.LibraryDataDirectory))
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", " Deleting database entry for files with incorrect directory " + romPath);
|
||||
string deleteSql = "DELETE FROM Games_Roms WHERE Id=@id";
|
||||
Dictionary<string, object> deleteDict = new Dictionary<string, object>();
|
||||
deleteDict.Add("Id", romId);
|
||||
db.ExecuteCMD(deleteSql, deleteDict);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
sql = "SELECT * FROM Games_Roms ORDER BY `name`";
|
||||
dtRoms = db.ExecuteCMD(sql);
|
||||
|
||||
// search for files in the library that aren't in the database
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", "Looking for orphaned library files to add");
|
||||
string[] LibraryFiles = Directory.GetFiles(Config.LibraryConfiguration.LibraryDataDirectory, "*.*", SearchOption.AllDirectories);
|
||||
foreach (string LibraryFile in LibraryFiles)
|
||||
{
|
||||
Common.hashObject LibraryFileHash = new Common.hashObject(LibraryFile);
|
||||
|
||||
// check if file is in database
|
||||
bool romFound = false;
|
||||
for (var i = 0; i < dtRoms.Rows.Count; i++)
|
||||
{
|
||||
long romId = (long)dtRoms.Rows[i]["Id"];
|
||||
string romPath = (string)dtRoms.Rows[i]["Path"];
|
||||
string romMd5 = (string)dtRoms.Rows[i]["MD5"];
|
||||
|
||||
if ((LibraryFile == romPath) || (LibraryFileHash.md5hash == romMd5))
|
||||
{
|
||||
romFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (romFound == false)
|
||||
{
|
||||
// file is not in database - process it
|
||||
Common.hashObject hash = new Common.hashObject(LibraryFile);
|
||||
FileInfo fi = new FileInfo(LibraryFile);
|
||||
|
||||
Models.Signatures_Games sig = GetFileSignature(hash, fi, LibraryFile);
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", " Orphaned file found in library: " + LibraryFile);
|
||||
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
}
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId);
|
||||
|
||||
StoreROM(hash, determinedGame, determinedPlatform, sig, LibraryFile);
|
||||
}
|
||||
}
|
||||
|
||||
sql = "SELECT * FROM Games_Roms ORDER BY `name`";
|
||||
dtRoms = db.ExecuteCMD(sql);
|
||||
|
||||
// check all roms to see if their local file still exists
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", "Checking library files exist on disk");
|
||||
if (dtRoms.Rows.Count > 0)
|
||||
{
|
||||
for (var i = 0; i < dtRoms.Rows.Count; i++)
|
||||
{
|
||||
long romId = (long)dtRoms.Rows[i]["Id"];
|
||||
string romPath = (string)dtRoms.Rows[i]["Path"];
|
||||
Classes.Roms.GameRomItem.SourceType romMetadataSource = (Classes.Roms.GameRomItem.SourceType)(int)dtRoms.Rows[i]["MetadataSource"];
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", " Processing ROM at path " + romPath);
|
||||
|
||||
if (File.Exists(romPath))
|
||||
{
|
||||
// file exists, so lets check to make sure the signature was matched, and update if a signature can be found
|
||||
if (romMetadataSource == Roms.GameRomItem.SourceType.None)
|
||||
{
|
||||
Common.hashObject hash = new Common.hashObject
|
||||
{
|
||||
md5hash = "",
|
||||
sha1hash = ""
|
||||
};
|
||||
FileInfo fi = new FileInfo(romPath);
|
||||
|
||||
Models.Signatures_Games sig = GetFileSignature(hash, fi, romPath);
|
||||
if (sig.Rom.SignatureSource != Models.Signatures_Games.RomItem.SignatureSourceType.None)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", " Update signature found for " + romPath);
|
||||
|
||||
// get discovered platform
|
||||
IGDB.Models.Platform determinedPlatform = Metadata.Platforms.GetPlatform(sig.Flags.IGDBPlatformId);
|
||||
if (determinedPlatform == null)
|
||||
{
|
||||
determinedPlatform = new IGDB.Models.Platform();
|
||||
}
|
||||
|
||||
IGDB.Models.Game determinedGame = SearchForGame(sig.Game.Name, sig.Flags.IGDBPlatformId);
|
||||
|
||||
StoreROM(hash, determinedGame, determinedPlatform, sig, romPath, romId);
|
||||
}
|
||||
}
|
||||
|
||||
if (romPath != ComputeROMPath(romId))
|
||||
{
|
||||
MoveGameFile(romId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// file doesn't exist where it's supposed to be! delete it from the db
|
||||
Logging.Log(Logging.LogType.Warning, "Library Scan", " Deleting orphaned database entry for " + romPath);
|
||||
|
||||
string deleteSql = "DELETE FROM Games_Roms WHERE Id = @id";
|
||||
Dictionary<string, object> deleteDict = new Dictionary<string, object>();
|
||||
deleteDict.Add("id", romId);
|
||||
db.ExecuteCMD(deleteSql, deleteDict);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Library Scan", "Library scan completed");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
152
gaseous-server/Classes/Metadata/AgeRating.cs
Normal file
@@ -0,0 +1,152 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class AgeRatings
|
||||
{
|
||||
const string fieldList = "fields category,checksum,content_descriptions,rating,rating_cover_url,synopsis;";
|
||||
|
||||
public AgeRatings()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static AgeRating? GetAgeRatings(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AgeRating> RetVal = _GetAgeRatings(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static AgeRating GetAgeRatings(string Slug)
|
||||
{
|
||||
Task<AgeRating> RetVal = _GetAgeRatings(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<AgeRating> _GetAgeRatings(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AgeRating", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AgeRating", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
AgeRating returnValue = new AgeRating();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AgeRating>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(AgeRating ageRating)
|
||||
{
|
||||
if (ageRating.ContentDescriptions != null)
|
||||
{
|
||||
foreach (long AgeRatingContentDescriptionId in ageRating.ContentDescriptions.Ids)
|
||||
{
|
||||
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(AgeRatingContentDescriptionId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<AgeRating> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get AgeRatings metadata
|
||||
var results = await igdb.QueryAsync<AgeRating>(IGDBClient.Endpoints.AgeRating, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static GameAgeRating GetConsolidatedAgeRating(long RatingId)
|
||||
{
|
||||
GameAgeRating gameAgeRating = new GameAgeRating();
|
||||
|
||||
AgeRating ageRating = GetAgeRatings(RatingId);
|
||||
gameAgeRating.Id = (long)ageRating.Id;
|
||||
gameAgeRating.RatingBoard = (AgeRatingCategory)ageRating.Category;
|
||||
gameAgeRating.RatingTitle = (AgeRatingTitle)ageRating.Rating;
|
||||
|
||||
List<string> descriptions = new List<string>();
|
||||
if (ageRating.ContentDescriptions != null)
|
||||
{
|
||||
foreach (long ContentId in ageRating.ContentDescriptions.Ids)
|
||||
{
|
||||
AgeRatingContentDescription ageRatingContentDescription = AgeRatingContentDescriptions.GetAgeRatingContentDescriptions(ContentId);
|
||||
descriptions.Add(ageRatingContentDescription.Description);
|
||||
}
|
||||
}
|
||||
gameAgeRating.Descriptions = descriptions.ToArray();
|
||||
|
||||
return gameAgeRating;
|
||||
}
|
||||
|
||||
public class GameAgeRating
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public AgeRatingCategory RatingBoard { get; set; }
|
||||
public AgeRatingTitle RatingTitle { get; set; }
|
||||
public string[] Descriptions { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
107
gaseous-server/Classes/Metadata/AgeRatingContentDescriptions.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class AgeRatingContentDescriptions
|
||||
{
|
||||
const string fieldList = "fields category,checksum,description;";
|
||||
|
||||
public AgeRatingContentDescriptions()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static AgeRatingContentDescription? GetAgeRatingContentDescriptions(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AgeRatingContentDescription> RetVal = _GetAgeRatingContentDescriptions(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static AgeRatingContentDescription GetAgeRatingContentDescriptions(string Slug)
|
||||
{
|
||||
Task<AgeRatingContentDescription> RetVal = _GetAgeRatingContentDescriptions(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<AgeRatingContentDescription> _GetAgeRatingContentDescriptions(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AgeRatingContentDescription", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AgeRatingContentDescription", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
AgeRatingContentDescription returnValue = new AgeRatingContentDescription();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AgeRatingContentDescription>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<AgeRatingContentDescription> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get AgeRatingContentDescriptionContentDescriptions metadata
|
||||
var results = await igdb.QueryAsync<AgeRatingContentDescription>(IGDBClient.Endpoints.AgeRatingContentDescriptions, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
107
gaseous-server/Classes/Metadata/AlternativeNames.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class AlternativeNames
|
||||
{
|
||||
const string fieldList = "fields checksum,comment,game,name;";
|
||||
|
||||
public AlternativeNames()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static AlternativeName? GetAlternativeNames(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<AlternativeName> RetVal = _GetAlternativeNames(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static AlternativeName GetAlternativeNames(string Slug)
|
||||
{
|
||||
Task<AlternativeName> RetVal = _GetAlternativeNames(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<AlternativeName> _GetAlternativeNames(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AlternativeName", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("AlternativeName", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
AlternativeName returnValue = new AlternativeName();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<AlternativeName>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<AlternativeName> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get AlternativeNames metadata
|
||||
var results = await igdb.QueryAsync<AlternativeName>(IGDBClient.Endpoints.AlternativeNames, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
168
gaseous-server/Classes/Metadata/Artworks.cs
Normal file
@@ -0,0 +1,168 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Artworks
|
||||
{
|
||||
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
|
||||
|
||||
public Artworks()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Artwork? GetArtwork(long? Id, string LogoPath)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Artwork> RetVal = _GetArtwork(SearchUsing.id, Id, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Artwork GetArtwork(string Slug, string LogoPath)
|
||||
{
|
||||
Task<Artwork> RetVal = _GetArtwork(SearchUsing.slug, Slug, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Artwork> _GetArtwork(SearchUsing searchUsing, object searchValue, string LogoPath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Artwork", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Artwork", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Artwork returnValue = new Artwork();
|
||||
bool forceImageDownload = false;
|
||||
LogoPath = Path.Combine(LogoPath, "Artwork");
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Artwork>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if ((!File.Exists(Path.Combine(LogoPath, returnValue.ImageId + ".jpg"))) || forceImageDownload == true)
|
||||
{
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Artwork> GetObjectFromServer(string WhereClause, string LogoPath)
|
||||
{
|
||||
// get Artwork metadata
|
||||
var results = await igdb.QueryAsync<Artwork>(IGDBClient.Endpoints.Artworks, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
string fileName = "Artwork.jpg";
|
||||
string extension = "jpg";
|
||||
switch (logoSize)
|
||||
{
|
||||
case LogoSize.t_thumb:
|
||||
fileName = "_Thumb";
|
||||
extension = "jpg";
|
||||
break;
|
||||
case LogoSize.t_logo_med:
|
||||
fileName = "_Medium";
|
||||
extension = "png";
|
||||
break;
|
||||
case LogoSize.t_original:
|
||||
fileName = "";
|
||||
extension = "png";
|
||||
break;
|
||||
default:
|
||||
fileName = "Artwork";
|
||||
extension = "jpg";
|
||||
break;
|
||||
}
|
||||
fileName = ImageId + fileName;
|
||||
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
|
||||
|
||||
using (var s = client.GetStreamAsync("https:" + imageUrl))
|
||||
{
|
||||
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
|
||||
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
|
||||
{
|
||||
s.Result.CopyTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum LogoSize
|
||||
{
|
||||
t_thumb,
|
||||
t_logo_med,
|
||||
t_original
|
||||
}
|
||||
}
|
||||
}
|
||||
|
107
gaseous-server/Classes/Metadata/Collections.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Collections
|
||||
{
|
||||
const string fieldList = "fields checksum,created_at,games,name,slug,updated_at,url;";
|
||||
|
||||
public Collections()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Collection? GetCollections(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Collection> RetVal = _GetCollections(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Collection GetCollections(string Slug)
|
||||
{
|
||||
Task<Collection> RetVal = _GetCollections(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Collection> _GetCollections(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Collection", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Collection", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Collection returnValue = new Collection();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Collection>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Collection> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get Collections metadata
|
||||
var results = await igdb.QueryAsync<Collection>(IGDBClient.Endpoints.Collections, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
123
gaseous-server/Classes/Metadata/Company.cs
Normal file
@@ -0,0 +1,123 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Companies
|
||||
{
|
||||
const string fieldList = "fields change_date,change_date_category,changed_company_id,checksum,country,created_at,description,developed,logo,name,parent,published,slug,start_date,start_date_category,updated_at,url,websites;";
|
||||
|
||||
public Companies()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Company? GetCompanies(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Company> RetVal = _GetCompanies(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Company GetCompanies(string Slug)
|
||||
{
|
||||
Task<Company> RetVal = _GetCompanies(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Company> _GetCompanies(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Company", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Company", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Company returnValue = new Company();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null) { Storage.NewCacheValue(returnValue); }
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null) { Storage.NewCacheValue(returnValue, true); }
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Company>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Company company)
|
||||
{
|
||||
if (company.Logo != null)
|
||||
{
|
||||
CompanyLogo companyLogo = CompanyLogos.GetCompanyLogo(company.Logo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company));
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Company> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get Companies metadata
|
||||
var results = await igdb.QueryAsync<Company>(IGDBClient.Endpoints.Companies, query: fieldList + " " + WhereClause + ";");
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
175
gaseous-server/Classes/Metadata/CompanyLogos.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class CompanyLogos
|
||||
{
|
||||
const string fieldList = "fields alpha_channel,animated,checksum,height,image_id,url,width;";
|
||||
|
||||
public CompanyLogos()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static CompanyLogo? GetCompanyLogo(long? Id, string LogoPath)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<CompanyLogo> RetVal = _GetCompanyLogo(SearchUsing.id, Id, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static CompanyLogo GetCompanyLogo(string Slug, string LogoPath)
|
||||
{
|
||||
Task<CompanyLogo> RetVal = _GetCompanyLogo(SearchUsing.slug, Slug, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<CompanyLogo> _GetCompanyLogo(SearchUsing searchUsing, object searchValue, string LogoPath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("CompanyLogo", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("CompanyLogo", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
CompanyLogo returnValue = new CompanyLogo();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<CompanyLogo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (returnValue != null)
|
||||
{
|
||||
if ((!File.Exists(Path.Combine(LogoPath, "Logo.jpg"))) || forceImageDownload == true)
|
||||
{
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb);
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<CompanyLogo?> GetObjectFromServer(string WhereClause, string LogoPath)
|
||||
{
|
||||
// get CompanyLogo metadata
|
||||
var results = await igdb.QueryAsync<CompanyLogo>(IGDBClient.Endpoints.CompanyLogos, query: fieldList + " " + WhereClause + ";");
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb);
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med);
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
string fileName = "Logo.jpg";
|
||||
string extension = "jpg";
|
||||
switch (logoSize)
|
||||
{
|
||||
case LogoSize.t_thumb:
|
||||
fileName = "Logo_Thumb";
|
||||
extension = "jpg";
|
||||
break;
|
||||
case LogoSize.t_logo_med:
|
||||
fileName = "Logo_Medium";
|
||||
extension = "png";
|
||||
break;
|
||||
default:
|
||||
fileName = "Logo";
|
||||
extension = "jpg";
|
||||
break;
|
||||
}
|
||||
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
|
||||
|
||||
using (var s = client.GetStreamAsync("https:" + imageUrl))
|
||||
{
|
||||
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
|
||||
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
|
||||
{
|
||||
s.Result.CopyTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum LogoSize
|
||||
{
|
||||
t_thumb,
|
||||
t_logo_med
|
||||
}
|
||||
}
|
||||
}
|
||||
|
166
gaseous-server/Classes/Metadata/Covers.cs
Normal file
@@ -0,0 +1,166 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Covers
|
||||
{
|
||||
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
|
||||
|
||||
public Covers()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Cover? GetCover(long? Id, string LogoPath)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Cover> RetVal = _GetCover(SearchUsing.id, Id, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Cover GetCover(string Slug, string LogoPath)
|
||||
{
|
||||
Task<Cover> RetVal = _GetCover(SearchUsing.slug, Slug, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Cover> _GetCover(SearchUsing searchUsing, object searchValue, string LogoPath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Cover", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Cover", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Cover returnValue = new Cover();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Cover>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if ((!File.Exists(Path.Combine(LogoPath, "Cover.jpg"))) || forceImageDownload == true)
|
||||
{
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Cover> GetObjectFromServer(string WhereClause, string LogoPath)
|
||||
{
|
||||
// get Cover metadata
|
||||
var results = await igdb.QueryAsync<Cover>(IGDBClient.Endpoints.Covers, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
string fileName = "Cover.jpg";
|
||||
string extension = "jpg";
|
||||
switch (logoSize)
|
||||
{
|
||||
case LogoSize.t_thumb:
|
||||
fileName = "Cover_Thumb";
|
||||
extension = "jpg";
|
||||
break;
|
||||
case LogoSize.t_logo_med:
|
||||
fileName = "Cover_Medium";
|
||||
extension = "png";
|
||||
break;
|
||||
case LogoSize.t_original:
|
||||
fileName = "Cover";
|
||||
extension = "png";
|
||||
break;
|
||||
default:
|
||||
fileName = "Cover";
|
||||
extension = "jpg";
|
||||
break;
|
||||
}
|
||||
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
|
||||
|
||||
using (var s = client.GetStreamAsync("https:" + imageUrl))
|
||||
{
|
||||
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
|
||||
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
|
||||
{
|
||||
s.Result.CopyTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum LogoSize
|
||||
{
|
||||
t_thumb,
|
||||
t_logo_med,
|
||||
t_original
|
||||
}
|
||||
}
|
||||
}
|
||||
|
120
gaseous-server/Classes/Metadata/ExternalGames.cs
Normal file
@@ -0,0 +1,120 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class ExternalGames
|
||||
{
|
||||
const string fieldList = "fields category,checksum,countries,created_at,game,media,name,platform,uid,updated_at,url,year;";
|
||||
|
||||
public ExternalGames()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static ExternalGame? GetExternalGames(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<ExternalGame> RetVal = _GetExternalGames(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static ExternalGame GetExternalGames(string Slug)
|
||||
{
|
||||
Task<ExternalGame> RetVal = _GetExternalGames(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<ExternalGame> _GetExternalGames(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("ExternalGame", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("ExternalGame", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
ExternalGame returnValue = new ExternalGame();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<ExternalGame>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<ExternalGame?> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get ExternalGames metadata
|
||||
var results = await igdb.QueryAsync<ExternalGame>(IGDBClient.Endpoints.ExternalGames, query: fieldList + " " + WhereClause + ";");
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
107
gaseous-server/Classes/Metadata/Franchises.cs
Normal file
@@ -0,0 +1,107 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Franchises
|
||||
{
|
||||
const string fieldList = "fields checksum,created_at,games,name,slug,updated_at,url;";
|
||||
|
||||
public Franchises()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Franchise? GetFranchises(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Franchise> RetVal = _GetFranchises(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Franchise GetFranchises(string Slug)
|
||||
{
|
||||
Task<Franchise> RetVal = _GetFranchises(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Franchise> _GetFranchises(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Franchise", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Franchise", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Franchise returnValue = new Franchise();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Franchise>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Franchise> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get FranchiseContentDescriptions metadata
|
||||
var results = await igdb.QueryAsync<Franchise>(IGDBClient.Endpoints.Franchies, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
110
gaseous-server/Classes/Metadata/GameVideos.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class GamesVideos
|
||||
{
|
||||
const string fieldList = "fields checksum,game,name,video_id;";
|
||||
|
||||
public GamesVideos()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static GameVideo? GetGame_Videos(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<GameVideo> RetVal = _GetGame_Videos(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static GameVideo GetGame_Videos(string Slug)
|
||||
{
|
||||
Task<GameVideo> RetVal = _GetGame_Videos(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<GameVideo> _GetGame_Videos(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("GameVideo", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("GameVideo", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
GameVideo returnValue = new GameVideo();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<GameVideo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<GameVideo> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get Game_Videos metadata
|
||||
var results = await igdb.QueryAsync<GameVideo>(IGDBClient.Endpoints.GameVideos, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
288
gaseous-server/Classes/Metadata/Games.cs
Normal file
@@ -0,0 +1,288 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Games
|
||||
{
|
||||
const string fieldList = "fields age_ratings,aggregated_rating,aggregated_rating_count,alternative_names,artworks,bundles,category,checksum,collection,cover,created_at,dlcs,expanded_games,expansions,external_games,first_release_date,follows,forks,franchise,franchises,game_engines,game_localizations,game_modes,genres,hypes,involved_companies,keywords,language_supports,multiplayer_modes,name,parent_game,platforms,player_perspectives,ports,rating,rating_count,release_dates,remakes,remasters,screenshots,similar_games,slug,standalone_expansions,status,storyline,summary,tags,themes,total_rating,total_rating_count,updated_at,url,version_parent,version_title,videos,websites;";
|
||||
|
||||
public Games()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Game? GetGame(long Id, bool followSubGames, bool forceRefresh)
|
||||
{
|
||||
if (Id == 0)
|
||||
{
|
||||
Game returnValue = new Game();
|
||||
if (Storage.GetCacheStatus("Game", 0) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
returnValue = new Game
|
||||
{
|
||||
Id = 0,
|
||||
Name = "Unknown Title",
|
||||
Slug = "Unknown"
|
||||
};
|
||||
Storage.NewCacheValue(returnValue);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Storage.GetCacheValue<Game>(returnValue, "id", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Game> RetVal = _GetGame(SearchUsing.id, Id, followSubGames, forceRefresh);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Game GetGame(string Slug, bool followSubGames, bool forceRefresh)
|
||||
{
|
||||
Task<Game> RetVal = _GetGame(SearchUsing.slug, Slug, followSubGames, forceRefresh);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
public static Game GetGame(DataRow dataRow)
|
||||
{
|
||||
return Storage.BuildCacheObject<Game>(new Game(), dataRow);
|
||||
}
|
||||
|
||||
private static async Task<Game> _GetGame(SearchUsing searchUsing, object searchValue, bool followSubGames = false, bool forceRefresh = false)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Game", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Game", (string)searchValue);
|
||||
}
|
||||
|
||||
if (forceRefresh == true)
|
||||
{
|
||||
if (cacheStatus == Storage.CacheStatus.Current) { cacheStatus = Storage.CacheStatus.Expired; }
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Game returnValue = new Game();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue, followSubGames);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue, followSubGames);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Current:
|
||||
return Storage.GetCacheValue<Game>(returnValue, "id", (long)searchValue);
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Game Game, bool followSubGames)
|
||||
{
|
||||
if (Game.AgeRatings != null)
|
||||
{
|
||||
foreach (long AgeRatingId in Game.AgeRatings.Ids)
|
||||
{
|
||||
AgeRating GameAgeRating = AgeRatings.GetAgeRatings(AgeRatingId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.AlternativeNames != null)
|
||||
{
|
||||
foreach (long AlternativeNameId in Game.AlternativeNames.Ids)
|
||||
{
|
||||
AlternativeName GameAlternativeName = AlternativeNames.GetAlternativeNames(AlternativeNameId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Artworks != null)
|
||||
{
|
||||
foreach (long ArtworkId in Game.Artworks.Ids)
|
||||
{
|
||||
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
|
||||
}
|
||||
}
|
||||
|
||||
if (followSubGames)
|
||||
{
|
||||
List<long> gamesToFetch = new List<long>();
|
||||
if (Game.Bundles != null) { gamesToFetch.AddRange(Game.Bundles.Ids); }
|
||||
if (Game.Dlcs != null) { gamesToFetch.AddRange(Game.Dlcs.Ids); }
|
||||
if (Game.Expansions != null) { gamesToFetch.AddRange(Game.Expansions.Ids); }
|
||||
if (Game.ParentGame != null) { gamesToFetch.Add((long)Game.ParentGame.Id); }
|
||||
//if (Game.SimilarGames != null) { gamesToFetch.AddRange(Game.SimilarGames.Ids); }
|
||||
if (Game.StandaloneExpansions != null) { gamesToFetch.AddRange(Game.StandaloneExpansions.Ids); }
|
||||
if (Game.VersionParent != null) { gamesToFetch.Add((long)Game.VersionParent.Id); }
|
||||
|
||||
foreach (long gameId in gamesToFetch)
|
||||
{
|
||||
Game relatedGame = GetGame(gameId, false, false);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Collection != null)
|
||||
{
|
||||
Collection GameCollection = Collections.GetCollections(Game.Collection.Id);
|
||||
}
|
||||
|
||||
if (Game.Cover != null)
|
||||
{
|
||||
Cover GameCover = Covers.GetCover(Game.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
|
||||
}
|
||||
|
||||
if (Game.ExternalGames != null)
|
||||
{
|
||||
foreach (long ExternalGameId in Game.ExternalGames.Ids)
|
||||
{
|
||||
ExternalGame GameExternalGame = ExternalGames.GetExternalGames(ExternalGameId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Franchise != null)
|
||||
{
|
||||
Franchise GameFranchise = Franchises.GetFranchises(Game.Franchise.Id);
|
||||
}
|
||||
|
||||
if (Game.Franchises != null)
|
||||
{
|
||||
foreach (long FranchiseId in Game.Franchises.Ids)
|
||||
{
|
||||
Franchise GameFranchise = Franchises.GetFranchises(FranchiseId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Genres != null)
|
||||
{
|
||||
foreach (long GenreId in Game.Genres.Ids)
|
||||
{
|
||||
Genre GameGenre = Genres.GetGenres(GenreId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.InvolvedCompanies != null)
|
||||
{
|
||||
foreach (long involvedCompanyId in Game.InvolvedCompanies.Ids)
|
||||
{
|
||||
InvolvedCompany involvedCompany = InvolvedCompanies.GetInvolvedCompanies(involvedCompanyId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Platforms != null)
|
||||
{
|
||||
foreach (long PlatformId in Game.Platforms.Ids)
|
||||
{
|
||||
Platform GamePlatform = Platforms.GetPlatform(PlatformId);
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Screenshots != null)
|
||||
{
|
||||
foreach (long ScreenshotId in Game.Screenshots.Ids)
|
||||
{
|
||||
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(Game));
|
||||
}
|
||||
}
|
||||
|
||||
if (Game.Videos != null)
|
||||
{
|
||||
foreach (long GameVideoId in Game.Videos.Ids)
|
||||
{
|
||||
GameVideo gameVideo = GamesVideos.GetGame_Videos(GameVideoId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Game> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get Game metadata
|
||||
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
public static Game[] SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
||||
{
|
||||
Task<Game[]> games = _SearchForGame(SearchString, PlatformId, searchType);
|
||||
return games.Result;
|
||||
}
|
||||
|
||||
private static async Task<Game[]> _SearchForGame(string SearchString, long PlatformId, SearchType searchType)
|
||||
{
|
||||
string searchBody = "";
|
||||
searchBody += "fields id,name,slug,platforms,summary; ";
|
||||
switch (searchType)
|
||||
{
|
||||
case SearchType.searchNoPlatform:
|
||||
searchBody += "search \"" + SearchString + "\"; ";
|
||||
break;
|
||||
case SearchType.search:
|
||||
searchBody += "search \"" + SearchString + "\"; ";
|
||||
searchBody += "where platforms = (" + PlatformId + ");";
|
||||
break;
|
||||
case SearchType.wherefuzzy:
|
||||
searchBody += "where platforms = (" + PlatformId + ") & name ~ *\"" + SearchString + "\"*;";
|
||||
break;
|
||||
case SearchType.where:
|
||||
searchBody += "where platforms = (" + PlatformId + ") & name ~ \"" + SearchString + "\";";
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
// get Game metadata
|
||||
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: searchBody);
|
||||
|
||||
return results;
|
||||
}
|
||||
|
||||
public enum SearchType
|
||||
{
|
||||
where = 0,
|
||||
wherefuzzy = 1,
|
||||
search = 2,
|
||||
searchNoPlatform = 3
|
||||
}
|
||||
}
|
||||
}
|
110
gaseous-server/Classes/Metadata/Genres.cs
Normal file
@@ -0,0 +1,110 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Genres
|
||||
{
|
||||
const string fieldList = "fields checksum,created_at,name,slug,updated_at,url;";
|
||||
|
||||
public Genres()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Genre? GetGenres(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Genre> RetVal = _GetGenres(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Genre GetGenres(string Slug)
|
||||
{
|
||||
Task<Genre> RetVal = _GetGenres(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Genre> _GetGenres(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Genre", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Genre", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Genre returnValue = new Genre();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Genre>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Genre> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get Genres metadata
|
||||
var results = await igdb.QueryAsync<Genre>(IGDBClient.Endpoints.Genres, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
126
gaseous-server/Classes/Metadata/InvolvedCompany.cs
Normal file
@@ -0,0 +1,126 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class InvolvedCompanies
|
||||
{
|
||||
const string fieldList = "fields *;";
|
||||
|
||||
public InvolvedCompanies()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static InvolvedCompany? GetInvolvedCompanies(long? Id)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<InvolvedCompany> RetVal = _GetInvolvedCompanies(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static InvolvedCompany GetInvolvedCompanies(string Slug)
|
||||
{
|
||||
Task<InvolvedCompany> RetVal = _GetInvolvedCompanies(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<InvolvedCompany> _GetInvolvedCompanies(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("InvolvedCompany", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("InvolvedCompany", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
InvolvedCompany returnValue = new InvolvedCompany();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue);
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<InvolvedCompany>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(InvolvedCompany involvedCompany)
|
||||
{
|
||||
if (involvedCompany.Company != null)
|
||||
{
|
||||
Company company = Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<InvolvedCompany> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get InvolvedCompanies metadata
|
||||
try
|
||||
{
|
||||
var results = await igdb.QueryAsync<InvolvedCompany>(IGDBClient.Endpoints.InvolvedCompanies, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Failure when requesting involved companies.");
|
||||
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Field list: " + fieldList);
|
||||
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Where clause: " + WhereClause);
|
||||
Logging.Log(Logging.LogType.Critical, "Involved Companies", "Error", ex);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
175
gaseous-server/Classes/Metadata/PlatformLogos.cs
Normal file
@@ -0,0 +1,175 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class PlatformLogos
|
||||
{
|
||||
const string fieldList = "fields alpha_channel,animated,checksum,height,image_id,url,width;";
|
||||
|
||||
public PlatformLogos()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static PlatformLogo? GetPlatformLogo(long? Id, string LogoPath)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<PlatformLogo> RetVal = _GetPlatformLogo(SearchUsing.id, Id, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static PlatformLogo GetPlatformLogo(string Slug, string LogoPath)
|
||||
{
|
||||
Task<PlatformLogo> RetVal = _GetPlatformLogo(SearchUsing.slug, Slug, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<PlatformLogo> _GetPlatformLogo(SearchUsing searchUsing, object searchValue, string LogoPath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("PlatformLogo", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("PlatformLogo", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
PlatformLogo returnValue = new PlatformLogo();
|
||||
bool forceImageDownload = false;
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
}
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<PlatformLogo>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if (returnValue != null)
|
||||
{
|
||||
if ((!File.Exists(Path.Combine(LogoPath, "Logo.jpg"))) || forceImageDownload == true)
|
||||
{
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb);
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med);
|
||||
}
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<PlatformLogo?> GetObjectFromServer(string WhereClause, string LogoPath)
|
||||
{
|
||||
// get PlatformLogo metadata
|
||||
var results = await igdb.QueryAsync<PlatformLogo>(IGDBClient.Endpoints.PlatformLogos, query: fieldList + " " + WhereClause + ";");
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb);
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med);
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
string fileName = "Logo.jpg";
|
||||
string extension = "jpg";
|
||||
switch (logoSize)
|
||||
{
|
||||
case LogoSize.t_thumb:
|
||||
fileName = "Logo_Thumb";
|
||||
extension = "jpg";
|
||||
break;
|
||||
case LogoSize.t_logo_med:
|
||||
fileName = "Logo_Medium";
|
||||
extension = "png";
|
||||
break;
|
||||
default:
|
||||
fileName = "Logo";
|
||||
extension = "jpg";
|
||||
break;
|
||||
}
|
||||
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
|
||||
|
||||
using (var s = client.GetStreamAsync("https:" + imageUrl))
|
||||
{
|
||||
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
|
||||
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
|
||||
{
|
||||
s.Result.CopyTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum LogoSize
|
||||
{
|
||||
t_thumb,
|
||||
t_logo_med
|
||||
}
|
||||
}
|
||||
}
|
||||
|
126
gaseous-server/Classes/Metadata/PlatformVersions.cs
Normal file
@@ -0,0 +1,126 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class PlatformVersions
|
||||
{
|
||||
const string fieldList = "fields checksum,companies,connectivity,cpu,graphics,main_manufacturer,media,memory,name,online,os,output,platform_logo,platform_version_release_dates,resolutions,slug,sound,storage,summary,url;";
|
||||
|
||||
public PlatformVersions()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static PlatformVersion? GetPlatformVersion(long Id, Platform ParentPlatform)
|
||||
{
|
||||
if (Id == 0)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<PlatformVersion> RetVal = _GetPlatformVersion(SearchUsing.id, Id, ParentPlatform);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static PlatformVersion GetPlatformVersion(string Slug, Platform ParentPlatform)
|
||||
{
|
||||
Task<PlatformVersion> RetVal = _GetPlatformVersion(SearchUsing.slug, Slug, ParentPlatform);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<PlatformVersion> _GetPlatformVersion(SearchUsing searchUsing, object searchValue, Platform ParentPlatform)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("PlatformVersion", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("PlatformVersion", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
PlatformVersion returnValue = new PlatformVersion();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(ParentPlatform, returnValue);
|
||||
}
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
if (returnValue != null)
|
||||
{
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(ParentPlatform, returnValue);
|
||||
}
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Current:
|
||||
return Storage.GetCacheValue<PlatformVersion>(returnValue, "id", (long)searchValue);
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Platform ParentPlatform, PlatformVersion platformVersion)
|
||||
{
|
||||
if (platformVersion.PlatformLogo != null)
|
||||
{
|
||||
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platformVersion.PlatformLogo.Id, Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(ParentPlatform), "Versions", platformVersion.Slug));
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<PlatformVersion?> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get PlatformVersion metadata
|
||||
var results = await igdb.QueryAsync<PlatformVersion>(IGDBClient.Endpoints.PlatformVersions, query: fieldList + " " + WhereClause + ";");
|
||||
if (results.Length > 0)
|
||||
{
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
139
gaseous-server/Classes/Metadata/Platforms.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Net;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Platforms
|
||||
{
|
||||
const string fieldList = "fields abbreviation,alternative_name,category,checksum,created_at,generation,name,platform_family,platform_logo,slug,summary,updated_at,url,versions,websites;";
|
||||
|
||||
public Platforms()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Platform? GetPlatform(long Id)
|
||||
{
|
||||
if (Id == 0)
|
||||
{
|
||||
Platform returnValue = new Platform();
|
||||
if (Storage.GetCacheStatus("Platform", 0) == Storage.CacheStatus.NotPresent)
|
||||
{
|
||||
returnValue = new Platform
|
||||
{
|
||||
Id = 0,
|
||||
Name = "Unknown Platform",
|
||||
Slug = "Unknown"
|
||||
};
|
||||
Storage.NewCacheValue(returnValue);
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
return Storage.GetCacheValue<Platform>(returnValue, "id", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Platform> RetVal = _GetPlatform(SearchUsing.id, Id);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Platform GetPlatform(string Slug)
|
||||
{
|
||||
Task<Platform> RetVal = _GetPlatform(SearchUsing.slug, Slug);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Platform> _GetPlatform(SearchUsing searchUsing, object searchValue)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Platform", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Platform", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Platform returnValue = new Platform();
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
UpdateSubClasses(returnValue);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
UpdateSubClasses(returnValue);
|
||||
return returnValue;
|
||||
case Storage.CacheStatus.Current:
|
||||
return Storage.GetCacheValue<Platform>(returnValue, "id", (long)searchValue);
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
}
|
||||
|
||||
private static void UpdateSubClasses(Platform platform)
|
||||
{
|
||||
if (platform.Versions != null)
|
||||
{
|
||||
foreach (long PlatformVersionId in platform.Versions.Ids)
|
||||
{
|
||||
PlatformVersion platformVersion = PlatformVersions.GetPlatformVersion(PlatformVersionId, platform);
|
||||
}
|
||||
}
|
||||
|
||||
if (platform.PlatformLogo != null)
|
||||
{
|
||||
PlatformLogo platformLogo = PlatformLogos.GetPlatformLogo(platform.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platform));
|
||||
}
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Platform> GetObjectFromServer(string WhereClause)
|
||||
{
|
||||
// get platform metadata
|
||||
var results = await igdb.QueryAsync<Platform>(IGDBClient.Endpoints.Platforms, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
168
gaseous-server/Classes/Metadata/Screenshots.cs
Normal file
@@ -0,0 +1,168 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using MySqlX.XDevAPI.Common;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Screenshots
|
||||
{
|
||||
const string fieldList = "fields alpha_channel,animated,checksum,game,height,image_id,url,width;";
|
||||
|
||||
public Screenshots()
|
||||
{
|
||||
}
|
||||
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
public static Screenshot? GetScreenshot(long? Id, string LogoPath)
|
||||
{
|
||||
if ((Id == 0) || (Id == null))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
else
|
||||
{
|
||||
Task<Screenshot> RetVal = _GetScreenshot(SearchUsing.id, Id, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
}
|
||||
|
||||
public static Screenshot GetScreenshot(string Slug, string LogoPath)
|
||||
{
|
||||
Task<Screenshot> RetVal = _GetScreenshot(SearchUsing.slug, Slug, LogoPath);
|
||||
return RetVal.Result;
|
||||
}
|
||||
|
||||
private static async Task<Screenshot> _GetScreenshot(SearchUsing searchUsing, object searchValue, string LogoPath)
|
||||
{
|
||||
// check database first
|
||||
Storage.CacheStatus? cacheStatus = new Storage.CacheStatus();
|
||||
if (searchUsing == SearchUsing.id)
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Screenshot", (long)searchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
cacheStatus = Storage.GetCacheStatus("Screenshot", (string)searchValue);
|
||||
}
|
||||
|
||||
// set up where clause
|
||||
string WhereClause = "";
|
||||
switch (searchUsing)
|
||||
{
|
||||
case SearchUsing.id:
|
||||
WhereClause = "where id = " + searchValue;
|
||||
break;
|
||||
case SearchUsing.slug:
|
||||
WhereClause = "where slug = " + searchValue;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("Invalid search type");
|
||||
}
|
||||
|
||||
Screenshot returnValue = new Screenshot();
|
||||
bool forceImageDownload = false;
|
||||
LogoPath = Path.Combine(LogoPath, "Screenshots");
|
||||
switch (cacheStatus)
|
||||
{
|
||||
case Storage.CacheStatus.NotPresent:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Expired:
|
||||
returnValue = await GetObjectFromServer(WhereClause, LogoPath);
|
||||
Storage.NewCacheValue(returnValue, true);
|
||||
forceImageDownload = true;
|
||||
break;
|
||||
case Storage.CacheStatus.Current:
|
||||
returnValue = Storage.GetCacheValue<Screenshot>(returnValue, "id", (long)searchValue);
|
||||
break;
|
||||
default:
|
||||
throw new Exception("How did you get here?");
|
||||
}
|
||||
|
||||
if ((!File.Exists(Path.Combine(LogoPath, "Screenshot.jpg"))) || forceImageDownload == true)
|
||||
{
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_thumb, returnValue.ImageId);
|
||||
//GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_logo_med, returnValue.ImageId);
|
||||
GetImageFromServer(returnValue.Url, LogoPath, LogoSize.t_original, returnValue.ImageId);
|
||||
}
|
||||
|
||||
return returnValue;
|
||||
}
|
||||
|
||||
private enum SearchUsing
|
||||
{
|
||||
id,
|
||||
slug
|
||||
}
|
||||
|
||||
private static async Task<Screenshot> GetObjectFromServer(string WhereClause, string LogoPath)
|
||||
{
|
||||
// get Screenshot metadata
|
||||
var results = await igdb.QueryAsync<Screenshot>(IGDBClient.Endpoints.Screenshots, query: fieldList + " " + WhereClause + ";");
|
||||
var result = results.First();
|
||||
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_thumb, result.ImageId);
|
||||
//GetImageFromServer(result.Url, LogoPath, LogoSize.t_logo_med, result.ImageId);
|
||||
GetImageFromServer(result.Url, LogoPath, LogoSize.t_original, result.ImageId);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
private static void GetImageFromServer(string Url, string LogoPath, LogoSize logoSize, string ImageId)
|
||||
{
|
||||
using (var client = new HttpClient())
|
||||
{
|
||||
string fileName = "Artwork.jpg";
|
||||
string extension = "jpg";
|
||||
switch (logoSize)
|
||||
{
|
||||
case LogoSize.t_thumb:
|
||||
fileName = "_Thumb";
|
||||
extension = "jpg";
|
||||
break;
|
||||
case LogoSize.t_logo_med:
|
||||
fileName = "_Medium";
|
||||
extension = "png";
|
||||
break;
|
||||
case LogoSize.t_original:
|
||||
fileName = "";
|
||||
extension = "png";
|
||||
break;
|
||||
default:
|
||||
fileName = "Artwork";
|
||||
extension = "jpg";
|
||||
break;
|
||||
}
|
||||
fileName = ImageId + fileName;
|
||||
string imageUrl = Url.Replace(LogoSize.t_thumb.ToString(), logoSize.ToString()).Replace("jpg", extension);
|
||||
|
||||
using (var s = client.GetStreamAsync("https:" + imageUrl))
|
||||
{
|
||||
if (!Directory.Exists(LogoPath)) { Directory.CreateDirectory(LogoPath); }
|
||||
using (var fs = new FileStream(Path.Combine(LogoPath, fileName + "." + extension), FileMode.OpenOrCreate))
|
||||
{
|
||||
s.Result.CopyTo(fs);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private enum LogoSize
|
||||
{
|
||||
t_thumb,
|
||||
t_logo_med,
|
||||
t_original
|
||||
}
|
||||
}
|
||||
}
|
||||
|
385
gaseous-server/Classes/Metadata/Storage.cs
Normal file
@@ -0,0 +1,385 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using System.Reflection;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
|
||||
namespace gaseous_server.Classes.Metadata
|
||||
{
|
||||
public class Storage
|
||||
{
|
||||
public enum CacheStatus
|
||||
{
|
||||
NotPresent,
|
||||
Current,
|
||||
Expired
|
||||
}
|
||||
|
||||
public static CacheStatus GetCacheStatus(string Endpoint, string Slug)
|
||||
{
|
||||
return _GetCacheStatus(Endpoint, "slug", Slug);
|
||||
}
|
||||
|
||||
public static CacheStatus GetCacheStatus(string Endpoint, long Id)
|
||||
{
|
||||
return _GetCacheStatus(Endpoint, "id", Id);
|
||||
}
|
||||
|
||||
public static CacheStatus GetCacheStatus(DataRow Row)
|
||||
{
|
||||
if (Row.Table.Columns.Contains("lastUpdated"))
|
||||
{
|
||||
DateTime CacheExpiryTime = DateTime.UtcNow.AddHours(-168);
|
||||
if ((DateTime)Row["lastUpdated"] < CacheExpiryTime)
|
||||
{
|
||||
return CacheStatus.Expired;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CacheStatus.Current;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("No lastUpdated column!");
|
||||
}
|
||||
}
|
||||
|
||||
private static CacheStatus _GetCacheStatus(string Endpoint, string SearchField, object SearchValue)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "SELECT lastUpdated FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
|
||||
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("Endpoint", Endpoint);
|
||||
dbDict.Add(SearchField, SearchValue);
|
||||
|
||||
DataTable dt = db.ExecuteCMD(sql, dbDict);
|
||||
if (dt.Rows.Count == 0)
|
||||
{
|
||||
// no data stored for this item, or lastUpdated
|
||||
return CacheStatus.NotPresent;
|
||||
}
|
||||
else
|
||||
{
|
||||
DateTime CacheExpiryTime = DateTime.UtcNow.AddHours(-168);
|
||||
if ((DateTime)dt.Rows[0]["lastUpdated"] < CacheExpiryTime)
|
||||
{
|
||||
return CacheStatus.Expired;
|
||||
}
|
||||
else
|
||||
{
|
||||
return CacheStatus.Current;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public static void NewCacheValue(object ObjectToCache, bool UpdateRecord = false)
|
||||
{
|
||||
// get the object type name
|
||||
string ObjectTypeName = ObjectToCache.GetType().Name;
|
||||
|
||||
// build dictionary
|
||||
string objectJson = Newtonsoft.Json.JsonConvert.SerializeObject(ObjectToCache);
|
||||
Dictionary<string, object?> objectDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object?>>(objectJson);
|
||||
objectDict.Add("dateAdded", DateTime.UtcNow);
|
||||
objectDict.Add("lastUpdated", DateTime.UtcNow);
|
||||
|
||||
// generate sql
|
||||
string fieldList = "";
|
||||
string valueList = "";
|
||||
string updateFieldValueList = "";
|
||||
foreach (KeyValuePair<string, object?> key in objectDict)
|
||||
{
|
||||
if (fieldList.Length > 0)
|
||||
{
|
||||
fieldList = fieldList + ", ";
|
||||
valueList = valueList + ", ";
|
||||
}
|
||||
fieldList = fieldList + key.Key;
|
||||
valueList = valueList + "@" + key.Key;
|
||||
if ((key.Key != "id") && (key.Key != "dateAdded"))
|
||||
{
|
||||
if (updateFieldValueList.Length > 0)
|
||||
{
|
||||
updateFieldValueList = updateFieldValueList + ", ";
|
||||
}
|
||||
updateFieldValueList += key.Key + " = @" + key.Key;
|
||||
}
|
||||
|
||||
// check property type
|
||||
Type objectType = ObjectToCache.GetType();
|
||||
if (objectType != null)
|
||||
{
|
||||
PropertyInfo objectProperty = objectType.GetProperty(key.Key);
|
||||
if (objectProperty != null)
|
||||
{
|
||||
string compareName = objectProperty.PropertyType.Name.ToLower().Split("`")[0];
|
||||
var objectValue = objectProperty.GetValue(ObjectToCache);
|
||||
if (objectValue != null)
|
||||
{
|
||||
string newObjectValue;
|
||||
Dictionary<string, object> newDict;
|
||||
switch (compareName)
|
||||
{
|
||||
case "identityorvalue":
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
|
||||
newDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(newObjectValue);
|
||||
objectDict[key.Key] = newDict["Id"];
|
||||
break;
|
||||
case "identitiesorvalues":
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
|
||||
newDict = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(newObjectValue);
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(newDict["Ids"]);
|
||||
objectDict[key.Key] = newObjectValue;
|
||||
break;
|
||||
case "int32[]":
|
||||
newObjectValue = Newtonsoft.Json.JsonConvert.SerializeObject(objectValue);
|
||||
objectDict[key.Key] = newObjectValue;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
string sql = "";
|
||||
if (UpdateRecord == false)
|
||||
{
|
||||
sql = "INSERT INTO " + ObjectTypeName + " (" + fieldList + ") VALUES (" + valueList + ")";
|
||||
}
|
||||
else
|
||||
{
|
||||
sql = "UPDATE " + ObjectTypeName + " SET " + updateFieldValueList + " WHERE Id = @Id";
|
||||
}
|
||||
|
||||
// execute sql
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
db.ExecuteCMD(sql, objectDict);
|
||||
}
|
||||
|
||||
public static T GetCacheValue<T>(T EndpointType, string SearchField, object SearchValue)
|
||||
{
|
||||
string Endpoint = EndpointType.GetType().Name;
|
||||
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "SELECT * FROM " + Endpoint + " WHERE " + SearchField + " = @" + SearchField;
|
||||
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("Endpoint", Endpoint);
|
||||
dbDict.Add(SearchField, SearchValue);
|
||||
|
||||
DataTable dt = db.ExecuteCMD(sql, dbDict);
|
||||
if (dt.Rows.Count == 0)
|
||||
{
|
||||
// no data stored for this item
|
||||
throw new Exception("No record found that matches endpoint " + Endpoint + " with search value " + SearchValue);
|
||||
}
|
||||
else
|
||||
{
|
||||
DataRow dataRow = dt.Rows[0];
|
||||
return BuildCacheObject<T>(EndpointType, dataRow);
|
||||
}
|
||||
}
|
||||
|
||||
public static T BuildCacheObject<T>(T EndpointType, DataRow dataRow)
|
||||
{
|
||||
foreach (PropertyInfo property in EndpointType.GetType().GetProperties())
|
||||
{
|
||||
if (dataRow.Table.Columns.Contains(property.Name))
|
||||
{
|
||||
if (dataRow[property.Name] != DBNull.Value)
|
||||
{
|
||||
string objectTypeName = property.PropertyType.Name.ToLower().Split("`")[0];
|
||||
string subObjectTypeName = "";
|
||||
object? objectToStore = null;
|
||||
if (objectTypeName == "nullable")
|
||||
{
|
||||
objectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[System.", "").Replace("]", "").ToLower();
|
||||
}
|
||||
try
|
||||
{
|
||||
switch (objectTypeName)
|
||||
{
|
||||
//case "boolean":
|
||||
// Boolean storedBool = Convert.ToBoolean((int)dataRow[property.Name]);
|
||||
// property.SetValue(EndpointType, storedBool);
|
||||
// break;
|
||||
case "datetimeoffset":
|
||||
DateTimeOffset? storedDate = (DateTime?)dataRow[property.Name];
|
||||
property.SetValue(EndpointType, storedDate);
|
||||
break;
|
||||
//case "nullable":
|
||||
// Console.WriteLine("Nullable: " + property.PropertyType.UnderlyingSystemType);
|
||||
// break;
|
||||
case "identityorvalue":
|
||||
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
|
||||
|
||||
switch (subObjectTypeName)
|
||||
{
|
||||
case "collection":
|
||||
objectToStore = new IdentityOrValue<Collection>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "company":
|
||||
objectToStore = new IdentityOrValue<Company>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "cover":
|
||||
objectToStore = new IdentityOrValue<Cover>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "franchise":
|
||||
objectToStore = new IdentityOrValue<Franchise>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "game":
|
||||
objectToStore = new IdentityOrValue<Game>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformfamily":
|
||||
objectToStore = new IdentityOrValue<PlatformFamily>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformlogo":
|
||||
objectToStore = new IdentityOrValue<PlatformLogo>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
case "platformversioncompany":
|
||||
objectToStore = new IdentityOrValue<PlatformVersionCompany>(id: (long)dataRow[property.Name]);
|
||||
break;
|
||||
}
|
||||
|
||||
if (objectToStore != null)
|
||||
{
|
||||
property.SetValue(EndpointType, objectToStore);
|
||||
}
|
||||
|
||||
break;
|
||||
case "identitiesorvalues":
|
||||
subObjectTypeName = property.PropertyType.UnderlyingSystemType.ToString().Split("`1")[1].Replace("[IGDB.Models.", "").Replace("]", "").ToLower();
|
||||
|
||||
long[] fromJsonObject = Newtonsoft.Json.JsonConvert.DeserializeObject<long[]>((string)dataRow[property.Name]);
|
||||
|
||||
switch (subObjectTypeName)
|
||||
{
|
||||
case "agerating":
|
||||
objectToStore = new IdentitiesOrValues<AgeRating>(ids: fromJsonObject);
|
||||
break;
|
||||
case "alternativename":
|
||||
objectToStore = new IdentitiesOrValues<AlternativeName>(ids: fromJsonObject);
|
||||
break;
|
||||
case "artwork":
|
||||
objectToStore = new IdentitiesOrValues<Artwork>(ids: fromJsonObject);
|
||||
break;
|
||||
case "ageratingcontentdescription":
|
||||
objectToStore = new IdentitiesOrValues<AgeRatingContentDescription>(ids: fromJsonObject);
|
||||
break;
|
||||
case "game":
|
||||
objectToStore = new IdentitiesOrValues<Game>(ids: fromJsonObject);
|
||||
break;
|
||||
case "externalgame":
|
||||
objectToStore = new IdentitiesOrValues<ExternalGame>(ids: fromJsonObject);
|
||||
break;
|
||||
case "franchise":
|
||||
objectToStore = new IdentitiesOrValues<Franchise>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gameengine":
|
||||
objectToStore = new IdentitiesOrValues<GameEngine>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gamemode":
|
||||
objectToStore = new IdentitiesOrValues<GameMode>(ids: fromJsonObject);
|
||||
break;
|
||||
case "gamevideo":
|
||||
objectToStore = new IdentitiesOrValues<GameVideo>(ids: fromJsonObject);
|
||||
break;
|
||||
case "genre":
|
||||
objectToStore = new IdentitiesOrValues<Genre>(ids: fromJsonObject);
|
||||
break;
|
||||
case "involvedcompany":
|
||||
objectToStore = new IdentitiesOrValues<InvolvedCompany>(ids: fromJsonObject);
|
||||
break;
|
||||
case "multiplayermode":
|
||||
objectToStore = new IdentitiesOrValues<MultiplayerMode>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platform":
|
||||
objectToStore = new IdentitiesOrValues<Platform>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversion":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersion>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformwebsite":
|
||||
objectToStore = new IdentitiesOrValues<PlatformWebsite>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversioncompany":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersionCompany>(ids: fromJsonObject);
|
||||
break;
|
||||
case "platformversionreleasedate":
|
||||
objectToStore = new IdentitiesOrValues<PlatformVersionReleaseDate>(ids: fromJsonObject);
|
||||
break;
|
||||
case "playerperspective":
|
||||
objectToStore = new IdentitiesOrValues<PlayerPerspective>(ids: fromJsonObject);
|
||||
break;
|
||||
case "releasedate":
|
||||
objectToStore = new IdentitiesOrValues<ReleaseDate>(ids: fromJsonObject);
|
||||
break;
|
||||
case "screenshot":
|
||||
objectToStore = new IdentitiesOrValues<Screenshot>(ids: fromJsonObject);
|
||||
break;
|
||||
case "theme":
|
||||
objectToStore = new IdentitiesOrValues<Theme>(ids: fromJsonObject);
|
||||
break;
|
||||
case "website":
|
||||
objectToStore = new IdentitiesOrValues<Website>(ids: fromJsonObject);
|
||||
break;
|
||||
}
|
||||
|
||||
if (objectToStore != null)
|
||||
{
|
||||
property.SetValue(EndpointType, objectToStore);
|
||||
}
|
||||
|
||||
break;
|
||||
case "int32[]":
|
||||
Int32[] fromJsonObject_int32Array = Newtonsoft.Json.JsonConvert.DeserializeObject<Int32[]>((string)dataRow[property.Name]);
|
||||
if (fromJsonObject_int32Array != null)
|
||||
{
|
||||
property.SetValue(EndpointType, fromJsonObject_int32Array);
|
||||
}
|
||||
break;
|
||||
case "[igdb.models.category":
|
||||
property.SetValue(EndpointType, (Category)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.gamestatus":
|
||||
property.SetValue(EndpointType, (GameStatus)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingcategory":
|
||||
property.SetValue(EndpointType, (AgeRatingCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingcontentdescriptioncategory":
|
||||
property.SetValue(EndpointType, (AgeRatingContentDescriptionCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.ageratingtitle":
|
||||
property.SetValue(EndpointType, (AgeRatingTitle)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.externalcategory":
|
||||
property.SetValue(EndpointType, (ExternalCategory)dataRow[property.Name]);
|
||||
break;
|
||||
case "[igdb.models.startdatecategory":
|
||||
property.SetValue(EndpointType, (StartDateCategory)dataRow[property.Name]);
|
||||
break;
|
||||
default:
|
||||
property.SetValue(EndpointType, dataRow[property.Name]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.WriteLine("Error occurred in column " + property.Name);
|
||||
Console.WriteLine(ex.ToString());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return EndpointType;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
30
gaseous-server/Classes/MetadataManagement.cs
Normal file
@@ -0,0 +1,30 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using gaseous_tools;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
public class MetadataManagement
|
||||
{
|
||||
public static void RefreshMetadata(bool forceRefresh = false)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT Id, `Name` FROM Game;";
|
||||
DataTable dt = db.ExecuteCMD(sql);
|
||||
|
||||
foreach (DataRow dr in dt.Rows)
|
||||
{
|
||||
try
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Metadata Refresh", "Refreshing metadata for game " + dr["name"] + " (" + dr["id"] + ")");
|
||||
Metadata.Games.GetGame((long)dr["id"], true, forceRefresh);
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Critical, "Metadata Refresh", "An error occurred while refreshing metadata for " + dr["name"], ex);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
140
gaseous-server/Classes/Roms.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
using System;
|
||||
using System.Data;
|
||||
using gaseous_tools;
|
||||
|
||||
namespace gaseous_server.Classes
|
||||
{
|
||||
public class Roms
|
||||
{
|
||||
public static List<GameRomItem> GetRoms(long GameId)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM Games_Roms WHERE GameId = @id ORDER BY `Name`";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("id", GameId);
|
||||
DataTable romDT = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
if (romDT.Rows.Count > 0)
|
||||
{
|
||||
List<GameRomItem> romItems = new List<GameRomItem>();
|
||||
foreach (DataRow romDR in romDT.Rows)
|
||||
{
|
||||
romItems.Add(BuildRom(romDR));
|
||||
}
|
||||
|
||||
return romItems;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Unknown Game Id");
|
||||
}
|
||||
}
|
||||
|
||||
public static GameRomItem GetRom(long RomId)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT * FROM Games_Roms WHERE Id = @id";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("id", RomId);
|
||||
DataTable romDT = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
if (romDT.Rows.Count > 0)
|
||||
{
|
||||
DataRow romDR = romDT.Rows[0];
|
||||
GameRomItem romItem = BuildRom(romDR);
|
||||
return romItem;
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new Exception("Unknown ROM Id");
|
||||
}
|
||||
}
|
||||
|
||||
public static GameRomItem UpdateRom(long RomId, long PlatformId, long GameId)
|
||||
{
|
||||
// ensure metadata for platformid is present
|
||||
IGDB.Models.Platform platform = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
// ensure metadata for gameid is present
|
||||
IGDB.Models.Game game = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "UPDATE Games_Roms SET PlatformId=@platformid, GameId=@gameid WHERE Id = @id";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("id", RomId);
|
||||
dbDict.Add("platformid", PlatformId);
|
||||
dbDict.Add("gameid", GameId);
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
GameRomItem rom = GetRom(RomId);
|
||||
|
||||
return rom;
|
||||
}
|
||||
|
||||
public static void DeleteRom(long RomId)
|
||||
{
|
||||
GameRomItem rom = GetRom(RomId);
|
||||
if (File.Exists(rom.Path))
|
||||
{
|
||||
File.Delete(rom.Path);
|
||||
}
|
||||
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "DELETE FROM Games_Roms WHERE Id = @id";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("id", RomId);
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
}
|
||||
|
||||
private static GameRomItem BuildRom(DataRow romDR)
|
||||
{
|
||||
GameRomItem romItem = new GameRomItem
|
||||
{
|
||||
Id = (long)romDR["id"],
|
||||
PlatformId = (long)romDR["platformid"],
|
||||
Platform = Classes.Metadata.Platforms.GetPlatform((long)romDR["platformid"]),
|
||||
GameId = (long)romDR["gameid"],
|
||||
Name = (string)romDR["name"],
|
||||
Size = (long)romDR["size"],
|
||||
CRC = (string)romDR["crc"],
|
||||
MD5 = (string)romDR["md5"],
|
||||
SHA1 = (string)romDR["sha1"],
|
||||
DevelopmentStatus = (string)romDR["developmentstatus"],
|
||||
Flags = Newtonsoft.Json.JsonConvert.DeserializeObject<string[]>((string)romDR["flags"]),
|
||||
RomType = (int)romDR["romtype"],
|
||||
RomTypeMedia = (string)romDR["romtypemedia"],
|
||||
MediaLabel = (string)romDR["medialabel"],
|
||||
Path = (string)romDR["path"],
|
||||
Source = (GameRomItem.SourceType)(Int32)romDR["metadatasource"]
|
||||
};
|
||||
return romItem;
|
||||
}
|
||||
|
||||
public class GameRomItem
|
||||
{
|
||||
public long Id { get; set; }
|
||||
public long PlatformId { get; set; }
|
||||
public IGDB.Models.Platform Platform { get; set; }
|
||||
public long GameId { get; set; }
|
||||
public string? Name { get; set; }
|
||||
public long Size { get; set; }
|
||||
public string? CRC { get; set; }
|
||||
public string? MD5 { get; set; }
|
||||
public string? SHA1 { get; set; }
|
||||
public string? DevelopmentStatus { get; set; }
|
||||
public string[]? Flags { get; set; }
|
||||
public int RomType { get; set; }
|
||||
public string? RomTypeMedia { get; set; }
|
||||
public string? MediaLabel { get; set; }
|
||||
public string? Path { get; set; }
|
||||
public SourceType Source { get; set; }
|
||||
|
||||
public enum SourceType
|
||||
{
|
||||
None = 0,
|
||||
TOSEC = 1
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
234
gaseous-server/Classes/SignatureIngestors/TOSEC.cs
Normal file
@@ -0,0 +1,234 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using MySql.Data.MySqlClient;
|
||||
using gaseous_romsignatureobject;
|
||||
using gaseous_signature_parser.parsers;
|
||||
using gaseous_tools;
|
||||
using MySqlX.XDevAPI;
|
||||
|
||||
namespace gaseous_server.SignatureIngestors.TOSEC
|
||||
{
|
||||
public class TOSECIngestor
|
||||
{
|
||||
public void Import(string SearchPath)
|
||||
{
|
||||
// connect to database
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
// process provided files
|
||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing from " + SearchPath);
|
||||
if (Directory.Exists(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC))
|
||||
{
|
||||
string[] tosecPathContents = Directory.GetFiles(SearchPath);
|
||||
Array.Sort(tosecPathContents);
|
||||
|
||||
string sql = "";
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
System.Data.DataTable sigDB;
|
||||
|
||||
for (UInt16 i = 0; i < tosecPathContents.Length; ++i)
|
||||
{
|
||||
string tosecXMLFile = tosecPathContents[i];
|
||||
|
||||
// check tosec file md5
|
||||
Common.hashObject hashObject = new Common.hashObject(tosecXMLFile);
|
||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
||||
dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("sourcemd5", hashObject.md5hash);
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
try
|
||||
{
|
||||
Logging.Log(Logging.LogType.Information, "Signature Ingestor - TOSEC", "Importing file: " + tosecXMLFile);
|
||||
|
||||
// start parsing file
|
||||
TosecParser tosecParser = new TosecParser();
|
||||
RomSignatureObject tosecObject = tosecParser.Parse(tosecXMLFile);
|
||||
|
||||
// store in database
|
||||
|
||||
// store source object
|
||||
bool processGames = false;
|
||||
if (tosecObject.SourceMd5 != null)
|
||||
{
|
||||
sql = "SELECT * FROM Signatures_Sources WHERE SourceMD5=@sourcemd5";
|
||||
dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("name", Common.ReturnValueIfNull(tosecObject.Name, ""));
|
||||
dbDict.Add("description", Common.ReturnValueIfNull(tosecObject.Description, ""));
|
||||
dbDict.Add("category", Common.ReturnValueIfNull(tosecObject.Category, ""));
|
||||
dbDict.Add("version", Common.ReturnValueIfNull(tosecObject.Version, ""));
|
||||
dbDict.Add("author", Common.ReturnValueIfNull(tosecObject.Author, ""));
|
||||
dbDict.Add("email", Common.ReturnValueIfNull(tosecObject.Email, ""));
|
||||
dbDict.Add("homepage", Common.ReturnValueIfNull(tosecObject.Homepage, ""));
|
||||
dbDict.Add("uri", Common.ReturnValueIfNull(tosecObject.Url, ""));
|
||||
dbDict.Add("sourcetype", Common.ReturnValueIfNull(tosecObject.SourceType, ""));
|
||||
dbDict.Add("sourcemd5", tosecObject.SourceMd5);
|
||||
dbDict.Add("sourcesha1", tosecObject.SourceSHA1);
|
||||
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
// entry not present, insert it
|
||||
sql = "INSERT INTO Signatures_Sources (Name, Description, Category, Version, Author, Email, Homepage, Url, SourceType, SourceMD5, SourceSHA1) VALUES (@name, @description, @category, @version, @author, @email, @homepage, @uri, @sourcetype, @sourcemd5, @sourcesha1)";
|
||||
|
||||
db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
processGames = true;
|
||||
}
|
||||
|
||||
if (processGames == true)
|
||||
{
|
||||
for (int x = 0; x < tosecObject.Games.Count; ++x)
|
||||
{
|
||||
RomSignatureObject.Game gameObject = tosecObject.Games[x];
|
||||
|
||||
// set up game dictionary
|
||||
dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("name", Common.ReturnValueIfNull(gameObject.Name, ""));
|
||||
dbDict.Add("description", Common.ReturnValueIfNull(gameObject.Description, ""));
|
||||
dbDict.Add("year", Common.ReturnValueIfNull(gameObject.Year, ""));
|
||||
dbDict.Add("publisher", Common.ReturnValueIfNull(gameObject.Publisher, ""));
|
||||
dbDict.Add("demo", (int)gameObject.Demo);
|
||||
dbDict.Add("system", Common.ReturnValueIfNull(gameObject.System, ""));
|
||||
dbDict.Add("platform", Common.ReturnValueIfNull(gameObject.System, ""));
|
||||
dbDict.Add("systemvariant", Common.ReturnValueIfNull(gameObject.SystemVariant, ""));
|
||||
dbDict.Add("video", Common.ReturnValueIfNull(gameObject.Video, ""));
|
||||
dbDict.Add("country", Common.ReturnValueIfNull(gameObject.Country, ""));
|
||||
dbDict.Add("language", Common.ReturnValueIfNull(gameObject.Language, ""));
|
||||
dbDict.Add("copyright", Common.ReturnValueIfNull(gameObject.Copyright, ""));
|
||||
|
||||
// store platform
|
||||
int gameSystem = 0;
|
||||
if (gameObject.System != null)
|
||||
{
|
||||
sql = "SELECT Id FROM Signatures_Platforms WHERE Platform=@platform";
|
||||
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
// entry not present, insert it
|
||||
sql = "INSERT INTO Signatures_Platforms (Platform) VALUES (@platform); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
gameSystem = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
gameSystem = (int)sigDB.Rows[0][0];
|
||||
}
|
||||
}
|
||||
dbDict.Add("systemid", gameSystem);
|
||||
|
||||
// store publisher
|
||||
int gamePublisher = 0;
|
||||
if (gameObject.Publisher != null)
|
||||
{
|
||||
sql = "SELECT * FROM Signatures_Publishers WHERE Publisher=@publisher";
|
||||
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
// entry not present, insert it
|
||||
sql = "INSERT INTO Signatures_Publishers (Publisher) VALUES (@publisher); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
gamePublisher = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
gamePublisher = (int)sigDB.Rows[0][0];
|
||||
}
|
||||
}
|
||||
dbDict.Add("publisherid", gamePublisher);
|
||||
|
||||
// store game
|
||||
int gameId = 0;
|
||||
sql = "SELECT * FROM Signatures_Games WHERE Name=@name AND Year=@year AND Publisherid=@publisher AND Systemid=@systemid AND Country=@country AND Language=@language";
|
||||
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
// entry not present, insert it
|
||||
sql = "INSERT INTO Signatures_Games " +
|
||||
"(Name, Description, Year, PublisherId, Demo, SystemId, SystemVariant, Video, Country, Language, Copyright) VALUES " +
|
||||
"(@name, @description, @year, @publisherid, @demo, @systemid, @systemvariant, @video, @country, @language, @copyright); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
gameId = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
gameId = (int)sigDB.Rows[0][0];
|
||||
}
|
||||
|
||||
// store rom
|
||||
foreach (RomSignatureObject.Game.Rom romObject in gameObject.Roms)
|
||||
{
|
||||
if (romObject.Md5 != null)
|
||||
{
|
||||
int romId = 0;
|
||||
sql = "SELECT * FROM Signatures_Roms WHERE GameId=@gameid AND MD5=@md5";
|
||||
dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("gameid", gameId);
|
||||
dbDict.Add("name", Common.ReturnValueIfNull(romObject.Name, ""));
|
||||
dbDict.Add("size", Common.ReturnValueIfNull(romObject.Size, ""));
|
||||
dbDict.Add("crc", Common.ReturnValueIfNull(romObject.Crc, ""));
|
||||
dbDict.Add("md5", romObject.Md5);
|
||||
dbDict.Add("sha1", Common.ReturnValueIfNull(romObject.Sha1, ""));
|
||||
dbDict.Add("developmentstatus", Common.ReturnValueIfNull(romObject.DevelopmentStatus, ""));
|
||||
|
||||
if (romObject.flags != null)
|
||||
{
|
||||
if (romObject.flags.Count > 0)
|
||||
{
|
||||
dbDict.Add("flags", Newtonsoft.Json.JsonConvert.SerializeObject(romObject.flags));
|
||||
}
|
||||
else
|
||||
{
|
||||
dbDict.Add("flags", "[ ]");
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
dbDict.Add("flags", "[ ]");
|
||||
}
|
||||
dbDict.Add("romtype", (int)romObject.RomType);
|
||||
dbDict.Add("romtypemedia", Common.ReturnValueIfNull(romObject.RomTypeMedia, ""));
|
||||
dbDict.Add("medialabel", Common.ReturnValueIfNull(romObject.MediaLabel, ""));
|
||||
dbDict.Add("metadatasource", Classes.Roms.GameRomItem.SourceType.TOSEC);
|
||||
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
if (sigDB.Rows.Count == 0)
|
||||
{
|
||||
// entry not present, insert it
|
||||
sql = "INSERT INTO Signatures_Roms (GameId, Name, Size, CRC, MD5, SHA1, DevelopmentStatus, Flags, RomType, RomTypeMedia, MediaLabel, MetadataSource) VALUES (@gameid, @name, @size, @crc, @md5, @sha1, @developmentstatus, @flags, @romtype, @romtypemedia, @medialabel, @metadatasource); SELECT CAST(LAST_INSERT_ID() AS SIGNED);";
|
||||
sigDB = db.ExecuteCMD(sql, dbDict);
|
||||
|
||||
|
||||
romId = Convert.ToInt32(sigDB.Rows[0][0]);
|
||||
}
|
||||
else
|
||||
{
|
||||
romId = (int)sigDB.Rows[0][0];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Signature Ingestor - TOSEC", "Invalid import file: " + tosecXMLFile, ex);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
Logging.Log(Logging.LogType.Debug, "Signature Ingestor - TOSEC", "Rejecting already imported file: " + tosecXMLFile);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
41
gaseous-server/Controllers/BackgroundTasksController.cs
Normal file
@@ -0,0 +1,41 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/v1/[controller]")]
|
||||
public class BackgroundTasksController : Controller
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public List<ProcessQueue.QueueItem> GetQueue()
|
||||
{
|
||||
return ProcessQueue.QueueItems;
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{TaskType}")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult<ProcessQueue.QueueItem> ForceRun(ProcessQueue.QueueItemType TaskType, Boolean ForceRun)
|
||||
{
|
||||
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems)
|
||||
{
|
||||
if (TaskType == qi.ItemType)
|
||||
{
|
||||
if (ForceRun == true)
|
||||
{
|
||||
qi.ForceExecute();
|
||||
}
|
||||
return qi;
|
||||
}
|
||||
}
|
||||
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
51
gaseous-server/Controllers/FilterController.cs
Normal file
@@ -0,0 +1,51 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_tools;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[Route("api/v1/[controller]")]
|
||||
[ApiController]
|
||||
public class FilterController : ControllerBase
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
//[ResponseCache(CacheProfileName = "5Minute")]
|
||||
public Dictionary<string, object> Filter()
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
Dictionary<string, object> FilterSet = new Dictionary<string, object>();
|
||||
|
||||
// platforms
|
||||
List<Platform> platforms = new List<Platform>();
|
||||
string sql = "SELECT Platform.Id, Platform.Abbreviation, Platform.AlternativeName, Platform.`Name`, Platform.PlatformLogo, (SELECT COUNT(Games_Roms.Id) AS RomCount FROM Games_Roms WHERE Games_Roms.PlatformId = Platform.Id) AS RomCount FROM Platform HAVING RomCount > 0 ORDER BY `Name`";
|
||||
DataTable dbResponse = db.ExecuteCMD(sql);
|
||||
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
{
|
||||
platforms.Add(Classes.Metadata.Platforms.GetPlatform((long)dr["id"]));
|
||||
}
|
||||
FilterSet.Add("platforms", platforms);
|
||||
|
||||
// genres
|
||||
List<Genre> genres = new List<Genre>();
|
||||
sql = "SELECT DISTINCT t1.Id, t1.`Name` FROM Genre AS t1 JOIN (SELECT * FROM Game WHERE (SELECT COUNT(Id) FROM Games_Roms WHERE GameId = Game.Id) > 0) AS t2 ON JSON_CONTAINS(t2.Genres, CAST(t1.Id AS char), '$') ORDER BY t1.`Name`";
|
||||
dbResponse = db.ExecuteCMD(sql);
|
||||
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
{
|
||||
genres.Add(Classes.Metadata.Genres.GetGenres((long)dr["id"]));
|
||||
}
|
||||
FilterSet.Add("genres", genres);
|
||||
|
||||
return FilterSet;
|
||||
}
|
||||
}
|
||||
}
|
966
gaseous-server/Controllers/GamesController.cs
Normal file
@@ -0,0 +1,966 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_tools;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.CodeAnalysis.Scripting;
|
||||
using Org.BouncyCastle.Asn1.X509;
|
||||
using static gaseous_server.Classes.Metadata.AgeRatings;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[Route("api/v1/[controller]")]
|
||||
[ApiController]
|
||||
public class GamesController : ControllerBase
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
|
||||
public ActionResult Game(string name = "", string platform = "", string genre = "", bool sortdescending = false)
|
||||
{
|
||||
string whereClause = "";
|
||||
string havingClause = "";
|
||||
Dictionary<string, object> whereParams = new Dictionary<string, object>();
|
||||
|
||||
List<string> whereClauses = new List<string>();
|
||||
List<string> havingClauses = new List<string>();
|
||||
|
||||
string tempVal = "";
|
||||
|
||||
if (name.Length > 0)
|
||||
{
|
||||
tempVal = "`Name` LIKE @Name";
|
||||
whereParams.Add("@Name", "%" + name + "%");
|
||||
havingClauses.Add(tempVal);
|
||||
}
|
||||
|
||||
if (platform.Length > 0)
|
||||
{
|
||||
tempVal = "Games_Roms.PlatformId IN (";
|
||||
string[] platformClauseItems = platform.Split(",");
|
||||
for (int i = 0; i < platformClauseItems.Length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
tempVal += ", ";
|
||||
}
|
||||
string platformLabel = "@Platform" + i;
|
||||
tempVal += platformLabel;
|
||||
whereParams.Add(platformLabel, platformClauseItems[i]);
|
||||
}
|
||||
tempVal += ")";
|
||||
whereClauses.Add(tempVal);
|
||||
}
|
||||
|
||||
if (genre.Length > 0)
|
||||
{
|
||||
tempVal = "(";
|
||||
string[] genreClauseItems = genre.Split(",");
|
||||
for (int i = 0; i < genreClauseItems.Length; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
tempVal += " AND ";
|
||||
}
|
||||
string genreLabel = "@Genre" + i;
|
||||
tempVal += "JSON_CONTAINS(Game.Genres, " + genreLabel + ", '$')";
|
||||
whereParams.Add(genreLabel, genreClauseItems[i]);
|
||||
}
|
||||
tempVal += ")";
|
||||
whereClauses.Add(tempVal);
|
||||
}
|
||||
|
||||
// build where clause
|
||||
if (whereClauses.Count > 0)
|
||||
{
|
||||
whereClause = "WHERE ";
|
||||
for (int i = 0; i < whereClauses.Count; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
whereClause += " AND ";
|
||||
}
|
||||
whereClause += whereClauses[i];
|
||||
}
|
||||
}
|
||||
|
||||
// build having clause
|
||||
if (havingClauses.Count > 0)
|
||||
{
|
||||
havingClause = "HAVING ";
|
||||
for (int i = 0; i < havingClauses.Count; i++)
|
||||
{
|
||||
if (i > 0)
|
||||
{
|
||||
havingClause += " AND ";
|
||||
}
|
||||
havingClause += havingClauses[i];
|
||||
}
|
||||
}
|
||||
|
||||
// order by clause
|
||||
string orderByClause = "ORDER BY `Name` ASC";
|
||||
if (sortdescending == true)
|
||||
{
|
||||
orderByClause = "ORDER BY `Name` DESC";
|
||||
}
|
||||
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT DISTINCT Games_Roms.GameId AS ROMGameId, Game.Id, Game.AgeRatings, Game.AggregatedRating, Game.AggregatedRatingCount, Game.AlternativeNames, Game.Artworks, Game.Bundles, Game.Category, Game.Collection, Game.Cover, Game.Dlcs, Game.Expansions, Game.ExternalGames, Game.FirstReleaseDate, Game.`Follows`, Game.Franchise, Game.Franchises, Game.GameEngines, Game.GameModes, Game.Genres, Game.Hypes, Game.InvolvedCompanies, Game.Keywords, Game.MultiplayerModes, Game.`Name`, Game.ParentGame, Game.Platforms, Game.PlayerPerspectives, Game.Rating, Game.RatingCount, Game.ReleaseDates, Game.Screenshots, Game.SimilarGames, Game.Slug, Game.StandaloneExpansions, Game.`Status`, Game.StoryLine, Game.Summary, Game.Tags, Game.Themes, Game.TotalRating, Game.TotalRatingCount, Game.VersionParent, Game.VersionTitle, Game.Videos, Game.Websites FROM gaseous.Games_Roms LEFT JOIN Game ON Game.Id = Games_Roms.GameId " + whereClause + " " + havingClause + " " + orderByClause;
|
||||
|
||||
List<IGDB.Models.Game> RetVal = new List<IGDB.Models.Game>();
|
||||
|
||||
DataTable dbResponse = db.ExecuteCMD(sql, whereParams);
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
{
|
||||
//RetVal.Add(Classes.Metadata.Games.GetGame((long)dr["ROMGameId"], false, false));
|
||||
RetVal.Add(Classes.Metadata.Games.GetGame(dr));
|
||||
}
|
||||
|
||||
return Ok(RetVal);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}")]
|
||||
[ProducesResponseType(typeof(Game), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "5Minute")]
|
||||
public ActionResult Game(long GameId, bool forceRefresh = false)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, forceRefresh);
|
||||
|
||||
if (gameObject != null)
|
||||
{
|
||||
return Ok(gameObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/alternativename")]
|
||||
[ProducesResponseType(typeof(List<AlternativeName>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameAlternativeNames(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
if (gameObject.AlternativeNames != null)
|
||||
{
|
||||
List<AlternativeName> altNames = new List<AlternativeName>();
|
||||
foreach (long altNameId in gameObject.AlternativeNames.Ids)
|
||||
{
|
||||
altNames.Add(AlternativeNames.GetAlternativeNames(altNameId));
|
||||
}
|
||||
return Ok(altNames);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/agerating")]
|
||||
[ProducesResponseType(typeof(List<AgeRatings.GameAgeRating>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameAgeClassification(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
if (gameObject.AgeRatings != null)
|
||||
{
|
||||
List<AgeRatings.GameAgeRating> ageRatings = new List<AgeRatings.GameAgeRating>();
|
||||
foreach (long ageRatingId in gameObject.AgeRatings.Ids)
|
||||
{
|
||||
ageRatings.Add(AgeRatings.GetConsolidatedAgeRating(ageRatingId));
|
||||
}
|
||||
return Ok(ageRatings);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/agerating/{RatingId}/image")]
|
||||
[ProducesResponseType(typeof(FileContentResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameAgeClassification(long GameId, long RatingId)
|
||||
{
|
||||
try
|
||||
{
|
||||
GameAgeRating gameAgeRating = GetConsolidatedAgeRating(RatingId);
|
||||
|
||||
string fileExtension = "";
|
||||
string fileType = "";
|
||||
switch (gameAgeRating.RatingBoard)
|
||||
{
|
||||
case AgeRatingCategory.ESRB:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.PEGI:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.ACB:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.CERO:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.USK:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.GRAC:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
case AgeRatingCategory.CLASS_IND:
|
||||
fileExtension = "svg";
|
||||
fileType = "image/svg+xml";
|
||||
break;
|
||||
}
|
||||
|
||||
string resourceName = "gaseous_server.Assets.Ratings." + gameAgeRating.RatingBoard.ToString() + "." + gameAgeRating.RatingTitle.ToString() + "." + fileExtension;
|
||||
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
string[] resources = assembly.GetManifestResourceNames();
|
||||
if (resources.Contains(resourceName))
|
||||
{
|
||||
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
byte[] filedata = new byte[stream.Length];
|
||||
stream.Read(filedata, 0, filedata.Length);
|
||||
|
||||
string filename = gameAgeRating.RatingBoard.ToString() + "-" + gameAgeRating.RatingTitle.ToString() + "." + fileExtension;
|
||||
string contentType = fileType;
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
}
|
||||
return NotFound();
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/artwork")]
|
||||
[ProducesResponseType(typeof(List<Artwork>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameArtwork(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
List<Artwork> artworks = new List<Artwork>();
|
||||
if (gameObject.Artworks != null)
|
||||
{
|
||||
foreach (long ArtworkId in gameObject.Artworks.Ids)
|
||||
{
|
||||
Artwork GameArtwork = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
artworks.Add(GameArtwork);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(artworks);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/artwork/{ArtworkId}")]
|
||||
[ProducesResponseType(typeof(Artwork), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameArtwork(long GameId, long ArtworkId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
try
|
||||
{
|
||||
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
if (artworkObject != null)
|
||||
{
|
||||
return Ok(artworkObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/artwork/{ArtworkId}/image")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameCoverImage(long GameId, long ArtworkId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
try
|
||||
{
|
||||
IGDB.Models.Artwork artworkObject = Artworks.GetArtwork(ArtworkId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
if (artworkObject != null) {
|
||||
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Artwork", artworkObject.ImageId + ".png");
|
||||
if (System.IO.File.Exists(coverFilePath))
|
||||
{
|
||||
string filename = artworkObject.ImageId + ".png";
|
||||
string filepath = coverFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "image/png";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/cover")]
|
||||
[ProducesResponseType(typeof(Cover), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameCover(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
if (gameObject != null)
|
||||
{
|
||||
IGDB.Models.Cover coverObject = Covers.GetCover(gameObject.Cover.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
if (coverObject != null)
|
||||
{
|
||||
return Ok(coverObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/cover/image")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameCoverImage(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Cover.png");
|
||||
if (System.IO.File.Exists(coverFilePath)) {
|
||||
string filename = "Cover.png";
|
||||
string filepath = coverFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "image/png";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/genre")]
|
||||
[ProducesResponseType(typeof(List<Genre>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameGenre(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
if (gameObject != null)
|
||||
{
|
||||
List<IGDB.Models.Genre> genreObjects = new List<Genre>();
|
||||
if (gameObject.Genres != null)
|
||||
{
|
||||
foreach (long genreId in gameObject.Genres.Ids)
|
||||
{
|
||||
genreObjects.Add(Classes.Metadata.Genres.GetGenres(genreId));
|
||||
}
|
||||
}
|
||||
|
||||
List<IGDB.Models.Genre> sortedGenreObjects = genreObjects.OrderBy(o => o.Name).ToList();
|
||||
|
||||
return Ok(sortedGenreObjects);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/companies")]
|
||||
[ProducesResponseType(typeof(List<Dictionary<string, object>>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameInvolvedCompanies(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
if (gameObject != null)
|
||||
{
|
||||
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
|
||||
if (gameObject.InvolvedCompanies != null)
|
||||
{
|
||||
foreach (long icId in gameObject.InvolvedCompanies.Ids)
|
||||
{
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(icId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
company.Developed = null;
|
||||
company.Published = null;
|
||||
|
||||
Dictionary<string, object> companyData = new Dictionary<string, object>();
|
||||
companyData.Add("involvement", involvedCompany);
|
||||
companyData.Add("company", company);
|
||||
|
||||
icObjects.Add(companyData);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(icObjects);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/companies/{CompanyId}")]
|
||||
[ProducesResponseType(typeof(Dictionary<string, object>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameInvolvedCompanies(long GameId, long CompanyId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
if (gameObject != null)
|
||||
{
|
||||
List<Dictionary<string, object>> icObjects = new List<Dictionary<string, object>>();
|
||||
if (gameObject.InvolvedCompanies != null)
|
||||
{
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
company.Developed = null;
|
||||
company.Published = null;
|
||||
|
||||
Dictionary<string, object> companyData = new Dictionary<string, object>();
|
||||
companyData.Add("involvement", involvedCompany);
|
||||
companyData.Add("company", company);
|
||||
|
||||
return Ok(companyData);
|
||||
} else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/companies/{CompanyId}/image")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameCompanyImage(long GameId, long CompanyId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
InvolvedCompany involvedCompany = Classes.Metadata.InvolvedCompanies.GetInvolvedCompanies(CompanyId);
|
||||
Company company = Classes.Metadata.Companies.GetCompanies(involvedCompany.Company.Id);
|
||||
|
||||
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Company(company), "Logo_Medium.png");
|
||||
if (System.IO.File.Exists(coverFilePath))
|
||||
{
|
||||
string filename = "Logo.png";
|
||||
string filepath = coverFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "image/png";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/roms")]
|
||||
[ProducesResponseType(typeof(List<Classes.Roms.GameRomItem>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
//[ResponseCache(CacheProfileName = "5Minute")]
|
||||
public ActionResult GameRom(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
List<Classes.Roms.GameRomItem> roms = Classes.Roms.GetRoms(GameId);
|
||||
|
||||
return Ok(roms);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/roms/{RomId}")]
|
||||
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
//[ResponseCache(CacheProfileName = "5Minute")]
|
||||
public ActionResult GameRom(long GameId, long RomId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
{
|
||||
return Ok(rom);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpPatch]
|
||||
[Route("{GameId}/roms/{RomId}")]
|
||||
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameRomRename(long GameId, long RomId, long NewPlatformId, long NewGameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
{
|
||||
rom = Classes.Roms.UpdateRom(RomId, NewPlatformId, NewGameId);
|
||||
return Ok(rom);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpDelete]
|
||||
[Route("{GameId}/roms/{RomId}")]
|
||||
[ProducesResponseType(typeof(Classes.Roms.GameRomItem), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameRomDelete(long GameId, long RomId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId == GameId)
|
||||
{
|
||||
Classes.Roms.DeleteRom(RomId);
|
||||
return Ok(rom);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/roms/{RomId}/file")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameRomFile(long GameId, long RomId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
Classes.Roms.GameRomItem rom = Classes.Roms.GetRom(RomId);
|
||||
if (rom.GameId != GameId)
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
|
||||
string romFilePath = rom.Path;
|
||||
if (System.IO.File.Exists(romFilePath))
|
||||
{
|
||||
string filename = Path.GetFileName(romFilePath);
|
||||
string filepath = romFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "application/octet-stream";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = false,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("search")]
|
||||
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameSearch(long RomId = 0, string SearchString = "")
|
||||
{
|
||||
try
|
||||
{
|
||||
if (RomId > 0)
|
||||
{
|
||||
Classes.Roms.GameRomItem romItem = Classes.Roms.GetRom(RomId);
|
||||
Common.hashObject hash = new Common.hashObject(romItem.Path);
|
||||
Models.Signatures_Games romSig = Classes.ImportGame.GetFileSignature(hash, new FileInfo(romItem.Path), romItem.Path);
|
||||
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(romSig.Game.Name, romSig.Flags.IGDBPlatformId);
|
||||
|
||||
return Ok(searchResults);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (SearchString.Length > 0)
|
||||
{
|
||||
List<Game> searchResults = Classes.ImportGame.SearchForGame_GetAll(SearchString, 0);
|
||||
|
||||
return Ok(searchResults);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/screenshots")]
|
||||
[ProducesResponseType(typeof(List<Screenshot>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameScreenshot(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
List<Screenshot> screenshots = new List<Screenshot>();
|
||||
if (gameObject.Screenshots != null)
|
||||
{
|
||||
foreach (long ScreenshotId in gameObject.Screenshots.Ids)
|
||||
{
|
||||
Screenshot GameScreenshot = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
screenshots.Add(GameScreenshot);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(screenshots);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/screenshots/{ScreenshotId}")]
|
||||
[ProducesResponseType(typeof(Screenshot), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameScreenshot(long GameId, long ScreenshotId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
if (gameObject != null) {
|
||||
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
if (screenshotObject != null)
|
||||
{
|
||||
return Ok(screenshotObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/screenshots/{ScreenshotId}/image")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult GameScreenshotImage(long GameId, long ScreenshotId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
IGDB.Models.Screenshot screenshotObject = Screenshots.GetScreenshot(ScreenshotId, Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject));
|
||||
|
||||
string coverFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Game(gameObject), "Screenshots", screenshotObject.ImageId + ".png");
|
||||
if (System.IO.File.Exists(coverFilePath))
|
||||
{
|
||||
string filename = screenshotObject.ImageId + ".png";
|
||||
string filepath = coverFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "image/png";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
Response.Headers.Add("Cache-Control", "public, max-age=604800");
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{GameId}/videos")]
|
||||
[ProducesResponseType(typeof(List<GameVideo>), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
[ResponseCache(CacheProfileName = "7Days")]
|
||||
public ActionResult GameVideo(long GameId)
|
||||
{
|
||||
try
|
||||
{
|
||||
Game gameObject = Classes.Metadata.Games.GetGame(GameId, false, false);
|
||||
|
||||
List<GameVideo> videos = new List<GameVideo>();
|
||||
if (gameObject.Videos != null)
|
||||
{
|
||||
foreach (long VideoId in gameObject.Videos.Ids)
|
||||
{
|
||||
GameVideo gameVideo = GamesVideos.GetGame_Videos(VideoId);
|
||||
videos.Add(gameVideo);
|
||||
}
|
||||
}
|
||||
|
||||
return Ok(videos);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
137
gaseous-server/Controllers/PlatformsController.cs
Normal file
@@ -0,0 +1,137 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_server.Classes.Metadata;
|
||||
using gaseous_tools;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.CodeAnalysis.Scripting;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[Route("api/v1/[controller]")]
|
||||
[ApiController]
|
||||
public class PlatformsController : Controller
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(typeof(List<Platform>), StatusCodes.Status200OK)]
|
||||
public ActionResult Platform()
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
string sql = "SELECT * FROM gaseous.Platform WHERE Id IN (SELECT DISTINCT PlatformId FROM Games_Roms) ORDER BY `Name` ASC;";
|
||||
|
||||
List<Platform> RetVal = new List<Platform>();
|
||||
|
||||
DataTable dbResponse = db.ExecuteCMD(sql);
|
||||
foreach (DataRow dr in dbResponse.Rows)
|
||||
{
|
||||
RetVal.Add(Classes.Metadata.Platforms.GetPlatform((long)dr["id"]));
|
||||
}
|
||||
|
||||
return Ok(RetVal);
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{PlatformId}")]
|
||||
[ProducesResponseType(typeof(Platform), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult Platform(long PlatformId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
if (platformObject != null)
|
||||
{
|
||||
return Ok(platformObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{PlatformId}/platformlogo")]
|
||||
[ProducesResponseType(typeof(PlatformLogo), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult PlatformLogo(long PlatformId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
if (platformObject != null)
|
||||
{
|
||||
IGDB.Models.PlatformLogo logoObject = PlatformLogos.GetPlatformLogo(platformObject.PlatformLogo.Id, Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject));
|
||||
if (logoObject != null)
|
||||
{
|
||||
return Ok(logoObject);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("{PlatformId}/platformlogo/image")]
|
||||
[ProducesResponseType(typeof(FileStreamResult), StatusCodes.Status200OK)]
|
||||
[ProducesResponseType(StatusCodes.Status404NotFound)]
|
||||
public ActionResult PlatformLogoImage(long PlatformId)
|
||||
{
|
||||
try
|
||||
{
|
||||
IGDB.Models.Platform platformObject = Classes.Metadata.Platforms.GetPlatform(PlatformId);
|
||||
|
||||
string logoFilePath = Path.Combine(Config.LibraryConfiguration.LibraryMetadataDirectory_Platform(platformObject), "Logo_Medium.png");
|
||||
if (System.IO.File.Exists(logoFilePath))
|
||||
{
|
||||
string filename = "Logo.png";
|
||||
string filepath = logoFilePath;
|
||||
byte[] filedata = System.IO.File.ReadAllBytes(filepath);
|
||||
string contentType = "image/png";
|
||||
|
||||
var cd = new System.Net.Mime.ContentDisposition
|
||||
{
|
||||
FileName = filename,
|
||||
Inline = true,
|
||||
};
|
||||
|
||||
Response.Headers.Add("Content-Disposition", cd.ToString());
|
||||
|
||||
return File(filedata, contentType);
|
||||
}
|
||||
else
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
catch
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
68
gaseous-server/Controllers/SearchController.cs
Normal file
@@ -0,0 +1,68 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_tools;
|
||||
using IGDB;
|
||||
using IGDB.Models;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using static gaseous_server.Classes.Metadata.Games;
|
||||
using static gaseous_tools.Config.ConfigFile;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/v1/[controller]")]
|
||||
public class SearchController : Controller
|
||||
{
|
||||
private static IGDBClient igdb = new IGDBClient(
|
||||
// Found in Twitch Developer portal for your app
|
||||
Config.IGDB.ClientId,
|
||||
Config.IGDB.Secret
|
||||
);
|
||||
|
||||
[HttpGet]
|
||||
[Route("Platform")]
|
||||
[ProducesResponseType(typeof(List<Platform>), StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult> SearchPlatform(string SearchString)
|
||||
{
|
||||
List<Platform> RetVal = await _SearchForPlatform(SearchString);
|
||||
return Ok(RetVal);
|
||||
}
|
||||
|
||||
private static async Task<List<Platform>> _SearchForPlatform(string SearchString)
|
||||
{
|
||||
string searchBody = "";
|
||||
searchBody += "fields abbreviation,alternative_name,category,checksum,created_at,generation,name,platform_family,platform_logo,slug,summary,updated_at,url,versions,websites; ";
|
||||
searchBody += "where name ~ *\"" + SearchString + "\"*;";
|
||||
|
||||
// get Platform metadata
|
||||
var results = await igdb.QueryAsync<Platform>(IGDBClient.Endpoints.Platforms, query: searchBody);
|
||||
|
||||
return results.ToList();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("Game")]
|
||||
[ProducesResponseType(typeof(List<Game>), StatusCodes.Status200OK)]
|
||||
public async Task<ActionResult> SearchGame(long PlatformId, string SearchString)
|
||||
{
|
||||
List<Game> RetVal = await _SearchForGame(PlatformId, SearchString);
|
||||
return Ok(RetVal);
|
||||
}
|
||||
|
||||
private static async Task<List<Game>> _SearchForGame(long PlatformId, string SearchString)
|
||||
{
|
||||
string searchBody = "";
|
||||
searchBody += "fields cover.*,first_release_date,name,platforms,slug; ";
|
||||
searchBody += "search \"" + SearchString + "\";";
|
||||
searchBody += "where platforms = (" + PlatformId + ");";
|
||||
|
||||
// get Platform metadata
|
||||
var results = await igdb.QueryAsync<Game>(IGDBClient.Endpoints.Games, query: searchBody);
|
||||
|
||||
return results.ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Mvc;
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/[controller]/[action]")]
|
||||
[Route("api/v1/[controller]/[action]")]
|
||||
public class SignaturesController : ControllerBase
|
||||
{
|
||||
/// <summary>
|
||||
@@ -20,28 +20,42 @@ namespace gaseous_server.Controllers
|
||||
/// </summary>
|
||||
/// <returns>Number of sources, publishers, games, and rom signatures in the database</returns>
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public Models.Signatures_Status Status()
|
||||
{
|
||||
return new Models.Signatures_Status();
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[Route("api/[controller]/[action]")]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public List<Models.Signatures_Games> GetSignature(string md5 = "", string sha1 = "")
|
||||
{
|
||||
if (md5.Length > 0)
|
||||
{
|
||||
return _GetSignature("signatures_roms.md5 = @searchstring", md5);
|
||||
return _GetSignature("Signatures_Roms.md5 = @searchstring", md5);
|
||||
} else
|
||||
{
|
||||
return _GetSignature("signatures_roms.sha1 = @searchstring", sha1);
|
||||
return _GetSignature("Signatures_Roms.sha1 = @searchstring", sha1);
|
||||
}
|
||||
}
|
||||
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public List<Models.Signatures_Games> GetByTosecName(string TosecName = "")
|
||||
{
|
||||
if (TosecName.Length > 0)
|
||||
{
|
||||
return _GetSignature("Signatures_Roms.name = @searchstring", TosecName);
|
||||
} else
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
private List<Models.Signatures_Games> _GetSignature(string sqlWhere, string searchString)
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "SELECT \n view_signatures_games.*,\n signatures_roms.id AS romid,\n signatures_roms.name AS romname,\n signatures_roms.size,\n signatures_roms.crc,\n signatures_roms.md5,\n signatures_roms.sha1,\n signatures_roms.developmentstatus,\n signatures_roms.flags,\n signatures_roms.romtype,\n signatures_roms.romtypemedia,\n signatures_roms.medialabel\nFROM\n signatures_roms\n INNER JOIN\n view_signatures_games ON signatures_roms.gameid = view_signatures_games.id WHERE " + sqlWhere;
|
||||
string sql = "SELECT view_Signatures_Games.*, Signatures_Roms.Id AS romid, Signatures_Roms.Name AS romname, Signatures_Roms.Size, Signatures_Roms.CRC, Signatures_Roms.MD5, Signatures_Roms.SHA1, Signatures_Roms.DevelopmentStatus, Signatures_Roms.Flags, Signatures_Roms.RomType, Signatures_Roms.RomTypeMedia, Signatures_Roms.MediaLabel, Signatures_Roms.MetadataSource FROM Signatures_Roms INNER JOIN view_Signatures_Games ON Signatures_Roms.GameId = view_Signatures_Games.Id WHERE " + sqlWhere;
|
||||
Dictionary<string, object> dbDict = new Dictionary<string, object>();
|
||||
dbDict.Add("searchString", searchString);
|
||||
|
||||
@@ -55,32 +69,33 @@ namespace gaseous_server.Controllers
|
||||
{
|
||||
Game = new Models.Signatures_Games.GameItem
|
||||
{
|
||||
Id = (Int32)sigDbRow["id"],
|
||||
Name = (string)sigDbRow["name"],
|
||||
Description = (string)sigDbRow["description"],
|
||||
Year = (string)sigDbRow["year"],
|
||||
Publisher = (string)sigDbRow["publisher"],
|
||||
Demo = (Models.Signatures_Games.GameItem.DemoTypes)(int)sigDbRow["demo"],
|
||||
System = (string)sigDbRow["platform"],
|
||||
SystemVariant = (string)sigDbRow["systemvariant"],
|
||||
Video = (string)sigDbRow["video"],
|
||||
Country = (string)sigDbRow["country"],
|
||||
Language = (string)sigDbRow["language"],
|
||||
Copyright = (string)sigDbRow["copyright"]
|
||||
Id = (Int32)sigDbRow["Id"],
|
||||
Name = (string)sigDbRow["Name"],
|
||||
Description = (string)sigDbRow["Description"],
|
||||
Year = (string)sigDbRow["Year"],
|
||||
Publisher = (string)sigDbRow["Publisher"],
|
||||
Demo = (Models.Signatures_Games.GameItem.DemoTypes)(int)sigDbRow["Demo"],
|
||||
System = (string)sigDbRow["Platform"],
|
||||
SystemVariant = (string)sigDbRow["SystemVariant"],
|
||||
Video = (string)sigDbRow["Video"],
|
||||
Country = (string)sigDbRow["Country"],
|
||||
Language = (string)sigDbRow["Language"],
|
||||
Copyright = (string)sigDbRow["Copyright"]
|
||||
},
|
||||
Rom = new Models.Signatures_Games.RomItem
|
||||
{
|
||||
Id = (Int32)sigDbRow["romid"],
|
||||
Name = (string)sigDbRow["romname"],
|
||||
Size = (Int64)sigDbRow["size"],
|
||||
Crc = (string)sigDbRow["crc"],
|
||||
Md5 = (string)sigDbRow["md5"],
|
||||
Sha1 = (string)sigDbRow["sha1"],
|
||||
DevelopmentStatus = (string)sigDbRow["developmentstatus"],
|
||||
flags = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>((string)sigDbRow["flags"]),
|
||||
RomType = (Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["romtype"],
|
||||
RomTypeMedia = (string)sigDbRow["romtypemedia"],
|
||||
MediaLabel = (string)sigDbRow["medialabel"]
|
||||
Size = (Int64)sigDbRow["Size"],
|
||||
Crc = (string)sigDbRow["CRC"],
|
||||
Md5 = (string)sigDbRow["MD5"],
|
||||
Sha1 = (string)sigDbRow["SHA1"],
|
||||
DevelopmentStatus = (string)sigDbRow["DevelopmentStatus"],
|
||||
flags = Newtonsoft.Json.JsonConvert.DeserializeObject<List<string>>((string)sigDbRow["Flags"]),
|
||||
RomType = (Models.Signatures_Games.RomItem.RomTypes)(int)sigDbRow["RomType"],
|
||||
RomTypeMedia = (string)sigDbRow["RomTypeMedia"],
|
||||
MediaLabel = (string)sigDbRow["MediaLabel"],
|
||||
SignatureSource = (Models.Signatures_Games.RomItem.SignatureSourceType)(Int32)sigDbRow["MetadataSource"]
|
||||
}
|
||||
};
|
||||
GamesList.Add(gameItem);
|
||||
|
48
gaseous-server/Controllers/SystemController.cs
Normal file
@@ -0,0 +1,48 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Data;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using gaseous_tools;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
namespace gaseous_server.Controllers
|
||||
{
|
||||
[ApiController]
|
||||
[Route("api/v1/[controller]")]
|
||||
public class SystemController : Controller
|
||||
{
|
||||
[HttpGet]
|
||||
[ProducesResponseType(StatusCodes.Status200OK)]
|
||||
public Dictionary<string, object> GetSystemStatus()
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
|
||||
Dictionary<string, object> ReturnValue = new Dictionary<string, object>();
|
||||
|
||||
// disk size
|
||||
List<Dictionary<string, object>> Disks = new List<Dictionary<string, object>>();
|
||||
//Disks.Add(GetDisk(gaseous_tools.Config.ConfigurationPath));
|
||||
Disks.Add(GetDisk(gaseous_tools.Config.LibraryConfiguration.LibraryRootDirectory));
|
||||
ReturnValue.Add("Paths", Disks);
|
||||
|
||||
// database size
|
||||
string sql = "SELECT table_schema, SUM(data_length + index_length) FROM information_schema.tables WHERE table_schema = '" + Config.DatabaseConfiguration.DatabaseName + "'";
|
||||
DataTable dbResponse = db.ExecuteCMD(sql);
|
||||
ReturnValue.Add("DatabaseSize", dbResponse.Rows[0][1]);
|
||||
|
||||
return ReturnValue;
|
||||
}
|
||||
|
||||
private Dictionary<string, object> GetDisk(string Path)
|
||||
{
|
||||
Dictionary<string, object> DiskValues = new Dictionary<string, object>();
|
||||
DiskValues.Add("LibraryPath", Path);
|
||||
DiskValues.Add("SpaceUsed", gaseous_tools.Common.DirSize(new DirectoryInfo(Path)));
|
||||
DiskValues.Add("SpaceAvailable", new DriveInfo(Path).AvailableFreeSpace);
|
||||
DiskValues.Add("TotalSpace", new DriveInfo(Path).TotalSize);
|
||||
|
||||
return DiskValues;
|
||||
}
|
||||
}
|
||||
}
|
84
gaseous-server/Models/PlatformMapping.cs
Normal file
@@ -0,0 +1,84 @@
|
||||
using System;
|
||||
using System.Reflection;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
{
|
||||
public class PlatformMapping
|
||||
{
|
||||
public PlatformMapping()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
private static List<PlatformMapItem> _PlatformMaps = new List<PlatformMapItem>();
|
||||
public static List<PlatformMapItem> PlatformMap
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_PlatformMaps.Count == 0)
|
||||
{
|
||||
// load platform maps from: gaseous_server.Support.PlatformMap.json
|
||||
var assembly = Assembly.GetExecutingAssembly();
|
||||
var resourceName = "gaseous_server.Support.PlatformMap.json";
|
||||
using (Stream stream = assembly.GetManifestResourceStream(resourceName))
|
||||
using (StreamReader reader = new StreamReader(stream))
|
||||
{
|
||||
string rawJson = reader.ReadToEnd();
|
||||
_PlatformMaps.Clear();
|
||||
_PlatformMaps = Newtonsoft.Json.JsonConvert.DeserializeObject<List<PlatformMapItem>>(rawJson);
|
||||
}
|
||||
}
|
||||
|
||||
return _PlatformMaps;
|
||||
}
|
||||
}
|
||||
|
||||
public static void GetIGDBPlatformMapping(ref Models.Signatures_Games Signature, FileInfo RomFileInfo, bool SetSystemName)
|
||||
{
|
||||
bool PlatformFound = false;
|
||||
foreach (Models.PlatformMapping.PlatformMapItem PlatformMapping in Models.PlatformMapping.PlatformMap)
|
||||
{
|
||||
if (PlatformMapping.KnownFileExtensions.Contains(RomFileInfo.Extension, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
if (SetSystemName == true)
|
||||
{
|
||||
if (Signature.Game != null) { Signature.Game.System = PlatformMapping.IGDBName; }
|
||||
}
|
||||
Signature.Flags.IGDBPlatformId = PlatformMapping.IGDBId;
|
||||
Signature.Flags.IGDBPlatformName = PlatformMapping.IGDBName;
|
||||
|
||||
PlatformFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (PlatformFound == false)
|
||||
{
|
||||
foreach (Models.PlatformMapping.PlatformMapItem PlatformMapping in Models.PlatformMapping.PlatformMap)
|
||||
{
|
||||
if (PlatformMapping.AlternateNames.Contains(Signature.Game.System, StringComparer.OrdinalIgnoreCase))
|
||||
{
|
||||
if (SetSystemName == true)
|
||||
{
|
||||
if (Signature.Game != null) { Signature.Game.System = PlatformMapping.IGDBName; }
|
||||
}
|
||||
Signature.Flags.IGDBPlatformId = PlatformMapping.IGDBId;
|
||||
Signature.Flags.IGDBPlatformName = PlatformMapping.IGDBName;
|
||||
|
||||
PlatformFound = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class PlatformMapItem
|
||||
{
|
||||
public int IGDBId { get; set; }
|
||||
public string IGDBName { get; set; }
|
||||
public List<string> AlternateNames { get; set; } = new List<string>();
|
||||
public List<string> KnownFileExtensions { get; set; } = new List<string>();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,4 +1,5 @@
|
||||
using System;
|
||||
using System.Text.Json.Serialization;
|
||||
using static gaseous_romsignatureobject.RomSignatureObject.Game;
|
||||
|
||||
namespace gaseous_server.Models
|
||||
@@ -12,6 +13,29 @@ namespace gaseous_server.Models
|
||||
public GameItem? Game { get; set; }
|
||||
public RomItem? Rom { get; set; }
|
||||
|
||||
//[JsonIgnore]
|
||||
public int Score
|
||||
{
|
||||
get
|
||||
{
|
||||
int _score = 0;
|
||||
|
||||
if (Game != null)
|
||||
{
|
||||
_score = _score + Game.Score;
|
||||
}
|
||||
|
||||
if (Rom != null)
|
||||
{
|
||||
_score = _score + Rom.Score;
|
||||
}
|
||||
|
||||
return _score;
|
||||
}
|
||||
}
|
||||
|
||||
public SignatureFlags Flags = new SignatureFlags();
|
||||
|
||||
public class GameItem
|
||||
{
|
||||
public Int32? Id { get; set; }
|
||||
@@ -36,6 +60,60 @@ namespace gaseous_server.Models
|
||||
demo_rolling = 4,
|
||||
demo_slideshow = 5
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public int Score
|
||||
{
|
||||
get
|
||||
{
|
||||
// calculate a score based on the availablility of data
|
||||
int _score = 0;
|
||||
var properties = this.GetType().GetProperties();
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
if (prop.GetGetMethod() != null)
|
||||
{
|
||||
switch (prop.Name.ToLower())
|
||||
{
|
||||
case "id":
|
||||
case "score":
|
||||
break;
|
||||
case "name":
|
||||
case "year":
|
||||
case "publisher":
|
||||
case "system":
|
||||
if (prop.PropertyType == typeof(string))
|
||||
{
|
||||
if (prop.GetValue(this) != null)
|
||||
{
|
||||
string propVal = prop.GetValue(this).ToString();
|
||||
if (propVal.Length > 0)
|
||||
{
|
||||
_score = _score + 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (prop.PropertyType == typeof(string))
|
||||
{
|
||||
if (prop.GetValue(this) != null)
|
||||
{
|
||||
string propVal = prop.GetValue(this).ToString();
|
||||
if (propVal.Length > 0)
|
||||
{
|
||||
_score = _score + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _score;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class RomItem
|
||||
@@ -55,6 +133,14 @@ namespace gaseous_server.Models
|
||||
public string? RomTypeMedia { get; set; }
|
||||
public string? MediaLabel { get; set; }
|
||||
|
||||
public SignatureSourceType SignatureSource { get; set; }
|
||||
|
||||
public enum SignatureSourceType
|
||||
{
|
||||
None = 0,
|
||||
TOSEC = 1
|
||||
}
|
||||
|
||||
public enum RomTypes
|
||||
{
|
||||
/// <summary>
|
||||
@@ -92,6 +178,66 @@ namespace gaseous_server.Models
|
||||
/// </summary>
|
||||
Side = 6
|
||||
}
|
||||
|
||||
[JsonIgnore]
|
||||
public int Score
|
||||
{
|
||||
get
|
||||
{
|
||||
// calculate a score based on the availablility of data
|
||||
int _score = 0;
|
||||
var properties = this.GetType().GetProperties();
|
||||
foreach (var prop in properties)
|
||||
{
|
||||
if (prop.GetGetMethod() != null)
|
||||
{
|
||||
switch (prop.Name.ToLower())
|
||||
{
|
||||
case "name":
|
||||
case "size":
|
||||
case "crc":
|
||||
case "developmentstatus":
|
||||
case "flags":
|
||||
case "romtypemedia":
|
||||
case "medialabel":
|
||||
if (prop.PropertyType == typeof(string) || prop.PropertyType == typeof(Int64) || prop.PropertyType == typeof(List<string>))
|
||||
{
|
||||
if (prop.GetValue(this) != null)
|
||||
{
|
||||
string propVal = prop.GetValue(this).ToString();
|
||||
if (propVal.Length > 0)
|
||||
{
|
||||
_score = _score + 10;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (prop.PropertyType == typeof(string))
|
||||
{
|
||||
if (prop.GetValue(this) != null)
|
||||
{
|
||||
string propVal = prop.GetValue(this).ToString();
|
||||
if (propVal.Length > 0)
|
||||
{
|
||||
_score = _score + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return _score;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class SignatureFlags
|
||||
{
|
||||
public int IGDBPlatformId { get; set; }
|
||||
public string IGDBPlatformName { get; set; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -15,7 +15,7 @@ namespace gaseous_server.Models
|
||||
public Signatures_Status()
|
||||
{
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
string sql = "select (select count(*) from signatures_sources) as SourceCount, (select count(*) from signatures_platforms) as PlatformCount, (select count(*) from signatures_games) as GameCount, (select count(*) from signatures_roms) as RomCount;";
|
||||
string sql = "select (select count(*) from Signatures_Sources) as SourceCount, (select count(*) from Signatures_Platforms) as PlatformCount, (select count(*) from Signatures_Games) as GameCount, (select count(*) from Signatures_Roms) as RomCount;";
|
||||
|
||||
DataTable sigDb = db.ExecuteCMD(sql);
|
||||
if (sigDb.Rows.Count > 0)
|
||||
|
140
gaseous-server/ProcessQueue.cs
Normal file
@@ -0,0 +1,140 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
|
||||
namespace gaseous_server
|
||||
{
|
||||
public static class ProcessQueue
|
||||
{
|
||||
public static List<QueueItem> QueueItems = new List<QueueItem>();
|
||||
|
||||
public class QueueItem
|
||||
{
|
||||
public QueueItem(QueueItemType ItemType, int ExecutionInterval)
|
||||
{
|
||||
_ItemType = ItemType;
|
||||
_ItemState = QueueItemState.NeverStarted;
|
||||
_LastRunTime = DateTime.UtcNow.AddMinutes(ExecutionInterval);
|
||||
_Interval = ExecutionInterval;
|
||||
}
|
||||
|
||||
public QueueItem(QueueItemType ItemType, int ExecutionInterval, List<QueueItemType> Blocks)
|
||||
{
|
||||
_ItemType = ItemType;
|
||||
_ItemState = QueueItemState.NeverStarted;
|
||||
_LastRunTime = DateTime.UtcNow.AddMinutes(ExecutionInterval);
|
||||
_Interval = ExecutionInterval;
|
||||
_Blocks = Blocks;
|
||||
}
|
||||
|
||||
private QueueItemType _ItemType = QueueItemType.NotConfigured;
|
||||
private QueueItemState _ItemState = QueueItemState.NeverStarted;
|
||||
private DateTime _LastRunTime = DateTime.UtcNow;
|
||||
private DateTime _LastFinishTime = DateTime.UtcNow;
|
||||
private int _Interval = 0;
|
||||
private string _LastResult = "";
|
||||
private string? _LastError = null;
|
||||
private bool _ForceExecute = false;
|
||||
private List<QueueItemType> _Blocks = new List<QueueItemType>();
|
||||
|
||||
public QueueItemType ItemType => _ItemType;
|
||||
public QueueItemState ItemState => _ItemState;
|
||||
public DateTime LastRunTime => _LastRunTime;
|
||||
public DateTime LastFinishTime => _LastFinishTime;
|
||||
public DateTime NextRunTime {
|
||||
get
|
||||
{
|
||||
return LastRunTime.AddMinutes(Interval);
|
||||
}
|
||||
}
|
||||
public int Interval => _Interval;
|
||||
public string LastResult => _LastResult;
|
||||
public string? LastError => _LastError;
|
||||
public bool Force => _ForceExecute;
|
||||
public List<QueueItemType> Blocks => _Blocks;
|
||||
|
||||
public void Execute()
|
||||
{
|
||||
if (_ItemState != QueueItemState.Disabled)
|
||||
{
|
||||
if ((DateTime.UtcNow > NextRunTime || _ForceExecute == true) && _ItemState != QueueItemState.Running)
|
||||
{
|
||||
// we can run - do some setup before we start processing
|
||||
_LastRunTime = DateTime.UtcNow;
|
||||
_ItemState = QueueItemState.Running;
|
||||
_LastResult = "";
|
||||
_LastError = null;
|
||||
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Executing " + _ItemType);
|
||||
|
||||
try
|
||||
{
|
||||
switch (_ItemType)
|
||||
{
|
||||
case QueueItemType.SignatureIngestor:
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Signature Ingestor");
|
||||
SignatureIngestors.TOSEC.TOSECIngestor tIngest = new SignatureIngestors.TOSEC.TOSECIngestor();
|
||||
tIngest.Import(Config.LibraryConfiguration.LibrarySignatureImportDirectory_TOSEC);
|
||||
break;
|
||||
|
||||
case QueueItemType.TitleIngestor:
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Title Ingestor");
|
||||
Classes.ImportGames importGames = new Classes.ImportGames(Config.LibraryConfiguration.LibraryImportDirectory);
|
||||
break;
|
||||
|
||||
case QueueItemType.MetadataRefresh:
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Metadata Refresher");
|
||||
Classes.MetadataManagement.RefreshMetadata(true);
|
||||
break;
|
||||
|
||||
case QueueItemType.OrganiseLibrary:
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Library Organiser");
|
||||
Classes.ImportGame.OrganiseLibrary();
|
||||
break;
|
||||
|
||||
case QueueItemType.LibraryScan:
|
||||
Logging.Log(Logging.LogType.Information, "Timered Event", "Starting Library Scanner");
|
||||
Classes.ImportGame.LibraryScan();
|
||||
break;
|
||||
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Logging.Log(Logging.LogType.Warning, "Timered Event", "An error occurred", ex);
|
||||
_LastResult = "";
|
||||
_LastError = ex.ToString();
|
||||
}
|
||||
|
||||
_ForceExecute = false;
|
||||
_ItemState = QueueItemState.Stopped;
|
||||
_LastFinishTime = DateTime.UtcNow;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void ForceExecute()
|
||||
{
|
||||
_ForceExecute = true;
|
||||
}
|
||||
}
|
||||
|
||||
public enum QueueItemType
|
||||
{
|
||||
NotConfigured,
|
||||
SignatureIngestor,
|
||||
TitleIngestor,
|
||||
MetadataRefresh,
|
||||
OrganiseLibrary,
|
||||
LibraryScan
|
||||
}
|
||||
|
||||
public enum QueueItemState
|
||||
{
|
||||
NeverStarted,
|
||||
Running,
|
||||
Stopped,
|
||||
Disabled
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -1,38 +1,120 @@
|
||||
using System.Text.Json.Serialization;
|
||||
using gaseous_server;
|
||||
using gaseous_tools;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
|
||||
builder.Services.AddControllers().AddJsonOptions(x =>
|
||||
{
|
||||
// serialize enums as strings in api responses (e.g. Role)
|
||||
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
|
||||
});
|
||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
if (app.Environment.IsDevelopment())
|
||||
{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
}
|
||||
|
||||
app.UseHttpsRedirection();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.MapControllers();
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Starting Gaseous Server");
|
||||
|
||||
// set up db
|
||||
Database db = new gaseous_tools.Database(Database.databaseType.MySql, Config.DatabaseConfiguration.ConnectionString);
|
||||
db.InitDB();
|
||||
|
||||
// load app settings
|
||||
Config.InitSettings();
|
||||
|
||||
// set initial values
|
||||
Guid APIKey = Guid.NewGuid();
|
||||
if (Config.ReadSetting("API Key", "Test API Key") == "Test API Key")
|
||||
{
|
||||
// it's a new api key save it
|
||||
Logging.Log(Logging.LogType.Information, "Startup", "Setting initial API key");
|
||||
Config.SetSetting("API Key", APIKey.ToString());
|
||||
}
|
||||
|
||||
// set up server
|
||||
var builder = WebApplication.CreateBuilder(args);
|
||||
|
||||
// Add services to the container.
|
||||
builder.Services.AddControllers().AddJsonOptions(x =>
|
||||
{
|
||||
// serialize enums as strings in api responses (e.g. Role)
|
||||
x.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter());
|
||||
|
||||
// suppress nulls
|
||||
x.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull;
|
||||
});
|
||||
builder.Services.AddResponseCaching();
|
||||
builder.Services.AddControllers(options =>
|
||||
{
|
||||
options.CacheProfiles.Add("Default30",
|
||||
new CacheProfile()
|
||||
{
|
||||
Duration = 30
|
||||
});
|
||||
options.CacheProfiles.Add("5Minute",
|
||||
new CacheProfile()
|
||||
{
|
||||
Duration = 300,
|
||||
Location = ResponseCacheLocation.Any
|
||||
});
|
||||
options.CacheProfiles.Add("7Days",
|
||||
new CacheProfile()
|
||||
{
|
||||
Duration = 604800,
|
||||
Location = ResponseCacheLocation.Any
|
||||
});
|
||||
});
|
||||
|
||||
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
builder.Services.AddHostedService<TimedHostedService>();
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
//if (app.Environment.IsDevelopment())
|
||||
//{
|
||||
app.UseSwagger();
|
||||
app.UseSwaggerUI();
|
||||
//}
|
||||
|
||||
//app.UseHttpsRedirection();
|
||||
|
||||
app.UseResponseCaching();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.UseDefaultFiles();
|
||||
app.UseStaticFiles();
|
||||
|
||||
app.MapControllers();
|
||||
|
||||
// setup library directories
|
||||
Config.LibraryConfiguration.InitLibrary();
|
||||
|
||||
// insert unknown platform and game if not present
|
||||
gaseous_server.Classes.Metadata.Games.GetGame(0, false, false);
|
||||
gaseous_server.Classes.Metadata.Platforms.GetPlatform(0);
|
||||
|
||||
// organise library
|
||||
//gaseous_server.Classes.ImportGame.OrganiseLibrary();
|
||||
|
||||
// add background tasks
|
||||
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(ProcessQueue.QueueItemType.SignatureIngestor, 60));
|
||||
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
|
||||
ProcessQueue.QueueItemType.TitleIngestor, 1,
|
||||
new List<ProcessQueue.QueueItemType>
|
||||
{
|
||||
ProcessQueue.QueueItemType.OrganiseLibrary,
|
||||
ProcessQueue.QueueItemType.LibraryScan
|
||||
})
|
||||
);
|
||||
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(ProcessQueue.QueueItemType.MetadataRefresh, 360));
|
||||
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
|
||||
ProcessQueue.QueueItemType.OrganiseLibrary, 2040, new List<ProcessQueue.QueueItemType>
|
||||
{
|
||||
ProcessQueue.QueueItemType.LibraryScan,
|
||||
ProcessQueue.QueueItemType.TitleIngestor
|
||||
})
|
||||
);
|
||||
ProcessQueue.QueueItems.Add(new ProcessQueue.QueueItem(
|
||||
ProcessQueue.QueueItemType.LibraryScan, 30, new List<ProcessQueue.QueueItemType>
|
||||
{
|
||||
ProcessQueue.QueueItemType.TitleIngestor,
|
||||
ProcessQueue.QueueItemType.OrganiseLibrary
|
||||
})
|
||||
);
|
||||
|
||||
// start the app
|
||||
app.Run();
|
||||
|
||||
|
93
gaseous-server/Support/PlatformMap.json
Normal file
@@ -0,0 +1,93 @@
|
||||
[
|
||||
{
|
||||
"IGDBId": 15,
|
||||
"IGDBName": "Commodore C64/128/MAX",
|
||||
"AlternateNames": [
|
||||
"C64",
|
||||
"Commodore C64",
|
||||
"Commodore C128",
|
||||
"Commodore C64DTV",
|
||||
"Commodore C64/128/MAX"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".C64",
|
||||
".CRT",
|
||||
".D64",
|
||||
".D71",
|
||||
".D81",
|
||||
".G64",
|
||||
".PRG",
|
||||
".T64",
|
||||
".TAP"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IGDBId": 16,
|
||||
"IGDBName": "Amiga",
|
||||
"AlternateNames": [
|
||||
"Amiga",
|
||||
"Commodore Amiga"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".ADF",
|
||||
".ADZ",
|
||||
".DMS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IGDBId": 64,
|
||||
"IGDBName": "Sega Master System/Mark III",
|
||||
"AlternateNames": [
|
||||
"Sega Master System/Mark III",
|
||||
"Sega Master System",
|
||||
"Sega Mark III & Master System"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".SMS"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IGDBId": 29,
|
||||
"IGDBName": "Sega Mega Drive/Genesis",
|
||||
"AlternateNames": [
|
||||
"Sega Mega Drive/Genesis",
|
||||
"Sega Mega Drive",
|
||||
"Sega Genesis",
|
||||
"Sega Mega Drive & Genesis"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".GEN",
|
||||
".MD",
|
||||
".SG",
|
||||
".SMD"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IGDBId": 4,
|
||||
"IGDBName": "Nintendo 64",
|
||||
"AlternateNames": [
|
||||
"Nintendo 64",
|
||||
"N64"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".Z64"
|
||||
]
|
||||
},
|
||||
{
|
||||
"IGDBId": 18,
|
||||
"IGDBName": "Nintendo Entertainment System",
|
||||
"AlternateNames": [
|
||||
"Nintendo Entertainment System",
|
||||
"NES"
|
||||
],
|
||||
"KnownFileExtensions": [
|
||||
".NES",
|
||||
".FDS",
|
||||
".FIG",
|
||||
".MGD",
|
||||
".SFC",
|
||||
".SMC",
|
||||
".SWC"
|
||||
]
|
||||
}
|
||||
]
|
79
gaseous-server/Timer.cs
Normal file
@@ -0,0 +1,79 @@
|
||||
using System;
|
||||
using gaseous_tools;
|
||||
|
||||
namespace gaseous_server
|
||||
{
|
||||
// see: https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0&tabs=visual-studio-mac#timed-background-tasks-1
|
||||
public class TimedHostedService : IHostedService, IDisposable
|
||||
{
|
||||
private int executionCount = 0;
|
||||
//private readonly ILogger<TimedHostedService> _logger;
|
||||
private Timer _timer;
|
||||
|
||||
//public TimedHostedService(ILogger<TimedHostedService> logger)
|
||||
//{
|
||||
// _logger = logger;
|
||||
//}
|
||||
|
||||
public Task StartAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
//_logger.LogInformation("Timed Hosted Service running.");
|
||||
Logging.Log(Logging.LogType.Debug, "Background", "Starting background task monitor");
|
||||
|
||||
_timer = new Timer(DoWork, null, TimeSpan.Zero,
|
||||
TimeSpan.FromSeconds(5));
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
private void DoWork(object state)
|
||||
{
|
||||
var count = Interlocked.Increment(ref executionCount);
|
||||
|
||||
//_logger.LogInformation(
|
||||
// "Timed Hosted Service is working. Count: {Count}", count);
|
||||
|
||||
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems) {
|
||||
if ((DateTime.UtcNow > qi.NextRunTime || qi.Force == true) && CheckProcessBlockList(qi) == true) {
|
||||
qi.Execute();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken stoppingToken)
|
||||
{
|
||||
//_logger.LogInformation("Timed Hosted Service is stopping.");
|
||||
Logging.Log(Logging.LogType.Debug, "Background", "Stopping background task monitor");
|
||||
|
||||
_timer?.Change(Timeout.Infinite, 0);
|
||||
|
||||
return Task.CompletedTask;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
_timer?.Dispose();
|
||||
}
|
||||
|
||||
private bool CheckProcessBlockList(ProcessQueue.QueueItem queueItem)
|
||||
{
|
||||
if (queueItem.Blocks.Count > 0)
|
||||
{
|
||||
foreach (ProcessQueue.QueueItem qi in ProcessQueue.QueueItems)
|
||||
{
|
||||
if (queueItem.Blocks.Contains(qi.ItemType) && qi.ItemState == ProcessQueue.QueueItemState.Running)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -9,11 +9,103 @@
|
||||
|
||||
<PropertyGroup Condition=" '$(RunConfiguration)' == 'https' " />
|
||||
<PropertyGroup Condition=" '$(RunConfiguration)' == 'http' " />
|
||||
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
|
||||
<WarningLevel>4</WarningLevel>
|
||||
<DocumentationFile>bin\Debug\net7.0\gaseous-server.xml</DocumentationFile>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" />
|
||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.8" />
|
||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||
<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="7.0.7" />
|
||||
<PackageReference Include="IGDB" Version="2.3.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Controllers\" />
|
||||
<None Remove="Models\" />
|
||||
<None Remove="Models\Signatures.Status" />
|
||||
<None Remove="Classes\" />
|
||||
<None Remove="Classes\SignatureIngestors\" />
|
||||
<None Remove="Support\" />
|
||||
<None Remove="Classes\Metadata\" />
|
||||
<None Remove="Assets\" />
|
||||
<None Remove="Assets\Ratings\" />
|
||||
<None Remove="Assets\Ratings\ESRB\" />
|
||||
<None Remove="Assets\Ratings\ACB\" />
|
||||
<None Remove="Assets\Ratings\PEGI\" />
|
||||
<None Remove="Assets\Ratings\ESRB\AO.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\E.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\E10plus.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\M.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\RP.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\RP-LM17-English.svg" />
|
||||
<None Remove="Assets\Ratings\ESRB\T.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_A.png" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_B.png" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_C.png" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_D.png" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_Z.png" />
|
||||
<None Remove="Assets\Ratings\USK\" />
|
||||
<None Remove="Assets\Ratings\USK\USK_0.svg" />
|
||||
<None Remove="Assets\Ratings\USK\USK_12.svg" />
|
||||
<None Remove="Assets\Ratings\USK\USK_16.svg" />
|
||||
<None Remove="Assets\Ratings\USK\USK_18.svg" />
|
||||
<None Remove="Assets\Ratings\USK\USK_6.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_G.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_M.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_MA15.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_PG.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_R18.svg" />
|
||||
<None Remove="Assets\Ratings\ACB\ACB_RC.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_A.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_B.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_C.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_D.svg" />
|
||||
<None Remove="Assets\Ratings\CERO\CERO_Z.svg" />
|
||||
<None Remove="Assets\Ratings\PEGI\Eighteen.svg" />
|
||||
<None Remove="Assets\Ratings\PEGI\Seven.svg" />
|
||||
<None Remove="Assets\Ratings\PEGI\Sixteen.svg" />
|
||||
<None Remove="Assets\Ratings\PEGI\Three.svg" />
|
||||
<None Remove="Assets\Ratings\PEGI\Twelve.svg" />
|
||||
<None Remove="Assets\Ratings\GRAC\" />
|
||||
<None Remove="Assets\Ratings\GRAC\GRAC_All.svg" />
|
||||
<None Remove="Assets\Ratings\GRAC\GRAC_Eighteen.svg" />
|
||||
<None Remove="Assets\Ratings\GRAC\GRAC_Fifteen.svg" />
|
||||
<None Remove="Assets\Ratings\GRAC\GRAC_Testing.svg" />
|
||||
<None Remove="Assets\Ratings\GRAC\GRAC_Twelve.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Eighteen.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Fourteen.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_L.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Sixteen.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Ten.svg" />
|
||||
<None Remove="Assets\Ratings\CLASS_IND\CLASS_IND_Twelve.svg" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Controllers\" />
|
||||
<Folder Include="Models\" />
|
||||
<Folder Include="Classes\" />
|
||||
<Folder Include="Classes\SignatureIngestors\" />
|
||||
<Folder Include="Support\" />
|
||||
<Folder Include="wwwroot\" />
|
||||
<Folder Include="Classes\Metadata\" />
|
||||
<Folder Include="Assets\" />
|
||||
<Folder Include="Assets\Ratings\" />
|
||||
<Folder Include="Assets\Ratings\ESRB\" />
|
||||
<Folder Include="Assets\Ratings\ACB\" />
|
||||
<Folder Include="Assets\Ratings\PEGI\" />
|
||||
<Folder Include="wwwroot\scripts\" />
|
||||
<Folder Include="wwwroot\images\" />
|
||||
<Folder Include="wwwroot\styles\" />
|
||||
<Folder Include="wwwroot\pages\" />
|
||||
<Folder Include="Assets\Ratings\CERO\" />
|
||||
<Folder Include="Assets\Ratings\USK\" />
|
||||
<Folder Include="Assets\Ratings\GRAC\" />
|
||||
<Folder Include="Assets\Ratings\CLASS_IND\" />
|
||||
<Folder Include="wwwroot\fonts\" />
|
||||
<Folder Include="wwwroot\pages\dialogs\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\gaseous-tools\gaseous-tools.csproj">
|
||||
<GlobalPropertiesToRemove></GlobalPropertiesToRemove>
|
||||
@@ -21,14 +113,56 @@
|
||||
<ProjectReference Include="..\gaseous-romsignatureobject\gaseous-romsignatureobject.csproj">
|
||||
<GlobalPropertiesToRemove></GlobalPropertiesToRemove>
|
||||
</ProjectReference>
|
||||
<ProjectReference Include="..\gaseous-signature-parser\gaseous-signature-parser.csproj">
|
||||
<GlobalPropertiesToRemove></GlobalPropertiesToRemove>
|
||||
</ProjectReference>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Remove="Controllers\" />
|
||||
<None Remove="Models\" />
|
||||
<None Remove="Models\Signatures.Status" />
|
||||
<Content Remove="Support\PlatformMap.json" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Controllers\" />
|
||||
<Folder Include="Models\" />
|
||||
<EmbeddedResource Include="Support\PlatformMap.json" Condition="'$(ExcludeConfigFilesFromBuildOutput)'!='true'">
|
||||
<ExcludeFromSingleFile>true</ExcludeFromSingleFile>
|
||||
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
|
||||
</EmbeddedResource>
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\AO.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\E.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\E10.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\M.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\RP.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\RP-LM17-English.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ESRB\T.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\USK\USK_0.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\USK\USK_12.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\USK\USK_16.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\USK\USK_18.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\USK\USK_6.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_G.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_M.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_MA15.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_PG.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_R18.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\ACB\ACB_RC.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_A.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_B.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_C.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_D.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CERO\CERO_Z.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\PEGI\Eighteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\PEGI\Seven.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\PEGI\Sixteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\PEGI\Three.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\PEGI\Twelve.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_All.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Eighteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Fifteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Testing.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\GRAC\GRAC_Twelve.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Eighteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Fourteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_L.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Sixteen.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Ten.svg" />
|
||||
<EmbeddedResource Include="Assets\Ratings\CLASS_IND\CLASS_IND_Twelve.svg" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
BIN
gaseous-server/wwwroot/.DS_Store
vendored
Normal file
BIN
gaseous-server/wwwroot/android-chrome-192x192.png
Normal file
After Width: | Height: | Size: 16 KiB |
BIN
gaseous-server/wwwroot/android-chrome-512x512.png
Normal file
After Width: | Height: | Size: 72 KiB |
BIN
gaseous-server/wwwroot/apple-touch-icon.png
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
gaseous-server/wwwroot/favicon-16x16.png
Normal file
After Width: | Height: | Size: 518 B |
BIN
gaseous-server/wwwroot/favicon-32x32.png
Normal file
After Width: | Height: | Size: 1.1 KiB |
BIN
gaseous-server/wwwroot/favicon.ico
Normal file
After Width: | Height: | Size: 15 KiB |
BIN
gaseous-server/wwwroot/fonts/Commodore Pixelized v1.2.ttf
Normal file
1
gaseous-server/wwwroot/images/YouTube.svg
Normal file
@@ -0,0 +1 @@
|
||||
<svg width="159" height="110" xmlns="http://www.w3.org/2000/svg"><path d="m154 17.5c-1.82-6.73-7.07-12-13.8-13.8-9.04-3.49-96.6-5.2-122 0.1-6.73 1.82-12 7.07-13.8 13.8-4.08 17.9-4.39 56.6 0.1 74.9 1.82 6.73 7.07 12 13.8 13.8 17.9 4.12 103 4.7 122 0 6.73-1.82 12-7.07 13.8-13.8 4.35-19.5 4.66-55.8-0.1-75z" fill="#f00"/><path d="m105 55-40.8-23.4v46.8z" fill="#fff"/></svg>
|
After Width: | Height: | Size: 374 B |
BIN
gaseous-server/wwwroot/images/cog.jpg
Normal file
After Width: | Height: | Size: 88 KiB |
BIN
gaseous-server/wwwroot/images/logo.png
Normal file
After Width: | Height: | Size: 1.2 KiB |
BIN
gaseous-server/wwwroot/images/unknowngame.png
Normal file
After Width: | Height: | Size: 2.3 KiB |
59
gaseous-server/wwwroot/index.html
Normal file
@@ -0,0 +1,59 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<link type="text/css" rel="stylesheet" href="/styles/style.css" />
|
||||
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
|
||||
<script src="https://momentjs.com/downloads/moment.js"></script>
|
||||
<link href="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/css/select2.min.css" rel="stylesheet" />
|
||||
<script src="https://cdn.jsdelivr.net/npm/select2@4.1.0-rc.0/dist/js/select2.min.js"></script>
|
||||
<script src="/scripts/main.js" type="text/javascript"></script>
|
||||
<script src="/scripts/filterformating.js" type="text/javascript"></script>
|
||||
<script src="/scripts/gamesformating.js" type="text/javascript"></script>
|
||||
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png">
|
||||
<link rel="manifest" href="/site.webmanifest">
|
||||
<title>Gaseous Games</title>
|
||||
</head>
|
||||
<body>
|
||||
<div id="banner_icon" onclick="window.location.href = '/index.html';">
|
||||
<img src="/images/logo.png" alt="Gaseous" id="banner_icon_image" />
|
||||
</div>
|
||||
<div id="banner_header">
|
||||
<div id="banner_header_label">Gaseous Games</div>
|
||||
</div>
|
||||
<div id="banner_cog" onclick="window.location.href = '/index.html?page=system';">
|
||||
<img src="/images/cog.jpg" alt="System" id="banner_system_image" />
|
||||
</div>
|
||||
|
||||
<div id="content">
|
||||
|
||||
</div>
|
||||
|
||||
<!-- The Modal -->
|
||||
<div id="myModal" class="modal">
|
||||
|
||||
<!-- Modal content -->
|
||||
<div class="modal-content">
|
||||
<span class="close">×</span>
|
||||
<div><h1 id="modal-heading">Modal heading</h1></div>
|
||||
<div id="modal-content">Some text in the Modal..</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">var modalVariables = null;
|
||||
|
||||
$(document).ready(function () {
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
var myParam = urlParams.get('page');
|
||||
|
||||
if (!myParam) {
|
||||
myParam = 'home';
|
||||
}
|
||||
|
||||
$('#content').load('/pages/' + myParam + '.html');
|
||||
});</script>
|
||||
</body>
|
||||
</html>
|
18
gaseous-server/wwwroot/pages/dialogs/romdelete.html
Normal file
@@ -0,0 +1,18 @@
|
||||
<p>Are you sure you want to delete this ROM?</p>
|
||||
<p><strong>Warning:</strong> This cannot be undone!</p>
|
||||
<div style="width: 100%; text-align: center;">
|
||||
<div style="display: inline-block; margin-right: 20px;">
|
||||
<button class="redbutton" value="Delete" onclick="deleteRom();">Delete</button>
|
||||
</div>
|
||||
<div style="display: inline-block; margin-left: 20px;">
|
||||
<button value="Cancel" onclick="closeSubDialog();">Cancel</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
function deleteRom() {
|
||||
ajaxCall('/api/v1/Games/' + gameId + '/roms/' + modalVariables, 'DELETE', function (result) {
|
||||
window.location.reload();
|
||||
});
|
||||
}
|
||||
</script>
|