pull/81/head
jimmys-box 2 years ago
parent 23df5a0957
commit 28fa4235ca

@ -1,35 +0,0 @@
{
"env": {
"browser": true,
"es6": true,
"node": true,
"commonjs": true
},
"parser": "babel-eslint",
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"globals": {
"Atomics": "readonly",
"SharedArrayBuffer": "readonly"
},
"parserOptions": {
"ecmaFeatures": {
"jsx": true
},
"ecmaVersion": 2018,
"sourceType": "module"
},
"plugins": [
"react"
],
"settings": {
"react": {
"version": "detect"
}
},
"rules": {
"no-console": "off"
}
}

36
.gitignore vendored

@ -1,36 +0,0 @@
# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
# dependencies
/node_modules
/.pnp
.pnp.js
# testing
/coverage
# next.js
/.next/
/out/
# production
/build
# misc
.DS_Store
# debug
npm-debug.log*
yarn-debug.log*
yarn-error.log*
# local env files
.env
.env.local
.env.development.local
.env.test.local
.env.production.local
# Local Netlify folder
.netlify
functions/next_*
.env

1239
LICENSE

File diff suppressed because it is too large Load Diff

@ -1,28 +0,0 @@
# Usage: $ make
NPM := $(shell eval command -v npm)
APT := $(shell eval command -v apt)
.PHONY: help
help: ## Usage: make <concept>, eg: make install
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
install: ## Install required javascript dependencies
ifndef NPM
ifdef APT
@echo "Installing NPM debian package…"
sudo apt install -y npm
endif
endif
npm install
demo: ## Run locally at http://localhost:3000
npm run dev
love: ## Fund development of Majority Judgment
firefox https://www.paypal.com/donate/?hosted_button_id=QD6U4D323WV4S

