18 Commits

308 changed files with 4441 additions and 323 deletions

View File

@@ -16,7 +16,7 @@ import lombok.Setter;
@RegisterForReflection
@Entity
@Table(name = "cardboard")
@Table(name = "competition_guest")
public class CompetitionGuestModel {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -37,6 +37,8 @@ public class CompetitionGuestModel {
String country = "fr";
Integer weight = null;
public CompetitionGuestModel(String s) {
this.fname = s.substring(0, s.indexOf(" "));
this.lname = s.substring(s.indexOf(" ") + 1);

View File

@@ -63,18 +63,22 @@ public class MatchModel {
@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
@JoinColumn(name = "match", referencedColumnName = "id")
List<CardboardModel> cardboard;
List<CardboardModel> cardboard = new ArrayList<>();
public String getC1Name() {
if (c1_id == null)
return c1_guest.fname + " " + c1_guest.lname;
if (c1_id != null)
return c1_id.fname + " " + c1_id.lname;
if (c1_guest != null)
return c1_guest.fname + " " + c1_guest.lname;
return "";
}
public String getC2Name() {
if (c2_id == null)
return c2_guest.fname + " " + c2_guest.lname;
if (c2_id != null)
return c2_id.fname + " " + c2_id.lname;
if (c2_guest != null)
return c2_guest.fname + " " + c2_guest.lname;
return "";
}
public int win() {

View File

@@ -7,6 +7,9 @@ import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.ArrayList;
import java.util.List;
@Getter
@Setter
@AllArgsConstructor
@@ -36,4 +39,20 @@ public class TreeModel {
@ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.PERSIST)
@JoinColumn(referencedColumnName = "id")
TreeModel right;
public List<TreeModel> flat() {
List<TreeModel> out = new ArrayList<>();
this.flat(out);
return out;
}
private void flat(List<TreeModel> out) {
out.add(this);
if (this.right != null)
this.right.flat(out);
if (this.left != null)
this.left.flat(out);
}
}

View File

@@ -0,0 +1,9 @@
package fr.titionfire.ffsaf.data.repository;
import fr.titionfire.ffsaf.data.model.CardboardModel;
import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
import jakarta.enterprise.context.ApplicationScoped;
@ApplicationScoped
public class CardboardRepository implements PanacheRepositoryBase<CardboardModel, Long> {
}

View File

@@ -7,6 +7,8 @@ import io.quarkus.hibernate.reactive.panache.PanacheRepositoryBase;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import java.util.List;
@ApplicationScoped
public class MatchRepository implements PanacheRepositoryBase<MatchModel, Long> {
@@ -16,4 +18,13 @@ public class MatchRepository implements PanacheRepositoryBase<MatchModel, Long>
.invoke(matchModel1 -> matchModel1.setSystemId(matchModel1.getId())))
.chain(this::persist);
}
public Uni<Void> create(List<MatchModel> matchModel) {
matchModel.forEach(model -> model.setSystem(CompetitionSystem.INTERNAL));
return Panache.withTransaction(() -> this.persist(matchModel)
.call(__ -> this.flush())
.invoke(__ -> matchModel.forEach(model -> model.setSystemId(model.getId())))
.map(__ -> matchModel))
.chain(this::persist);
}
}

View File

@@ -17,7 +17,10 @@ public class CardboardEntity {
int yellow;
public static CardboardEntity fromModel(CardboardModel model) {
return new CardboardEntity(model.getComb().getId(), model.getMatch().getId(), model.getCompet().getId(),
return new CardboardEntity(
model.getComb() != null ? model.getComb().getId() : model.getGuestComb().getId() * -1,
model.getMatch().getId(),
model.getCompet().getId(),
model.getRed(), model.getYellow());
}
}

View File

@@ -2,6 +2,7 @@ package fr.titionfire.ffsaf.domain.entity;
import fr.titionfire.ffsaf.data.model.CompetitionGuestModel;
import fr.titionfire.ffsaf.data.model.MembreModel;
import fr.titionfire.ffsaf.data.model.RegisterModel;
import fr.titionfire.ffsaf.utils.Categorie;
import fr.titionfire.ffsaf.utils.Genre;
import io.quarkus.runtime.annotations.RegisterForReflection;
@@ -13,20 +14,24 @@ import lombok.Data;
@RegisterForReflection
public class CombEntity {
private long id;
private String lname = "";
private String fname = "";
Categorie categorie = null;
Long club = null;
String club_str = null;
Genre genre = null;
String country = "fr";
private String lname;
private String fname;
Categorie categorie;
String club_uuid;
String club_str;
Genre genre;
String country;
int overCategory;
Integer weight;
public static CombEntity fromModel(MembreModel model) {
if (model == null)
return null;
return new CombEntity(model.getId(), model.getLname(), model.getFname(), model.getCategorie(),
model.getClub().getId(), model.getClub().getName(), model.getGenre(), model.getCountry());
model.getClub() == null ? null : model.getClub().getClubId(),
model.getClub() == null ? "Sans club" : model.getClub().getName(), model.getGenre(), model.getCountry(),
0, null);
}
@@ -35,6 +40,17 @@ public class CombEntity {
return null;
return new CombEntity(model.getId() * -1, model.getLname(), model.getFname(), model.getCategorie(), null,
model.getClub(), model.getGenre(), model.getCountry());
model.getClub(), model.getGenre(), model.getCountry(), 0, model.getWeight());
}
public static CombEntity fromModel(RegisterModel registerModel) {
if (registerModel == null || registerModel.getMembre() == null)
return null;
MembreModel model = registerModel.getMembre();
return new CombEntity(model.getId(), model.getLname(), model.getFname(), registerModel.getCategorie(),
registerModel.getClub2() == null ? null : registerModel.getClub2().getClubId(),
registerModel.getClub2() == null ? "Sans club" : registerModel.getClub2().getName(), model.getGenre(),
model.getCountry(), registerModel.getOverCategory(), registerModel.getWeight());
}
}

View File

@@ -56,7 +56,7 @@ public class CompetPermService {
CompletableFuture<SimpleCompet> f = new CompletableFuture<>();
SReqCompet.getConfig(serverCustom.clients, id, f);
try {
return f.get(1500, TimeUnit.MILLISECONDS);
return f.get(500, TimeUnit.MILLISECONDS);
} catch (InterruptedException | ExecutionException | TimeoutException e) {
throw new RuntimeException(e);
}
@@ -71,7 +71,8 @@ public class CompetPermService {
.chain(competitionModels -> {
CompletableFuture<HashMap<String, String>> f = new CompletableFuture<>();
SReqCompet.getAllHaveAccess(serverCustom.clients, securityCtx.getSubject(), f);
return Uni.createFrom().future(f, Duration.ofMillis(1500))
return Uni.createFrom().future(f, Duration.ofMillis(500))
.onFailure().recoverWithItem(new HashMap<>())
.map(map_ -> {
HashMap<Long, String> map = new HashMap<>();
map_.forEach((key, value) -> map.put(Long.parseLong(key), value));

View File

@@ -1,9 +1,6 @@
package fr.titionfire.ffsaf.domain.service;
import fr.titionfire.ffsaf.data.model.CompetitionModel;
import fr.titionfire.ffsaf.data.model.HelloAssoRegisterModel;
import fr.titionfire.ffsaf.data.model.MembreModel;
import fr.titionfire.ffsaf.data.model.RegisterModel;
import fr.titionfire.ffsaf.data.model.*;
import fr.titionfire.ffsaf.data.repository.*;
import fr.titionfire.ffsaf.net2.ServerCustom;
import fr.titionfire.ffsaf.net2.data.SimpleCompet;
@@ -16,10 +13,9 @@ import fr.titionfire.ffsaf.rest.data.SimpleCompetData;
import fr.titionfire.ffsaf.rest.data.SimpleRegisterComb;
import fr.titionfire.ffsaf.rest.exception.DBadRequestException;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.utils.CompetitionSystem;
import fr.titionfire.ffsaf.utils.RegisterMode;
import fr.titionfire.ffsaf.utils.SecurityCtx;
import fr.titionfire.ffsaf.utils.Utils;
import fr.titionfire.ffsaf.rest.exception.DNotFoundException;
import fr.titionfire.ffsaf.utils.*;
import fr.titionfire.ffsaf.ws.send.SRegister;
import io.quarkus.cache.Cache;
import io.quarkus.cache.CacheName;
import io.quarkus.hibernate.reactive.panache.Panache;
@@ -64,6 +60,9 @@ public class CompetitionService {
@Inject
CombRepository combRepository;
@Inject
CompetitionGuestRepository competitionGuestRepository;
@Inject
ServerCustom serverCustom;
@@ -83,6 +82,9 @@ public class CompetitionService {
@Inject
Vertx vertx;
@Inject
SRegister sRegister;
@Inject
@CacheName("safca-config")
Cache cache;
@@ -108,7 +110,8 @@ public class CompetitionService {
}
return permService.hasAdminViewPerm(securityCtx, id)
.chain(competitionModel -> Mutiny.fetch(competitionModel.getInsc())
.map(insc -> CompetitionData.fromModel(competitionModel).addInsc(insc)))
.chain(insc -> Mutiny.fetch(competitionModel.getGuests())
.map(guest -> CompetitionData.fromModel(competitionModel).addInsc(insc, guest))))
.chain(data ->
vertx.getOrCreateContext().executeBlocking(() -> {
keycloakService.getUser(UUID.fromString(data.getOwner()))
@@ -159,6 +162,14 @@ public class CompetitionService {
.map(pouleModels -> pouleModels.stream().map(CompetitionData::fromModel).toList());
}
public Uni<List<CompetitionData>> getAllSystemTable(SecurityCtx securityCtx,
CompetitionSystem system) {
return repository.list("system = ?1", system)
.chain(l -> Uni.join().all(l.stream().map(cm -> permService.hasTablePerm(securityCtx, cm)).toList())
.andCollectFailures())
.map(l -> l.stream().filter(Objects::nonNull).map(CompetitionData::fromModel).toList());
}
public Uni<CompetitionData> addOrUpdate(SecurityCtx securityCtx, CompetitionData data) {
if (data.getId() == null) {
return combRepository.find("userId = ?1", securityCtx.getSubject()).firstResult()
@@ -175,6 +186,7 @@ public class CompetitionService {
model.setSystem(data.getSystem());
model.setClub(clubModel);
model.setInsc(new ArrayList<>());
model.setGuests(new ArrayList<>());
model.setUuid(UUID.randomUUID().toString());
model.setOwner(securityCtx.getSubject());
@@ -235,11 +247,18 @@ public class CompetitionService {
public Uni<List<SimpleRegisterComb>> getRegister(SecurityCtx securityCtx, Long id, String source) {
if ("admin".equals(source))
return permService.hasEditPerm(securityCtx, id)
.chain(c -> Mutiny.fetch(c.getInsc()))
.chain(c -> {
Uni<List<SimpleRegisterComb>> uni = Mutiny.fetch(c.getInsc())
.onItem().transformToMulti(Multi.createFrom()::iterable)
.onItem().call(combModel -> Mutiny.fetch(combModel.getMembre().getLicences()))
.map(combModel -> SimpleRegisterComb.fromModel(combModel, combModel.getMembre().getLicences()))
.map(cm -> SimpleRegisterComb.fromModel(cm, cm.getMembre().getLicences()))
.collect().asList();
return uni
.call(l -> Mutiny.fetch(c.getGuests())
.map(guest -> guest.stream().map(SimpleRegisterComb::fromModel).toList())
.invoke(l::addAll));
});
if ("club".equals(source))
return Uni.createFrom().nullItem()
.invoke(Unchecked.consumer(__ -> {
@@ -262,8 +281,10 @@ public class CompetitionService {
public Uni<SimpleRegisterComb> addRegisterComb(SecurityCtx securityCtx, Long id, RegisterRequestData data,
String source) {
if ("admin".equals(source))
if (data.getLicence() != -1) { // not a guest
return permService.hasEditPerm(securityCtx, id)
.chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname())
.call(combModel -> Mutiny.fetch(combModel.getLicences()))
.call(combModel -> {
if (c.getBanMembre() == null)
c.setBanMembre(new ArrayList<>());
@@ -271,8 +292,33 @@ public class CompetitionService {
return Panache.withTransaction(() -> repository.persist(c));
})
.chain(combModel -> updateRegister(data, c, combModel, true)))
.chain(r -> Mutiny.fetch(r.getMembre().getLicences())
.map(licences -> SimpleRegisterComb.fromModel(r, licences)));
.map(r -> SimpleRegisterComb.fromModel(r, r.getMembre().getLicences()));
} else {
return permService.hasEditPerm(securityCtx, id)
.chain(c -> competitionGuestRepository.findById(data.getId() * -1)
.map(g -> {
if (g != null)
return g;
CompetitionGuestModel model = new CompetitionGuestModel();
model.setCompetition(c);
return model;
}))
.chain(model -> {
model.setFname(data.getFname());
model.setLname(data.getLname());
model.setGenre(data.getGenre());
model.setClub(data.getClub());
model.setCountry(data.getCountry());
model.setWeight(data.getWeight());
model.setCategorie(data.getCategorie());
return Panache.withTransaction(() -> competitionGuestRepository.persist(model))
.call(r -> model.getCompetition().getSystem() == CompetitionSystem.INTERNAL ?
sRegister.sendRegister(model.getCompetition().getUuid(),
r) : Uni.createFrom().voidItem());
})
.map(SimpleRegisterComb::fromModel);
}
if ("club".equals(source))
return repository.findById(id)
.invoke(Unchecked.consumer(cm -> {
@@ -283,6 +329,7 @@ public class CompetitionService {
throw new DBadRequestException("Inscription fermée");
}))
.chain(c -> findComb(data.getLicence(), data.getFname(), data.getLname())
.call(combModel -> Mutiny.fetch(combModel.getLicences()))
.invoke(Unchecked.consumer(model -> {
if (!securityCtx.isInClubGroup(model.getClub().getId()))
throw new DForbiddenException();
@@ -291,8 +338,7 @@ public class CompetitionService {
"Vous n'avez pas le droit d'inscrire ce membre (par décision de l'administrateur de la compétition)");
}))
.chain(combModel -> updateRegister(data, c, combModel, false)))
.chain(r -> Mutiny.fetch(r.getMembre().getLicences())
.map(licences -> SimpleRegisterComb.fromModel(r, licences)));
.map(r -> SimpleRegisterComb.fromModel(r, r.getMembre().getLicences()));
return repository.findById(id)
.invoke(Unchecked.consumer(cm -> {
@@ -347,15 +393,18 @@ public class CompetitionService {
SReqRegister.sendIfNeed(serverCustom.clients,
new CompetitionData.SimpleRegister(r.getMembre().getId(),
r.getOverCategory(), r.getWeight(), r.getCategorie(),
(r.getClub() == null) ? null : r.getClub().getId()), c.getId());
(r.getClub() == null) ? null : r.getClub().getId(),
(r.getClub() == null) ? null : r.getClub().getName()), c.getId());
}
return r;
}))
.chain(r -> Panache.withTransaction(() -> registerRepository.persist(r)));
.chain(r -> Panache.withTransaction(() -> registerRepository.persist(r)))
.call(r -> c.getSystem() == CompetitionSystem.INTERNAL ?
sRegister.sendRegister(c.getUuid(), r) : Uni.createFrom().voidItem());
}
private Uni<MembreModel> findComb(Long licence, String fname, String lname) {
if (licence != null && licence != 0) {
if (licence != null && licence > 0) {
return combRepository.find("licence = ?1", licence).firstResult()
.invoke(Unchecked.consumer(combModel -> {
if (combModel == null)
@@ -398,30 +447,45 @@ public class CompetitionService {
if (new Date().before(cm.getStartRegister()) || new Date().after(cm.getEndRegister()))
throw new DBadRequestException("Inscription fermée");
}))
.call(cm -> membreService.getByAccountId(securityCtx.getSubject())
.call(cm -> membreService.getById(combId)
.invoke(Unchecked.consumer(model -> {
if (model == null)
throw new DNotFoundException("Membre " + combId + " n'existe pas");
if (!securityCtx.isInClubGroup(model.getClub().getId()))
throw new DForbiddenException();
})))
.chain(c -> deleteRegister(combId, c, false));
return repository.findById(id)
.invoke(Unchecked.consumer(cm -> {
if (cm.getRegisterMode() != RegisterMode.FREE)
.call(cm -> membreService.getByAccountId(securityCtx.getSubject())
.invoke(Unchecked.consumer(model -> {
if (cm.getRegisterMode() != RegisterMode.FREE || !Objects.equals(model.getId(), combId))
throw new DForbiddenException();
if (new Date().before(cm.getStartRegister()) || new Date().after(cm.getEndRegister()))
throw new DBadRequestException("Inscription fermée");
}))
})))
.chain(c -> deleteRegister(combId, c, false));
}
private Uni<Void> deleteRegister(Long combId, CompetitionModel c, boolean admin) {
if (admin && combId < 0) {
return competitionGuestRepository.find("competition = ?1 AND id = ?2", c, combId * -1).firstResult()
.onFailure().transform(t -> new DBadRequestException("Combattant non inscrit"))
.call(Unchecked.function(
model -> Panache.withTransaction(() -> competitionGuestRepository.delete(model))
.call(r -> c.getSystem() == CompetitionSystem.INTERNAL ?
sRegister.sendRegisterRemove(c.getUuid(), combId) : Uni.createFrom()
.voidItem())))
.replaceWithVoid();
}
return registerRepository.find("competition = ?1 AND membre.id = ?2", c, combId).firstResult()
.onFailure().transform(t -> new DBadRequestException("Combattant non inscrit"))
.call(Unchecked.function(registerModel -> {
if (!admin && registerModel.isLockEdit())
throw new DForbiddenException("Modification bloquée par l'administrateur de la compétition");
return Panache.withTransaction(() -> registerRepository.delete(registerModel));
return Panache.withTransaction(() -> registerRepository.delete(registerModel))
.call(r -> c.getSystem() == CompetitionSystem.INTERNAL ?
sRegister.sendRegisterRemove(c.getUuid(), combId) : Uni.createFrom().voidItem());
}))
.replaceWithVoid();
}
@@ -440,6 +504,10 @@ public class CompetitionService {
.andCollectFailures()))
.call(competitionModel -> Panache.withTransaction(
() -> categoryRepository.delete("compet = ?1", competitionModel)))
.call(competitionModel -> Panache.withTransaction(
() -> registerRepository.delete("competition = ?1", competitionModel)))
.call(competitionModel -> Panache.withTransaction(
() -> competitionGuestRepository.delete("competition = ?1", competitionModel)))
.chain(model -> Panache.withTransaction(() -> repository.delete("id", model.getId())))
.invoke(o -> SReqCompet.rmCompet(serverCustom.clients, id))
.call(__ -> cache.invalidate(id));
@@ -529,7 +597,12 @@ public class CompetitionService {
uni = uni.call(__ -> Panache.withTransaction(
() -> registerRepository.delete("competition = ?1 AND membre = ?2",
reg.getCompetition(), reg.getMembre())));
reg.getCompetition(), reg.getMembre())))
.call(r -> reg.getCompetition().getSystem() == CompetitionSystem.INTERNAL ?
sRegister.sendRegisterRemove(reg.getCompetition().getUuid(),
reg.getMembre().getId()) : Uni.createFrom().voidItem()).onFailure()
.recoverWithNull()
;
}
return uni;
@@ -541,7 +614,8 @@ public class CompetitionService {
public Uni<Response> registerHelloAsso(NotificationData data) {
String organizationSlug = data.getOrganizationSlug();
String formSlug = data.getFormSlug();
RegisterRequestData req = new RegisterRequestData(null, "", "", null, 0, false);
RegisterRequestData req = new RegisterRequestData(null, "", "", null, 0, false, null, Categorie.CADET, Genre.NA,
null, "fr");
return repository.find("data1 = ?1 AND data2 = ?2", organizationSlug, formSlug).firstResult()
.onFailure().recoverWithNull()

View File

@@ -186,6 +186,6 @@ public class AffiliationRequestEndpoints {
public Uni<Response> getStatus(
@Parameter(description = "L'identifiant de la demande d'affiliation") @PathParam("id") long id) throws URISyntaxException {
return Utils.getMediaFile(id, media, "aff_request/status", "affiliation_request_" + id,
Uni.createFrom().nullItem());
Uni.createFrom().nullItem(), false);
}
}

View File

@@ -335,7 +335,7 @@ public class ClubEndpoints {
@Parameter(description = "Identifiant long (clubId) de club") @PathParam("clubId") String clubId) {
return clubService.getByClubId(clubId).chain(Unchecked.function(clubModel -> {
try {
return Utils.getMediaFile((clubModel != null) ? clubModel.getId() : -1, media, "ppClub",
return Utils.getMediaFileNoDefault((clubModel != null) ? clubModel.getId() : -1, media, "ppClub",
Uni.createFrom().nullItem());
} catch (URISyntaxException e) {
throw new InternalError();
@@ -358,7 +358,7 @@ public class ClubEndpoints {
return clubService.getById(id).onItem().invoke(checkPerm).chain(Unchecked.function(clubModel -> {
try {
return Utils.getMediaFile(clubModel.getId(), media, "clubStatus",
"statue-" + clubModel.getName(), Uni.createFrom().nullItem());
"statue-" + clubModel.getName(), Uni.createFrom().nullItem(), false);
} catch (URISyntaxException e) {
throw new InternalError();
}

View File

@@ -47,4 +47,12 @@ public class CompetitionAdminEndpoints {
public Uni<List<CompetitionData>> getAllSystemAdmin(@PathParam("system") CompetitionSystem system) {
return service.getAllSystemAdmin(securityCtx, system);
}
@GET
@Path("all/{system}/table")
@Authenticated
@Produces(MediaType.APPLICATION_JSON)
public Uni<List<CompetitionData>> getAllSystemTable(@PathParam("system") CompetitionSystem system) {
return service.getAllSystemTable(securityCtx, system);
}
}

View File

@@ -1,5 +1,6 @@
package fr.titionfire.ffsaf.rest.data;
import fr.titionfire.ffsaf.data.model.CompetitionGuestModel;
import fr.titionfire.ffsaf.data.model.CompetitionModel;
import fr.titionfire.ffsaf.data.model.RegisterModel;
import fr.titionfire.ffsaf.utils.Categorie;
@@ -11,6 +12,7 @@ import lombok.Data;
import java.util.Date;
import java.util.List;
import java.util.stream.Stream;
@Data
@AllArgsConstructor
@@ -67,10 +69,15 @@ public class CompetitionData {
return out;
}
public CompetitionData addInsc(List<RegisterModel> insc) {
this.registers = insc.stream()
public CompetitionData addInsc(List<RegisterModel> insc, List<CompetitionGuestModel> guests) {
this.registers = Stream.concat(
insc.stream()
.map(i -> new SimpleRegister(i.getMembre().getId(), i.getOverCategory(), i.getWeight(),
i.getCategorie(), (i.getClub() == null) ? null : i.getClub().getId())).toList();
i.getCategorie(), (i.getClub() == null) ? null : i.getClub().getId(),
(i.getClub() == null) ? null : i.getClub().getName())),
guests.stream()
.map(i -> new SimpleRegister(i.getId() * -1, 0, i.getWeight(),
i.getCategorie(), null, i.getClub()))).toList();
return this;
}
@@ -83,5 +90,6 @@ public class CompetitionData {
Integer weight;
Categorie categorie;
Long club;
String club_str;
}
}

View File

@@ -1,5 +1,7 @@
package fr.titionfire.ffsaf.rest.data;
import fr.titionfire.ffsaf.utils.Categorie;
import fr.titionfire.ffsaf.utils.Genre;
import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.AllArgsConstructor;
import lombok.Data;
@@ -17,4 +19,11 @@ public class RegisterRequestData {
private Integer weight;
private int overCategory;
private boolean lockEdit = false;
// for guest registration only
private Long id = null;
private Categorie categorie = Categorie.CADET;
private Genre genre = Genre.NA;
private String club = null;
private String country = null;
}

View File

@@ -1,9 +1,12 @@
package fr.titionfire.ffsaf.rest.data;
import fr.titionfire.ffsaf.data.model.CompetitionGuestModel;
import fr.titionfire.ffsaf.data.model.LicenceModel;
import fr.titionfire.ffsaf.data.model.MembreModel;
import fr.titionfire.ffsaf.data.model.RegisterModel;
import fr.titionfire.ffsaf.net2.data.SimpleClubModel;
import fr.titionfire.ffsaf.utils.Categorie;
import fr.titionfire.ffsaf.utils.Genre;
import fr.titionfire.ffsaf.utils.Utils;
import io.quarkus.runtime.annotations.RegisterForReflection;
import lombok.AllArgsConstructor;
@@ -18,8 +21,9 @@ public class SimpleRegisterComb {
private long id;
private String fname;
private String lname;
private String genre;
private String categorie;
private Genre genre;
private String country;
private Categorie categorie;
private SimpleClubModel club;
private Integer licence;
private Integer weight;
@@ -30,11 +34,18 @@ public class SimpleRegisterComb {
public static SimpleRegisterComb fromModel(RegisterModel register, List<LicenceModel> licences) {
MembreModel membreModel = register.getMembre();
return new SimpleRegisterComb(membreModel.getId(), membreModel.getFname(), membreModel.getLname(),
membreModel.getGenre().name(),
(register.getCategorie() == null) ? "Catégorie inconnue" : register.getCategorie().getName(),
membreModel.getGenre(), membreModel.getCountry(),
(register.getCategorie() == null) ? null : register.getCategorie(),
SimpleClubModel.fromModel(register.getClub()), membreModel.getLicence(), register.getWeight(),
register.getOverCategory(),
licences.stream().anyMatch(l -> l.isValidate() && l.getSaison() == Utils.getSaison()),
register.isLockEdit());
}
public static SimpleRegisterComb fromModel(CompetitionGuestModel guest) {
return new SimpleRegisterComb(guest.getId() * -1, guest.getFname(), guest.getLname(),
guest.getGenre(), guest.getCountry(), guest.getCategorie(),
new SimpleClubModel(null, guest.getClub(), "fr", null),
null, guest.getWeight(), 0, false, false);
}
}

View File

@@ -150,11 +150,16 @@ public class Utils {
public static Uni<Response> getMediaFile(long id, String media, String dirname,
Uni<?> uniBase) throws URISyntaxException {
return getMediaFile(id, media, dirname, null, uniBase);
return getMediaFile(id, media, dirname, null, uniBase, true);
}
public static Uni<Response> getMediaFileNoDefault(long id, String media, String dirname,
Uni<?> uniBase) throws URISyntaxException {
return getMediaFile(id, media, dirname, null, uniBase, false);
}
public static Uni<Response> getMediaFile(long id, String media, String dirname, String out_filename,
Uni<?> uniBase) throws URISyntaxException {
Uni<?> uniBase, boolean default_) throws URISyntaxException {
Future<Pair<File, byte[]>> future = CompletableFuture.supplyAsync(() -> {
FilenameFilter filter = (directory, filename) -> filename.startsWith(id + ".");
File[] files = new File(media, dirname).listFiles(filter);
@@ -182,6 +187,7 @@ public class Utils {
return uniBase.chain(__ -> Uni.createFrom().future(future)
.chain(filePair -> {
if (filePair == null) {
if (default_) {
return Uni.createFrom().future(future2).map(data -> {
if (data == null)
return Response.noContent().build();
@@ -195,6 +201,11 @@ public class Utils {
"inline; " + ((out_filename == null) ? "" : "filename=\"" + out_filename + "\""));
return resp.build();
});
} else {
Response.ResponseBuilder resp = Response.status(404);
resp.header(HttpHeaders.CACHE_CONTROL, "max-age=600");
return Uni.createFrom().item(resp.build());
}
} else {
return Uni.createFrom().item(() -> {
String mimeType = URLConnection.guessContentTypeFromName(filePair.getKey().getName());

View File

@@ -6,9 +6,7 @@ import fr.titionfire.ffsaf.domain.service.CompetPermService;
import fr.titionfire.ffsaf.net2.MessageType;
import fr.titionfire.ffsaf.utils.SecurityCtx;
import fr.titionfire.ffsaf.ws.data.WelcomeInfo;
import fr.titionfire.ffsaf.ws.recv.RCategorie;
import fr.titionfire.ffsaf.ws.recv.RMatch;
import fr.titionfire.ffsaf.ws.recv.WSReceiver;
import fr.titionfire.ffsaf.ws.recv.*;
import fr.titionfire.ffsaf.ws.send.JsonUni;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.security.Authenticated;
@@ -40,6 +38,12 @@ public class CompetitionWS {
@Inject
RCategorie rCategorie;
@Inject
RRegister rRegister;
@Inject
RCardboard rCardboard;
@Inject
SecurityCtx securityCtx;
@@ -72,6 +76,8 @@ public class CompetitionWS {
void init() {
getWSReceiverMethods(RMatch.class, rMatch);
getWSReceiverMethods(RCategorie.class, rCategorie);
getWSReceiverMethods(RRegister.class, rRegister);
getWSReceiverMethods(RCardboard.class, rCardboard);
}
@OnOpen
@@ -125,7 +131,7 @@ public class CompetitionWS {
@OnTextMessage
Multi<MessageOut> processAsync(WebSocketConnection connection, MessageIn message) {
System.out.println(message);
if (message.type() == MessageType.REPLY || message.type() == MessageType.ERROR) {
try {
JsonUni<?> jsonUni = waitingResponse.get(connection).get(message.uuid());

View File

@@ -0,0 +1,128 @@
package fr.titionfire.ffsaf.ws.recv;
import fr.titionfire.ffsaf.data.model.CardboardModel;
import fr.titionfire.ffsaf.data.model.MatchModel;
import fr.titionfire.ffsaf.data.repository.CardboardRepository;
import fr.titionfire.ffsaf.data.repository.MatchRepository;
import fr.titionfire.ffsaf.domain.entity.CardboardEntity;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.rest.exception.DNotFoundException;
import fr.titionfire.ffsaf.ws.PermLevel;
import fr.titionfire.ffsaf.ws.send.SSCardboard;
import io.quarkus.hibernate.reactive.panache.Panache;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import lombok.Data;
import java.util.Objects;
@WithSession
@ApplicationScoped
@RegisterForReflection
public class RCardboard {
@Inject
MatchRepository matchRepository;
@Inject
CardboardRepository cardboardRepository;
private Uni<MatchModel> getById(long id, WebSocketConnection connection) {
return matchRepository.findById(id)
.invoke(Unchecked.consumer(o -> {
if (o == null)
throw new DNotFoundException("Matche non trouver");
if (!o.getCategory().getCompet().getUuid().equals(connection.pathParam("uuid")))
throw new DForbiddenException("Permission denied");
}));
}
@WSReceiver(code = "sendCardboardChange", permission = PermLevel.TABLE)
public Uni<Void> sendCardboardChange(WebSocketConnection connection, SendCardboard card) {
return getById(card.matchId, connection)
.chain(matchModel -> cardboardRepository.find("(comb.id = ?1 OR guestComb.id = ?2) AND match.id = ?3",
card.combId, card.combId * -1, card.matchId).firstResult()
.chain(model -> {
if (model != null) {
model.setRed(model.getRed() + card.red);
model.setYellow(model.getYellow() + card.yellow);
return Panache.withTransaction(() -> cardboardRepository.persist(model));
}
CardboardModel cardboardModel = new CardboardModel();
cardboardModel.setCompet(matchModel.getCategory().getCompet());
cardboardModel.setMatch(matchModel);
cardboardModel.setRed(card.red);
cardboardModel.setYellow(card.yellow);
cardboardModel.setComb(null);
cardboardModel.setGuestComb(null);
if (card.combId >= 0) {
if (matchModel.getC1_id() != null && matchModel.getC1_id().getId() == card.combId)
cardboardModel.setComb(matchModel.getC1_id());
if (matchModel.getC2_id() != null && matchModel.getC2_id().getId() == card.combId)
cardboardModel.setComb(matchModel.getC2_id());
} else {
if (matchModel.getC1_guest() != null && matchModel.getC1_guest()
.getId() == card.combId * -1)
cardboardModel.setGuestComb(matchModel.getC1_guest());
if (matchModel.getC2_guest() != null && matchModel.getC2_guest()
.getId() == card.combId * -1)
cardboardModel.setGuestComb(matchModel.getC2_guest());
}
if (cardboardModel.getComb() == null && cardboardModel.getGuestComb() == null)
return Uni.createFrom().nullItem();
return Panache.withTransaction(() -> cardboardRepository.persist(cardboardModel));
}))
.call(model -> SSCardboard.sendCardboard(connection, CardboardEntity.fromModel(model)))
.replaceWithVoid();
}
@WSReceiver(code = "getCardboardWithoutThis", permission = PermLevel.VIEW)
public Uni<CardboardAllMatch> getCardboardWithoutThis(WebSocketConnection connection, Long matchId) {
return getById(matchId, connection)
.chain(matchModel -> cardboardRepository.list("compet = ?1 AND match != ?2", matchModel.getCategory().getCompet(), matchModel)
.map(models -> {
CardboardAllMatch out = new CardboardAllMatch();
models.stream().filter(c -> (matchModel.getC1_id() != null
&& Objects.equals(c.getComb(), matchModel.getC1_id()))
|| (matchModel.getC1_guest() != null
&& Objects.equals(c.getGuestComb(), matchModel.getC1_guest())))
.forEach(c -> {
out.c1_yellow += c.getYellow();
out.c1_red += c.getRed();
});
models.stream().filter(c -> (matchModel.getC2_id() != null
&& Objects.equals(c.getComb(), matchModel.getC2_id()))
|| (matchModel.getC2_guest() != null
&& Objects.equals(c.getGuestComb(), matchModel.getC2_guest())))
.forEach(c -> {
out.c2_yellow += c.getYellow();
out.c2_red += c.getRed();
});
return out;
}));
}
@RegisterForReflection
public record SendCardboard(long matchId, long combId, int yellow, int red) {
}
@Data
@RegisterForReflection
public static class CardboardAllMatch {
int c1_yellow = 0;
int c1_red = 0;
int c2_yellow = 0;
int c2_red = 0;
}
}

View File

@@ -12,8 +12,8 @@ import fr.titionfire.ffsaf.domain.entity.TreeEntity;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.rest.exception.DNotFoundException;
import fr.titionfire.ffsaf.utils.TreeNode;
import fr.titionfire.ffsaf.ws.CompetitionWS;
import fr.titionfire.ffsaf.ws.PermLevel;
import fr.titionfire.ffsaf.ws.send.SSCategorie;
import io.quarkus.hibernate.reactive.panache.Panache;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.runtime.annotations.RegisterForReflection;
@@ -97,8 +97,7 @@ public class RCategorie {
return categoryRepository.create(categoryModel);
})
.call(cat -> CompetitionWS.sendNotifyToOtherEditor(connection, "sendAddCategory",
JustCategorie.from(cat)))
.call(cat -> SSCategorie.sendAddCategory(connection, cat))
.map(CategoryModel::getId);
}
@@ -121,7 +120,7 @@ public class RCategorie {
}
return uni;
})
.call(cat -> CompetitionWS.sendNotifyToOtherEditor(connection, "sendCategory", JustCategorie.from(cat)))
.call(cat -> SSCategorie.sendCategory(connection, cat))
.replaceWithVoid();
}
@@ -202,13 +201,13 @@ public class RCategorie {
.call(__ -> treeRepository.flush())
.call(cat -> treeRepository.list("category = ?1 AND level != 0", cat.getId())
.map(treeModels -> treeModels.stream().map(TreeEntity::fromModel).toList())
.chain(trees -> CompetitionWS.sendNotifyToOtherEditor(connection, "sendTreeCategory", trees)))
.chain(trees -> SSCategorie.sendTreeCategory(connection, trees)))
.replaceWithVoid();
}
@RegisterForReflection
public record JustCategorie(long id, String name, int type, String liceName) {
static JustCategorie from(CategoryModel m) {
public static JustCategorie from(CategoryModel m) {
return new JustCategorie(m.getId(), m.getName(), m.getType(), m.getLiceName());
}
}

View File

@@ -1,14 +1,28 @@
package fr.titionfire.ffsaf.ws.recv;
import fr.titionfire.ffsaf.data.repository.MatchRepository;
import fr.titionfire.ffsaf.data.model.*;
import fr.titionfire.ffsaf.data.repository.*;
import fr.titionfire.ffsaf.domain.entity.MatchEntity;
import fr.titionfire.ffsaf.domain.entity.TreeEntity;
import fr.titionfire.ffsaf.rest.exception.DForbiddenException;
import fr.titionfire.ffsaf.rest.exception.DNotFoundException;
import fr.titionfire.ffsaf.utils.ScoreEmbeddable;
import fr.titionfire.ffsaf.ws.PermLevel;
import fr.titionfire.ffsaf.ws.send.SSMatch;
import io.quarkus.hibernate.reactive.panache.Panache;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.panache.common.Sort;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
import io.smallrye.mutiny.unchecked.Unchecked;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.jboss.logging.Logger;
import java.util.*;
import java.util.stream.Stream;
@WithSession
@ApplicationScoped
@RegisterForReflection
@@ -18,12 +32,315 @@ public class RMatch {
@Inject
MatchRepository matchRepository;
@WSReceiver(code = "getAllMatch")
public Uni<?> getAllMatch(WebSocketConnection connection, Long l) {
LOGGER.info("getAllMatch " + l);
@Inject
CombRepository combRepository;
return Uni.createFrom().item(l);
//return matchRepository.count();
@Inject
CategoryRepository categoryRepository;
@Inject
TreeRepository treeRepository;
@Inject
CompetitionGuestRepository competitionGuestRepository;
private Uni<MatchModel> getById(long id, WebSocketConnection connection) {
return matchRepository.findById(id)
.invoke(Unchecked.consumer(o -> {
if (o == null)
throw new DNotFoundException("Matche non trouver");
if (!o.getCategory().getCompet().getUuid().equals(connection.pathParam("uuid")))
throw new DForbiddenException("Permission denied");
}));
}
private Uni<MatchModel> creatMatch(CategoryModel categoryModel, AddMatch m) {
return Uni.createFrom().item(() -> {
MatchModel matchModel = new MatchModel();
matchModel.setCategory(categoryModel);
matchModel.setCategory_ord(m.categorie_ord);
matchModel.setEnd(false);
matchModel.setPoule(m.poule);
return matchModel;
})
.call(mm -> m.c1() >= 0 ?
combRepository.findById(m.c1()).invoke(mm::setC1_id) :
competitionGuestRepository.findById(m.c1() * -1).invoke(mm::setC1_guest))
.call(mm -> m.c2() >= 0 ?
combRepository.findById(m.c2()).invoke(mm::setC2_id) :
competitionGuestRepository.findById(m.c2() * -1).invoke(mm::setC2_guest));
}
@WSReceiver(code = "addMatch", permission = PermLevel.ADMIN)
public Uni<Void> addMatch(WebSocketConnection connection, AddMatch m) {
return categoryRepository.findById(m.categorie)
.invoke(Unchecked.consumer(o -> {
if (o == null)
throw new DNotFoundException("Catégorie non trouver");
if (!o.getCompet().getUuid().equals(connection.pathParam("uuid")))
throw new DForbiddenException("Permission denied");
}))
.chain(categoryModel -> creatMatch(categoryModel, m))
.chain(mm -> Panache.withTransaction(() -> matchRepository.create(mm)))
.call(mm -> SSMatch.sendMatch(connection, MatchEntity.fromModel(mm)))
.replaceWithVoid();
}
@WSReceiver(code = "updateMatchComb", permission = PermLevel.ADMIN)
public Uni<Void> updateMatchComb(WebSocketConnection connection, MatchComb match) {
return getById(match.id(), connection)
.call(mm -> match.c1() != null ?
match.c1() >= 0 ?
combRepository.findById(match.c1()).invoke(model -> {
mm.setC1_id(model);
mm.setC1_guest(null);
}) :
competitionGuestRepository.findById(match.c1() * -1).invoke(model -> {
mm.setC1_id(null);
mm.setC1_guest(model);
}) :
Uni.createFrom().nullItem().invoke(__ -> {
mm.setC1_id(null);
mm.setC1_guest(null);
}))
.call(mm -> match.c2() != null ?
match.c2() >= 0 ?
combRepository.findById(match.c2()).invoke(model -> {
mm.setC2_id(model);
mm.setC2_guest(null);
}) :
competitionGuestRepository.findById(match.c2() * -1).invoke(model -> {
mm.setC2_id(null);
mm.setC2_guest(model);
}) :
Uni.createFrom().nullItem().invoke(__ -> {
mm.setC2_id(null);
mm.setC2_guest(null);
}))
.chain(mm -> Panache.withTransaction(() -> matchRepository.persist(mm)))
.call(mm -> SSMatch.sendMatch(connection, MatchEntity.fromModel(mm)))
.replaceWithVoid();
}
@WSReceiver(code = "updateMatchOrder", permission = PermLevel.ADMIN)
public Uni<Void> updateMatchComb(WebSocketConnection connection, MatchOrder order) {
return getById(order.id(), connection)
.call(m -> matchRepository.update(
"category_ord = category_ord + 1 WHERE category_ord >= ?1 AND category_ord < ?2", order.pos,
m.getCategory_ord()))
.call(m -> matchRepository.update(
"category_ord = category_ord - 1 WHERE category_ord <= ?1 AND category_ord > ?2", order.pos,
m.getCategory_ord()))
.invoke(m -> m.setCategory_ord(order.pos))
.call(m -> Panache.withTransaction(() -> matchRepository.persist(m)))
.call(mm -> SSMatch.sendMatchOrder(connection, order))
.replaceWithVoid();
}
@WSReceiver(code = "updateMatchScore", permission = PermLevel.TABLE)
public Uni<Void> updateMatchScore(WebSocketConnection connection, MatchScore score) {
return getById(score.matchId(), connection)
.chain(matchModel -> {
int old_win = matchModel.win();
Optional<ScoreEmbeddable> optional = matchModel.getScores().stream()
.filter(s -> s.getN_round() == score.n_round()).findAny();
boolean b = score.s1() != -1000 || score.s2() != -1000;
if (optional.isPresent()) {
if (b) {
optional.get().setS1(score.s1());
optional.get().setS2(score.s2());
} else {
matchModel.getScores().remove(optional.get());
}
} else if (b) {
matchModel.getScores().add(new ScoreEmbeddable(score.n_round(), score.s1(), score.s2()));
}
return Panache.withTransaction(() -> matchRepository.persist(matchModel))
.call(mm -> {
if (mm.isEnd() && mm.win() != old_win && mm.getCategory_ord() == -42) {
return updateEndAndTree(mm, new ArrayList<>())
.call(l -> SSMatch.sendMatch(connection, l));
}
return Uni.createFrom().nullItem();
});
})
.call(mm -> SSMatch.sendMatch(connection, MatchEntity.fromModel(mm)))
.replaceWithVoid();
}
@WSReceiver(code = "updateMatchEnd", permission = PermLevel.TABLE)
public Uni<Void> updateMatchEnd(WebSocketConnection connection, MatchEnd matchEnd) {
List<MatchEntity> toSend = new ArrayList<>();
return getById(matchEnd.matchId(), connection)
.chain(mm -> {
if (mm.getCategory_ord() == -42 && mm.win() == 0) { // Tournois
mm.setDate(null);
mm.setEnd(false);
} else {
mm.setDate((matchEnd.end) ? new Date() : null);
mm.setEnd(matchEnd.end);
}
return Panache.withTransaction(() -> matchRepository.persist(mm));
})
.invoke(mm -> toSend.add(MatchEntity.fromModel(mm)))
.chain(mm -> updateEndAndTree(mm, toSend))
.call(__ -> SSMatch.sendMatch(connection, toSend))
.replaceWithVoid();
}
private Uni<List<MatchEntity>> updateEndAndTree(MatchModel mm, List<MatchEntity> toSend) {
return (mm.getCategory_ord() != -42) ?
Uni.createFrom().item(toSend) :
treeRepository.list("category = ?1 AND level != 0", Sort.ascending("level"), mm.getCategory().getId())
.chain(treeModels -> {
List<TreeModel> node = treeModels.stream().flatMap(t -> t.flat().stream()).toList();
List<TreeEntity> trees = treeModels.stream().map(TreeEntity::fromModel).toList();
for (int i = 0; i < trees.size() - 1; i++) {
TreeEntity.setAssociated(trees.get(i), trees.get(i + 1));
}
TreeEntity root = trees.stream()
.filter(t -> t.getMatchNode(mm.getId()) != null)
.findFirst()
.orElseThrow();
TreeEntity currentNode = root.getMatchNode(mm.getId());
if (currentNode == null) {
LOGGER.error(
"currentNode is empty for " + mm.getId() + " in " + mm.getCategory().getId());
return Uni.createFrom().voidItem();
}
TreeEntity parent = TreeEntity.getParent(root, currentNode);
if (parent == null) {
LOGGER.error("parent is empty for " + mm.getId() + " in " + mm.getCategory().getId());
return Uni.createFrom().voidItem();
}
int w = mm.win();
MembreModel toSetWin = null;
MembreModel toSetLose = null;
CompetitionGuestModel toSetWinGuest = null;
CompetitionGuestModel toSetLoseGuest = null;
if (mm.isEnd() && w != 0) {
toSetWin = (w > 0) ? mm.getC1_id() : mm.getC2_id();
toSetLose = (w > 0) ? mm.getC2_id() : mm.getC1_id();
toSetWinGuest = (w > 0) ? mm.getC1_guest() : mm.getC2_guest();
toSetLoseGuest = (w > 0) ? mm.getC2_guest() : mm.getC1_guest();
}
MatchModel modelWin = node.stream()
.filter(n -> Objects.equals(n.getId(), parent.getId()))
.findAny()
.map(TreeModel::getMatch)
.orElseThrow();
MatchModel modelLose = (parent.getAssociatedNode() == null) ? null : node.stream()
.filter(n -> Objects.equals(n.getId(), parent.getAssociatedNode().getId()))
.findAny()
.map(TreeModel::getMatch)
.orElseThrow();
if (currentNode.equals(parent.getLeft())) {
modelWin.setC1_id(toSetWin);
modelWin.setC1_guest(toSetWinGuest);
if (modelLose != null) {
modelLose.setC1_id(toSetLose);
modelLose.setC1_guest(toSetLoseGuest);
}
} else if (currentNode.equals(parent.getRight())) {
modelWin.setC2_id(toSetWin);
modelWin.setC2_guest(toSetWinGuest);
if (modelLose != null) {
modelLose.setC2_id(toSetLose);
modelLose.setC2_guest(toSetLoseGuest);
}
}
return Panache.withTransaction(() -> matchRepository.persist(modelWin)
.invoke(mm2 -> toSend.add(MatchEntity.fromModel(mm2)))
.call(__ -> modelLose == null ? Uni.createFrom().nullItem() :
matchRepository.persist(modelLose)
.invoke(mm2 -> toSend.add(MatchEntity.fromModel(mm2)))
)
.replaceWithVoid());
})
.map(__ -> toSend);
}
@WSReceiver(code = "deleteMatch", permission = PermLevel.ADMIN)
public Uni<Void> deleteMatch(WebSocketConnection connection, Long idMatch) {
return getById(idMatch, connection)
.chain(matchModel -> Panache.withTransaction(() -> matchRepository.delete(matchModel)))
.call(__ -> SSMatch.sendDeleteMatch(connection, idMatch))
.replaceWithVoid();
}
@WSReceiver(code = "recalculateMatch", permission = PermLevel.ADMIN)
public Uni<Void> recalculateMatch(WebSocketConnection connection, RecalculateMatch data) {
ArrayList<MatchEntity> matches = new ArrayList<>();
return categoryRepository.findById(data.categorie)
.invoke(Unchecked.consumer(o -> {
if (o == null)
throw new DNotFoundException("Catégorie non trouver");
if (!o.getCompet().getUuid().equals(connection.pathParam("uuid")))
throw new DForbiddenException("Permission denied");
}))
.call(cm -> matchRepository.delete("id IN ?1 AND category = ?2", data.matchesToRemove, cm)
.call(__ -> SSMatch.sendDeleteMatch(connection, data.matchesToRemove)))
.call(cm -> matchRepository.list("id IN ?1 AND category = ?2",
Stream.concat(data.matchOrderToUpdate.keySet().stream(),
data.matchPouleToUpdate.keySet().stream())
.distinct().toList(), cm)
.invoke(matchModels -> matchModels.forEach(model -> {
if (data.matchPouleToUpdate.containsKey(model.getId()))
model.setPoule(data.matchPouleToUpdate.get(model.getId()));
if (data.matchOrderToUpdate.containsKey(model.getId()))
model.setCategory_ord(data.matchOrderToUpdate.get(model.getId()));
}))
.call(mm -> Panache.withTransaction(() -> matchRepository.persist(mm)))
.invoke(mm -> matches.addAll(mm.stream().map(MatchEntity::fromModel).toList()))
)
.chain(categoryModel -> {
Uni<List<MatchModel>> uni = Uni.createFrom().item(new ArrayList<>());
for (AddMatch match : data.newMatch)
uni = uni.call(l -> creatMatch(categoryModel, match).invoke(l::add));
return uni;
}
)
.chain(mm -> Panache.withTransaction(() -> matchRepository.create(mm))
.invoke(__ -> matches.addAll(mm.stream().map(MatchEntity::fromModel).toList())))
.call(__ -> SSMatch.sendMatch(connection, matches))
.replaceWithVoid();
}
@RegisterForReflection
public record MatchComb(long id, Long c1, Long c2) {
}
@RegisterForReflection
public record MatchScore(long matchId, int n_round, int s1, int s2) {
}
@RegisterForReflection
public record MatchEnd(long matchId, boolean end) {
}
@RegisterForReflection
public record MatchOrder(long id, long pos) {
}
@RegisterForReflection
public record AddMatch(long categorie, long categorie_ord, char poule, long c1, long c2) {
}
public record RecalculateMatch(long categorie, List<AddMatch> newMatch, HashMap<Long, Integer> matchOrderToUpdate,
HashMap<Long, Character> matchPouleToUpdate, List<Long> matchesToRemove) {
}
}

View File

@@ -0,0 +1,37 @@
package fr.titionfire.ffsaf.ws.recv;
import fr.titionfire.ffsaf.data.repository.CompetitionRepository;
import fr.titionfire.ffsaf.domain.entity.CombEntity;
import fr.titionfire.ffsaf.ws.PermLevel;
import io.quarkus.hibernate.reactive.panache.common.WithSession;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import org.hibernate.reactive.mutiny.Mutiny;
import java.util.ArrayList;
import java.util.List;
@WithSession
@ApplicationScoped
@RegisterForReflection
public class RRegister {
@Inject
CompetitionRepository competitionRepository;
@WSReceiver(code = "getRegister", permission = PermLevel.TABLE)
public Uni<List<CombEntity>> getRegister(WebSocketConnection connection, Object o) {
return competitionRepository.find("uuid", connection.pathParam("uuid")).firstResult()
.call(cm -> Mutiny.fetch(cm.getInsc()))
.call(cm -> Mutiny.fetch(cm.getGuests()))
.map(cm -> {
ArrayList<CombEntity> combEntities = new ArrayList<>();
combEntities.addAll(cm.getInsc().stream().map(CombEntity::fromModel).toList());
combEntities.addAll(cm.getGuests().stream().map(CombEntity::fromModel).toList());
return combEntities;
});
}
}

View File

@@ -0,0 +1,53 @@
package fr.titionfire.ffsaf.ws.send;
import fr.titionfire.ffsaf.data.model.CompetitionGuestModel;
import fr.titionfire.ffsaf.data.model.RegisterModel;
import fr.titionfire.ffsaf.domain.entity.CombEntity;
import fr.titionfire.ffsaf.net2.MessageType;
import fr.titionfire.ffsaf.ws.CompetitionWS;
import fr.titionfire.ffsaf.ws.MessageOut;
import fr.titionfire.ffsaf.ws.PermLevel;
import io.quarkus.runtime.annotations.RegisterForReflection;
import io.quarkus.websockets.next.OpenConnections;
import io.quarkus.websockets.next.UserData;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.List;
import java.util.UUID;
@ApplicationScoped
@RegisterForReflection
public class SRegister {
@SuppressWarnings("CdiInjectionPointsInspection")
@Inject
OpenConnections connections;
public Uni<Void> sendRegister(String uuid, RegisterModel registerModel) {
return send(uuid, "sendRegister", CombEntity.fromModel(registerModel));
}
public Uni<Void> sendRegister(String uuid, CompetitionGuestModel model) {
return send(uuid, "sendRegister", CombEntity.fromModel(model));
}
public Uni<Void> sendRegisterRemove(String uuid, Long combId) {
return send(uuid, "sendRegisterRemove", combId);
}
public Uni<Void> send(String uuid, String code, Object data) {
List<Uni<Void>> queue = connections.findByEndpointId(CompetitionWS.class.getCanonicalName()).stream()
.filter(c -> c.pathParam("uuid").equals(uuid) && PermLevel.valueOf(
c.userData().get(UserData.TypedKey.forString("prem"))).ordinal() >= PermLevel.TABLE.ordinal())
.map(c -> c.sendText(
new MessageOut(UUID.randomUUID(), code, MessageType.NOTIFY, data)))
.toList();
if (queue.isEmpty())
return Uni.createFrom().voidItem();
return Uni.join().all(queue).andCollectFailures().replaceWithVoid();
}
}

View File

@@ -0,0 +1,13 @@
package fr.titionfire.ffsaf.ws.send;
import fr.titionfire.ffsaf.domain.entity.CardboardEntity;
import fr.titionfire.ffsaf.ws.CompetitionWS;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
public class SSCardboard {
public static Uni<Void> sendCardboard(WebSocketConnection connection, CardboardEntity cardboardEntity) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendCardboard", cardboardEntity);
}
}

View File

@@ -0,0 +1,33 @@
package fr.titionfire.ffsaf.ws.send;
import fr.titionfire.ffsaf.data.model.CategoryModel;
import fr.titionfire.ffsaf.domain.entity.TreeEntity;
import fr.titionfire.ffsaf.ws.CompetitionWS;
import fr.titionfire.ffsaf.ws.recv.RCategorie;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
import java.util.List;
public class SSCategorie {
public static Uni<Void> sendAddCategory(WebSocketConnection connection, CategoryModel category) {
return SSCategorie.sendAddCategory(connection, RCategorie.JustCategorie.from(category));
}
public static Uni<Void> sendAddCategory(WebSocketConnection connection, RCategorie.JustCategorie justCategorie) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendAddCategory", justCategorie);
}
public static Uni<Void> sendCategory(WebSocketConnection connection, CategoryModel category) {
return SSCategorie.sendCategory(connection, RCategorie.JustCategorie.from(category));
}
public static Uni<Void> sendCategory(WebSocketConnection connection, RCategorie.JustCategorie justCategorie) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendCategory", justCategorie);
}
public static Uni<Void> sendTreeCategory(WebSocketConnection connection, List<TreeEntity> treeEntities) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendTreeCategory", treeEntities);
}
}

View File

@@ -0,0 +1,32 @@
package fr.titionfire.ffsaf.ws.send;
import fr.titionfire.ffsaf.domain.entity.MatchEntity;
import fr.titionfire.ffsaf.ws.CompetitionWS;
import fr.titionfire.ffsaf.ws.recv.RMatch;
import io.quarkus.websockets.next.WebSocketConnection;
import io.smallrye.mutiny.Uni;
import java.util.List;
public class SSMatch {
public static Uni<Void> sendMatch(WebSocketConnection connection, MatchEntity matchEntity) {
return SSMatch.sendMatch(connection, List.of(matchEntity));
}
public static Uni<Void> sendMatch(WebSocketConnection connection, List<MatchEntity> matchEntities) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendMatch", matchEntities);
}
public static Uni<Void> sendMatchOrder(WebSocketConnection connection, RMatch.MatchOrder matchOrder) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendMatchOrder", matchOrder);
}
public static Uni<Void> sendDeleteMatch(WebSocketConnection connection, Long l) {
return SSMatch.sendDeleteMatch(connection, List.of(l));
}
public static Uni<Void> sendDeleteMatch(WebSocketConnection connection, List<Long> longs) {
return CompetitionWS.sendNotifyToOtherEditor(connection, "sendDeleteMatch", longs);
}
}

View File

@@ -8,6 +8,9 @@
"name": "webapp",
"version": "0.0.0",
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "^6.5.1",
@@ -399,6 +402,55 @@
"node": ">=6.9.0"
}
},
"node_modules/@dnd-kit/accessibility": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/accessibility/-/accessibility-3.1.1.tgz",
"integrity": "sha512-2P+YgaXF+gRsIihwwY1gCsQSYnu9Zyj2py8kY5fFvUM1qm2WA2u639R6YNVfU4GWr+ZM5mqEsfHZZLoRONbemw==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/core": {
"version": "6.3.1",
"resolved": "https://registry.npmjs.org/@dnd-kit/core/-/core-6.3.1.tgz",
"integrity": "sha512-xkGBRQQab4RLwgXxoqETICr6S5JlogafbhNsidmrkVv2YRs5MLwpjoF2qpiGjQt8S9AoxtIV603s0GIUpY5eYQ==",
"dependencies": {
"@dnd-kit/accessibility": "^3.1.1",
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0",
"react-dom": ">=16.8.0"
}
},
"node_modules/@dnd-kit/sortable": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@dnd-kit/sortable/-/sortable-10.0.0.tgz",
"integrity": "sha512-+xqhmIIzvAYMGfBYYnbKuNicfSsk4RksY2XdmJhT+HAC01nix6fHCztU68jooFiMUB01Ky3F0FyOvhG/BZrWkg==",
"dependencies": {
"@dnd-kit/utilities": "^3.2.2",
"tslib": "^2.0.0"
},
"peerDependencies": {
"@dnd-kit/core": "^6.3.0",
"react": ">=16.8.0"
}
},
"node_modules/@dnd-kit/utilities": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@dnd-kit/utilities/-/utilities-3.2.2.tgz",
"integrity": "sha512-+MKAJEOfaBe5SmV6t34p80MMKhjvUz0vRrvVJbPT0WElzaOJ/1xs+D+KDv+tD/NE5ujfrChEcshd4fLn0wpiqg==",
"dependencies": {
"tslib": "^2.0.0"
},
"peerDependencies": {
"react": ">=16.8.0"
}
},
"node_modules/@emotion/is-prop-valid": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz",

View File

@@ -10,6 +10,9 @@
"preview": "vite preview"
},
"dependencies": {
"@dnd-kit/core": "^6.3.1",
"@dnd-kit/sortable": "^10.0.0",
"@dnd-kit/utilities": "^3.2.2",
"@fortawesome/fontawesome-svg-core": "^6.5.1",
"@fortawesome/free-brands-svg-icons": "^6.5.1",
"@fortawesome/free-regular-svg-icons": "^6.5.1",

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 54 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 12 6"><path fill="#00843d" d="M0 0h12v6H0z"/><path fill="#fff" d="M0 2h12v4H0z"/><path d="M0 4h12v2H0z"/><path fill="#c8102e" d="M0 0h3v6H0z"/></svg>

After

Width:  |  Height:  |  Size: 228 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 217 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 138 92"><path fill="#fff" d="M0 0h138v92H0z"/><path d="M0 0h138l-9 46H9z"/><path fill="#fcd116" d="M69 46 39 36l15.288-2.926-13.004-8.555 15.244 3.147-8.741-12.879 12.879 8.741-3.147-15.244 8.555 13.004L69 6l2.926 15.288 8.555-13.004-3.147 15.244 12.879-8.741-8.741 12.879 15.244-3.147-13.004 8.555L99 36z"/><path fill="#0072c6" d="M9 36h120v20H9z"/><path fill="#ce1126" d="m0 0 69 92 69-92v92H0z"/></svg>

After

Width:  |  Height:  |  Size: 483 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600"><clipPath id="a"><path d="M0 0v150h700v150H600zm600 0H300v350H0v-50z"/></clipPath><path fill="#012169" d="M0 0h1200v600H0z"/><path stroke="#fff" stroke-width="60" d="m0 0 600 300m0-300L0 300"/><path stroke="#c8102e" stroke-width="40" d="m0 0 600 300m0-300L0 300" clip-path="url(#a)"/><path stroke="#fff" stroke-width="100" d="M300 0v350M0 150h700"/><path stroke="#c8102e" stroke-width="60" d="M300 0v350M0 150h700"/><path fill="#012169" d="M0 300h600V0h200v400H0z"/><path fill="#fff" d="M784.8 156c0 151.011 17.51 203.045 52.565 238.1C858.27 414.853 867.539 422.662 900 444c32.461-21.337 41.729-29.146 62.636-49.9 35.053-35.055 52.564-87.089 52.564-238.1-25.497 10.917-40.026 16.209-61.051 15.885-18.809-.29-38.737-9.024-54.149-15.885-15.412 6.86-35.34 15.595-54.148 15.885-21.026.324-35.555-4.968-61.052-15.885"/><g transform="matrix(3.50845 0 0 3.34488 -47.153 -59.398)"><path fill="#f90" d="M271 87c1.543 3.63 6.49 7.637 7.85 9.601-1.731 1.964-2.077 1.75-1.85 5.399 3.01-3.15 3.064-3.478 5-3 4.241 4.232.759 13.321-2.746 15.297-3.504 2.108-2.868-.073-8.12 2.569 2.408 2.059 5.198-.302 7.478.329 1.239 1.47-.589 4.149.374 6.672 2.015-.194 1.773-4.262 2.242-5.737C282.7 112.726 291.55 108.957 292 104c1.866-.876 3.731-.274 6 1-1.13-4.644-4.868-4.594-5.87-6.044-2.385-3.645-4.499-7.803-9.593-8.881-3.867-.82-3.578.246-6.056-1.444-1.543-1.202-6.231-3.474-5.481-1.631"/><circle cx="281.317" cy="91.128" r=".806" fill="#fff"/></g><g transform="matrix(-1.639 -2.95744 3.10207 -1.56258 1034.545 1220.517)"><path fill="#f90" d="M271 87c1.543 3.63 6.49 7.637 7.85 9.601-1.731 1.964-2.077 1.75-1.85 5.399 3.01-3.15 3.064-3.478 5-3 4.241 4.232.759 13.321-2.746 15.297-3.504 2.108-2.868-.073-8.12 2.569 2.408 2.059 5.198-.302 7.478.329 1.239 1.47-.589 4.149.374 6.672 2.015-.194 1.773-4.262 2.242-5.737C282.7 112.726 291.55 108.957 292 104c1.866-.876 3.731-.274 6 1-1.13-4.644-4.868-4.594-5.87-6.044-2.385-3.645-4.499-7.803-9.593-8.881-3.867-.82-3.578.246-6.056-1.444-1.543-1.202-6.231-3.474-5.481-1.631"/><circle cx="281.317" cy="91.128" r=".806" fill="#fff"/></g><g transform="matrix(-1.80698 2.86712 -3.00733 -1.72273 1682.51 -336.808)"><path fill="#f90" d="M271 87c1.543 3.63 6.49 7.637 7.85 9.601-1.731 1.964-2.077 1.75-1.85 5.399 3.01-3.15 3.064-3.478 5-3 4.241 4.232.759 13.321-2.746 15.297-3.504 2.108-2.868-.073-8.12 2.569 2.408 2.059 5.198-.302 7.478.329 1.239 1.47-.589 4.149.374 6.672 2.015-.194 1.773-4.262 2.242-5.737C282.7 112.726 291.55 108.957 292 104c1.866-.876 3.731-.274 6 1-1.13-4.644-4.868-4.594-5.87-6.044-2.385-3.645-4.499-7.803-9.593-8.881-3.867-.82-3.578.246-6.056-1.444-1.543-1.202-6.231-3.474-5.481-1.631"/><circle cx="281.317" cy="91.128" r=".806" fill="#fff"/></g><path fill="#9cf" d="M813.698 362.055c6.72 12.755 14.602 22.979 23.668 32.044C858.272 414.854 867.539 422.663 900 444c32.461-21.337 41.73-29.146 62.637-49.9 9.065-9.066 16.945-19.29 23.665-32.045z"/></svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.2 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600"><path fill="#F2A800" d="M0 0h1200v600H0z"/><path fill="#0033A0" d="M0 0h1200v400H0z"/><path fill="#D90012" d="M0 0h1200v200H0z"/></svg>

After

Width:  |  Height:  |  Size: 201 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path d="M0 0h900v600H0z"/><path fill="#cc092f" d="M0 0h900v300H0z"/><path d="M390.858 205.797h36.644l11.112-34.537 11.41 34.537h36.64l-29.433 21.926 11.409 35.135-30.026-21.324-29.731 21.324 11.41-35.135z" fill="#ffcb00" fill-rule="evenodd"/><path d="m524.801 394.706-28.827-22.53c29.127-23.724 48.052-60.064 48.052-100.605 0-61.866-44.144-113.824-102.411-126.137l4.504-21.025c8.11 1.803 17.624 5.217 25.432 7.916l7.51-12.608c8.1 3.9 17.118 7.803 24.621 12.608l-5.703 13.518c7.51 4.808 16.575 12.251 21.616 18.112l11.277-8.809c6.008 6.604 13.218 13.507 18.323 20.721l-10.211 10.512c6.594 9.68 9.143 14.135 14.004 25.287l14.327-3.36c2.706 8.408 6.814 18.702 8.32 27.408l-13.566 5.332c1.62 6.766 3.718 18.584 3.583 28.525-.011.598-.056 1.276-.056 1.878l14.167 2.021c-.6 8.712-.897 18.625-2.704 27.333h-14.714c-2.1 9.005-4.81 20.02-8.11 28.425l12.308 7.213c-3.901 7.805-7.8 17.117-12.908 24.626l-13.514-5.703c-5.11 7.505-10.81 14.71-17.118 21.321l8.706 11.41c-2.398 2.1-4.502 4.205-6.908 6.61m-63.362-2.704 21.772 13.12c-2.03 1.857-8.112 5.006-9.724 5.644l3.56 13.666c-8.407 2.708-17.42 6.608-26.724 8.412l-5.405-13.513c-8.71 1.8-17.416 3-26.427 3l-1.807 14.114c-8.406-.598-18.617 0-27.928-2.102v-14.11c-8.411-1.506-16.519-3.606-24.324-6.312l-6.91 12.322c-7.207-3.01-16.816-6.615-24.628-11.416l5.108-13.514c-6.31-3.307-12.015-7.509-17.42-11.72l13.515-17.118c22.226 17.722 50.153 28.228 80.787 28.228 16.221 0 32.132-2.697 46.555-8.7" fill="#ffcb00" fill-rule="evenodd"/><path d="M552.192 426.811 408.462 317.43l-1.31 1.866 143.36 109.573-8.509 10.647-139.753-89.64c-37.839-23.726-36.337-42.344-28.528-62.466l6.608-16.217c3.605 21.023 25.223 36.944 47.748 54.658l126.914 97.497zm36.084 32.6a2.23 2.23 0 0 1-2.23-2.238 2.23 2.23 0 0 1 2.23-2.232c1.237 0 2.24 1 2.24 2.232a2.238 2.238 0 0 1-2.24 2.239m-8.59-6.308a2.24 2.24 0 0 1-2.237-2.235 2.236 2.236 0 1 1 2.237 2.235m-8.79-7.006c-1.232 0-2.236-1-2.236-2.231a2.236 2.236 0 0 1 4.47 0c0 1.231-1 2.231-2.234 2.231m29.554 12.4-43.065-33.365-12.514 16.127 37.41 26.235c3.005 2.1 3.3 11.718 14.407 13.222 4.513.596 7.508-2.71 7.508-2.71 4.84-5.892 3.521-14.003-3.746-19.51" fill="#ffcb00" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

@@ -0,0 +1 @@
<svg width="900" height="600" xml:space="preserve" xmlns="http://www.w3.org/2000/svg"><path fill="#009edb" d="M0 0h900v600H0Z"/><path d="M435.583 51.758c-.47-.08-.957.322-1.474 1.318-2.452 4.904-3.45 8.81-4.142 11.8-.655 2.901-5.053 2.911-6.892 3.524-1.839.613-2.169 6.417-3.983 4.062-5.75-7.433-9.504-7.74-14.408-7.126-2.913 1.456 4.522 5.287 2.453 9.807-14.711 0-17.163 4.904-19.615 19.615-4.597-4.444-8.888 6.283-22.067 9.807.23 3.142 1.532 11.265 0 14.713-.172.86 2.806 2.67 1.852 6.28-.95 3.61-8.054 4.652-9.236 9.034-1.184 4.382 3.018 3.291 2.153 6.47-.866 3.178-4.728 3.345-2.66 14.15-.46 1.991-4.37 5.747-4.37 5.747s-2.827 3.17 1.39 7.594c-6.943 5.393-6.483 17.347-6.292 21.829-7.048-1.84-12.26 2.45-12.26 2.45l2.45 9.81c-19.614 7.354-26.587 1.913-29.497 5.36-2.873 4.33-10.228 6.188-24.643 6.927-2.554.286-4.09 4.875-12.059 4.875-7.356-2.452-12.26-12.26-22.067-19.615l-22.067-7.357c-7.356-4.904-9.808-9.806-19.615-14.71l-17.162-7.358c-12.26-7.354-20.763-32.716-26.97-26.97 0 17.164 4.903 41.682 14.71 53.942 7.356 4.904 9.809 7.356 17.165 9.808 4.903 7.356 4.901 7.356 12.257 12.26-12.258 4.902-12.258 2.45-17.162 14.71 7.586 2.681 2.758 6.301 6.743 9.462 3.984 3.16 6.283 1.953 9.425 4.253 2.22-.767.994-3.908.994-3.908s2.836-5.133 4.905-2.45c4.215 10.265 9.808 7.355 9.808 7.355.613 2.452-1.151 8.043.267 8.966 4.405 2.834.344 9.653 1.11 10.573 4.598 1.84 5.134-7.586 6.552-7.204 1.417.386 1.878-.075 4.33-.075 0 9.806 0 9.806 4.903 19.614 0 0-5.515.076-7.393.766 2.95 7.74-12.298 15.86-12.068 19.078-.536 1.609 2.453 25.516 4.751 29.193 1.457 2.3-14.712 0-14.712 0 0 19.615 4.905 24.518 24.52 26.97 0 0-3.526-6.742-2.453-7.355 5.286-4.828 4.905 9.807 4.905 9.807 20.993 8.888-2.452 6.36 7.355 19.615l9.807-2.45c2.452 26.97 7.355 12.259 2.453 41.682h12.257v14.71c24.519-7.356 17.164 4.903 31.875 9.807l17.162 4.902 19.615 9.81v-4.905s30.19 1.762 33.178 2.758c6.59.307 2.835-7.277 12.643-7.277.65 0 11.186 7.106 14.05-2.184-.723 9.554 18.437 5.094 22.573 5.016 4.522 0 30.496 17.317 45.207 12.414 7.204-2.607 7.204-12.105 12.107-10.727 1.608 0 9.807 22.067 9.807 22.067 2.758 6.82 2.74 8.706-.562 16.435-1.846 5.353 4.205 8.039-6.325 15.161-8.08 4.823-4.008 6.722-5.999 11.721-2.604 3.465-10.656 3.441-9.41 8.555 1.531 4.903 17.24 2.836 19.843 14.33 3.18 1.648 2.876-3.87 8.71-4.035 2.915-.08 3.214 5.1 6.492 4.255 5.138-1.347 4.262-2.903 9.318-.22 3.754-14.251 7.587 11.032 31.723 2.526 4.693-.804 10.166 4.951 11.547 4.71 1.38-.24 5.181-9.312 7.13-9.582 1.95-.27 2.667 2.826 4.929 2.55 2.265-.278 8.911-9.135 11.234-9.4 2.324-.262 2.067 6.99 3.031 6.895a381.5 381.5 0 0 1 1.51-.151l12.26-2.453s-2.145 6.13-2.299 7.818c.671.247 5.67-5.556 9.382-7.891 3.715-2.331 6.753-8.398 8.865-2.389 4.77-6.308 7.738-5.559 14.027-7.634 5.73-9.67 11.707-8.905 14.16-9.519 4.902 0 6.666.153 9.807 2.453.995-2.528-4.905-4.905-4.905-4.905s5.056-14.098 16.55-16.319c.612-3.064-9.501-9.502-6.743-15.556 10.573-.307 24.136-8.044 24.52-9.807-.69-4.443-5.136-5.593-4.905-9.807 2.758.306 12.26 0 12.26 0-7.355-12.26-2.452-14.711 0-26.97l7.354 2.452c4.905-7.356 4.906-7.357 14.713-9.81 2.528-14.173-4.14-15.4-4.905-29.421 13.024 2.375 5.21-19.997 24.52-19.615-2.453-29.423 4.902-22.067 7.354-41.682-9.042 0-15.476-9.884-14.863-10.65 9.807-12.26-4.6-15.246 10.112-25.054-7.356-17.163-9.96-15.785-2.604-32.948-29.421 7.356-12.259-7.356-49.036-14.712 4.902-7.356 14.71-19.613 4.902-26.97 2.452-4.902 6.36-7.432 6.36-12.335 0-3.678-8.026-18.217-6.627-26.856-5.268-8.41-5.862-12.299-7.088-17.203-2.452-14.71 0-24.518 0-26.97-2.452-4.903-7.356-9.807-12.26-12.259-4.902-2.452-6.512.23-11.416 2.682-2.376-.23.56-3.77-3.464-6.472-4.869.822-7.197-1.43-9.599-5.826-5.164-2.327-11.936-3.351-25.23-7.894-4.946-.864-6.682-1.414-10.973-2.027-1.8-.114-3.66 4.732-5.68 6.618-2.022 1.887-4.205.813-4.205.813 0-6.36-8.966-16.166-7.892-24.671-4.023-1.264-2.72 1.877-7.326 2.653-2.834.251-7.233-9.854-10.833-9.854-2.145-.384-30.34 14.863-38.54-7.74-1.38-1.763-7.753 3.695-11.647-2.3-2.758-11.11-7.662-7.203-12.872-12.413-7.049.767-11.954 4.6-19.31 2.684-9.807-2.681-33.175-4.982-43.52-5.365-1.379-5.862-2.629-10.428-4.04-10.665zM164.095 164.099c-2.068.078-4.597-.305-3.754 2.99 1.227-2.53 3.678-2.836 3.754-2.99zm-1.417 7.644c-1.017.025-2.97.382-2.337 2.854 1.227-2.53 2.835-2.682 2.91-2.836 0 0-.234-.027-.573-.018zm15.546 36.262c.077.153 1.148.534 2.374 3.064.844-3.295-2.374-3.064-2.374-3.064zm560.834 144.504c-.716 1.611-.589 3.222.152 4.37 1.329-1.993.206-2.914-.152-4.37z" fill="#fff" stroke="#fff" stroke-width="2" stroke-linejoin="round"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@@ -0,0 +1 @@
<svg width="800" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" height="500"><path fill="#74acdf" d="M0 0h800v500H0z"/><path fill="#fff" d="M0 166.67h800v166.67H0z"/><g id="c"><path id="a" stroke-width="1.112" stroke="#85340a" fill="#f6b40e" d="m396.84 251.31 28.454 61.992s.49 1.185 1.28.859c.79-.327.299-1.512.299-1.512l-23.715-63.956m-.68 24.12c-.347 9.428 5.452 14.613 4.694 23.032-.757 8.42 3.867 13.18 4.94 16.454 1.073 3.274-1.16 5.232-.198 5.698.963.466 3.07-2.12 2.383-6.775-.687-4.655-4.22-6.037-3.39-16.32.83-10.283-4.206-12.678-2.98-22.058"/><use xlink:href="#a" transform="rotate(22.5 400 250)"/><use xlink:href="#a" transform="rotate(45 400 250)"/><use xlink:href="#a" transform="rotate(67.5 400 250)"/><path id="b" fill="#85340a" d="M404.31 274.41c.453 9.054 5.587 13.063 4.579 21.314 2.213-6.525-3.124-11.583-2.82-21.22m-7.649-23.757 19.487 42.577-16.329-43.887"/><use xlink:href="#b" transform="rotate(22.5 400 250)"/><use xlink:href="#b" transform="rotate(45 400 250)"/><use xlink:href="#b" transform="rotate(67.5 400 250)"/></g><use xlink:href="#c" transform="rotate(90 400 250)"/><use xlink:href="#c" transform="rotate(180 400 250)"/><use xlink:href="#c" transform="rotate(270 400 250)"/><circle r="27.778" stroke="#85340a" cy="250" cx="400" stroke-width="1.5" fill="#f6b40e"/><path id="h" fill="#843511" d="M409.47 244.06c-1.897 0-3.713.822-4.781 2.531 2.136 1.923 6.856 2.132 10.062-.219a7.333 7.333 0 0 0-5.281-2.312zm-.031.438c1.846-.034 3.571.814 3.812 1.656-2.136 2.35-5.55 2.146-7.687.437.935-1.495 2.439-2.067 3.875-2.094z"/><use xlink:href="#d" transform="matrix(-1 0 0 1 800.25 0)"/><use xlink:href="#e" transform="matrix(-1 0 0 1 800.25 0)"/><use xlink:href="#f" transform="translate(18.862)"/><use xlink:href="#g" transform="matrix(-1 0 0 1 800.25 0)"/><path d="M395.75 253.84c-.913.167-1.563.977-1.563 1.906 0 1.062.878 1.906 1.938 1.906a1.89 1.89 0 0 0 1.563-.812c.739.556 1.764.615 2.312.625.084.002.193 0 .25 0 .548-.01 1.573-.069 2.313-.625.36.516.935.812 1.562.812 1.06 0 1.938-.844 1.938-1.906 0-.929-.65-1.74-1.563-1.906.513.18.844.676.844 1.219a1.28 1.28 0 0 1-1.281 1.281c-.68 0-1.242-.54-1.282-1.219-.208.417-1.034 1.655-2.656 1.719-1.622-.064-2.447-1.302-2.656-1.719-.04.679-.6 1.219-1.281 1.219a1.28 1.28 0 0 1-1.281-1.281c0-.542.33-1.038.843-1.219zM397.84 259.53c-2.138 0-2.983 1.937-4.906 3.219 1.068-.427 1.91-1.27 3.406-2.125 1.496-.855 2.772.187 3.625.187h.031c.853 0 2.13-1.041 3.625-.187 1.497.856 2.369 1.698 3.438 2.125-1.924-1.282-2.8-3.219-4.938-3.219-.426 0-1.271.23-2.125.656h-.031c-.853-.426-1.698-.656-2.125-.656z" fill="#85340a"/><path d="M397.12 262.06c-.844.037-1.96.207-3.563.688 3.848-.855 4.697.437 6.407.437h.03c1.71 0 2.56-1.292 6.407-.438-4.274-1.282-5.124-.437-6.406-.437h-.031c-.802 0-1.437-.312-2.844-.25z" fill="#85340a"/><path d="M393.75 262.72c-.248.003-.519.005-.813.031 4.488.428 2.331 3 7.032 3h.03c4.702 0 2.575-2.572 7.063-3-4.7-.426-3.214 2.344-7.062 2.344h-.031c-3.608 0-2.496-2.421-6.22-2.375zM403.85 269.66a3.848 3.848 0 0 0-3.846-3.846 3.848 3.848 0 0 0-3.847 3.846 3.955 3.955 0 0 1 3.847-3.04 3.952 3.952 0 0 1 3.846 3.04z" fill="#85340a"/><path id="e" fill="#85340a" d="M382.73 244.02c4.915-4.273 11.11-4.915 14.53-1.709.837 1.121 1.373 2.32 1.593 3.57.43 2.433-.33 5.062-2.236 7.756.215-.001.643.212.856.427 1.697-3.244 2.297-6.577 1.74-9.746a13.815 13.815 0 0 0-.67-2.436c-4.7-3.845-11.11-4.272-15.81 2.138z"/><path id="d" fill="#85340a" d="M390.42 242.74c2.777 0 3.419.642 4.7 1.71 1.284 1.068 1.924.854 2.137 1.068.213.215 0 .854-.426.64s-1.284-.64-2.564-1.708c-1.283-1.07-2.563-1.069-3.846-1.069-3.846 0-5.983 3.205-6.41 2.991-.426-.214 2.137-3.632 6.41-3.632z"/><use xlink:href="#h" transform="translate(-19.181)"/><circle id="f" cy="246.15" cx="390.54" r="1.923" fill="#85340a"/><path id="g" fill="#85340a" d="M385.29 247.44c3.633 2.778 7.265 2.564 9.402 1.282 2.136-1.282 2.136-1.709 1.71-1.709-.427 0-.853.427-2.564 1.281-1.71.856-4.273.856-8.546-.854z"/></svg>

After

Width:  |  Height:  |  Size: 3.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 47 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#c8102e" d="M0 0h900v600H0z"/><path fill="#fff" d="M0 200h900v200H0z"/></svg>

After

Width:  |  Height:  |  Size: 154 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1280" height="640" viewBox="0 0 10080 5040"><defs><clipPath id="a"><path d="M0 0h6v3H0z"/></clipPath><clipPath id="b"><path d="M0 0v1.5h6V3zm6 0H3v3H0z"/></clipPath><path id="c" d="m0-360 69.421 215.845 212.038-80.301L155.99-35.603l194.985 115.71-225.881 19.651 31.105 224.59L0 160l-156.198 164.349 31.105-224.59-225.881-19.651 194.986-115.711-125.471-188.853 212.038 80.301z"/><path id="d" d="M0-210 54.86-75.508l144.862 10.614L88.765 28.842l34.67 141.052L0 93.334l-123.435 76.56 34.67-141.052-110.957-93.736L-54.86-75.508z"/></defs><path fill="#012169" d="M0 0h10080v5040H0z"/><path d="m0 0 6 3m0-3L0 3" stroke="#fff" stroke-width=".6" clip-path="url(#a)" transform="scale(840)"/><path d="m0 0 6 3m0-3L0 3" stroke="#e4002b" stroke-width=".4" clip-path="url(#b)" transform="scale(840)"/><path d="M2520 0v2520M0 1260h5040" stroke="#fff" stroke-width="840"/><path d="M2520 0v2520M0 1260h5040" stroke="#e4002b" stroke-width="504"/><g fill="#fff"><use xlink:href="#c" transform="matrix(2.1 0 0 2.1 2520 3780)"/><use xlink:href="#c" x="7560" y="4200"/><use xlink:href="#c" x="6300" y="2205"/><use xlink:href="#c" x="7560" y="840"/><use xlink:href="#c" x="8680" y="1869"/><use xlink:href="#d" x="8064" y="2730"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 27 18"><path fill="#418fde" d="M0 0h27v18H0V0z"/><path fill="#ffd100" d="M0 12h27v1H0v1h27v1H0v-3z"/><path fill="#EF3340" stroke="#FFF" stroke-width=".2" stroke-miterlimit="10" d="M4.625 3.375 4 1.35l-.625 2.025L1.35 4l2.025.625L4 6.65l.625-2.025L6.65 4z"/></svg>

After

Width:  |  Height:  |  Size: 341 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="520" height="340" viewBox="0 0 52 34"><path d="M0 0h52v34H0Z" fill="#0064AD"/><path d="M0 17h52M21 0v34" stroke-width="10" stroke="#FFD300"/><path d="M0 17h52M21 0v34" stroke-width="4" stroke="#DA0E15"/></svg>

After

Width:  |  Height:  |  Size: 256 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600"><path fill="#509e2f" d="M0 0h1200v600H0z"/><path fill="#ef3340" d="M0 0h1200v400H0z"/><path fill="#00b5e2" d="M0 0h1200v200H0z"/><circle cx="570" cy="300" r="90" fill="#fff"/><circle cx="590" cy="300" r="75" fill="#ef3340"/><path d="m670 250 9.567 26.903 25.788-12.258-12.258 25.788L720 300l-26.903 9.567 12.258 25.788-25.788-12.258L670 350l-9.567-26.903-25.788 12.258 12.258-25.788L620 300l26.903-9.567-12.258-25.788 25.788 12.258z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 519 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="800" height="400" viewBox="0 0 16 8"><path fill="#002395" d="M0 0h16v8H0z"/><path d="M4.24 0h8v8z" fill="#fecb00"/><g id="b"><path d="M2.353.525 2.8-.85 3.247.525l-1.17-.85h1.446z" fill="#fff" id="a"/><use xlink:href="#a" x="1" y="1"/><use xlink:href="#a" x="2" y="2"/></g><use xlink:href="#b" x="3" y="3"/><use xlink:href="#b" x="6" y="6"/></svg>

After

Width:  |  Height:  |  Size: 437 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1500" height="1000" viewBox="0 0 24000 16000"><path fill="#00267f" d="M0 0h24000v16000H0z"/><path fill="#ffc726" d="M8000 0h8000v16000H8000z"/><path id="a" fill="#000" d="M12000 4124c-260 709-525 1447-1092 2012 176-58 484-110 682-105v2982l-842 125c-30-3-40-50-40-114-81-926-300-1704-552-2509-18-110-337-530-91-456 30 4 359 138 307 74-448-464-1103-798-1739-897-56-14-89 14-39 79 844 1299 1550 2832 1544 4651 328 0 1123-194 1452-194v2104h415l95-5876z"/><use xlink:href="#a" transform="matrix(-1 0 0 1 24000 0)"/></svg>

After

Width:  |  Height:  |  Size: 606 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 10 6"><path fill="#006a4e" d="M0 0h10v6H0z"/><circle cx="4.5" cy="3" r="2" fill="#f42a41"/></svg>

After

Width:  |  Height:  |  Size: 150 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="780"><path fill="#ef3340" d="M0 0h900v780H0z"/><path fill="#fdda25" d="M0 0h600v780H0z"/><path d="M0 0h300v780H0z"/></svg>

After

Width:  |  Height:  |  Size: 182 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600" version="1.0"><path fill="#009e49" d="M0 0h900v600H0z"/><path fill="#ef2b2d" d="M0 0h900v300H0z"/><g fill="#fcd116" transform="translate(450 300)"><g id="b"><path id="a" d="M0-100V0h50" transform="rotate(18 0 -100)"/><use xlink:href="#a" transform="scale(-1 1)"/></g><use xlink:href="#b" transform="rotate(72)"/><use xlink:href="#b" transform="rotate(144)"/><use xlink:href="#b" transform="rotate(216)"/><use xlink:href="#b" transform="rotate(288)"/></g></svg>

After

Width:  |  Height:  |  Size: 568 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 5 3"><path fill="#fff" d="M0 0h5v3H0z"/><path fill="#00966E" d="M0 1h5v2H0z"/><path fill="#D62612" d="M0 2h5v1H0z"/></svg>

After

Width:  |  Height:  |  Size: 201 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 100 60"><path fill="#fff" d="M0 0h100v60H0z"/><path fill="#da291c" d="M25 0h75v60H25l15-6-15-6 15-6-15-6 15-6-15-6 15-6-15-6 15-6z"/></svg>

After

Width:  |  Height:  |  Size: 218 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="600" viewBox="-50 -30 100 60" fill="#c8102e"><defs><clipPath id="a"><path d="M-50-30H50v60H-50z"/></clipPath></defs><path d="M-50-30H50v60H-50z"/><path fill="#43b02a" stroke="#fff" stroke-width="8" clip-path="url(#a)" d="M-55-33v66L55-33v66z"/><circle fill="#fff" r="17"/><path id="b" stroke="#43b02a" stroke-width=".36" d="m0-12.44 1.051 1.82h2.101L2.102-8.8l1.05 1.82H1.051L0-5.16l-1.051-1.82h-2.101l1.05-1.82-1.05-1.82h2.101z"/><use xlink:href="#b" transform="rotate(120)"/><use xlink:href="#b" transform="rotate(240)"/></svg>

After

Width:  |  Height:  |  Size: 633 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#e8112d" d="M0 0h900v600H0z"/><path fill="#fcd116" d="M0 0h900v300H0z"/><path fill="#008751" d="M0 0h360v600H0z"/></svg>

After

Width:  |  Height:  |  Size: 197 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 31 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 235 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 270 180" fill="#101820"><path d="M0 0h270v180H0z" fill="#fff"/><path d="M270 0v180H0z" fill="#003087"/><path d="M0 75V0h112.5z" fill="gold"/><g transform="translate(75 77.5)"><path d="M0-45 25.98 0 0 45-25.98 0zM45 0 0 25.98-45 0 0-25.98z"/><circle r="38.971"/><circle r="33.75" fill="#fff"/><path d="m0 22.5-19.486-33.75h38.972zm0-45 19.486 33.75h-38.972z" fill="#d50032"/></g></svg>

After

Width:  |  Height:  |  Size: 462 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="700" viewBox="-2100 -1470 4200 2940"><defs><path id="j" fill-rule="evenodd" d="M-31.5 0h33a30 30 0 0 0 30-30v-10a30 30 0 0 0-30-30h-33zm13-13h19a19 19 0 0 0 19-19v-6a19 19 0 0 0-19-19h-19z"/><path id="k" d="M0 0h63v-13H12v-18h40v-12H12v-14h48v-13H0z" transform="translate(-31.5)"/><path id="m" d="M-26.25 0h52.5v-12h-40.5v-16h33v-12h-33v-11H25v-12h-51.25z"/><path id="l" d="M-31.5 0h12v-48l14 48h11l14-48V0h12v-70H14L0-22l-14-48h-17.5z"/><path id="b" fill-rule="evenodd" d="M0 0a31.5 35 0 0 0 0-70A31.5 35 0 0 0 0 0m0-13a18.5 22 0 0 0 0-44 18.5 22 0 0 0 0 44"/><path id="c" fill-rule="evenodd" d="M-31.5 0h13v-26h28a22 22 0 0 0 0-44h-40zm13-39h27a9 9 0 0 0 0-18h-27z"/><path id="o" d="M-15.75-22C-15.75-15-9-11.5 1-11.5s14.74-3.25 14.75-7.75c0-14.25-46.75-5.25-46.5-30.25C-30.5-71-6-70 3-70s26 4 25.75 21.25H13.5c0-7.5-7-10.25-15-10.25-7.75 0-13.25 1.25-13.25 8.5-.25 11.75 46.25 4 46.25 28.75C31.5-3.5 13.5 0 0 0c-11.5 0-31.55-4.5-31.5-22z"/><use xlink:href="#f" id="p" transform="scale(31.5)"/><use xlink:href="#f" id="q" transform="scale(26.25)"/><use xlink:href="#f" id="u" transform="scale(21)"/><use xlink:href="#f" id="r" transform="scale(15)"/><use xlink:href="#f" id="v" transform="scale(10.5)"/><g id="n"><clipPath id="a"><path d="M-31.5 0v-70h63V0zM0-47v12h31.5v-12z"/></clipPath><use xlink:href="#b" clip-path="url(#a)"/><path d="M5-35h26.5v10H5z"/><path d="M21.5-35h10V0h-10z"/></g><g id="i"><use xlink:href="#c"/><path d="M28 0c0-10 0-32-15-32H-6c22 0 22 22 22 32"/></g><g id="f" fill="#fff"><g id="e"><path id="d" d="M0-1v1h.5" transform="rotate(18 0 -1)"/><use xlink:href="#d" transform="scale(-1 1)"/></g><use xlink:href="#e" transform="rotate(72)"/><use xlink:href="#e" transform="rotate(-72)"/><use xlink:href="#e" transform="rotate(144)"/><use xlink:href="#e" transform="rotate(216)"/></g></defs><clipPath id="h"><circle r="735"/></clipPath><path fill="#009440" d="M-2100-1470h4200v2940h-4200z"/><path fill="#ffcb00" d="M-1743 0 0 1113 1743 0 0-1113Z"/><circle r="735" fill="#302681"/><path fill="#fff" d="M-2205 1470a1785 1785 0 0 1 3570 0h-105a1680 1680 0 1 0-3360 0z" clip-path="url(#h)"/><g fill="#009440" transform="translate(-420 1470)"><use xlink:href="#b" y="-1697.5" transform="rotate(-7)"/><use xlink:href="#i" y="-1697.5" transform="rotate(-4)"/><use xlink:href="#j" y="-1697.5" transform="rotate(-1)"/><use xlink:href="#k" y="-1697.5" transform="rotate(2)"/><use xlink:href="#l" y="-1697.5" transform="rotate(5)"/><use xlink:href="#m" y="-1697.5" transform="rotate(9.75)"/><use xlink:href="#c" y="-1697.5" transform="rotate(14.5)"/><use xlink:href="#i" y="-1697.5" transform="rotate(17.5)"/><use xlink:href="#b" y="-1697.5" transform="rotate(20.5)"/><use xlink:href="#n" y="-1697.5" transform="rotate(23.5)"/><use xlink:href="#i" y="-1697.5" transform="rotate(26.5)"/><use xlink:href="#k" y="-1697.5" transform="rotate(29.5)"/><use xlink:href="#o" y="-1697.5" transform="rotate(32.5)"/><use xlink:href="#o" y="-1697.5" transform="rotate(35.5)"/><use xlink:href="#b" y="-1697.5" transform="rotate(38.5)"/></g><use xlink:href="#p" x="-600" y="-132"/><use xlink:href="#p" x="-535" y="177"/><use xlink:href="#q" x="-625" y="243"/><use xlink:href="#r" x="-463" y="132"/><use xlink:href="#q" x="-382" y="250"/><use xlink:href="#u" x="-404" y="323"/><use xlink:href="#p" x="228" y="-228"/><use xlink:href="#p" x="515" y="258"/><use xlink:href="#u" x="617" y="265"/><use xlink:href="#q" x="545" y="323"/><use xlink:href="#q" x="368" y="477"/><use xlink:href="#u" x="367" y="551"/><use xlink:href="#u" x="441" y="419"/><use xlink:href="#q" x="500" y="382"/><use xlink:href="#u" x="365" y="405"/><use xlink:href="#q" x="-280" y="30"/><use xlink:href="#u" x="200" y="-37"/><use xlink:href="#p" y="330"/><use xlink:href="#q" x="85" y="184"/><use xlink:href="#q" y="118"/><use xlink:href="#u" x="-74" y="184"/><use xlink:href="#r" x="-37" y="235"/><use xlink:href="#q" x="220" y="495"/><use xlink:href="#u" x="283" y="430"/><use xlink:href="#u" x="162" y="412"/><use xlink:href="#p" x="-295" y="390"/><use xlink:href="#v" y="575"/></svg>

After

Width:  |  Height:  |  Size: 4.1 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 6 3"><path fill="#00778b" d="M0 0h6v3H0z"/><path fill="#ffc72c" d="M1 1h5v1H1z"/><path d="M2.598 1.5 0 3V0z"/></svg>

After

Width:  |  Height:  |  Size: 195 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 36 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 22 16"><path fill="#ba0c2f" d="M0 0h22v16H0z"/><path d="M0 8h22M8 0v16" stroke="#fff" stroke-width="4"/><path d="M0 8h22M8 0v16" stroke="#00205b" stroke-width="2"/></svg>

After

Width:  |  Height:  |  Size: 223 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="800" viewBox="0 0 36 24"><path fill="#6DA9D2" d="M0 0h36v24H0z"/><path fill="#fff" d="M0 9h36v6H0z"/><path d="M0 10h36v4H0z"/></svg>

After

Width:  |  Height:  |  Size: 193 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="600" viewBox="0 0 378 189"><defs><clipPath id="a"><path d="M0 0h200v608h8v284l-8 8H0z"/></clipPath></defs><path fill="#ce1720" d="M0 0h378v189H0z"/><g transform="translate(2) scale(.21)" clip-path="url(#a)" fill="#fff"><g id="c"><path id="b" d="M36 0v14h-9v14H16v16H8v13H-8V24H8V6H-8V0zm26 77v15h-8v12h-8V92h-8V77h-8V57h8V42h8V30h8v12h8v15h8v20zm-17-1h10V58H45zM19 183h8v-18h-8zm54 0h8v-18h-8zM-8 305H6v13h6v16h9v15h12v-15h9v-16h8v-13H38v-15h21v10h13v17h11v19h-8v14h-7v13h-6v14h-9v12h-7v11h-9v14H24v-15h-9v-14H8v-9H-8v-23H8v-20H-8z"/><use xlink:href="#b" transform="matrix(-1 0 0 1 200 0)"/><path d="M96 0v32h8V0h32v14h-8v14h-12v16h-8v13H92V44h-8V28H72V14h-8V0zm-2 274v-11h-6v-13h-7v-14h-8v-14h-8v-10h-9v-14H44v14h-9v10h-7v14h-8v14h-6v13H8v17H-8v-44H8v-20H-8v-33H8v14h10v14h10v-14h10v-14h8v-18h-8v-14H28v-14H18v14H8v14H-8v-41H8v-19H-8V77H8v13h8v16h11v13h9v15h7v12h14v-12h7v-15h9v-13h11V90h8V77h16v13h8v16h11v13h9v15h7v12h14v-12h7v-15h9v-13h11V90h8V77h16v28h-16v19h16v41h-16v-14h-10v-14h-10v14h-10v14h-8v18h8v14h10v14h10v-14h10v-14h16v33h-16v20h16v44h-16v-17h-6v-13h-6v-14h-8v-14h-7v-10h-9v-14h-12v14h-9v10h-8v14h-8v14h-7v13h-6v11zm2-167v27h8v-27zm-4 58v-14H82v-14H72v14H62v14h-8v18h8v14h10v14h10v-14h10v-14h16v14h10v14h10v-14h10v-14h8v-18h-8v-14h-10v-14h-10v14h-10v14zm4 46v27h8v-27z"/></g><use xlink:href="#c" transform="matrix(1 0 0 -1 0 900)"/><path d="M-8 408H8v14h7v8h8v14h7v12h-7v14h-8v8H8v14H-8zm216 0v84h-16v-14h-7v-8h-8v-14h-7v-12h7v-14h8v-8h7v-14zM62 459h8v-18h-8zm76 0v-18h-8v18zm-42-59h8v-18h-8zm0 100v18h8v-18zm-50-75h14v-11h10v-10h5v-10h6v-14h8v-14h4v-13h14v13h4v14h8v14h6v10h5v10h10v11h14v50h-14v11h-10v10h-5v10h-6v14h-8v14h-4v13H93v-13h-4v-14h-8v-14h-6v-10h-5v-10H60v-11H46zm50 9v-15h-8v-10h-8v25h8v9h5v14h-5v9h-8v25h8v-10h8v-15h8v15h8v10h8v-25h-8v-9h-5v-14h5v-9h8v-25h-8v10h-8v15z"/></g><path fill="#007c30" d="M44 126h334v63H44z"/></svg>

After

Width:  |  Height:  |  Size: 1.9 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 79 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 9600 4800"><path fill="red" d="M0 0h2400l99 99h4602l99-99h2400v4800H7200l-99-99H2499l-99 99H0z"/><path fill="#fff" d="M2400 0h4800v4800H2400zm2490 4430-45-863a95 95 0 0 1 111-98l859 151-116-320a65 65 0 0 1 20-73l941-762-212-99a65 65 0 0 1-34-79l186-572-542 115a65 65 0 0 1-73-38l-105-247-423 454a65 65 0 0 1-111-57l204-1052-327 189a65 65 0 0 1-91-27l-332-652-332 652a65 65 0 0 1-91 27l-327-189 204 1052a65 65 0 0 1-111 57l-423-454-105 247a65 65 0 0 1-73 38l-542-115 186 572a65 65 0 0 1-34 79l-212 99 941 762a65 65 0 0 1 20 73l-116 320 859-151a95 95 0 0 1 111 98l-45 863z"/></svg>

After

Width:  |  Height:  |  Size: 658 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="600" height="300" viewBox="0 0 10080 5040"><defs><path id="a" d="m0-360 69.421 215.845 212.038-80.301L155.99-35.603l194.985 115.71-225.881 19.651 31.105 224.59L0 160l-156.198 164.349 31.105-224.59-225.881-19.651 194.986-115.711-125.471-188.853 212.038 80.301z"/><path id="b" d="M0-210 54.86-75.508l144.862 10.614L88.765 28.842l34.67 141.052L0 93.334l-123.435 76.56 34.67-141.052-110.957-93.736L-54.86-75.508z"/></defs><path fill="green" d="M0 0h10080v5040H0z"/><circle cx="5040" cy="2520" r="1050" fill="#ffe000"/><circle cx="5367.4" cy="2520" r="864" fill="green"/><circle cx="1730" cy="1470" r="1100" fill="#ffe000"/><path fill="#802000" stroke="#7b3100" stroke-width="23.333" d="M1654.1 2299.4h274.67s12.398-25.178-2.766-37.767-74.229-15.36-58.27-59.892c32.806-91.555 37.384-63.326 57.984-280.77s30.518-558.49 30.518-558.49h-39.674s7.63 106.05-15.259 244.15-29.755 150.3-54.933 256.35-28.992 115.21-51.88 177.01-25.179 64.852-61.038 122.07c-35.859 57.222-22.889 35.859-42.726 70.192-9.918 17.166-22.126 12.589-28.802 25.082-6.676 12.494-7.82 42.058-7.82 42.058z"/><path fill="green" d="M1863.7 668.6c2.282 42.661-2.007 99.138-19.688 145.1-17.928 51.216-37.423 102.27-36.458 155.31-28.502 9.694-57.877-61.678-85.312-19.688 20.624 58.016 68.239 103.95 100.86 156.22 5.502 16.205 52.438 58.518 25.281 68.358-68.547-23.46-85.162-110.31-127.68-163.05-49.38-88.757-141.44-151.49-244-155.82-38.524 1.01-163.78-9.548-131.19 56.419 47.997 32.632 107.14 53.91 154.53 90.537 35.31 3.303 99.31 62.248 95.579 84.52-62.102-25.153-91.169-55.299-158.08-81.758-90.658-35.014-216.06-13.954-266.25 76.021-9.357 23.433-23.172 91.731 6.255 98.238 34.384-53.685 83.569-113.7 156.45-97.6 57.244 4.47-63.877 106.64-17.544 86.084 14.68-6.515 48.583-28.769 72.102-31.093 23.518-2.324 36.653 15.282 54.497 17.718 35.688 4.872 45.515 19.833 42.207 28.537-3.903 10.269-15.241 1.501-51.52 13.004-18.14 5.751-27.615 21.692-48.774 28.989-21.158 7.298-65.173 7.815-81.621 1.344-57.547-24.996-151.89-20.645-169.83 51.468-.016 31.71-28.236-3.504-41.278 10.196-9.78 34.603-12.31 70.132-63.633 66.99-31.155 32.684-63.06 66.527-102.62 89.78 23.215 53.285 115.2-53.515 110.9-8.483-40.21 54.832 20.689 66.37 47.348 24.166 45.088-47.64 100.93-105.63 168.21-57.618 32.044 30.169 50.664-15.951 73.857-13.481 14.612 37.475 32.998 1.844 49.583-8.75 27.15-3.383 19.51 33.91 51.77 10.938 64.294-42.551 143.39-6.796 206.2-48.197 66.853-30.458 9.386 24.532-9.065 46.028-29.373 56.97-3.9 131.76-67.613 167.14-25.593 67.895 30.237 157.4-26.707 207.63-8.284 31.496 73.234 27.889 96.113 40.832 40.09 1.587-1.723-91.758 38.054-104.27 53.344 33.019 50.846-59.05 39.83-87.447 5.172-64.552 8.815-135.13 40.893-193.6 34.102-71.662 65.666 29.186 27.49 57.558-21.684 65.896-53.25 148.36-3.942 209.64 14.211 3.18 25.88 37.625 44.28 48.212s43.53-2.684 48.117-34.022c23.601-94.37 11.712-195.85 45.415-287.63 23.788-28.43 56.603-4.584 71.355 21.559 47.23 54.833 80.43 123.38 137.61 168.56 52.063 24.362 98.106 61.21 122.1 114.81-.32 41.353 117.45 47.692 82.258 1.727-33.768-44.747-11.488-89.504 22.715-119.26 18.318 4.518 12.904-28.289-1.458-15.312-22.995-5.424-24.466-47.512 7.497-27.507 53.836 17.379-4.197-38.962-23.655-40.69-45.52-28.215-97.82-60.676-120.2-109.72 59.256.604 120.77 32.564 181.32 12.74 48.538-24.937 97.769 2.08 114.72 44.864 37.52-5.987 21.524-43.614 0-56.146 27.443-11.325 46.422-34.805 13.147-55.515-17.574-22.934 23.566-62.052-27.001-60.422 1.651-38.627-13.556-73.973-55.66-87.318-42.178-35.717-165.95 52.62-162.36-27.89-12.471-43.818 50.278-5.854 67.812-27.708 18.118-46.194-86.337-41.686-51.87-77.5 22.51-14.494 128.15-35.314 45.306-50.82-41.347 11.364-76.832 2.949-109.37-17.513-29.657 49.603-114.34-26.938-99.252 61.251-11.585 33.23-87.278 119.57-107.76 53.423 17.422-51.845 107.1-68.797 79.29-138.7-4.267-43.636-40.445 7.589-57.49 4.335-8.63-27.162 26.104-59.178 50.313-65.625 48.038 36.948 49.493-46.614 95.178-39.816 33.355-7.41-10.771-21.718-20.074-27.996 9.14-24.416 60.346-36.892 10.136-58.094-44.302-32.872-77.138 32.72-113.68 36.218-35.072-39.595 31.842-58.628 50.312-79.479.993-15.543-39.017-4.69-26.98-18.229 10.457-18.69 81.302-20.081 48.126-48.125-49.965-17.153-114.44-12.876-162.38 9.346-30.203 9.777-39.09 78.07-65.122 75.237-12.24-30.398 3.985-90.372-37.917-99.167zm236.25 667.19c38.072-6.447.808 57.818-17.5 56.875 1.618-23.092-55.065-20.869-19.897-40.988 11.405-7.364 24.112-12.982 37.397-15.887z"/><g fill="#ffe000"><use xlink:href="#a" x="7560" y="4200"/><use xlink:href="#a" x="6300" y="2205"/><use xlink:href="#a" x="7560" y="840"/><use xlink:href="#a" x="8680" y="1869"/><use xlink:href="#b" x="8064" y="2730"/></g></svg>

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="800" height="600"><path style="fill:#007fff" d="M0 0h800v600H0z"/><path d="M36 120h84l26-84 26 84h84l-68 52 26 84-68-52-68 52 26-84-68-52zM750 0 0 450v150h50l750-450V0h-50" style="fill:#f7d618"/><path d="M800 0 0 480v120l800-480V0" style="fill:#ce1021"/></svg>

After

Width:  |  Height:  |  Size: 307 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 12 8"><path fill="#fff" d="M0 0h12v8H0z"/><path fill="#003082" d="M0 0h12v2H0z"/><path fill="#ffce00" d="m6 4 6 2v2H0V6zM2 .186l.529 1.628L1.144.808h1.712L1.471 1.814z"/><path fill="#289728" d="M0 4h12v2H0z"/><path fill="#d21034" d="M5 0h2v8H5z"/></svg>

After

Width:  |  Height:  |  Size: 331 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#009543" d="M0 0h900v600H0z"/><path fill="#fbde4a" d="M0 600 600 0h300v600z"/><path fill="#dc241f" d="M900 0v600H300z"/></svg>

After

Width:  |  Height:  |  Size: 203 B

View File

@@ -0,0 +1 @@
<svg width="512" height="512" viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg"><path d="M0 0h32v32H0z" fill="red"/><path d="M13 6h6v7h7v6h-7v7h-6v-7H6v-6h7z" fill="#fff"/></svg>

After

Width:  |  Height:  |  Size: 183 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#009e60" d="M0 0h900v600H0z"/><path fill="#fff" d="M0 0h600v600H0z"/><path fill="#f77f00" d="M0 0h300v600H0z"/></svg>

After

Width:  |  Height:  |  Size: 194 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="600" viewBox="0 0 9600 4800"><defs><clipPath id="a"><path d="M0 0h12v6H0z"/></clipPath><clipPath id="b"><path d="M0 0v1.5h8V4zm6 0H3v4h-5z"/></clipPath></defs><g transform="scale(800)" stroke-width=".6" fill="#012169" clip-path="url(#a)"><path d="M0 0h12v6H0z"/><path stroke="#fff" d="m0 0 6 3M0 3l6-3"/><path stroke="#c8102e" stroke-width=".4" clip-path="url(#b)" d="m0 0 6 3M0 3l6-3"/><path stroke="#fff" stroke-width="1" d="M3 0v4M0 1.5h7"/><path stroke="#c8102e" d="M3 0v4M0 1.5h7"/><path d="M0 3h6V0h6v6H0z"/></g><g transform="translate(7200 2400)"><g id="d"><path id="c" fill="#fff" d="m0-1992 81 249h261l-211 153 81 249L0-1494l-212 153 81-249-211-153h261z"/><use transform="rotate(24)" xlink:href="#c"/><use transform="rotate(48)" xlink:href="#c"/></g><use transform="rotate(72)" xlink:href="#d"/><use transform="rotate(144)" xlink:href="#d"/><use transform="rotate(216)" xlink:href="#d"/><use transform="rotate(288)" xlink:href="#d"/></g></svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600"><path fill="#FFF" d="M0 0h900v600H0z"/><path fill="#0032A0" d="M0 0h300v450H0z"/><path fill="#DA291C" d="M0 300h900v300H0z"/><g fill="#FFF" transform="translate(150 150)"><g id="b"><path id="a" d="M0-75V0h37.5" transform="rotate(18 0 -75)"/><use xlink:href="#a" transform="scale(-1 1)"/></g><use xlink:href="#b" transform="rotate(72)"/><use xlink:href="#b" transform="rotate(144)"/><use xlink:href="#b" transform="rotate(216)"/><use xlink:href="#b" transform="rotate(288)"/></g></svg>

After

Width:  |  Height:  |  Size: 592 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.0" width="900" height="600" viewBox="0 0 9 6"><path d="M0 0h9v6H0Z" fill="#ce1126"/><path d="M0 0h3v6H0Z" fill="#007a5e"/><path d="M6 0h3v6H6ZM4.032 3.645l1.226-.891H3.742l1.226.89L4.5 2.204Z" fill="#fcd116"/></svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="900" height="600"><path fill="#EE1C25" d="M0 0h900v600H0"/><g transform="matrix(3 0 0 3 150 150)"><path id="a" fill="#FF0" d="m0-30 17.634 54.27-46.166-33.54h57.064l-46.166 33.54Z"/></g><use xlink:href="#a" transform="rotate(23.036 2.784 766.082)"/><use xlink:href="#a" transform="rotate(45.87 38.201 485.396)"/><use xlink:href="#a" transform="rotate(69.945 29.892 362.328)"/><use xlink:href="#a" transform="rotate(20.66 -590.66 957.955)"/></svg>

After

Width:  |  Height:  |  Size: 536 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#ffcd00" d="M0 0h900v600H0z"/><path fill="#003087" d="M0 300h900v300H0z"/><path fill="#c8102e" d="M0 450h900v150H0z"/></svg>

After

Width:  |  Height:  |  Size: 201 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 62 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="600" viewBox="0 0 30 15" fill="#fff"><path fill="#002a8f" d="M0 0h30v15H0z"/><path d="M3 3h27v3H9v3h21v3H3z"/><path fill="#cb1515" d="M12.99 7.5 0 15V0z"/><path d="M4.33 5 2.861 9.523l3.847-2.796H1.952L5.8 9.523z"/></svg>

After

Width:  |  Height:  |  Size: 282 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1020" height="600"><path fill="#003893" d="M0 0h1020v600H0z"/><path fill="#fff" d="M0 300h1020v150H0z"/><path fill="#cf2027" d="M0 350h1020v50H0z"/><path fill="#f7d116" d="m382.5 198.715 5.933 18.119 19.066.043-15.4 11.242 5.852 18.148-15.452-11.173-15.45 11.173 5.851-18.148-15.4-11.242 19.066-.043zm-88.168 28.646 5.933 18.121 19.066.043-15.4 11.242 5.852 18.147-15.452-11.172-15.45 11.172 5.851-18.147-15.4-11.242 19.066-.043zm176.336 0 5.933 18.121 19.066.043-15.4 11.242 5.852 18.147-15.452-11.172-15.45 11.172 5.851-18.147-15.4-11.242 19.066-.043zm-230.826 73.863 5.933 18.12 19.067.043-15.4 11.242 5.85 18.148-15.45-11.174-15.452 11.174 5.852-18.148-15.4-11.242 19.066-.043zm285.316 0 5.934 18.12 19.066.043-15.4 11.242 5.851 18.148-15.451-11.174-15.451 11.174 5.851-18.148-15.4-11.242 19.066-.043zm-285.316 100 5.933 18.119 19.067.044-15.4 11.242 5.85 18.148-15.45-11.173-15.452 11.173 5.852-18.148-15.4-11.242 19.066-.043zm285.316 0 5.934 18.119 19.066.044-15.4 11.242 5.851 18.148-15.451-11.173-15.451 11.173 5.851-18.148-15.4-11.242 19.066-.043zm-230.826 68.842 5.933 18.121 19.066.044-15.4 11.242 5.852 18.146-15.452-11.172-15.45 11.172 5.851-18.146-15.4-11.242 19.066-.044zm176.336 0 5.933 18.121 19.066.044-15.4 11.242 5.852 18.146-15.452-11.172-15.45 11.172 5.851-18.146-15.4-11.242 19.066-.044zM382.5 498.715l5.933 18.119 19.066.043-15.4 11.242 5.852 18.149-15.452-11.174-15.45 11.174 5.851-18.149-15.4-11.242 19.066-.043z"/></svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600" viewBox="0 0 54 36"><path fill="#002b7f" d="M0 0h54v36H0"/><path fill="#f9e814" d="M0 22.5h54V27H0"/><path fill="#fff" d="m4.2 8.4.1-.1L6 3l1.8 5.4-4.6-3.3h5.7m.7 10.1L12 8l2.4 7.2-6.2-4.4h7.6"/></svg>

After

Width:  |  Height:  |  Size: 266 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1000 500"><path fill="#012169" d="M0 0h1000v500H0z"/><path fill="#0db02b" d="M0 0h1000v500z"/><circle cx="500" cy="250" r="90.3" fill="#f7d116"/><path fill="#fff" d="M188.2 190.9 175.4 179l-12.9 11.8 1.4-17.4-17.2-2.8 14.5-9.8-8.6-15.2 16.7 5.2 6.5-16.2 6.3 16.3 16.7-5L190 161l14.3 10-17.3 2.5zm45.2 144.6-13.8-9.2-13.4 9.7 4.7-15.6-13.6-9.4 16.7-.4 5-15.5 5.6 15.3 16.7-.2-13.2 9.9zM190.7 460l-12.8-11.9-12.9 11.7 1.4-17.4-17.2-2.8 14.5-9.8-8.6-15.2 16.7 5.2 6.5-16.2 6.3 16.3 16.7-5-8.8 15.1 14.3 10-17.3 2.5zM76.1 314.2l-12.8-11.9L50.4 314l1.4-17.4-17.2-2.8 14.5-9.8-8.6-15.2 16.7 5.2 6.5-16.2 6.3 16.3 16.7-5-8.8 15.1 14.3 10-17.3 2.5zM296.6 276l-12.8-12-12.9 11.8 1.4-17.4-17.2-2.8 14.5-9.8-8.6-15.2 16.7 5.2 6.5-16.2 6.3 16.3 16.7-5-8.8 15.1 14.3 10-17.3 2.5z"/><path fill="#f7d116" d="M941.2 188c-3.5-2-5.9-.4-10.6-2-3.9-1.3-3.2-2.7-6.6-3.8-4-1.3-5.9.4-12.8 1.1-2.4.2-6.2.5-8.4.2-8.9-1.2-15.9-15-18.8-25.5-3.9-13.6-1.2-22.9-3-42.5-.4-4.4-1.4-10.8-3.8-17.9-1.7-5.1-5.1-13.1-21.6-32.3-18.3-21.2-32.9-33-36.8-36.1-6.2-5-11.7-8.8-15.7-11.5.6 6.2 2 15.4 5.4 25.9 3.9 12.2 8.7 20.9 13.3 29.2 7.7 13.8 27.1 48.1 24.4 58.1-.2.6-.8 2.7-1.4 5.8-.8 4.1-1 7.5-1.1 9.8-2.5-.8-6.3-2.2-10.8-4.4-8.3-4.1-13.7-8.4-16.4-10.5-7.4-5.6-14.6-8.1-28.9-13.3-19-6.9-36.8-9.6-51.1-10.5 9 13.1 17.8 21.9 24.3 27.4 12.1 10.4 24.9 17.5 31.2 21 7.7 4.3 10.9 5.5 18.9 10.6 12.3 7.9 17 13 20 17 3.7 4.9 7.1 9.4 7.9 16 .8 6.4-1 13.3-6.4 21.9-15.6 24.7-45.5 38.3-54.6 42.2-11.4 4.9-29.3 12.5-56 16.3-20.2 2.9-52.3 4.5-91.5-6.1 4.1 1.8 8.7 3.6 13.7 5.2 5.4 1.7 10.4 2.9 15 3.8.3.1-6.4.3-13.2-1.2-8.2-1.8-14.7-5-19.2-7.7 3.4 2.7 8.7 6.4 15.5 9.4 8.8 3.9 17.8 5.7 44.4 5.8 16 .1 24 .1 31.9-.7 22.6-2.3 39.5-7.8 55.5-13.3 13.5-4.6 25-8.5 39.9-16.2 21.5-11.2 31.7-20.8 55.6-30.5 7.5-3 11.3-4.6 16.1-6 14.2-4.2 19.6-3.1 29.4-8.6 8.8-4.9 11.6-9.9 12.4-11.4 1.3-2.4 1.5-3.9 2.9-5.7 3.7-4.7 10.2-4.9 15.2-4.3-.6-1.3-2-3.3-4.2-4.7m-19.2 4.6c-.6.8-1.7 1.1-2.6.9-1.3-.4-2.2-1.8-2.1-3.5l-3-1.6h7.7c.9 1.3.8 3.1 0 4.2"/><path fill="#0db02b" d="M552.382 194.511c-3.299.583-6.495 2.174-9.895 2.139-1.946-.02-4.527-1.438-6.31-.221-2.51 1.712-1.75 5.684-3.136 8.07a3.66 3.66 0 0 1-2.839 1.847c-1.085.118-2.333-.214-3.13.748-.825.995-.578 2.36-.63 3.547-.064 1.462-.423 2.927-1.34 4.088-.937 1.184-2.327 1.92-3.428 2.936-1.478 1.363-2.651 3.024-4.267 4.253-2.343 1.782-5.088 2.782-7.678 4.122-1.832.948-3.395 2.291-5.289 3.144-1.478.666-3.082 1.005-4.607 1.537-1.884.657-3.705 1.485-5.63 2.026-1.5.422-3.077.552-4.606.828-1.255.227-2.485.576-3.754.732-2.807.344-5.644-1.387-8.36-1.93-1.962-.393-3.979-.6-5.971-.736-.986-.067-1.927.003-2.9-.226-2.176-.512-3.683-2.18-5.631-3.155-2.186-1.096-4.812-1.368-6.825-2.784-2.868-2.017-3.402-5.92-6.312-7.86-1.309-.87-3.304-1.502-4.775-.624-1.142.683-1.526 1.979-1.777 3.203-.52 2.544-1.01 5.318-.184 7.848.877 2.687 3.033 3.838 4.843 5.801 1.344 1.457 2.397 3.951 2.122 5.971-.28 2.06-1.781 3.585-2.54 5.46-1.008 2.486-.777 5.794-2.688 7.82-1.284 1.36-3.01 2.847-4.556 3.89-1.71 1.157-3.347 1.976-4.663 3.645-1.782 2.263-5.088 6.61-2.295 9.328 2.78 2.706 7.746.725 10.014-1.653 1.34-1.406 2.295-3.112 3.769-4.402.95-.832 2.145-1.338 3.412-1.39 2.043-.082 4.078.419 6.142.328 3.877-.17 8.334-1.039 12.114.24 2.786.942 4.03 4.246 6.995 4.806 2.22.418 4.566-.401 6.824-.246 1.84.125 3.642.654 5.46.936 3.188.494 6.315.904 9.384 1.95 4.023 1.37 7.663 4.975 8.66 9.212.469 1.988.169 4.122.431 6.142.285 2.188 1.44 4.148 1.777 6.312.42 2.693-.074 5.321.585 8.02 1.064 4.361 2.676 9.626 7.485 11.053.878.261 1.816.373 2.73.377 1.85.01 3.638-.127 5.459-.478 1.877-.362 4.28-.65 5.54-2.254 1.718-2.189.525-4.901.29-7.334-.264-2.731.357-5.49.68-8.19.22-1.841.637-3.633.954-5.459.217-1.247.247-2.563.713-3.753 1.365-3.486 3.906-6.487 4.701-10.237.385-1.812-.386-3.394-.762-5.118-.446-2.048-.54-4.396-.314-6.484.279-2.567 2.388-4.193 3.811-6.142.841-1.152 1.398-2.5 2.377-3.554.98-1.055 2.338-1.715 3.148-2.93.53-.792.823-1.714 1.257-2.558 1.075-2.093 2.7-4.636 4.733-5.892 1.415-.874 3.03-.942 4.606-1.314 1.282-.303 2.45-.89 3.583-1.544 1.162-.67 2.442-1.526 2.476-3.022.036-1.566-1.548-2.653-2.41-3.754-.753-.963-1.075-2.207-1.089-3.412-.016-1.267-.173-2.701.208-3.924.396-1.272 1.263-2.35 1.761-3.583.568-1.406.685-2.934.574-4.436-.156-2.12-1.645-3.923-2.49-5.8-.54-1.197-.74-2.49-1.056-3.754-.286-1.143-.686-2.255-.908-3.413-.39-2.041.305-4.142-.072-6.142-.281-1.492-1.203-2.643-2.794-2.723-.564-.028-1.15-.026-1.707.072z"/></svg>

After

Width:  |  Height:  |  Size: 4.4 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 22 KiB

View File

@@ -0,0 +1 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#d7141a" d="M0 0h900v600H0z"/><path fill="#fff" d="M0 0h900v300H0z"/><path d="M450 300 0 0v600z" fill="#11457e"/></svg>

After

Width:  |  Height:  |  Size: 210 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1000" height="600" viewBox="0 0 5 3"><path d="M0 0h5v3H0z"/><path fill="#D00" d="M0 1h5v2H0z"/><path fill="#FFCE00" d="M0 2h5v1H0z"/></svg>

After

Width:  |  Height:  |  Size: 186 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#6ab2e7" d="M0 0h900v600H0z"/><path fill="#12ad2b" d="M0 300h900v300H0z"/><path d="M0 0v600l259.808-150 259.807-150-259.807-150z" fill="#fff"/><path d="m198.86 225 18.616 57.295h60.243l-48.738 35.41L247.598 375l-48.738-35.41L150.122 375l18.616-57.295L120 282.295h60.243z" fill="#d7141a"/></svg>

After

Width:  |  Height:  |  Size: 371 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 37 28"><path fill="#c8102e" d="M0 0h37v28H0Z"/><path stroke="#fff" stroke-width="4" d="M0 14h37M14 0v28"/></svg>

After

Width:  |  Height:  |  Size: 165 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="600" viewBox="-7200 -3600 14400 7200" fill="#046a38" stroke="#000" stroke-width="7"><g transform="scale(300)" stroke="none"><path d="M-24-12h48v24h-48z"/><path fill="#ffcd00" d="M-24-3h48v3h-48zm21-9h3v24h-3z"/><path fill="#fff" d="M-24 0h48v3h-48zM0-12h3v24H0z"/><path fill="#000" d="M-24-1h48v2h-48zm23-11h2v24h-2z"/><circle r="6" fill="#d50032"/></g><g id="c"><g id="b"><path id="a" stroke-width="12" d="m0-1600.6 56.3 173.2h182L91-1320.4l56.3 173.1L0-1254.3l-147.3 107 56.3-173.1-147.3-107h182z"/><use xlink:href="#a" transform="rotate(36)"/></g><use xlink:href="#a" transform="rotate(72)"/><use xlink:href="#b" transform="rotate(108)"/></g><use xlink:href="#c" transform="scale(-1)"/><g transform="rotate(86)"><ellipse cx="492" cy="-213" rx="530" ry="108"/><ellipse cx="498" cy="-318" rx="530" ry="114"/><ellipse cx="523" cy="-267" rx="586" ry="91"/></g><path fill="#9c4a00" d="M439 868c-161 17-865 25-895 3s-75-115-75-120c92-4 52-53 99-79 46-27 112-9 132 23 20 33 4 65 29 66 26 0 526-24 710-11 30 2 53 29 53 59s-23 56-53 59z"/><path id="d" fill="#ffcd00" d="M-41 818c-1 70 101 50 103 108-3 61-172 4-174-109 7-112 172-167 174-103 2 53-101 35-103 104z"/><use xlink:href="#d" x="60"/><use xlink:href="#d" x="125"/><use xlink:href="#d" x="186"/><g transform="scale(.85 1.8)"><g transform="rotate(48.1)"><ellipse cx="317" cy="154" rx="68" ry="58"/><ellipse cx="245" cy="229" rx="68" ry="58"/><ellipse cx="148" cy="242" rx="68" ry="58"/></g><ellipse transform="rotate(63.2)" cx="251" cy="100" rx="73" ry="57"/><g transform="rotate(57.7)"><ellipse cx="175" cy="124" rx="69" ry="57"/><ellipse cx="109" cy="192" rx="69" ry="57"/></g></g><path fill="#9063cd" d="M-177-632S-353-480-333-67c22 416 389 611 389 611h58V-632z"/><g transform="scale(.85 1.8)"><g transform="rotate(40.6)"><ellipse cx="421" cy="95" rx="58" ry="68"/><ellipse cx="337" cy="151" rx="58" ry="68"/><ellipse cx="255" cy="132" rx="58" ry="68"/></g><ellipse transform="rotate(24.1)" cx="305" cy="161" rx="58" ry="73"/><g transform="rotate(29.9)"><ellipse cx="450" cy="70" rx="57" ry="69"/><ellipse cx="375" cy="79" rx="57" ry="69"/><ellipse cx="279" cy="87" rx="57" ry="69"/><ellipse cx="192" cy="106" rx="57" ry="69"/></g></g><ellipse transform="rotate(66.5)" fill="#d50032" stroke-width="4" cx="149" cy="-149" rx="456" ry="148"/><g transform="scale(1.25 .85)"><ellipse cx="56" cy="-579" rx="49" ry="63"/><ellipse cx="50" cy="-658" rx="49" ry="63"/><ellipse cx="-18" cy="-563" rx="46" ry="67"/><ellipse cx="-4" cy="-649" rx="46" ry="66"/><ellipse cx="-80" cy="-647" rx="52" ry="67"/><ellipse cx="15" cy="-758" rx="49" ry="63"/><ellipse cx="-50" cy="-746" rx="46" ry="66"/><ellipse cx="-148" cy="-643" rx="46" ry="67"/><ellipse cx="-132" cy="-693" rx="46" ry="66"/><ellipse cx="-113" cy="-749" rx="46" ry="66"/></g><g transform="rotate(66.2)"><ellipse cx="103" cy="-216" rx="543" ry="188"/><ellipse cx="245" cy="-323" rx="114" ry="36"/></g><path d="M378 94c153 187 134 306 118 406L279 267V33z"/><path d="M391 245c154 187 135 306 119 406L215 194v-307c23 60 23 171 176 358z"/><path d="M396 367c157 183 140 303 126 404-50-115-78-188-236-372-157-184-83-317-74-386 25 59 27 170 184 354z"/><ellipse transform="rotate(65)" cx="46" cy="-295" rx="202" ry="66"/><ellipse transform="rotate(65.7)" cx="112" cy="-197" rx="166" ry="58"/><ellipse transform="rotate(66.8)" cx="145" cy="-104" rx="166" ry="58"/><ellipse transform="rotate(62)" cx="-45" cy="-265" rx="127" ry="46"/><ellipse transform="rotate(65.6)" cx="-44" cy="-186" rx="127" ry="46"/><g stroke-linecap="round"><path fill="none" d="M439 750a59 59 0 1 0 0 118"/><path d="M21-146a217 46 68 1 0 82-43"/><ellipse transform="rotate(65.6)" cx="-166" cy="-233" rx="127" ry="46"/><ellipse transform="rotate(66.8)" cx="-167" cy="-145" rx="127" ry="46"/><path d="M-30-299a155 33 59.7 1 0 54-41"/><path d="M1-349a140 32 59.8 1 0 65-21M117-323a214 46 59.3 1 0 75-56"/><path d="M48-388a161 34 62.4 1 0 53-45"/></g><g fill="#9063cd"><path id="e" d="M97-553c-29 30 1 84 27 106 31 26 201 207 321 56-96-2-276-228-348-162z"/><use xlink:href="#e" x="-21" y="-89"/><use xlink:href="#e" x="-48" y="-174"/><use xlink:href="#e" x="-107" y="-271"/><path d="M-219-917c61-46 173-59 260-15 73 36 194 181 285 216-64 11-103 1-144-18-81 58-110 67-192 79-115 16-210-14-244-73-34-57-19-147 35-189z"/></g><g transform="scale(1.4 .7)"><ellipse fill="#d50032" cx="-64" cy="-1181" rx="38" ry="44"/><ellipse fill="#000" cx="-66" cy="-1184" rx="13" ry="23" stroke="none"/></g><g fill="#ffcd00"><ellipse transform="rotate(69.6)" cx="-747" cy="-11" rx="45" ry="73"/><path d="M-206-786c5 23-12 55-50 66-38 16-67 52-84 111-58-134-21-191 41-205 53-17 85-15 93 28z"/></g><circle fill="#000" cx="-262" cy="-756" r="13" stroke="none"/></svg>

After

Width:  |  Height:  |  Size: 4.7 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 145 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="900" height="600"><path fill="#fff" d="M0 0h900v600H0z"/><path fill="#063" d="M0 0h450v600H0z"/><path fill="#d21034" d="M579.904 225a150 150 0 1 0 0 150 120 120 0 1 1 0-150m5.772 75L450 255.916l83.853 115.413V228.671L450 344.084z"/></svg>

After

Width:  |  Height:  |  Size: 285 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 212 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="990" height="630"><path fill="#0072ce" d="M0 0h990v315H0z"/><path d="M0 210h990v315H0z"/><path fill="#fff" d="M0 420h990v210H0z"/></svg>

After

Width:  |  Height:  |  Size: 183 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 18 KiB

View File

@@ -0,0 +1 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="600" height="300"><path d="M0 0h600v150H0z"/><path fill="#007a3d" d="M0 150h600v150H0z"/><path fill="#fff" d="M0 100h600v100H0z"/><path d="m0 0 200 150L0 300z" fill="#c4111b"/><circle cx="300" cy="150" r="40" fill="#c4111b"/><circle cx="315" cy="150" r="40" fill="#fff"/><path d="m289.263 174.22 17.056-12.192 16.923 12.377-6.325-19.99 17-12.27-20.965-.16-6.416-19.961-6.632 19.89-20.966-.067 16.867 12.454-6.542 19.92z" fill="#c4111b"/></svg>

After

Width:  |  Height:  |  Size: 504 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="600" viewBox="0 0 14400 7200"><path fill="#e4002b" d="M0 0h14400v7200H0z"/><path fill="#43b02a" d="M0 0h14400v3600z"/><path fill="#418fde" d="M14400 3600v3600H0z"/><g fill="#ffc72c"><path id="a" d="M3120 2138c14 9 82-85 163-122 69-32 146-31 218-19-22 123-387 146-389 195 35 7 135-29 288-54-217 294-475 155-560 177-48 12-107 56-107 79 118-47 169 54 284-7-38 222-430 318-512 188-64 65-59 90-66 105 127-60 200 80 289-32-13 222-307 371-466 355-11 20-64 134-60 155 18-7 7-38 113-50 162-18 164-51 215-152 62 114-180 486-381 594-3 27 1 100 27 130 15-59 51-74 97-103 73-45 129-68 155-218 88 139-9 596-162 773 16 34 56 121 69 141-20-80 44-101 100-194 56-94 55-259 53-283 152 202 161 806 137 871 11 21 113 108 157 137 5-13 2-11-20-58-40-79-11-314-102-475 149 16 401 403 485 553 93 150 199 266 390 336 175 64 380 222 469 318l-84 72c-55-47-326-316-401-311-509 40-748-32-1005-137-338-139-507-459-493-479 101 94 482 168 602 159l-58-56c-130 38-480-144-589-318-186-307-163-542-152-558 119 231 283 302 391 358l-8-56c-413-181-407-628-407-682 0-191 65-294 88-299-16 141 137 347 206 399l13-43c-140-118-188-336-204-459-24-220 202-468 233-484-49 244-3 352 40 441l20-47c-171-306 97-752 296-743-106 98-82 284-66 329 11-18 14-21 28-36-42-311 251-487 359-524 66-20 158-22 159-9-30 34-225 103-223 291 11-13 66-45 97-54 37-166 242-282 409-282 21 0 34 3 38 5-9 6-189 160-173 183z"/><path d="M3671 5280c-16 167 24 206 1 238-30-31-160-5-175-20 50-96 70-785-40-1162-51-45-200-221-243-260-93 76-449 78-523-210 56 38 208 94 289 79-123-44-314-188-294-373 29 19 73 83 112 98 44 15 148-4 181 16 37 21 72 86 80 103 12-32 8-188-104-227 33-28 146-5 222 94 111 151 65 296 85 356 16 49 133 161 163 184 1-85-64-216 19-508 29-102 125-254 146-321-44-47-159-159-182-173-25-1-246 39-339-18-50-29-94-64-113-113 32 4 202 26 204 9 2-18-9-9-78-56-51-47-112-106-107-272 34 49 61 118 156 99 63-9 131 67 147 104 2-38-16-151-78-221 19-27 224 134 233 273 2 46-3 81-7 118-2 27 161 185 208 173 19-3 66-207 84-302 22-116 67-341-20-472-21 13-124 53-254-86-54-62-59-126-38-145 19 34 119 119 143 103 8-34-125-49-75-244 8-25 27-35 42-37 15 87 89 100 144 220 21-39-4-93 3-130 8-40 7-86-15-103 22-7 62 0 125 149 35 88-3 215-22 242-1 34 49 71 65 210 18 120-26 298-35 335 38-24 85-46 100-94 16-56 3-167 56-252 37-64 100-110 203-78-12 34-41 15-79 58-30 48-44 83-31 119 24-4 17-46 63-74 70-36 100 3 142-7 39-12 63-39 74-54 12 31-5 128-126 203-3 2-7 4-10 6-42 23-43 8-51 15-12 13 20 28 72 21s99-24 110-58c12 8 27 70-98 153-83 50-222 32-264 10-20 11-154 94-167 122-25 113-136 380-238 563 2 17 82-7 168-84 38-32 95-264 171-326 65-50 141-42 201-38-29 10-120 60-120 146 12 11 33-36 88-46 53-6 98 27 138 27 40 2 106-35 115-47-37 177-202 224-312 232 22 35 147 64 260-15 5 17-38 126-192 173-166 50-188-44-258-40-68 3-128 67-157 82-44 24-109 22-122 39-18 23-15 223 15 363 21 96 67 244 93 337 40-40 151-57 221-222-25-75-70-374 292-446 7 15-61 45-84 89-32 48-35 139-24 171 35-44 72-106 193-99 76 5 128-22 171-74 13 5-13 136-83 215-60 70-140 102-150 131 49-3 128-10 251-123 5 27-65 184-207 257-90 41-249 41-342-11-24 40-107 152-213 206 41 379 36 535 21 700z"/><use xlink:href="#a" transform="matrix(-1 0 0 1 7200 0)"/></g></svg>

After

Width:  |  Height:  |  Size: 3.2 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 149 KiB

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="1200" height="600"><path fill="#da121a" d="M0 0h1200v600H0z"/><path fill="#fcdd09" d="M0 0h1200v400H0z"/><path fill="#078930" d="M0 0h1200v200H0z"/><g transform="matrix(1.66667 0 0 1.66667 600 300)"><circle r="120" fill="#0f47af"/><g id="a"><path d="m0-96-4.206 12.944 17.348 53.39h-23.13l-2.599 8h74.163l11.011-8H21.553Z" fill="#fcdd09"/><path d="m25.863-35.597 30.564-42.069" stroke="#fcdd09" stroke-width="4"/></g><use xlink:href="#a" transform="rotate(72)" width="100%" height="100%"/><use xlink:href="#a" transform="rotate(144)" width="100%" height="100%"/><use xlink:href="#a" transform="rotate(-144)" width="100%" height="100%"/><use xlink:href="#a" transform="rotate(-72)" width="100%" height="100%"/></g></svg>

After

Width:  |  Height:  |  Size: 809 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="1800" height="1100" viewBox="0 0 18 11"><path fill="#fff" d="M0 0h18v11H0z"/><path d="M0 5.5h18M6.5 0v11" stroke="#002F6C" stroke-width="3"/></svg>

After

Width:  |  Height:  |  Size: 194 B

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 39 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 128 KiB

View File

@@ -0,0 +1 @@
<svg version="1.0" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="760" height="400" viewBox="-19 -10 38 20"><path fill="#75b2dd" d="M-19-10h38v20h-38z"/><g id="c" transform="translate(0 -6)" fill="#fff"><g id="b"><path id="a" d="M0-2v2h1" transform="rotate(18 0 -2)"/><use xlink:href="#a" transform="scale(-1 1)"/></g><use xlink:href="#b" transform="rotate(72)"/><use xlink:href="#b" transform="rotate(144)"/><use xlink:href="#b" transform="rotate(216)"/><use xlink:href="#b" transform="rotate(288)"/></g><use xlink:href="#c" transform="rotate(90)"/><use xlink:href="#c" transform="rotate(180)"/><use xlink:href="#c" transform="rotate(270)"/></svg>

After

Width:  |  Height:  |  Size: 686 B

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