moved a lot
This commit is contained in:
1 parent
5772a7d855
commit
136a1c34b3
98 files changed
+6950
-2183
No files matched your search
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,27 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Konto aktivieren{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="auth-section">
|
||||
<div class="auth-card">
|
||||
<h2 class="auth-title">Konto aktivieren</h2>
|
||||
<p class="auth-subtitle">Geben Sie Ihren Aktivierungstoken ein, um Ihr Konto freizuschalten.</p>
|
||||
|
||||
{{if .FormErrors}}
|
||||
<div class="alert alert--error">
|
||||
{{range .FormErrors}}<p>{{.}}</p>{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<form method="POST" action="/users/activated">
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="token">Aktivierungstoken</label>
|
||||
<input class="form-input" id="token" name="token" type="text"
|
||||
placeholder="Token aus der E-Mail einfügen" value="{{.Token}}">
|
||||
</div>
|
||||
<button class="btn btn--primary btn--full" type="submit">Aktivieren</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,62 @@
|
||||
{{define "base"}}
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>{{template "title" .}} — DPÖ</title>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Montserrat:wght@600;700&family=Source+Sans+3:wght@400;500;600&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="/static/style.css"/>
|
||||
</head>
|
||||
<body>
|
||||
{{if .AuthenticatedUser}}
|
||||
<nav style="border-bottom:1px solid var(--border); background:var(--bg-card);">
|
||||
<div class="container" style="display:flex; align-items:center; gap:20px; padding:10px 0;">
|
||||
<a href="/" class="link">Start</a>
|
||||
<a href="/issues" class="link">Abstimmungen</a>
|
||||
<a href="/mps" class="link">Nationalrat</a>
|
||||
<a href="/users/me" class="link">Mein Profil</a>
|
||||
{{if hasPermission "users:read"}}<a href="/users" class="link">Users</a>{{end}}
|
||||
<form method="POST" action="/logout" style="margin-left:auto;">
|
||||
<button type="submit" class="btn">Abmelden</button>
|
||||
</form>
|
||||
</div>
|
||||
</nav>
|
||||
{{end}}
|
||||
|
||||
<div style="text-align:center; padding: 40px 0 24px;">
|
||||
<img src="/static/logo.svg" alt="DPÖ Logo" style="height: 600px; width: auto;">
|
||||
</div>
|
||||
|
||||
<main class="site-main">
|
||||
<div class="container">
|
||||
{{template "body" .}}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
<footer class="site-footer">
|
||||
<div class="container">
|
||||
<div class="footer-inner">
|
||||
<span class="footer-brand">DPÖ — Digitale Partei Österreich</span>
|
||||
<span class="footer-copy">© 2025</span>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
<script>
|
||||
const ws = new WebSocket("wss://localhost:8443/ws");
|
||||
ws.onopen = () => console.log("WS connected");
|
||||
ws.onmessage = (event) => console.log(event.data);
|
||||
ws.onclose = () => console.log("WS closed");
|
||||
setInterval(() => {
|
||||
if (ws.readyState === WebSocket.OPEN) {
|
||||
ws.send(JSON.stringify({ type: "ping", timestamp: Date(), random: Math.random() }));
|
||||
}
|
||||
}, 1000);
|
||||
</script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.10/dist/htmx.min.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
{{end}}
|
||||
@@ -0,0 +1,31 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Übersicht{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Willkommen, {{.Name}}</h1>
|
||||
<p class="page-subtitle">Ihre demokratische Plattform für Österreich</p>
|
||||
</div>
|
||||
|
||||
<div class="card-grid">
|
||||
<div class="card">
|
||||
<div class="card-icon">🗳</div>
|
||||
<h2 class="card-title">Aktuelle Abstimmungen</h2>
|
||||
<p class="card-text">Beteiligen Sie sich an laufenden Abstimmungen und demokratischen Initiativen.</p>
|
||||
<a href="/issues" class="btn btn--primary">Abstimmungen ansehen</a>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-icon">👤</div>
|
||||
<h2 class="card-title">Mein Profil</h2>
|
||||
<p class="card-text">Verwalten Sie Ihre persönlichen Daten und Kontoeinstellungen.</p>
|
||||
<a href="/users/me" class="btn btn--secondary">Profil ansehen</a>
|
||||
</div>
|
||||
<div class="card">
|
||||
<div class="card-icon">📊</div>
|
||||
<h2 class="card-title">Ergebnisse</h2>
|
||||
<p class="card-text">Sehen Sie die Ergebnisse abgeschlossener Abstimmungen ein.</p>
|
||||
<a href="#" class="btn btn--secondary">Ergebnisse ansehen</a>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,54 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Willkommen{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="hero">
|
||||
<div class="hero-content">
|
||||
<div class="hero-label">Digitale Demokratie für Österreich</div>
|
||||
<h1 class="hero-title">Gestalten Sie die<br><span class="accent">Zukunft Österreichs</span></h1>
|
||||
<p class="hero-text">
|
||||
Beteiligen Sie sich an der demokratischen Entscheidungsfindung —
|
||||
sicher, transparent und vollständig digital.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="auth-section">
|
||||
<div class="auth-card">
|
||||
<h2 class="auth-title">Anmelden</h2>
|
||||
<p class="auth-subtitle">Melden Sie sich an, um an Abstimmungen teilzunehmen.</p>
|
||||
|
||||
{{if .FormErrors}}
|
||||
<div class="alert alert--error">
|
||||
{{range .FormErrors}}<p>{{.}}</p>{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<form method="POST" action="/login">
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="email">E-Mail-Adresse</label>
|
||||
<input class="form-input" type="email" id="email" name="email"
|
||||
placeholder="ihre@email.at" required autocomplete="email">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="password">Passwort</label>
|
||||
<input class="form-input" type="password" id="password" name="password"
|
||||
placeholder="••••••••" required autocomplete="current-password">
|
||||
</div>
|
||||
<button class="btn btn--primary btn--full" type="submit">Anmelden</button>
|
||||
</form>
|
||||
|
||||
<p class="auth-divider">Noch kein Konto? <a href="/register" class="link">Registrieren</a></p>
|
||||
|
||||
{{if .IsDevelopment}}
|
||||
<form method="POST" action="/dev-login" style="margin-top:12px;">
|
||||
<button class="btn btn--full" type="submit"
|
||||
style="background:none; border:1px solid orange; color:orange;">
|
||||
Dev: Neues Testkonto erstellen & anmelden
|
||||
</button>
|
||||
</form>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,208 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}{{.Issue.Title}}{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div style="margin-bottom:16px;">
|
||||
<a href="/issues" class="link">← Zurück</a>
|
||||
</div>
|
||||
|
||||
<div class="card" style="margin-bottom:24px;">
|
||||
<div class="card-title" style="font-size:22px;">{{.Issue.Title}}</div>
|
||||
<div class="card-text" style="margin-top:8px;">{{.Issue.Description}}</div>
|
||||
<div style="font-size:13px; color:var(--text-muted); margin-top:8px;">
|
||||
{{.Issue.StartTime.Format "02.01.2006"}} – {{.Issue.EndTime.Format "02.01.2006"}}
|
||||
</div>
|
||||
{{if .CanWriteIssues}}
|
||||
<div style="display:flex; gap:8px; margin-top:16px; flex-wrap:wrap;">
|
||||
<button class="btn btn--danger"
|
||||
hx-delete="/issues/{{.Issue.ID}}"
|
||||
hx-confirm="Abstimmung wirklich löschen?">Löschen</button>
|
||||
</div>
|
||||
<details style="margin-top:16px; border-top:1px solid var(--border); padding-top:16px;">
|
||||
<summary style="cursor:pointer; font-weight:600; list-style:none;">Bearbeiten</summary>
|
||||
<form hx-patch="/issues/{{.Issue.ID}}" style="margin-top:12px;">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Titel</label>
|
||||
<input class="form-input" name="title" type="text" value="{{.Issue.Title}}" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Beschreibung</label>
|
||||
<textarea class="form-input" name="description" rows="3">{{.Issue.Description}}</textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Beginn</label>
|
||||
<div style="display:flex; gap:8px;">
|
||||
<input class="form-input" name="start_date" type="date"
|
||||
value="{{.Issue.StartTime.Format "2006-01-02"}}" style="flex:1; min-width:0;">
|
||||
{{template "time-input" (dict "name" "start_clock" "value" (.Issue.StartTime.Format "15:04"))}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Ende</label>
|
||||
<div style="display:flex; gap:8px;">
|
||||
<input class="form-input" name="end_date" type="date"
|
||||
value="{{.Issue.EndTime.Format "2006-01-02"}}" style="flex:1; min-width:0;">
|
||||
{{template "time-input" (dict "name" "end_clock" "value" (.Issue.EndTime.Format "15:04"))}}
|
||||
</div>
|
||||
</div>
|
||||
<button class="btn btn--primary" type="submit">Speichern</button>
|
||||
</form>
|
||||
</details>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<h2 style="margin-bottom:16px;">Optionen</h2>
|
||||
|
||||
{{if .Issue.CanVote}}
|
||||
<div class="card" style="margin-bottom:24px;">
|
||||
<p style="margin-bottom:12px; font-weight:600;">Ihre Stimme abgeben</p>
|
||||
{{range .Issue.Options}}
|
||||
<label style="display:flex; align-items:center; gap:8px; margin-bottom:8px; cursor:pointer;">
|
||||
<input type="radio" name="vote-option" value="{{.ID}}">
|
||||
<span>{{.Label}}</span>
|
||||
</label>
|
||||
{{end}}
|
||||
<div id="vote-status" style="font-size:13px; margin-top:8px;"></div>
|
||||
<button class="btn btn--primary" style="margin-top:12px;" onclick="castVote()">Abstimmen</button>
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<div class="card-grid">
|
||||
{{range .Issue.Options}}
|
||||
<div class="card">
|
||||
<div class="card-title">{{.Label}}</div>
|
||||
<div style="font-size:28px; font-weight:700; margin-top:8px;">{{.VoteCount}}</div>
|
||||
<div style="font-size:13px; color:var(--text-muted);">Stimmen</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const issueID = {{.Issue.ID}};
|
||||
|
||||
// ── Blind-signature voting ──────────────────────────────────────────────────
|
||||
|
||||
function modPow(base, exp, mod) {
|
||||
if (mod === 1n) return 0n;
|
||||
let result = 1n;
|
||||
base = base % mod;
|
||||
while (exp > 0n) {
|
||||
if (exp % 2n === 1n) result = (result * base) % mod;
|
||||
exp >>= 1n;
|
||||
base = (base * base) % mod;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
function modInverse(a, m) {
|
||||
let [old_r, r] = [a, m];
|
||||
let [old_s, s] = [1n, 0n];
|
||||
while (r !== 0n) {
|
||||
const q = old_r / r;
|
||||
[old_r, r] = [r, old_r - q * r];
|
||||
[old_s, s] = [s, old_s - q * s];
|
||||
}
|
||||
return ((old_s % m) + m) % m;
|
||||
}
|
||||
|
||||
function bigIntToBase64(n) {
|
||||
let hex = n.toString(16);
|
||||
if (hex.length % 2) hex = "0" + hex;
|
||||
const bytes = new Uint8Array(hex.length / 2);
|
||||
for (let i = 0; i < bytes.length; i++)
|
||||
bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);
|
||||
return btoa(String.fromCharCode(...bytes));
|
||||
}
|
||||
|
||||
function base64ToBigInt(b64) {
|
||||
const bin = atob(b64);
|
||||
let hex = "";
|
||||
for (let i = 0; i < bin.length; i++)
|
||||
hex += bin.charCodeAt(i).toString(16).padStart(2, "0");
|
||||
return BigInt("0x" + hex);
|
||||
}
|
||||
|
||||
function bytesToBase64(bytes) {
|
||||
return btoa(String.fromCharCode(...bytes));
|
||||
}
|
||||
|
||||
async function castVote() {
|
||||
const selected = document.querySelector('input[name="vote-option"]:checked');
|
||||
if (!selected) { alert("Bitte eine Option auswählen."); return; }
|
||||
const optionID = parseInt(selected.value);
|
||||
const status = document.getElementById("vote-status");
|
||||
status.textContent = "Wird verarbeitet…";
|
||||
|
||||
try {
|
||||
// 1. Get public key
|
||||
const pkRes = await fetch(`/issues/${issueID}/pubkey`);
|
||||
if (!pkRes.ok) throw new Error("Öffentlicher Schlüssel nicht abrufbar.");
|
||||
const { public_key } = await pkRes.json();
|
||||
const N = BigInt("0x" + public_key.n);
|
||||
const e = BigInt(public_key.e);
|
||||
|
||||
// 2. Generate nonce and compute vote message: SHA-256(issueID||optionID||nonce)
|
||||
const nonce = crypto.getRandomValues(new Uint8Array(32));
|
||||
const msgBuf = new Uint8Array(16 + nonce.length);
|
||||
const view = new DataView(msgBuf.buffer);
|
||||
view.setBigUint64(0, BigInt(issueID), false);
|
||||
view.setBigUint64(8, BigInt(optionID), false);
|
||||
msgBuf.set(nonce, 16);
|
||||
const hashBuf = await crypto.subtle.digest("SHA-256", msgBuf);
|
||||
const hashHex = Array.from(new Uint8Array(hashBuf))
|
||||
.map(b => b.toString(16).padStart(2, "0")).join("");
|
||||
const m = BigInt("0x" + hashHex);
|
||||
|
||||
// 3. Pick random blinding factor r in [2, N-1]
|
||||
let r;
|
||||
do {
|
||||
const rb = crypto.getRandomValues(new Uint8Array(256));
|
||||
r = BigInt("0x" + Array.from(rb).map(b => b.toString(16).padStart(2, "0")).join(""));
|
||||
} while (r < 2n || r >= N);
|
||||
|
||||
// 4. Blind: m' = m * r^e mod N
|
||||
const blinded = (m * modPow(r, e, N)) % N;
|
||||
|
||||
// 5. Request blind signature
|
||||
const bsRes = await fetch(`/issues/${issueID}/blind-sign`, {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({ blinded_vote: Array.from(atob(bigIntToBase64(blinded))).map(c => c.charCodeAt(0)) }),
|
||||
});
|
||||
if (!bsRes.ok) {
|
||||
const err = await bsRes.json();
|
||||
throw new Error(err.error?.message ?? "Blind-Sign fehlgeschlagen.");
|
||||
}
|
||||
const { signed } = await bsRes.json();
|
||||
const sPrime = base64ToBigInt(signed);
|
||||
|
||||
// 6. Unblind: s = s' * r^(-1) mod N
|
||||
const signature = (sPrime * modInverse(r, N)) % N;
|
||||
|
||||
// 7. Cast vote
|
||||
const voteRes = await fetch("/votes", {
|
||||
method: "POST",
|
||||
headers: { "Content-Type": "application/json" },
|
||||
body: JSON.stringify({
|
||||
issue_id: issueID,
|
||||
option_id: optionID,
|
||||
nonce: bytesToBase64(nonce),
|
||||
signature: bigIntToBase64(signature),
|
||||
}),
|
||||
});
|
||||
if (!voteRes.ok) {
|
||||
const err = await voteRes.json();
|
||||
throw new Error(err.error?.message ?? "Abstimmung fehlgeschlagen.");
|
||||
}
|
||||
|
||||
status.style.color = "green";
|
||||
status.textContent = "Stimme erfolgreich abgegeben!";
|
||||
setTimeout(() => window.location.reload(), 1500);
|
||||
} catch (err) {
|
||||
status.style.color = "red";
|
||||
status.textContent = err.message;
|
||||
}
|
||||
}
|
||||
</script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,101 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Abstimmungen{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Abstimmungen</h1>
|
||||
<p class="page-subtitle">Aktuelle Abstimmungen der Digitalen Partei Österreich</p>
|
||||
</div>
|
||||
|
||||
{{if .Issues}}
|
||||
<div class="card-grid">
|
||||
{{range .Issues}}
|
||||
<div class="card">
|
||||
<div class="card-title">{{.Title}}</div>
|
||||
<div class="card-text">{{.Description}}</div>
|
||||
<div style="font-size:13px; color:var(--text-muted); margin-top:4px;">
|
||||
{{.StartTime.Format "02.01.2006"}} – {{.EndTime.Format "02.01.2006"}}
|
||||
</div>
|
||||
<div style="display:flex; gap:8px; margin-top:12px; flex-wrap:wrap;">
|
||||
<a href="/issues/{{.ID}}" class="btn btn--primary">Details</a>
|
||||
{{if $.CanWriteIssues}}
|
||||
<button class="btn btn--danger"
|
||||
hx-delete="/issues/{{.ID}}"
|
||||
hx-confirm="Abstimmung wirklich löschen?">Löschen</button>
|
||||
{{end}}
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<p style="color: var(--text-muted);">Keine Abstimmungen vorhanden.</p>
|
||||
{{end}}
|
||||
|
||||
{{if .CanWriteIssues}}
|
||||
<details style="margin-top:32px;">
|
||||
<summary class="btn btn--primary" style="display:inline-block; cursor:pointer; list-style:none;">+ Neue Abstimmung</summary>
|
||||
<div class="auth-card" style="max-width:520px; margin-top:16px;">
|
||||
<h2 class="auth-title">Neue Abstimmung</h2>
|
||||
<form method="POST" action="/issues">
|
||||
<div class="form-group">
|
||||
<label class="form-label">Titel</label>
|
||||
<input class="form-input" name="title" type="text" required>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Beschreibung</label>
|
||||
<textarea class="form-input" name="description" rows="3"></textarea>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Beginn</label>
|
||||
<div style="display:flex; gap:8px;">
|
||||
<input class="form-input" name="start_date" type="date" required style="flex:1; min-width:0;">
|
||||
{{template "time-input" (dict "name" "start_clock" "value" "12:00" "required" true)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Ende</label>
|
||||
<div style="display:flex; gap:8px;">
|
||||
<input class="form-input" name="end_date" type="date" required style="flex:1; min-width:0;">
|
||||
{{template "time-input" (dict "name" "end_clock" "value" "12:00" "required" true)}}
|
||||
</div>
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label">Optionen (mind. 2)</label>
|
||||
<div id="options-list" style="display:flex; flex-direction:column; gap:8px;">
|
||||
<input class="form-input" name="options" type="text" placeholder="Option 1" required>
|
||||
<input class="form-input" name="options" type="text" placeholder="Option 2" required>
|
||||
</div>
|
||||
<button type="button" class="btn btn--secondary" style="margin-top:8px;" onclick="addOption()">+ Option hinzufügen</button>
|
||||
</div>
|
||||
<button class="btn btn--primary" type="submit">Erstellen</button>
|
||||
</form>
|
||||
<script>
|
||||
(function() {
|
||||
function pad(n) { return String(n).padStart(2, '0'); }
|
||||
function fmtDate(d) {
|
||||
return d.getFullYear() + '-' + pad(d.getMonth()+1) + '-' + pad(d.getDate());
|
||||
}
|
||||
const start = new Date();
|
||||
const end = new Date(start);
|
||||
end.setDate(end.getDate() + 7);
|
||||
document.querySelector('input[name="start_date"]').value = fmtDate(start);
|
||||
document.querySelector('input[name="end_date"]').value = fmtDate(end);
|
||||
})();
|
||||
|
||||
function addOption() {
|
||||
const list = document.getElementById('options-list');
|
||||
const n = list.children.length + 1;
|
||||
const input = document.createElement('input');
|
||||
input.className = 'form-input';
|
||||
input.name = 'options';
|
||||
input.type = 'text';
|
||||
input.placeholder = 'Option ' + n;
|
||||
list.appendChild(input);
|
||||
input.focus();
|
||||
}
|
||||
</script>
|
||||
</div>
|
||||
</details>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,44 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Nationalrat{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Nationalrat</h1>
|
||||
<p class="page-subtitle">{{.Total}} Abgeordnete — XXVIII. Gesetzgebungsperiode</p>
|
||||
</div>
|
||||
|
||||
{{range .Groups}}
|
||||
<section style="margin-bottom: 40px;">
|
||||
<h2 style="font-size: 18px; color: var(--dark); margin-bottom: 12px; display: flex; align-items: baseline; gap: 10px;">
|
||||
{{.Name}}
|
||||
<span style="font-size: 13px; font-weight: 500; color: var(--text-muted); font-family: 'Source Sans 3', sans-serif;">{{len .Members}} Mandate</span>
|
||||
</h2>
|
||||
<div style="background: var(--bg-card); border: 1px solid var(--border); border-radius: var(--radius); overflow: hidden; box-shadow: var(--shadow);">
|
||||
<table style="width: 100%; border-collapse: collapse; font-size: 14px;">
|
||||
<thead>
|
||||
<tr style="background: var(--bg); border-bottom: 1px solid var(--border);">
|
||||
<th style="text-align: left; padding: 10px 16px; font-weight: 600; color: var(--text-muted); font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase;">Name</th>
|
||||
<th style="text-align: left; padding: 10px 16px; font-weight: 600; color: var(--text-muted); font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase;">Fraktion</th>
|
||||
<th style="text-align: left; padding: 10px 16px; font-weight: 600; color: var(--text-muted); font-size: 12px; letter-spacing: 0.04em; text-transform: uppercase;">Wahlkreis</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{{range .Members}}
|
||||
<tr style="border-bottom: 1px solid var(--border);">
|
||||
<td style="padding: 10px 16px;">
|
||||
<a href="https://www.parlament.gv.at{{.Path}}" target="_blank" rel="noopener"
|
||||
style="color: var(--text); font-weight: 500; text-decoration: none;">
|
||||
{{.FirstName}} {{.LastName}}
|
||||
</a>
|
||||
</td>
|
||||
<td style="padding: 10px 16px; color: var(--text-muted); font-weight: 500;">{{.Faction}}</td>
|
||||
<td style="padding: 10px 16px; color: var(--text-muted);">{{.Constituency}}</td>
|
||||
</tr>
|
||||
{{end}}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
{{end}}
|
||||
@@ -0,0 +1,33 @@
|
||||
{{define "time-input"}}
|
||||
<span style="display:inline-flex; align-items:center; gap:4px;">
|
||||
<select class="form-input" style="width:68px; padding-left:8px; padding-right:4px; text-align:center;"></select>
|
||||
<span style="font-weight:600; color:var(--text-muted);">:</span>
|
||||
<select class="form-input" style="width:68px; padding-left:8px; padding-right:4px; text-align:center;"></select>
|
||||
<input type="hidden" name="{{.name}}" value="{{.value}}">
|
||||
</span>
|
||||
<script>
|
||||
(function() {
|
||||
const wrap = document.currentScript.previousElementSibling;
|
||||
const [hSel, mSel] = wrap.querySelectorAll('select');
|
||||
const hidden = wrap.querySelector('input[type="hidden"]');
|
||||
const parts = (hidden.value || '12:00').split(':');
|
||||
const initH = parseInt(parts[0], 10) || 0;
|
||||
const initM = parseInt(parts[1], 10) || 0;
|
||||
for (let h = 0; h < 24; h++) {
|
||||
const o = new Option(String(h).padStart(2, '0'), h);
|
||||
if (h === initH) o.selected = true;
|
||||
hSel.appendChild(o);
|
||||
}
|
||||
for (let m = 0; m < 60; m++) {
|
||||
const o = new Option(String(m).padStart(2, '0'), m);
|
||||
if (m === initM) o.selected = true;
|
||||
mSel.appendChild(o);
|
||||
}
|
||||
function sync() {
|
||||
hidden.value = String(+hSel.value).padStart(2, '0') + ':' + String(+mSel.value).padStart(2, '0');
|
||||
}
|
||||
hSel.addEventListener('change', sync);
|
||||
mSel.addEventListener('change', sync);
|
||||
})();
|
||||
</script>
|
||||
{{end}}
|
||||
@@ -0,0 +1,27 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Mein Profil{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Mein Profil</h1>
|
||||
</div>
|
||||
|
||||
<div class="card" style="max-width:520px;">
|
||||
<div class="card-title">{{.User.Name}}{{if .User.AltName}} / {{.User.AltName}}{{end}}</div>
|
||||
<div style="margin-top:12px; display:flex; flex-direction:column; gap:8px; font-size:15px;">
|
||||
<div><span style="color:var(--text-muted);">E-Mail</span> {{.User.Email}}</div>
|
||||
<div><span style="color:var(--text-muted);">Telefon</span> {{.User.PhoneNumber}}</div>
|
||||
<div><span style="color:var(--text-muted);">Land</span> {{.User.Country}}</div>
|
||||
<div><span style="color:var(--text-muted);">Adresse</span> {{.User.Address}}</div>
|
||||
<div><span style="color:var(--text-muted);">Geburtsdatum</span> {{.User.DateOfBirth.Format "02.01.2006"}}</div>
|
||||
<div><span style="color:var(--text-muted);">Mitglied seit</span> {{.User.Created.Format "02.01.2006"}}</div>
|
||||
</div>
|
||||
|
||||
<div style="margin-top:20px; border-top:1px solid var(--border); padding-top:16px;">
|
||||
<button class="btn btn--danger"
|
||||
hx-delete="/users/{{.User.ID}}"
|
||||
hx-confirm="Konto wirklich unwiderruflich löschen?">Konto löschen</button>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,82 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Registrieren{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header" style="text-align:center; border-bottom: none; margin-bottom: 32px;">
|
||||
<h1 class="page-title">Konto erstellen</h1>
|
||||
<p class="page-subtitle">Werden Sie Mitglied der Digitalen Partei Österreich</p>
|
||||
</div>
|
||||
|
||||
<div class="auth-section">
|
||||
<div class="auth-card" style="max-width: 520px;">
|
||||
|
||||
{{if .FormErrors}}
|
||||
<div class="alert alert--error">
|
||||
{{range .FormErrors}}<p>{{.}}</p>{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
|
||||
<form method="POST" action="/register">
|
||||
<div style="display:grid; grid-template-columns:1fr 1fr; gap: 0 16px;">
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="name">Vollständiger Name</label>
|
||||
<input class="form-input" type="text" id="name" name="name"
|
||||
placeholder="Maria Muster" required autocomplete="name">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="alt_name">Alternativer Name <span style="font-weight:400; color:var(--text-muted)">(optional)</span></label>
|
||||
<input class="form-input" type="text" id="alt_name" name="alt_name"
|
||||
placeholder="Spitzname">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="email">E-Mail-Adresse</label>
|
||||
<input class="form-input" type="email" id="email" name="email"
|
||||
placeholder="ihre@email.at" required autocomplete="email">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="username">Benutzername</label>
|
||||
<input class="form-input" type="text" id="username" name="username"
|
||||
placeholder="maria.muster" required autocomplete="username">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="password">Passwort</label>
|
||||
<input class="form-input" type="password" id="password" name="password"
|
||||
placeholder="••••••••" required autocomplete="new-password">
|
||||
</div>
|
||||
|
||||
<div style="display:grid; grid-template-columns:1fr 1fr; gap: 0 16px;">
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="phone_number">Telefonnummer</label>
|
||||
<input class="form-input" type="tel" id="phone_number" name="phone_number"
|
||||
placeholder="+43 660 123 4567" autocomplete="tel">
|
||||
</div>
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="date_of_birth">Geburtsdatum</label>
|
||||
<input class="form-input" type="date" id="date_of_birth" name="date_of_birth" required>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="address">Adresse</label>
|
||||
<input class="form-input" type="text" id="address" name="address"
|
||||
placeholder="Musterstraße 1, 1010 Wien" autocomplete="street-address">
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="form-label" for="country">Land</label>
|
||||
<input class="form-input" type="text" id="country" name="country"
|
||||
placeholder="AT" value="AT" maxlength="2" autocomplete="country">
|
||||
</div>
|
||||
|
||||
<button class="btn btn--primary btn--full" type="submit">Registrieren</button>
|
||||
</form>
|
||||
|
||||
<p class="auth-divider">Bereits ein Konto? <a href="/" class="link">Anmelden</a></p>
|
||||
</div>
|
||||
</div>
|
||||
{{end}}
|
||||
@@ -0,0 +1,34 @@
|
||||
{{template "base" .}}
|
||||
|
||||
{{define "title"}}Mitglieder{{end}}
|
||||
|
||||
{{define "body"}}
|
||||
<div class="page-header">
|
||||
<h1 class="page-title">Mitglieder</h1>
|
||||
<p class="page-subtitle">Registrierte Mitglieder der Digitalen Partei Österreich</p>
|
||||
</div>
|
||||
|
||||
{{if .Users}}
|
||||
<div class="card-grid">
|
||||
{{range .Users}}
|
||||
<div class="card">
|
||||
<div class="card-title">{{.Name}}{{if .AltName}} / {{.AltName}}{{end}}</div>
|
||||
<div class="card-text">{{.Email}}</div>
|
||||
<div style="font-size:13px; color:var(--text-muted); margin-top:4px;">
|
||||
{{.Country}} · Beigetreten {{.Created.Format "02.01.2006"}}
|
||||
</div>
|
||||
{{if not .Activated}}
|
||||
<div style="font-size:12px; color:var(--text-muted); margin-top:4px;">Nicht aktiviert</div>
|
||||
{{end}}
|
||||
{{if $.CanManageUsers}}
|
||||
<button class="btn btn--danger" style="margin-top:12px;"
|
||||
hx-delete="/users/{{.ID}}"
|
||||
hx-confirm="Mitglied wirklich löschen?">Löschen</button>
|
||||
{{end}}
|
||||
</div>
|
||||
{{end}}
|
||||
</div>
|
||||
{{else}}
|
||||
<p style="color: var(--text-muted);">Keine Mitglieder vorhanden.</p>
|
||||
{{end}}
|
||||
{{end}}
|
||||
Vendored
BIN
Binary file not shown.
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 1920 1080" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(1,0,0,1,228.879757,-47.582268)">
|
||||
<g transform="matrix(1.11124,0,0,1.11124,193.39495,66.343431)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,166.609966,39.558446)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,139.824982,12.773462)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,113.039997,-14.011522)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,86.255013,-40.796506)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,59.470029,-67.581491)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(1.11124,0,0,1.11124,32.685044,-94.366475)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 3.7 KiB |
@@ -0,0 +1,116 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100%" height="100%" viewBox="0 0 1920 1080" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xml:space="preserve" xmlns:serif="http://www.serif.com/" style="fill-rule:evenodd;clip-rule:evenodd;stroke-linejoin:round;stroke-miterlimit:2;">
|
||||
<g transform="matrix(0.414874,0,0,0.414874,275.863996,142.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,265.863996,132.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,255.863996,122.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,245.863996,112.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,235.863996,102.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,225.863996,92.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(241,228,9);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
<g transform="matrix(0.414874,0,0,0.414874,215.863996,82.331813)">
|
||||
<path d="M489.044,829C678.878,829 818.583,718.058 845.703,541.372C871.178,367.973 761.879,253.744 576.976,253.744L361.665,253.744L263.05,829L489.044,829ZM552.322,409.063C624.64,409.063 673.947,446.044 659.977,541.372C644.363,639.987 572.867,672.859 498.083,672.859L475.073,672.859L520.272,409.063L552.322,409.063Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M931.169,317.844C931.169,366.329 970.615,398.379 1019.923,398.379C1069.231,398.379 1108.677,366.329 1108.677,317.844C1108.677,269.358 1069.231,237.308 1019.923,237.308C970.615,237.308 931.169,269.358 931.169,317.844ZM921.308,450.974L856.386,829L1008.418,829L1073.34,450.974L921.308,450.974Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M1071.696,856.941C1075.805,965.418 1133.331,1030.34 1269.749,1029.518C1400.414,1029.518 1494.921,959.665 1517.109,820.782L1579.565,450.974L1429.177,450.974L1418.494,510.144C1397.127,469.054 1357.681,442.756 1301.799,442.756C1205.649,442.756 1117.717,517.54 1103.746,630.947C1090.597,741.068 1151.41,820.782 1247.56,820.782C1296.868,820.782 1341.245,800.237 1374.117,766.544L1365.077,819.96C1357.681,869.268 1323.165,907.071 1273.036,906.249C1239.342,906.249 1225.372,893.1 1220.441,857.763L1071.696,856.941ZM1268.927,632.591C1274.679,594.788 1308.373,566.026 1349.463,566.026C1380.691,566.026 1401.236,589.858 1398.771,625.195L1396.305,639.987C1386.444,674.503 1351.928,698.335 1319.878,697.513C1283.719,695.047 1263.996,668.75 1268.927,632.591Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M1665.854,317.844C1665.854,366.329 1705.3,398.379 1754.608,398.379C1803.915,398.379 1843.362,366.329 1843.362,317.844C1843.362,269.358 1803.915,237.308 1754.608,237.308C1705.3,237.308 1665.854,269.358 1665.854,317.844ZM1655.992,450.974L1591.071,829L1743.103,829L1808.024,450.974L1655.992,450.974Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M1849.114,450.974L1826.926,578.353L1894.313,578.353L1851.579,829L2001.968,829L2044.701,578.353L2112.91,578.353L2135.099,450.974L2066.89,450.974L2089.9,319.487L1939.512,319.487L1916.501,450.974L1849.114,450.974Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M2127.703,639.165C2114.554,748.464 2172.901,836.396 2269.873,836.396C2320.824,836.396 2365.201,814.208 2398.895,778.049L2389.855,829L2548.462,829L2613.383,450.974L2454.777,450.974L2444.094,515.074C2422.727,471.519 2384.103,442.756 2327.399,442.756C2230.427,442.756 2141.673,525.758 2127.703,639.165ZM2293.705,639.987C2300.279,602.185 2336.438,565.204 2375.063,566.026C2409.578,567.669 2427.658,602.185 2422.727,639.165C2416.153,679.433 2378.35,714.771 2342.191,713.127C2305.21,712.305 2287.953,675.324 2293.705,639.987Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M2735.009,188L2625.71,829L2783.495,829L2893.615,188L2735.009,188Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M3089.203,837.218C3194.392,837.218 3269.176,797.772 3310.265,716.414L3168.917,693.404C3151.659,718.058 3128.649,730.385 3093.312,730.385C3058.796,730.385 3037.429,709.018 3035.786,672.859L3315.196,672.859C3320.949,653.136 3324.236,630.947 3324.236,612.046C3324.236,509.322 3260.958,442.756 3134.401,442.756C2981.547,442.756 2879.645,535.619 2879.645,664.641C2879.645,771.474 2961.003,837.218 3089.203,837.218ZM3117.965,541.372C3148.372,541.372 3161.521,561.095 3163.164,595.61L3052.222,595.61C3066.192,557.808 3084.272,541.372 3117.965,541.372Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M361.665,1434.825L263.05,2010.081L441.379,2010.081L471.786,1829.286L520.272,1829.286C669.017,1827.643 771.741,1759.434 783.246,1632.056C794.751,1506.321 721.612,1436.468 576.976,1434.825L361.665,1434.825ZM561.362,1577.817C599.164,1578.639 619.709,1598.362 613.956,1631.234C607.382,1666.571 574.51,1685.472 535.064,1685.472L496.44,1685.472L515.341,1577.817L561.362,1577.817Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M771.741,1820.247C758.592,1929.545 816.94,2017.477 913.912,2017.477C964.863,2017.477 1009.24,1995.289 1042.933,1959.13L1033.894,2010.081L1192.5,2010.081L1257.422,1632.056L1098.815,1632.056L1088.132,1696.156C1066.765,1652.6 1028.141,1623.838 971.437,1623.838C874.465,1623.838 785.712,1706.839 771.741,1820.247ZM937.744,1821.068C944.318,1783.266 980.477,1746.285 1019.101,1747.107C1053.617,1748.75 1071.696,1783.266 1066.765,1820.247C1060.191,1860.515 1022.388,1895.852 986.229,1894.208C949.249,1893.386 931.991,1856.406 937.744,1821.068Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M1570.526,1793.949L1653.527,1658.353C1640.378,1638.63 1618.19,1622.194 1590.249,1622.194C1549.981,1622.194 1508.069,1650.957 1478.485,1692.047L1489.168,1632.056L1334.671,1632.056L1269.749,2010.081L1423.424,2010.081L1453.009,1840.791C1462.049,1802.167 1495.742,1770.939 1529.436,1771.761C1548.337,1771.761 1560.664,1782.444 1570.526,1793.949Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M1664.21,1632.056L1642.022,1759.434L1709.409,1759.434L1666.676,2010.081L1817.064,2010.081L1859.797,1759.434L1928.006,1759.434L1950.195,1632.056L1881.986,1632.056L1904.996,1500.568L1754.608,1500.568L1731.597,1632.056L1664.21,1632.056Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M2154.822,2018.299C2260.012,2018.299 2334.795,1978.853 2375.885,1897.495L2234.536,1874.485C2217.278,1899.139 2194.268,1911.466 2158.931,1911.466C2124.415,1911.466 2103.049,1890.099 2101.405,1853.94L2380.815,1853.94C2386.568,1834.217 2389.855,1812.029 2389.855,1793.127C2389.855,1690.403 2326.577,1623.838 2200.021,1623.838C2047.167,1623.838 1945.264,1716.7 1945.264,1845.722C1945.264,1952.556 2026.622,2018.299 2154.822,2018.299ZM2183.585,1722.453C2213.991,1722.453 2227.14,1742.176 2228.783,1776.691L2117.841,1776.691C2131.812,1738.889 2149.891,1722.453 2183.585,1722.453Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
<path d="M2486.005,1498.925C2486.005,1547.411 2525.451,1579.461 2574.759,1579.461C2624.067,1579.461 2663.513,1547.411 2663.513,1498.925C2663.513,1450.439 2624.067,1418.389 2574.759,1418.389C2525.451,1418.389 2486.005,1450.439 2486.005,1498.925ZM2476.144,1632.056L2411.222,2010.081L2563.254,2010.081L2628.176,1632.056L2476.144,1632.056Z" style="fill:rgb(18,19,38);fill-rule:nonzero;"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 44 KiB |
@@ -0,0 +1,440 @@
|
||||
:root {
|
||||
--accent: #C8961A;
|
||||
--accent-light: #F5E8A8;
|
||||
--accent-hover: #A67A10;
|
||||
--dark: #18181F;
|
||||
--dark-2: #232330;
|
||||
--text: #26262F;
|
||||
--text-muted: #64647A;
|
||||
--bg: #F5F5F3;
|
||||
--bg-card: #FFFFFF;
|
||||
--border: #E3E3EB;
|
||||
--radius: 8px;
|
||||
--shadow: 0 1px 3px rgba(0,0,0,0.07), 0 4px 14px rgba(0,0,0,0.05);
|
||||
}
|
||||
|
||||
*, *::before, *::after {
|
||||
box-sizing: border-box;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'Source Sans 3', system-ui, -apple-system, sans-serif;
|
||||
font-size: 16px;
|
||||
color: var(--text);
|
||||
background: var(--bg);
|
||||
line-height: 1.6;
|
||||
min-height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
h1, h2, h3, h4 {
|
||||
font-family: 'Montserrat', system-ui, sans-serif;
|
||||
font-weight: 700;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
a {
|
||||
color: var(--accent);
|
||||
text-decoration: none;
|
||||
transition: color 0.15s;
|
||||
}
|
||||
|
||||
a:hover {
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
/* ── Layout ── */
|
||||
|
||||
.container {
|
||||
width: 100%;
|
||||
max-width: 1080px;
|
||||
margin: 0 auto;
|
||||
padding: 0 24px;
|
||||
}
|
||||
|
||||
/* ── Header ── */
|
||||
|
||||
.site-header {
|
||||
background: var(--dark);
|
||||
border-bottom: 3px solid var(--accent);
|
||||
position: sticky;
|
||||
top: 0;
|
||||
z-index: 100;
|
||||
}
|
||||
|
||||
.header-inner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
height: 120px;
|
||||
}
|
||||
|
||||
.brand {
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: 10px;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.brand-abbr {
|
||||
font-family: 'Montserrat', sans-serif;
|
||||
font-size: 20px;
|
||||
font-weight: 700;
|
||||
color: var(--accent);
|
||||
letter-spacing: -0.5px;
|
||||
}
|
||||
|
||||
.brand-name {
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 13px;
|
||||
color: rgba(255,255,255,0.45);
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
.main-nav {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 4px;
|
||||
}
|
||||
|
||||
.nav-link {
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 32px;
|
||||
font-weight: 500;
|
||||
color: rgba(255,255,255,0.7);
|
||||
padding: 6px 12px;
|
||||
border-radius: var(--radius);
|
||||
border: none;
|
||||
background: none;
|
||||
cursor: pointer;
|
||||
transition: color 0.15s, background 0.15s;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
.nav-link:hover {
|
||||
color: var(--accent);
|
||||
background: rgba(200, 150, 26, 0.1);
|
||||
}
|
||||
|
||||
.nav-separator {
|
||||
width: 1px;
|
||||
height: 18px;
|
||||
background: rgba(255,255,255,0.12);
|
||||
margin: 0 6px;
|
||||
}
|
||||
|
||||
.nav-user {
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
color: var(--accent-light);
|
||||
padding: 6px 10px;
|
||||
}
|
||||
|
||||
.nav-link--logout {
|
||||
color: rgba(255,255,255,0.35);
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
/* ── Main ── */
|
||||
|
||||
.site-main {
|
||||
flex: 1;
|
||||
padding: 48px 0 64px;
|
||||
}
|
||||
|
||||
/* ── Page header ── */
|
||||
|
||||
.page-header {
|
||||
margin-bottom: 36px;
|
||||
padding-bottom: 28px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.page-title {
|
||||
font-size: 30px;
|
||||
color: var(--dark);
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.page-subtitle {
|
||||
color: var(--text-muted);
|
||||
font-size: 15px;
|
||||
}
|
||||
|
||||
/* ── Card grid ── */
|
||||
|
||||
.card-grid {
|
||||
display: grid;
|
||||
grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.card {
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
padding: 28px;
|
||||
box-shadow: var(--shadow);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 10px;
|
||||
transition: box-shadow 0.15s, transform 0.15s;
|
||||
}
|
||||
|
||||
.card:hover {
|
||||
box-shadow: 0 4px 20px rgba(0,0,0,0.10);
|
||||
transform: translateY(-1px);
|
||||
}
|
||||
|
||||
.card-icon {
|
||||
font-size: 26px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.card-title {
|
||||
font-size: 17px;
|
||||
font-weight: 600;
|
||||
color: var(--dark);
|
||||
}
|
||||
|
||||
.card-text {
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
/* ── Hero ── */
|
||||
|
||||
.hero {
|
||||
padding: 80px 0 64px;
|
||||
border-bottom: 1px solid var(--border);
|
||||
margin-bottom: 56px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hero-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.hero-label {
|
||||
display: inline-block;
|
||||
color: var(--accent);
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
letter-spacing: 0.09em;
|
||||
text-transform: uppercase;
|
||||
margin-bottom: 28px;
|
||||
}
|
||||
|
||||
.hero-title {
|
||||
font-size: 58px;
|
||||
color: var(--dark);
|
||||
max-width: 720px;
|
||||
margin-bottom: 20px;
|
||||
line-height: 1.1;
|
||||
}
|
||||
|
||||
.hero-title .accent {
|
||||
color: var(--accent);
|
||||
}
|
||||
|
||||
.hero-text {
|
||||
color: var(--text-muted);
|
||||
font-size: 18px;
|
||||
max-width: 520px;
|
||||
line-height: 1.65;
|
||||
}
|
||||
|
||||
/* ── Auth ── */
|
||||
|
||||
.auth-section {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.auth-card {
|
||||
background: var(--bg-card);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
padding: 36px;
|
||||
width: 100%;
|
||||
max-width: 400px;
|
||||
box-shadow: var(--shadow);
|
||||
}
|
||||
|
||||
.auth-title {
|
||||
font-size: 22px;
|
||||
color: var(--dark);
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.auth-subtitle {
|
||||
color: var(--text-muted);
|
||||
font-size: 14px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.auth-divider {
|
||||
text-align: center;
|
||||
font-size: 13px;
|
||||
color: var(--text-muted);
|
||||
margin-top: 18px;
|
||||
}
|
||||
|
||||
/* ── Forms ── */
|
||||
|
||||
.form-group {
|
||||
margin-bottom: 14px;
|
||||
}
|
||||
|
||||
.form-label {
|
||||
display: block;
|
||||
font-size: 13px;
|
||||
font-weight: 600;
|
||||
color: var(--text);
|
||||
margin-bottom: 5px;
|
||||
letter-spacing: 0.01em;
|
||||
}
|
||||
|
||||
.form-input {
|
||||
width: 100%;
|
||||
padding: 9px 13px;
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 15px;
|
||||
color: var(--text);
|
||||
background: var(--bg);
|
||||
border: 1px solid var(--border);
|
||||
border-radius: var(--radius);
|
||||
outline: none;
|
||||
transition: border-color 0.15s, box-shadow 0.15s;
|
||||
appearance: none;
|
||||
}
|
||||
|
||||
.form-input:focus {
|
||||
border-color: var(--accent);
|
||||
box-shadow: 0 0 0 3px rgba(200, 150, 26, 0.14);
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
.form-input::placeholder {
|
||||
color: var(--text-muted);
|
||||
opacity: 0.6;
|
||||
}
|
||||
|
||||
/* ── Buttons ── */
|
||||
|
||||
.btn {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding: 9px 20px;
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 14px;
|
||||
font-weight: 600;
|
||||
border-radius: var(--radius);
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
transition: background 0.15s, box-shadow 0.15s, transform 0.1s;
|
||||
text-decoration: none;
|
||||
letter-spacing: 0.01em;
|
||||
margin-top: 6px;
|
||||
}
|
||||
|
||||
.btn:active {
|
||||
transform: scale(0.98);
|
||||
}
|
||||
|
||||
.btn--primary {
|
||||
background: var(--accent);
|
||||
color: #1a1008;
|
||||
}
|
||||
|
||||
.btn--primary:hover {
|
||||
background: var(--accent-hover);
|
||||
color: #1a1008;
|
||||
box-shadow: 0 2px 8px rgba(200,150,26,0.3);
|
||||
}
|
||||
|
||||
.btn--secondary {
|
||||
background: var(--bg);
|
||||
color: var(--text);
|
||||
border: 1px solid var(--border);
|
||||
}
|
||||
|
||||
.btn--secondary:hover {
|
||||
background: var(--border);
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.btn--full {
|
||||
width: 100%;
|
||||
margin-top: 4px;
|
||||
}
|
||||
|
||||
/* ── Alerts ── */
|
||||
|
||||
.alert {
|
||||
border-radius: var(--radius);
|
||||
padding: 12px 16px;
|
||||
font-size: 14px;
|
||||
margin-bottom: 16px;
|
||||
}
|
||||
|
||||
.alert--error {
|
||||
background: #fef2f2;
|
||||
border: 1px solid #fecaca;
|
||||
color: #991b1b;
|
||||
}
|
||||
|
||||
/* ── Links ── */
|
||||
|
||||
.link {
|
||||
color: var(--accent);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.link:hover {
|
||||
color: var(--accent-hover);
|
||||
}
|
||||
|
||||
/* ── Footer ── */
|
||||
|
||||
.site-footer {
|
||||
background: var(--dark-2);
|
||||
border-top: 1px solid rgba(255,255,255,0.05);
|
||||
padding: 18px 0;
|
||||
}
|
||||
|
||||
.footer-inner {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
}
|
||||
|
||||
.footer-brand {
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 13px;
|
||||
color: rgba(255,255,255,0.35);
|
||||
}
|
||||
|
||||
.footer-copy {
|
||||
font-family: 'Source Sans 3', sans-serif;
|
||||
font-size: 13px;
|
||||
color: rgba(255,255,255,0.2);
|
||||
}
|
||||
|
||||
/* ── Responsive ── */
|
||||
|
||||
@media (max-width: 600px) {
|
||||
.brand-name { display: none; }
|
||||
.hero-title { font-size: 36px; }
|
||||
.auth-card { padding: 24px; }
|
||||
.card-grid { grid-template-columns: 1fr; }
|
||||
}
|
||||
Reference in new issue
Block a user