@ -1,62 +0,0 @@
# Front-end election web application using NextJs
[![aGPLV3](https://img.shields.io/github/license/MieuxVoter/mv-front-react)](./LICENSE.md)
[![Netlify Status](https://api.netlify.com/api/v1/badges/021c39c6-1018-4e3f-98e2-f808b4ea8f6d/deploy-status)](https://app.netlify.com/sites/epic-nightingale-99f910/deploys)
[![Join the Discord chat at https://discord.gg/rAAQG9S](https://img.shields.io/discord/705322981102190593.svg)](https://discord.gg/rAAQG9S)
:ballot_box: This project is going to be the default front-end for our [election application](https://app.mieuxvoter.fr).
:computer: It is connected to our [back-end](https://github.com/MieuxVoter/mv-api-server-apiplatform). The back-end is used for storing the votes and computing the majority judgment ranking. You can use our back-end free of charge, but you can also start your own instance of the back-end using our Dockerfiles.
:incoming_envelope: The front-end is responsable for sending the invitation mails. You can find the mail templates [on the functions folder](./functions/send-invite-email).
:world_map: The front-end stores its own translations. See below how you can edit them easily.
## :paintbrush: Customize your own application
The separation between the front-end and the back-end makes it easy to customize your own application. Just install
## :gear: Install options
**Option one:** One-click deploy
[![Deploy to Netlify](https://www.netlify.com/img/deploy/button.svg)](https://app.netlify.com/start/deploy?repository=https://github.com/MieuxVoter/mv-front-react&utm_source=github)
**Option two:** Manual clone
1. Clone this repo: `git clone https://github.com/MieuxVoter/mv-front-nextjs.git`
2. Navigate to the directory and install dependencies: `npm install` or `make`
3. Start a local server: `npm run dev` and open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
4. Make your changes
5. Deploy your project.
We advise for deploying the project to [Netlify](https://netlify.com), because we wrote the mail functions for the framework. Netlify parameters are written in `netlify.toml`.
If you decide to deploy your project in another way, please fill a pull-request to guide futur users!
## :incoming_envelope: Support for mail
To add support for mail sending, you need to connect the application with a mailing service. For now, we only support [Mailgun](mailgun.com), which offer very competitive prices. You can fill an issue if you require another mailing service.
To connect your application with Mailgun, you need to add the environment variables to your project:
- `MAILGUN_API_KEY`,
- `MAILGUN_DOMAIN`,
- `MAILGUN_URL`,
- `FROM_EMAIL_ADDRESS`,
- `CONTACT_TO_EMAIL_ADDRESS`.
You can add the environment variables on an `.env` file or directly on [Netlify](https://docs.netlify.com/configure-builds/environment-variables/).
## :world_map: I18N at heart
You can directly modified the translation files in the folder `public/locales`.
In case you want to add support for another language, you need as well to add it on `net-i18next.config.js` and on the `LanguageSelector` component.

@ -1,627 +0,0 @@
import { useState } from "react";
import Head from "next/head";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import { useRouter } from "next/router";
import {
Container,
Row,
Col,
Collapse,
Card,
CardHeader,
CardBody,
Table,
} from "reactstrap";
import { getResults, getDetails, apiErrors } from "@services/api";
import { grades } from "@services/grades";
import { translateGrades } from "@services/grades";
import Facebook from "@components/banner/Facebook";
import Error from "@components/Error";
import config from "../../../next-i18next.config.js";
export async function getServerSideProps({ query, locale }) {
const { pid, tid } = query;
const [res, details, translations] = await Promise.all([
getResults(pid),
getDetails(pid),
serverSideTranslations(locale, [], config),
]);
if (typeof res === "string" || res instanceof String) {
return { props: { err: res.slice(1, -1), ...translations } };
}
if (typeof details === "string" || details instanceof String) {
return { props: { err: res.slice(1, -1), ...translations } };
}
if (!details.candidates || !Array.isArray(details.candidates)) {
return { props: { err: "Unknown error", ...translations } };
}
return {
props: {
title: details.title,
numGrades: details.num_grades,
candidates: res,
pid: pid,
...translations,
},
};
}
const Result = ({ candidates, numGrades, title, pid, err }) => {
const { t } = useTranslation();
if (err && err !== "") {
return <Error value={apiErrors(err, t)} />;
}
const router = useRouter();
const allGrades = translateGrades(t);
const grades = allGrades.filter(
(grade) => grade.value >= allGrades.length - numGrades
);
const offsetGrade = grades.length - numGrades;
const colSizeCandidateLg = 4;
const colSizeCandidateMd = 6;
const colSizeCandidateXs = 12;
const colSizeGradeLg = 1;
const colSizeGradeMd = 1;
const colSizeGradeXs = 1;
const origin =
typeof window !== "undefined" && window.location.origin
? window.location.origin
: "http://localhost";
console.log("origin", origin);
const urlVote = new URL(`/vote/${pid}`, origin);
const [collapseProfiles, setCollapseProfiles] = useState(false);
const [collapseGraphics, setCollapseGraphics] = useState(false);
const sum = (seq) => Object.values(seq).reduce((a, b) => a + b, 0);
const numVotes =
candidates && candidates.length > 0 ? sum(candidates[0].profile) : 1;
const gradeIds =
candidates && candidates.length > 0
? Object.keys(candidates[0].profile)
: [];
return (
<Container>
<Head>
<title>{title}</title>
<link rel="icon" href="/favicon.ico" />
<meta property="og:title" content={title} />
</Head>
{/* <Row>
<Col xs="12">
<h3>{title}</h3>
</Col>
</Row>
<Row className="mt-5">
<Col>
<ol className="result">
{candidates.map((candidate, i) => {
const gradeValue = candidate.grade + offsetGrade;
return (
<li key={i} className="mt-2">
<br />
<span className="mt-2 ml-2">{candidate.name}</span><br />
<span
className="badge badge-light ml-2 mt-2"
style={{
backgroundColor: grades.slice(0).reverse()[
candidate.grade
].color,
color: "#fff",
}}
>
{allGrades.slice(0).reverse()[gradeValue].label}
</span>
</li>
);
})}
</ol>
<h5>
<small>
{t("resource.numVotes")}
{" " + numVotes}
</small>
</h5>
</Col>
</Row>
{candidates.map((candidate, i) => {
const gradeValue = candidate.grade + offsetGrade;
return (
<Row key={i}>
<Col>
<Card>
<CardHeader
className="pointer"
onClick={() => setCollapseGraphics(!collapseGraphics)}
>
<h4
className={
"m-0 panel-title " + (collapseGraphics ? "collapsed" : "")
}
>
<span style={{color: "#2400FD"}}>{candidate.name}</span>
<span
className="badge badge-light ml-2 mt-2"
style={{
backgroundColor: grades.slice(0).reverse()[
candidate.grade
].color,
color: "#fff",
}}
>
{allGrades.slice(0).reverse()[gradeValue].label}
</span>
</h4>
</CardHeader>
<Collapse isOpen={collapseGraphics}>
<CardBody className="pt-5">
<div>
<div
className="median"
style={{ height: candidates.length * 28 + 30 }}
/>
<table style={{ width: "100%" }}>
<tbody>
{candidates.map((candidate, i) => {
return (
<tr key={i}>
<td style={{ width: "30px" }}>{i + 1}</td>
{candidate.label}
<td>
<table style={{ width: "100%" }}>
<tbody>
<tr>
{gradeIds
.slice(0)
.reverse()
.map((id, i) => {
const value = candidate.profile[id];
if (value > 0) {
let percent =
(value * 100) / numVotes + "%";
if (i === 0) {
percent = "auto";
}
return (
<td
key={i}
style={{
width: percent,
backgroundColor:
grades[i].color,
}}
>
&nbsp;
</td>
);
} else {
return null;
}
})}
</tr>
</tbody>
</table>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
<div className="mt-4">
<small>
<span>
{candidate.name}
</span>
</small>
</div>
<div className="mt-2">
<small>
{grades.map((grade, i) => {
return (
<span
key={i}
className="badge badge-light mr-2 mt-2"
style={{
backgroundColor: grade.color,
color: "#fff",
}}
>
{grade.label}
</span>
);
})}
</small>
</div>
</CardBody>
</Collapse>
</Card>
</Col>
</Row>
);
})}
<Row className="mt-5">
<Col>
<Card className="bg-light text-primary">
<CardHeader
className="pointer"
onClick={() => setCollapseGraphics(!collapseGraphics)}
>
<h4
className={
"m-0 panel-title " + (collapseGraphics ? "collapsed" : "")
}
>
{t("Graph")}
</h4>
</CardHeader>
<Collapse isOpen={collapseGraphics}>
<CardBody className="pt-5">
<div>
<div
className="median"
style={{ height: candidates.length * 28 + 30 }}
/>
<table style={{ width: "100%" }}>
<tbody>
{candidates.map((candidate, i) => {
return (
<tr key={i}>
<td style={{ width: "30px" }}>{i + 1}</td>
{candidate.label}
<td>
<table style={{ width: "100%" }}>
<tbody>
<tr>
{gradeIds
.slice(0)
.reverse()
.map((id, i) => {
const value = candidate.profile[id];
if (value > 0) {
let percent =
(value * 100) / numVotes + "%";
if (i === 0) {
percent = "auto";
}
return (
<td
key={i}
style={{
width: percent,
backgroundColor:
grades[i].color,
}}
>
&nbsp;
</td>
);
} else {
return null;
}
})}
</tr>
</tbody>
</table>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
<div className="mt-4">
<small>
{candidates.map((candidate, i) => {
return (
<span key={i}>
{i > 0 ? ", " : ""}
<b>{i + 1}</b>: {candidate.name}
</span>
);
})}
</small>
</div>
<div className="mt-2">
<small>
{grades.map((grade, i) => {
return (
<span
key={i}
className="badge badge-light mr-2 mt-2"
style={{
backgroundColor: grade.color,
color: "#fff",
}}
>
{grade.label}
</span>
);
})}
</small>
</div>
</CardBody>
</Collapse>
</Card>
</Col>
</Row>
<Row className="mt-5">
<Col>
<Card className="bg-light text-primary">
<CardHeader
className="pointer"
onClick={() => setCollapseGraphics(!collapseGraphics)}
>
<h4
className={
"m-0 panel-title " + (collapseGraphics ? "collapsed" : "")
}
>
{t("Graph")}
</h4>
</CardHeader>
<Collapse isOpen={collapseGraphics}>
<CardBody className="pt-5">
<div>
<div
className="median"
style={{ height: candidates.length * 28 + 30 }}
/>
<table style={{ width: "100%" }}>
<tbody>
{candidates.map((candidate, i) => {
return (
<tr key={i}>
<td style={{ width: "30px" }}>{i + 1}</td>
{candidate.label}
<td>
<table style={{ width: "100%" }}>
<tbody>
<tr>
{gradeIds
.slice(0)
.reverse()
.map((id, i) => {
const value = candidate.profile[id];
if (value > 0) {
let percent =
(value * 100) / numVotes + "%";
if (i === 0) {
percent = "auto";
}
return (
<td
key={i}
style={{
width: percent,
backgroundColor:
grades[i].color,
}}
>
&nbsp;
</td>
);
} else {
return null;
}
})}
</tr>
</tbody>
</table>
</td>
</tr>
);
})}
</tbody>
</table>
</div>
<div className="mt-4">
<small>
{candidates.map((candidate, i) => {
return (
<span key={i}>
{i > 0 ? ", " : ""}
<b>{i + 1}</b>: {candidate.name}
</span>
);
})}
</small>
</div>
<div className="mt-2">
<small>
{grades.map((grade, i) => {
return (
<span
key={i}
className="badge badge-light mr-2 mt-2"
style={{
backgroundColor: grade.color,
color: "#fff",
}}
>
{grade.label}
</span>
);
})}
</small>
</div>
</CardBody>
</Collapse>
</Card>
</Col>
</Row>
<Row className="mt-3">
<Col>
<Card className="bg-light text-primary">
<CardHeader
className="pointer"
onClick={() => setCollapseProfiles(!collapseProfiles)}
>
<h4
className={
"m-0 panel-title " + (collapseProfiles ? "collapsed" : "")
}
>
{t("Preference profile")}
</h4>
</CardHeader>
<Collapse isOpen={collapseProfiles}>
<CardBody>
<div className="table-responsive">
<Table className="profiles">
<thead>
<tr>
<th>#</th>
{grades.map((grade, i) => {
return (
<th key={i}>
<span
className="badge badge-light"
style={{
backgroundColor: grade.color,
color: "#fff",
}}
>
{grade.label}{" "}
</span>
</th>
);
})}
</tr>
</thead>
<tbody>
{candidates.map((candidate, i) => {
return (
<tr key={i}>
<td>{i + 1}</td>
{gradeIds
.slice(0)
.reverse()
.map((id, i) => {
const value = candidate.profile[id];
const percent = (
(value / numVotes) *
100
).toFixed(1);
return <td key={i}>{percent} %</td>;
})}
</tr>
);
})}
</tbody>
</Table>
</div>
<small>
{candidates.map((candidate, i) => {
return (
<span key={i}>
{i > 0 ? ", " : ""}
<b>{i + 1}</b>: {candidate.name}
</span>
);
})}
</small>
</CardBody>
</Collapse>
</Card>
</Col>
</Row>
<Row>
<Col xs="12" className="text-center pt-2 pb-5">
<Facebook
className="btn btn-outline-light m-2"
text={t("Share results on Facebook")}
url={urlVote}
title={title}
/>
</Col>
</Row>*/}
</Container>
);
};
export default Result;

@ -1,166 +0,0 @@
import React from 'react';
import plotly from 'plotly.js/dist/plotly';
import createPlotComponent from 'react-plotly.js/factory';
import LoadingScreen from "./LoadingScreen";
function Bulles (props) {
// récupération des résultats de l'élection et stockage en tableau
const votesBrut = (Object.values(props))[0];
// déclaration et initialisation des mentions et couleurs
const mentionsBrut = ['Passable', 'Assez bien', 'Bien', 'Très bien', 'Excellent'];
const couleursBrut = ['#BB9C42', '#AABA44', '#DCDF44', '#B3D849', '#61AD45'];
//----------- Traitement des données -----------//
// fonction d'inversement des éléments de tableau
function inverse(obj){
var retobj = {};
for(var key in obj){
retobj[obj[key]] = key;
}
return retobj;
}
// fonction de réduction d'amplitude permettant de conserver une représentation ordinale du nombre de votes sans décalage visuel trop important
/*
Pattern de calcul :
Soient Ai, Bi, Ci, Di, Ei les nombres de votes initiaux fournis dans le tableau classé par ordre mélioratif de mention (de Passable à Excellent). Il vient :
A = 1
B = <{[1 + (Bi/Ai)] / 40} * A>
C = <{[1 + (Ci/Bi)] / 40} * B>
D = <{[1 + (Di/Ci)] / 40} * C>
E = <{[1 + (Ei/Di)] / 40} * D>
*/
function redAmpli(tab) {
var nvTab = [];
nvTab[0] = 100;
for(i = 1; i < tab.length; i++) {
nvTab[i] = ( (1 + ((tab[i]/tab[(i-1)]) / 40 ) ) * nvTab[(i-1)]);
}
return nvTab;
}
// déclaration de l'objet votes-mention et votes-couleur
var votesMentionNonOrdonnes = {};
var votesCouleurNonOrdonnes = {};
// initialisation votes-mention ordonnés croissants
for (var i = 0; i < mentionsBrut.length; i++) {
votesMentionNonOrdonnes[votesBrut[i]] = mentionsBrut[i];
votesCouleurNonOrdonnes[votesBrut[i]] = couleursBrut[i];
}
// déclaration des mentions-votes par ordre croissant
var votesMentionOrdonnes = inverse(votesMentionNonOrdonnes);
var votesCouleurOrdonnes = inverse(votesCouleurNonOrdonnes);
// vérification du nombre de votes classés par ordre croissant et passés initialement en propriétés au composant
console.log("Les données transmises au composant concernant le nombre de votes par mention sont : ");
console.log(votesBrut);
// vérification des mentions destinées à être associées aux votes et ordonnées initialement par ordre mélioratif
console.log("Les mentions des votes sont classées initialement par ordre mélioratif de la façon suivante :");
console.log(mentionsBrut);
// vérification du nombre de votes classés par ordre croissant
console.log("Les mentions-votes classées par ordre croissant de votes sont : ");
console.log(votesMentionOrdonnes);
// séparation des mentions et des votes
const mentions = Object.keys(votesMentionOrdonnes);
const votes = Object.values(votesMentionOrdonnes);
const couleurs = Object.keys(votesCouleurOrdonnes);
// vérification des mentions et des votes prêts à être traités pour la représentation graphique
console.log('La liste des mentions issue du classement par ordre croissant de votes est :');
console.log(mentions);
console.log('La liste du nombre de votes correspondant, classée par ordre croissant, est :');
console.log(votes);
// déclaration et initialisation des rayons de bulle pour la représentation graphique
var rayons = [];
rayons = redAmpli(votes)
// vérification des rayons
console.log('La liste des rayons à représenter graphiquement est la suivante :');
console.log(rayons);
// déclaration et initialisation des textes des bulles
const texteBulle1 = (mentions[0] + "<br>" + votes[0] + " votes").toString();
const texteBulle2 = (mentions[1] + "<br>" + votes[1] + " votes").toString();
const texteBulle3 = (mentions[2] + "<br>" + votes[2] + " votes").toString();
const texteBulle4 = (mentions[3] + "<br>" + votes[3] + " votes").toString();
const texteBulle5 = (mentions[4] + "<br>" + votes[4] + " votes").toString();
// déclaration et initialisation d'une instance de graphique en bulles
// const Plot = createPlotComponent(plotly);
const Plot = require('react-plotly.js').default;
//---------------------------------------------//
//----------- Affichage des données -----------//
const [loading, setLoading] = React.useState(true);
React.useEffect(() =>{
setTimeout(() => setLoading(false), 3000);
})
return (
// <div>
// {!loading ? (
// <React.Fragment>
<Plot
data={[
{
x: [0.7, 0.6, 0.5, 0.6, 0.7],
y: [0.3, 0.4, 0.5, 0.6, 0.5],
hovertemplate:
'<b>%{text}</b>' +
'<extra></extra>',
text: [texteBulle1, texteBulle2, texteBulle3, texteBulle4, texteBulle5],
showlegend: false,
mode: 'markers',
marker: {
color: [couleurs[0], couleurs[1], couleurs[2], couleurs[3], couleurs[4]],
size: rayons
}
}
]}
layout={ {
width: 600,
height: 600,
title: 'Nombre de voix par candidat',
xaxis: {
showgrid: false,
showticklabels: false,
showline: false,
zeroline: false,
range: [0, 1]
},
yaxis: {
showgrid: false,
showticklabels: false,
showline: false,
zeroline: false,
range: [0, 1]
}
} }
config={{
displayModeBar: false // this is the line that hides the bar.
}}
/>
// </React.Fragment>
// ) : (
// <LoadingScreen />
// )}
// </div>
)
}
export default Bulles;

@ -1,41 +0,0 @@
import * as React from "react";
import * as d3 from "d3";
function drawChart(svgRef: React.RefObject<SVGSVGElement>) {
const data = [12, 5, 6, 6, 9, 10];
const h = 120;
const w = 250;
const svg = d3.select(svgRef.current);
svg
.attr("width", w)
.attr("height", h)
.style("margin-top", 50)
.style("margin-left", 50);
svg
.selectAll("rect")
.data(data)
.enter()
.append("rect")
.attr("x", (d, i) => i * 40)
.attr("y", (d, i) => h - 10 * d)
.attr("width", 20)
.attr("height", (d, i) => d * 10)
.attr("fill", "steelblue");
}
const Chart: React.FunctionComponent = () => {
const svg = React.useRef<SVGSVGElement>(null);
React.useEffect(() => {
drawChart(svg);
}, [svg]);
return (
<div id="chart">
<svg ref={svg} />
</div>
);
};
export default Chart;

@ -1,21 +0,0 @@
import React, { useRef, useState, useEffect } from 'react';
import D3Chart from './D3Chart';
const ChartWrapper = () => {
const chartArea = useRef(null);
const [chart, setChart] = useState(null);
useEffect(() => {
if (!chart) {
setChart(new D3Chart(chartArea.current));
}
}, [chart]);
return (
<div ref={chartArea}></div>
);
}
export default ChartWrapper;

@ -1,69 +0,0 @@
/* eslint react/prop-types: 0 */
import React from "react";
import { Button } from "reactstrap";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faCopy,
faVoteYea,
faExclamationTriangle,
faExternalLinkAlt,
} from "@fortawesome/free-solid-svg-icons";
const CopyField = (props) => {
const ref = React.createRef();
const handleClickOnField = (event) => {
event.target.focus();
event.target.select();
};
const handleClickOnButton = () => {
const input = ref.current;
input.focus();
input.select();
document.execCommand("copy");
};
const { t, value, iconCopy, iconOpen } = props;
return (
<div className="input-group ">
<input
type="text"
className="form-control"
ref={ref}
value={value}
readOnly
onClick={handleClickOnField}
/>
<div className="input-group-append">
{/*
<Button
href={value}
target="_blank"
rel="noreferrer"
className="btn btn-success"
type="button"
>
<FontAwesomeIcon icon={iconOpen} className="mr-2" />
{t("Go")}
</Button>
*/}
<Button
className="btn btn-secondary"
onClick={handleClickOnButton}
type="button"
>
<FontAwesomeIcon icon={iconCopy} className="mr-2" />
{t("Copy")}
</Button>
</div>
</div>
);
};
CopyField.defaultProps = {
iconCopy: faCopy,
iconOpen: faExternalLinkAlt,
};
export default CopyField;

@ -1,38 +0,0 @@
import * as d3 from 'd3';
const url = "https://udemy-react-d3.firebaseio.com/tallest_men.json";
const WIDTH = 800;
const HEIGHT = 500;
export default class D3Chart {
constructor(element) {
const svg = d3.select(element)
.append("svg")
.attr("width", 800)
.attr("height", 500)
d3.json(url).then(data => {
const max = d3.max(data, d => d.height)
const y = d3.scaleLinear()
.domain([0, max])
.range([0, HEIGHT])
const x = d3.scaleBand()
.domain(data.map(d => d.name))
.range([0, WIDTH])
.padding(0.4)
const rects = svg.selectAll("rect")
.data(data)
rects.enter()
.append("rect")
.attr("x", d => x(d.name))
.attr("y", d => HEIGHT - y(d.height))
.attr("width", x.bandwidth)
.attr("height", d => y(d.height))
.attr("fill", "grey")
})
}
}

@ -1,40 +0,0 @@
import Link from "next/link";
import { Container, Row, Col } from "reactstrap";
import { useTranslation } from "next-i18next";
const Error = (props) => {
const { t } = useTranslation();
return (
<Container>
<Row>
<Link href="/">
<a className="d-block ml-auto mr-auto mb-4">
<img src="/logos/logo-line-white.svg" alt="logo" height="128" />
</a>
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center">
<h4>{props.value}</h4>
</Col>
</Row>
<Row className="mt-4">
<Col className="text-right mr-4">
<Link href="/">
<a className="btn btn-secondary">{t("common.backHomepage")}</a>
</Link>
</Col>
<Col className="text-left ml-4">
<a
href="mailto:app@mieuxvoter.fr?subject=[HELP]"
className="btn btn-success"
>
{t("resource.help")}
</a>
</Col>
</Row>
</Container>
);
};
export default Error;

@ -1,75 +0,0 @@
import React from "react"
import styled from "styled-components"
const Screen = styled.div`
position: relative;
opacity: 0;
animation: fade 0.4s ease-in forwards;
background: black;
@keyframes fade {
0% {
opacity: 0.4;
}
50% {
opacity: 0.8;
}
100% {
opacity: 1;
}
}
`;
const Balls = styled.div`
display: flex;
.ball {
height: 20px;
width: 20px;
border-radius: 50%;
background: red;
margin: 0 6px 0 0;
animation: oscillate 0.7s ease-in forwards infinite;
}
.one {
animation-delay: 0.5s;
}
.two {
animation-delay: 1s;
}
.three {
animation-delay: 2s;
}
@keyframes oscillate {
0% {
transform: translateY(0);
}
50% {
transform: translateY(20px);
}
100% {
transform: translateY(0);
}
}
`;
const LoadingScreen = () => {
return (
<Screen>
<Balls>
<div className="ball one"></div>
<div className="ball two"></div>
<div className="ball three"></div>
</Balls>
</Screen>
);
};
export default LoadingScreen;

@ -1,62 +0,0 @@
import React, { useEffect, useRef, useState } from "react";
import ReactDOM from "react-dom";
import styled from "styled-components";
const Modal = ({ show, onClose, children, title }) => {
const handleCloseClick = (e) => {
e.preventDefault();
onClose();
};
const modalContent = show ? (
<StyledModalOverlay>
<StyledModal>
<StyledModalHeader>
<a href="#" onClick={handleCloseClick}>
x
</a>
</StyledModalHeader>
{title && <StyledModalTitle>{title}</StyledModalTitle>}
<StyledModalBody>{children}</StyledModalBody>
</StyledModal>
</StyledModalOverlay>
) : null;
return (
modalContent
);
};
const StyledModalBody = styled.div`
padding-top: 10px;
`;
const StyledModalHeader = styled.div`
display: flex;
justify-content: flex-end;
font-size: 25px;
`;
const StyledModal = styled.div`
background: white;
width: 500px;
height: 600px;
border-radius: 15px;
padding: 15px;
`;
const StyledModalOverlay = styled.div`
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
background-color: rgba(0, 0, 0, 0.5);
`;
export default Modal;

@ -1,37 +0,0 @@
import React, {Fragment} from 'react';
import Head from 'next/head';
import dynamic from 'next/dynamic';
const Bulles = dynamic(import('./Bulles'), {
ssr: false
})
const nbVotesPassables = 15;
const nbVotesAssezBien = 200;
const nbVotesBien = 389;
const nbVotesTresBien = 12;
const nbVotesExcellent = 2;
const resultats = [nbVotesPassables, nbVotesAssezBien, nbVotesBien, nbVotesTresBien, nbVotesExcellent];
var totalVotes = 0;
for(var i = 0; i < resultats.length; i++) {
totalVotes += resultats[i];
}
function SystemeVote() {
return (
<Fragment>
<Bulles donnees={resultats} />
<p style={{color: '#000000'}}>Le total des votes est de {totalVotes}.</p>
</Fragment>
);
}
export default SystemeVote;

@ -1,29 +0,0 @@
/* eslint react/prop-types: 0 */
import React from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faFacebookSquare } from "@fortawesome/free-brands-svg-icons";
const Facebook = props => {
const handleClick = () => {
const url =
"https://www.facebook.com/sharer.php?u=" +
props.url +
"&t=" +
props.title;
window.open(
url,
"",
"menubar=no,toolbar=no,resizable=yes,scrollbars=yes,height=500,width=700"
);
};
return (
<button className={props.className} onClick={handleClick} type="button">
<FontAwesomeIcon icon={faFacebookSquare} className="mr-2" />
{props.text}
</button>
);
};
export default Facebook;
//i

@ -1,25 +0,0 @@
import PropTypes from 'prop-types';
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faCommentAlt} from "@fortawesome/free-solid-svg-icons";
import {api} from "@services/api"
const Gform = (props) => {
return (
<a
className={props.className}
href={api.feedbackForm}
target="_blank"
rel="noopener noreferrer"
>
<FontAwesomeIcon icon={faCommentAlt} className="mr-2" />
Votre avis nous intéresse !
</a>
);
}
Gform.propTypes = {
className: PropTypes.string,
};
export default Gform;

@ -1,24 +0,0 @@
/* eslint react/prop-types: 0 */
import React from "react";
import i18n from "../../i18n";
const Helloasso = props => {
const locale =
i18n.language.substring(0, 2).toLowerCase() === "fr" ? "fr" : "en";
const linkHelloAssoBanner =
locale === "fr"
? "https://www.helloasso.com/associations/mieux-voter/formulaires/1/widget"
: "https://www.helloasso.com/associations/mieux-voter/formulaires/1/widget/en";
return (
<a href={linkHelloAssoBanner} target="_blank" rel="noopener noreferrer">
<img
src={"/banner/" + locale + "/helloasso.png"}
alt="support us on helloasso"
style={{ width: props.width }}
/>
</a>
);
};
export default Helloasso;

@ -1,44 +0,0 @@
import {useTranslation} from "next-i18next";
import {useRouter} from "next/router"
import {faPaypal} from "@fortawesome/free-brands-svg-icons";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
const Paypal = () => {
const {t} = useTranslation();
// FIXME generate a xx_XX string for locale version
const {locale} = useRouter();
let localeShort = locale.substring(0, 2);
let localeComplete =
localeShort.toLowerCase() + "_" + localeShort.toUpperCase();
if (localeComplete === "en_EN") {
localeComplete = "en_US";
}
const pixelLink =
`https://www.paypal.com/${localeComplete}/i/scr/pixel.gif`;
return (
<div className="d-inline-block m-auto">
<form
action="https://www.paypal.com/cgi-bin/webscr"
method="post"
target="_top"
>
<button
type="submit"
className="btn btn-primary"
title={t("PayPal - The safer, easier way to pay online!")}
>
{" "}
<FontAwesomeIcon icon={faPaypal} className="mr-2" />
{t("Support us !")}
</button>
<input type="hidden" name="cmd" value="_s-xclick" />
<input type="hidden" name="hosted_button_id" value="KB2Z7L9KARS7C" />
<img alt="" border="0" src={pixelLink} width="1" height="1" />
</form>
</div>
);
};
export default Paypal;

@ -1,4 +0,0 @@
import * as React from "react";
import FlagIconFactory from "react-flag-icon-css";
export const FlagIcon = FlagIconFactory(React, { useCssModules: false });

@ -1,57 +0,0 @@
import {useState} from "react";
import {
faTrashAlt,
} from "@fortawesome/free-solid-svg-icons";
import {Button, Modal, ModalHeader, ModalBody, ModalFooter} from "reactstrap";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {useTranslation} from "next-i18next";
const ButtonWithConfirm = ({className, label, onDelete}) => {
const [visibled, setVisibility] = useState(false);
const {t} = useTranslation();
const toggle = () => setVisibility(!visibled)
return (
<div className="input-group-append cancelButton">
<button
type="button"
className={className}
onClick={toggle}
>
<img src="/arrow-dark-left.svg" /><p>Annuler</p>
</button>
<Modal
isOpen={visibled}
toggle={toggle}
className="modal-dialog-centered"
>
<ModalHeader toggle={toggle}>{t("Delete?")}</ModalHeader>
<ModalBody>
{t("Are you sure to delete")}{" "}
{label && label !== "" ? (
<b>&quot;{label}&quot;</b>
) : (
<>{t("the row")}</>
)}{" "}
?
</ModalBody>
<ModalFooter>
<Button
color="primary-outline"
className="text-primary border-primary"
onClick={toggle}>
{t("No")}
</Button>
<Button color="primary"
onClick={() => {toggle(); onDelete();}}
>
{t("Yes")}
</Button>
</ModalFooter>
</Modal>
</div >
);
}
export default ButtonWithConfirm;

@ -1,72 +0,0 @@
import {useState} from 'react'
import ButtonWithConfirm from "./ButtonWithConfirm";
import {
Row,
Col,
Label,
Input,
InputGroup,
InputGroupAddon,
} from "reactstrap";
import {useTranslation} from "react-i18next";
import {
sortableHandle
} from "react-sortable-hoc";
import HelpButton from "@components/form/HelpButton";
const DragHandle = sortableHandle(({children}) => (
<span className="input-group-text indexNumber">{children}</span>
));
const CandidateField = ({label, description, candIndex, onDelete, ...inputProps}) => {
const {t} = useTranslation();
return (
<Row>
<Col className="addCandidateCard">
<InputGroup className="addCandidateForm">
<InputGroupAddon addonType="prepend" className="addCandidateHeader">
<DragHandle>
<h6>Ajouter un participant</h6>
<p>Ajoutez une photo, le nom et une description au candidat.</p>
<img src="/avatar.svg" />
</DragHandle>
</InputGroupAddon>
<Label className="addCandidateText">Nom et prenom</Label>
<Input
type="text"
value={label}
{...inputProps}
placeholder={t("resource.candidatePlaceholder")}
tabIndex={candIndex + 1}
maxLength="250"
autoFocus
className="addCandidateText"
/>
<Label className="addCandidateText">Description (Facultatif)</Label>
<Input
type="text"
value={description}
{...inputProps}
placeholder={t("resource.candidatePlaceholder")}
tabIndex={candIndex + 1}
maxLength="250"
autoFocus
className="addCandidateText"
/>
<ButtonWithConfirm className="" label={label} onDelete={onDelete}>
</ButtonWithConfirm>
</InputGroup>
</Col>
<Col xs="auto" className="align-self-center pl-0">
<HelpButton>
{t(
"Enter the name of your candidate or proposal here (250 characters max.)"
)}
</HelpButton>
</Col>
</Row>
);
}
export default CandidateField

@ -1,133 +0,0 @@
import {useState, useEffect, createRef} from 'react'
import {useTranslation} from "react-i18next";
import {
Button,
Card,
CardBody
} from "reactstrap";
import {
faPlus,
} from "@fortawesome/free-solid-svg-icons";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {
sortableContainer,
sortableElement,
sortableHandle
} from "react-sortable-hoc";
import arrayMove from "array-move"
import CandidateField from './CandidateField'
// const SortableItem = sortableElement(({className, ...childProps}) => <li className={className}><CandidateField {...childProps} /></li>);
//
// const SortableContainer = sortableContainer(({children}) => {
// return <ul className="sortable">{children}</ul>;
// });
const SortableItem = ({className, ...childProps}) => <li className={className}><CandidateField {...childProps} /></li>;
const SortableContainer = ({children}) => {
return <ul className="sortable">{children}</ul>;
};
const CandidatesField = ({onChange}) => {
const {t} = useTranslation();
const [candidates, setCandidates] = useState([])
const addCandidate = () => {
if (candidates.length < 1000) {
candidates.push({label: "", description: "", fieldRef: createRef()});
setCandidates([...candidates]);
onChange(candidates)
} else {
console.error("Too many candidates")
}
};
useEffect(() => {
addCandidate();
addCandidate();
}, [])
const removeCandidate = index => {
if (candidates.length === 1) {
const newCandidates = []
newCandidates.push({label: "", description: "", fieldRef: createRef()});
newCandidates.push({label: "", description: "", fieldRef: createRef()});
setCandidates(newCandidates);
onChange(newCandidates)
}
else {
const newCandidates = candidates.filter((c, i) => i != index)
setCandidates(newCandidates);
onChange(newCandidates);
}
};
const editCandidate = (index, label, description) => {
candidates[index].label = label
candidates[index].description = description
setCandidates([...candidates]);
onChange(candidates);
};
const handleKeyPress = (e, index) => {
if (e.key === "Enter") {
e.preventDefault();
if (index + 1 === candidates.length) {
addCandidate();
}
else {
candidates[index + 1].fieldRef.current.focus();
}
}
}
const onSortEnd = ({oldIndex, newIndex}) => {
setCandidates(arrayMove(candidates, oldIndex, newIndex));
};
return (
<div className="sectionAjouterCandidat">
<div className="ajouterCandidat">
<h4>Saisissez ici le nm de vos candidats.</h4>
<SortableContainer onSortEnd={onSortEnd}>
{candidates.map((candidate, index) => {
const className = "sortable"
return (
<SortableItem
className={className}
key={`item-${index}`}
index={index}
candIndex={index}
label={candidate.label}
description={candidate.description}
onDelete={() => removeCandidate(index)}
onChange={(e) => editCandidate(index, e.target.value)}
onKeyPress={(e) => handleKeyPress(e, index)}
innerRef={candidate.fieldRef}
/>
)
})}
</SortableContainer>
<Button
color="secondary"
className="btnValidateCandidate"
tabIndex={candidates.length + 2}
type="button"
onClick={addCandidate}
>
<FontAwesomeIcon icon={faPlus} className="mr-2" />
{t("Add a proposal")}
</Button>
</div>
</div>
);
}
export default CandidatesField

@ -1,164 +0,0 @@
import {useTranslation} from "next-i18next";
import {useState} from "react";
import {
faExclamationTriangle,
faCheck,
} from "@fortawesome/free-solid-svg-icons";
import {Button, Modal, ModalHeader, ModalBody, ModalFooter} from "reactstrap";
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
const ConfirmModal = ({tabIndex, title, candidates, grades, isTimeLimited, start, finish, emails, restrictResult, className, confirmCallback}) => {
const [visibled, setVisibility] = useState(false);
const {t} = useTranslation();
const toggle = () => setVisibility(!visibled)
return (
<div className="input-group-append">
<button
type="button"
className={className}
onClick={toggle}
tabIndex={tabIndex}
>
<FontAwesomeIcon icon={faCheck} className="mr-2" />
{t("Validate")}
</button>
<Modal
isOpen={visibled}
toggle={toggle}
className="modal-dialog-centered"
>
<ModalHeader toggle={toggle}>
{t("Confirm your vote")}
</ModalHeader>
<ModalBody>
<div className="mt-1 mb-1">
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Question of the election")}
</div>
<div className="p-2 pl-3 pr-3 bg-light mb-3">{title}</div>
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Candidates/Proposals")}
</div>
<div className="p-2 pl-3 pr-3 bg-light mb-3">
<ul className="m-0 pl-4">
{candidates.map((candidate, i) => {
if (candidate.label !== "") {
return (
<li key={i} className="m-0">
{candidate.label}
</li>
);
} else {
return <li key={i} className="d-none" />;
}
})}
</ul>
</div>
<div className={(isTimeLimited ? "d-block " : "d-none")} >
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Dates")}
</div>
<div className="p-2 pl-3 pr-3 bg-light mb-3">
{t("The election will take place from")}{" "}
<b>
{start.toLocaleDateString()}, {t("at")}{" "}
{start.toLocaleTimeString()}
</b>{" "}
{t("to")}{" "}
<b>
{finish.toLocaleDateString()}, {t("at")}{" "}
{finish.toLocaleTimeString()}
</b>
</div>
</div>
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Grades")}
</div>
<div className="p-2 pl-3 pr-3 bg-light mb-3">
{grades.map((mention, i) => {
return i < grades.length ? (
<span
key={i}
className="badge badge-light mr-2 mt-2"
style={{
backgroundColor: mention.color,
color: "#fff"
}}
>
{mention.label}
</span>
) : (
<span key={i} />
);
})}
</div>
<div className="text-white bg-primary p-2 pl-3 pr-3 rounded">
{t("Voters' list")}
</div>
<div className="p-2 pl-3 pr-3 bg-light mb-3">
{emails.length > 0 ? (
emails.join(", ")
) : (
<p>
{t("The form contains no address.")}
<br />
<em>
{t(
"The election will be opened to anyone with the link"
)}
</em>
</p>
)}
</div>
{restrictResult ? (
<div>
<div className="small bg-primary text-white p-3 mt-2 rounded">
<h6 className="m-0 p-0">
<FontAwesomeIcon
icon={faExclamationTriangle}
className="mr-2"
/>
<u>{t("Results available at the close of the vote")}</u>
</h6>
<p className="m-2 p-0">
<span>
{t(
"The results page will not be accessible until the end date is reached."
)}{" "}
({finish.toLocaleDateString()} {t("at")}{" "}
{finish.toLocaleTimeString()})
</span>
</p>
</div>
</div>
) : (
<div>
<div className="small bg-primary text-white p-3 mt-2 rounded">
<h6 className="m-0 p-0">
{t("Results available at any time")}
</h6>
</div>
</div>
)}
</div>
</ModalBody>
<ModalFooter>
<Button
color="primary-outline"
className="text-primary border-primary"
onClick={toggle}>
{t("Cancel")}
</Button>
<Button color="primary"
onClick={() => {toggle(); confirmCallback();}}
>
{t("Start the election")}
</Button>
</ModalFooter>
</Modal>
</div >
)
}
export default ConfirmModal

@ -1,75 +0,0 @@
/* eslint react/prop-types: 0 */
import React, { Component } from "react";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faQuestionCircle } from "@fortawesome/free-solid-svg-icons";
class HelpButton extends Component {
constructor(props) {
super(props);
this.state = {
tooltipOpen: false
};
}
showTooltip = () => {
this.setState({
tooltipOpen: true
});
};
hideTooltip = () => {
this.setState({
tooltipOpen: false
});
};
render() {
return (
<span className={this.props.className}>
<span>
{this.state.tooltipOpen ? (
<span
style={{
position: "absolute",
zIndex: 10,
fontSize: "12px",
color: "#000",
backgroundColor: "#fff",
display: "inline-block",
borderRadius: "0.25rem",
boxShadow: "-5px 0 5px rgba(0,0,0,0.5)",
maxWidth: "200px",
padding: "10px",
marginLeft: "-215px",
marginTop: "-25px"
}}
>
<span
style={{
position: "absolute",
width: 0,
height: 0,
borderTop: "10px solid transparent",
borderBottom: "10px solid transparent",
borderLeft: "10px solid #fff",
marginLeft: "190px",
marginTop: "15px"
}}
></span>
{this.props.children}
</span>
) : (
<span />
)}
</span>
<FontAwesomeIcon
icon={faQuestionCircle}
onMouseOver={this.showTooltip}
onMouseOut={this.hideTooltip}
/>
</span>
);
}
}
export default HelpButton;

@ -1,83 +0,0 @@
import Link from "next/link";
import { useTranslation } from "next-i18next";
import Paypal from "../banner/Paypal";
import { useBbox } from "./useBbox";
import { Button, Row, Col } from "reactstrap";
import LanguageSelector from "./LanguageSelector";
const Footer = () => {
const linkStyle = { whiteSpace: "nowrap" };
const { t } = useTranslation();
const [bboxLink1, link1] = useBbox();
const [bboxLink2, link2] = useBbox();
const [bboxLink3, link3] = useBbox();
const [bboxLink4, link4] = useBbox();
const [bboxLink5, link5] = useBbox();
return (
<footer className="text-center">
<div>
<Row className="tacky">
<Col className="col-md-10 col-sm-10">
<Row className="footerRow">
<Col className="col-md-1 footerLogo">
<img src="/logos/logo-footer.svg" alt="logo of Mieux Voter" />
</Col>
<Col ref={link1}
className={bboxLink1.top === bboxLink2.top ? "" : "no-tack"}
>
<Link href="/" style={linkStyle}>
Le jugement majoritaire
</Link>
</Col>
<Col ref={link2}
className={bboxLink2.top === bboxLink3.top ? "" : "no-tack"}
>
<Link
href="https://mieuxvoter.fr/"
target="_blank"
rel="noopener noreferrer"
style={linkStyle}
>
{t("Who are we?")}
</Link>
</Col>
<Col ref={link3}
className={bboxLink3.top === bboxLink4.top ? "" : "no-tack"}
>
<Link href="/faq" style={linkStyle}>
{t("FAQ")}
</Link>
</Col>
<Col ref={link4}
className={bboxLink4.top === bboxLink5.top ? "" : "no-tack"}
>
<Link href="/" style={linkStyle}>
Actualités
</Link>
</Col>
<Col ref={link5}>
<a href="mailto:app@mieuxvoter.fr?subject=[HELP]" style={linkStyle}>
Nous contacter
</a>
</Col>
<Col><LanguageSelector /></Col>
</Row>
</Col>
<Col className="footerButton">
<Col className="col-xl-10 col-md-12 offset-xl-2">
<Button className="btn-primary btn-footer">
<a href="/">
Soutenez-nous
</a>
</Button>
</Col>
</Col>
</Row>
</div>
</footer>
);
};
export default Footer;

@ -1,125 +0,0 @@
/* eslint react/prop-types: 0 */
import { useState } from "react";
import {
Collapse,
Navbar,
NavbarToggler,
Nav,
NavItem,
Button,
} from "reactstrap";
import Link from "next/link";
import { useTranslation } from "next-i18next";
import LanguageSelector from "./LanguageSelector";
import Accordion from "react-bootstrap/Accordion";
const Header = () => {
const [isOpen, setOpen] = useState(false);
const toggle = () => setOpen(!isOpen);
const { t } = useTranslation("common");
return (
<header className="mobile-header">
<Navbar light className="nav-mobile" expand="lg">
<div className="navbar-header">
<Button onClick={toggle} className="navbar-toggle">
<img src="/open-menu-icon.svg" alt="" height="50" />
</Button>
</div>
<Collapse isOpen={isOpen} navbar>
<Nav className="ml-auto navbar-nav-scroll" navbar>
<div className="d-flex flex-row justify-content-between nav-logo">
<Link href="/">
<a className="navbar-brand navbar-brand-mobile">
<img src="/logos/logo.svg" alt="logo" height="80" />
</a>
</Link>
<Button onClick={toggle} className="navbar-toggle navbar-close-button">
<img height="20" src="/close-menu-icon.svg" alt="logo" />
</Button>
</div>
<div>
<NavItem>
<Link href="/">
<a onClick={toggle} className="navbar-my-link nav-link">
Le jugement majoritaire
</a>
</Link>
</NavItem>
<NavItem>
<Link href="/">
<a onClick={toggle} className="navbar-my-link nav-link">
Qui sommes-nous ?
</a>
</Link>
</NavItem>
<NavItem>
<Link href="/">
<a onClick={toggle} className="navbar-my-link nav-link">
Foire aux questions
</a>
</Link>
</NavItem>
<NavItem>
<Link href="/">
<a onClick={toggle} className="navbar-my-link nav-link">
On parle de nous
</a>
</Link>
</NavItem>
<NavItem>
<Link href="/">
<a onClick={toggle} className="navbar-my-link nav-link">
Nous contactez
</a>
</Link>
</NavItem>
<NavItem>
<LanguageSelector style={{ width: "80px" }} />
</NavItem>
</div>
<NavItem className="navbar-credits-container">
<Button className="btn-primary btn-nav">
<a href="/">
Soutenez-nous
</a>
</Button>
<hr />
<div className="navbar-credits sharing">
<p>Partagez lapplication Mieux voter</p>
<Link href="https://www.facebook.com/mieuxvoter.fr/"><img src="/facebook.svg" className="mr-2" /></Link>
<Link href="https://twitter.com/mieux_voter"><img src="/twitter.svg" className="mr-2" /></Link>
</div>
<div className="d-flex">
<Link href="https://jimmys-box.com/">
<a onClick={toggle} className="navbar-jimmy-link">
développé parJIMMY
</a>
</Link>
</div>
</NavItem>
</Nav>
</Collapse>
</Navbar>
</header>
);
};
export default Header;

@ -1,61 +0,0 @@
/* eslint react/prop-types: 0 */
import {useState} from "react";
import {Collapse, Navbar, NavbarToggler, Nav, NavItem} from "reactstrap";
import Link from "next/link";
import Head from "next/head";
import {useTranslation} from 'next-i18next'
import {FontAwesomeIcon} from "@fortawesome/react-fontawesome";
import {faRocket} from "@fortawesome/free-solid-svg-icons";
import LanguageSelector from "./LanguageSelector";
const Header = () => {
const [isOpen, setOpen] = useState(false)
const toggle = () => setOpen(!isOpen);
const {t} = useTranslation()
return (
<>
<Head><title>{t("title")}</title></Head>
<header>
<Navbar color="light" light expand="md">
<Link href="/">
<a className="navbar-brand">
<div className="d-flex flex-row">
<div className="align-self-center">
<img src="/logos/logo-color.svg" alt="logo" height="32" />
</div>
<div className="align-self-center ml-2">
<div className="logo-text">
<h1>
{t("Voting platform")}
<small>{t("Majority Judgment")}</small>
</h1>
</div>
</div>
</div>
</a>
</Link>
<NavbarToggler onClick={toggle} />
<Collapse isOpen={isOpen} navbar>
<Nav className="ml-auto" navbar>
<NavItem>
<Link href="/new/">
<a className="text-primary nav-link"> <FontAwesomeIcon icon={faRocket} className="mr-2" />
{t("Start an election")}
</a>
</Link>
</NavItem>
<NavItem style={{width: "80px"}}>
<LanguageSelector />
</NavItem>
</Nav>
</Collapse>
</Navbar>
</header>
</>
);
}
export default Header;

@ -1,33 +0,0 @@
import {useRouter} from 'next/router'
import ReactFlagsSelect from 'react-flags-select';
const LanguageSelector = () => {
const router = useRouter();
let localeShort = router.locale.substring(0, 2).toUpperCase();
if (localeShort === "EN") localeShort = "GB";
const selectHandler = e => {
let locale = e.toLowerCase();
if (locale === "gb") locale = "en";
router.push("", "", {locale})
};
return (
<ReactFlagsSelect
onSelect={selectHandler}
countries={
// ["GB", "FR", "ES", "DE", "RU"]
["GB", "FR"]
}
showOptionLabel={false}
selected={localeShort}
selectedSize={15}
optionsSize={22}
showSelectedLabel={false}
showSecondaryOptionLabel={false}
className="menu-flags"
/>
);
};
export default LanguageSelector;

@ -1,47 +0,0 @@
/* eslint react/prop-types: 0 */
import { useState } from "react";
import { Container, Row, Col, Nav, NavItem } from "reactstrap";
import Link from "next/link";
import Head from "next/head";
import { useTranslation } from 'next-i18next'
export default function HeaderResultResult() {
;
return (
<Container className="sectionHeaderResult">
<Row>
<Col className="col-md-3">
<Row>
<Col className="sectionHeaderResultSideCol">
<img src="/calendar.svg" />
<p>Clos il y a 2 jours</p></Col>
</Row>
<Row>
<Col className="sectionHeaderResultSideCol"><img src="/avatarBlue.svg" />
<p>14 votants</p></Col>
</Row>
</Col>
<Col className="sectionHeaderResultMiddleCol col-md-6">
<h3>Quel est le meilleur candidat pour les éléctions présidentielle ?</h3>
</Col>
<Col className="col-md-3">
<Row>
<Col className="sectionHeaderResultSideCol"><img src="/arrowUpload.svg" /><p>Télécharger les résultats</p></Col>
</Row>
<Row>
<Col className="sectionHeaderResultSideCol"><img src="/arrowL.svg" /><p>Partagez les résultats</p></Col>
</Row>
</Col>
</Row>
</Container>
);
}

@ -1,38 +0,0 @@
/* eslint react/prop-types: 0 */
import { useState } from "react";
import { Container, Row, Col, Nav, NavItem } from "reactstrap";
import Link from "next/link";
import Head from "next/head";
import { useTranslation } from 'next-i18next'
export default function HeaderMobileResult() {
;
return (
<Container className="sectionHeaderResult">
<Row className="sectionHeaderResultMiddleCol">
<h3>Quel est le meilleur candidat pour les éléctions présidentielle ?</h3>
</Row>
<Row>
<Col className="sectionHeaderResultSideCol">
<img src="/calendar.svg" />
<p>Clos il y a 2 jours</p>
</Col>
<Col className="sectionHeaderResultSideCol">
<img src="/avatarBlue.svg" />
<p>14 votants</p>
</Col>
</Row>
</Container >
);
}

@ -1,14 +0,0 @@
import React from 'react';
import HeaderDesktopResult from './HeaderDesktopResult';
import HeaderMobileResult from './HeaderMobileResult';
import { useMediaQuery } from "react-responsive";
export default function HeaderResult() {
const isMobile = useMediaQuery({ query: "(max-width: 800px)" });
if (isMobile) return <HeaderMobileResult />;
else return <HeaderDesktopResult />;
}

@ -1,20 +0,0 @@
/* eslint react/prop-types: 0 */
import { useState } from 'react';
import { useRef } from 'react';
import { useEffect } from 'react';
export const useBbox = () => {
const ref = useRef();
const [bbox, setBbox] = useState({});
const set = () =>
setBbox(ref && ref.current ? ref.current.getBoundingClientRect() : {});
useEffect(() => {
set();
window.addEventListener('resize', set);
return () => window.removeEventListener('resize', set);
}, []);
return [bbox, ref];
};

@ -1,14 +0,0 @@
import React from "react";
import Image from 'next/image'
const Loader = () => {
return (
<div className="loader bg-primary">
<img src="/loader-pulse-2.gif" alt="Loading..." />
</div>
);
};
export default Loader;

@ -1,18 +0,0 @@
import React from 'react';
import plotly from 'plotly.js/dist/plotly';
import createPlotComponent from 'react-plotly.js/factory';
// const Plot = createPlotComponent(plotly);
const Plot = require('react-plotly.js').default;
export default () => (
<Plot
data={[
{
type: 'bar',
x: ['Taubira', 'Hidalgo', 'Mélenchon'],
y: [29,150,85]
}
]}
layout={ { width: 1000, height: 500, title: 'Nombre de voix par candidat' } }
/>
)

@ -1,8 +0,0 @@
import React from "react";
import Loader from "../loader";
const Wait = () => {
return <Loader />;
};
export default Wait;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

@ -1,93 +0,0 @@
'use strict';
const fs = require('fs');
const path = require('path');
const paths = require('./paths');
// Make sure that including paths.js after env.js will read .env variables.
delete require.cache[require.resolve('./paths')];
const NODE_ENV = process.env.NODE_ENV;
if (!NODE_ENV) {
throw new Error(
'The NODE_ENV environment variable is required but was not specified.'
);
}
// https://github.com/bkeepers/dotenv#what-other-env-files-can-i-use
var dotenvFiles = [
`${paths.dotenv}.${NODE_ENV}.local`,
`${paths.dotenv}.${NODE_ENV}`,
// Don't include `.env.local` for `test` environment
// since normally you expect tests to produce the same
// results for everyone
NODE_ENV !== 'test' && `${paths.dotenv}.local`,
paths.dotenv,
].filter(Boolean);
// Load environment variables from .env* files. Suppress warnings using silent
// if this file is missing. dotenv will never modify any environment variables
// that have already been set. Variable expansion is supported in .env files.
// https://github.com/motdotla/dotenv
// https://github.com/motdotla/dotenv-expand
dotenvFiles.forEach(dotenvFile => {
if (fs.existsSync(dotenvFile)) {
require('dotenv-expand')(
require('dotenv').config({
path: dotenvFile,
})
);
}
});
// We support resolving modules according to `NODE_PATH`.
// This lets you use absolute paths in imports inside large monorepos:
// https://github.com/facebook/create-react-app/issues/253.
// It works similar to `NODE_PATH` in Node itself:
// https://nodejs.org/api/modules.html#modules_loading_from_the_global_folders
// Note that unlike in Node, only *relative* paths from `NODE_PATH` are honored.
// Otherwise, we risk importing Node.js core modules into an app instead of Webpack shims.
// https://github.com/facebook/create-react-app/issues/1023#issuecomment-265344421
// We also resolve them to make sure all tools using them work consistently.
const appDirectory = fs.realpathSync(process.cwd());
process.env.NODE_PATH = (process.env.NODE_PATH || '')
.split(path.delimiter)
.filter(folder => folder && !path.isAbsolute(folder))
.map(folder => path.resolve(appDirectory, folder))
.join(path.delimiter);
// Grab NODE_ENV and REACT_APP_* environment variables and prepare them to be
// injected into the application via DefinePlugin in Webpack configuration.
const REACT_APP = /^REACT_APP_/i;
function getClientEnvironment(publicUrl) {
const raw = Object.keys(process.env)
.filter(key => REACT_APP.test(key))
.reduce(
(env, key) => {
env[key] = process.env[key];
return env;
},
{
// Useful for determining whether were running in production mode.
// Most importantly, it switches React into the correct mode.
NODE_ENV: process.env.NODE_ENV || 'development',
// Useful for resolving the correct path to static assets in `public`.
// For example, <img src={process.env.PUBLIC_URL + '/img/logo.png'} />.
// This should only be used as an escape hatch. Normally you would put
// images into the `src` and `import` them in code to get their paths.
PUBLIC_URL: publicUrl,
}
);
// Stringify all values so we can feed into Webpack DefinePlugin
const stringified = {
'process.env': Object.keys(raw).reduce((env, key) => {
env[key] = JSON.stringify(raw[key]);
return env;
}, {}),
};
return { raw, stringified };
}
module.exports = getClientEnvironment;

@ -1,14 +0,0 @@
'use strict';
// This is a custom Jest transformer turning style imports into empty objects.
// http://facebook.github.io/jest/docs/en/webpack.html
module.exports = {
process() {
return 'module.exports = {};';
},
getCacheKey() {
// The output is always the same.
return 'cssTransform';
},
};

@ -1,40 +0,0 @@
'use strict';
const path = require('path');
const camelcase = require('camelcase');
// This is a custom Jest transformer turning file imports into filenames.
// http://facebook.github.io/jest/docs/en/webpack.html
module.exports = {
process(src, filename) {
const assetFilename = JSON.stringify(path.basename(filename));
if (filename.match(/\.svg$/)) {
// Based on how SVGR generates a component name:
// https://github.com/smooth-code/svgr/blob/01b194cf967347d43d4cbe6b434404731b87cf27/packages/core/src/state.js#L6
const pascalCaseFileName = camelcase(path.parse(filename).name, {
pascalCase: true,
});
const componentName = `Svg${pascalCaseFileName}`;
return `const React = require('react');
module.exports = {
__esModule: true,
default: ${assetFilename},
ReactComponent: React.forwardRef(function ${componentName}(props, ref) {
return {
$$typeof: Symbol.for('react.element'),
type: 'svg',
ref: ref,
key: null,
props: Object.assign({}, props, {
children: ${assetFilename}
})
};
}),
};`;
}
return `module.exports = ${assetFilename};`;
},
};

@ -1,84 +0,0 @@
'use strict';
const fs = require('fs');
const path = require('path');
const paths = require('./paths');
const chalk = require('react-dev-utils/chalk');
/**
* Get the baseUrl of a compilerOptions object.
*
* @param {Object} options
*/
function getAdditionalModulePaths(options = {}) {
const baseUrl = options.baseUrl;
// We need to explicitly check for null and undefined (and not a falsy value) because
// TypeScript treats an empty string as `.`.
if (baseUrl == null) {
// If there's no baseUrl set we respect NODE_PATH
// Note that NODE_PATH is deprecated and will be removed
// in the next major release of create-react-app.
const nodePath = process.env.NODE_PATH || '';
return nodePath.split(path.delimiter).filter(Boolean);
}
const baseUrlResolved = path.resolve(paths.appPath, baseUrl);
// We don't need to do anything if `baseUrl` is set to `node_modules`. This is
// the default behavior.
if (path.relative(paths.appNodeModules, baseUrlResolved) === '') {
return null;
}
// Allow the user set the `baseUrl` to `appSrc`.
if (path.relative(paths.appSrc, baseUrlResolved) === '') {
return [paths.appSrc];
}
// Otherwise, throw an error.
throw new Error(
chalk.red.bold(
"Your project's `baseUrl` can only be set to `src` or `node_modules`." +
' Create React App does not support other values at this time.'
)
);
}
function getModules() {
// Check if TypeScript is setup
const hasTsConfig = fs.existsSync(paths.appTsConfig);
const hasJsConfig = fs.existsSync(paths.appJsConfig);
if (hasTsConfig && hasJsConfig) {
throw new Error(
'You have both a tsconfig.json and a jsconfig.json. If you are using TypeScript please remove your jsconfig.json file.'
);
}
let config;
// If there's a tsconfig.json we assume it's a
// TypeScript project and set up the config
// based on tsconfig.json
if (hasTsConfig) {
config = require(paths.appTsConfig);
// Otherwise we'll check if there is jsconfig.json
// for non TS projects.
} else if (hasJsConfig) {
config = require(paths.appJsConfig);
}
config = config || {};
const options = config.compilerOptions || {};
const additionalModulePaths = getAdditionalModulePaths(options);
return {
additionalModulePaths: additionalModulePaths,
hasTsConfig,
};
}
module.exports = getModules();

@ -1,90 +0,0 @@
'use strict';
const path = require('path');
const fs = require('fs');
const url = require('url');
// Make sure any symlinks in the project folder are resolved:
// https://github.com/facebook/create-react-app/issues/637
const appDirectory = fs.realpathSync(process.cwd());
const resolveApp = relativePath => path.resolve(appDirectory, relativePath);
const envPublicUrl = process.env.PUBLIC_URL;
function ensureSlash(inputPath, needsSlash) {
const hasSlash = inputPath.endsWith('/');
if (hasSlash && !needsSlash) {
return inputPath.substr(0, inputPath.length - 1);
} else if (!hasSlash && needsSlash) {
return `${inputPath}/`;
} else {
return inputPath;
}
}
const getPublicUrl = appPackageJson =>
envPublicUrl || require(appPackageJson).homepage;
// We use `PUBLIC_URL` environment variable or "homepage" field to infer
// "public path" at which the app is served.
// Webpack needs to know it to put the right <script> hrefs into HTML even in
// single-page apps that may serve index.html for nested URLs like /todos/42.
// We can't use a relative path in HTML because we don't want to load something
// like /todos/42/static/js/bundle.7289d.js. We have to know the root.
function getServedPath(appPackageJson) {
const publicUrl = getPublicUrl(appPackageJson);
const servedUrl =
envPublicUrl || (publicUrl ? url.parse(publicUrl).pathname : '/');
return ensureSlash(servedUrl, true);
}
const moduleFileExtensions = [
'web.mjs',
'mjs',
'web.js',
'js',
'web.ts',
'ts',
'web.tsx',
'tsx',
'json',
'web.jsx',
'jsx',
];
// Resolve file paths in the same order as webpack
const resolveModule = (resolveFn, filePath) => {
const extension = moduleFileExtensions.find(extension =>
fs.existsSync(resolveFn(`${filePath}.${extension}`))
);
if (extension) {
return resolveFn(`${filePath}.${extension}`);
}
return resolveFn(`${filePath}.js`);
};
// config after eject: we're in ./config/
module.exports = {
dotenv: resolveApp('.env'),
appPath: resolveApp('.'),
appBuild: resolveApp('build'),
appPublic: resolveApp('public'),
appHtml: resolveApp('public/index.html'),
appIndexJs: resolveModule(resolveApp, 'src/index'),
appPackageJson: resolveApp('package.json'),
appSrc: resolveApp('src'),
appTsConfig: resolveApp('tsconfig.json'),
appJsConfig: resolveApp('jsconfig.json'),
yarnLockFile: resolveApp('yarn.lock'),
testsSetup: resolveModule(resolveApp, 'src/setupTests'),
proxySetup: resolveApp('src/setupProxy.js'),
appNodeModules: resolveApp('node_modules'),
publicUrl: getPublicUrl(resolveApp('package.json')),
servedPath: getServedPath(resolveApp('package.json')),
};
module.exports.moduleFileExtensions = moduleFileExtensions;

@ -1,35 +0,0 @@
'use strict';
const { resolveModuleName } = require('ts-pnp');
exports.resolveModuleName = (
typescript,
moduleName,
containingFile,
compilerOptions,
resolutionHost
) => {
return resolveModuleName(
moduleName,
containingFile,
compilerOptions,
resolutionHost,
typescript.resolveModuleName
);
};
exports.resolveTypeReferenceDirective = (
typescript,
moduleName,
containingFile,
compilerOptions,
resolutionHost
) => {
return resolveModuleName(
moduleName,
containingFile,
compilerOptions,
resolutionHost,
typescript.resolveTypeReferenceDirective
);
};

@ -1,628 +0,0 @@
'use strict';
const fs = require('fs');
const isWsl = require('is-wsl');
const path = require('path');
const webpack = require('webpack');
const resolve = require('resolve');
const PnpWebpackPlugin = require('pnp-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
const CaseSensitivePathsPlugin = require('case-sensitive-paths-webpack-plugin');
const InlineChunkHtmlPlugin = require('react-dev-utils/InlineChunkHtmlPlugin');
const TerserPlugin = require('terser-webpack-plugin');
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin');
const safePostCssParser = require('postcss-safe-parser');
const ManifestPlugin = require('webpack-manifest-plugin');
const InterpolateHtmlPlugin = require('react-dev-utils/InterpolateHtmlPlugin');
const WorkboxWebpackPlugin = require('workbox-webpack-plugin');
const WatchMissingNodeModulesPlugin = require('react-dev-utils/WatchMissingNodeModulesPlugin');
const ModuleScopePlugin = require('react-dev-utils/ModuleScopePlugin');
const getCSSModuleLocalIdent = require('react-dev-utils/getCSSModuleLocalIdent');
const paths = require('./paths');
const modules = require('./modules');
const getClientEnvironment = require('./env');
const ModuleNotFoundPlugin = require('react-dev-utils/ModuleNotFoundPlugin');
const ForkTsCheckerWebpackPlugin = require('react-dev-utils/ForkTsCheckerWebpackPlugin');
const typescriptFormatter = require('react-dev-utils/typescriptFormatter');
const postcssNormalize = require('postcss-normalize');
// Source maps are resource heavy and can cause out of memory issue for large source files.
const shouldUseSourceMap = process.env.GENERATE_SOURCEMAP !== 'false';
// Some apps do not need the benefits of saving a web request, so not inlining the chunk
// makes for a smoother build process.
const shouldInlineRuntimeChunk = process.env.INLINE_RUNTIME_CHUNK !== 'false';
// Check if TypeScript is setup
const useTypeScript = fs.existsSync(paths.appTsConfig);
// style files regexes
const cssRegex = /\.css$/;
const cssModuleRegex = /\.module\.css$/;
const sassRegex = /\.(scss|sass)$/;
const sassModuleRegex = /\.module\.(scss|sass)$/;
// This is the production and development configuration.
// It is focused on developer experience, fast rebuilds, and a minimal bundle.
module.exports = function(webpackEnv) {
const isEnvDevelopment = webpackEnv === 'development';
const isEnvProduction = webpackEnv === 'production';
// Webpack uses `publicPath` to determine where the app is being served from.
// It requires a trailing slash, or the file assets will get an incorrect path.
// In development, we always serve from the root. This makes config easier.
const publicPath = isEnvProduction
? paths.servedPath
: isEnvDevelopment && '/';
// Some apps do not use client-side routing with pushState.
// For these, "homepage" can be set to "." to enable relative asset paths.
const shouldUseRelativeAssetPaths = publicPath === './';
// `publicUrl` is just like `publicPath`, but we will provide it to our app
// as %PUBLIC_URL% in `index.html` and `process.env.PUBLIC_URL` in JavaScript.
// Omit trailing slash as %PUBLIC_URL%/xyz looks better than %PUBLIC_URL%xyz.
const publicUrl = isEnvProduction
? publicPath.slice(0, -1)
: isEnvDevelopment && '';
// Get environment variables to inject into our app.
const env = getClientEnvironment(publicUrl);
// common function to get style loaders
const getStyleLoaders = (cssOptions, preProcessor) => {
const loaders = [
isEnvDevelopment && require.resolve('style-loader'),
isEnvProduction && {
loader: MiniCssExtractPlugin.loader,
options: shouldUseRelativeAssetPaths ? { publicPath: '../../' } : {},
},
{
loader: require.resolve('css-loader'),
options: cssOptions,
},
{
// Options for PostCSS as we reference these options twice
// Adds vendor prefixing based on your specified browser support in
// package.json
loader: require.resolve('postcss-loader'),
options: {
// Necessary for external CSS imports to work
// https://github.com/facebook/create-react-app/issues/2677
ident: 'postcss',
plugins: () => [
require('postcss-flexbugs-fixes'),
require('postcss-preset-env')({
autoprefixer: {
flexbox: 'no-2009',
},
stage: 3,
}),
// Adds PostCSS Normalize as the reset css with default options,
// so that it honors browserslist config in package.json
// which in turn let's users customize the target behavior as per their needs.
postcssNormalize(),
],
sourceMap: isEnvProduction && shouldUseSourceMap,
},
},
].filter(Boolean);
if (preProcessor) {
loaders.push({
loader: require.resolve(preProcessor),
options: {
sourceMap: isEnvProduction && shouldUseSourceMap,
},
});
}
return loaders;
};
return {
mode: isEnvProduction ? 'production' : isEnvDevelopment && 'development',
// Stop compilation early in production
bail: isEnvProduction,
devtool: isEnvProduction
? shouldUseSourceMap
? 'source-map'
: false
: isEnvDevelopment && 'cheap-module-source-map',
// These are the "entry points" to our application.
// This means they will be the "root" imports that are included in JS bundle.
entry: [
// Include an alternative client for WebpackDevServer. A client's job is to
// connect to WebpackDevServer by a socket and get notified about changes.
// When you save a file, the client will either apply hot updates (in case
// of CSS changes), or refresh the page (in case of JS changes). When you
// make a syntax error, this client will display a syntax error overlay.
// Note: instead of the default WebpackDevServer client, we use a custom one
// to bring better experience for Create React App users. You can replace
// the line below with these two lines if you prefer the stock client:
// require.resolve('webpack-dev-server/client') + '?/',
// require.resolve('webpack/hot/dev-server'),
isEnvDevelopment &&
require.resolve('react-dev-utils/webpackHotDevClient'),
// Finally, this is your app's code:
paths.appIndexJs,
// We include the app code last so that if there is a runtime error during
// initialization, it doesn't blow up the WebpackDevServer client, and
// changing JS code would still trigger a refresh.
].filter(Boolean),
output: {
// The build folder.
path: isEnvProduction ? paths.appBuild : undefined,
// Add /* filename */ comments to generated require()s in the output.
pathinfo: isEnvDevelopment,
// There will be one main bundle, and one file per asynchronous chunk.
// In development, it does not produce real files.
filename: isEnvProduction
? 'static/js/[name].[contenthash:8].js'
: isEnvDevelopment && 'static/js/bundle.js',
// TODO: remove this when upgrading to webpack 5
futureEmitAssets: true,
// There are also additional JS chunk files if you use code splitting.
chunkFilename: isEnvProduction
? 'static/js/[name].[contenthash:8].chunk.js'
: isEnvDevelopment && 'static/js/[name].chunk.js',
// We inferred the "public path" (such as / or /my-project) from homepage.
// We use "/" in development.
publicPath: publicPath,
// Point sourcemap entries to original disk location (format as URL on Windows)
devtoolModuleFilenameTemplate: isEnvProduction
? info =>
path
.relative(paths.appSrc, info.absoluteResourcePath)
.replace(/\\/g, '/')
: isEnvDevelopment &&
(info => path.resolve(info.absoluteResourcePath).replace(/\\/g, '/')),
},
optimization: {
minimize: isEnvProduction,
minimizer: [
// This is only used in production mode
new TerserPlugin({
terserOptions: {
parse: {
// we want terser to parse ecma 8 code. However, we don't want it
// to apply any minfication steps that turns valid ecma 5 code
// into invalid ecma 5 code. This is why the 'compress' and 'output'
// sections only apply transformations that are ecma 5 safe
// https://github.com/facebook/create-react-app/pull/4234
ecma: 8,
},
compress: {
ecma: 5,
warnings: false,
// Disabled because of an issue with Uglify breaking seemingly valid code:
// https://github.com/facebook/create-react-app/issues/2376
// Pending further investigation:
// https://github.com/mishoo/UglifyJS2/issues/2011
comparisons: false,
// Disabled because of an issue with Terser breaking valid code:
// https://github.com/facebook/create-react-app/issues/5250
// Pending futher investigation:
// https://github.com/terser-js/terser/issues/120
inline: 2,
},
mangle: {
safari10: true,
},
output: {
ecma: 5,
comments: false,
// Turned on because emoji and regex is not minified properly using default
// https://github.com/facebook/create-react-app/issues/2488
ascii_only: true,
},
},
// Use multi-process parallel running to improve the build speed
// Default number of concurrent runs: os.cpus().length - 1
// Disabled on WSL (Windows Subsystem for Linux) due to an issue with Terser
// https://github.com/webpack-contrib/terser-webpack-plugin/issues/21
parallel: !isWsl,
// Enable file caching
cache: true,
sourceMap: shouldUseSourceMap,
}),
// This is only used in production mode
new OptimizeCSSAssetsPlugin({
cssProcessorOptions: {
parser: safePostCssParser,
map: shouldUseSourceMap
? {
// `inline: false` forces the sourcemap to be output into a
// separate file
inline: false,
// `annotation: true` appends the sourceMappingURL to the end of
// the css file, helping the browser find the sourcemap
annotation: true,
}
: false,
},
}),
],
// Automatically split vendor and commons
// https://twitter.com/wSokra/status/969633336732905474
// https://medium.com/webpack/webpack-4-code-splitting-chunk-graph-and-the-splitchunks-optimization-be739a861366
splitChunks: {
chunks: 'all',
name: false,
},
// Keep the runtime chunk separated to enable long term caching
// https://twitter.com/wSokra/status/969679223278505985
runtimeChunk: true,
},
resolve: {
// This allows you to set a fallback for where Webpack should look for modules.
// We placed these paths second because we want `node_modules` to "win"
// if there are any conflicts. This matches Node resolution mechanism.
// https://github.com/facebook/create-react-app/issues/253
modules: ['node_modules', paths.appNodeModules].concat(
modules.additionalModulePaths || []
),
// These are the reasonable defaults supported by the Node ecosystem.
// We also include JSX as a common component filename extension to support
// some tools, although we do not recommend using it, see:
// https://github.com/facebook/create-react-app/issues/290
// `web` extension prefixes have been added for better support
// for React Native Web.
extensions: paths.moduleFileExtensions
.map(ext => `.${ext}`)
.filter(ext => useTypeScript || !ext.includes('ts')),
alias: {
// Support React Native Web
// https://www.smashingmagazine.com/2016/08/a-glimpse-into-the-future-with-react-native-for-web/
'react-native': 'react-native-web',
},
plugins: [
// Adds support for installing with Plug'n'Play, leading to faster installs and adding
// guards against forgotten dependencies and such.
PnpWebpackPlugin,
// Prevents users from importing files from outside of src/ (or node_modules/).
// This often causes confusion because we only process files within src/ with babel.
// To fix this, we prevent you from importing files out of src/ -- if you'd like to,
// please link the files into your node_modules/ and let module-resolution kick in.
// Make sure your source files are compiled, as they will not be processed in any way.
new ModuleScopePlugin(paths.appSrc, [paths.appPackageJson]),
],
},
resolveLoader: {
plugins: [
// Also related to Plug'n'Play, but this time it tells Webpack to load its loaders
// from the current package.
PnpWebpackPlugin.moduleLoader(module),
],
},
module: {
strictExportPresence: true,
rules: [
// Disable require.ensure as it's not a standard language feature.
{ parser: { requireEnsure: false } },
// First, run the linter.
// It's important to do this before Babel processes the JS.
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
enforce: 'pre',
use: [
{
options: {
formatter: require.resolve('react-dev-utils/eslintFormatter'),
eslintPath: require.resolve('eslint'),
},
loader: require.resolve('eslint-loader'),
},
],
include: paths.appSrc,
},
{
// "oneOf" will traverse all following loaders until one will
// match the requirements. When no loader matches it will fall
// back to the "file" loader at the end of the loader list.
oneOf: [
// "url" loader works like "file" loader except that it embeds assets
// smaller than specified limit in bytes as data URLs to avoid requests.
// A missing `test` is equivalent to a match.
{
test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/],
loader: require.resolve('url-loader'),
options: {
limit: 10000,
name: 'static/media/[name].[hash:8].[ext]',
},
},
// Process application JS with Babel.
// The preset includes JSX, Flow, TypeScript, and some ESnext features.
{
test: /\.(js|mjs|jsx|ts|tsx)$/,
include: paths.appSrc,
loader: require.resolve('babel-loader'),
options: {
customize: require.resolve(
'babel-preset-react-app/webpack-overrides'
),
plugins: [
[
require.resolve('babel-plugin-named-asset-import'),
{
loaderMap: {
svg: {
ReactComponent: '@svgr/webpack?-svgo,+ref![path]',
},
},
},
],
],
// This is a feature of `babel-loader` for webpack (not Babel itself).
// It enables caching results in ./node_modules/.cache/babel-loader/
// directory for faster rebuilds.
cacheDirectory: true,
cacheCompression: isEnvProduction,
compact: isEnvProduction,
},
},
// Process any JS outside of the app with Babel.
// Unlike the application JS, we only compile the standard ES features.
{
test: /\.(js|mjs)$/,
exclude: /@babel(?:\/|\\{1,2})runtime/,
loader: require.resolve('babel-loader'),
options: {
babelrc: false,
configFile: false,
compact: false,
presets: [
[
require.resolve('babel-preset-react-app/dependencies'),
{ helpers: true },
],
],
cacheDirectory: true,
cacheCompression: isEnvProduction,
// If an error happens in a package, it's possible to be
// because it was compiled. Thus, we don't want the browser
// debugger to show the original code. Instead, the code
// being evaluated would be much more helpful.
sourceMaps: false,
},
},
// "postcss" loader applies autoprefixer to our CSS.
// "css" loader resolves paths in CSS and adds assets as dependencies.
// "style" loader turns CSS into JS modules that inject <style> tags.
// In production, we use MiniCSSExtractPlugin to extract that CSS
// to a file, but in development "style" loader enables hot editing
// of CSS.
// By default we support CSS Modules with the extension .module.css
{
test: cssRegex,
exclude: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
}),
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
// Remove this when webpack adds a warning or an error for this.
// See https://github.com/webpack/webpack/issues/6571
sideEffects: true,
},
// Adds support for CSS Modules (https://github.com/css-modules/css-modules)
// using the extension .module.css
{
test: cssModuleRegex,
use: getStyleLoaders({
importLoaders: 1,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: true,
getLocalIdent: getCSSModuleLocalIdent,
}),
},
// Opt-in support for SASS (using .scss or .sass extensions).
// By default we support SASS Modules with the
// extensions .module.scss or .module.sass
{
test: sassRegex,
exclude: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: isEnvProduction && shouldUseSourceMap,
},
'sass-loader'
),
// Don't consider CSS imports dead code even if the
// containing package claims to have no side effects.
// Remove this when webpack adds a warning or an error for this.
// See https://github.com/webpack/webpack/issues/6571
sideEffects: true,
},
// Adds support for CSS Modules, but using SASS
// using the extension .module.scss or .module.sass
{
test: sassModuleRegex,
use: getStyleLoaders(
{
importLoaders: 2,
sourceMap: isEnvProduction && shouldUseSourceMap,
modules: true,
getLocalIdent: getCSSModuleLocalIdent,
},
'sass-loader'
),
},
// "file" loader makes sure those assets get served by WebpackDevServer.
// When you `import` an asset, you get its (virtual) filename.
// In production, they would get copied to the `build` folder.
// This loader doesn't use a "test" so it will catch all modules
// that fall through the other loaders.
{
loader: require.resolve('file-loader'),
// Exclude `js` files to keep "css" loader working as it injects
// its runtime that would otherwise be processed through "file" loader.
// Also exclude `html` and `json` extensions so they get processed
// by webpacks internal loaders.
exclude: [/\.(js|mjs|jsx|ts|tsx)$/, /\.html$/, /\.json$/],
options: {
name: 'static/media/[name].[hash:8].[ext]',
},
},
// ** STOP ** Are you adding a new loader?
// Make sure to add the new loader(s) before the "file" loader.
],
},
],
},
plugins: [
// Generates an `index.html` file with the <script> injected.
new HtmlWebpackPlugin(
Object.assign(
{},
{
inject: true,
template: paths.appHtml,
},
isEnvProduction
? {
minify: {
removeComments: true,
collapseWhitespace: true,
removeRedundantAttributes: true,
useShortDoctype: true,
removeEmptyAttributes: true,
removeStyleLinkTypeAttributes: true,
keepClosingSlash: true,
minifyJS: true,
minifyCSS: true,
minifyURLs: true,
},
}
: undefined
)
),
// Inlines the webpack runtime script. This script is too small to warrant
// a network request.
isEnvProduction &&
shouldInlineRuntimeChunk &&
new InlineChunkHtmlPlugin(HtmlWebpackPlugin, [/runtime~.+[.]js/]),
// Makes some environment variables available in index.html.
// The public URL is available as %PUBLIC_URL% in index.html, e.g.:
// <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
// In production, it will be an empty string unless you specify "homepage"
// in `package.json`, in which case it will be the pathname of that URL.
// In development, this will be an empty string.
new InterpolateHtmlPlugin(HtmlWebpackPlugin, env.raw),
// This gives some necessary context to module not found errors, such as
// the requesting resource.
new ModuleNotFoundPlugin(paths.appPath),
// Makes some environment variables available to the JS code, for example:
// if (process.env.NODE_ENV === 'production') { ... }. See `./env.js`.
// It is absolutely essential that NODE_ENV is set to production
// during a production build.
// Otherwise React will be compiled in the very slow development mode.
new webpack.DefinePlugin(env.stringified),
// This is necessary to emit hot updates (currently CSS only):
isEnvDevelopment && new webpack.HotModuleReplacementPlugin(),
// Watcher doesn't work well if you mistype casing in a path so we use
// a plugin that prints an error when you attempt to do this.
// See https://github.com/facebook/create-react-app/issues/240
isEnvDevelopment && new CaseSensitivePathsPlugin(),
// If you require a missing module and then `npm install` it, you still have
// to restart the development server for Webpack to discover it. This plugin
// makes the discovery automatic so you don't have to restart.
// See https://github.com/facebook/create-react-app/issues/186
isEnvDevelopment &&
new WatchMissingNodeModulesPlugin(paths.appNodeModules),
isEnvProduction &&
new MiniCssExtractPlugin({
// Options similar to the same options in webpackOptions.output
// both options are optional
filename: 'static/css/[name].[contenthash:8].css',
chunkFilename: 'static/css/[name].[contenthash:8].chunk.css',
}),
// Generate a manifest file which contains a mapping of all asset filenames
// to their corresponding output file so that tools can pick it up without
// having to parse `index.html`.
new ManifestPlugin({
fileName: 'asset-manifest.json',
publicPath: publicPath,
generate: (seed, files) => {
const manifestFiles = files.reduce(function(manifest, file) {
manifest[file.name] = file.path;
return manifest;
}, seed);
return {
files: manifestFiles,
};
},
}),
// Moment.js is an extremely popular library that bundles large locale files
// by default due to how Webpack interprets its code. This is a practical
// solution that requires the user to opt into importing specific locales.
// https://github.com/jmblog/how-to-optimize-momentjs-with-webpack
// You can remove this if you don't use Moment.js:
new webpack.IgnorePlugin(/^\.\/locale$/, /moment$/),
// Generate a service worker script that will precache, and keep up to date,
// the HTML & assets that are part of the Webpack build.
isEnvProduction &&
new WorkboxWebpackPlugin.GenerateSW({
clientsClaim: true,
exclude: [/\.map$/, /asset-manifest\.json$/],
importWorkboxFrom: 'cdn',
navigateFallback: publicUrl + '/index.html',
navigateFallbackBlacklist: [
// Exclude URLs starting with /_, as they're likely an API call
new RegExp('^/_'),
// Exclude URLs containing a dot, as they're likely a resource in
// public/ and not a SPA route
new RegExp('/[^/]+\\.[^/]+$'),
],
}),
// TypeScript type checking
useTypeScript &&
new ForkTsCheckerWebpackPlugin({
typescript: resolve.sync('typescript', {
basedir: paths.appNodeModules,
}),
async: isEnvDevelopment,
useTypescriptIncrementalApi: true,
checkSyntacticErrors: true,
resolveModuleNameModule: process.versions.pnp
? `${__dirname}/pnpTs.js`
: undefined,
resolveTypeReferenceDirectiveModule: process.versions.pnp
? `${__dirname}/pnpTs.js`
: undefined,
tsconfig: paths.appTsConfig,
reportFiles: [
'**',
'!**/__tests__/**',
'!**/?(*.)(spec|test).*',
'!**/src/setupProxy.*',
'!**/src/setupTests.*',
],
watch: paths.appSrc,
silent: true,
// The formatter is invoked directly in WebpackDevServerUtils during development
formatter: isEnvProduction ? typescriptFormatter : undefined,
}),
].filter(Boolean),
// Some libraries import Node modules but don't use them in the browser.
// Tell Webpack to provide empty mocks for them so importing them works.
node: {
module: 'empty',
dgram: 'empty',
dns: 'mock',
fs: 'empty',
http2: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty',
},
// Turn off performance processing because we utilize
// our own hints via the FileSizeReporter
performance: false,
};
};

@ -1,104 +0,0 @@
'use strict';
const errorOverlayMiddleware = require('react-dev-utils/errorOverlayMiddleware');
const evalSourceMapMiddleware = require('react-dev-utils/evalSourceMapMiddleware');
const noopServiceWorkerMiddleware = require('react-dev-utils/noopServiceWorkerMiddleware');
const ignoredFiles = require('react-dev-utils/ignoredFiles');
const paths = require('./paths');
const fs = require('fs');
const protocol = process.env.HTTPS === 'true' ? 'https' : 'http';
const host = process.env.HOST || '0.0.0.0';
module.exports = function(proxy, allowedHost) {
return {
// WebpackDevServer 2.4.3 introduced a security fix that prevents remote
// websites from potentially accessing local content through DNS rebinding:
// https://github.com/webpack/webpack-dev-server/issues/887
// https://medium.com/webpack/webpack-dev-server-middleware-security-issues-1489d950874a
// However, it made several existing use cases such as development in cloud
// environment or subdomains in development significantly more complicated:
// https://github.com/facebook/create-react-app/issues/2271
// https://github.com/facebook/create-react-app/issues/2233
// While we're investigating better solutions, for now we will take a
// compromise. Since our WDS configuration only serves files in the `public`
// folder we won't consider accessing them a vulnerability. However, if you
// use the `proxy` feature, it gets more dangerous because it can expose
// remote code execution vulnerabilities in backends like Django and Rails.
// So we will disable the host check normally, but enable it if you have
// specified the `proxy` setting. Finally, we let you override it if you
// really know what you're doing with a special environment variable.
disableHostCheck:
!proxy || process.env.DANGEROUSLY_DISABLE_HOST_CHECK === 'true',
// Enable gzip compression of generated files.
compress: true,
// Silence WebpackDevServer's own logs since they're generally not useful.
// It will still show compile warnings and errors with this setting.
clientLogLevel: 'none',
// By default WebpackDevServer serves physical files from current directory
// in addition to all the virtual build products that it serves from memory.
// This is confusing because those files wont automatically be available in
// production build folder unless we copy them. However, copying the whole
// project directory is dangerous because we may expose sensitive files.
// Instead, we establish a convention that only files in `public` directory
// get served. Our build script will copy `public` into the `build` folder.
// In `index.html`, you can get URL of `public` folder with %PUBLIC_URL%:
// <link rel="shortcut icon" href="%PUBLIC_URL%/favicon.ico">
// In JavaScript code, you can access it with `process.env.PUBLIC_URL`.
// Note that we only recommend to use `public` folder as an escape hatch
// for files like `favicon.ico`, `manifest.json`, and libraries that are
// for some reason broken when imported through Webpack. If you just want to
// use an image, put it in `src` and `import` it from JavaScript instead.
contentBase: paths.appPublic,
// By default files from `contentBase` will not trigger a page reload.
watchContentBase: true,
// Enable hot reloading server. It will provide /sockjs-node/ endpoint
// for the WebpackDevServer client so it can learn when the files were
// updated. The WebpackDevServer client is included as an entry point
// in the Webpack development configuration. Note that only changes
// to CSS are currently hot reloaded. JS changes will refresh the browser.
hot: true,
// It is important to tell WebpackDevServer to use the same "root" path
// as we specified in the config. In development, we always serve from /.
publicPath: '/',
// WebpackDevServer is noisy by default so we emit custom message instead
// by listening to the compiler events with `compiler.hooks[...].tap` calls above.
quiet: true,
// Reportedly, this avoids CPU overload on some systems.
// https://github.com/facebook/create-react-app/issues/293
// src/node_modules is not ignored to support absolute imports
// https://github.com/facebook/create-react-app/issues/1065
watchOptions: {
ignored: ignoredFiles(paths.appSrc),
},
// Enable HTTPS if the HTTPS environment variable is set to 'true'
https: protocol === 'https',
host,
overlay: false,
historyApiFallback: {
// Paths with dots should still use the history fallback.
// See https://github.com/facebook/create-react-app/issues/387.
disableDotRule: true,
},
public: allowedHost,
proxy,
before(app, server) {
if (fs.existsSync(paths.proxySetup)) {
// This registers user provided middleware for proxy reasons
require(paths.proxySetup)(app);
}
// This lets us fetch source contents from webpack for the error overlay
app.use(evalSourceMapMiddleware(server));
// This lets us open files from the runtime error overlay.
app.use(errorOverlayMiddleware());
// This service worker file is effectively a 'no-op' that will reset any
// previous service worker registered for the same host:port combination.
// We do this in development to avoid hitting the production cache if
// it used the same host and port.
// https://github.com/facebook/create-react-app/issues/2272#issuecomment-302832432
app.use(noopServiceWorkerMiddleware());
},
};
};

@ -1,218 +0,0 @@
<!DOCTYPE html>
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
/* FONTS */
@media screen {
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v11/qIIYRU-oROkIk8vfvxw6QvesZW2xOQ-xsNqO47m55DA.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 700;
src: local('Lato Bold'), local('Lato-Bold'), url(https://fonts.gstatic.com/s/lato/v11/qdgUG4U09HnJwhYI-uK18wLUuEpTyoUstqEm5AMlJo4.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 400;
src: local('Lato Italic'), local('Lato-Italic'), url(https://fonts.gstatic.com/s/lato/v11/RYyZNoeFgb0l7W3Vu1aSWOvvDin1pK8aKteLpeZ5c0A.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 700;
src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(https://fonts.gstatic.com/s/lato/v11/HkF_qI1x_noxlxhrhMQYELO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
}
}
/* CLIENT-SPECIFIC STYLES */
body, table, th, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
img { -ms-interpolation-mode: bicubic; border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none;}
/* RESET STYLES */
table { border-collapse: collapse !important; padding: 0 !important;}
body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
/* iOS BLUE LINKS */
a[x-apple-data-detectors] {
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* MOBILE STYLES */
@media screen and (max-width:600px){
h1 {
font-size: 32px !important;
line-height: 32px !important;
}
}
/* ANDROID CENTER FIX */
div[style*="margin: 16px 0;"] { margin: 0 !important; }
</style>
</head>
<body style="background-color: #f4f4f4; margin: 0 !important; padding: 0 !important;">
<!-- HIDDEN PREHEADER TEXT -->
<div style="display: none; font-size: 1px; color: #fefefe; line-height: 1px; font-family: 'Lato', Helvetica, Arial, sans-serif; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden;">
{{#i18n 'email.happy' }}We are happy to send you this email! You will be able to vote using majority judgment.{{/i18n}}
</div>
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Email">
<!-- LOGO -->
<tr>
<th scope="col" style="background-color:#efefff ;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="Logo picture">
<tr>
<th scope="col" style="vertical-align: top; padding: 40px 10px 40px 10px;">
<a href="https://mieuxvoter.fr/" target="_blank" rel="noopener noreferrer">
<img alt="Logo" src="https://mieuxvoter.fr/wp-content/uploads/2019/10/mieuxvoter_logo.png" width="40" height="40" style="display: block; margin: 0px auto 0px auto; width: 50%; max-width: 250px; min-width: 40px; height: auto; font-family: 'Lato', Helvetica, Arial, sans-serif; color: #ffffff; font-size: 18px;" border="0">
</a>
</th>
</tr>
</table>
</th>
</tr>
<!-- TITLE -->
<tr>
<th scope="col" style="background-color: #efefff; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email title">
<tr>
<th scope="col" style="vertical-align: top; background-color: #ffffff; padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #111111; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; letter-spacing: 4px; line-height: 48px;">
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">{{#i18n 'email.hello'}}Hi, there! 🙂{{/i18n}}</h1>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCKS -->
<tr>
<th scope="col" style="background-color: #2a43a0; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email body">
<!-- BLOCK SUBTITLE-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.happy'}}We are happy to send you this email! You will be able to vote using majority judgment.{{/i18n}}
</p>
</th>
</tr>
<!-- BLOCK EXPLANATION-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.why'}}This email was sent to you because your email address was entered to participate in the vote on the subject:{{/i18n}}
&nbsp;
<strong>{{title}}</strong>
</p>
</th>
</tr>
<!-- BULLETPROOF BUTTON BLUE-->
<tr>
<th scope="col" style="background-color: #ffffff;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Blue bulletproof button">
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 60px 30px;">
<table border="0" style="margin: 0px auto 0px auto; border-collapse: collapse;" aria-describedby="invitation url">
<tr>
<th scope="col" style="border-radius: 3px; background-color: #2a43a0;">
<a href="%recipient.urlVote%" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #2a43a0; display: inline-block;">
{{#i18n 'common.vote' }}Vote!{{/i18n}}</a></th>
</tr>
</table>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCK DOES NOT WORK -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.copyLink' }}If that doesn't work, copy and paste the following link into your browser:{{/i18n}}
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlVote%</a>
</p>
</th>
</tr>
<!-- BLOCK TEXT RESULT -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 20px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.linkResult' }}The results will be available with the following link when the vote is finished:{{/i18n}}
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlResult%</a>
</p>
</th>
</tr>
<!-- BLOCK THANKS -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 0px 30px 40px 30px; border-radius: 0px 0px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">{{#i18n 'email.bye'}}Good vote{{/i18n}},<br>{{#i18n 'common.mieuxvoter'}}Mieux Voter{{/i18n}}</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- SUPPORT CALLOUT -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 30px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="support callout">
<!-- HEADLINE -->
<tr>
<th scope="col" style="background-color: #7d8ecf; padding: 30px 30px 30px 30px; border-radius: 4px 4px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0;"><strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #FFFFFF;" rel="noopener noreferrer">
{{#i18n 'email.aboutjm'}}Need any further information?{{/i18n}}
</a></strong>
</p>
<p style="margin: 0;"> <strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #111111;" rel="noopener noreferrer">
{{#i18n 'common.helpus'}}Do you want to help us?{{/i18n}}
</a></strong>
</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- FOOTER -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="footer informations">
<!-- EXPLAIN WHY -->
</br>
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">
{{#i18n email.why }}You received this email because someone invited you to vote.{{/i18n}}
</p>
</th>
</tr>
<!-- ADDRESS -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">{{#i18n mieuxvoter }}Mieux Voter{{/i18n}} - <a "mailto:app@mieuxvoter.fr">app@mieuxvoter.fr</a></p>
</th>
</tr>
</table>
</th>
</tr>
</table>
</body>
</html>

@ -1,19 +0,0 @@
{{i18n 'email.hello'}}Hi there! 🙂{{i18n}}
{{i18n 'email.happy'}}We are happy to send you this email! You will be able to vote using majority judgment.{{i18n}}
{{i18n 'email.why'}}This email was sent to you because your email was filled out to participate in the vote on the subject:{{i18n}}
{{ title }}
{{i18n 'email.linkVote' }}The link for the vote is as follows:{{i18n}}
%recipient.urlVote%
{{i18n 'email.linkResult' }}The link that will give you the results when they are available is as follows:{{i18n}}
%recipient.urlResult%
{{i18n 'email.bye'}}Good vote{{i18n}}
{{i18n 'common.mieuxvoter'}}Mieux Voter{{i18n}}

@ -1,203 +0,0 @@
<!DOCTYPE html>
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
/* FONTS */
@media screen {
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v11/qIIYRU-oROkIk8vfvxw6QvesZW2xOQ-xsNqO47m55DA.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 700;
src: local('Lato Bold'), local('Lato-Bold'), url(https://fonts.gstatic.com/s/lato/v11/qdgUG4U09HnJwhYI-uK18wLUuEpTyoUstqEm5AMlJo4.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 400;
src: local('Lato Italic'), local('Lato-Italic'), url(https://fonts.gstatic.com/s/lato/v11/RYyZNoeFgb0l7W3Vu1aSWOvvDin1pK8aKteLpeZ5c0A.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 700;
src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(https://fonts.gstatic.com/s/lato/v11/HkF_qI1x_noxlxhrhMQYELO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
}
}
/* CLIENT-SPECIFIC STYLES */
body, table, th, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
img { -ms-interpolation-mode: bicubic; border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none;}
/* RESET STYLES */
table { border-collapse: collapse !important; padding: 0 !important;}
body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
/* iOS BLUE LINKS */
a[x-apple-data-detectors] {
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* MOBILE STYLES */
@media screen and (max-width:600px){
h1 {
font-size: 32px !important;
line-height: 32px !important;
}
}
/* ANDROID CENTER FIX */
div[style*="margin: 16px 0;"] { margin: 0 !important; }
</style>
</head>
<body style="background-color: #f4f4f4; margin: 0 !important; padding: 0 !important;">
<!-- HIDDEN PREHEADER TEXT -->
<div style="display: none; font-size: 1px; color: #fefefe; line-height: 1px; font-family: 'Lato', Helvetica, Arial, sans-serif; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden;">Nous sommes très heureux de vous partager ce lien de vote ! Vous allez pouvoir voter avec le jugement majoritaire.</div>
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Email">
<!-- LOGO -->
<tr>
<th scope="col" style="background-color:#efefff ;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="Logo picture">
<tr>
<th scope="col" style="vertical-align: top; padding: 40px 10px 40px 10px;">
<a href="https://mieuxvoter.fr/" target="_blank" rel="noopener noreferrer">
<img alt="Logo" src="https://mieuxvoter.fr/wp-content/uploads/2019/10/mieuxvoter_logo.png" width="40" height="40" style="display: block; margin: 0px auto 0px auto; width: 50%; max-width: 250px; min-width: 40px; height: auto; font-family: 'Lato', Helvetica, Arial, sans-serif; color: #ffffff; font-size: 18px;" border="0">
</a>
</th>
</tr>
</table>
</th>
</tr>
<!-- TITLE -->
<tr>
<th scope="col" style="background-color: #efefff; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email title">
<tr>
<th scope="col" style="vertical-align: top; background-color: #ffffff; padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #111111; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; letter-spacing: 4px; line-height: 48px;">
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">Bonjour ! 🙂</h1>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCKS -->
<tr>
<th scope="col" style="background-color: #2a43a0; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email body">
<!-- BLOCK SUBTITLE-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">Nous sommes très heureux de vous partager ce lien de vote ! Vous allez pouvoir voter avec le jugement majoritaire.</p>
</th>
</tr>
<!-- BLOCK EXPLANATION-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">Vous avez été invité·e à participer à l'élection suivante : </p>
</th>
</tr>
<!-- BULLETPROOF BUTTON BLUE-->
<tr>
<th scope="col" style="background-color: #ffffff;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Blue bulletproof button">
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 60px 30px;">
<table border="0" style="margin: 0px auto 0px auto; border-collapse: collapse;" aria-describedby="invitation url">
<tr>
<th scope="col" style="border-radius: 3px; background-color: #2a43a0;">
<a href="%recipient.urlVote%" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #2a43a0; display: inline-block;">Voter !</a></th>
</tr>
</table>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCK DOES NOT WORK -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
Si le lien ne fonctionne pas, vous pouvez le copier et le coller dans la barre de navigation de votre navigateur.
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlVote%</a>
</p>
</th>
</tr>
<!-- BLOCK TEXT RESULT -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 20px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
A la fin de l'élection, vous pourrez accéder aux résultats en cliquant sur ce lien :
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlResult%</a>
</p>
</th>
</tr>
<!-- BLOCK THANKS -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 0px 30px 40px 30px; border-radius: 0px 0px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">Bon vote,<br>Mieux Voter</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- SUPPORT CALLOUT -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 30px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="support callout">
<!-- HEADLINE -->
<tr>
<th scope="col" style="background-color: #7d8ecf; padding: 30px 30px 30px 30px; border-radius: 4px 4px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0;"><strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #FFFFFF;" rel="noopener noreferrer">Besoin de plus d'information</a></strong>
</p>
<p style="margin: 0;"> <strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #111111;" rel="noopener noreferrer">Vous souhaitez nous aider ?</a></strong>
</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- FOOTER -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="footer informations">
<!-- EXPLAIN WHY -->
</br>
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">Vous avez été invité·e à participer à l'élection suivante</p>
</th>
</tr>
<!-- ADDRESS -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">Mieux Voter - <a "mailto:app@mieuxvoter.fr">app@mieuxvoter.fr</a></p>
</th>
</tr>
</table>
</th>
</tr>
</table>
</body>
</html>

@ -1,17 +0,0 @@
Bonjour ! 🙂
Vous avez été invité·e à participer à l'élection suivante :
{{ title }}
Le lien pour voter est le suivant :
%recipient.urlVote%
A la fin de l'élection, vous pourrez accéder aux résultats en cliquant sur ce lien :
%recipient.urlResult%
Bon vote ! 🤗
Mieux Voter

@ -1,218 +0,0 @@
<!DOCTYPE html>
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
<title></title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<style type="text/css">
/* FONTS */
@media screen {
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 400;
src: local('Lato Regular'), local('Lato-Regular'), url(https://fonts.gstatic.com/s/lato/v11/qIIYRU-oROkIk8vfvxw6QvesZW2xOQ-xsNqO47m55DA.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: normal;
font-weight: 700;
src: local('Lato Bold'), local('Lato-Bold'), url(https://fonts.gstatic.com/s/lato/v11/qdgUG4U09HnJwhYI-uK18wLUuEpTyoUstqEm5AMlJo4.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 400;
src: local('Lato Italic'), local('Lato-Italic'), url(https://fonts.gstatic.com/s/lato/v11/RYyZNoeFgb0l7W3Vu1aSWOvvDin1pK8aKteLpeZ5c0A.woff) format('woff');
}
@font-face {
font-family: 'Lato';
font-style: italic;
font-weight: 700;
src: local('Lato Bold Italic'), local('Lato-BoldItalic'), url(https://fonts.gstatic.com/s/lato/v11/HkF_qI1x_noxlxhrhMQYELO3LdcAZYWl9Si6vvxL-qU.woff) format('woff');
}
}
/* CLIENT-SPECIFIC STYLES */
body, table, th, a { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; }
img { -ms-interpolation-mode: bicubic; border: 0; height: auto; line-height: 100%; outline: none; text-decoration: none;}
/* RESET STYLES */
table { border-collapse: collapse !important; padding: 0 !important;}
body { height: 100% !important; margin: 0 !important; padding: 0 !important; width: 100% !important; }
/* iOS BLUE LINKS */
a[x-apple-data-detectors] {
color: inherit !important;
text-decoration: none !important;
font-size: inherit !important;
font-family: inherit !important;
font-weight: inherit !important;
line-height: inherit !important;
}
/* MOBILE STYLES */
@media screen and (max-width:600px){
h1 {
font-size: 32px !important;
line-height: 32px !important;
}
}
/* ANDROID CENTER FIX */
div[style*="margin: 16px 0;"] { margin: 0 !important; }
</style>
</head>
<body style="background-color: #f4f4f4; margin: 0 !important; padding: 0 !important;">
<!-- HIDDEN PREHEADER TEXT -->
<div style="display: none; font-size: 1px; color: #fefefe; line-height: 1px; font-family: 'Lato', Helvetica, Arial, sans-serif; max-height: 0px; max-width: 0px; opacity: 0; overflow: hidden;">
{{#i18n 'email.happy' }}We are happy to send you this email! You will be able to vote using majority judgment.{{/i18n}}
</div>
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Email">
<!-- LOGO -->
<tr>
<th scope="col" style="background-color:#efefff ;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="Logo picture">
<tr>
<th scope="col" style="vertical-align: top; padding: 40px 10px 40px 10px;">
<a href="https://mieuxvoter.fr/" target="_blank" rel="noopener noreferrer">
<img alt="Logo" src="https://mieuxvoter.fr/wp-content/uploads/2019/10/mieuxvoter_logo.png" width="40" height="40" style="display: block; margin: 0px auto 0px auto; width: 50%; max-width: 250px; min-width: 40px; height: auto; font-family: 'Lato', Helvetica, Arial, sans-serif; color: #ffffff; font-size: 18px;" border="0">
</a>
</th>
</tr>
</table>
</th>
</tr>
<!-- TITLE -->
<tr>
<th scope="col" style="background-color: #efefff; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email title">
<tr>
<th scope="col" style="vertical-align: top; background-color: #ffffff; padding: 40px 20px 20px 20px; border-radius: 4px 4px 0px 0px; color: #111111; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 48px; font-weight: 400; letter-spacing: 4px; line-height: 48px;">
<h1 style="font-size: 48px; font-weight: 400; margin: 0;">{{#i18n 'email.hello'}}Hi, there! 🙂{{/i18n}}</h1>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCKS -->
<tr>
<th scope="col" style="background-color: #2a43a0; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="email body">
<!-- BLOCK SUBTITLE-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.happy'}}We are happy to send you this email! You will be able to vote using majority judgment.{{/i18n}}
</p>
</th>
</tr>
<!-- BLOCK EXPLANATION-->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.why'}}This email was sent to you because your email address was entered to participate in the vote on the subject:{{/i18n}}
&nbsp;
<strong>{{title}}</strong>
</p>
</th>
</tr>
<!-- BULLETPROOF BUTTON BLUE-->
<tr>
<th scope="col" style="background-color: #ffffff;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%;" aria-describedby="Blue bulletproof button">
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 60px 30px;">
<table border="0" style="margin: 0px auto 0px auto; border-collapse: collapse;" aria-describedby="invitation url">
<tr>
<th scope="col" style="border-radius: 3px; background-color: #2a43a0;">
<a href="%recipient.urlVote%" target="_blank" style="font-size: 20px; font-family: Helvetica, Arial, sans-serif; color: #ffffff; text-decoration: none; padding: 15px 25px; border-radius: 2px; border: 1px solid #2a43a0; display: inline-block;">
{{#i18n 'common.vote' }}Vote!{{/i18n}}</a></th>
</tr>
</table>
</th>
</tr>
</table>
</th>
</tr>
<!-- BLOCK DOES NOT WORK -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 40px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.copyLink' }}If that doesn't work, copy and paste the following link into your browser:{{/i18n}}
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlVote%</a>
</p>
</th>
</tr>
<!-- BLOCK TEXT RESULT -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 20px 30px 20px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">
{{#i18n 'email.linkResult' }}The results will be available with the following link when the vote is finished:{{/i18n}}
&nbsp;
<a target="_blank" style="color: #2a43a0;">%recipient.urlResult%</a>
</p>
</th>
</tr>
<!-- BLOCK THANKS -->
<tr>
<th scope="col" style="background-color: #ffffff; padding: 0px 30px 40px 30px; border-radius: 0px 0px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0; text-align: left;">{{#i18n 'email.bye'}}Good vote{{/i18n}},<br>{{#i18n 'common.mieuxvoter'}}Mieux Voter{{/i18n}}</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- SUPPORT CALLOUT -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 30px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="support callout">
<!-- HEADLINE -->
<tr>
<th scope="col" style="background-color: #7d8ecf; padding: 30px 30px 30px 30px; border-radius: 4px 4px 4px 4px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 18px; font-weight: 400; line-height: 25px;" >
<p style="margin: 0;"><strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #FFFFFF;" rel="noopener noreferrer">
{{#i18n 'email.aboutjm'}}Need any further information?{{/i18n}}
</a></strong>
</p>
<p style="margin: 0;"> <strong>
<a href="https://mieuxvoter.fr/index.php/decouvrir/" target="_blank" style="color: #111111;" rel="noopener noreferrer">
{{#i18n 'common.helpus'}}Do you want to help us?{{/i18n}}
</a></strong>
</p>
</th>
</tr>
</table>
</th>
</tr>
<!-- FOOTER -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 10px 0px 10px;">
<table border="0" style="margin: 0px auto 0px auto; width: 100%; max-width: 600px;" aria-describedby="footer informations">
<!-- EXPLAIN WHY -->
</br>
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">
{{#i18n email.why }}You received this email because someone invited you to vote.{{/i18n}}
</p>
</th>
</tr>
<!-- ADDRESS -->
<tr>
<th scope="col" style="background-color: #f4f4f4; padding: 0px 30px 30px 30px; color: #666666; font-family: 'Lato', Helvetica, Arial, sans-serif; font-size: 14px; font-weight: 400; line-height: 18px;" >
<p style="margin: 0;">{{#i18n mieuxvoter }}Mieux Voter{{/i18n}} - <a "mailto:app@mieuxvoter.fr">app@mieuxvoter.fr</a></p>
</th>
</tr>
</table>
</th>
</tr>
</table>
</body>
</html>

@ -1,19 +0,0 @@
{{#i18n 'email.hello'}}Hi there! 🙂{{/i18n}}
{{#i18n 'email.happy'}}We are happy to send you this email! You will be able to vote using majority judgment.{{/i18n}}
{{#i18n 'email.why'}}This email was sent to you because your email was filled out to participate in the vote on the subject:{{/i18n}}
{{ title }}
{{#i18n 'email.linkVote' }}The link for the vote is as follows:{{/i18n}}
%recipient.urlVote%
{{#i18n 'email.linkResult' }}The link that will give you the results when they are available is as follows:{{/i18n}}
%recipient.urlResult%
{{#i18n 'email.bye'}}Good vote{{/i18n}}
{{#i18n 'common.mieuxvoter'}}Mieux Voter{{/i18n}}

@ -1,150 +0,0 @@
const fs = require("fs");
const Mailgun = require("mailgun.js");
const formData = require("form-data");
const dotenv = require("dotenv");
const i18next = require("i18next");
const Backend = require("i18next-chained-backend");
const FSBackend = require("i18next-fs-backend");
const HttpApi = require("i18next-http-backend");
const Handlebars = require("handlebars");
dotenv.config();
const {
MAILGUN_API_KEY,
MAILGUN_DOMAIN,
MAILGUN_URL,
FROM_EMAIL_ADDRESS,
CONTACT_TO_EMAIL_ADDRESS,
} = process.env;
const mailgun = new Mailgun(formData);
const mg = mailgun.client({
username: "api",
key: MAILGUN_API_KEY,
url: "https://api.eu.mailgun.net",
});
const success = {
statusCode: 200,
body: "Your message was sent successfully! We'll be in touch.",
};
const err = {
statusCode: 422,
body: "Can't send message",
};
// setup i18n
// i18next.use(Backend).init({
// lng: "fr",
// ns: ["emailInvite", "common"],
// defaultNS: "emailInvite",
// fallbackNS: "common",
// debug: false,
// fallbackLng: ["fr"],
// backend: {
// backends: [FSBackend, HttpApi],
// backendOptions: [{ loadPath: "/public/locales/{{lng}}/{{ns}}.json" }, {}],
// },
// });
// setup the template engine
// See https://github.com/UUDigitalHumanitieslab/handlebars-i18next
// function extend(target, ...sources) {
// sources.forEach((source) => {
// if (source)
// for (let key in source) {
// target[key] = source[key];
// }
// });
// return target;
// }
// Handlebars.registerHelper("i18n", function (key, { hash, data, fn }) {
// let parsed = {};
// const jsonKeys = [
// "lngs",
// "fallbackLng",
// "ns",
// "postProcess",
// "interpolation",
// ];
// jsonKeys.forEach((key) => {
// if (hash[key]) {
// parsed[key] = JSON.parse(hash[key]);
// delete hash[key];
// }
// });
// let options = extend({}, data.root.i18next, hash, parsed, {
// returnObjects: false,
// });
// let replace = (options.replace = extend({}, this, options.replace, hash));
// delete replace.i18next; // may creep in if this === data.root
// if (fn) options.defaultValue = fn(replace);
// return new Handlebars.SafeString(i18next.t(key, options));
// });
// const txtStr = fs.readFileSync(__dirname + "/invite.txt").toString();
const txtStr = {
en: fs.readFileSync(__dirname + "/invite-en.txt").toString(),
fr: fs.readFileSync(__dirname + "/invite-fr.txt").toString(),
};
const txtTemplate = {
en: Handlebars.compile(txtStr.en),
fr: Handlebars.compile(txtStr.fr),
};
const htmlStr = {
en: fs.readFileSync(__dirname + "/invite-en.html").toString(),
fr: fs.readFileSync(__dirname + "/invite-fr.html").toString(),
};
const htmlTemplate = {
en: Handlebars.compile(htmlStr.en),
fr: Handlebars.compile(htmlStr.fr),
};
const test = Handlebars.compile("test");
const sendMail = async (event) => {
if (event.httpMethod !== "POST") {
return {
statusCode: 405,
body: "Method Not Allowed",
headers: { Allow: "POST" },
};
}
const data = JSON.parse(event.body);
if (!data.recipientVariables || !data.title || !data.locale) {
return {
statusCode: 422,
body: "Recipient variables and title are required.",
};
}
// i18next.changeLanguage(data.locale);
const templateData = {
title: data.title,
};
const mailgunData = {
// from: `${i18next.t("Mieux Voter")} <mailgun@mg.app.mieuxvoter.fr>`,
from: '"Mieux Voter" <postmaster@mg.app.mieuxvoter.fr>',
to: Object.keys(data.recipientVariables),
text: txtTemplate.fr(templateData),
html: htmlTemplate.fr(templateData),
subject: data.title,
"h:Reply-To": "app@mieuxvoter.fr",
"recipient-variables": JSON.stringify(data.recipientVariables),
};
const res = mg.messages
.create("mg.app.mieuxvoter.fr", mailgunData)
.then((msg) => {
return success;
}) // logs response data
.catch((err) => {
console.log(err);
return success;
}); // logs any error
return res;
};
exports.handler = sendMail;

@ -1,82 +0,0 @@
const fs = require("fs");
const chalk = require("chalk");
module.exports = {
input: [
"app/**/*.{js,jsx}",
// Use ! to filter out files or directories
"!app/**/*.spec.{js,jsx}",
"!app/i18n/**",
"!**/node_modules/**"
],
output: ".",
options: {
debug: true,
func: {
list: ["i18next.t", "i18n.t", "t"],
extensions: [".js", ".jsx"]
},
trans: {
component: "Trans",
i18nKey: "i18nKey",
defaultsKey: "defaults",
extensions: [".js", ".jsx"],
fallbackKey: function(ns, value) {
return value;
},
acorn: {
ecmaVersion: 10, // defaults to 10
sourceType: "module" // defaults to 'module'
// Check out https://github.com/acornjs/acorn/tree/master/acorn#interface for additional options
}
},
lngs: ["en", "fr", "es", "de", "ru"],
ns: ["resource", "common"],
defaultLng: "en",
defaultNs: "resource",
defaultValue: "__STRING_NOT_TRANSLATED__",
resource: {
loadPath: "./public/locale/i18n/{{lng}}/{{ns}}.json",
savePath: "./public/locale/i18n/{{lng}}/{{ns}}.json",
jsonIndent: 2,
lineEnding: "\n"
},
nsSeparator: false, // namespace separator
keySeparator: false, // key separator
interpolation: {
prefix: "{{",
suffix: "}}"
}
},
transform: function customTransform(file, enc, done) {
"use strict";
const parser = this.parser;
const content = fs.readFileSync(file.path, enc);
let count = 0;
parser.parseFuncFromString(
content,
{ list: ["i18next._", "i18next.__"] },
(key, options) => {
parser.set(
key,
Object.assign({}, options, {
nsSeparator: false,
keySeparator: false
})
);
++count;
}
);
if (count > 0) {
/* console.log(
`i18next-scanner: count=${chalk.cyan(count)}, file=${chalk.yellow(
JSON.stringify(file.relative)
)}`
);*/
}
done();
}
};

@ -1,10 +0,0 @@
{
"compilerOptions": {
"baseUrl": "./",
"paths": {
"@components/*": ["components/*"],
"@styles/*": ["styles/*"],
"@services/*": ["services/*"]
}
}
}

@ -1,7 +0,0 @@
[build]
command = "npm run build"
publish = "out"
functions = "functions"
[dev]
command = "npm run dev"

@ -1,9 +0,0 @@
module.exports = {
i18n: {
defaultLocale: "fr",
locales: ["en", "fr", "de", "es", "ru"],
ns: ["resource", "common", "error"],
defaultNS: "resource",
fallbackNS: ["common", "error"],
},
};

@ -1,46 +0,0 @@
const { i18n } = require("./next-i18next.config");
module.exports = {
i18n,
// See https://github.com/netlify/netlify-plugin-nextjs/issues/223
unstableNetlifyFunctionsSupport: {
"pages/index.jsx": {
includeDirs: ["public"],
},
"pages/faq.jsx": {
includeDirs: ["public"],
},
"pages/legal-notices.jsx": {
includeDirs: ["public"],
},
"pages/new/confirm/[pid].jsx": {
includeDirs: ["public"],
},
"pages/new.jsx": {
includeDirs: ["public"],
},
"pages/result/[pid]/[[...tid]].jsx": {
includeDirs: ["public"],
},
"pages/vote/[pid]/[[...tid]].jsx": {
includeDirs: ["public"],
},
"pages/vote/[pid]/confirm.jsx": {
includeDirs: ["public"],
},
"pages/privacy-policy.jsx": {
includeDirs: ["public"],
},
},
pageExtensions: ["mdx", "jsx", "js", "ts", "tsx"],
webpack(config) {
config.module.rules.push({
test: /\.svg$/,
use: ["@svgr/webpack"],
});
return config;
},
target: "experimental-serverless-trace",
};

@ -1,231 +0,0 @@
import { useState } from "react";
import Head from "next/head";
import Link from "next/link";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import { useTranslation } from "next-i18next";
import { Container, Row, Col, Button, Input } from "reactstrap";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faRocket } from "@fortawesome/free-solid-svg-icons";
import config from "../next-i18next.config.js";
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const Home = () => {
const [title, setTitle] = useState(null);
const { t } = useTranslation();
return (
<Container>
<form autoComplete="off">
<Row>
<img
src="logos/logo-line-white.svg"
alt="logo of Mieux Voter"
height="128"
className="d-block ml-auto mr-auto mb-4"
/>
</Row>
<Row>
<Col className="text-center">
<h3>{t("common.valueProp")}</h3>
</Col>
</Row>
<Row className="mt-2">
<Col xs="12" md="9" xl="6" className="offset-xl-2">
<Input
placeholder={t("resource.writeQuestion")}
autoFocus
required
className="mt-2"
name="title"
value={title ? title : ""}
onChange={(e) => setTitle(e.target.value)}
maxLength="250"
/>
</Col>
<Col xs="12" md="3" xl="2">
<Link href={{ pathname: "/new/", query: { title: title } }}>
<Button
type="submit"
className="btn btn-block btn-secondary mt-2"
>
<FontAwesomeIcon icon={faRocket} className="mr-2" />
{t("resource.start")}
</Button>
</Link>
</Col>
</Row>
<Row className="mt-4">
<Col className="text-center">
<p>{t("resource.noAds")}</p>
</Col>
</Row>
</form>
</Container>
);
};
export default Home;
import { useState } from "react";
import Head from "next/head";
import Link from "next/link";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import { useTranslation } from "next-i18next";
import { Container, Row, Col, Button, Input } from "reactstrap";
import config from "../next-i18next.config.js";
import VoteBallot from './vote/[pid]/[[...tid]]';
import CandidatesField from '../components/form/CandidatesField';
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const Home = () => {
const [title, setTitle] = useState(null);
const { t } = useTranslation();
return (
<section>
<VoteBallot />
</section>
// <Container className="homePage">
// <section>
// <form className="sectionOneHomeForm" autoComplete="off">
// <Row className="sectionOneHomeRowOne">
// <Col className="sectionOneHomeContent">
// <Row>
// <img
// src="logos/logo.svg"
// alt="logo of Mieux Voter"
// height="128"
// className="d-block"
// />
// </Row>
// <Row>
// <h4>Simple et gratuit</h4>
// </Row>
// <Row>
// <h2>Organisez un vote avec le Jugement Majoritaire</h2>
// </Row>
// <Row>
// <Input
// placeholder={t("resource.writeQuestion")}
// autoFocus
// required
// className="mt-2 sectionOneHomeInput"
// name="title"
// value={title ? title : ""}
// onChange={(e) => setTitle(e.target.value)}
// maxLength="250"
// />
// </Row>
// <Row>
// <Button
// type="submit"
// className="btn btn-block btn-secondary mt-2"
// >
// {t("resource.start")}
// <img src="/arrow-white.svg" className="mr-2" />
// </Button>
// </Row>
// <Row>
// <p className="noPub">Pas de publicités, ni de cookies publicitaires</p>
// </Row>
// </Col>
// <Col></Col>
// </Row>
// <Row>
// </Row>
// </form>
// </section>
// <section className="sectionTwoHome">
// <Row className="sectionTwoRowOne">
// <Col className="sectionTwoRowOneCol">
// <img
// src="/urne.svg"
// alt="icone d'urne"
// height="128"
// className="d-block mx-auto"
// />
// <h4>Simple</h4>
// <p>Créez un vote en moins dune minute</p>
// </Col>
// <Col className="sectionTwoRowOneCol">
// <img
// src="/email.svg"
// alt="icone d'enveloppe"
// height="128"
// className="d-block mx-auto"
// />
// <h4>Gratuit</h4>
// <p>Envoyez des invitations par courriel sans limite d'envoi</p>
// </Col>
// <Col className="sectionTwoRowOneCol">
// <img
// src="/respect.svg"
// alt="icone de mains qui se serrent"
// height="128"
// className="d-block mx-auto"
// />
// <h4>Respect de votre vie privée</h4>
// <p>Aucune donnée personnelle n'est enregistrée</p>
// </Col>
// </Row>
// <Row className="sectionTwoRowTwo">
// <Row className="mb-5">
// <h3 className="col-md-7 mb-5">Une expérience de vote démocratique et intuitive</h3>
// </Row>
// <Row>
// <Col className="col-md-4">
// <h5 className="mb-3">Exprimez toute votre opinion</h5>
// <p>Au jugement majoritaire, chaque candidat est évalué sur une grille de mention. Vous naurez plus besoin de faire un vote stratégique.</p>
// </Col>
// <Col className="col-md-4 offset-md-1">
// <h5 className="mb-3">Obtenez le meilleur consensus</h5>
// <p>Le profil des mérites dresse un panorama précis de lopinion des électeurs. Le gagnant du vote est celui qui est la meilleure mention majoritaire.</p>
// </Col>
// </Row>
// <Row>
// <Button
// className="btn btn-block btn-secondary btn-sectionTwoHome"
// >
// Découvrez le jugement majoritaire
// <img src="/arrow-white.svg" className="mr-2" />
// </Button>
// </Row>
// </Row>
// <Row className="sharing">
// <p>Partagez lapplication Mieux voter</p>
// <a><img src="/facebook.svg" className="mr-2" /></a>
// <a><img src="/twitter.svg" className="mr-2" /></a>
// </Row>
// </section>
// </Container>
);
};
export default Home;

17414
package-lock.json generated

File diff suppressed because it is too large Load Diff

@ -1,62 +0,0 @@
{
"name": "mv-front-react",
"version": "1.1.0",
"private": true,
"scripts": {
"dev": "next dev",
"build": "next build && next export",
"start": "next start",
"export": "next export"
},
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.3",
"@fortawesome/fontawesome-svg-core": "^1.2.35",
"@fortawesome/free-brands-svg-icons": "^5.15.3",
"@fortawesome/free-solid-svg-icons": "^5.15.3",
"@fortawesome/react-fontawesome": "^0.1.14",
"@svgr/webpack": "^5.5.0",
"@weknow/react-bubble-chart-d3": "^1.0.12",
"array-move": "^3.0.1",
"bootstrap": "^4.6.0",
"bootstrap-scss": "^4.6.0",
"d3": "^7.3.0",
"d3-require": "^1.2.4",
"domexception": "^2.0.1",
"dotenv": "^8.6.0",
"form-data": "^4.0.0",
"gsap": "^3.9.1",
"handlebars": "^4.7.7",
"handlebars-i18next": "^1.0.1",
"highcharts": "^9.3.2",
"highcharts-react-official": "^3.1.0",
"i18next": "^20.2.2",
"i18next-chained-backend": "^2.1.0",
"i18next-fs-backend": "^1.1.1",
"i18next-http-backend": "^1.2.4",
"i18next-localstorage-backend": "^3.1.2",
"i18next-text": "^0.5.6",
"mailgun.js": "^3.3.2",
"next": "^10.2.0",
"next-i18next": "^8.2.0",
"plotly.js": "^2.8.3",
"plotly.js-dist": "^2.8.3",
"query-string": "^7.0.0",
"ramda": "^0.27.2",
"react": "^17.0.2",
"react-bootstrap": "^2.1.0",
"react-bubble-chart": "^0.4.0",
"react-dom": "^17.0.2",
"react-flags-select": "^2.1.2",
"react-google-charts": "^3.0.15",
"react-i18next": "^11.8.15",
"react-modal": "^3.14.4",
"react-multi-email": "^0.5.3",
"react-plotly.js": "^2.5.1",
"react-responsive": "^9.0.0-beta.6",
"react-sortable-hoc": "^2.0.0",
"react-toastify": "^7.0.4",
"reactstrap": "^8.9.0",
"sass": "^1.32.13",
"styled-components": "^5.3.3"
}
}

@ -1,34 +0,0 @@
import Head from 'next/head'
import '@styles/globals.css'
import '@styles/footer.css'
import '@styles/loader.css'
import "@styles/scss/config.scss";
import '@fortawesome/fontawesome-svg-core/styles.css'
import {appWithTranslation} from 'next-i18next'
import {AppProvider} from '@services/context.js'
import Header from '@components/layouts/Header'
import Footer from '@components/layouts/Footer'
function Application({Component, pageProps}) {
const origin = typeof window !== 'undefined' && window.location.origin ? window.location.origin : 'http://localhost';
return (<AppProvider>
<Head>
<link rel="icon" key="favicon" href="/favicon.ico" />
<meta property="og:url" content={origin} key="og:url" />
<meta property="og:type" content="website" key="og:type" />
<meta
property="og:image"
content="https://app.mieuxvoter.fr/app-mieux-voter.png"
key="og:image"
/>
</Head>
<Header />
<main className="d-flex flex-column justify-content-center">
<Component {...pageProps} />
</main>
<Footer />
</AppProvider>);
}
export default appWithTranslation(Application)

@ -1,262 +0,0 @@
import Link from "next/link";
import { Container, Row, Col } from "reactstrap";
import { useTranslation } from "next-i18next";
import Paypal from "@components/banner/Paypal";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import config from "../next-i18next.config.js";
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const FAQ = (props) => {
const { t } = useTranslation();
return (
<Container>
<Row>
<Link href="/" className="d-block ml-auto mr-auto mb-4">
<img src="/logos/logo-line-white.svg" alt="logo" height="128" />
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center">
<h1>{t("FAQ")}</h1>
</Col>
</Row>
<Row className="mt-4">
<Col>
<h4 className="bold mt-5">Quest-ce que le Jugement Majoritaire ?</h4>
<p>
Un principe simple et intuitif, qui change tout : lélecteur vote en
donnant son avis sur toutes les candidatures présentées, leur
attribuant la mention de son choix (par exemple. Très bien, Bien,
Assez bien, Passable, Insuffisant, À Rejeter). La candidature
retenue est celle jugée la plus méritante par la majorité de
lélectorat (celui qui obtient la meilleure mention « majoritaire
»).
</p>
<div style={{ maxWidth: "445px" }}>
<video width="100%" height="250" controls="controls">
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.mp4"
type="video/mp4"
/>
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.webm"
type="video/webm"
/>
<source
src="/video/Le_Jugement_Majoritaire_en_1_minute.3gpp"
type="video/3gpp"
/>
</video>
</div>
<h4 className="bold mt-5">D vient le Jugement Majoritaire ?</h4>
<p>
Le jugement majoritaire est un mode de scrutin inventé par deux
chercheurs Français du Centre National de la Recherche Scientifique
(CNRS) en 2011, <u>Michel Balinski</u> et <u>Rida Laraki</u>.
</p>
<h4 className="bold mt-5">
Quels sont les avantages du Jugement Majoritaire ?
</h4>
<p>
Une mesure précise de lopinion des participants au vote, à même
déclairer la décision collective. En demandant aux électeurs leur
opinion sur chaque option soumise au vote, on bénéficie de beaucoup
plus dinformations que dans le cadre du scrutin uninominal qui,
résumant lopinion des électeurs à un choix, ignore lessentiel de
linformation quant à ce quils pensent. En agrégeant un grand
nombre dinformations, le Jugement Majoritaire ne produit pas «
juste » un gagnant qui obtiendrait la majorité des voix. Il mesure
précisément le crédit porté à chacune des options et permet
daffiner autant que de pacifier la prise de décision.
</p>
<h4 className="bold mt-5">
Quand et comment utiliser le Jugement Majoritaire ?
</h4>
<p>
Le Jugement majoritaire sapplique à tout type de votation
collective, quil sagisse délire un candidat, de retenir une ou
plusieurs idées lors dun atelier collaboratif, de choisir entre
plusieurs projets, de classer les vins, etc. Il peut être utilisé à
toutes les échelles (locale, nationale, internationale) et dans tous
les milieux (écoles, entreprises, associations, coopératives,
collectivités publiques).
</p>
<h4 className="bold mt-5">Qui peut utiliser cette application ?</h4>
<p>
Cette application de Jugement Majoritaire est ouverte à toute
personne désireuse de prendre une décision collective, entre amis,
entre collègues, entre membres dun groupe. Elle est libre daccès
et gratuite. Notre ambition est de vous proposer la meilleure
expérience de prise de décision collective et démocratique.
</p>
<h4 className="bold mt-5">
Comment organiser une élection avec plusieurs milliers de votants ?
</h4>
<p>
Cette application ne convient pas pour les votes à plus de 1000
votants. Si cest votre cas, nous vous invitons à nous contacter par
email à ladresse{" "}
<a href="mailto:contact@mieuxvoter.fr" className="text-light">
contact@mieuxvoter.fr
</a>
. Dans le cas dun vote sur invitation nous vous suggérons de ne pas
dépasser 200 participants (le temps de création du vote peut prendre
quelques minutes).
</p>
<h4 className="bold mt-5">
Je rencontre un problème, comment obtenir de laide ?
</h4>
<p>
Si vous rencontrez un problème en utilisant notre application,
prenez contact avec nous par email à ladresse «
<a
href="mailto:app@mieuxvoter.fr?subject=[HELP]"
className="text-light"
>
app@mieuxvoter.fr
</a>
», et prenez soin de bien décrire le problème rencontré dans votre
message. Ajoutez éventuellement dans votre description le lien de
votre vote.
</p>
<h4 className="bold mt-5">
Y-a til une limite de votants appliquée pour les votes sur
invitation ?
</h4>
<p>
Le nombre maximum de votants pour un vote sur invitation est de 1000
personnes. Si toutefois votre besoin est supérieur à cette limite,
nous vous invitons à nous envoyer un email à ladresse «
<a href="mailto:contact@mieuxvoter.fr" className="text-light">
contact@mieuxvoter.fr
</a>
».
</p>
<h4 className="bold mt-5">
Combien de temps le lien vers la page de résultat reste-t-il actif ?
</h4>
<p>
Les liens fournis lors de la création de votre vote nont pas de
date dexpiration. Conservez-les précieusement afin de pouvoir
consulter les résultat dans le futur.
</p>
<h4 className="bold mt-5">
Comment puis-je massurer quune même personne ne vote pas deux
fois?
</h4>
<p>
Dans le cas dun vote sur invitation, seules les personnes dont le
courriel a été ajouté à la création du vote reçoivent une invitation
et peuvent donc voter. Chacune des invitations dispose dun lien
unique auquel est associé un jeton à usage unique. Ce jeton est
détruit aussitôt que la participation au vote de linvité est
enregistrée. Il garantit donc à lorganisateur que chaque
participant na pu voter quune seule fois.
</p>
<p>
Dans le cas dun vote public, toute personne peut participer à
lélection sil dispose du lien de lélection. Il ny a dans ce cas
aucune limite de soumission dun vote. Une même personne peut donc
voter plusieurs fois.
</p>
<h4 className="bold mt-5">
Lorsque jorganise une élection, puis-je connaître le nombre et
lidentité des votants?
</h4>
<p>
Le nombre de votants est indiqué sur la page de résultats de votre
élection. Lidentité des votants est quant à elle effacée, afin de
respecter les conditions dun vote démocratique lanonymat
garantit la sincérité des électeurs.
</p>
<h4 className="bold mt-5">Puis-je modifier mon vote ?</h4>
<p>
Une fois votre vote enregistré, vous ne pouvez plus le modifier. En
effet, votre vote étant anonymisé, ce qui nous empêche de faire le
lien entre vous et votre vote.
</p>
<h4 className="bold mt-5">
Comment puis-je récupérer un lien si je lai perdu ?
</h4>
<p>
Vous ne pouvez pas récupérer un lien pour voter après quil vous
soit communiquer. Gardez le précieusement. Cependant si vous avez le
lien pour voter, nous pouvons vous transmettre le lien des
résultats.
</p>
<h4 className="bold mt-5">
Comment interpréter les résultats dun vote au Jugement Majoritaire
?
</h4>
<p>
Les candidats ou propositions sont triées de la mention majoritaire
la plus favorable à la plus défavorable. En cas dégalité, on
calcule alors pour chaque candidat à départager: le pourcentage
délecteurs attribuant strictement plus que la mention majoritaire
commune et le pourcentage délecteurs attribuant strictement moins
que la mention majoritaire commune. La plus grande des 4 valeurs
détermine le résultat.
</p>
<h4 className="bold mt-5">Quelle sécurité pour mes données ?</h4>
<p>
Afin de garantir la sécurité de vos données, leur transmission est
chiffrée et vos votes sont anonymisés.
</p>
<h4 className="bold mt-5">
Que faites-vous des données collectées ?
</h4>
<p>
Lapplication app.mieuxvoter.fr a pour seul et unique but de faire
découvrir le vote au Jugement Majoritaire. Elle na pas de but
politique, ni commercial. Mieux Voter attache la plus grande
importance au strict respect de la vie privée, et utilise ces
données uniquement de manière responsable et confidentielle, dans
une finalité précise.
</p>
<h4 className="bold mt-5">Qui est Mieux Voter ?</h4>
<p>
« Mieux Voter » est une association loi 1901 qui promeut
lutilisation du Jugement Majoritaire, nouvelle théorie du choix
social, comme un outil pour améliorer les décisions collectives et
les exercices de démocratie participative à lusage de tous.
</p>
<h4 className="bold mt-5">
Comment nous aider à faire connaître le Jugement Majoritaire ?
</h4>
<p>
Vous avez apprécié votre expérience de vote démocratique au Jugement
Majoritaire ? <br />
Nous en sommes ravis ! Vous pouvez nous aider en faisant un don à
lassociation ici :
</p>
<Paypal btnColor="btn-success" className="mt-1" />
</Col>
</Row>
</Container>
);
};
export default FAQ;

@ -1,145 +0,0 @@
import { useState } from "react";
import Head from "next/head";
import Link from "next/link";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import { useTranslation } from "next-i18next";
import { Container, Row, Col, Button, Input } from "reactstrap";
import config from "../next-i18next.config.js";
import VoteBallot from './vote/[pid]/[[...tid]]';
import CandidatesField from '../components/form/CandidatesField';
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const Home = () => {
const [title, setTitle] = useState(null);
const { t } = useTranslation();
return (
<Container className="homePage">
<section>
<form className="sectionOneHomeForm" autoComplete="off">
<Row className="sectionOneHomeRowOne">
<Col className="sectionOneHomeContent">
<Row>
<img
src="/logos/logo.svg"
alt="logo of Mieux Voter"
height="128"
className="d-block"
/>
</Row>
<Row>
<h4>Simple et gratuit</h4>
</Row>
<Row>
<h2>Organisez un vote avec le Jugement Majoritaire</h2>
</Row>
<Row>
<Input
placeholder={t("resource.writeQuestion")}
autoFocus
required
className="mt-2 sectionOneHomeInput"
name="title"
value={title ? title : ""}
onChange={(e) => setTitle(e.target.value)}
maxLength="250"
/>
</Row>
<Row>
<Link href={{ pathname: "/new/", query: { title: title } }}>
<Button
type="submit"
className="btn btn-block btn-secondary mt-2"
>
{t("resource.start")}
<img src="/arrow-white.svg" className="mr-2" />
</Button>
</Link>
</Row>
<Row className="noAds">
<p>{t("resource.noAds")}</p>
</Row>
</Col>
<Col></Col>
</Row>
<Row>
</Row>
</form>
</section>
<section className="sectionTwoHome">
<Row className="sectionTwoRowOne">
<Col className="sectionTwoRowOneCol">
<img
src="/urne.svg"
alt="icone d'urne"
height="128"
className="d-block mx-auto"
/>
<h4>Simple</h4>
<p>Créez un vote en moins dune minute</p>
</Col>
<Col className="sectionTwoRowOneCol">
<img
src="/email.svg"
alt="icone d'enveloppe"
height="128"
className="d-block mx-auto"
/>
<h4>Gratuit</h4>
<p>Envoyez des invitations par courriel sans limite d'envoi</p>
</Col>
<Col className="sectionTwoRowOneCol">
<img
src="/respect.svg"
alt="icone de mains qui se serrent"
height="128"
className="d-block mx-auto"
/>
<h4>Respect de votre vie privée</h4>
<p>Aucune donnée personnelle n'est enregistrée</p>
</Col>
</Row>
<Row className="sectionTwoRowTwo">
<Row className="sectionTwoHomeImage">
<img src="/vote.svg" />
</Row>
<Row className="sectionTwoRowTwoCol">
<h3 className="col-md-7">Une expérience de vote démocratique et intuitive</h3>
</Row>
<Row className="sectionTwoRowTwoCol">
<Col className="col-md-4">
<h5 className="">Exprimez toute votre opinion</h5>
<p>Au jugement majoritaire, chaque candidat est évalué sur une grille de mention. Vous naurez plus besoin de faire un vote stratégique.</p>
</Col>
<Col className="col-md-4 offset-md-1">
<h5 className="">Obtenez le meilleur consensus</h5>
<p>Le profil des mérites dresse un panorama précis de lopinion des électeurs. Le gagnant du vote est celui qui est la meilleure mention majoritaire.</p>
</Col>
</Row>
<Row className="sectionTwoRowThreeCol">
<Button
className="btn btn-block btn-secondary btn-sectionTwoHome"
>
Découvrez le jugement majoritaire
<img src="/arrow-white.svg" className="mr-2" />
</Button>
</Row>
</Row>
<Row className="sharing">
<p>Partagez lapplication Mieux voter</p>
<Link href="https://www.facebook.com/mieuxvoter.fr/"><img src="/facebook.svg" className="mr-2" /></Link>
<Link href="https://twitter.com/mieux_voter"><img src="/twitter.svg" className="mr-2" /></Link>
</Row>
</section>
</Container>
);
};
export default Home;

@ -1,81 +0,0 @@
import Link from "next/link";
import { Container, Row, Col } from "reactstrap";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import config from "../next-i18next.config.js";
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const LegalNotices = (props) => {
const { t } = useTranslation();
return (
<Container>
<Row>
<Link href="/" className="d-block ml-auto mr-auto mb-4">
<img src="/logos/logo-line-white.svg" alt="logo" height="128" />
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center">
<h1>{t("resource.legalNotices")}</h1>
</Col>
</Row>
<Row className="mt-4">
<Col>
<h3 className="bold">Editeur</h3>
<p>
Cette Application est éditée par lassociation loi 1901{" "}
<a
href="https://mieuxvoter.fr/"
target="_blank"
rel="noopener noreferrer"
className="text-white"
>
Mieux Voter
</a>
, dont le siège social est situé au 59 rue Saint-André des Arts, à
Paris (75006).
</p>
<p>
Adresse email :{" "}
<a href="mailto:app@mieuxvoter.fr" className="text-light">
app@mieuxvoter.fr
</a>
</p>
<p>
<b>Directeur de la publication</b>
<br />
Pierre-Louis Guhur
</p>
<h3 className="mt-2 bold">Hébergement</h3>
<ul>
<li>Base de données : Institut Systèmes Complexes, Paris ;</li>
<li>
Réseau de diffusion de contenu (CDN) : Netlify, 2325 3rd Street,
Suite 215, San Francisco, California 94107.
</li>
</ul>
<h3 className="mt-2 bold">&OElig;uvres graphiques</h3>
<p>
Les illustrations et graphismes sur cette application sont
l&oelig;uvre de lassociation Mieux Voter.
</p>
</Col>
</Row>
<Row className="mt-4">
<Col className="text-center">
<Link href="/" className="btn btn-secondary">
{t("common.backHomepage")}
</Link>
</Col>
</Row>
</Container>
);
};
export default LegalNotices;

@ -1,171 +0,0 @@
import { createRef } from "react";
import Head from "next/head";
import { useRouter } from "next/router";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import {
getDetails,
apiErrors,
ELECTION_NOT_STARTED_ERROR,
} from "@services/api";
import { Col, Container, Row } from "reactstrap";
import Link from "next/link";
import {
faCopy,
faVoteYea,
faExclamationTriangle,
faExternalLinkAlt,
faPollH,
} from "@fortawesome/free-solid-svg-icons";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import CopyField from "@components/CopyField";
import Error from "@components/Error";
import Facebook from "@components/banner/Facebook";
import config from "../../../next-i18next.config.js";
export async function getServerSideProps({ query: { pid }, locale }) {
let [details, translations] = await Promise.all([
getDetails(pid),
serverSideTranslations(locale, [], config),
]);
// if (details.includes(ELECTION_NOT_STARTED_ERROR)) {
// details = { title: "", on_invitation_only: true, restrict_results: true };
// } else {
// if (typeof details === "string" || details instanceof String) {
// return { props: { err: details, ...translations } };
// }
// if (!details.title) {
// return { props: { err: "Unknown error", ...translations } };
// }
// }
return {
props: {
invitationOnly: details.on_invitation_only,
restrictResults: details.restrict_results,
title: details.title,
pid: pid,
...translations,
},
};
}
const ConfirmElection = ({
title,
restrictResults,
invitationOnly,
pid,
err,
}) => {
const { t } = useTranslation();
if (err) {
return <Error value={apiErrors(err, t)} />;
}
const origin =
typeof window !== "undefined" && window.location.origin
? window.location.origin
: "http://localhost";
const urlVote = new URL(`/vote/${pid}`, origin);
const urlResult = new URL(`/result/${pid}`, origin);
const electionLink = invitationOnly ? (
<>
<p className="mb-1">
{t(
"Voters received a link to vote by email. Each link can be used only once!"
)}
</p>
</>
) : (
<>
<p className="mb-1">{t("Voting address")}</p>
<CopyField
value={urlVote.href}
iconCopy={faCopy}
iconOpen={faExternalLinkAlt}
t={t}
/>
</>
);
const fb = invitationOnly ? null : (
<Facebook
className="btn btn-sm btn-outline-light m-2"
text={t("Share election on Facebook")}
url={urlVote}
title={"app.mieuxvoter.fr"}
/>
);
const participate = invitationOnly ? null : (
<>
<Col className="col-lg-3 text-center mr-10">
<Link href={`/vote/${pid}`}>
<a target="_blank" rel="noreferrer" className="btn btn-success">
<FontAwesomeIcon icon={faVoteYea} className="mr-2" />
{t("resource.participateBtn")}
</a>
</Link>
</Col>
</>
);
return (
<Container>
<Head>
<title>{t("Successful election creation!")}</title>
<link rel="icon" href="/favicon.ico" />
<meta key="og:title" property="og:title" content={title} />
<meta
property="og:description"
key="og:description"
content={t("common.application")}
/>
</Head>
<Row className="mt-5">
<Col className="text-center offset-lg-3" lg="6">
<h2>{t("Successful election creation!")}</h2>
{fb}
</Col>
</Row>
<Row className="mt-5 mb-4">
<Col className="offset-lg-3" lg="6">
<h3 className="mb-3 text-center">{title}</h3>
<h5 className="mb-3 text-center">
<FontAwesomeIcon icon={faExclamationTriangle} className="mr-2" />
{t("Keep these links carefully")}
</h5>
<div className="border rounded p-4 pb-5">
{electionLink}
<p className="mt-4 mb-1">{t("Results address")}</p>
<CopyField
value={urlResult}
iconCopy={faCopy}
iconOpen={faExternalLinkAlt}
t={t}
/>
</div>
</Col>
</Row>
<Row className="mt-4 mb-4 justify-content-md-center">
{participate}
<Col className="text-center col-lg-3">
<Link href={`/result/${pid}`}>
<a target="_blank" rel="noreferrer" className="btn btn-secondary">
<FontAwesomeIcon icon={faPollH} className="mr-2" />
{t("resource.resultsBtn")}
</a>
</Link>
</Col>
</Row>
</Container>
);
};
export default ConfirmElection;

@ -1,618 +0,0 @@
import { useState, useEffect } from "react";
import Head from "next/head";
import { useRouter } from "next/router";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import {
Collapse,
Container,
Row,
Col,
Input,
Label,
InputGroup,
InputGroupAddon,
Button,
Card,
CardBody,
} from "reactstrap";
import { ReactMultiEmail, isEmail } from "react-multi-email";
import "react-multi-email/style.css";
import { toast, ToastContainer } from "react-toastify";
import "react-toastify/dist/ReactToastify.css";
import queryString from "query-string";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import {
faPlus,
faTrashAlt,
faCheck,
faCogs,
faExclamationTriangle,
} from "@fortawesome/free-solid-svg-icons";
import { useAppContext } from "@services/context";
import { createElection } from "@services/api";
import { translateGrades } from "@services/grades";
import HelpButton from "@components/form/HelpButton";
import Loader from "@components/wait";
import CandidatesField from "@components/form/CandidatesField";
import ConfirmModal from "@components/form/ConfirmModal";
import config from "../../next-i18next.config.js";
import Modal from '../../components/Modal'
// Error messages
const AT_LEAST_2_CANDIDATES_ERROR = "Please add at least 2 candidates.";
const NO_TITLE_ERROR = "Please add a title.";
const isValidDate = (date) => date instanceof Date && !isNaN(date);
const getOnlyValidDate = (date) => (isValidDate(date) ? date : new Date());
// Convert a Date object into YYYY-MM-DD
const dateToISO = (date) =>
getOnlyValidDate(date).toISOString().substring(0, 10);
// Retrieve the current hour, minute, sec, ms, time into a timestamp
const hours = (date) => getOnlyValidDate(date).getHours() * 3600 * 1000;
const minutes = (date) => getOnlyValidDate(date).getMinutes() * 60 * 1000;
const seconds = (date) => getOnlyValidDate(date).getSeconds() * 1000;
const ms = (date) => getOnlyValidDate(date).getMilliseconds();
const time = (date) =>
hours(getOnlyValidDate(date)) +
minutes(getOnlyValidDate(date)) +
seconds(getOnlyValidDate(date)) +
ms(getOnlyValidDate(date));
// Retrieve the time part from a timestamp and remove the day. Return a int.
const timeMinusDate = (date) => time(getOnlyValidDate(date));
// Retrieve the day and remove the time. Return a Date
const dateMinusTime = (date) =>
new Date(getOnlyValidDate(date).getTime() - time(getOnlyValidDate(date)));
const displayClockOptions = () =>
Array(24)
.fill(1)
.map((x, i) => (
<option value={i} key={i}>
{i}h00
</option>
));
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const CreateElection = (props) => {
const { t } = useTranslation();
// default value : start at the last hour
const now = new Date();
const [title, setTitle] = useState("");
const [candidates, setCandidates] = useState([{ label: "" }, { label: "" }]);
const [numGrades, setNumGrades] = useState(5);
const [waiting, setWaiting] = useState(false);
const [isAdvancedOptionsOpen, setAdvancedOptionsOpen] = useState(false);
const [isAddCandidateMOpen, setAddCandidateMOpen] = useState(false);
const [isTimeLimited, setTimeLimited] = useState(false);
const [restrictResult, setRestrictResult] = useState(false);
const [start, setStart] = useState(
new Date(now.getTime() - minutes(now) - seconds(now) - ms(now))
);
const [finish, setFinish] = useState(
new Date(start.getTime() + 7 * 24 * 3600 * 1000)
);
const [emails, setEmails] = useState([]);
// set the title on loading
const router = useRouter();
useEffect(() => {
if (!router.isReady) return;
const { title: urlTitle } = router.query;
setTitle(urlTitle || "");
}, [router.isReady]);
const handleIsTimeLimited = (event) => {
setTimeLimited(event.target.value === "1");
};
const handleRestrictResultCheck = (event) => {
setRestrictResult(event.target.value === "1");
};
const toggleAdvancedOptions = () => {
setAdvancedOptionsOpen(!isAdvancedOptionsOpen);
};
const toggleAddCandidateM = () => {
setAddCandidateMOpen(!isAddCandidateMOpen);
};
const addCandidate = () => {
if (candidates.length < 1000) {
candidates.push({ label: "" });
setCandidates(candidates);
}
};
const checkFields = () => {
if (!candidates) {
return { ok: false, msg: AT_LEAST_2_CANDIDATES_ERROR };
}
let numCandidates = 0;
candidates.forEach((c) => {
if (c.label !== "") numCandidates += 1;
});
if (numCandidates < 2) {
return { ok: false, msg: AT_LEAST_2_CANDIDATES_ERROR };
}
if (!title || title === "") {
return { ok: false, msg: NO_TITLE_ERROR };
}
return { ok: true, msg: "OK" };
};
const handleSubmit = () => {
const check = checkFields();
if (!check.ok) {
toast.error(t(check.msg), {
position: toast.POSITION.TOP_CENTER,
});
return;
}
setWaiting(true);
createElection(
title,
candidates.map((c) => c.label).filter((c) => c !== ""),
{
mails: emails,
numGrades,
start: start.getTime() / 1000,
finish: finish.getTime() / 1000,
restrictResult: restrictResult,
locale: router.locale.substring(0, 2).toLowerCase(),
},
(result) => {
if (result.id) {
router.push(`/new/confirm/${result.id}`);
} else {
toast.error(t("Unknown error. Try again please."), {
position: toast.POSITION.TOP_CENTER,
});
setWaiting(false);
}
}
);
};
const handleSendNotReady = (msg) => {
toast.error(t(msg), {
position: toast.POSITION.TOP_CENTER,
});
};
const check = checkFields();
const grades = translateGrades(t);
const [showModal, setShowModal] = useState(false);
return (
<Container className="addCandidatePage">
<Head>
<meta
key="og:title"
property="og:title"
content={t("common.application")}
/>
<meta
property="og:description"
key="og:description"
content={t("resource.valueProp")}
/>
</Head>
<ToastContainer />
{waiting ? <Loader /> : ""}
<form onSubmit={handleSubmit} autoComplete="off">
<Row className="stepForm">
<Col>
<img src="/icone-one-white.svg" />
<h4>Les candidats</h4>
</Col>
<Col>
<img src="/icone-two-dark.svg" />
<h4>Paramètres du vote</h4>
</Col>
<Col>
<img src="/icone-three-dark.svg" />
<h4>Confirmation</h4>
</Col>
</Row>
<Row className="mt-4">
<Col xs="12">
<CandidatesField onChange={setCandidates} />
</Col>
<Col
xs="12"
sm="6"
md="12"
className="text-center text-sm-right text-md-left"
>
<Button
color="link"
className="text-white mt-3 mb-1"
onClick={toggleAdvancedOptions}
>
<FontAwesomeIcon icon={faCogs} className="mr-2" />
{t("resource.advancedOptions")}
</Button>
</Col>
</Row>
<Collapse isOpen={isAdvancedOptionsOpen}>
<Card>
<CardBody className="text-primary">
<Row>
<Col xs="12" md="3" lg="3">
<Label for="title">{t("Access to results")}</Label>
</Col>
<Col xs="12" md="4" lg="3">
<Label className="radio " htmlFor="restrict_result_false">
<span className="small text-dark">{t("Immediately")}</span>
<input
className="radio"
type="radio"
name="restrict_result"
id="restrict_result_false"
onClick={handleRestrictResultCheck}
defaultChecked={!restrictResult}
value="0"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
<Col xs="12" md="4" lg="3">
<Label className="radio" htmlFor="restrict_result_true">
<span className="small">
<span className="text-dark">
{t("At the end of the election")}
</span>
<HelpButton className="ml-2">
{t(
"No one will be able to see the result until the end date is reached or until all participants have voted."
)}
</HelpButton>
</span>
<input
className="radio"
type="radio"
name="restrict_result"
id="restrict_result_true"
onClick={handleRestrictResultCheck}
defaultChecked={restrictResult}
value="1"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
</Row>
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
<Label for="title">{t("Voting time")}</Label>
</Col>
<Col xs="12" md="4" lg="3">
<Label className="radio " htmlFor="is_time_limited_false">
<span className="small text-dark">{t("Unlimited")}</span>
<input
className="radio"
type="radio"
name="time_limited"
id="is_time_limited_false"
onClick={handleIsTimeLimited}
defaultChecked={!isTimeLimited}
value="0"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
<Col xs="12" md="4" lg="3">
<Label className="radio" htmlFor="is_time_limited_true">
<span className="small">
<span className="text-dark">{t("Defined period")}</span>
</span>
<input
className="radio"
type="radio"
name="time_limited"
id="is_time_limited_true"
onClick={handleIsTimeLimited}
defaultChecked={isTimeLimited}
value="1"
/>
<span className="checkround checkround-gray" />
</Label>
</Col>
</Row>
<div
className={
(isTimeLimited ? "d-block " : "d-none") + " bg-light p-3"
}
>
<Row>
<Col xs="12" md="3" lg="3">
<span className="label">- {t("Starting date")}</span>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(start)}
onChange={(e) => {
setStart(
new Date(
timeMinusDate(start) +
new Date(e.target.valueAsNumber).getTime()
)
);
}}
/>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(start).getHours()}
onChange={(e) =>
setStart(
new Date(
dateMinusTime(start).getTime() +
e.target.value * 3600000
)
)
}
>
{displayClockOptions()}
</select>
</Col>
</Row>
<Row className="mt-2">
<Col xs="12" md="3" lg="3">
<span className="label">- {t("Ending date")}</span>
</Col>
<Col xs="6" md="4" lg="3">
<input
className="form-control"
type="date"
value={dateToISO(finish)}
min={dateToISO(start)}
onChange={(e) => {
setFinish(
new Date(
timeMinusDate(finish) +
new Date(e.target.valueAsNumber).getTime()
)
);
}}
/>
</Col>
<Col xs="6" md="5" lg="3">
<select
className="form-control"
value={getOnlyValidDate(finish).getHours()}
onChange={(e) =>
setFinish(
new Date(
dateMinusTime(finish).getTime() +
e.target.value * 3600000
)
)
}
>
{displayClockOptions()}
</select>
</Col>
</Row>
</div>
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
<span className="label">{t("Grades")}</span>
</Col>
<Col xs="10" sm="11" md="4" lg="3">
<select
className="form-control"
tabIndex={candidates.length + 3}
onChange={(e) => setNumGrades(e.target.value)}
defaultValue="5"
>
<option value="4">4</option>
<option value="5">5</option>
<option value="6">6</option>
<option value="7">7</option>
</select>
</Col>
<Col xs="auto" className="align-self-center pl-0 ">
<HelpButton>
{t(
"You can select here the number of grades for your election"
)}
<br />
<u>{t("For example:")}</u>{" "}
<em>
{" "}
{t("5 = Excellent, Very good, Good, Fair, Passable")}
</em>
</HelpButton>
</Col>
<Col
xs="12"
md="9"
lg="9"
className="offset-xs-0 offset-md-3 offset-lg-3"
>
{grades.map((mention, i) => {
return (
<span
key={i}
className="badge badge-light mr-2 mt-2 "
style={{
backgroundColor: mention.color,
color: "#fff",
opacity: i < numGrades ? 1 : 0.3,
}}
>
{mention.label}
</span>
);
})}
</Col>
</Row>
<hr className="mt-2 mb-2" />
<Row>
<Col xs="12" md="3" lg="3">
<span className="label">{t("Participants")}</span>
</Col>
<Col xs="12" md="9" lg="9">
<ReactMultiEmail
placeholder={t("Add here participants' emails")}
emails={emails}
onChange={setEmails}
validateEmail={(email) => {
return isEmail(email); // return boolean
}}
getLabel={(email, index, removeEmail) => {
return (
<div data-tag key={index}>
{email}
<span
data-tag-handle
onClick={() => removeEmail(index)}
>
×
</span>
</div>
);
}}
/>
<div>
<small className="text-muted">
{t(
"If you list voters' emails, only them will be able to access the election"
)}
</small>
</div>
</Col>
</Row>
<hr className="mt-2 mb-2" />
</CardBody>
</Card>
</Collapse>
<Row className="justify-content-end mt-2">
<Col xs="12" md="3">
{check.ok ? (
<ConfirmModal
title={title}
candidates={candidates}
isTimeLimited={isTimeLimited}
start={start}
finish={finish}
emails={emails}
restrictResult={restrictResult}
grades={grades.slice(0, numGrades)}
className={"btn btn-success float-right btn-block"}
tabIndex={candidates.length + 1}
confirmCallback={handleSubmit}
/>
) : (
<Button
type="button"
className="btn btn-dark float-right btn-block"
onClick={handleSendNotReady}
>
<FontAwesomeIcon icon={faCheck} className="mr-2" />
{t("Confirm")}
</Button>
)}
</Col>
</Row>
</form>
</Container>
);
};
export default CreateElection;

@ -1,101 +0,0 @@
import { Col, Container, Row } from "reactstrap";
import { useTranslation } from "next-i18next";
import Link from "next/link";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import config from "../next-i18next.config.js";
export const getStaticProps = async ({ locale }) => ({
props: {
...(await serverSideTranslations(locale, [], config)),
},
});
const PrivacyPolicy = (props) => {
const { t } = useTranslation();
return (
<Container>
<Row>
<Link href="/" className="d-block ml-auto mr-auto mb-4">
<img src="/logos/logo-line-white.svg" alt="logo" height="128" />
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center">
<h1>{t("Privacy policy")}</h1>
</Col>
</Row>
<Row className="mt-4">
<Col>
<p className="text-center">
Dernière mise à jour de notre politique de confidentialité effectuée
le 27 avril 2020.
</p>
<h4 className="bold mt-5">Introduction</h4>
<p>
Dans le cadre de la mise à disposition de son application web de
vote au jugement majoritaire, accessible sur Internet à ladresse
app.mieuxvoter.fr, ci-après lApplication, lassociation loi 1901 «
Mieux Voter » , dont le siège social est situé au 59 rue saint andré
des arts, à Paris (75006), ci-après lAssociation, est amenée à
collecter et à traiter des informations dont certaines sont
qualifiées de « Données personnelles » . Mieux Voter attache la plus
grande importance au respect de la vie privée, et utilise ces
données uniquement de manière responsable et confidentielle et dans
une finalité précise.
</p>
<h4 className="bold mt-5">Notre politique de confidentialité</h4>
<p>
La présente politique de confidentialité détaille les conditions
dutilisation et de traitement par lAssociation des Données
personnelles (ci-après définies) collectées via lApplication.
LAssociation sengage à respecter les dispositions de la loi
n°78-17 du 6 janvier 1978 relative à linformatique, aux fichiers et
aux libertés modifiée et au Règlement (UE) 2016/679 du Parlement
européen et du Conseil du 27 avril 2016 dit « RGPD » et prendre
toute précaution nécessaire pour préserver la sécurité des Données
personnelles confiées.
</p>
<h4 className="bold mt-5">Responsable de traitement</h4>
<p>
En qualité de responsable de traitement, lAssociation peut traiter
les Données personnelles.
</p>
<h4 className="bold mt-5">
Données personnelles traitées et finalités de traitement
</h4>
<p>
LAssociation recueille sur lApplication les Données personnelles
dans une finalité précise. Ces données sont nécessaires à la
fourniture de notre service. Dans le cadre de la fourniture de ce
service, lAssociation traite uniquement les données personnelles
suivantes (définies comme les « Données personnelles ») strictement
nécessaires à la fourniture du service :
</p>
<ul>
<li> Les emails des personnes invitées à un vote</li>
</ul>
<p>
{" "}
La finalité de traitement de ces données personnelles est de
permettre à lAssociation de fournir le service. Ces données sont
traitées au moment de la création du vote pour envoyer les
invitations et détruites aussitôt les invitations envoyées. Elles ne
sont jamais stockées sur nos serveurs.
</p>
<h4 className="bold mt-5">Sécurité des Données personnelles</h4>
<p>
LAssociation sengage, au titre de son obligation de moyens, à
prendre toutes les précautions utiles et met en œuvre des mesures
techniques et organisationnelles appropriées en la matière pour
garantir un niveau de sécurité adapté et pour protéger les Données
personnelles contre les altérations, destructions et accès non
autorisés.
</p>
</Col>
</Row>
</Container>
);
};
export default PrivacyPolicy;

@ -1,29 +0,0 @@
import dynamic from 'next/dynamic';
import plotly from 'plotly.js/dist/plotly';
import createPlotComponent from 'react-plotly.js/factory';
import React, { Component } from 'react';
//import Plot from 'react-plotly.js';
class BarChart extends Component {
render() {
return (
<div>
<Plot
data={[
{
type: 'bar',
x: ['Taubira', 'Hidalgo', 'Mélenchon'],
y: [29,150,85]
}
]}
layout={ { width: 1000, height: 500, title: 'Nombre de voix par candidat' } }
config={{
displayModeBar: false // this is the line that hides the bar.
}}
/>
</div>
)
};
}
export default BarChart;

@ -1,50 +0,0 @@
import * as React from "react";
import { useState } from "react";
import dynamic from 'next/dynamic';
import HeaderResult from '../../../components/layouts/result/HeaderResult'
import {
Container,
Row,
Col,
Collapse,
Card,
CardHeader,
CardBody,
} from "reactstrap";
const DynamicPlot = dynamic(import('../../../components/plot'), {
ssr: false
})
//import ChartWrapper from "../../../components/ChartWrapper";
import SystemeVote from '../../../components/SystemeVote';
import LoadingScreen from '../../../components/LoadingScreen'
export default function Result() {
const [collapseGraphics, setCollapseGraphics] = useState(false);
// const [loading, setLoading] = React.useState(true);
// React.useEffect(() =>{
// setTimeout(() => setLoading(false), 3000);
// })
return (
<div>
<HeaderResult />
<section className="resultPage">
<h4>Détails des résultats</h4>
<Card className="resultCard">
<CardHeader className="pointer" onClick={() => setCollapseGraphics(!collapseGraphics)}>
<h4 className={"m-0 panel-title " + (collapseGraphics ? "collapsed" : "")}>
Taubira
</h4>
</CardHeader>
<Collapse isOpen={collapseGraphics}>
<CardBody className="pt-5">
<SystemeVote />
</CardBody>
</Collapse>
</Card>
</section>
</div>
)
}

@ -1,271 +0,0 @@
import { useState } from "react";
import Head from "next/head";
import { useRouter } from "next/router";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import { useTranslation } from "next-i18next";
import { Button, Col, Container, Row } from "reactstrap";
import { toast, ToastContainer } from "react-toastify";
import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
import { faCheck } from "@fortawesome/free-solid-svg-icons";
import { getDetails, castBallot, apiErrors } from "@services/api";
import Error from "@components/Error";
import { translateGrades } from "@services/grades";
import config from "../../../next-i18next.config.js";
const shuffle = (array) => array.sort(() => Math.random() - 0.5);
export async function getServerSideProps({ query: { pid, tid }, locale }) {
const [details, translations] = await Promise.all([
getDetails(pid),
serverSideTranslations(locale, [], config),
]);
if (typeof details === "string" || details instanceof String) {
return { props: { err: details, ...translations } };
}
if (!details.candidates || !Array.isArray(details.candidates)) {
return { props: { err: "Unknown error", ...translations } };
}
shuffle(details.candidates);
return {
props: {
...translations,
invitationOnly: details.on_invitation_only,
restrictResults: details.restrict_results,
candidates: details.candidates.map((name, i) => ({ id: i, label: name })),
title: details.title,
numGrades: details.num_grades,
pid: pid,
token: tid || null,
},
};
}
const VoteBallot = ({ candidates, title, numGrades, pid, err, token }) => {
const { t } = useTranslation();
if (err) {
return <Error value={apiErrors(err, t)}></Error>;
}
const [judgments, setJudgments] = useState([]);
const colSizeCandidateLg = 4;
const colSizeCandidateMd = 6;
const colSizeCandidateXs = 12;
const colSizeGradeLg = Math.floor((12 - colSizeCandidateLg) / numGrades);
const colSizeGradeMd = Math.floor((12 - colSizeCandidateMd) / numGrades);
const colSizeGradeXs = Math.floor((12 - colSizeCandidateXs) / numGrades);
const router = useRouter();
const allGrades = translateGrades(t);
const grades = allGrades.filter(
(grade) => grade.value >= allGrades.length - numGrades
);
const handleGradeClick = (event) => {
let data = {
id: parseInt(event.currentTarget.getAttribute("data-id")),
value: parseInt(event.currentTarget.value),
};
//remove candidate
const newJudgments = judgments.filter(
(judgment) => judgment.id !== data.id
);
newJudgments.push(data);
setJudgments(newJudgments);
};
const handleSubmitWithoutAllRate = () => {
toast.error(t("You have to judge every candidate/proposal!"), {
position: toast.POSITION.TOP_CENTER,
});
};
const handleSubmit = (event) => {
event.preventDefault();
const gradesById = {};
judgments.forEach((c) => {
gradesById[c.id] = c.value;
});
const gradesByCandidate = [];
Object.keys(gradesById).forEach((id) => {
gradesByCandidate.push(gradesById[id]);
});
castBallot(gradesByCandidate, pid, token, () => {
router.push(`/vote/${pid}/confirm`);
});
};
return (
<Container>
<Head>
<title>{title}</title>
<title>{title}</title>
<meta key="og:title" property="og:title" content={title} />
<meta
property="og:description"
key="og:description"
content={t("common.application")}
/>
</Head>
<ToastContainer />
<form onSubmit={handleSubmit} autoComplete="off">
<Row>
<Col>
<h3>{title}</h3>
</Col>
</Row>
<Row className="cardVote d-none d-lg-flex">
<Col
xs={colSizeCandidateXs}
md={colSizeCandidateMd}
lg={colSizeCandidateLg}
>
<h5>&nbsp;</h5>
</Col>
{grades.map((grade, gradeId) => {
return gradeId < numGrades ? (
<Col
xs={colSizeGradeXs}
md={colSizeGradeMd}
lg={colSizeGradeLg}
key={gradeId}
className="text-center p-0"
style={{ lineHeight: 2 }}
>
<small
className="nowrap bold badge"
style={{ backgroundColor: grade.color, color: "#fff" }}
>
{grade.label}
</small>
</Col>
) : null;
})}
</Row>
{candidates.map((candidate, candidateId) => {
return (
<Row key={candidateId} className="cardVote">
<Col
xs={colSizeCandidateXs}
md={colSizeCandidateMd}
lg={colSizeCandidateLg}
>
<h5 className="m-0">{candidate.label}</h5>
<hr className="d-lg-none" />
</Col>
{grades.map((grade, gradeId) => {
console.assert(gradeId < numGrades);
const gradeValue = grade.value;
return (
<Col
xs={colSizeGradeXs}
md={colSizeGradeMd}
lg={colSizeGradeLg}
key={gradeId}
className="text-lg-center"
>
<label
htmlFor={
"candidateGrade" + candidateId + "-" + gradeValue
}
className="check"
>
<small
className="nowrap d-lg-none ml-2 bold badge"
style={
judgments.find((judgment) => {
return (
JSON.stringify(judgment) ===
JSON.stringify({
id: candidate.id,
value: gradeValue,
})
);
})
? { backgroundColor: grade.color, color: "#fff" }
: {
backgroundColor: "transparent",
color: "#000",
}
}
>
{grade.label}
</small>
<input
type="radio"
name={"candidate" + candidateId}
id={"candidateGrade" + candidateId + "-" + gradeValue}
data-index={candidateId}
data-id={candidate.id}
value={grade.value}
onClick={handleGradeClick}
defaultChecked={judgments.find((element) => {
return (
JSON.stringify(element) ===
JSON.stringify({
id: candidate.id,
value: gradeValue,
})
);
})}
/>
<span
className="checkmark"
style={
judgments.find(function (judgment) {
return (
JSON.stringify(judgment) ===
JSON.stringify({
id: candidate.id,
value: gradeValue,
})
);
})
? { backgroundColor: grade.color, color: "#fff" }
: {
backgroundColor: "transparent",
color: "#000",
}
}
/>
</label>
</Col>
);
})}
</Row>
);
})}
<Row>
<Col className="text-center">
{judgments.length !== candidates.length ? (
<Button
type="button"
onClick={handleSubmitWithoutAllRate}
className="btn btn-dark "
>
<FontAwesomeIcon icon={faCheck} className="mr-2" />
{t("Submit my vote")}
</Button>
) : (
<Button type="submit" className="btn btn-success ">
<FontAwesomeIcon icon={faCheck} className="mr-2" />
{t("Submit my vote")}
</Button>
)}
</Col>
</Row>
</form>
</Container>
);
};
export default VoteBallot;

@ -1,79 +0,0 @@
import Head from "next/head";
import { Col, Container, Row } from "reactstrap";
import Link from "next/link";
import { useTranslation } from "next-i18next";
import { serverSideTranslations } from "next-i18next/serverSideTranslations";
import Paypal from "@components/banner/Paypal";
import Gform from "@components/banner/Gform";
import Error from "@components/Error";
import { getDetails, apiErrors } from "@services/api";
import config from "../../../next-i18next.config.js";
export async function getServerSideProps({ query: { pid }, locale }) {
const [details, translations] = await Promise.all([
getDetails(pid),
serverSideTranslations(locale, [], config),
]);
if (typeof details === "string" || details instanceof String) {
return { props: { err: res.slice(1, -1), ...translations } };
}
if (!details.candidates || !Array.isArray(details.candidates)) {
return { props: { err: "Unknown error", ...translations } };
}
return {
props: {
...translations,
invitationOnly: details.on_invitation_only,
restrictResults: details.restrict_results,
candidates: details.candidates.map((name, i) => ({ id: i, label: name })),
title: details.title,
numGrades: details.num_grades,
pid: pid,
},
};
}
const VoteSuccess = ({ title, invitationOnly, pid, err }) => {
const { t } = useTranslation();
if (err && err !== "") {
return <Error value={apiErrors(err, t)} />;
}
return (
<Container>
<Head>
<title>{t("resource.voteSuccess")}</title>
<link rel="icon" href="/favicon.ico" />
<meta key="og:title" property="og:title" content={title} />
<meta
property="og:description"
key="og:description"
content={t("common.application")}
/>
</Head>
<Row>
<Link href="/">
<a className="d-block ml-auto mr-auto mb-4">
<img src="/logos/logo-line-white.svg" alt="logo" height="128" />
</a>
</Link>
</Row>
<Row className="mt-4">
<Col className="text-center offset-lg-3" lg="6">
<h2>{t("resource.voteSuccess")}</h2>
<p>{t("resource.thanks")}</p>
<div className="mt-3">
<Gform className="btn btn-secondary" />
</div>
<div className="mt-5">
<Paypal btnColor="btn-success" />
</div>
</Col>
</Row>
</Container>
);
};
export default VoteSuccess;

@ -1,6 +0,0 @@
<svg width="207" height="206" viewBox="0 0 207 206" fill="none" xmlns="http://www.w3.org/2000/svg">
<circle cx="103.5" cy="63" r="63" fill="#3A9918"/>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 165 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M19 11H20V13H19V11ZM5 12L4.29289 12.7071L3.58579 12L4.29289 11.2929L5 12ZM11.2929 4.29289L12 3.58579L13.4142 5L12.7071 5.70711L11.2929 4.29289ZM12.7071 18.2929L13.4142 19L12 20.4142L11.2929 19.7071L12.7071 18.2929ZM19 13H5V11H19V13ZM12.7071 5.70711L5.70711 12.7071L4.29289 11.2929L11.2929 4.29289L12.7071 5.70711ZM5.70711 11.2929L12.7071 18.2929L11.2929 19.7071L4.29289 12.7071L5.70711 11.2929Z" fill="#0A004C"/>
</svg>

Before

Width:  |  Height:  |  Size: 525 B

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M5 11H4V13H5V11ZM19 12L19.7071 12.7071L20.4142 12L19.7071 11.2929L19 12ZM12.7071 4.29289L12 3.58579L10.5858 5L11.2929 5.70711L12.7071 4.29289ZM11.2929 18.2929L10.5858 19L12 20.4142L12.7071 19.7071L11.2929 18.2929ZM5 13H19V11H5V13ZM11.2929 5.70711L18.2929 12.7071L19.7071 11.2929L12.7071 4.29289L11.2929 5.70711ZM18.2929 11.2929L11.2929 18.2929L12.7071 19.7071L19.7071 12.7071L18.2929 11.2929Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 521 B

@ -1,3 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M8.3333 2.5V4.16667H4.16664V15.8333H15.8333V11.6667H17.5L17.5 17.5C17.5 17.5 4.33801 17.5 2.49997 17.5C2.49997 17.5 2.42533 2.5 2.49997 2.5H8.3333ZM14.655 4.16667H10.8333V2.5H17.5V9.16667H15.8333V5.345L9.99997 11.1783L8.82164 10L14.655 4.16667Z" fill="#8F88BA"/>
</svg>

Before

Width:  |  Height:  |  Size: 375 B

@ -1,3 +0,0 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.5 15.8332H17.5V17.4998H2.5V15.8332ZM10.8333 10.9765L15.8925 5.9165L17.0708 7.09484L10 14.1665L2.92917 7.09567L4.1075 5.9165L9.16667 10.9748V1.6665H10.8333V10.9765Z" fill="#8F88BA"/>
</svg>

Before

Width:  |  Height:  |  Size: 297 B

@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="white" fill-opacity="0.16"/>
<path d="M11.9998 15.333C14.4412 15.333 16.5765 16.383 17.7378 17.9497L16.5098 18.5303C15.5645 17.4103 13.8978 16.6663 11.9998 16.6663C10.1018 16.6663 8.43518 17.4103 7.48985 18.5303L6.26251 17.949C7.42385 16.3823 9.55851 15.333 11.9998 15.333ZM11.9998 5.33301C12.8839 5.33301 13.7317 5.6842 14.3569 6.30932C14.982 6.93444 15.3332 7.78229 15.3332 8.66634V10.6663C15.3331 11.5253 15.0015 12.3511 14.4074 12.9715C13.8133 13.5919 13.0027 13.9591 12.1445 13.9963L11.9998 13.9997C11.1158 13.9997 10.2679 13.6485 9.64282 13.0234C9.0177 12.3982 8.66651 11.5504 8.66651 10.6663V8.66634C8.66656 7.80737 8.99821 6.98157 9.59229 6.36116C10.1864 5.74075 10.997 5.37362 11.8552 5.33634L11.9998 5.33301ZM11.9998 6.66634C11.4897 6.66631 10.9988 6.86122 10.6277 7.2112C10.2565 7.56117 10.0331 8.03975 10.0032 8.54901L9.99985 8.66634V10.6663C9.99934 11.1869 10.2019 11.6872 10.5644 12.0609C10.9269 12.4345 11.4208 12.6521 11.9412 12.6674C12.4615 12.6827 12.9674 12.4945 13.3512 12.1427C13.735 11.791 13.9665 11.3034 13.9965 10.7837L13.9998 10.6663V8.66634C13.9998 8.13591 13.7891 7.6272 13.4141 7.25213C13.039 6.87705 12.5303 6.66634 11.9998 6.66634Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -1,4 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="white" fill-opacity="0.16"/>
<path d="M11.9998 15.333C14.4412 15.333 16.5765 16.383 17.7378 17.9497L16.5098 18.5303C15.5645 17.4103 13.8978 16.6663 11.9998 16.6663C10.1018 16.6663 8.43518 17.4103 7.48985 18.5303L6.26251 17.949C7.42385 16.3823 9.55851 15.333 11.9998 15.333ZM11.9998 5.33301C12.8839 5.33301 13.7317 5.6842 14.3569 6.30932C14.982 6.93444 15.3332 7.78229 15.3332 8.66634V10.6663C15.3331 11.5253 15.0015 12.3511 14.4074 12.9715C13.8133 13.5919 13.0027 13.9591 12.1445 13.9963L11.9998 13.9997C11.1158 13.9997 10.2679 13.6485 9.64282 13.0234C9.0177 12.3982 8.66651 11.5504 8.66651 10.6663V8.66634C8.66656 7.80737 8.99821 6.98157 9.59229 6.36116C10.1864 5.74075 10.997 5.37362 11.8552 5.33634L11.9998 5.33301ZM11.9998 6.66634C11.4897 6.66631 10.9988 6.86122 10.6277 7.2112C10.2565 7.56117 10.0331 8.03975 10.0032 8.54901L9.99985 8.66634V10.6663C9.99934 11.1869 10.2019 11.6872 10.5644 12.0609C10.9269 12.4345 11.4208 12.6521 11.9412 12.6674C12.4615 12.6827 12.9674 12.4945 13.3512 12.1427C13.735 11.791 13.9665 11.3034 13.9965 10.7837L13.9998 10.6663V8.66634C13.9998 8.13591 13.7891 7.6272 13.4141 7.25213C13.039 6.87705 12.5303 6.66634 11.9998 6.66634Z" fill="#2400FD"/>
</svg>

Before

Width:  |  Height:  |  Size: 1.3 KiB

@ -1,42 +0,0 @@
<svg width="1440" height="900" viewBox="0 0 1440 900" fill="none" xmlns="http://www.w3.org/2000/svg">
<g opacity="0.64" clip-path="url(#clip0_78_1977)">
<rect width="1440" height="1001" fill="#0A004C"/>
<g opacity="0.08" filter="url(#filter0_f_78_1977)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1440 450.639V705.259L507.34 1637.92L0.000501283 1130.58L0.000488281 875.959L507.34 1383.3L1440 450.639Z" fill="white"/>
</g>
<g opacity="0.08" filter="url(#filter1_f_78_1977)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1440 -452V-197.38L507.34 735.281L0.000501283 227.941L0.000488281 -26.6793L507.34 480.661L1440 -452Z" fill="white"/>
</g>
<g opacity="0.08" filter="url(#filter2_f_78_1977)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1440 8.13684V262.757L507.34 1195.42L-7.66891e-07 688.075L-1.37685e-05 433.455L507.34 940.796L1440 8.13684Z" fill="white"/>
</g>
<g opacity="0.08" filter="url(#filter3_f_78_1977)">
<path fill-rule="evenodd" clip-rule="evenodd" d="M1440 -925V-670.38L507.34 262.279L-7.66821e-07 -245.062L-1.37685e-05 -499.682L507.34 7.65894L1440 -925Z" fill="white"/>
</g>
</g>
<defs>
<filter id="filter0_f_78_1977" x="-87.9995" y="362.639" width="1616" height="1363.28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="44" result="effect1_foregroundBlur_78_1977"/>
</filter>
<filter id="filter1_f_78_1977" x="-152" y="-604" width="1744" height="1491.28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="76" result="effect1_foregroundBlur_78_1977"/>
</filter>
<filter id="filter2_f_78_1977" x="-128" y="-119.863" width="1696" height="1443.28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="64" result="effect1_foregroundBlur_78_1977"/>
</filter>
<filter id="filter3_f_78_1977" x="-152" y="-1077" width="1744" height="1491.28" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feBlend mode="normal" in="SourceGraphic" in2="BackgroundImageFix" result="shape"/>
<feGaussianBlur stdDeviation="76" result="effect1_foregroundBlur_78_1977"/>
</filter>
<clipPath id="clip0_78_1977">
<rect width="1440" height="1001" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

@ -1,66 +0,0 @@
<svg width="290" height="611" viewBox="0 0 290 611" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_285_8605)">
<path d="M107.149 363.653L139.096 552.5H79.098L71.6523 363.653" fill="#FF3E37"/>
<path d="M107.149 363.653L139.096 552.5H79.098L71.6523 363.653" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M192.947 585.433C188.359 582.313 182.991 580.753 177.71 578.933C162.732 573.733 149.139 564.46 138.923 552.327L79.0117 552.24V593.667C79.0117 593.927 79.0117 594.273 79.0117 594.533C79.0117 603.373 86.1976 610.567 95.0285 610.567C100.916 610.567 105.677 606.753 109.054 602.767C111.738 600.167 116.153 600.34 119.616 601.9C123.079 603.373 125.937 605.973 129.226 607.707C133.209 609.873 136.586 610.567 142.3 610.567H187.58C198.575 610.567 204.635 597.48 197.276 589.247C195.977 587.86 194.592 586.56 192.947 585.433Z" fill="#D3D715" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M138.923 552.327H132.776L118.837 570.873C117.106 573.213 117.539 576.593 119.876 578.327C120.829 579.02 121.954 579.367 123.08 579.367C124.725 579.367 126.283 578.673 127.322 577.2L142.819 556.573C141.434 555.273 140.135 553.8 138.923 552.327Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M142.386 575.033L150.784 563.94C148.014 561.687 145.417 559.26 142.906 556.747L133.902 568.707C132.17 571.047 132.603 574.427 134.941 576.16C135.893 576.853 137.019 577.2 138.144 577.2C139.703 577.2 141.348 576.42 142.386 575.033Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M149.226 574.86C150.178 575.553 151.304 575.9 152.429 575.9C154.074 575.9 155.632 575.207 156.671 573.733L159.355 570.093C156.325 568.187 153.468 566.107 150.698 563.853L148.1 567.32C146.369 569.747 146.888 573.04 149.226 574.86Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M200.133 594.707C196.497 597.047 192.168 598.347 187.58 598.347H142.3H141.694C134.508 598.347 129.66 597.22 124.205 594.273C122.3 593.233 120.742 592.193 119.27 591.153L119.184 591.067C110.093 584.827 99.3575 581.533 88.2756 581.533H80.0508" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M96.5003 552.24C96.8466 553.54 97.0198 554.927 97.0198 556.313C97.0198 565.673 89.401 573.3 80.0506 573.3C79.7043 573.3 79.358 573.3 79.0117 573.3" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M80.4834 592.28C83.1673 592.367 85.7646 591.5 88.2753 590.72C91.3056 589.767 94.6821 589.073 97.8854 589.68C101.089 590.287 104.032 592.887 103.513 595.573C103.253 596.96 102.041 598.173 100.569 598.953C99.0975 599.733 97.366 599.993 95.6344 600.167C92.3445 600.513 88.968 600.167 85.7646 599.387C84.1196 598.953 82.3015 598.347 80.8297 598.953" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M179.009 579.367C170.524 585.433 153.468 595.053 143.599 598.26" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M130.525 502.06H77.1064L79.0977 552.5H139.096L130.525 502.06Z" fill="white" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M88.9678 512.373L90.1798 542.187" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M119.703 512.373L124.725 542.187" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M107.669 542.187L104.639 512.373" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M18.3213 363.653L-13.5391 552.5H46.3723L53.818 363.653" fill="#FF3E37"/>
<path d="M18.3213 363.653L-13.5391 552.5H46.3723L53.818 363.653" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-67.4766 585.433C-62.888 582.313 -57.5203 580.753 -52.239 578.933C-37.2612 573.733 -23.6686 564.46 -13.4525 552.327L46.4589 552.24V593.667C46.4589 593.927 46.4589 594.273 46.4589 594.533C46.4589 603.373 39.273 610.567 30.4422 610.567C24.5549 610.567 19.7932 606.753 16.4166 602.767C13.7328 600.167 9.31733 600.34 5.85424 601.9C2.39115 603.373 -0.465904 605.973 -3.75584 607.707C-7.73838 609.873 -11.1149 610.567 -16.829 610.567H-62.0223C-73.0176 610.567 -79.078 597.48 -71.7189 589.247C-70.5068 587.86 -69.035 586.56 -67.4766 585.433Z" fill="#D3D715" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-13.3657 552.327H-7.21877L6.72017 570.873C8.45171 573.213 8.01882 576.593 5.68124 578.327C4.72889 579.02 3.60339 579.367 2.47788 579.367C0.832918 579.367 -0.725473 578.673 -1.7644 577.2L-17.2617 556.573C-15.9631 555.273 -14.6644 553.8 -13.3657 552.327Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-74.5762 594.707C-70.9399 597.047 -66.6111 598.347 -62.0225 598.347H-16.7426H-16.1366C-8.95068 598.347 -4.10236 597.22 1.352 594.273C3.2567 593.233 4.8151 592.193 6.28691 591.153L6.37348 591.067C15.4641 584.827 26.1997 581.533 37.2815 581.533H45.5064" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M28.9706 552.24C28.6243 553.54 28.4512 554.927 28.4512 556.313C28.4512 565.673 36.07 573.3 45.4203 573.3C45.7666 573.3 46.1129 573.3 46.4592 573.3" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M44.9869 592.28C42.303 592.367 39.7057 591.5 37.1949 590.72C34.1647 589.767 30.7882 589.073 27.5848 589.68C24.3815 590.287 21.4379 592.887 21.9573 595.573C22.2171 596.96 23.4291 598.173 24.901 598.953C26.3728 599.733 28.1043 599.993 29.8359 600.167C33.1258 600.513 36.5023 600.167 39.7057 599.387C41.3506 598.953 43.1688 598.347 44.6406 598.953" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-5.0545 502.06H48.3636L46.3723 552.5H-13.5391L-5.0545 502.06Z" fill="white" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M36.5025 512.373L35.377 542.187" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M5.85448 512.373L0.833008 542.187" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M17.8887 542.187L20.8323 512.373" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M238.977 116.938C254.139 106.488 252.757 78.1388 235.891 53.6187C219.025 29.0987 193.061 17.693 177.9 28.1434C162.738 38.5939 164.12 66.9431 180.986 91.4632C197.852 115.983 223.816 127.389 238.977 116.938Z" fill="black"/>
<path d="M171.739 124.576L160.972 131.997L180.807 160.834L191.574 153.413L171.739 124.576Z" fill="black" stroke="black" stroke-width="1.7" stroke-miterlimit="9.9996" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M208.878 73.1466C201.173 61.8799 185.762 59.0199 174.507 66.8199C172.602 68.1199 170.958 69.6799 169.572 71.3266C171.823 78.5199 175.373 85.8866 180.221 92.9066C185.07 99.9266 190.697 105.907 196.584 110.587C198.662 109.893 200.653 108.853 202.558 107.553C213.813 99.7532 216.584 84.4132 208.878 73.1466Z" fill="white" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M182.299 91.4332C169.226 72.3666 164.637 49.9199 170.784 36.3999L146.369 90.0466L122.301 106.6L146.629 142.047L171.303 124.973L227.059 120.207C212.861 119.773 194.679 109.287 182.299 91.4332Z" fill="white" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M182.299 91.4332C169.226 72.3665 165.07 49.1399 171.217 35.6199L146.456 90.0465L122.387 106.6L125.677 111.367C125.158 111.627 124.638 111.973 124.119 112.32C116.933 117.26 115.115 127.053 120.05 134.247C124.985 141.44 134.768 143.26 141.954 138.32C142.473 137.973 142.993 137.54 143.426 137.193L146.802 142.047L171.477 124.973L227.232 120.207C212.861 119.773 194.679 109.287 182.299 91.4332Z" fill="#D3D715" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M207.233 192.92V193.093L186.194 127.487L154.421 140.747L150.871 129.653C149.659 125.927 145.676 123.847 141.954 125.06C138.231 126.273 136.153 130.26 137.365 133.987L141.261 146.207H141.174L150.611 176.8L117.712 191.62L128.621 250.12L177.796 230.36C192.947 224.38 208.964 219.18 208.705 202.367C208.791 198.987 208.185 195.867 207.233 192.92Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M179.269 169C175.892 170.82 171.65 169.52 169.832 166.14L154.94 134.16L167.321 127.573L182.126 159.553C183.944 162.933 182.645 167.18 179.269 169Z" fill="#D3D715" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M161.953 144.733L193.554 130C196.93 128.44 198.316 124.453 196.757 121.073L196.411 120.293C194.853 116.913 190.87 115.527 187.493 117.087L155.893 131.82C152.516 133.38 151.131 137.367 152.689 140.747L153.036 141.527C154.681 144.907 158.663 146.293 161.953 144.733Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M175.892 153.833L200.567 142.307C204.117 140.66 205.675 136.413 204.03 132.86C202.385 129.307 198.143 127.747 194.593 129.393L169.919 140.92C166.369 142.567 164.811 146.813 166.456 150.367C168.187 153.92 172.343 155.48 175.892 153.833Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M188.706 164.233L208.446 154.527C211.995 152.88 213.554 148.633 211.909 145.08C210.264 141.527 206.021 139.967 202.472 141.613L182.732 151.32C179.182 152.967 177.624 157.213 179.269 160.767C181.001 164.32 185.156 165.88 188.706 164.233Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M130.179 185.207L115.114 191.447C109.14 193.873 102.734 195.173 96.3268 195.173H57.8H57.3671H18.8403H12.0872H-4.01611L-15.1846 195.26V253.847H-4.01611V337.307H57.4537H57.8866H121.521L120.915 254.28L143.252 243.793L130.179 185.207Z" fill="#3A9918" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M28.0176 195.173L61.8693 234.78L95.721 195.173H28.0176Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-31.8065 456.387C-8.51728 456.387 -8.51728 465.747 14.6854 465.747C37.9747 465.747 37.9747 456.387 61.1773 456.387C84.4666 456.387 84.4666 465.747 107.669 465.747C130.959 465.747 130.959 456.387 154.161 456.387L155.546 456.3L121.089 337.22H0.919628L-33.5381 456.3L-31.8065 456.387Z" fill="white" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M-31.8065 456.387C-8.51728 456.387 -8.51728 465.747 14.6854 465.747C37.9747 465.747 37.9747 456.387 61.1773 456.387C84.4666 456.387 84.4666 465.747 107.669 465.747C130.959 465.747 130.959 456.387 154.161 456.387L155.546 456.3L121.089 337.22H0.919629L-33.5381 456.3L-31.8065 456.387Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24.6414 331.153C27.2387 330.113 29.0568 327.6 29.0568 324.653C29.0568 320.753 25.94 317.633 22.0441 317.633H20.1394H7.58568H-3.92909V304.72H-13.366C-13.366 304.72 -19.513 304.807 -20.2922 304.807C-34.2311 304.807 -45.4861 293.54 -45.4861 279.587C-45.4861 265.633 -34.8371 255.493 -20.2922 254.367C-13.366 253.847 -13.366 253.847 -13.366 253.847V195.26C-14.2318 195.26 -15.1841 195.26 -16.0499 195.173C-63.7539 193.353 -96.1338 231.053 -96.1338 275.34C-96.1338 319.627 -60.2908 355.507 -16.0499 355.507C-15.1841 355.507 -14.2318 355.507 -13.366 355.42V355.507H7.4991H13.04C16.936 355.507 20.0528 352.04 20.0528 348.227C20.0528 346.927 19.7065 345.713 19.0139 344.673H21.9575C25.8535 344.673 28.9702 341.553 28.9702 337.653C29.0568 334.707 27.2387 332.193 24.6414 331.153Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M24.6413 331.153H5.24805" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M20.0531 344.673H0.573242" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M81.6962 169.433L77.3673 171.427C75.5492 172.293 73.3848 171.513 72.519 169.693L72.3459 169.26C71.4801 167.44 72.2593 165.273 74.0774 164.407L78.4063 162.413C80.2244 161.547 82.3888 162.327 83.2546 164.147L83.4277 164.58C84.2935 166.4 83.5143 168.653 81.6962 169.433Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M82.9947 176.54L73.9041 156.867C71.9128 152.62 66.8914 150.8 62.6491 152.793L48.8833 159.207C44.641 161.2 42.8229 166.227 44.8142 170.387L53.9914 190.06C55.6363 193.613 60.831 195.173 60.831 195.173H77.2806V188.5L78.9256 187.72C83.1679 185.813 84.986 180.787 82.9947 176.54Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M65.8522 147.593C63.6878 142.913 58.0603 140.92 53.2985 143.173C48.5368 145.427 46.4589 150.973 48.6233 155.653C48.9696 156.52 49.4891 157.213 50.0951 157.907L48.0173 158.86C43.8616 158.253 39.5327 158.773 35.4636 160.68C24.3817 165.88 19.5334 179.053 24.728 190.233C29.9227 201.413 43.0824 206.18 54.2509 200.98C65.3327 195.78 70.1811 182.607 64.9864 171.427C63.6012 168.567 61.6965 166.053 59.4455 164.06C62.3025 161.547 64.467 158.687 65.679 155.74C66.4582 154.267 66.8046 152.533 66.718 150.887C66.718 150.8 66.718 150.713 66.718 150.627C66.6314 149.587 66.3717 148.547 65.8522 147.593Z" fill="black" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M76.2411 161.893C75.2022 160.68 73.3841 160.247 71.9122 160.94C70.3538 161.633 69.5746 163.28 69.8344 164.927" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M80.6572 176.713C81.3498 176.713 81.9559 176.453 82.3888 176.02C82.3022 175.76 82.2156 175.5 82.129 175.327L80.3975 171.687C79.0988 171.86 78.1465 172.9 78.1465 174.2C78.1465 175.587 79.272 176.713 80.6572 176.713Z" fill="black" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M85.2451 149.5L99.1841 121.247" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M97.1064 176.107L135.547 170.56" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M92.2578 163.453L116.326 146.12" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M75.1155 141.007L74.4229 128.787" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M237.621 38.5666L251.56 10.3132" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M249.482 65.1734L287.923 59.6267" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M244.634 52.5201L268.702 35.1868" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M227.491 30.0733L226.799 17.8533" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M95.7212 195.173H77.2803L87.2367 205.14L95.7212 195.173Z" fill="black" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path opacity="0.16" d="M17.7155 246.827H50.5282V264.507C50.5282 273.607 43.1692 280.973 34.0786 280.973C24.988 280.973 17.6289 273.607 17.6289 264.507L17.7155 246.827Z" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
</g>
<defs>
<clipPath id="clip0_285_8605">
<rect width="387" height="611" fill="white" transform="translate(-97)"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 17 KiB

@ -1,20 +0,0 @@
<svg width="243" height="440" viewBox="0 0 243 440" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61.3005 136.659L18.3594 56.0627L92.9358 34.4519L106.523 63.3707" fill="white"/>
<path d="M61.3005 136.659L18.3594 56.0627L92.9358 34.4519L106.523 63.3707" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M149.776 63.5795H159.733C166.06 63.5795 171.143 58.4639 171.143 52.0955V29.4408C171.143 23.0724 166.06 17.9568 159.733 17.9568H149.776C143.449 17.9568 138.366 23.0724 138.366 29.4408V52.1999C138.366 58.4639 143.552 63.5795 149.776 63.5795Z" fill="#FF3E37" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M165.852 10.3355C166.89 10.3355 167.927 10.4399 168.964 10.5443C170.727 4.59354 176.951 1.04395 184.211 1.04395C192.717 1.04395 199.666 7.20354 199.666 14.7203C199.666 19.6271 196.762 23.9075 192.405 26.3087C196.243 32.3639 196.866 38.5235 194.895 45.3095C189.397 64.4146 166.06 62.431 166.06 62.431C157.14 62.431 150.709 52.8263 150.709 41.6555C150.709 30.4847 141.063 22.4459 141.063 22.4459C141.063 22.4459 148.116 10.3355 165.852 10.3355Z" fill="black" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M53.5209 170.589C37.1376 170.589 23.8563 157.455 23.8563 141.253C23.8563 125.051 37.1376 111.917 53.5209 111.917C69.9042 111.917 83.1855 125.051 83.1855 141.253C83.1855 157.455 69.9042 170.589 53.5209 170.589Z" fill="#8F88BA" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M38.0658 67.3377L90.7568 51.991" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M42.8376 78.1954L95.4248 62.8486" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M47.5043 89.0528L100.195 73.7061" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M52.2761 99.9106L104.863 84.6682" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M103.1 182.491C99.8849 192.827 92.728 201.492 83.0818 206.19C78.518 208.382 73.6431 209.635 69.3905 208.173C57.0475 203.893 50.513 190.634 54.7656 178.524L54.4544 179.568L80.2813 80.7011C82.9781 70.4699 94.0764 63.0575 106.419 63.3707C135.773 64.1015 188.464 63.0575 219.995 62.9531C242.711 62.8487 250.801 69.6347 252.357 77.6735L274.761 177.48C275.902 182.595 276.109 187.815 275.176 192.931C273.309 202.745 263.351 216.943 246.03 211.41C245.096 211.097 244.059 210.679 243.126 210.261C239.08 208.487 235.45 205.772 232.338 202.536L213.772 183.431L212.216 198.569L106.419 198.464V171.738L103.1 182.491Z" fill="#A0CF1C" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M37.6514 445.161L106.523 198.673H142.204H174.772H212.216L285.963 469.695H192.302L158.488 286.682L124.674 469.695L37.6514 445.161Z" fill="#F2F0FF" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M181.411 434.616H285.963V484.415H181.411V434.616Z" fill="#F2F0FF" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M33.5025 434.616H138.055V484.415H33.5025V434.616Z" fill="#F2F0FF" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M213.565 185.31L221.033 126.846" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M106.523 197.629V122.356" stroke="black" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M203.607 227.487H168.03V254.005C168.03 262.774 176.224 269.769 186.389 269.769C196.761 269.769 205.163 262.357 204.748 253.378L203.607 227.487Z" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M147.908 227.487H112.331V254.005C112.331 262.774 120.525 269.769 130.69 269.769C141.062 269.769 149.464 262.357 149.049 253.378L147.908 227.487Z" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round"/>
<path d="M178.299 301.507L202.674 419.165" stroke="#C3BFD8" stroke-width="1.7" stroke-miterlimit="10" stroke-linecap="round" stroke-linejoin="round" stroke-dasharray="12 12"/>
</svg>

Before

Width:  |  Height:  |  Size: 4.5 KiB

@ -1,3 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10.5789H20M16 3V6.78947M8 3V6.78947M20 5.84211V21H4V5.84211H20Z" stroke="#2400FD" stroke-width="2" stroke-linecap="square"/>
</svg>

Before

Width:  |  Height:  |  Size: 240 B

@ -1,6 +0,0 @@
<svg width="662" height="1052" viewBox="0 0 662 1052" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M809 384.842V527.889L285.026 1051.86L0.000250641 766.836L0.000244141 623.789L285.026 908.816L809 384.842Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M809 -120.337V22.7101L285.026 546.684L6.50083e-06 261.658L0 118.611L285.026 403.637L809 -120.337Z" fill="white"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M809 136.241V279.288L285.027 803.261L6.50082e-06 518.234L0 375.187L285.027 660.214L809 136.241Z" fill="#0A004C"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M809 -388V-244.953L285.027 279.02L6.50082e-06 -6.00677L0 -149.054L285.027 135.973L809 -388Z" fill="#0A004C"/>
</svg>

Before

Width:  |  Height:  |  Size: 765 B

@ -1,4 +0,0 @@
<svg width="117" height="48" viewBox="0 0 117 48" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M34.0104 29.3035L22.6967 17.9898M33.6569 18.3434L22.3431 29.6571" stroke="white" stroke-width="2" stroke-linecap="square"/>
<path d="M49.088 29V17.8H56.32V19.448H51.136V22.584H55.328V24.2H51.136V29H49.088ZM60.7866 29.192C59.9866 29.192 59.2773 29.0213 58.6586 28.68C58.04 28.3387 57.5546 27.8587 57.2026 27.24C56.8506 26.6213 56.6746 25.9067 56.6746 25.096C56.6746 24.2747 56.8453 23.544 57.1866 22.904C57.5386 22.264 58.0186 21.768 58.6266 21.416C59.2453 21.0533 59.9706 20.872 60.8026 20.872C61.5813 20.872 62.2693 21.0427 62.8666 21.384C63.464 21.7253 63.928 22.1947 64.2586 22.792C64.6 23.3787 64.7706 24.0347 64.7706 24.76C64.7706 24.8773 64.7653 25 64.7546 25.128C64.7546 25.256 64.7493 25.3893 64.7386 25.528H58.7066C58.7493 26.1467 58.9626 26.632 59.3466 26.984C59.7413 27.336 60.216 27.512 60.7706 27.512C61.1866 27.512 61.5333 27.4213 61.8106 27.24C62.0986 27.048 62.312 26.8027 62.4506 26.504H64.5306C64.3813 27.0053 64.1306 27.464 63.7786 27.88C63.4373 28.2853 63.0106 28.6053 62.4986 28.84C61.9973 29.0747 61.4266 29.192 60.7866 29.192ZM60.8026 22.536C60.3013 22.536 59.8586 22.68 59.4746 22.968C59.0906 23.2453 58.8453 23.672 58.7386 24.248H62.6906C62.6586 23.7253 62.4666 23.3093 62.1146 23C61.7626 22.6907 61.3253 22.536 60.8026 22.536ZM65.9931 29V21.064H67.8171L68.0091 22.552C68.2971 22.04 68.6865 21.6347 69.1771 21.336C69.6785 21.0267 70.2651 20.872 70.9371 20.872V23.032H70.3611C69.9131 23.032 69.5131 23.1013 69.1611 23.24C68.8091 23.3787 68.5318 23.6187 68.3291 23.96C68.1371 24.3013 68.0411 24.776 68.0411 25.384V29H65.9931ZM71.8369 29V21.064H73.6449L73.8209 22.136C74.0769 21.752 74.4129 21.448 74.8289 21.224C75.2555 20.9893 75.7462 20.872 76.3009 20.872C77.5275 20.872 78.3969 21.3467 78.9089 22.296C79.1969 21.8587 79.5809 21.512 80.0609 21.256C80.5515 21 81.0849 20.872 81.6609 20.872C82.6955 20.872 83.4902 21.1813 84.0449 21.8C84.5995 22.4187 84.8769 23.3253 84.8769 24.52V29H82.8289V24.712C82.8289 24.0293 82.6955 23.5067 82.4289 23.144C82.1729 22.7813 81.7729 22.6 81.2289 22.6C80.6742 22.6 80.2262 22.8027 79.8849 23.208C79.5542 23.6133 79.3889 24.1787 79.3889 24.904V29H77.3409V24.712C77.3409 24.0293 77.2075 23.5067 76.9409 23.144C76.6742 22.7813 76.2635 22.6 75.7089 22.6C75.1649 22.6 74.7222 22.8027 74.3809 23.208C74.0502 23.6133 73.8849 24.1787 73.8849 24.904V29H71.8369ZM90.1773 29.192C89.3773 29.192 88.6679 29.0213 88.0493 28.68C87.4306 28.3387 86.9453 27.8587 86.5933 27.24C86.2413 26.6213 86.0653 25.9067 86.0653 25.096C86.0653 24.2747 86.2359 23.544 86.5773 22.904C86.9293 22.264 87.4093 21.768 88.0173 21.416C88.6359 21.0533 89.3613 20.872 90.1933 20.872C90.9719 20.872 91.6599 21.0427 92.2573 21.384C92.8546 21.7253 93.3186 22.1947 93.6493 22.792C93.9906 23.3787 94.1613 24.0347 94.1613 24.76C94.1613 24.8773 94.1559 25 94.1453 25.128C94.1453 25.256 94.1399 25.3893 94.1293 25.528H88.0973C88.1399 26.1467 88.3533 26.632 88.7373 26.984C89.1319 27.336 89.6066 27.512 90.1613 27.512C90.5773 27.512 90.9239 27.4213 91.2013 27.24C91.4893 27.048 91.7026 26.8027 91.8413 26.504H93.9213C93.7719 27.0053 93.5213 27.464 93.1693 27.88C92.8279 28.2853 92.4013 28.6053 91.8893 28.84C91.3879 29.0747 90.8173 29.192 90.1773 29.192ZM90.1933 22.536C89.6919 22.536 89.2493 22.68 88.8653 22.968C88.4813 23.2453 88.2359 23.672 88.1293 24.248H92.0813C92.0493 23.7253 91.8573 23.3093 91.5053 23C91.1533 22.6907 90.7159 22.536 90.1933 22.536ZM95.3838 29V21.064H97.2078L97.3998 22.552C97.6878 22.04 98.0771 21.6347 98.5677 21.336C99.0691 21.0267 99.6558 20.872 100.328 20.872V23.032H99.7518C99.3038 23.032 98.9038 23.1013 98.5518 23.24C98.1998 23.3787 97.9224 23.6187 97.7198 23.96C97.5278 24.3013 97.4318 24.776 97.4318 25.384V29H95.3838Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 3.7 KiB

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 20 KiB

@ -1,3 +0,0 @@
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22 11.0669C22 4.95335 17.0766 0 11 0C4.92339 0 0 4.95335 0 11.0669C0 16.5906 4.02254 21.1691 9.28125 22V14.2661H6.4869V11.0669H9.28125V8.62864C9.28125 5.85521 10.9224 4.32325 13.436 4.32325C14.6398 4.32325 15.8985 4.53923 15.8985 4.53923V7.26134H14.5111C13.145 7.26134 12.7188 8.11456 12.7188 8.98965V11.0669H15.7695L15.2816 14.2661H12.7188V22C17.9775 21.1691 22 16.5906 22 11.0669Z" fill="white"/>
</svg>

Before

Width:  |  Height:  |  Size: 512 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,83 +0,0 @@
<svg width="318" height="274" viewBox="0 0 318 274" fill="none" xmlns="http://www.w3.org/2000/svg">
<path opacity="0.64" d="M5.18 13V6H7.99C8.71667 6 9.27 6.17 9.65 6.51C10.0367 6.84333 10.23 7.27333 10.23 7.8C10.23 8.24 10.11 8.59333 9.87 8.86C9.63667 9.12 9.35 9.29667 9.01 9.39C9.41 9.47 9.74 9.67 10 9.99C10.26 10.3033 10.39 10.67 10.39 11.09C10.39 11.6433 10.19 12.1 9.79 12.46C9.39 12.82 8.82333 13 8.09 13H5.18ZM6.46 8.94H7.8C8.16 8.94 8.43667 8.85667 8.63 8.69C8.82333 8.52333 8.92 8.28667 8.92 7.98C8.92 7.68667 8.82333 7.45667 8.63 7.29C8.44333 7.11667 8.16 7.03 7.78 7.03H6.46V8.94ZM6.46 11.96H7.89C8.27 11.96 8.56333 11.8733 8.77 11.7C8.98333 11.52 9.09 11.27 9.09 10.95C9.09 10.6233 8.98 10.3667 8.76 10.18C8.54 9.99333 8.24333 9.9 7.87 9.9H6.46V11.96ZM11.0886 13V6H12.3686V13H11.0886ZM13.3253 13V6H17.8953V7.03H14.6053V8.95H17.5953V9.95H14.6053V11.97H17.8953V13H13.3253ZM18.7066 13V6H19.9866L23.2766 10.93V6H24.5566V13H23.2766L19.9866 8.08V13H18.7066Z" fill="#0A004C"/>
<path d="M107.539 9L107.894 8.64761L107.747 8.5H107.539V9ZM38.0003 9.5C38.2764 9.5 38.5003 9.27614 38.5003 9C38.5003 8.72386 38.2764 8.5 38.0003 8.5V9.5ZM42.0025 8.5C41.7264 8.5 41.5025 8.72386 41.5025 9C41.5025 9.27614 41.7264 9.5 42.0025 9.5V8.5ZM43.0031 9.5C43.2792 9.5 43.5031 9.27614 43.5031 9C43.5031 8.72386 43.2792 8.5 43.0031 8.5V9.5ZM47.0053 8.5C46.7292 8.5 46.5053 8.72386 46.5053 9C46.5053 9.27614 46.7292 9.5 47.0053 9.5V8.5ZM48.0059 9.5C48.282 9.5 48.5059 9.27614 48.5059 9C48.5059 8.72386 48.282 8.5 48.0059 8.5V9.5ZM52.0081 8.5C51.732 8.5 51.5081 8.72386 51.5081 9C51.5081 9.27614 51.732 9.5 52.0081 9.5V8.5ZM53.0087 9.5C53.2848 9.5 53.5087 9.27614 53.5087 9C53.5087 8.72386 53.2848 8.5 53.0087 8.5V9.5ZM57.0109 8.5C56.7348 8.5 56.5109 8.72386 56.5109 9C56.5109 9.27614 56.7348 9.5 57.0109 9.5V8.5ZM58.0115 9.5C58.2876 9.5 58.5115 9.27614 58.5115 9C58.5115 8.72386 58.2876 8.5 58.0115 8.5V9.5ZM62.0137 8.5C61.7376 8.5 61.5137 8.72386 61.5137 9C61.5137 9.27614 61.7376 9.5 62.0137 9.5V8.5ZM63.0143 9.5C63.2904 9.5 63.5143 9.27614 63.5143 9C63.5143 8.72386 63.2904 8.5 63.0143 8.5V9.5ZM67.0165 8.5C66.7404 8.5 66.5165 8.72386 66.5165 9C66.5165 9.27614 66.7404 9.5 67.0165 9.5V8.5ZM68.0171 9.5C68.2932 9.5 68.5171 9.27614 68.5171 9C68.5171 8.72386 68.2932 8.5 68.0171 8.5V9.5ZM72.0193 8.5C71.7432 8.5 71.5193 8.72386 71.5193 9C71.5193 9.27614 71.7432 9.5 72.0193 9.5V8.5ZM73.0199 9.5C73.296 9.5 73.5199 9.27614 73.5199 9C73.5199 8.72386 73.296 8.5 73.0199 8.5V9.5ZM77.0221 8.5C76.746 8.5 76.5221 8.72386 76.5221 9C76.5221 9.27614 76.746 9.5 77.0221 9.5V8.5ZM78.0227 9.5C78.2988 9.5 78.5227 9.27614 78.5227 9C78.5227 8.72386 78.2988 8.5 78.0227 8.5V9.5ZM82.0249 8.5C81.7488 8.5 81.5249 8.72386 81.5249 9C81.5249 9.27614 81.7488 9.5 82.0249 9.5V8.5ZM83.0255 9.5C83.3016 9.5 83.5255 9.27614 83.5255 9C83.5255 8.72386 83.3016 8.5 83.0255 8.5V9.5ZM87.0277 8.5C86.7516 8.5 86.5277 8.72386 86.5277 9C86.5277 9.27614 86.7516 9.5 87.0277 9.5V8.5ZM88.0283 9.5C88.3044 9.5 88.5283 9.27614 88.5283 9C88.5283 8.72386 88.3044 8.5 88.0283 8.5V9.5ZM92.0305 8.5C91.7544 8.5 91.5305 8.72386 91.5305 9C91.5305 9.27614 91.7544 9.5 92.0305 9.5V8.5ZM93.0311 9.5C93.3072 9.5 93.5311 9.27614 93.5311 9C93.5311 8.72386 93.3072 8.5 93.0311 8.5V9.5ZM97.0333 8.5C96.7572 8.5 96.5333 8.72386 96.5333 9C96.5333 9.27614 96.7572 9.5 97.0333 9.5V8.5ZM98.0339 9.5C98.31 9.5 98.5339 9.27614 98.5339 9C98.5339 8.72386 98.31 8.5 98.0339 8.5V9.5ZM102.036 8.5C101.76 8.5 101.536 8.72386 101.536 9C101.536 9.27614 101.76 9.5 102.036 9.5V8.5ZM103.037 9.5C103.313 9.5 103.537 9.27614 103.537 9C103.537 8.72386 103.313 8.5 103.037 8.5V9.5ZM107.039 8.5C106.763 8.5 106.539 8.72386 106.539 9C106.539 9.27614 106.763 9.5 107.039 9.5V8.5ZM107.483 9.65239C107.677 9.84829 107.994 9.84933 108.19 9.65471C108.386 9.46009 108.387 9.14351 108.192 8.94761L107.483 9.65239ZM110.576 11.3476C110.382 11.1517 110.065 11.1507 109.869 11.3453C109.673 11.5399 109.672 11.8565 109.867 12.0524L110.576 11.3476ZM110.463 12.6524C110.658 12.8483 110.974 12.8493 111.17 12.6547C111.366 12.4601 111.367 12.1435 111.172 11.9476L110.463 12.6524ZM113.557 14.3476C113.362 14.1517 113.045 14.1507 112.85 14.3453C112.654 14.5399 112.653 14.8565 112.847 15.0524L113.557 14.3476ZM37.5 9.5H38.0003V8.5H37.5V9.5ZM42.0025 9.5H43.0031V8.5H42.0025V9.5ZM47.0053 9.5H48.0059V8.5H47.0053V9.5ZM52.0081 9.5H53.0087V8.5H52.0081V9.5ZM57.0109 9.5H58.0115V8.5H57.0109V9.5ZM62.0137 9.5H63.0143V8.5H62.0137V9.5ZM67.0165 9.5H68.0171V8.5H67.0165V9.5ZM72.0193 9.5H73.0199V8.5H72.0193V9.5ZM77.0221 9.5H78.0227V8.5H77.0221V9.5ZM82.0249 9.5H83.0255V8.5H82.0249V9.5ZM87.0277 9.5H88.0283V8.5H87.0277V9.5ZM92.0305 9.5H93.0311V8.5H92.0305V9.5ZM97.0333 9.5H98.0339V8.5H97.0333V9.5ZM102.036 9.5H103.037V8.5H102.036V9.5ZM107.039 9.5H107.539V8.5H107.039V9.5ZM107.185 9.35239L107.483 9.65239L108.192 8.94761L107.894 8.64761L107.185 9.35239ZM109.867 12.0524L110.463 12.6524L111.172 11.9476L110.576 11.3476L109.867 12.0524ZM112.847 15.0524L113.145 15.3524L113.855 14.6476L113.557 14.3476L112.847 15.0524Z" fill="#D3D715"/>
<path d="M97.5 149L97.8547 148.648L97.7081 148.5H97.5V149ZM58.9875 149.5C59.2636 149.5 59.4875 149.276 59.4875 149C59.4875 148.724 59.2636 148.5 58.9875 148.5V149.5ZM62.8875 148.5C62.6114 148.5 62.3875 148.724 62.3875 149C62.3875 149.276 62.6114 149.5 62.8875 149.5V148.5ZM63.8625 149.5C64.1386 149.5 64.3625 149.276 64.3625 149C64.3625 148.724 64.1386 148.5 63.8625 148.5V149.5ZM67.7625 148.5C67.4864 148.5 67.2625 148.724 67.2625 149C67.2625 149.276 67.4864 149.5 67.7625 149.5V148.5ZM68.7375 149.5C69.0136 149.5 69.2375 149.276 69.2375 149C69.2375 148.724 69.0136 148.5 68.7375 148.5V149.5ZM72.6375 148.5C72.3614 148.5 72.1375 148.724 72.1375 149C72.1375 149.276 72.3614 149.5 72.6375 149.5V148.5ZM73.6125 149.5C73.8886 149.5 74.1125 149.276 74.1125 149C74.1125 148.724 73.8886 148.5 73.6125 148.5V149.5ZM77.5125 148.5C77.2364 148.5 77.0125 148.724 77.0125 149C77.0125 149.276 77.2364 149.5 77.5125 149.5V148.5ZM78.4875 149.5C78.7636 149.5 78.9875 149.276 78.9875 149C78.9875 148.724 78.7636 148.5 78.4875 148.5V149.5ZM82.3875 148.5C82.1114 148.5 81.8875 148.724 81.8875 149C81.8875 149.276 82.1114 149.5 82.3875 149.5V148.5ZM83.3625 149.5C83.6386 149.5 83.8625 149.276 83.8625 149C83.8625 148.724 83.6386 148.5 83.3625 148.5V149.5ZM87.2625 148.5C86.9864 148.5 86.7625 148.724 86.7625 149C86.7625 149.276 86.9864 149.5 87.2625 149.5V148.5ZM88.2375 149.5C88.5136 149.5 88.7375 149.276 88.7375 149C88.7375 148.724 88.5136 148.5 88.2375 148.5V149.5ZM92.1375 148.5C91.8614 148.5 91.6375 148.724 91.6375 149C91.6375 149.276 91.8614 149.5 92.1375 149.5V148.5ZM93.1125 149.5C93.3886 149.5 93.6125 149.276 93.6125 149C93.6125 148.724 93.3886 148.5 93.1125 148.5V149.5ZM97.0125 148.5C96.7364 148.5 96.5125 148.724 96.5125 149C96.5125 149.276 96.7364 149.5 97.0125 149.5V148.5ZM97.4433 149.652C97.638 149.848 97.9545 149.849 98.1504 149.655C98.3463 149.46 98.3474 149.144 98.1527 148.948L97.4433 149.652ZM100.537 151.348C100.342 151.152 100.026 151.151 99.83 151.345C99.6341 151.54 99.633 151.856 99.8276 152.052L100.537 151.348ZM100.424 152.652C100.618 152.848 100.935 152.849 101.131 152.655C101.327 152.46 101.328 152.144 101.133 151.948L100.424 152.652ZM103.517 154.348C103.323 154.152 103.006 154.151 102.81 154.345C102.614 154.54 102.613 154.856 102.808 155.052L103.517 154.348ZM58.5 149.5H58.9875V148.5H58.5V149.5ZM62.8875 149.5H63.8625V148.5H62.8875V149.5ZM67.7625 149.5H68.7375V148.5H67.7625V149.5ZM72.6375 149.5H73.6125V148.5H72.6375V149.5ZM77.5125 149.5H78.4875V148.5H77.5125V149.5ZM82.3875 149.5H83.3625V148.5H82.3875V149.5ZM87.2625 149.5H88.2375V148.5H87.2625V149.5ZM92.1375 149.5H93.1125V148.5H92.1375V149.5ZM97.0125 149.5H97.5V148.5H97.0125V149.5ZM97.1453 149.352L97.4433 149.652L98.1527 148.948L97.8547 148.648L97.1453 149.352ZM99.8276 152.052L100.424 152.652L101.133 151.948L100.537 151.348L99.8276 152.052ZM102.808 155.052L103.106 155.352L103.815 154.648L103.517 154.348L102.808 155.052Z" fill="#C27C13"/>
<path d="M248.5 26V25.5H248.315L248.175 25.6204L248.5 26ZM242.175 32.0796C242.385 31.8999 242.409 31.5843 242.23 31.3746C242.05 31.1649 241.734 31.1407 241.525 31.3204L242.175 32.0796ZM244.325 28.9204C244.115 29.1001 244.091 29.4157 244.27 29.6254C244.45 29.8351 244.766 29.8593 244.975 29.6796L244.325 28.9204ZM245.675 29.0796C245.885 28.8999 245.909 28.5843 245.73 28.3746C245.55 28.1649 245.234 28.1407 245.025 28.3204L245.675 29.0796ZM247.825 25.9204C247.615 26.1001 247.591 26.4157 247.77 26.6254C247.95 26.8351 248.266 26.8593 248.475 26.6796L247.825 25.9204ZM249.05 26.5C249.326 26.5 249.55 26.2761 249.55 26C249.55 25.7239 249.326 25.5 249.05 25.5V26.5ZM253.45 25.5C253.174 25.5 252.95 25.7239 252.95 26C252.95 26.2761 253.174 26.5 253.45 26.5V25.5ZM254.55 26.5C254.826 26.5 255.05 26.2761 255.05 26C255.05 25.7239 254.826 25.5 254.55 25.5V26.5ZM258.95 25.5C258.674 25.5 258.45 25.7239 258.45 26C258.45 26.2761 258.674 26.5 258.95 26.5V25.5ZM241.825 32.3796L242.175 32.0796L241.525 31.3204L241.175 31.6204L241.825 32.3796ZM244.975 29.6796L245.675 29.0796L245.025 28.3204L244.325 28.9204L244.975 29.6796ZM248.475 26.6796L248.825 26.3796L248.175 25.6204L247.825 25.9204L248.475 26.6796ZM248.5 26.5H249.05V25.5H248.5V26.5ZM253.45 26.5H254.55V25.5H253.45V26.5ZM258.95 26.5H259.5V25.5H258.95V26.5Z" fill="#3A9918"/>
<path d="M244 149V148.5H243.815L243.675 148.62L244 149ZM237.675 155.08C237.885 154.9 237.909 154.584 237.73 154.375C237.55 154.165 237.234 154.141 237.025 154.32L237.675 155.08ZM239.825 151.92C239.615 152.1 239.591 152.416 239.77 152.625C239.95 152.835 240.266 152.859 240.475 152.68L239.825 151.92ZM241.175 152.08C241.385 151.9 241.409 151.584 241.23 151.375C241.05 151.165 240.734 151.141 240.525 151.32L241.175 152.08ZM243.325 148.92C243.115 149.1 243.091 149.416 243.27 149.625C243.45 149.835 243.766 149.859 243.975 149.68L243.325 148.92ZM244.387 149.5C244.664 149.5 244.887 149.276 244.887 149C244.887 148.724 244.664 148.5 244.387 148.5V149.5ZM247.488 148.5C247.211 148.5 246.988 148.724 246.988 149C246.988 149.276 247.211 149.5 247.488 149.5V148.5ZM248.262 149.5C248.539 149.5 248.762 149.276 248.762 149C248.762 148.724 248.539 148.5 248.262 148.5V149.5ZM251.363 148.5C251.086 148.5 250.863 148.724 250.863 149C250.863 149.276 251.086 149.5 251.363 149.5V148.5ZM252.137 149.5C252.414 149.5 252.637 149.276 252.637 149C252.637 148.724 252.414 148.5 252.137 148.5V149.5ZM255.237 148.5C254.961 148.5 254.737 148.724 254.737 149C254.737 149.276 254.961 149.5 255.237 149.5V148.5ZM256.012 149.5C256.289 149.5 256.512 149.276 256.512 149C256.512 148.724 256.289 148.5 256.012 148.5V149.5ZM259.112 148.5C258.836 148.5 258.612 148.724 258.612 149C258.612 149.276 258.836 149.5 259.112 149.5V148.5ZM237.325 155.38L237.675 155.08L237.025 154.32L236.675 154.62L237.325 155.38ZM240.475 152.68L241.175 152.08L240.525 151.32L239.825 151.92L240.475 152.68ZM243.975 149.68L244.325 149.38L243.675 148.62L243.325 148.92L243.975 149.68ZM244 149.5H244.387V148.5H244V149.5ZM247.488 149.5H248.262V148.5H247.488V149.5ZM251.363 149.5H252.137V148.5H251.363V149.5ZM255.237 149.5H256.012V148.5H255.237V149.5ZM259.112 149.5H259.5V148.5H259.112V149.5Z" fill="#C2B113"/>
<path opacity="0.64" d="M6.81 67V61.03H4.77V60H10.14V61.03H8.09V67H6.81ZM10.6882 67V60H13.2582C13.8182 60 14.2782 60.0967 14.6382 60.29C15.0049 60.4767 15.2782 60.7333 15.4582 61.06C15.6382 61.38 15.7282 61.7367 15.7282 62.13C15.7282 62.5567 15.6149 62.9467 15.3882 63.3C15.1682 63.6533 14.8215 63.91 14.3482 64.07L15.7982 67H14.3282L13.0282 64.24H11.9682V67H10.6882ZM11.9682 63.3H13.1782C13.6049 63.3 13.9182 63.1967 14.1182 62.99C14.3182 62.7833 14.4182 62.51 14.4182 62.17C14.4182 61.8367 14.3182 61.57 14.1182 61.37C13.9249 61.17 13.6082 61.07 13.1682 61.07H11.9682V63.3ZM16.5187 67V60H21.0887V61.03H17.7987V62.95H20.7887V63.95H17.7987V65.97H21.0887V67H16.5187ZM24.2899 67.12C23.7766 67.12 23.3233 67.0333 22.9299 66.86C22.5366 66.68 22.2266 66.4267 21.9999 66.1C21.7733 65.7667 21.6566 65.3633 21.6499 64.89H22.9999C23.0133 65.2167 23.1299 65.4933 23.3499 65.72C23.5766 65.94 23.8866 66.05 24.2799 66.05C24.6199 66.05 24.8899 65.97 25.0899 65.81C25.2899 65.6433 25.3899 65.4233 25.3899 65.15C25.3899 64.8633 25.2999 64.64 25.1199 64.48C24.9466 64.32 24.7133 64.19 24.4199 64.09C24.1266 63.99 23.8133 63.8833 23.4799 63.77C22.9399 63.5833 22.5266 63.3433 22.2399 63.05C21.9599 62.7567 21.8199 62.3667 21.8199 61.88C21.8133 61.4667 21.9099 61.1133 22.1099 60.82C22.3166 60.52 22.5966 60.29 22.9499 60.13C23.3033 59.9633 23.7099 59.88 24.1699 59.88C24.6366 59.88 25.0466 59.9633 25.3999 60.13C25.7599 60.2967 26.0399 60.53 26.2399 60.83C26.4466 61.13 26.5566 61.4867 26.5699 61.9H25.1999C25.1933 61.6533 25.0966 61.4367 24.9099 61.25C24.7299 61.0567 24.4766 60.96 24.1499 60.96C23.8699 60.9533 23.6333 61.0233 23.4399 61.17C23.2533 61.31 23.1599 61.5167 23.1599 61.79C23.1599 62.0233 23.2333 62.21 23.3799 62.35C23.5266 62.4833 23.7266 62.5967 23.9799 62.69C24.2333 62.7833 24.5233 62.8833 24.8499 62.99C25.1966 63.11 25.5133 63.25 25.7999 63.41C26.0866 63.57 26.3166 63.7833 26.4899 64.05C26.6633 64.31 26.7499 64.6467 26.7499 65.06C26.7499 65.4267 26.6566 65.7667 26.4699 66.08C26.2833 66.3933 26.0066 66.6467 25.6399 66.84C25.2733 67.0267 24.8233 67.12 24.2899 67.12ZM29.4495 67V60H32.2595C32.9862 60 33.5395 60.17 33.9195 60.51C34.3062 60.8433 34.4995 61.2733 34.4995 61.8C34.4995 62.24 34.3795 62.5933 34.1395 62.86C33.9062 63.12 33.6195 63.2967 33.2795 63.39C33.6795 63.47 34.0095 63.67 34.2695 63.99C34.5295 64.3033 34.6595 64.67 34.6595 65.09C34.6595 65.6433 34.4595 66.1 34.0595 66.46C33.6595 66.82 33.0929 67 32.3595 67H29.4495ZM30.7295 62.94H32.0695C32.4295 62.94 32.7062 62.8567 32.8995 62.69C33.0929 62.5233 33.1895 62.2867 33.1895 61.98C33.1895 61.6867 33.0929 61.4567 32.8995 61.29C32.7129 61.1167 32.4295 61.03 32.0495 61.03H30.7295V62.94ZM30.7295 65.96H32.1595C32.5395 65.96 32.8329 65.8733 33.0395 65.7C33.2529 65.52 33.3595 65.27 33.3595 64.95C33.3595 64.6233 33.2495 64.3667 33.0295 64.18C32.8095 63.9933 32.5129 63.9 32.1395 63.9H30.7295V65.96ZM35.3581 67V60H36.6381V67H35.3581ZM37.5948 67V60H42.1648V61.03H38.8748V62.95H41.8648V63.95H38.8748V65.97H42.1648V67H37.5948ZM42.9761 67V60H44.2561L47.5461 64.93V60H48.8261V67H47.5461L44.2561 62.08V67H42.9761Z" fill="#0A004C"/>
<path opacity="0.64" d="M5.18 152V145H7.77C8.33 145 8.79333 145.093 9.16 145.28C9.52667 145.467 9.8 145.723 9.98 146.05C10.16 146.377 10.25 146.743 10.25 147.15C10.25 147.537 10.1633 147.893 9.99 148.22C9.81667 148.54 9.54667 148.8 9.18 149C8.81333 149.193 8.34333 149.29 7.77 149.29H6.46V152H5.18ZM6.46 148.25H7.69C8.13667 148.25 8.45667 148.153 8.65 147.96C8.85 147.76 8.95 147.49 8.95 147.15C8.95 146.803 8.85 146.533 8.65 146.34C8.45667 146.14 8.13667 146.04 7.69 146.04H6.46V148.25ZM9.65227 152L12.2123 145H13.6523L16.2123 152H14.8523L14.2923 150.38H11.5623L10.9923 152H9.65227ZM11.9123 149.38H13.9423L12.9223 146.47L11.9123 149.38ZM19.104 152.12C18.5907 152.12 18.1373 152.033 17.744 151.86C17.3507 151.68 17.0407 151.427 16.814 151.1C16.5873 150.767 16.4707 150.363 16.464 149.89H17.814C17.8273 150.217 17.944 150.493 18.164 150.72C18.3907 150.94 18.7007 151.05 19.094 151.05C19.434 151.05 19.704 150.97 19.904 150.81C20.104 150.643 20.204 150.423 20.204 150.15C20.204 149.863 20.114 149.64 19.934 149.48C19.7607 149.32 19.5273 149.19 19.234 149.09C18.9407 148.99 18.6273 148.883 18.294 148.77C17.754 148.583 17.3407 148.343 17.054 148.05C16.774 147.757 16.634 147.367 16.634 146.88C16.6273 146.467 16.724 146.113 16.924 145.82C17.1307 145.52 17.4107 145.29 17.764 145.13C18.1173 144.963 18.524 144.88 18.984 144.88C19.4507 144.88 19.8607 144.963 20.214 145.13C20.574 145.297 20.854 145.53 21.054 145.83C21.2607 146.13 21.3707 146.487 21.384 146.9H20.014C20.0073 146.653 19.9107 146.437 19.724 146.25C19.544 146.057 19.2907 145.96 18.964 145.96C18.684 145.953 18.4473 146.023 18.254 146.17C18.0673 146.31 17.974 146.517 17.974 146.79C17.974 147.023 18.0473 147.21 18.194 147.35C18.3407 147.483 18.5407 147.597 18.794 147.69C19.0473 147.783 19.3373 147.883 19.664 147.99C20.0107 148.11 20.3273 148.25 20.614 148.41C20.9007 148.57 21.1307 148.783 21.304 149.05C21.4773 149.31 21.564 149.647 21.564 150.06C21.564 150.427 21.4707 150.767 21.284 151.08C21.0973 151.393 20.8207 151.647 20.454 151.84C20.0873 152.027 19.6373 152.12 19.104 152.12ZM24.6708 152.12C24.1574 152.12 23.7041 152.033 23.3108 151.86C22.9174 151.68 22.6074 151.427 22.3808 151.1C22.1541 150.767 22.0374 150.363 22.0308 149.89H23.3808C23.3941 150.217 23.5108 150.493 23.7308 150.72C23.9574 150.94 24.2674 151.05 24.6608 151.05C25.0008 151.05 25.2708 150.97 25.4708 150.81C25.6708 150.643 25.7708 150.423 25.7708 150.15C25.7708 149.863 25.6808 149.64 25.5008 149.48C25.3274 149.32 25.0941 149.19 24.8008 149.09C24.5074 148.99 24.1941 148.883 23.8608 148.77C23.3208 148.583 22.9074 148.343 22.6208 148.05C22.3408 147.757 22.2008 147.367 22.2008 146.88C22.1941 146.467 22.2908 146.113 22.4908 145.82C22.6974 145.52 22.9774 145.29 23.3308 145.13C23.6841 144.963 24.0908 144.88 24.5508 144.88C25.0174 144.88 25.4274 144.963 25.7808 145.13C26.1408 145.297 26.4208 145.53 26.6208 145.83C26.8274 146.13 26.9374 146.487 26.9508 146.9H25.5808C25.5741 146.653 25.4774 146.437 25.2908 146.25C25.1108 146.057 24.8574 145.96 24.5308 145.96C24.2508 145.953 24.0141 146.023 23.8208 146.17C23.6341 146.31 23.5408 146.517 23.5408 146.79C23.5408 147.023 23.6141 147.21 23.7608 147.35C23.9074 147.483 24.1074 147.597 24.3608 147.69C24.6141 147.783 24.9041 147.883 25.2308 147.99C25.5774 148.11 25.8941 148.25 26.1808 148.41C26.4674 148.57 26.6974 148.783 26.8708 149.05C27.0441 149.31 27.1308 149.647 27.1308 150.06C27.1308 150.427 27.0374 150.767 26.8508 151.08C26.6641 151.393 26.3874 151.647 26.0208 151.84C25.6541 152.027 25.2041 152.12 24.6708 152.12ZM27.3976 152L29.9576 145H31.3976L33.9576 152H32.5976L32.0376 150.38H29.3076L28.7376 152H27.3976ZM29.6576 149.38H31.6876L30.6676 146.47L29.6576 149.38ZM34.4593 152V145H37.2693C37.996 145 38.5493 145.17 38.9293 145.51C39.316 145.843 39.5093 146.273 39.5093 146.8C39.5093 147.24 39.3893 147.593 39.1493 147.86C38.916 148.12 38.6293 148.297 38.2893 148.39C38.6893 148.47 39.0193 148.67 39.2793 148.99C39.5393 149.303 39.6693 149.67 39.6693 150.09C39.6693 150.643 39.4693 151.1 39.0693 151.46C38.6693 151.82 38.1026 152 37.3693 152H34.4593ZM35.7393 147.94H37.0793C37.4393 147.94 37.716 147.857 37.9093 147.69C38.1026 147.523 38.1993 147.287 38.1993 146.98C38.1993 146.687 38.1026 146.457 37.9093 146.29C37.7226 146.117 37.4393 146.03 37.0593 146.03H35.7393V147.94ZM35.7393 150.96H37.1693C37.5493 150.96 37.8426 150.873 38.0493 150.7C38.2626 150.52 38.3693 150.27 38.3693 149.95C38.3693 149.623 38.2593 149.367 38.0393 149.18C37.8193 148.993 37.5226 148.9 37.1493 148.9H35.7393V150.96ZM40.3679 152V145H41.6479V151H44.7479V152H40.3679ZM45.4757 152V145H50.0457V146.03H46.7557V147.95H49.7457V148.95H46.7557V150.97H50.0457V152H45.4757Z" fill="#0A004C"/>
<path opacity="0.64" d="M263.73 152L266.29 145H267.73L270.29 152H268.93L268.37 150.38H265.64L265.07 152H263.73ZM265.99 149.38H268.02L267 146.47L265.99 149.38ZM273.182 152.12C272.668 152.12 272.215 152.033 271.822 151.86C271.428 151.68 271.118 151.427 270.892 151.1C270.665 150.767 270.548 150.363 270.542 149.89H271.892C271.905 150.217 272.022 150.493 272.242 150.72C272.468 150.94 272.778 151.05 273.172 151.05C273.512 151.05 273.782 150.97 273.982 150.81C274.182 150.643 274.282 150.423 274.282 150.15C274.282 149.863 274.192 149.64 274.012 149.48C273.838 149.32 273.605 149.19 273.312 149.09C273.018 148.99 272.705 148.883 272.372 148.77C271.832 148.583 271.418 148.343 271.132 148.05C270.852 147.757 270.712 147.367 270.712 146.88C270.705 146.467 270.802 146.113 271.002 145.82C271.208 145.52 271.488 145.29 271.842 145.13C272.195 144.963 272.602 144.88 273.062 144.88C273.528 144.88 273.938 144.963 274.292 145.13C274.652 145.297 274.932 145.53 275.132 145.83C275.338 146.13 275.448 146.487 275.462 146.9H274.092C274.085 146.653 273.988 146.437 273.802 146.25C273.622 146.057 273.368 145.96 273.042 145.96C272.762 145.953 272.525 146.023 272.332 146.17C272.145 146.31 272.052 146.517 272.052 146.79C272.052 147.023 272.125 147.21 272.272 147.35C272.418 147.483 272.618 147.597 272.872 147.69C273.125 147.783 273.415 147.883 273.742 147.99C274.088 148.11 274.405 148.25 274.692 148.41C274.978 148.57 275.208 148.783 275.382 149.05C275.555 149.31 275.642 149.647 275.642 150.06C275.642 150.427 275.548 150.767 275.362 151.08C275.175 151.393 274.898 151.647 274.532 151.84C274.165 152.027 273.715 152.12 273.182 152.12ZM278.749 152.12C278.235 152.12 277.782 152.033 277.389 151.86C276.995 151.68 276.685 151.427 276.459 151.1C276.232 150.767 276.115 150.363 276.109 149.89H277.459C277.472 150.217 277.589 150.493 277.809 150.72C278.035 150.94 278.345 151.05 278.739 151.05C279.079 151.05 279.349 150.97 279.549 150.81C279.749 150.643 279.849 150.423 279.849 150.15C279.849 149.863 279.759 149.64 279.579 149.48C279.405 149.32 279.172 149.19 278.879 149.09C278.585 148.99 278.272 148.883 277.939 148.77C277.399 148.583 276.985 148.343 276.699 148.05C276.419 147.757 276.279 147.367 276.279 146.88C276.272 146.467 276.369 146.113 276.569 145.82C276.775 145.52 277.055 145.29 277.409 145.13C277.762 144.963 278.169 144.88 278.629 144.88C279.095 144.88 279.505 144.963 279.859 145.13C280.219 145.297 280.499 145.53 280.699 145.83C280.905 146.13 281.015 146.487 281.029 146.9H279.659C279.652 146.653 279.555 146.437 279.369 146.25C279.189 146.057 278.935 145.96 278.609 145.96C278.329 145.953 278.092 146.023 277.899 146.17C277.712 146.31 277.619 146.517 277.619 146.79C277.619 147.023 277.692 147.21 277.839 147.35C277.985 147.483 278.185 147.597 278.439 147.69C278.692 147.783 278.982 147.883 279.309 147.99C279.655 148.11 279.972 148.25 280.259 148.41C280.545 148.57 280.775 148.783 280.949 149.05C281.122 149.31 281.209 149.647 281.209 150.06C281.209 150.427 281.115 150.767 280.929 151.08C280.742 151.393 280.465 151.647 280.099 151.84C279.732 152.027 279.282 152.12 278.749 152.12ZM281.925 152V145H286.495V146.03H283.205V147.95H286.195V148.95H283.205V150.97H286.495V152H281.925ZM287.097 152V151.02L290.317 146.07H287.127V145H291.797V145.98L288.557 150.93H291.817V152H287.097ZM294.553 152V145H297.363C298.09 145 298.643 145.17 299.023 145.51C299.41 145.843 299.603 146.273 299.603 146.8C299.603 147.24 299.483 147.593 299.243 147.86C299.01 148.12 298.723 148.297 298.383 148.39C298.783 148.47 299.113 148.67 299.373 148.99C299.633 149.303 299.763 149.67 299.763 150.09C299.763 150.643 299.563 151.1 299.163 151.46C298.763 151.82 298.197 152 297.463 152H294.553ZM295.833 147.94H297.173C297.533 147.94 297.81 147.857 298.003 147.69C298.197 147.523 298.293 147.287 298.293 146.98C298.293 146.687 298.197 146.457 298.003 146.29C297.817 146.117 297.533 146.03 297.153 146.03H295.833V147.94ZM295.833 150.96H297.263C297.643 150.96 297.937 150.873 298.143 150.7C298.357 150.52 298.463 150.27 298.463 149.95C298.463 149.623 298.353 149.367 298.133 149.18C297.913 148.993 297.617 148.9 297.243 148.9H295.833V150.96ZM300.462 152V145H301.742V152H300.462ZM302.699 152V145H307.269V146.03H303.979V147.95H306.969V148.95H303.979V150.97H307.269V152H302.699ZM308.08 152V145H309.36L312.65 149.93V145H313.93V152H312.65L309.36 147.08V152H308.08Z" fill="#0A004C"/>
<path opacity="0.64" d="M264.18 29V22H268.75V23.03H265.46V24.95H268.45V25.95H265.46V27.97H268.75V29H264.18ZM269.221 29L271.411 25.46L269.191 22H270.661L272.231 24.44L273.671 22H275.111L272.921 25.52L275.161 29H273.691L272.101 26.53L270.661 29H269.221ZM278.415 29.12C277.709 29.12 277.102 28.97 276.595 28.67C276.089 28.3633 275.699 27.94 275.425 27.4C275.152 26.8533 275.015 26.2233 275.015 25.51C275.015 24.7967 275.152 24.1667 275.425 23.62C275.699 23.0733 276.089 22.6467 276.595 22.34C277.102 22.0333 277.709 21.88 278.415 21.88C279.255 21.88 279.942 22.09 280.475 22.51C281.015 22.9233 281.352 23.5067 281.485 24.26H280.075C279.989 23.88 279.802 23.5833 279.515 23.37C279.235 23.15 278.862 23.04 278.395 23.04C277.749 23.04 277.242 23.26 276.875 23.7C276.509 24.14 276.325 24.7433 276.325 25.51C276.325 26.2767 276.509 26.88 276.875 27.32C277.242 27.7533 277.749 27.97 278.395 27.97C278.862 27.97 279.235 27.87 279.515 27.67C279.802 27.4633 279.989 27.18 280.075 26.82H281.485C281.352 27.54 281.015 28.1033 280.475 28.51C279.942 28.9167 279.255 29.12 278.415 29.12ZM282.218 29V22H286.788V23.03H283.498V24.95H286.488V25.95H283.498V27.97H286.788V29H282.218ZM287.6 29V22H288.88V28H291.98V29H287.6ZM292.707 29V22H293.987V28H297.087V29H292.707ZM297.815 29V22H302.385V23.03H299.095V24.95H302.085V25.95H299.095V27.97H302.385V29H297.815ZM303.196 29V22H304.476L307.766 26.93V22H309.046V29H307.766L304.476 24.08V29H303.196ZM311.633 29V23.03H309.593V22H314.963V23.03H312.913V29H311.633Z" fill="#0A004C"/>
<g opacity="0.8" filter="url(#filter0_d_282_10841)">
<circle cx="146.926" cy="149.437" r="38.8053" fill="#C27C13"/>
</g>
<g opacity="0.8" filter="url(#filter1_d_282_10841)">
<circle cx="205" cy="165.5" r="28.5" fill="#C2B113"/>
</g>
<g opacity="0.8" filter="url(#filter2_d_282_10841)">
<circle cx="142.673" cy="33.6789" r="30.3" fill="#D3D715"/>
</g>
<g opacity="0.8" filter="url(#filter3_d_282_10841)">
<circle cx="102.5" cy="88" r="44" fill="#A0CF1C"/>
</g>
<g opacity="0.8" filter="url(#filter4_d_282_10841)">
<circle cx="196.5" cy="88" r="63" fill="#3A9918"/>
</g>
<path d="M178.693 96.288C177.589 96.288 176.589 96.096 175.693 95.712C174.797 95.312 174.077 94.704 173.533 93.888C172.989 93.072 172.701 92.048 172.669 90.816H175.693C175.709 91.632 175.973 92.32 176.485 92.88C177.013 93.424 177.749 93.696 178.693 93.696C179.589 93.696 180.277 93.448 180.757 92.952C181.237 92.456 181.477 91.832 181.477 91.08C181.477 90.2 181.157 89.536 180.517 89.088C179.893 88.624 179.085 88.392 178.093 88.392H176.845V85.872H178.117C178.933 85.872 179.613 85.68 180.157 85.296C180.701 84.912 180.973 84.344 180.973 83.592C180.973 82.968 180.765 82.472 180.349 82.104C179.949 81.72 179.389 81.528 178.669 81.528C177.885 81.528 177.269 81.76 176.821 82.224C176.389 82.688 176.149 83.256 176.101 83.928H173.101C173.165 82.376 173.701 81.152 174.709 80.256C175.733 79.36 177.053 78.912 178.669 78.912C179.821 78.912 180.789 79.12 181.573 79.536C182.373 79.936 182.973 80.472 183.373 81.144C183.789 81.816 183.997 82.56 183.997 83.376C183.997 84.32 183.733 85.12 183.205 85.776C182.693 86.416 182.053 86.848 181.285 87.072C182.229 87.264 182.997 87.728 183.589 88.464C184.181 89.184 184.477 90.096 184.477 91.2C184.477 92.128 184.253 92.976 183.805 93.744C183.357 94.512 182.701 95.128 181.837 95.592C180.989 96.056 179.941 96.288 178.693 96.288ZM193.398 96.288C192.166 96.288 191.102 96.072 190.206 95.64C189.326 95.208 188.63 94.616 188.118 93.864C187.622 93.096 187.334 92.232 187.254 91.272H190.254C190.398 91.96 190.75 92.536 191.31 93C191.87 93.448 192.566 93.672 193.398 93.672C194.294 93.672 195.022 93.344 195.582 92.688C196.158 92.032 196.446 91.216 196.446 90.24C196.446 89.232 196.158 88.432 195.582 87.84C195.022 87.248 194.31 86.952 193.446 86.952C192.726 86.952 192.102 87.128 191.574 87.48C191.046 87.832 190.67 88.272 190.446 88.8H187.494L188.934 79.2H198.246V81.888H191.238L190.47 85.776C190.822 85.392 191.302 85.08 191.91 84.84C192.518 84.584 193.198 84.456 193.95 84.456C195.15 84.456 196.15 84.728 196.95 85.272C197.75 85.8 198.358 86.504 198.774 87.384C199.19 88.248 199.398 89.192 199.398 90.216C199.398 91.384 199.142 92.424 198.63 93.336C198.134 94.248 197.43 94.968 196.518 95.496C195.622 96.024 194.582 96.288 193.398 96.288ZM205.593 87.456C204.825 87.456 204.129 87.288 203.505 86.952C202.881 86.6 202.385 86.104 202.017 85.464C201.649 84.824 201.465 84.064 201.465 83.184C201.465 82.304 201.649 81.544 202.017 80.904C202.385 80.264 202.881 79.776 203.505 79.44C204.129 79.088 204.833 78.912 205.617 78.912C206.385 78.912 207.073 79.088 207.681 79.44C208.305 79.776 208.801 80.264 209.169 80.904C209.537 81.544 209.721 82.304 209.721 83.184C209.721 84.064 209.537 84.824 209.169 85.464C208.801 86.104 208.305 86.6 207.681 86.952C207.057 87.288 206.361 87.456 205.593 87.456ZM204.681 96L214.161 79.2H217.161L207.681 96H204.681ZM205.593 85.32C206.057 85.32 206.457 85.144 206.793 84.792C207.129 84.424 207.297 83.888 207.297 83.184C207.297 82.48 207.129 81.944 206.793 81.576C206.473 81.208 206.073 81.024 205.593 81.024C205.113 81.024 204.705 81.208 204.369 81.576C204.049 81.944 203.889 82.48 203.889 83.184C203.889 83.888 204.049 84.424 204.369 84.792C204.705 85.144 205.113 85.32 205.593 85.32ZM216.345 96.288C215.577 96.288 214.881 96.12 214.257 95.784C213.633 95.432 213.137 94.936 212.769 94.296C212.401 93.656 212.217 92.896 212.217 92.016C212.217 91.136 212.401 90.384 212.769 89.76C213.137 89.12 213.633 88.632 214.257 88.296C214.881 87.944 215.585 87.768 216.369 87.768C217.137 87.768 217.825 87.944 218.433 88.296C219.057 88.632 219.553 89.12 219.921 89.76C220.289 90.384 220.473 91.136 220.473 92.016C220.473 92.896 220.289 93.656 219.921 94.296C219.553 94.936 219.057 95.432 218.433 95.784C217.825 96.12 217.129 96.288 216.345 96.288ZM216.345 94.152C216.825 94.152 217.225 93.976 217.545 93.624C217.881 93.256 218.049 92.72 218.049 92.016C218.049 91.312 217.881 90.776 217.545 90.408C217.225 90.04 216.825 89.856 216.345 89.856C215.865 89.856 215.457 90.04 215.121 90.408C214.801 90.776 214.641 91.312 214.641 92.016C214.641 92.72 214.801 93.256 215.121 93.624C215.457 93.976 215.865 94.152 216.345 94.152Z" fill="white"/>
<path d="M130.297 155.463V153.882C131.023 153.281 131.725 152.686 132.405 152.097C133.097 151.508 133.709 150.924 134.241 150.346C134.785 149.768 135.216 149.207 135.533 148.663C135.862 148.108 136.026 147.569 136.026 147.048C136.026 146.561 135.89 146.13 135.618 145.756C135.358 145.382 134.921 145.195 134.309 145.195C133.686 145.195 133.216 145.399 132.898 145.807C132.581 146.215 132.422 146.708 132.422 147.286H130.314C130.337 146.413 130.53 145.688 130.892 145.11C131.255 144.521 131.737 144.084 132.337 143.801C132.938 143.506 133.612 143.359 134.36 143.359C135.573 143.359 136.514 143.693 137.182 144.362C137.862 145.019 138.202 145.875 138.202 146.929C138.202 147.586 138.049 148.227 137.743 148.85C137.449 149.473 137.058 150.074 136.57 150.652C136.083 151.23 135.556 151.774 134.989 152.284C134.423 152.783 133.873 153.247 133.34 153.678H138.491V155.463H130.297ZM144.48 155.667C143.607 155.667 142.854 155.514 142.219 155.208C141.596 154.902 141.103 154.483 140.74 153.95C140.389 153.406 140.185 152.794 140.128 152.114H142.253C142.355 152.601 142.604 153.009 143.001 153.338C143.398 153.655 143.891 153.814 144.48 153.814C145.115 153.814 145.63 153.582 146.027 153.117C146.435 152.652 146.639 152.074 146.639 151.383C146.639 150.669 146.435 150.102 146.027 149.683C145.63 149.264 145.126 149.054 144.514 149.054C144.004 149.054 143.562 149.179 143.188 149.428C142.814 149.677 142.548 149.989 142.389 150.363H140.298L141.318 143.563H147.914V145.467H142.95L142.406 148.221C142.655 147.949 142.995 147.728 143.426 147.558C143.857 147.377 144.338 147.286 144.871 147.286C145.721 147.286 146.429 147.479 146.996 147.864C147.563 148.238 147.993 148.737 148.288 149.36C148.583 149.972 148.73 150.641 148.73 151.366C148.73 152.193 148.549 152.93 148.186 153.576C147.835 154.222 147.336 154.732 146.69 155.106C146.055 155.48 145.319 155.667 144.48 155.667ZM153.118 149.411C152.574 149.411 152.081 149.292 151.639 149.054C151.197 148.805 150.846 148.453 150.585 148C150.324 147.547 150.194 147.008 150.194 146.385C150.194 145.762 150.324 145.223 150.585 144.77C150.846 144.317 151.197 143.971 151.639 143.733C152.081 143.484 152.58 143.359 153.135 143.359C153.679 143.359 154.166 143.484 154.597 143.733C155.039 143.971 155.39 144.317 155.651 144.77C155.912 145.223 156.042 145.762 156.042 146.385C156.042 147.008 155.912 147.547 155.651 148C155.39 148.453 155.039 148.805 154.597 149.054C154.155 149.292 153.662 149.411 153.118 149.411ZM152.472 155.463L159.187 143.563H161.312L154.597 155.463H152.472ZM153.118 147.898C153.447 147.898 153.73 147.773 153.968 147.524C154.206 147.263 154.325 146.884 154.325 146.385C154.325 145.886 154.206 145.507 153.968 145.246C153.741 144.985 153.458 144.855 153.118 144.855C152.778 144.855 152.489 144.985 152.251 145.246C152.024 145.507 151.911 145.886 151.911 146.385C151.911 146.884 152.024 147.263 152.251 147.524C152.489 147.773 152.778 147.898 153.118 147.898ZM160.734 155.667C160.19 155.667 159.697 155.548 159.255 155.31C158.813 155.061 158.462 154.709 158.201 154.256C157.94 153.803 157.81 153.264 157.81 152.641C157.81 152.018 157.94 151.485 158.201 151.043C158.462 150.59 158.813 150.244 159.255 150.006C159.697 149.757 160.196 149.632 160.751 149.632C161.295 149.632 161.782 149.757 162.213 150.006C162.655 150.244 163.006 150.59 163.267 151.043C163.528 151.485 163.658 152.018 163.658 152.641C163.658 153.264 163.528 153.803 163.267 154.256C163.006 154.709 162.655 155.061 162.213 155.31C161.782 155.548 161.289 155.667 160.734 155.667ZM160.734 154.154C161.074 154.154 161.357 154.029 161.584 153.78C161.822 153.519 161.941 153.14 161.941 152.641C161.941 152.142 161.822 151.763 161.584 151.502C161.357 151.241 161.074 151.111 160.734 151.111C160.394 151.111 160.105 151.241 159.867 151.502C159.64 151.763 159.527 152.142 159.527 152.641C159.527 153.14 159.64 153.519 159.867 153.78C160.105 154.029 160.394 154.154 160.734 154.154Z" fill="white"/>
<path d="M199.657 171.144C199.081 171.144 198.561 171.044 198.097 170.844C197.633 170.636 197.261 170.344 196.981 169.968C196.709 169.592 196.573 169.156 196.573 168.66C196.573 168.148 196.705 167.7 196.969 167.316C197.241 166.932 197.597 166.656 198.037 166.488C197.653 166.32 197.349 166.08 197.125 165.768C196.901 165.448 196.789 165.092 196.789 164.7C196.789 164.3 196.897 163.932 197.113 163.596C197.329 163.252 197.649 162.976 198.073 162.768C198.505 162.56 199.033 162.456 199.657 162.456C200.281 162.456 200.805 162.56 201.229 162.768C201.653 162.976 201.973 163.252 202.189 163.596C202.405 163.932 202.513 164.3 202.513 164.7C202.513 165.084 202.397 165.44 202.165 165.768C201.941 166.088 201.641 166.328 201.265 166.488C201.713 166.656 202.069 166.932 202.333 167.316C202.597 167.7 202.729 168.148 202.729 168.66C202.729 169.156 202.593 169.592 202.321 169.968C202.049 170.344 201.677 170.636 201.205 170.844C200.741 171.044 200.225 171.144 199.657 171.144ZM199.657 166.032C200.073 166.032 200.401 165.924 200.641 165.708C200.881 165.492 201.001 165.216 201.001 164.88C201.001 164.512 200.881 164.224 200.641 164.016C200.409 163.808 200.081 163.704 199.657 163.704C199.225 163.704 198.893 163.808 198.661 164.016C198.429 164.224 198.313 164.512 198.313 164.88C198.313 165.224 198.429 165.504 198.661 165.72C198.901 165.928 199.233 166.032 199.657 166.032ZM199.657 169.86C200.169 169.86 200.557 169.736 200.821 169.488C201.085 169.232 201.217 168.912 201.217 168.528C201.217 168.104 201.077 167.772 200.797 167.532C200.525 167.292 200.145 167.172 199.657 167.172C199.169 167.172 198.781 167.292 198.493 167.532C198.213 167.772 198.073 168.104 198.073 168.528C198.073 168.912 198.205 169.232 198.469 169.488C198.741 169.736 199.137 169.86 199.657 169.86ZM205.908 166.728C205.524 166.728 205.176 166.644 204.864 166.476C204.552 166.3 204.304 166.052 204.12 165.732C203.936 165.412 203.844 165.032 203.844 164.592C203.844 164.152 203.936 163.772 204.12 163.452C204.304 163.132 204.552 162.888 204.864 162.72C205.176 162.544 205.528 162.456 205.92 162.456C206.304 162.456 206.648 162.544 206.952 162.72C207.264 162.888 207.512 163.132 207.696 163.452C207.88 163.772 207.972 164.152 207.972 164.592C207.972 165.032 207.88 165.412 207.696 165.732C207.512 166.052 207.264 166.3 206.952 166.476C206.64 166.644 206.292 166.728 205.908 166.728ZM205.452 171L210.192 162.6H211.692L206.952 171H205.452ZM205.908 165.66C206.14 165.66 206.34 165.572 206.508 165.396C206.676 165.212 206.76 164.944 206.76 164.592C206.76 164.24 206.676 163.972 206.508 163.788C206.348 163.604 206.148 163.512 205.908 163.512C205.668 163.512 205.464 163.604 205.296 163.788C205.136 163.972 205.056 164.24 205.056 164.592C205.056 164.944 205.136 165.212 205.296 165.396C205.464 165.572 205.668 165.66 205.908 165.66ZM211.284 171.144C210.9 171.144 210.552 171.06 210.24 170.892C209.928 170.716 209.68 170.468 209.496 170.148C209.312 169.828 209.22 169.448 209.22 169.008C209.22 168.568 209.312 168.192 209.496 167.88C209.68 167.56 209.928 167.316 210.24 167.148C210.552 166.972 210.904 166.884 211.296 166.884C211.68 166.884 212.024 166.972 212.328 167.148C212.64 167.316 212.888 167.56 213.072 167.88C213.256 168.192 213.348 168.568 213.348 169.008C213.348 169.448 213.256 169.828 213.072 170.148C212.888 170.468 212.64 170.716 212.328 170.892C212.024 171.06 211.676 171.144 211.284 171.144ZM211.284 170.076C211.524 170.076 211.724 169.988 211.884 169.812C212.052 169.628 212.136 169.36 212.136 169.008C212.136 168.656 212.052 168.388 211.884 168.204C211.724 168.02 211.524 167.928 211.284 167.928C211.044 167.928 210.84 168.02 210.672 168.204C210.512 168.388 210.432 168.656 210.432 169.008C210.432 169.36 210.512 169.628 210.672 169.812C210.84 169.988 211.044 170.076 211.284 170.076Z" fill="white"/>
<path d="M132.243 37.7051V29.9491L130.633 30.3271V28.9551L132.999 27.9051H134.105V37.7051H132.243ZM135.697 37.7051V36.4031C136.295 35.9084 136.873 35.4184 137.433 34.9331C138.003 34.4477 138.507 33.9671 138.945 33.4911C139.393 33.0151 139.748 32.5531 140.009 32.1051C140.28 31.6477 140.415 31.2044 140.415 30.7751C140.415 30.3737 140.303 30.0191 140.079 29.7111C139.865 29.4031 139.505 29.2491 139.001 29.2491C138.488 29.2491 138.101 29.4171 137.839 29.7531C137.578 30.0891 137.447 30.4951 137.447 30.9711H135.711C135.73 30.2524 135.889 29.6551 136.187 29.1791C136.486 28.6937 136.883 28.3344 137.377 28.1011C137.872 27.8584 138.427 27.7371 139.043 27.7371C140.042 27.7371 140.817 28.0124 141.367 28.5631C141.927 29.1044 142.207 29.8091 142.207 30.6771C142.207 31.2184 142.081 31.7457 141.829 32.2591C141.587 32.7724 141.265 33.2671 140.863 33.7431C140.462 34.2191 140.028 34.6671 139.561 35.0871C139.095 35.4977 138.642 35.8804 138.203 36.2351H142.445V37.7051H135.697ZM145.88 32.7211C145.432 32.7211 145.026 32.6231 144.662 32.4271C144.298 32.2217 144.008 31.9324 143.794 31.5591C143.579 31.1857 143.472 30.7424 143.472 30.2291C143.472 29.7157 143.579 29.2724 143.794 28.8991C144.008 28.5257 144.298 28.2411 144.662 28.0451C145.026 27.8397 145.436 27.7371 145.894 27.7371C146.342 27.7371 146.743 27.8397 147.098 28.0451C147.462 28.2411 147.751 28.5257 147.966 28.8991C148.18 29.2724 148.288 29.7157 148.288 30.2291C148.288 30.7424 148.18 31.1857 147.966 31.5591C147.751 31.9324 147.462 32.2217 147.098 32.4271C146.734 32.6231 146.328 32.7211 145.88 32.7211ZM145.348 37.7051L150.878 27.9051H152.628L147.098 37.7051H145.348ZM145.88 31.4751C146.15 31.4751 146.384 31.3724 146.58 31.1671C146.776 30.9524 146.874 30.6397 146.874 30.2291C146.874 29.8184 146.776 29.5057 146.58 29.2911C146.393 29.0764 146.16 28.9691 145.88 28.9691C145.6 28.9691 145.362 29.0764 145.166 29.2911C144.979 29.5057 144.886 29.8184 144.886 30.2291C144.886 30.6397 144.979 30.9524 145.166 31.1671C145.362 31.3724 145.6 31.4751 145.88 31.4751ZM152.152 37.8731C151.704 37.8731 151.298 37.7751 150.934 37.5791C150.57 37.3737 150.28 37.0844 150.066 36.7111C149.851 36.3377 149.744 35.8944 149.744 35.3811C149.744 34.8677 149.851 34.4291 150.066 34.0651C150.28 33.6917 150.57 33.4071 150.934 33.2111C151.298 33.0057 151.708 32.9031 152.166 32.9031C152.614 32.9031 153.015 33.0057 153.37 33.2111C153.734 33.4071 154.023 33.6917 154.238 34.0651C154.452 34.4291 154.56 34.8677 154.56 35.3811C154.56 35.8944 154.452 36.3377 154.238 36.7111C154.023 37.0844 153.734 37.3737 153.37 37.5791C153.015 37.7751 152.609 37.8731 152.152 37.8731ZM152.152 36.6271C152.432 36.6271 152.665 36.5244 152.852 36.3191C153.048 36.1044 153.146 35.7917 153.146 35.3811C153.146 34.9704 153.048 34.6577 152.852 34.4431C152.665 34.2284 152.432 34.1211 152.152 34.1211C151.872 34.1211 151.634 34.2284 151.438 34.4431C151.251 34.6577 151.158 34.9704 151.158 35.3811C151.158 35.7917 151.251 36.1044 151.438 36.3191C151.634 36.5244 151.872 36.6271 152.152 36.6271Z" fill="white"/>
<path d="M85.7085 93V91.512C86.3912 90.9467 87.0525 90.3867 87.6925 89.832C88.3432 89.2773 88.9192 88.728 89.4205 88.184C89.9325 87.64 90.3378 87.112 90.6365 86.6C90.9458 86.0773 91.1005 85.5707 91.1005 85.08C91.1005 84.6213 90.9725 84.216 90.7165 83.864C90.4712 83.512 90.0605 83.336 89.4845 83.336C88.8978 83.336 88.4552 83.528 88.1565 83.912C87.8578 84.296 87.7085 84.76 87.7085 85.304H85.7245C85.7458 84.4827 85.9272 83.8 86.2685 83.256C86.6098 82.7013 87.0632 82.2907 87.6285 82.024C88.1938 81.7467 88.8285 81.608 89.5325 81.608C90.6738 81.608 91.5592 81.9227 92.1885 82.552C92.8285 83.1707 93.1485 83.976 93.1485 84.968C93.1485 85.5867 93.0045 86.1893 92.7165 86.776C92.4392 87.3627 92.0712 87.928 91.6125 88.472C91.1538 89.016 90.6578 89.528 90.1245 90.008C89.5912 90.4773 89.0738 90.9147 88.5725 91.32H93.4205V93H85.7085ZM99.555 93.192C98.5203 93.192 97.635 92.952 96.899 92.472C96.163 91.9813 95.5923 91.304 95.187 90.44C94.7923 89.5653 94.595 88.552 94.595 87.4C94.595 86.2587 94.7923 85.2507 95.187 84.376C95.5923 83.5013 96.163 82.824 96.899 82.344C97.635 81.8533 98.5203 81.608 99.555 81.608C100.59 81.608 101.475 81.8533 102.211 82.344C102.947 82.824 103.512 83.5013 103.907 84.376C104.312 85.2507 104.515 86.2587 104.515 87.4C104.515 88.552 104.312 89.5653 103.907 90.44C103.512 91.304 102.947 91.9813 102.211 92.472C101.475 92.952 100.59 93.192 99.555 93.192ZM99.555 91.352C100.398 91.352 101.086 91 101.619 90.296C102.152 89.592 102.419 88.6267 102.419 87.4C102.419 86.1733 102.152 85.208 101.619 84.504C101.086 83.8 100.398 83.448 99.555 83.448C98.7017 83.448 98.0083 83.8 97.475 84.504C96.9523 85.208 96.691 86.1733 96.691 87.4C96.691 88.6267 96.9523 89.592 97.475 90.296C98.0083 91 98.7017 91.352 99.555 91.352ZM108.546 87.304C108.034 87.304 107.57 87.192 107.154 86.968C106.738 86.7333 106.408 86.4027 106.162 85.976C105.917 85.5493 105.794 85.0427 105.794 84.456C105.794 83.8693 105.917 83.3627 106.162 82.936C106.408 82.5093 106.738 82.184 107.154 81.96C107.57 81.7253 108.04 81.608 108.562 81.608C109.074 81.608 109.533 81.7253 109.938 81.96C110.354 82.184 110.685 82.5093 110.93 82.936C111.176 83.3627 111.298 83.8693 111.298 84.456C111.298 85.0427 111.176 85.5493 110.93 85.976C110.685 86.4027 110.354 86.7333 109.938 86.968C109.522 87.192 109.058 87.304 108.546 87.304ZM107.938 93L114.258 81.8H116.258L109.938 93H107.938ZM108.546 85.88C108.856 85.88 109.122 85.7627 109.346 85.528C109.57 85.2827 109.682 84.9253 109.682 84.456C109.682 83.9867 109.57 83.6293 109.346 83.384C109.133 83.1387 108.866 83.016 108.546 83.016C108.226 83.016 107.954 83.1387 107.73 83.384C107.517 83.6293 107.41 83.9867 107.41 84.456C107.41 84.9253 107.517 85.2827 107.73 85.528C107.954 85.7627 108.226 85.88 108.546 85.88ZM115.714 93.192C115.202 93.192 114.738 93.08 114.322 92.856C113.906 92.6213 113.576 92.2907 113.33 91.864C113.085 91.4373 112.962 90.9307 112.962 90.344C112.962 89.7573 113.085 89.256 113.33 88.84C113.576 88.4133 113.906 88.088 114.322 87.864C114.738 87.6293 115.208 87.512 115.73 87.512C116.242 87.512 116.701 87.6293 117.106 87.864C117.522 88.088 117.853 88.4133 118.098 88.84C118.344 89.256 118.466 89.7573 118.466 90.344C118.466 90.9307 118.344 91.4373 118.098 91.864C117.853 92.2907 117.522 92.6213 117.106 92.856C116.701 93.08 116.237 93.192 115.714 93.192ZM115.714 91.768C116.034 91.768 116.301 91.6507 116.514 91.416C116.738 91.1707 116.85 90.8133 116.85 90.344C116.85 89.8747 116.738 89.5173 116.514 89.272C116.301 89.0267 116.034 88.904 115.714 88.904C115.394 88.904 115.122 89.0267 114.898 89.272C114.685 89.5173 114.578 89.8747 114.578 90.344C114.578 90.8133 114.685 91.1707 114.898 91.416C115.122 91.6507 115.394 91.768 115.714 91.768Z" fill="white"/>
<defs>
<filter id="filter0_d_282_10841" x="68.1211" y="110.632" width="157.61" height="157.611" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="40"/>
<feGaussianBlur stdDeviation="20"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.788235 0 0 0 0 0.580392 0 0 0 0 0.235294 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_282_10841"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_282_10841" result="shape"/>
</filter>
<filter id="filter1_d_282_10841" x="136.5" y="137" width="137" height="137" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="40"/>
<feGaussianBlur stdDeviation="20"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.8 0 0 0 0 0.784314 0 0 0 0 0.247059 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_282_10841"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_282_10841" result="shape"/>
</filter>
<filter id="filter2_d_282_10841" x="72.373" y="3.37891" width="140.6" height="140.6" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="40"/>
<feGaussianBlur stdDeviation="20"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.839216 0 0 0 0 0.85098 0 0 0 0 0.286275 0 0 0 0.25 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_282_10841"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_282_10841" result="shape"/>
</filter>
<filter id="filter3_d_282_10841" x="18.5" y="44" width="168" height="168" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="40"/>
<feGaussianBlur stdDeviation="20"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.744338 0 0 0 0 0.954167 0 0 0 0 0.159028 0 0 0 0.24 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_282_10841"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_282_10841" result="shape"/>
</filter>
<filter id="filter4_d_282_10841" x="93.5" y="25" width="206" height="206" filterUnits="userSpaceOnUse" color-interpolation-filters="sRGB">
<feFlood flood-opacity="0" result="BackgroundImageFix"/>
<feColorMatrix in="SourceAlpha" type="matrix" values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0" result="hardAlpha"/>
<feOffset dy="40"/>
<feGaussianBlur stdDeviation="20"/>
<feComposite in2="hardAlpha" operator="out"/>
<feColorMatrix type="matrix" values="0 0 0 0 0.388235 0 0 0 0 0.682353 0 0 0 0 0.27451 0 0 0 0.45 0"/>
<feBlend mode="normal" in2="BackgroundImageFix" result="effect1_dropShadow_282_10841"/>
<feBlend mode="normal" in="SourceGraphic" in2="effect1_dropShadow_282_10841" result="shape"/>
</filter>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 46 KiB

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="#0A004C"/>
<g clip-path="url(#clip0_1108_6175)">
<path d="M17.3332 8L10.1175 16L6.6665 12.6667" stroke="white" stroke-width="1.33333" stroke-linecap="square"/>
</g>
<defs>
<clipPath id="clip0_1108_6175">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 406 B

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="white"/>
<g clip-path="url(#clip0_1108_7017)">
<path d="M11.5462 17V8.136L9.70619 8.568V7L12.4102 5.8H13.6742V17H11.5462Z" fill="#2400FD"/>
</g>
<defs>
<clipPath id="clip0_1108_7017">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 386 B

@ -1,10 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_1108_7032)">
<path d="M11.9864 17.192C11.2504 17.192 10.5837 17.064 9.98638 16.808C9.38904 16.5413 8.90904 16.136 8.54638 15.592C8.18371 15.048 7.99171 14.3653 7.97038 13.544H9.98638C9.99704 14.088 10.173 14.5467 10.5144 14.92C10.8664 15.2827 11.357 15.464 11.9864 15.464C12.5837 15.464 13.0424 15.2987 13.3624 14.968C13.6824 14.6373 13.8424 14.2213 13.8424 13.72C13.8424 13.1333 13.629 12.6907 13.2024 12.392C12.7864 12.0827 12.2477 11.928 11.5864 11.928H10.7544V10.248H11.6024C12.1464 10.248 12.5997 10.12 12.9624 9.864C13.325 9.608 13.5064 9.22933 13.5064 8.728C13.5064 8.312 13.3677 7.98133 13.0904 7.736C12.8237 7.48 12.4504 7.352 11.9704 7.352C11.4477 7.352 11.037 7.50667 10.7384 7.816C10.4504 8.12533 10.2904 8.504 10.2584 8.952H8.25838C8.30104 7.91733 8.65838 7.10133 9.33038 6.504C10.013 5.90667 10.893 5.608 11.9704 5.608C12.7384 5.608 13.3837 5.74667 13.9064 6.024C14.4397 6.29067 14.8397 6.648 15.1064 7.096C15.3837 7.544 15.5224 8.04 15.5224 8.584C15.5224 9.21333 15.3464 9.74667 14.9944 10.184C14.653 10.6107 14.2264 10.8987 13.7144 11.048C14.3437 11.176 14.8557 11.4853 15.2504 11.976C15.645 12.456 15.8424 13.064 15.8424 13.8C15.8424 14.4187 15.693 14.984 15.3944 15.496C15.0957 16.008 14.6584 16.4187 14.0824 16.728C13.517 17.0373 12.8184 17.192 11.9864 17.192Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1108_7032">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="white"/>
<g clip-path="url(#clip0_1108_6817)">
<path d="M11.9864 17.192C11.2504 17.192 10.5837 17.064 9.98638 16.808C9.38904 16.5413 8.90904 16.136 8.54638 15.592C8.18371 15.048 7.99171 14.3653 7.97038 13.544H9.98638C9.99704 14.088 10.173 14.5467 10.5144 14.92C10.8664 15.2827 11.357 15.464 11.9864 15.464C12.5837 15.464 13.0424 15.2987 13.3624 14.968C13.6824 14.6373 13.8424 14.2213 13.8424 13.72C13.8424 13.1333 13.629 12.6907 13.2024 12.392C12.7864 12.0827 12.2477 11.928 11.5864 11.928H10.7544V10.248H11.6024C12.1464 10.248 12.5997 10.12 12.9624 9.864C13.325 9.608 13.5064 9.22933 13.5064 8.728C13.5064 8.312 13.3677 7.98133 13.0904 7.736C12.8237 7.48 12.4504 7.352 11.9704 7.352C11.4477 7.352 11.037 7.50667 10.7384 7.816C10.4504 8.12533 10.2904 8.504 10.2584 8.952H8.25838C8.30104 7.91733 8.65838 7.10133 9.33038 6.504C10.013 5.90667 10.893 5.608 11.9704 5.608C12.7384 5.608 13.3837 5.74667 13.9064 6.024C14.4397 6.29067 14.8397 6.648 15.1064 7.096C15.3837 7.544 15.5224 8.04 15.5224 8.584C15.5224 9.21333 15.3464 9.74667 14.9944 10.184C14.653 10.6107 14.2264 10.8987 13.7144 11.048C14.3437 11.176 14.8557 11.4853 15.2504 11.976C15.645 12.456 15.8424 13.064 15.8424 13.8C15.8424 14.4187 15.693 14.984 15.3944 15.496C15.0957 16.008 14.6584 16.4187 14.0824 16.728C13.517 17.0373 12.8184 17.192 11.9864 17.192Z" fill="#2400FD"/>
</g>
<defs>
<clipPath id="clip0_1108_6817">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.5 KiB

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="#0A004C"/>
<g clip-path="url(#clip0_1108_7024)">
<path d="M8.24569 17V15.512C8.92835 14.9467 9.58969 14.3867 10.2297 13.832C10.8804 13.2773 11.4564 12.728 11.9577 12.184C12.4697 11.64 12.875 11.112 13.1737 10.6C13.483 10.0773 13.6377 9.57067 13.6377 9.08C13.6377 8.62133 13.5097 8.216 13.2537 7.864C13.0084 7.512 12.5977 7.336 12.0217 7.336C11.435 7.336 10.9924 7.528 10.6937 7.912C10.395 8.296 10.2457 8.76 10.2457 9.304H8.26169C8.28302 8.48267 8.46435 7.8 8.80569 7.256C9.14702 6.70133 9.60035 6.29067 10.1657 6.024C10.731 5.74667 11.3657 5.608 12.0697 5.608C13.211 5.608 14.0964 5.92267 14.7257 6.552C15.3657 7.17067 15.6857 7.976 15.6857 8.968C15.6857 9.58667 15.5417 10.1893 15.2537 10.776C14.9764 11.3627 14.6084 11.928 14.1497 12.472C13.691 13.016 13.195 13.528 12.6617 14.008C12.1284 14.4773 11.611 14.9147 11.1097 15.32H15.9577V17H8.24569Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_1108_7024">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

@ -1,11 +0,0 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="24" height="24" fill="white"/>
<g clip-path="url(#clip0_1108_6182)">
<path d="M8.24569 17V15.512C8.92835 14.9467 9.58969 14.3867 10.2297 13.832C10.8804 13.2773 11.4564 12.728 11.9577 12.184C12.4697 11.64 12.875 11.112 13.1737 10.6C13.483 10.0773 13.6377 9.57067 13.6377 9.08C13.6377 8.62133 13.5097 8.216 13.2537 7.864C13.0084 7.512 12.5977 7.336 12.0217 7.336C11.435 7.336 10.9924 7.528 10.6937 7.912C10.395 8.296 10.2457 8.76 10.2457 9.304H8.26169C8.28302 8.48267 8.46435 7.8 8.80569 7.256C9.14702 6.70133 9.60035 6.29067 10.1657 6.024C10.731 5.74667 11.3657 5.608 12.0697 5.608C13.211 5.608 14.0964 5.92267 14.7257 6.552C15.3657 7.17067 15.6857 7.976 15.6857 8.968C15.6857 9.58667 15.5417 10.1893 15.2537 10.776C14.9764 11.3627 14.6084 11.928 14.1497 12.472C13.691 13.016 13.195 13.528 12.6617 14.008C12.1284 14.4773 11.611 14.9147 11.1097 15.32H15.9577V17H8.24569Z" fill="#2400FD"/>
</g>
<defs>
<clipPath id="clip0_1108_6182">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

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

Loading…
Cancel
Save